committtttt
This commit is contained in:
261
backend/internal/models/requests.go
Normal file
261
backend/internal/models/requests.go
Normal file
@@ -0,0 +1,261 @@
|
||||
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,
|
||||
})
|
||||
}
|
Reference in New Issue
Block a user