318075d686
modified: internal/domain/appeal/dto.go new file: internal/domain/appeal/handler.go modified: internal/domain/appeal/router.go modified: internal/domain/appeal/service.go modified: internal/models/appeal.go modified: internal/router/router.go fix bag with no embeded the Base into appeal
122 lines
4.9 KiB
Go
122 lines
4.9 KiB
Go
package models
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// AppealType определяет тип обращения
|
|
type AppealType string
|
|
|
|
const (
|
|
// AppealTypeComplaint - жалоба
|
|
AppealTypeComplaint AppealType = "complaint"
|
|
// AppealTypeSuggestion - предложение
|
|
AppealTypeSuggestion AppealType = "suggestion"
|
|
// AppealTypeWish - пожелание
|
|
AppealTypeWish AppealType = "wish"
|
|
// AppealTypeQuestion - вопрос
|
|
AppealTypeQuestion AppealType = "question"
|
|
// AppealTypeOther - другое
|
|
AppealTypeOther AppealType = "other"
|
|
)
|
|
|
|
// AppealStatus определяет статус обработки обращения
|
|
type AppealStatus string
|
|
|
|
const (
|
|
// AppealStatusNew - новое обращение
|
|
AppealStatusNew AppealStatus = "new"
|
|
// AppealStatusInProgress - в обработке
|
|
AppealStatusInProgress AppealStatus = "in_progress"
|
|
// AppealStatusResolved - решено
|
|
AppealStatusResolved AppealStatus = "resolved"
|
|
// AppealStatusRejected - отклонено
|
|
AppealStatusRejected AppealStatus = "rejected"
|
|
// AppealStatusClosed - закрыто
|
|
AppealStatusClosed AppealStatus = "closed"
|
|
)
|
|
|
|
// AppealPriority определяет приоритет обращения
|
|
type AppealPriority string
|
|
|
|
const (
|
|
// AppealPriorityLow - низкий
|
|
AppealPriorityLow AppealPriority = "low"
|
|
// AppealPriorityMedium - средний
|
|
AppealPriorityMedium AppealPriority = "medium"
|
|
// AppealPriorityHigh - высокий
|
|
AppealPriorityHigh AppealPriority = "high"
|
|
// AppealPriorityCritical - критичный
|
|
AppealPriorityCritical AppealPriority = "critical"
|
|
)
|
|
|
|
// Appeal представляет обращение пользователя (жалоба, предложение, пожелание)
|
|
type Appeal struct {
|
|
/*ID, CreatedAt, UpdatedAt, DeletedAt (Update's history)*/
|
|
Base `gorm:"embedded"`
|
|
|
|
// Автор обращения (может быть анонимным)
|
|
AuthorID *uint `gorm:"index" json:"author_id,omitempty"` // NULL для анонимных обращений
|
|
Author *Account `gorm:"foreignKey:AuthorID;references:ID" json:"author,omitempty"`
|
|
|
|
// Основная информация
|
|
Type AppealType `gorm:"not null;index" json:"type"`
|
|
Status AppealStatus `gorm:"not null;default:'new';index" json:"status"`
|
|
Priority AppealPriority `gorm:"not null;default:'medium';index" json:"priority"`
|
|
|
|
// Содержание
|
|
Title string `gorm:"not null" json:"title"`
|
|
Message string `gorm:"not null;type:text" json:"message"`
|
|
|
|
// Вложения (ссылки на файлы, изображения)
|
|
Attachments []string `gorm:"type:text[];serializer:json" json:"attachments,omitempty"`
|
|
|
|
// Контактная информация для обратной связи (если автор не авторизован)
|
|
ContactName string `json:"contact_name,omitempty"`
|
|
ContactEmail string `json:"contact_email,omitempty"`
|
|
ContactPhone string `json:"contact_phone,omitempty"`
|
|
|
|
// Связь с конкретными сущностями (опционально)
|
|
ObjectID *uint `gorm:"index" json:"object_id,omitempty"`
|
|
Object *Object `gorm:"foreignKey:ObjectID;references:ID" json:"object,omitempty"`
|
|
|
|
FeedbackID *uint `gorm:"index" json:"feedback_id,omitempty"`
|
|
Feedback *Feedback `gorm:"foreignKey:FeedbackID;references:ID" json:"feedback,omitempty"`
|
|
|
|
CommentID *uint `gorm:"index" json:"comment_id,omitempty"`
|
|
Comment *Comment `gorm:"foreignKey:CommentID;references:ID" json:"comment,omitempty"`
|
|
|
|
// Метаданные
|
|
IPAddress string `json:"ip_address,omitempty"`
|
|
UserAgent string `json:"user_agent,omitempty"`
|
|
|
|
// История обработки
|
|
AssignedToID *uint `gorm:"index" json:"assigned_to_id,omitempty"`
|
|
AssignedTo *Account `gorm:"foreignKey:AssignedToID;references:ID" json:"assigned_to,omitempty"`
|
|
|
|
ResolvedAt *time.Time `json:"resolved_at,omitempty"`
|
|
ResolvedBy *uint `json:"resolved_by,omitempty"`
|
|
Resolution string `json:"resolution,omitempty"` // Ответ/решение по обращению
|
|
|
|
// Дополнительные поля
|
|
Category string `json:"category,omitempty"` // Пользовательская категория
|
|
Labels []string `gorm:"type:text[];serializer:json" json:"labels,omitempty"`
|
|
CustomData map[string]interface{} `gorm:"type:jsonb;serializer:json" json:"custom_data,omitempty"`
|
|
}
|
|
|
|
// AppealHistory записывает историю изменений статуса обращения
|
|
type AppealHistory struct {
|
|
Base `gorm:"embedded"`
|
|
|
|
AppealID uint `gorm:"not null;index" json:"appeal_id"`
|
|
Appeal Appeal `gorm:"foreignKey:AppealID;references:ID" json:"appeal,omitempty"`
|
|
|
|
UserID *uint `json:"user_id,omitempty"` // Кто изменил
|
|
User *Account `gorm:"foreignKey:UserID;references:ID" json:"user,omitempty"`
|
|
|
|
OldStatus AppealStatus `json:"old_status"`
|
|
NewStatus AppealStatus `json:"new_status"`
|
|
|
|
Comment string `json:"comment,omitempty"` // Пояснение к изменению
|
|
}
|