138 lines
3.6 KiB
Go
138 lines
3.6 KiB
Go
package services
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/inchstep/server/internal/models"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type SocialService struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewSocialService(db *gorm.DB) *SocialService {
|
|
return &SocialService{db: db}
|
|
}
|
|
|
|
// SendFriendRequest 发送好友请求
|
|
func (s *SocialService) SendFriendRequest(userID, friendID string) error {
|
|
if userID == friendID {
|
|
return errors.New("不能添加自己为好友")
|
|
}
|
|
f := &models.Friend{
|
|
UserID: userID,
|
|
FriendID: friendID,
|
|
Status: "pending",
|
|
CreatedAt: time.Now(),
|
|
}
|
|
return s.db.Create(f).Error
|
|
}
|
|
|
|
// AcceptFriendRequest 接受好友请求
|
|
func (s *SocialService) AcceptFriendRequest(userID, friendID string) error {
|
|
return s.db.Model(&models.Friend{}).
|
|
Where("user_id = ? AND friend_id = ?", friendID, userID).
|
|
Update("status", "accepted").Error
|
|
}
|
|
|
|
// RemoveFriend 删除好友
|
|
func (s *SocialService) RemoveFriend(userID, friendID string) error {
|
|
return s.db.Where("(user_id = ? AND friend_id = ?) OR (user_id = ? AND friend_id = ?)",
|
|
userID, friendID, friendID, userID).Delete(&models.Friend{}).Error
|
|
}
|
|
|
|
// GetFriends 获取好友列表
|
|
func (s *SocialService) GetFriends(userID string) ([]models.User, error) {
|
|
var friendIDs []string
|
|
s.db.Model(&models.Friend{}).Select("friend_id").
|
|
Where("user_id = ? AND status = ?", userID, "accepted").Find(&friendIDs)
|
|
|
|
var users []models.User
|
|
if len(friendIDs) > 0 {
|
|
s.db.Where("id IN ?", friendIDs).Find(&users)
|
|
}
|
|
return users, nil
|
|
}
|
|
|
|
// CreatePost 创建动态
|
|
func (s *SocialService) CreatePost(post *models.Post) error {
|
|
post.ID = generateID()
|
|
post.CreatedAt = time.Now()
|
|
return s.db.Create(post).Error
|
|
}
|
|
|
|
// GetFeed 获取动态广场
|
|
func (s *SocialService) GetFeed(page, pageSize int) ([]models.Post, int64, error) {
|
|
var total int64
|
|
s.db.Model(&models.Post{}).Where("privacy = ?", 1).Count(&total)
|
|
|
|
var posts []models.Post
|
|
err := s.db.Where("privacy = ?", 1).Preload("User").
|
|
Order("created_at desc").Offset((page - 1) * pageSize).Limit(pageSize).Find(&posts).Error
|
|
return posts, total, err
|
|
}
|
|
|
|
// LikePost 点赞动态
|
|
func (s *SocialService) LikePost(postID string) error {
|
|
return s.db.Model(&models.Post{}).Where("id = ?", postID).
|
|
UpdateColumn("likes", gorm.Expr("likes + ?", 1)).Error
|
|
}
|
|
|
|
// CommentPost 评论动态
|
|
func (s *SocialService) CommentPost(postID string) error {
|
|
return s.db.Model(&models.Post{}).Where("id = ?", postID).
|
|
UpdateColumn("comments", gorm.Expr("comments + ?", 1)).Error
|
|
}
|
|
|
|
// CreateGroup 创建小组
|
|
func (s *SocialService) CreateGroup(userID string, group *models.Group) error {
|
|
group.ID = generateID()
|
|
group.CreatedBy = userID
|
|
group.CreatedAt = time.Now()
|
|
tx := s.db.Begin()
|
|
|
|
if err := tx.Create(group).Error; err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
|
|
member := &models.GroupMember{
|
|
GroupID: group.ID,
|
|
UserID: userID,
|
|
Role: "admin",
|
|
JoinedAt: time.Now(),
|
|
}
|
|
if err := tx.Create(member).Error; err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
|
|
return tx.Commit().Error
|
|
}
|
|
|
|
// JoinGroup 加入小组
|
|
func (s *SocialService) JoinGroup(groupID, userID string) error {
|
|
member := &models.GroupMember{
|
|
GroupID: groupID,
|
|
UserID: userID,
|
|
Role: "member",
|
|
JoinedAt: time.Now(),
|
|
}
|
|
return s.db.Create(member).Error
|
|
}
|
|
|
|
// LeaveGroup 退出小组
|
|
func (s *SocialService) LeaveGroup(groupID, userID string) error {
|
|
return s.db.Where("group_id = ? AND user_id = ?", groupID, userID).
|
|
Delete(&models.GroupMember{}).Error
|
|
}
|
|
|
|
// GetGroupMembers 获取小组成员
|
|
func (s *SocialService) GetGroupMembers(groupID string) ([]models.GroupMember, error) {
|
|
var members []models.GroupMember
|
|
err := s.db.Where("group_id = ?", groupID).Find(&members).Error
|
|
return members, err
|
|
}
|