spark-server/internal/module/admin/logic/users.go

172 lines
3.9 KiB
Go

package logic
import (
"context"
"strconv"
"strings"
userentity "spark-server/internal/module/user/entity"
"spark-server/internal/pkg/errs"
)
func (s *Service) ListUsers(ctx context.Context, email string, page, size int) (list []UserView, total int64, err error) {
if !s.ready() {
return nil, 0, ErrNotReady
}
if size <= 0 || size > 200 {
size = 50
}
if page < 0 {
page = 0
}
rows, total, err := s.repo.ListUsers(ctx, email, page, size)
if err != nil {
return nil, 0, err
}
list = make([]UserView, 0, len(rows))
for _, r := range rows {
list = append(list, userView(r))
}
return list, total, nil
}
func (s *Service) UserByEmail(ctx context.Context, email string) (map[string]any, error) {
email = strings.ToLower(strings.TrimSpace(email))
if email == "" {
return nil, errs.ErrInvalidArgument
}
if !s.ready() {
return nil, ErrNotReady
}
rows, err := s.repo.UsersByEmail(ctx, email)
if err != nil {
return nil, err
}
items := make([]UserView, 0, len(rows))
for _, r := range rows {
items = append(items, userView(r))
}
return map[string]any{
"email": email, "appUsers": items, "appCode": "spark",
}, nil
}
func (s *Service) UserByID(ctx context.Context, id int64) (*UserView, error) {
if !s.ready() {
return nil, ErrNotReady
}
r, err := s.repo.UserByID(ctx, id)
if err != nil {
return nil, err
}
v := userView(*r)
return &v, nil
}
func (s *Service) UsersByNickname(ctx context.Context, nickname string) ([]UserView, error) {
if !s.ready() {
return nil, ErrNotReady
}
rows, err := s.repo.UsersByNickname(ctx, nickname)
if err != nil {
return nil, err
}
out := make([]UserView, 0, len(rows))
for _, r := range rows {
out = append(out, userView(r))
}
return out, nil
}
func (s *Service) UsersByDevice(ctx context.Context, deviceID string) ([]UserView, error) {
if !s.ready() {
return nil, ErrNotReady
}
deviceID = strings.TrimSpace(deviceID)
did, _ := strconv.ParseUint(deviceID, 10, 64)
rows, err := s.repo.UsersByDevice(ctx, deviceID, did)
if err != nil {
return nil, err
}
out := make([]UserView, 0, len(rows))
for _, r := range rows {
out = append(out, userView(r))
}
return out, nil
}
func (s *Service) UsersByIP(ctx context.Context, ip string) ([]UserView, error) {
if !s.ready() {
return nil, ErrNotReady
}
rows, err := s.repo.UsersByIP(ctx, strings.TrimSpace(ip))
if err != nil {
return nil, err
}
out := make([]UserView, 0, len(rows))
for _, r := range rows {
out = append(out, userView(r))
}
return out, nil
}
func (s *Service) BanByEmail(ctx context.Context, email string, banned bool) error {
email = strings.ToLower(strings.TrimSpace(email))
if email == "" {
return errs.ErrInvalidArgument
}
if !s.ready() {
return ErrNotReady
}
status := userentity.StatusActive
if banned {
status = userentity.StatusDisabled
}
return s.repo.SetUserStatusByEmail(ctx, email, status)
}
func (s *Service) ResetNicknameByEmail(ctx context.Context, email, nickname string) error {
email = strings.ToLower(strings.TrimSpace(email))
if email == "" {
return errs.ErrInvalidArgument
}
if strings.TrimSpace(nickname) == "" {
nickname = "用户"
}
if !s.ready() {
return ErrNotReady
}
return s.repo.SetNicknameByEmail(ctx, email, nickname)
}
func (s *Service) ResetAvatarByEmail(ctx context.Context, email string) error {
email = strings.ToLower(strings.TrimSpace(email))
if email == "" {
return errs.ErrInvalidArgument
}
if !s.ready() {
return ErrNotReady
}
return s.repo.ClearAvatarByEmail(ctx, email)
}
func (s *Service) SameIPRank(ctx context.Context, limit int) ([]SameIPItem, error) {
if !s.ready() {
return nil, ErrNotReady
}
if limit <= 0 || limit > 200 {
limit = 50
}
rows, err := s.repo.SameIPRank(ctx, limit)
if err != nil {
return nil, err
}
out := make([]SameIPItem, 0, len(rows))
for _, r := range rows {
out = append(out, SameIPItem{
IP: r.IP, UserCount: r.UserCount, DeviceCount: r.DeviceCount, Count: r.UserCount,
})
}
return out, nil
}