( workosUserId: string )
| 598 | * organization domain, adds them to that organization. |
| 599 | */ |
| 600 | export async function checkAndAssignOrganizationByDomain( |
| 601 | workosUserId: string |
| 602 | ): Promise<{ |
| 603 | assigned: boolean; |
| 604 | organizationId?: string; |
| 605 | organizationName?: string; |
| 606 | previousOrgId?: string; |
| 607 | previousOrgName?: string; |
| 608 | error?: string; |
| 609 | } | null> { |
| 610 | const pool = getPool(); |
| 611 | |
| 612 | try { |
| 613 | const membershipResult = await pool.query<{ |
| 614 | email: string; |
| 615 | workos_organization_id: string; |
| 616 | org_name: string; |
| 617 | is_personal: boolean; |
| 618 | }>(` |
| 619 | SELECT om.email, om.workos_organization_id, o.name as org_name, o.is_personal |
| 620 | FROM organization_memberships om |
| 621 | JOIN organizations o ON o.workos_organization_id = om.workos_organization_id |
| 622 | WHERE om.workos_user_id = $1 |
| 623 | LIMIT 1 |
| 624 | `, [workosUserId]); |
| 625 | |
| 626 | if (membershipResult.rows.length === 0) { |
| 627 | return null; |
| 628 | } |
| 629 | |
| 630 | const { email, workos_organization_id: currentOrgId, org_name: currentOrgName, is_personal: isPersonal } = membershipResult.rows[0]; |
| 631 | |
| 632 | if (!isPersonal) { |
| 633 | return null; |
| 634 | } |
| 635 | |
| 636 | const domain = email.split('@')[1]?.toLowerCase(); |
| 637 | if (!domain || isFreeEmailDomain(domain)) { |
| 638 | return null; |
| 639 | } |
| 640 | |
| 641 | const domainResult = await pool.query<{ |
| 642 | workos_organization_id: string; |
| 643 | org_name: string; |
| 644 | }>(` |
| 645 | SELECT od.workos_organization_id, o.name as org_name |
| 646 | FROM organization_domains od |
| 647 | JOIN organizations o ON o.workos_organization_id = od.workos_organization_id |
| 648 | WHERE LOWER(od.domain) = $1 |
| 649 | AND o.is_personal = false |
| 650 | LIMIT 1 |
| 651 | `, [domain]); |
| 652 | |
| 653 | if (domainResult.rows.length === 0) { |
| 654 | return null; |
| 655 | } |
| 656 | |
| 657 | const { workos_organization_id: targetOrgId, org_name: targetOrgName } = domainResult.rows[0]; |
no test coverage detected