mirror of
https://github.com/wgh136/nysoure.git
synced 2025-09-27 12:17:24 +00:00
120 lines
3.1 KiB
Go
120 lines
3.1 KiB
Go
package model
|
|
|
|
import (
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type Comment struct {
|
|
gorm.Model
|
|
Content string `gorm:"not null"`
|
|
RefID uint `gorm:"not null;index:idx_refid_type,priority:1"`
|
|
Type CommentType `gorm:"not null;index:idx_refid_type,priority:2"`
|
|
UserID uint `gorm:"not null"`
|
|
User User `gorm:"foreignKey:UserID"`
|
|
Images []Image `gorm:"many2many:comment_images;"`
|
|
ReplyCount uint `gorm:"default:0;not null"`
|
|
}
|
|
|
|
type CommentType uint
|
|
|
|
const (
|
|
CommentTypeResource CommentType = iota + 1
|
|
CommentTypeReply
|
|
)
|
|
|
|
type CommentView struct {
|
|
ID uint `json:"id"`
|
|
Content string `json:"content"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
User UserView `json:"user"`
|
|
Images []ImageView `json:"images"`
|
|
ReplyCount uint `json:"reply_count"`
|
|
ContentTruncated bool `json:"content_truncated"`
|
|
}
|
|
|
|
func (c *Comment) ToView() *CommentView {
|
|
imageViews := make([]ImageView, 0, len(c.Images))
|
|
for _, img := range c.Images {
|
|
imageViews = append(imageViews, img.ToView())
|
|
}
|
|
|
|
return &CommentView{
|
|
ID: c.ID,
|
|
Content: c.Content,
|
|
CreatedAt: c.CreatedAt,
|
|
User: c.User.ToView(),
|
|
Images: imageViews,
|
|
ReplyCount: c.ReplyCount,
|
|
}
|
|
}
|
|
|
|
type CommentWithResourceView struct {
|
|
ID uint `json:"id"`
|
|
Content string `json:"content"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
Resource ResourceView `json:"resource"`
|
|
User UserView `json:"user"`
|
|
Images []ImageView `json:"images"`
|
|
ReplyCount uint `json:"reply_count"`
|
|
ContentTruncated bool `json:"content_truncated"`
|
|
}
|
|
|
|
func (c *Comment) ToViewWithResource(r *Resource) *CommentWithResourceView {
|
|
imageViews := make([]ImageView, 0, len(c.Images))
|
|
for _, img := range c.Images {
|
|
imageViews = append(imageViews, img.ToView())
|
|
}
|
|
|
|
return &CommentWithResourceView{
|
|
ID: c.ID,
|
|
Content: c.Content,
|
|
CreatedAt: c.CreatedAt,
|
|
Resource: r.ToView(),
|
|
User: c.User.ToView(),
|
|
Images: imageViews,
|
|
ReplyCount: c.ReplyCount,
|
|
}
|
|
}
|
|
|
|
type CommentWithRefView struct {
|
|
ID uint `json:"id"`
|
|
Content string `json:"content"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
User UserView `json:"user"`
|
|
Images []ImageView `json:"images"`
|
|
ReplyCount uint `json:"reply_count"`
|
|
Resource *ResourceView `json:"resource,omitempty"`
|
|
ReplyTo *CommentView `json:"reply_to,omitempty"`
|
|
}
|
|
|
|
func (c *Comment) ToViewWithRef(r *Resource, replyTo *Comment) *CommentWithRefView {
|
|
imageViews := make([]ImageView, 0, len(c.Images))
|
|
for _, img := range c.Images {
|
|
imageViews = append(imageViews, img.ToView())
|
|
}
|
|
|
|
var replyToView *CommentView
|
|
if replyTo != nil {
|
|
replyToView = replyTo.ToView()
|
|
}
|
|
|
|
var rView *ResourceView
|
|
if r != nil {
|
|
v := r.ToView()
|
|
rView = &v
|
|
}
|
|
|
|
return &CommentWithRefView{
|
|
ID: c.ID,
|
|
Content: c.Content,
|
|
CreatedAt: c.CreatedAt,
|
|
User: c.User.ToView(),
|
|
Images: imageViews,
|
|
ReplyCount: c.ReplyCount,
|
|
Resource: rView,
|
|
ReplyTo: replyToView,
|
|
}
|
|
}
|