136 lines
4.0 KiB
Go
136 lines
4.0 KiB
Go
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),
|
|
}
|
|
}
|