261 lines
8.7 KiB
Go
261 lines
8.7 KiB
Go
package models
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// User Request/Response types
|
|
type CreateUserRequest struct {
|
|
Username string `json:"username" binding:"required,min=3,max=50"`
|
|
Email string `json:"email" binding:"required,email"`
|
|
Password string `json:"password" binding:"required,min=6"`
|
|
FirstName string `json:"firstName"`
|
|
LastName string `json:"lastName"`
|
|
Role string `json:"role"`
|
|
}
|
|
|
|
type LoginRequest struct {
|
|
Username string `json:"username" binding:"required"`
|
|
Password string `json:"password" binding:"required"`
|
|
}
|
|
|
|
type LoginResponse struct {
|
|
Token string `json:"token"`
|
|
User SafeUser `json:"user"`
|
|
}
|
|
|
|
type UpdateUserRequest struct {
|
|
FirstName string `json:"firstName"`
|
|
LastName string `json:"lastName"`
|
|
Email string `json:"email" binding:"omitempty,email"`
|
|
Active *bool `json:"active"`
|
|
Role string `json:"role"`
|
|
}
|
|
|
|
type ChangePasswordRequest struct {
|
|
CurrentPassword string `json:"currentPassword" binding:"required"`
|
|
NewPassword string `json:"newPassword" binding:"required,min=6"`
|
|
}
|
|
|
|
// Conversation Request/Response types
|
|
type CreateConversationRequest struct {
|
|
Title string `json:"title" binding:"required,min=1,max=100"`
|
|
Department string `json:"department" binding:"required"`
|
|
Priority string `json:"priority" binding:"oneof=low medium high urgent"`
|
|
Tags string `json:"tags"`
|
|
}
|
|
|
|
type UpdateConversationRequest struct {
|
|
Title string `json:"title"`
|
|
Status string `json:"status" binding:"oneof=active closed escalated"`
|
|
Department string `json:"department"`
|
|
Priority string `json:"priority" binding:"oneof=low medium high urgent"`
|
|
Tags string `json:"tags"`
|
|
AgentID *uint `json:"agentId"`
|
|
}
|
|
|
|
type CreateMessageRequest struct {
|
|
ConversationID uint `json:"conversationId" binding:"required"`
|
|
Content string `json:"content" binding:"required,min=1,max=5000"`
|
|
Type string `json:"type" binding:"oneof=text image file system"`
|
|
}
|
|
|
|
type UpdateMessageRequest struct {
|
|
Content string `json:"content" binding:"omitempty,min=1,max=5000"`
|
|
Status string `json:"status" binding:"oneof=sent delivered read"`
|
|
}
|
|
|
|
type ConversationListResponse struct {
|
|
Conversations []Conversation `json:"conversations"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"pageSize"`
|
|
}
|
|
|
|
type MessageListResponse struct {
|
|
Messages []Message `json:"messages"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"pageSize"`
|
|
}
|
|
|
|
type ConversationStats struct {
|
|
TotalMessages int64 `json:"totalMessages"`
|
|
AverageSentiment float64 `json:"averageSentiment"`
|
|
ResponseTime int64 `json:"responseTime"` // in seconds
|
|
FirstMessageAt time.Time `json:"firstMessageAt"`
|
|
LastMessageAt time.Time `json:"lastMessageAt"`
|
|
}
|
|
|
|
// Knowledge Base Request/Response types
|
|
type CreateKnowledgeBaseRequest struct {
|
|
Question string `json:"question" binding:"required,min=1,max=500"`
|
|
Answer string `json:"answer" binding:"required,min=1,max=5000"`
|
|
Category string `json:"category" binding:"required,min=1,max=100"`
|
|
Tags string `json:"tags"`
|
|
Priority int `json:"priority" binding:"min=1,max=10"`
|
|
}
|
|
|
|
type UpdateKnowledgeBaseRequest struct {
|
|
Question string `json:"question" binding:"omitempty,min=1,max=500"`
|
|
Answer string `json:"answer" binding:"omitempty,min=1,max=5000"`
|
|
Category string `json:"category" binding:"omitempty,min=1,max=100"`
|
|
Tags string `json:"tags"`
|
|
Priority int `json:"priority" binding:"omitempty,min=1,max=10"`
|
|
Active *bool `json:"active"`
|
|
}
|
|
|
|
type CreateKnowledgeBaseFeedbackRequest struct {
|
|
KnowledgeBaseID uint `json:"knowledgeBaseId" binding:"required"`
|
|
Helpful bool `json:"helpful"`
|
|
Comment string `json:"comment" binding:"max=500"`
|
|
}
|
|
|
|
type KnowledgeBaseSearchRequest struct {
|
|
Query string `json:"query" binding:"required,min=1,max=100"`
|
|
Category string `json:"category"`
|
|
Tags string `json:"tags"`
|
|
Page int `json:"page" binding:"min=1"`
|
|
PageSize int `json:"pageSize" binding:"min=1,max=100"`
|
|
}
|
|
|
|
type KnowledgeBaseListResponse struct {
|
|
Entries []KnowledgeBase `json:"entries"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"pageSize"`
|
|
}
|
|
|
|
type KnowledgeBaseSearchResponse struct {
|
|
Results []KnowledgeBaseSearchResult `json:"results"`
|
|
Total int64 `json:"total"`
|
|
Query string `json:"query"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"pageSize"`
|
|
}
|
|
|
|
type KnowledgeBaseSearchResult struct {
|
|
KnowledgeBase
|
|
RelevanceScore float64 `json:"relevanceScore"`
|
|
MatchedFields []string `json:"matchedFields"`
|
|
}
|
|
|
|
type KnowledgeBaseStats struct {
|
|
TotalEntries int64 `json:"totalEntries"`
|
|
TotalViews int64 `json:"totalViews"`
|
|
AverageHelpful float64 `json:"averageHelpful"` // Average helpful rating
|
|
TopCategories []CategoryStat `json:"topCategories"`
|
|
TopTags []TagStat `json:"topTags"`
|
|
}
|
|
|
|
type CategoryStat struct {
|
|
Category string `json:"category"`
|
|
Count int64 `json:"count"`
|
|
}
|
|
|
|
type TagStat struct {
|
|
Tag string `json:"tag"`
|
|
Count int64 `json:"count"`
|
|
}
|
|
|
|
// AI Model Request/Response types
|
|
type CreateAIModelRequest struct {
|
|
Name string `json:"name" binding:"required,min=1,max=100"`
|
|
Type string `json:"type" binding:"required,oneof=openai local custom"`
|
|
Endpoint string `json:"endpoint"`
|
|
APIKey string `json:"apiKey"`
|
|
Model string `json:"model" binding:"required,min=1,max=100"`
|
|
MaxTokens int `json:"maxTokens" binding:"min=1,max=100000"`
|
|
Temperature float64 `json:"temperature" binding:"min=0,max=2"`
|
|
TopP float64 `json:"topP" binding:"min=0,max=1"`
|
|
Priority int `json:"priority" binding:"min=1,max=10"`
|
|
Description string `json:"description" binding:"max=500"`
|
|
}
|
|
|
|
type UpdateAIModelRequest struct {
|
|
Name string `json:"name" binding:"omitempty,min=1,max=100"`
|
|
Type string `json:"type" binding:"omitempty,oneof=openai local custom"`
|
|
Endpoint string `json:"endpoint"`
|
|
APIKey string `json:"apiKey"`
|
|
Model string `json:"model" binding:"omitempty,min=1,max=100"`
|
|
MaxTokens int `json:"maxTokens" binding:"omitempty,min=1,max=100000"`
|
|
Temperature float64 `json:"temperature" binding:"omitempty,min=0,max=2"`
|
|
TopP float64 `json:"topP" binding:"omitempty,min=0,max=1"`
|
|
Active *bool `json:"active"`
|
|
Priority int `json:"priority" binding:"omitempty,min=1,max=10"`
|
|
Description string `json:"description" binding:"omitempty,max=500"`
|
|
}
|
|
|
|
type AIModelListResponse struct {
|
|
Models []AIModel `json:"models"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"pageSize"`
|
|
}
|
|
|
|
type AIInteractionListResponse struct {
|
|
Interactions []AIInteraction `json:"interactions"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"pageSize"`
|
|
}
|
|
|
|
type AIFallbackListResponse struct {
|
|
Fallbacks []AIFallback `json:"fallbacks"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"pageSize"`
|
|
}
|
|
|
|
type AIStats struct {
|
|
TotalInteractions int64 `json:"totalInteractions"`
|
|
TotalFallbacks int64 `json:"totalFallbacks"`
|
|
AverageResponseTime float64 `json:"averageResponseTime"` // in milliseconds
|
|
TotalTokensUsed int64 `json:"totalTokensUsed"`
|
|
TotalCost float64 `json:"totalCost"`
|
|
ModelStats []AIModelStats `json:"modelStats"`
|
|
SuccessRate float64 `json:"successRate"`
|
|
}
|
|
|
|
type AIModelStats struct {
|
|
AIModel AIModel `json:"aiModel"`
|
|
InteractionsCount int64 `json:"interactionsCount"`
|
|
FallbacksCount int64 `json:"fallbacksCount"`
|
|
AverageResponseTime float64 `json:"averageResponseTime"`
|
|
SuccessRate float64 `json:"successRate"`
|
|
TokensUsed int64 `json:"tokensUsed"`
|
|
Cost float64 `json:"cost"`
|
|
}
|
|
|
|
// Common Response types
|
|
type ErrorResponse struct {
|
|
Error string `json:"error"`
|
|
Message string `json:"message"`
|
|
Status int `json:"status"`
|
|
}
|
|
|
|
type SuccessResponse struct {
|
|
Message string `json:"message"`
|
|
Data interface{} `json:"data,omitempty"`
|
|
Status int `json:"status"`
|
|
}
|
|
|
|
// Response helpers
|
|
func NewErrorResponse(c *gin.Context, message string, statusCode int) {
|
|
c.JSON(statusCode, ErrorResponse{
|
|
Error: http.StatusText(statusCode),
|
|
Message: message,
|
|
Status: statusCode,
|
|
})
|
|
}
|
|
|
|
func NewSuccessResponse(c *gin.Context, message string, data interface{}, statusCode int) {
|
|
c.JSON(statusCode, SuccessResponse{
|
|
Message: message,
|
|
Data: data,
|
|
Status: statusCode,
|
|
})
|
|
} |