package repositories import ( "time" "gorm.io/gorm" "lv8girl/internal/models" ) type DiscussionRepository struct{} func NewDiscussionRepository() *DiscussionRepository { return &DiscussionRepository{} } func (r *DiscussionRepository) FindByID(id uint) (*models.Discussion, error) { var discussion models.Discussion err := DB.Preload("User").First(&discussion, id).Error return &discussion, err } func (r *DiscussionRepository) FindByIDWithStats(id uint) (*models.Discussion, int64, int64, error) { discussion, err := r.FindByID(id) if err != nil { return nil, 0, 0, err } var likeCount, commentCount int64 DB.Model(&models.Like{}).Where("post_id = ?", id).Count(&likeCount) DB.Model(&models.Comment{}).Where("post_id = ?", id).Count(&commentCount) return discussion, likeCount, commentCount, nil } func (r *DiscussionRepository) FindApproved(limit int) ([]models.Discussion, error) { var discussions []models.Discussion err := DB.Preload("User"). Where("status = ?", "approved"). Order("created_at DESC"). Limit(limit). Find(&discussions).Error return discussions, err } func (r *DiscussionRepository) FindByUserID(userID uint) ([]models.Discussion, error) { var discussions []models.Discussion err := DB.Where("user_id = ? AND status = ?", userID, "approved"). Order("created_at DESC"). Find(&discussions).Error return discussions, err } func (r *DiscussionRepository) FindPending() ([]models.Discussion, error) { var discussions []models.Discussion err := DB.Preload("User"). Where("status = ?", "pending"). Order("created_at DESC"). Find(&discussions).Error return discussions, err } func (r *DiscussionRepository) FindAll() ([]models.Discussion, error) { var discussions []models.Discussion err := DB.Preload("User").Order("created_at DESC").Find(&discussions).Error return discussions, err } func (r *DiscussionRepository) Create(discussion *models.Discussion) error { return DB.Create(discussion).Error } func (r *DiscussionRepository) Update(discussion *models.Discussion) error { return DB.Save(discussion).Error } func (r *DiscussionRepository) UpdateStatus(id uint, status string) error { return DB.Model(&models.Discussion{}).Where("id = ?", id).Update("status", status).Error } func (r *DiscussionRepository) IncrementViews(id uint) error { return DB.Model(&models.Discussion{}).Where("id = ?", id). UpdateColumn("views", gorm.Expr("views + ?", 1)).Error } func (r *DiscussionRepository) Delete(id uint) error { return DB.Delete(&models.Discussion{}, id).Error } func (r *DiscussionRepository) Count() (int64, error) { var count int64 err := DB.Model(&models.Discussion{}).Count(&count).Error return count, err } func (r *DiscussionRepository) CountByStatus(status string) (int64, error) { var count int64 err := DB.Model(&models.Discussion{}).Where("status = ?", status).Count(&count).Error return count, err } func (r *DiscussionRepository) CountByUserID(userID uint) (int64, error) { var count int64 err := DB.Model(&models.Discussion{}).Where("user_id = ? AND status = ?", userID, "approved").Count(&count).Error return count, err } type PostListItem struct { ID uint Title string Content string Username string Avatar string UserID uint LikeCount int64 CommentCount int64 Views int CreatedAt time.Time } func (r *DiscussionRepository) GetPostList(limit int) ([]PostListItem, error) { discussions, err := r.FindApproved(limit) if err != nil { return nil, err } var posts []PostListItem for _, d := range discussions { var likeCount, commentCount int64 DB.Model(&models.Like{}).Where("post_id = ?", d.ID).Count(&likeCount) DB.Model(&models.Comment{}).Where("post_id = ?", d.ID).Count(&commentCount) posts = append(posts, PostListItem{ ID: d.ID, Title: d.Title, Content: d.Content, Username: d.User.Username, Avatar: d.User.Avatar, UserID: d.User.ID, LikeCount: likeCount, CommentCount: commentCount, Views: d.Views, CreatedAt: d.CreatedAt, }) } return posts, nil }