- 管理后台帖子与用户审核操作中添加失败错误重定向处理 - 管理后台帖子、用户、评论删除操作中添加错误检查及提示 - 用户角色更新操作失败时添加错误重定向 - 用户封禁通知失败时添加相应错误提示 - 登录登出时session保存加入错误处理 - 讨论区上传目录创建失败时显示错误提示 - 移除admin_dashboard.html多余样式及修正侧边栏当前页高亮 - admin_posts.html和admin_users.html添加状态样式动态使用的隐藏span元素 - admin_users.html为角色选择添加label以提升无障碍性 - 升级项目依赖版本,包含gin、gorm、validator等核心库版本更新
148 lines
4.0 KiB
Go
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
|
|
}
|