首次提交
This commit is contained in:
@@ -0,0 +1,137 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user