diff --git a/apps/admin-dashboard/app/routes/_dashboard.companies.$id.edit.tsx b/apps/admin-dashboard/app/routes/_dashboard.companies.$id.edit.tsx index e22c11822..5af5904e9 100644 --- a/apps/admin-dashboard/app/routes/_dashboard.companies.$id.edit.tsx +++ b/apps/admin-dashboard/app/routes/_dashboard.companies.$id.edit.tsx @@ -160,7 +160,7 @@ export default function EditCompanyPage() { )} diff --git a/packages/core/src/modules/employment/use-cases/update-company.ts b/packages/core/src/modules/employment/use-cases/update-company.ts index 1de55fbda..1c2c5a8a4 100644 --- a/packages/core/src/modules/employment/use-cases/update-company.ts +++ b/packages/core/src/modules/employment/use-cases/update-company.ts @@ -57,6 +57,19 @@ export async function updateCompany({ } } + const conflictingCompany = await findCompanyWithSameLinkedIn({ + id, + linkedinId, + linkedinSlug: resolvedLinkedInSlug ?? linkedinSlug, + }); + + if (conflictingCompany) { + return fail({ + code: 409, + error: `${conflictingCompany.name} is already linked to that LinkedIn company.`, + }); + } + await db .updateTable('companies') .set({ @@ -74,6 +87,37 @@ export async function updateCompany({ return success({}); } +/** + * Finds another company that already holds the LinkedIn ID or slug we're about + * to save. Both columns are unique, so writing them without this check fails + * with a constraint violation instead of an error we can show to the admin. + */ +async function findCompanyWithSameLinkedIn({ + id, + linkedinId, + linkedinSlug, +}: { + id: string; + linkedinId?: string | null; + linkedinSlug?: string | null; +}) { + if (!linkedinId && !linkedinSlug) { + return undefined; + } + + return db + .selectFrom('companies') + .select(['id', 'name']) + .where('id', '!=', id) + .where((eb) => { + return eb.or([ + ...(linkedinId ? [eb('linkedinId', '=', linkedinId)] : []), + ...(linkedinSlug ? [eb('linkedinSlug', '=', linkedinSlug)] : []), + ]); + }) + .executeTakeFirst(); +} + export async function syncCompanyFromLinkedIn(id: string) { const company = await db .selectFrom('companies') @@ -106,6 +150,19 @@ export async function syncCompanyFromLinkedIn(id: string) { }); } + const conflictingCompany = await findCompanyWithSameLinkedIn({ + id, + linkedinId: companyFromLinkedIn.id, + linkedinSlug: companyFromLinkedIn.universalName, + }); + + if (conflictingCompany) { + return fail({ + code: 409, + error: `${conflictingCompany.name} is already linked to that LinkedIn company.`, + }); + } + await db .updateTable('companies') .set({