lv8girl!
This commit is contained in:
146
internal/repositories/discussion.go
Normal file
146
internal/repositories/discussion.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user