forked from baron/baron-sso
test: raise frontend coverage baselines
This commit is contained in:
@@ -729,14 +729,14 @@ func (h *UserHandler) CreateUser(c *fiber.Ctx) error {
|
||||
req.CompanyCode = tenant.Slug
|
||||
}
|
||||
|
||||
// Collect and sync all custom login IDs based on tenant schemas
|
||||
loginIDRecords := syncCustomLoginIDs(c.Context(), h.TenantService, attributes, req.Metadata, "")
|
||||
|
||||
attributes["role"] = role
|
||||
if tenantID != "" {
|
||||
attributes["tenant_id"] = tenantID
|
||||
}
|
||||
|
||||
// Collect and sync all custom login IDs based on tenant schemas
|
||||
loginIDRecords := syncCustomLoginIDs(c.Context(), h.TenantService, attributes, req.Metadata, "")
|
||||
|
||||
if h.UserRepo != nil {
|
||||
if err := h.ensureHanmacCreateEmailAllowed(c.Context(), email, req.CompanyCode, tenantID); err != nil {
|
||||
if strings.Contains(err.Error(), "한맥가족") {
|
||||
@@ -2050,7 +2050,7 @@ func (h *UserHandler) UpdateUser(c *fiber.Ctx) error {
|
||||
// Validate all collected LoginIDs
|
||||
userEmail := extractTraitString(traits, "email")
|
||||
userPhone := extractTraitString(traits, "phone_number")
|
||||
|
||||
|
||||
allEmails := []string{userEmail}
|
||||
if secondaryRaw, exists := traits["sub_email"]; exists {
|
||||
if secondaryEmails, ok := secondaryRaw.([]interface{}); ok {
|
||||
@@ -2534,20 +2534,23 @@ func syncCustomLoginIDs(ctx context.Context, tenantService service.TenantService
|
||||
var allCustomIDs []string
|
||||
idSet := make(map[string]bool)
|
||||
|
||||
normalizeCustomLoginIDsTrait(traits)
|
||||
|
||||
// Collect tenant IDs to check schemas for
|
||||
tenantIDsToCheck := make(map[string]bool)
|
||||
primaryTenantID := extractTraitString(traits, "tenant_id")
|
||||
for k, v := range metadata {
|
||||
// Heuristic: if it's a map, it's likely namespaced metadata for a tenant
|
||||
if _, ok := v.(map[string]any); ok {
|
||||
tenantIDsToCheck[k] = true
|
||||
} else if _, ok := v.(map[string]interface{}); ok {
|
||||
if isTenantMetadataNamespace(k, v, primaryTenantID) {
|
||||
tenantIDsToCheck[k] = true
|
||||
}
|
||||
}
|
||||
// Also check primary tenant if available
|
||||
if tid := extractTraitString(traits, "tenant_id"); tid != "" {
|
||||
if tid := primaryTenantID; tid != "" && (len(metadata) > 0 || isMetadataMap(traits[tid])) {
|
||||
tenantIDsToCheck[tid] = true
|
||||
}
|
||||
if len(tenantIDsToCheck) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
for tid := range tenantIDsToCheck {
|
||||
tenant, err := tenantService.GetTenant(ctx, tid)
|
||||
@@ -2629,6 +2632,66 @@ func syncCustomLoginIDs(ctx context.Context, tenantService service.TenantService
|
||||
return loginIDRecords
|
||||
}
|
||||
|
||||
func isTenantMetadataNamespace(key string, value any, primaryTenantID string) bool {
|
||||
return isTenantMetadataNamespaceKey(key, primaryTenantID) && isMetadataMap(value)
|
||||
}
|
||||
|
||||
func isTenantMetadataNamespaceKey(key string, primaryTenantID string) bool {
|
||||
if key == "" {
|
||||
return false
|
||||
}
|
||||
if primaryTenantID != "" && key == primaryTenantID {
|
||||
return true
|
||||
}
|
||||
if len(key) != 36 {
|
||||
return false
|
||||
}
|
||||
for index, char := range key {
|
||||
switch index {
|
||||
case 8, 13, 18, 23:
|
||||
if char != '-' {
|
||||
return false
|
||||
}
|
||||
default:
|
||||
if !((char >= '0' && char <= '9') || (char >= 'a' && char <= 'f') || (char >= 'A' && char <= 'F')) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func isMetadataMap(value any) bool {
|
||||
if _, ok := value.(map[string]any); ok {
|
||||
return true
|
||||
}
|
||||
if _, ok := value.(map[string]interface{}); ok {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func normalizeCustomLoginIDsTrait(traits map[string]interface{}) {
|
||||
raw, exists := traits["custom_login_ids"]
|
||||
if !exists {
|
||||
return
|
||||
}
|
||||
switch values := raw.(type) {
|
||||
case []string:
|
||||
return
|
||||
case []interface{}:
|
||||
normalized := make([]string, 0, len(values))
|
||||
for _, value := range values {
|
||||
if text, ok := value.(string); ok && strings.TrimSpace(text) != "" {
|
||||
normalized = append(normalized, text)
|
||||
}
|
||||
}
|
||||
if len(normalized) > 0 {
|
||||
traits["custom_login_ids"] = normalized
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func formatTime(value time.Time) string {
|
||||
if value.IsZero() {
|
||||
return ""
|
||||
|
||||
Reference in New Issue
Block a user