forked from baron/baron-sso
@@ -364,6 +364,24 @@ func (h *TenantHandler) UpdateTenant(c *fiber.Ctx) error {
|
||||
if pid == "" {
|
||||
tenant.ParentID = nil
|
||||
} else {
|
||||
// 순환 참조(Circular Dependency) 방지 로직:
|
||||
// 새로운 부모(pid)부터 상위로 탐색하면서 현재 테넌트(tenant.ID)가 나오면 순환 참조로 간주함
|
||||
checkID := pid
|
||||
for checkID != "" {
|
||||
if checkID == tenant.ID {
|
||||
return errorJSON(c, fiber.StatusConflict, "순환 참조 오류: 하위 테넌트를 상위 테넌트로 지정할 수 없습니다.")
|
||||
}
|
||||
var pTenant domain.Tenant
|
||||
if err := h.DB.Select("id, parent_id").First(&pTenant, "id = ?", checkID).Error; err != nil {
|
||||
break // 데이터를 찾을 수 없거나 에러 발생 시 반복문 종료 (추후 외래키 제약조건 등에서 에러 발생)
|
||||
}
|
||||
if pTenant.ParentID != nil {
|
||||
checkID = *pTenant.ParentID
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
tenant.ParentID = &pid
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user