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 { pb.UnimplementedAdminServiceServer authService *service.AuthService orderRepo *repository.OrderRepository printerRepo *repository.PrinterRepository } func NewAdminServiceServer( authService *service.AuthService, orderRepo *repository.OrderRepository, printerRepo *repository.PrinterRepository, ) *AdminServiceServer { return &AdminServiceServer{ authService: authService, orderRepo: orderRepo, printerRepo: printerRepo, } } func (s *AdminServiceServer) Login(ctx context.Context, req *pb.AdminLoginRequest) (*pb.AdminLoginResponse, error) { result, err := s.authService.AdminLogin(ctx, req.Username, req.Password) if err != nil { return nil, status.Errorf(codes.Unauthenticated, "login failed: %v", err) } return &pb.AdminLoginResponse{ AccessToken: result.AccessToken, Admin: &pb.Admin{ Id: result.Admin.ID, Username: result.Admin.Username, Nickname: result.Admin.Nickname, Role: int32(result.Admin.Role), }, }, nil } func (s *AdminServiceServer) GetStatistics(ctx context.Context, req *pb.GetStatisticsRequest) (*pb.Statistics, error) { totalUsers, totalOrders, todayOrders, todayRevenue, pendingOrders, err := s.orderRepo.GetStatistics(ctx) if err != nil { return nil, status.Errorf(codes.Internal, "get statistics failed: %v", err) } activePrinters, err := s.printerRepo.CountActive(ctx) if err != nil { return nil, status.Errorf(codes.Internal, "get printer count failed: %v", err) } return &pb.Statistics{ TotalUsers: int32(totalUsers), TotalOrders: int32(totalOrders), TodayOrders: int32(todayOrders), TodayRevenue: todayRevenue, PendingOrders: int32(pendingOrders), 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), } }