diff --git a/backend/internal/handler/user_handler.go b/backend/internal/handler/user_handler.go index 04712326..13733228 100644 --- a/backend/internal/handler/user_handler.go +++ b/backend/internal/handler/user_handler.go @@ -330,6 +330,7 @@ func (h *UserHandler) CreateUser(c *fiber.Ctx) error { // [Resolve TenantID and LoginID before Kratos creation] var tenantID string + synced := false if req.CompanyCode != "" && h.TenantService != nil { if tenant, err := h.TenantService.GetTenantBySlug(c.Context(), req.CompanyCode); err == nil && tenant != nil { tenantID = tenant.ID @@ -337,9 +338,28 @@ func (h *UserHandler) CreateUser(c *fiber.Ctx) error { // Sync custom field to LoginID if configured if loginIdField, ok := tenant.Config["loginIdField"].(string); ok && loginIdField != "" { syncLoginID(attributes, req.Metadata, tenantID, loginIdField) + synced = true } } } + + // Fallback: Try syncing based on the tenant namespaces being updated + if !synced && h.TenantService != nil { + for k := range req.Metadata { + if len(k) >= 32 { // Looks like a UUID (tenant ID) + if tenant, err := h.TenantService.GetTenant(c.Context(), k); err == nil && tenant != nil { + if tenantID == "" { + tenantID = tenant.ID + } + if loginIdField, ok := tenant.Config["loginIdField"].(string); ok && loginIdField != "" { + syncLoginID(attributes, req.Metadata, tenant.ID, loginIdField) + break + } + } + } + } + } + attributes["role"] = role if tenantID != "" { attributes["tenant_id"] = tenantID @@ -1202,10 +1222,28 @@ func (h *UserHandler) UpdateUser(c *fiber.Ctx) error { // [LoginID Sync based on Tenant Settings] // Perform sync AFTER metadata merge to ensure traits contains current values syncCompCode := extractTraitString(traits, "companyCode") + synced := false + if syncCompCode != "" && h.TenantService != nil { if tenant, err := h.TenantService.GetTenantBySlug(c.Context(), syncCompCode); err == nil && tenant != nil { if loginIdField, ok := tenant.Config["loginIdField"].(string); ok && loginIdField != "" { syncLoginID(traits, req.Metadata, tenant.ID, loginIdField) + synced = true + } + } + } + + // Fallback: If companyCode is empty or didn't sync, try syncing based on the tenant namespaces being updated + if !synced && h.TenantService != nil { + for k := range req.Metadata { + if len(k) >= 32 { // Looks like a UUID (tenant ID) + if tenant, err := h.TenantService.GetTenant(c.Context(), k); err == nil && tenant != nil { + if loginIdField, ok := tenant.Config["loginIdField"].(string); ok && loginIdField != "" { + syncLoginID(traits, req.Metadata, tenant.ID, loginIdField) + synced = true + break // Apply first matched tenant config + } + } } } }