From 45062ca6105a4de9658059b7c0ed7e07f4efc5fe Mon Sep 17 00:00:00 2001 From: valitovgaziz Date: Mon, 23 Feb 2026 02:15:52 +0500 Subject: [PATCH] modified: main_dc/yalarba/api_yal/internal/database/psql_db.go new file: main_dc/yalarba/api_yal/internal/models/appeal.go add appeal struct and add it into autoMigrate --- .../api_yal/internal/database/psql_db.go | 1 + .../yalarba/api_yal/internal/models/appeal.go | 121 ++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 main_dc/yalarba/api_yal/internal/models/appeal.go diff --git a/main_dc/yalarba/api_yal/internal/database/psql_db.go b/main_dc/yalarba/api_yal/internal/database/psql_db.go index eb0387f..758ce02 100644 --- a/main_dc/yalarba/api_yal/internal/database/psql_db.go +++ b/main_dc/yalarba/api_yal/internal/database/psql_db.go @@ -49,6 +49,7 @@ func autoMigrate(db *gorm.DB) error { &models.Rating{}, &models.Feedback{}, &models.Comment{}, + &models.Appeal{}, } for _, model := range models { diff --git a/main_dc/yalarba/api_yal/internal/models/appeal.go b/main_dc/yalarba/api_yal/internal/models/appeal.go new file mode 100644 index 0000000..dad69e5 --- /dev/null +++ b/main_dc/yalarba/api_yal/internal/models/appeal.go @@ -0,0 +1,121 @@ +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 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 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"` // Пояснение к изменению +}