2026-06-18 14:19:47 +08:00

256 lines
11 KiB
Go

package grpc
import (
"context"
activityv1 "hyapp.local/api/proto/activity/v1"
"hyapp/pkg/appcode"
"hyapp/pkg/xerr"
domain "hyapp/services/activity-service/internal/domain/agencyopening"
service "hyapp/services/activity-service/internal/service/agencyopening"
)
type AgencyOpeningServer struct {
activityv1.UnimplementedAgencyOpeningServiceServer
svc *service.Service
}
func NewAgencyOpeningServer(svc *service.Service) *AgencyOpeningServer {
return &AgencyOpeningServer{svc: svc}
}
func (s *AgencyOpeningServer) GetAgencyOpeningStatus(ctx context.Context, req *activityv1.GetAgencyOpeningStatusRequest) (*activityv1.GetAgencyOpeningStatusResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
status, err := s.svc.GetStatus(ctx, req.GetUserId())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &activityv1.GetAgencyOpeningStatusResponse{
Cycle: agencyOpeningCycleToProto(status.Cycle),
Application: agencyOpeningApplicationToProto(status.Application),
Enabled: status.Enabled,
Eligible: status.Eligible,
Joined: status.Joined,
IneligibleReason: status.IneligibleReason,
ServerTimeMs: status.ServerTimeMS,
Agency: agencyOpeningAgencyToProto(status.Agency),
}, nil
}
func (s *AgencyOpeningServer) ApplyAgencyOpening(ctx context.Context, req *activityv1.ApplyAgencyOpeningRequest) (*activityv1.ApplyAgencyOpeningResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
application, created, err := s.svc.Apply(ctx, req.GetUserId(), req.GetCommandId())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &activityv1.ApplyAgencyOpeningResponse{Application: agencyOpeningApplicationToProto(application), Created: created}, nil
}
func (s *AgencyOpeningServer) ListAgencyOpeningLeaderboard(ctx context.Context, req *activityv1.ListAgencyOpeningApplicationsRequest) (*activityv1.ListAgencyOpeningApplicationsResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
items, total, err := s.svc.ListApplications(ctx, agencyOpeningApplicationQueryFromProto(req))
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return agencyOpeningApplicationsResponse(items, total), nil
}
type AdminAgencyOpeningServer struct {
activityv1.UnimplementedAdminAgencyOpeningServiceServer
svc *service.Service
}
func NewAdminAgencyOpeningServer(svc *service.Service) *AdminAgencyOpeningServer {
return &AdminAgencyOpeningServer{svc: svc}
}
func (s *AdminAgencyOpeningServer) ListAgencyOpeningCycles(ctx context.Context, req *activityv1.ListAgencyOpeningCyclesRequest) (*activityv1.ListAgencyOpeningCyclesResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
cycles, total, err := s.svc.ListCycles(ctx, domain.ListQuery{Status: req.GetStatus(), StartMS: req.GetStartMs(), EndMS: req.GetEndMs(), Page: req.GetPage(), PageSize: req.GetPageSize()})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &activityv1.ListAgencyOpeningCyclesResponse{Cycles: make([]*activityv1.AgencyOpeningCycle, 0, len(cycles)), Total: total}
for _, cycle := range cycles {
resp.Cycles = append(resp.Cycles, agencyOpeningCycleToProto(cycle))
}
return resp, nil
}
func (s *AdminAgencyOpeningServer) CreateAgencyOpeningCycle(ctx context.Context, req *activityv1.UpsertAgencyOpeningCycleRequest) (*activityv1.UpsertAgencyOpeningCycleResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
cycle, created, err := s.svc.CreateCycle(ctx, domain.CycleCommand{Cycle: agencyOpeningCycleFromProto(req.GetCycle()), OperatorAdminID: req.GetOperatorAdminId()})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &activityv1.UpsertAgencyOpeningCycleResponse{Cycle: agencyOpeningCycleToProto(cycle), Created: created}, nil
}
func (s *AdminAgencyOpeningServer) GetAgencyOpeningCycle(ctx context.Context, req *activityv1.GetAgencyOpeningCycleRequest) (*activityv1.GetAgencyOpeningCycleResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
cycle, err := s.svc.GetCycle(ctx, req.GetCycleId())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &activityv1.GetAgencyOpeningCycleResponse{Cycle: agencyOpeningCycleToProto(cycle)}, nil
}
func (s *AdminAgencyOpeningServer) UpdateAgencyOpeningCycle(ctx context.Context, req *activityv1.UpsertAgencyOpeningCycleRequest) (*activityv1.UpsertAgencyOpeningCycleResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
cycle, created, err := s.svc.UpdateCycle(ctx, domain.CycleCommand{Cycle: agencyOpeningCycleFromProto(req.GetCycle()), OperatorAdminID: req.GetOperatorAdminId()})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &activityv1.UpsertAgencyOpeningCycleResponse{Cycle: agencyOpeningCycleToProto(cycle), Created: created}, nil
}
func (s *AdminAgencyOpeningServer) SetAgencyOpeningCycleStatus(ctx context.Context, req *activityv1.SetAgencyOpeningCycleStatusRequest) (*activityv1.SetAgencyOpeningCycleStatusResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
cycle, err := s.svc.SetCycleStatus(ctx, req.GetCycleId(), req.GetStatus(), req.GetOperatorAdminId())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &activityv1.SetAgencyOpeningCycleStatusResponse{Cycle: agencyOpeningCycleToProto(cycle)}, nil
}
func (s *AdminAgencyOpeningServer) ListAgencyOpeningApplications(ctx context.Context, req *activityv1.ListAgencyOpeningApplicationsRequest) (*activityv1.ListAgencyOpeningApplicationsResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
items, total, err := s.svc.ListApplications(ctx, agencyOpeningApplicationQueryFromProto(req))
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return agencyOpeningApplicationsResponse(items, total), nil
}
func (s *AdminAgencyOpeningServer) ReviewAgencyOpeningApplication(ctx context.Context, req *activityv1.ReviewAgencyOpeningApplicationRequest) (*activityv1.ReviewAgencyOpeningApplicationResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
if req.GetAction() != "approve" {
return nil, xerr.ToGRPCError(xerr.New(xerr.InvalidArgument, "review action is invalid"))
}
item, err := s.svc.ApproveApplication(ctx, req.GetApplicationId(), req.GetOperatorAdminId())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &activityv1.ReviewAgencyOpeningApplicationResponse{Application: agencyOpeningApplicationToProto(item)}, nil
}
func agencyOpeningCycleFromProto(item *activityv1.AgencyOpeningCycle) domain.Cycle {
if item == nil {
return domain.Cycle{}
}
cycle := domain.Cycle{
CycleID: item.GetCycleId(),
ActivityCode: item.GetActivityCode(),
Title: item.GetTitle(),
Status: item.GetStatus(),
StartMS: item.GetStartMs(),
EndMS: item.GetEndMs(),
MinHostCount: item.GetMinHostCount(),
MaxAgencyAgeDays: item.GetMaxAgencyAgeDays(),
CreatedByAdminID: item.GetCreatedByAdminId(),
UpdatedByAdminID: item.GetUpdatedByAdminId(),
}
for _, reward := range item.GetRewards() {
cycle.Rewards = append(cycle.Rewards, domain.Reward{
RankNo: reward.GetRankNo(),
ThresholdCoinSpent: reward.GetThresholdCoinSpent(),
RewardCoinAmount: reward.GetRewardCoinAmount(),
})
}
return cycle
}
func agencyOpeningCycleToProto(item domain.Cycle) *activityv1.AgencyOpeningCycle {
if item.CycleID == "" {
return nil
}
resp := &activityv1.AgencyOpeningCycle{
AppCode: item.AppCode,
CycleId: item.CycleID,
ActivityCode: item.ActivityCode,
Title: item.Title,
Status: item.Status,
StartMs: item.StartMS,
EndMs: item.EndMS,
MinHostCount: item.MinHostCount,
MaxAgencyAgeDays: item.MaxAgencyAgeDays,
CreatedByAdminId: item.CreatedByAdminID,
UpdatedByAdminId: item.UpdatedByAdminID,
SettledAtMs: item.SettledAtMS,
CreatedAtMs: item.CreatedAtMS,
UpdatedAtMs: item.UpdatedAtMS,
Rewards: make([]*activityv1.AgencyOpeningReward, 0, len(item.Rewards)),
}
for _, reward := range item.Rewards {
resp.Rewards = append(resp.Rewards, &activityv1.AgencyOpeningReward{
RankNo: reward.RankNo,
ThresholdCoinSpent: reward.ThresholdCoinSpent,
RewardCoinAmount: reward.RewardCoinAmount,
})
}
return resp
}
func agencyOpeningApplicationToProto(item domain.Application) *activityv1.AgencyOpeningApplication {
if item.ApplicationID == "" {
return nil
}
return &activityv1.AgencyOpeningApplication{
ApplicationId: item.ApplicationID,
CycleId: item.CycleID,
AgencyId: item.AgencyID,
AgencyOwnerUserId: item.AgencyOwnerUserID,
AgencyName: item.AgencyName,
HostCount: item.HostCount,
AgencyCreatedAtMs: item.AgencyCreatedAtMS,
Status: item.Status,
ScoreCoinAmount: item.ScoreCoinAmount,
RewardRankNo: item.RewardRankNo,
RewardThresholdCoinSpent: item.RewardThresholdCoin,
RewardCoinAmount: item.RewardCoinAmount,
WalletCommandId: item.WalletCommandID,
WalletTransactionId: item.WalletTransactionID,
FailureReason: item.FailureReason,
AppliedAtMs: item.AppliedAtMS,
ApprovedAtMs: item.ApprovedAtMS,
ScoreStartMs: item.ScoreStartMS,
ScoreEndMs: item.ScoreEndMS,
ReviewedByAdminId: item.ReviewedByAdminID,
GrantedAtMs: item.GrantedAtMS,
UpdatedAtMs: item.UpdatedAtMS,
}
}
func agencyOpeningAgencyToProto(item domain.AgencySnapshot) *activityv1.AgencyOpeningAgencySnapshot {
if item.AgencyID <= 0 {
return nil
}
return &activityv1.AgencyOpeningAgencySnapshot{
AgencyId: item.AgencyID,
OwnerUserId: item.OwnerUserID,
Name: item.Name,
Status: item.Status,
HostCount: item.HostCount,
AgencyCreatedAtMs: item.AgencyCreatedAtMS,
}
}
func agencyOpeningApplicationsResponse(items []domain.Application, total int64) *activityv1.ListAgencyOpeningApplicationsResponse {
resp := &activityv1.ListAgencyOpeningApplicationsResponse{Applications: make([]*activityv1.AgencyOpeningApplication, 0, len(items)), Total: total}
for _, item := range items {
resp.Applications = append(resp.Applications, agencyOpeningApplicationToProto(item))
}
return resp
}
func agencyOpeningApplicationQueryFromProto(req *activityv1.ListAgencyOpeningApplicationsRequest) domain.ApplicationQuery {
return domain.ApplicationQuery{
CycleID: req.GetCycleId(),
Status: req.GetStatus(),
AgencyID: req.GetAgencyId(),
AgencyOwnerUserID: req.GetAgencyOwnerUserId(),
Page: req.GetPage(),
PageSize: req.GetPageSize(),
}
}