新增账号凭证邮箱查询接口
This commit is contained in:
@@ -129,6 +129,13 @@ type BulkUpdateAccountsRequest struct {
|
||||
ConfirmMixedChannelRisk *bool `json:"confirm_mixed_channel_risk"` // 用户确认混合渠道风险
|
||||
}
|
||||
|
||||
// AccountLookupRequest 用于凭证身份信息查找账号
|
||||
type AccountLookupRequest struct {
|
||||
Platform string `json:"platform" binding:"required"`
|
||||
Emails []string `json:"emails" binding:"required,min=1"`
|
||||
IdentityType string `json:"identity_type"`
|
||||
}
|
||||
|
||||
// AccountWithConcurrency extends Account with real-time concurrency info
|
||||
type AccountWithConcurrency struct {
|
||||
*dto.Account
|
||||
@@ -258,6 +265,87 @@ func (h *AccountHandler) List(c *gin.Context) {
|
||||
response.Paginated(c, result, total, page, pageSize)
|
||||
}
|
||||
|
||||
// Lookup 根据凭证身份信息查找账号
|
||||
// POST /api/v1/admin/accounts/lookup
|
||||
func (h *AccountHandler) Lookup(c *gin.Context) {
|
||||
var req AccountLookupRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
response.BadRequest(c, "Invalid request: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
identityType := strings.TrimSpace(req.IdentityType)
|
||||
if identityType == "" {
|
||||
identityType = "credential_email"
|
||||
}
|
||||
if identityType != "credential_email" {
|
||||
response.BadRequest(c, "Unsupported identity_type")
|
||||
return
|
||||
}
|
||||
|
||||
platform := strings.TrimSpace(req.Platform)
|
||||
if platform == "" {
|
||||
response.BadRequest(c, "Platform is required")
|
||||
return
|
||||
}
|
||||
|
||||
normalized := make([]string, 0, len(req.Emails))
|
||||
seen := make(map[string]struct{})
|
||||
for _, email := range req.Emails {
|
||||
cleaned := strings.ToLower(strings.TrimSpace(email))
|
||||
if cleaned == "" {
|
||||
continue
|
||||
}
|
||||
if _, ok := seen[cleaned]; ok {
|
||||
continue
|
||||
}
|
||||
seen[cleaned] = struct{}{}
|
||||
normalized = append(normalized, cleaned)
|
||||
}
|
||||
if len(normalized) == 0 {
|
||||
response.BadRequest(c, "Emails is required")
|
||||
return
|
||||
}
|
||||
|
||||
accounts, err := h.adminService.LookupAccountsByCredentialEmail(c.Request.Context(), platform, normalized)
|
||||
if err != nil {
|
||||
response.ErrorFrom(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
matchedMap := make(map[string]service.Account)
|
||||
for _, account := range accounts {
|
||||
email := strings.ToLower(strings.TrimSpace(account.GetCredential("email")))
|
||||
if email == "" {
|
||||
continue
|
||||
}
|
||||
if _, ok := matchedMap[email]; ok {
|
||||
continue
|
||||
}
|
||||
matchedMap[email] = account
|
||||
}
|
||||
|
||||
matched := make([]gin.H, 0, len(matchedMap))
|
||||
missing := make([]string, 0)
|
||||
for _, email := range normalized {
|
||||
if account, ok := matchedMap[email]; ok {
|
||||
matched = append(matched, gin.H{
|
||||
"email": email,
|
||||
"account_id": account.ID,
|
||||
"platform": account.Platform,
|
||||
"name": account.Name,
|
||||
})
|
||||
continue
|
||||
}
|
||||
missing = append(missing, email)
|
||||
}
|
||||
|
||||
response.Success(c, gin.H{
|
||||
"matched": matched,
|
||||
"missing": missing,
|
||||
})
|
||||
}
|
||||
|
||||
// GetByID handles getting an account by ID
|
||||
// GET /api/v1/admin/accounts/:id
|
||||
func (h *AccountHandler) GetByID(c *gin.Context) {
|
||||
|
||||
Reference in New Issue
Block a user