forked from baron/baron-sso
네이버 계정 정합성 맞춤
This commit is contained in:
@@ -1270,14 +1270,27 @@ function getUserOrgAppointmentRefs(user: UserSummary): UserOrgAppointmentRef[] {
|
||||
}
|
||||
|
||||
function addTenantSlugCandidate(
|
||||
slugs: Set<string>,
|
||||
tenantIds: Set<string>,
|
||||
tenantIndexes: TenantIndexes,
|
||||
slug: string,
|
||||
) {
|
||||
const normalizedSlug = normalizeOrgSlug(slug);
|
||||
if (!normalizedSlug) return;
|
||||
if (!tenantIndexes.bySlug.has(normalizedSlug)) return;
|
||||
slugs.add(normalizedSlug);
|
||||
const tenant = tenantIndexes.bySlug.get(normalizedSlug);
|
||||
if (!tenant) return;
|
||||
tenantIds.add(tenant.id);
|
||||
}
|
||||
|
||||
function addTenantIdCandidate(
|
||||
tenantIds: Set<string>,
|
||||
tenantIndexes: TenantIndexes,
|
||||
id: unknown,
|
||||
) {
|
||||
if (typeof id !== "string") return;
|
||||
const normalizedId = id.trim();
|
||||
if (!normalizedId) return;
|
||||
if (!tenantIndexes.byId.has(normalizedId)) return;
|
||||
tenantIds.add(normalizedId);
|
||||
}
|
||||
|
||||
function isDescendantTenant(
|
||||
@@ -1298,19 +1311,19 @@ function isDescendantTenant(
|
||||
return false;
|
||||
}
|
||||
|
||||
function getLeafMembershipSlugs(
|
||||
slugs: Set<string>,
|
||||
function getLeafMembershipIds(
|
||||
tenantIds: Set<string>,
|
||||
tenantIndexes: TenantIndexes,
|
||||
) {
|
||||
const memberships = Array.from(slugs);
|
||||
const memberships = Array.from(tenantIds);
|
||||
|
||||
return memberships.filter((slug) => {
|
||||
const tenant = tenantIndexes.bySlug.get(slug);
|
||||
return memberships.filter((id) => {
|
||||
const tenant = tenantIndexes.byId.get(id);
|
||||
if (!tenant) return true;
|
||||
|
||||
return !memberships.some((otherSlug) => {
|
||||
if (otherSlug === slug) return false;
|
||||
const otherTenant = tenantIndexes.bySlug.get(otherSlug);
|
||||
return !memberships.some((otherId) => {
|
||||
if (otherId === id) return false;
|
||||
const otherTenant = tenantIndexes.byId.get(otherId);
|
||||
if (!otherTenant) return false;
|
||||
return isDescendantTenant(otherTenant, tenant, tenantIndexes.byId);
|
||||
});
|
||||
@@ -1332,7 +1345,7 @@ export function buildUsersMap(
|
||||
if (options.activeOnly && user.status !== "active") continue;
|
||||
if (!isVisibleOrgChartUser(user)) continue;
|
||||
|
||||
const slugs = new Set<string>();
|
||||
const tenantIds = new Set<string>();
|
||||
const primarySlug = normalizeOrgSlug(user.tenantSlug);
|
||||
const legacyCompanySlug = normalizeOrgSlug(user.companyCode);
|
||||
if (
|
||||
@@ -1344,7 +1357,7 @@ export function buildUsersMap(
|
||||
name: primarySlug,
|
||||
})
|
||||
) {
|
||||
addTenantSlugCandidate(slugs, membershipTenantIndexes, primarySlug);
|
||||
addTenantSlugCandidate(tenantIds, membershipTenantIndexes, primarySlug);
|
||||
}
|
||||
if (
|
||||
legacyCompanySlug &&
|
||||
@@ -1355,24 +1368,51 @@ export function buildUsersMap(
|
||||
name: legacyCompanySlug,
|
||||
})
|
||||
) {
|
||||
addTenantSlugCandidate(slugs, membershipTenantIndexes, legacyCompanySlug);
|
||||
addTenantSlugCandidate(
|
||||
tenantIds,
|
||||
membershipTenantIndexes,
|
||||
legacyCompanySlug,
|
||||
);
|
||||
}
|
||||
if (user.tenant?.slug && !isSystemGlobalTenant(user.tenant)) {
|
||||
addTenantSlugCandidate(slugs, membershipTenantIndexes, user.tenant.slug);
|
||||
addTenantIdCandidate(tenantIds, membershipTenantIndexes, user.tenant.id);
|
||||
addTenantSlugCandidate(
|
||||
tenantIds,
|
||||
membershipTenantIndexes,
|
||||
user.tenant.slug,
|
||||
);
|
||||
}
|
||||
for (const joinedTenant of user.joinedTenants || []) {
|
||||
if (joinedTenant.slug && !isSystemGlobalTenant(joinedTenant)) {
|
||||
addTenantIdCandidate(
|
||||
tenantIds,
|
||||
membershipTenantIndexes,
|
||||
joinedTenant.id,
|
||||
);
|
||||
addTenantSlugCandidate(
|
||||
slugs,
|
||||
tenantIds,
|
||||
membershipTenantIndexes,
|
||||
joinedTenant.slug,
|
||||
);
|
||||
}
|
||||
}
|
||||
for (const appointment of getUserOrgAppointmentRefs(user)) {
|
||||
const hasTenantIdCandidate =
|
||||
appointment.tenantId &&
|
||||
membershipTenantIndexes.byId.has(appointment.tenantId);
|
||||
|
||||
if (hasTenantIdCandidate) {
|
||||
addTenantIdCandidate(
|
||||
tenantIds,
|
||||
membershipTenantIndexes,
|
||||
appointment.tenantId,
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (appointment.tenantSlug) {
|
||||
addTenantSlugCandidate(
|
||||
slugs,
|
||||
tenantIds,
|
||||
membershipTenantIndexes,
|
||||
appointment.tenantSlug,
|
||||
);
|
||||
@@ -1383,12 +1423,14 @@ export function buildUsersMap(
|
||||
? membershipTenantIndexes.byId.get(appointment.tenantId)
|
||||
: undefined;
|
||||
if (tenantById) {
|
||||
addTenantSlugCandidate(slugs, membershipTenantIndexes, tenantById.slug);
|
||||
addTenantIdCandidate(tenantIds, membershipTenantIndexes, tenantById.id);
|
||||
}
|
||||
}
|
||||
|
||||
for (const slug of getLeafMembershipSlugs(slugs, membershipTenantIndexes)) {
|
||||
if (!visibleTenantIndexes.bySlug.has(slug)) continue;
|
||||
for (const id of getLeafMembershipIds(tenantIds, membershipTenantIndexes)) {
|
||||
const visibleTenant = visibleTenantIndexes.byId.get(id);
|
||||
if (!visibleTenant) continue;
|
||||
const slug = visibleTenant.slug.toLowerCase();
|
||||
const list = map.get(slug) || [];
|
||||
if (!list.some((existing) => existing.id === user.id)) list.push(user);
|
||||
map.set(slug, list);
|
||||
@@ -1444,6 +1486,9 @@ export function TenantOrgChartPage() {
|
||||
queryKey: ["orgchart-snapshot", { cache: "redis" }],
|
||||
queryFn: () => fetchOrgChartSnapshot(),
|
||||
enabled: !shareToken,
|
||||
staleTime: 0,
|
||||
refetchOnMount: "always",
|
||||
refetchOnWindowFocus: true,
|
||||
});
|
||||
|
||||
const { rootNodes, usersMap, sharedWith } = React.useMemo(() => {
|
||||
|
||||
Reference in New Issue
Block a user