146 lines
4.4 KiB
Go
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
|
|
}
|