15357fd3c0
yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarba
69 lines
2.6 KiB
Go
69 lines
2.6 KiB
Go
// models/review.go
|
|
package models
|
|
|
|
import (
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type Review struct {
|
|
ID uint `json:"id" gorm:"primarykey"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
DeletedAt gorm.DeletedAt `json:"deleted_at,omitempty" gorm:"index"`
|
|
|
|
Rating int `json:"rating" gorm:"not null;check:rating >= 1 AND rating <= 5"`
|
|
Text string `json:"text" gorm:"type:text;not null"`
|
|
Achievement string `json:"achievement" gorm:"size:255"`
|
|
Distance string `json:"distance" gorm:"size:50"`
|
|
Improvement string `json:"improvement" gorm:"size:100"`
|
|
Trainings int `json:"trainings" gorm:"default:0"`
|
|
Verified bool `json:"verified" gorm:"default:false"`
|
|
|
|
// Связи
|
|
AuthorID uint `json:"author_id" gorm:"not null"`
|
|
Author User `json:"author" gorm:"foreignKey:AuthorID"`
|
|
}
|
|
|
|
// DTO для создания отзыва
|
|
type CreateReviewRequest struct {
|
|
Rating int `json:"rating" validate:"required,min=1,max=5"`
|
|
Text string `json:"text" validate:"required,min=10,max=500"`
|
|
Achievement string `json:"achievement" validate:"max=255"`
|
|
Distance string `json:"distance" validate:"max=50"`
|
|
Improvement string `json:"improvement" validate:"max=100"`
|
|
Trainings int `json:"trainings" validate:"min=0"`
|
|
}
|
|
|
|
// DTO для обновления отзыва
|
|
type UpdateReviewRequest struct {
|
|
Rating int `json:"rating" validate:"omitempty,min=1,max=5"`
|
|
Text string `json:"text" validate:"omitempty,min=10,max=500"`
|
|
Achievement string `json:"achievement" validate:"omitempty,max=255"`
|
|
Distance string `json:"distance" validate:"omitempty,max=50"`
|
|
Improvement string `json:"improvement" validate:"omitempty,max=100"`
|
|
Trainings int `json:"trainings" validate:"omitempty,min=0"`
|
|
}
|
|
|
|
// DTO для ответа с отзывом
|
|
type ReviewResponse struct {
|
|
ID uint `json:"id"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
Rating int `json:"rating"`
|
|
Text string `json:"text"`
|
|
Achievement string `json:"achievement,omitempty"`
|
|
Distance string `json:"distance,omitempty"`
|
|
Improvement string `json:"improvement,omitempty"`
|
|
Trainings int `json:"trainings"`
|
|
Verified bool `json:"verified"`
|
|
Author AuthorInfo `json:"author"`
|
|
}
|
|
|
|
// DTO для статистики отзывов
|
|
type ReviewsStatsResponse struct {
|
|
TotalReviews int `json:"total_reviews"`
|
|
AverageRating float64 `json:"average_rating"`
|
|
SuccessStories int `json:"success_stories"`
|
|
RatingDistribution map[int]int `json:"rating_distribution"`
|
|
} |