更新管理员相关接口
This commit is contained in:
@@ -3,11 +3,13 @@ package service
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/cloudprint/cloudprint-backend/internal/model"
|
||||
"github.com/cloudprint/cloudprint-backend/internal/repository"
|
||||
"github.com/cloudprint/cloudprint-backend/internal/service"
|
||||
pb "github.com/cloudprint/cloudprint-backend/proto/generated"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
"google.golang.org/protobuf/types/known/timestamppb"
|
||||
)
|
||||
|
||||
type AdminServiceServer struct {
|
||||
@@ -66,3 +68,68 @@ func (s *AdminServiceServer) GetStatistics(ctx context.Context, req *pb.GetStati
|
||||
ActivePrinters: int32(activePrinters),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *AdminServiceServer) CreateAdmin(ctx context.Context, req *pb.CreateAdminRequest) (*pb.CreateAdminResponse, error) {
|
||||
admin, err := s.authService.CreateAdmin(ctx, req.Username, req.Password, req.Nickname, int8(req.Role))
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "create admin failed: %v", err)
|
||||
}
|
||||
|
||||
return &pb.CreateAdminResponse{
|
||||
Admin: convertAdminToProto(admin),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *AdminServiceServer) GetAdminList(ctx context.Context, req *pb.GetAdminListRequest) (*pb.AdminListResponse, error) {
|
||||
page := req.Page
|
||||
if page <= 0 {
|
||||
page = 1
|
||||
}
|
||||
pageSize := req.PageSize
|
||||
if pageSize <= 0 {
|
||||
pageSize = 10
|
||||
}
|
||||
|
||||
admins, total, err := s.authService.GetAdminList(ctx, int(page), int(pageSize))
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "get admin list failed: %v", err)
|
||||
}
|
||||
|
||||
pbAdmins := make([]*pb.Admin, len(admins))
|
||||
for i, admin := range admins {
|
||||
pbAdmins[i] = convertAdminToProto(&admin)
|
||||
}
|
||||
|
||||
return &pb.AdminListResponse{
|
||||
Admins: pbAdmins,
|
||||
Total: int32(total),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *AdminServiceServer) UpdateAdmin(ctx context.Context, req *pb.UpdateAdminRequest) (*pb.Admin, error) {
|
||||
admin, err := s.authService.UpdateAdmin(ctx, req.Id, req.Nickname, int8(req.Role))
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "update admin failed: %v", err)
|
||||
}
|
||||
|
||||
return convertAdminToProto(admin), nil
|
||||
}
|
||||
|
||||
func (s *AdminServiceServer) DeleteAdmin(ctx context.Context, req *pb.DeleteAdminRequest) (*pb.Empty, error) {
|
||||
if err := s.authService.DeleteAdmin(ctx, req.Id); err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "delete admin failed: %v", err)
|
||||
}
|
||||
|
||||
return &pb.Empty{}, nil
|
||||
}
|
||||
|
||||
// convertAdminToProto 将model.Admin转换为pb.Admin
|
||||
func convertAdminToProto(admin *model.Admin) *pb.Admin {
|
||||
return &pb.Admin{
|
||||
Id: admin.ID,
|
||||
Username: admin.Username,
|
||||
Nickname: admin.Nickname,
|
||||
Role: int32(admin.Role),
|
||||
CreatedAt: timestamppb.New(admin.CreatedAt),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,3 +47,23 @@ func (r *AdminRepository) GetByUsername(ctx context.Context, username string) (*
|
||||
func (r *AdminRepository) Update(ctx context.Context, admin *model.Admin) error {
|
||||
return r.db.WithContext(ctx).Save(admin).Error
|
||||
}
|
||||
|
||||
func (r *AdminRepository) Delete(ctx context.Context, id int32) error {
|
||||
return r.db.WithContext(ctx).Delete(&model.Admin{}, id).Error
|
||||
}
|
||||
|
||||
func (r *AdminRepository) List(ctx context.Context, page, pageSize int) ([]model.Admin, int64, error) {
|
||||
var admins []model.Admin
|
||||
var total int64
|
||||
|
||||
if err := r.db.WithContext(ctx).Model(&model.Admin{}).Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
offset := (page - 1) * pageSize
|
||||
if err := r.db.WithContext(ctx).Offset(offset).Limit(pageSize).Find(&admins).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
return admins, total, nil
|
||||
}
|
||||
|
||||
@@ -181,6 +181,68 @@ type AdminLoginResult struct {
|
||||
Admin *model.Admin
|
||||
}
|
||||
|
||||
// CreateAdmin 创建管理员账号
|
||||
func (s *AuthService) CreateAdmin(ctx context.Context, username, password, nickname string, role int8) (*model.Admin, error) {
|
||||
// 检查用户名是否已存在
|
||||
existingAdmin, err := s.adminRepo.GetByUsername(ctx, username)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to check existing admin: %w", err)
|
||||
}
|
||||
if existingAdmin != nil {
|
||||
return nil, errors.New("username already exists")
|
||||
}
|
||||
|
||||
// 对密码进行哈希处理
|
||||
passwordHash, err := HashPassword(password)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to hash password: %w", err)
|
||||
}
|
||||
|
||||
// 创建管理员
|
||||
admin := &model.Admin{
|
||||
Username: username,
|
||||
PasswordHash: passwordHash,
|
||||
Nickname: nickname,
|
||||
Role: role,
|
||||
}
|
||||
|
||||
if err := s.adminRepo.Create(ctx, admin); err != nil {
|
||||
return nil, fmt.Errorf("failed to create admin: %w", err)
|
||||
}
|
||||
|
||||
return admin, nil
|
||||
}
|
||||
|
||||
// UpdateAdmin 更新管理员信息
|
||||
func (s *AuthService) UpdateAdmin(ctx context.Context, id int32, nickname string, role int8) (*model.Admin, error) {
|
||||
admin, err := s.adminRepo.GetByID(ctx, id)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get admin: %w", err)
|
||||
}
|
||||
if admin == nil {
|
||||
return nil, errors.New("admin not found")
|
||||
}
|
||||
|
||||
admin.Nickname = nickname
|
||||
admin.Role = role
|
||||
|
||||
if err := s.adminRepo.Update(ctx, admin); err != nil {
|
||||
return nil, fmt.Errorf("failed to update admin: %w", err)
|
||||
}
|
||||
|
||||
return admin, nil
|
||||
}
|
||||
|
||||
// DeleteAdmin 删除管理员
|
||||
func (s *AuthService) DeleteAdmin(ctx context.Context, id int32) error {
|
||||
return s.adminRepo.Delete(ctx, id)
|
||||
}
|
||||
|
||||
// GetAdminList 获取管理员列表
|
||||
func (s *AuthService) GetAdminList(ctx context.Context, page, pageSize int) ([]model.Admin, int64, error) {
|
||||
return s.adminRepo.List(ctx, page, pageSize)
|
||||
}
|
||||
|
||||
// HashPassword creates a bcrypt hash of the password
|
||||
func HashPassword(password string) (string, error) {
|
||||
bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
||||
|
||||
Reference in New Issue
Block a user