Files
YouduWiki/backend/usecase/user.go
2026-05-21 19:52:45 +08:00

82 lines
2.2 KiB
Go

package usecase
import (
"context"
"fmt"
"time"
"github.com/golang-jwt/jwt/v5"
"github.com/google/uuid"
v1 "github.com/chaitin/panda-wiki/api/user/v1"
"github.com/chaitin/panda-wiki/config"
"github.com/chaitin/panda-wiki/consts"
"github.com/chaitin/panda-wiki/domain"
"github.com/chaitin/panda-wiki/log"
"github.com/chaitin/panda-wiki/repo/pg"
)
type UserUsecase struct {
repo *pg.UserRepository
logger *log.Logger
config *config.Config
}
func NewUserUsecase(repo *pg.UserRepository, logger *log.Logger, config *config.Config) (*UserUsecase, error) {
if config.AdminPassword != "" {
if err := repo.UpsertDefaultUser(context.Background(), &domain.User{
ID: uuid.New().String(),
Account: "admin",
Password: config.AdminPassword,
Role: consts.UserRoleAdmin,
}); err != nil {
return nil, fmt.Errorf("failed to create default user: %w", err)
}
}
return &UserUsecase{
repo: repo,
logger: logger.WithModule("usecase.user"),
config: config,
}, nil
}
func (u *UserUsecase) CreateUser(ctx context.Context, user *domain.User, edition consts.LicenseEdition) error {
return u.repo.CreateUser(ctx, user, edition)
}
func (u *UserUsecase) VerifyUserAndGenerateToken(ctx context.Context, req v1.LoginReq) (string, error) {
var user *domain.User
var err error
user, err = u.repo.VerifyUser(ctx, req.Account, req.Password)
if err != nil {
return "", err
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"id": user.ID,
"exp": time.Now().Add(time.Hour * 24).Unix(),
})
return token.SignedString([]byte(u.config.Auth.JWT.Secret))
}
func (u *UserUsecase) GetUser(ctx context.Context, userID string) (*domain.User, error) {
return u.repo.GetUser(ctx, userID)
}
func (u *UserUsecase) ListUsers(ctx context.Context) (*v1.UserListResp, error) {
// 获取所有用户列表
users, err := u.repo.ListUsers(ctx)
if err != nil {
return nil, err
}
return &v1.UserListResp{Users: users}, nil
}
func (u *UserUsecase) ResetPassword(ctx context.Context, req *v1.ResetPasswordReq) error {
return u.repo.UpdateUserPassword(ctx, req.ID, req.NewPassword)
}
func (u *UserUsecase) DeleteUser(ctx context.Context, userID string) error {
return u.repo.DeleteUser(ctx, userID)
}