2026-05-12 09:53:20 +08:00

146 lines
4.4 KiB
Go

package http
import (
"hyapp/services/gateway-service/internal/transport/http/httpkit"
"net/http"
userv1 "hyapp.local/api/proto/user/v1"
"hyapp/pkg/xerr"
"hyapp/services/gateway-service/internal/auth"
)
const (
hostIdentityActiveStatus = "active"
hostIdentityAgencyInvitation = "agency_invitation"
hostIdentityAdminCreateAgency = "admin_create_agency"
hostIdentityBDRole = "bd"
hostIdentityBDLeaderRole = "bd_leader"
hostIdentityCoinSellerAsset = "COIN_SELLER_COIN"
)
type userHostIdentityData struct {
IsHost bool `json:"is_host"`
IsAgent bool `json:"is_agent"`
IsBD bool `json:"is_bd"`
IsBDLeader bool `json:"is_bd_leader"`
IsCoinSeller bool `json:"is_coin_seller"`
}
// getMyHostIdentity 聚合当前用户在 host domain 中的 App 端身份开关。
func (h *Handler) getMyHostIdentity(writer http.ResponseWriter, request *http.Request) {
if h.userHostClient == nil {
httpkit.WriteError(writer, request, http.StatusBadGateway, httpkit.CodeUpstreamError, "upstream service error")
return
}
userID := auth.UserIDFromContext(request.Context())
identity := userHostIdentityData{}
hostResp, err := h.userHostClient.GetHostProfile(request.Context(), &userv1.GetHostProfileRequest{
Meta: authRequestMeta(request, ""),
UserId: userID,
})
if err != nil {
if xerr.ReasonFromGRPC(err) != xerr.NotFound {
httpkit.WriteRPCError(writer, request, err)
return
}
} else {
applyHostIdentity(&identity, hostResp.GetHostProfile())
}
bdResp, err := h.userHostClient.GetBDProfile(request.Context(), &userv1.GetBDProfileRequest{
Meta: authRequestMeta(request, ""),
UserId: userID,
})
if err != nil {
if xerr.ReasonFromGRPC(err) != xerr.NotFound {
httpkit.WriteRPCError(writer, request, err)
return
}
} else {
applyBDIdentity(&identity, bdResp.GetBdProfile())
}
coinSellerResp, err := h.userHostClient.GetCoinSellerProfile(request.Context(), &userv1.GetCoinSellerProfileRequest{
Meta: authRequestMeta(request, ""),
UserId: userID,
})
if err != nil {
if xerr.ReasonFromGRPC(err) != xerr.NotFound {
httpkit.WriteRPCError(writer, request, err)
return
}
} else {
applyCoinSellerIdentity(&identity, coinSellerResp.GetCoinSellerProfile())
}
httpkit.WriteOK(writer, request, identity)
}
// getMyRoleSummary 返回我的页入口显隐所需的完整角色摘要。
func (h *Handler) getMyRoleSummary(writer http.ResponseWriter, request *http.Request) {
if h.userHostClient == nil {
httpkit.WriteError(writer, request, http.StatusBadGateway, httpkit.CodeUpstreamError, "upstream service error")
return
}
resp, err := h.userHostClient.GetUserRoleSummary(request.Context(), &userv1.GetUserRoleSummaryRequest{
Meta: authRequestMeta(request, ""),
UserId: auth.UserIDFromContext(request.Context()),
})
if err != nil {
httpkit.WriteRPCError(writer, request, err)
return
}
summary := resp.GetSummary()
httpkit.WriteOK(writer, request, overviewRolesData{
IsHost: summary.GetIsHost(),
IsAgency: summary.GetIsAgency(),
IsBD: summary.GetIsBd(),
IsBDLeader: summary.GetIsBdLeader(),
IsCoinSeller: summary.GetIsCoinSeller(),
HostStatus: summary.GetHostStatus(),
AgencyID: summary.GetAgencyId(),
BDID: summary.GetBdId(),
BDStatus: summary.GetBdStatus(),
CoinSellerStatus: summary.GetCoinSellerStatus(),
PendingRoleInvitations: summary.GetPendingRoleInvitations(),
})
}
func applyHostIdentity(identity *userHostIdentityData, profile *userv1.HostProfile) {
if profile == nil || profile.GetStatus() != hostIdentityActiveStatus {
return
}
identity.IsHost = true
switch profile.GetSource() {
case hostIdentityAgencyInvitation, hostIdentityAdminCreateAgency:
identity.IsAgent = true
}
}
func applyBDIdentity(identity *userHostIdentityData, profile *userv1.BDProfile) {
if profile == nil || profile.GetStatus() != hostIdentityActiveStatus {
return
}
switch profile.GetRole() {
case hostIdentityBDLeaderRole:
identity.IsBD = true
identity.IsBDLeader = true
case hostIdentityBDRole:
identity.IsBD = true
}
}
func applyCoinSellerIdentity(identity *userHostIdentityData, profile *userv1.CoinSellerProfile) {
if profile == nil ||
profile.GetStatus() != hostIdentityActiveStatus ||
profile.GetMerchantAssetType() != hostIdentityCoinSellerAsset {
return
}
identity.IsCoinSeller = true
}