forked from baron/baron-sso
fix(backend): fix loginIdField not being synced when companyCode is empty
This commit is contained in:
@@ -330,6 +330,7 @@ func (h *UserHandler) CreateUser(c *fiber.Ctx) error {
|
|||||||
|
|
||||||
// [Resolve TenantID and LoginID before Kratos creation]
|
// [Resolve TenantID and LoginID before Kratos creation]
|
||||||
var tenantID string
|
var tenantID string
|
||||||
|
synced := false
|
||||||
if req.CompanyCode != "" && h.TenantService != nil {
|
if req.CompanyCode != "" && h.TenantService != nil {
|
||||||
if tenant, err := h.TenantService.GetTenantBySlug(c.Context(), req.CompanyCode); err == nil && tenant != nil {
|
if tenant, err := h.TenantService.GetTenantBySlug(c.Context(), req.CompanyCode); err == nil && tenant != nil {
|
||||||
tenantID = tenant.ID
|
tenantID = tenant.ID
|
||||||
@@ -337,9 +338,28 @@ func (h *UserHandler) CreateUser(c *fiber.Ctx) error {
|
|||||||
// Sync custom field to LoginID if configured
|
// Sync custom field to LoginID if configured
|
||||||
if loginIdField, ok := tenant.Config["loginIdField"].(string); ok && loginIdField != "" {
|
if loginIdField, ok := tenant.Config["loginIdField"].(string); ok && loginIdField != "" {
|
||||||
syncLoginID(attributes, req.Metadata, tenantID, 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
|
attributes["role"] = role
|
||||||
if tenantID != "" {
|
if tenantID != "" {
|
||||||
attributes["tenant_id"] = tenantID
|
attributes["tenant_id"] = tenantID
|
||||||
@@ -1202,10 +1222,28 @@ func (h *UserHandler) UpdateUser(c *fiber.Ctx) error {
|
|||||||
// [LoginID Sync based on Tenant Settings]
|
// [LoginID Sync based on Tenant Settings]
|
||||||
// Perform sync AFTER metadata merge to ensure traits contains current values
|
// Perform sync AFTER metadata merge to ensure traits contains current values
|
||||||
syncCompCode := extractTraitString(traits, "companyCode")
|
syncCompCode := extractTraitString(traits, "companyCode")
|
||||||
|
synced := false
|
||||||
|
|
||||||
if syncCompCode != "" && h.TenantService != nil {
|
if syncCompCode != "" && h.TenantService != nil {
|
||||||
if tenant, err := h.TenantService.GetTenantBySlug(c.Context(), syncCompCode); err == nil && tenant != nil {
|
if tenant, err := h.TenantService.GetTenantBySlug(c.Context(), syncCompCode); err == nil && tenant != nil {
|
||||||
if loginIdField, ok := tenant.Config["loginIdField"].(string); ok && loginIdField != "" {
|
if loginIdField, ok := tenant.Config["loginIdField"].(string); ok && loginIdField != "" {
|
||||||
syncLoginID(traits, req.Metadata, tenant.ID, 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
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user