Files
lv8girl/internal/services/user.go
2026-02-23 23:50:04 +08:00

95 lines
2.3 KiB
Go

package services
import (
"lv8girl/internal/models"
"lv8girl/internal/repositories"
)
type UserService struct {
userRepo *repositories.UserRepository
discussionRepo *repositories.DiscussionRepository
commentRepo *repositories.CommentRepository
messageRepo *repositories.MessageRepository
}
func NewUserService() *UserService {
return &UserService{
userRepo: repositories.NewUserRepository(),
discussionRepo: repositories.NewDiscussionRepository(),
commentRepo: repositories.NewCommentRepository(),
messageRepo: repositories.NewMessageRepository(),
}
}
type UserProfileView struct {
User *models.User
Posts []models.Discussion
PostCount int64
UnreadCount int64
IsOwner bool
}
func (s *UserService) GetUserProfile(viewerID, targetUserID uint) (*UserProfileView, error) {
user, err := s.userRepo.FindByID(targetUserID)
if err != nil {
return nil, err
}
posts, _ := s.discussionRepo.FindByUserID(targetUserID)
postCount, _ := s.discussionRepo.CountByUserID(targetUserID)
var unreadCount int64
if viewerID != 0 {
unreadCount, _ = s.messageRepo.CountUnread(viewerID)
}
return &UserProfileView{
User: user,
Posts: posts,
PostCount: postCount,
UnreadCount: unreadCount,
IsOwner: viewerID == targetUserID,
}, nil
}
func (s *UserService) UpdateAvatar(userID uint, avatarPath string) error {
user, err := s.userRepo.FindByID(userID)
if err != nil {
return err
}
return s.userRepo.UpdateField(user.ID, "avatar", avatarPath)
}
func (s *UserService) GetUserByID(id uint) (*models.User, error) {
return s.userRepo.FindByID(id)
}
func (s *UserService) UpdateUserStatus(id uint, status string) error {
return s.userRepo.UpdateField(id, "status", status)
}
func (s *UserService) UpdateUserRole(id uint, role string) error {
return s.userRepo.UpdateField(id, "role", role)
}
func (s *UserService) DeleteUser(id uint) error {
return s.userRepo.Delete(id)
}
func (s *UserService) GetPendingUsers() ([]models.User, error) {
return s.userRepo.FindPending()
}
func (s *UserService) GetAllUsers() ([]models.User, error) {
return s.userRepo.FindAll()
}
func (s *UserService) GetUserStats() (int64, int64, error) {
total, err := s.userRepo.Count()
if err != nil {
return 0, 0, err
}
online, err := s.userRepo.CountOnline()
return total, online, err
}