This commit is contained in:
2026-02-23 23:50:04 +08:00
commit 084d3b0faf
45 changed files with 4090 additions and 0 deletions

View File

@@ -0,0 +1,146 @@
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
}