79 lines
2.6 KiB
Go
79 lines
2.6 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
|
|
"google.golang.org/grpc"
|
|
userv1 "hyapp.local/api/proto/user/v1"
|
|
"hyapp/pkg/appcode"
|
|
domain "hyapp/services/activity-service/internal/domain/agencyopening"
|
|
)
|
|
|
|
// GRPCAgencyOpeningSource reads current Agency facts from user-service for activity qualification and scoring.
|
|
type GRPCAgencyOpeningSource struct {
|
|
client userv1.UserHostServiceClient
|
|
}
|
|
|
|
func NewGRPCAgencyOpeningSource(conn *grpc.ClientConn) *GRPCAgencyOpeningSource {
|
|
return &GRPCAgencyOpeningSource{client: userv1.NewUserHostServiceClient(conn)}
|
|
}
|
|
|
|
func (s *GRPCAgencyOpeningSource) ResolveOwnerAgency(ctx context.Context, userID int64) (domain.AgencySnapshot, bool, error) {
|
|
summaryResp, err := s.client.GetUserRoleSummary(ctx, &userv1.GetUserRoleSummaryRequest{
|
|
Meta: meta(ctx, "agency-opening-owner"),
|
|
UserId: userID,
|
|
})
|
|
if err != nil {
|
|
return domain.AgencySnapshot{}, false, err
|
|
}
|
|
summary := summaryResp.GetSummary()
|
|
if summary == nil || !summary.GetIsAgency() || summary.GetAgencyId() <= 0 {
|
|
return domain.AgencySnapshot{}, false, nil
|
|
}
|
|
agencyResp, err := s.client.GetAgency(ctx, &userv1.GetAgencyRequest{
|
|
Meta: meta(ctx, "agency-opening-agency"),
|
|
AgencyId: summary.GetAgencyId(),
|
|
})
|
|
if err != nil {
|
|
return domain.AgencySnapshot{}, false, err
|
|
}
|
|
agency := agencyResp.GetAgency()
|
|
if agency == nil || agency.GetOwnerUserId() != userID {
|
|
return domain.AgencySnapshot{}, false, nil
|
|
}
|
|
snapshot := agencySnapshotFromProto(agency)
|
|
membersResp, err := s.client.GetAgencyMembers(ctx, &userv1.GetAgencyMembersRequest{
|
|
Meta: meta(ctx, "agency-opening-agency-members"),
|
|
AgencyId: snapshot.AgencyID,
|
|
Status: "active",
|
|
})
|
|
if err != nil {
|
|
return domain.AgencySnapshot{}, false, err
|
|
}
|
|
// GetAgency 的基础事实不总是携带聚合人数;资格判断必须使用当前 active membership 事实,避免把有效 agency 误判成 0 主播。
|
|
snapshot.HostCount = int32(len(membersResp.GetMemberships()))
|
|
return snapshot, true, nil
|
|
}
|
|
|
|
func agencySnapshotFromProto(agency *userv1.Agency) domain.AgencySnapshot {
|
|
if agency == nil {
|
|
return domain.AgencySnapshot{}
|
|
}
|
|
return domain.AgencySnapshot{
|
|
AgencyID: agency.GetAgencyId(),
|
|
OwnerUserID: agency.GetOwnerUserId(),
|
|
Name: agency.GetName(),
|
|
Status: agency.GetStatus(),
|
|
HostCount: agency.GetHostCount(),
|
|
AgencyCreatedAtMS: agency.GetCreatedAtMs(),
|
|
}
|
|
}
|
|
|
|
func meta(ctx context.Context, requestID string) *userv1.RequestMeta {
|
|
return &userv1.RequestMeta{
|
|
RequestId: requestID,
|
|
Caller: "activity-service",
|
|
AppCode: appcode.FromContext(ctx),
|
|
}
|
|
}
|