Files
lv8girl/internal/repositories/discussion.go
nannanwu 690b4d5961 fix(admin): 添加管理操作错误处理及更新模板样式
- 管理后台帖子与用户审核操作中添加失败错误重定向处理
- 管理后台帖子、用户、评论删除操作中添加错误检查及提示
- 用户角色更新操作失败时添加错误重定向
- 用户封禁通知失败时添加相应错误提示
- 登录登出时session保存加入错误处理
- 讨论区上传目录创建失败时显示错误提示
- 移除admin_dashboard.html多余样式及修正侧边栏当前页高亮
- admin_posts.html和admin_users.html添加状态样式动态使用的隐藏span元素
- admin_users.html为角色选择添加label以提升无障碍性
- 升级项目依赖版本,包含gin、gorm、validator等核心库版本更新
2026-02-24 21:14:55 +08:00

148 lines
4.0 KiB
Go

package repositories
import (
"time"
"lv8girl/internal/models"
"gorm.io/gorm"
)
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
}