@@ -29,11 +29,9 @@ import {
2929 executions ,
3030 type ExecutionStatusType ,
3131 type MembershipInsert ,
32- type MembershipRow ,
3332 memberships ,
3433 type OrganizationInsert ,
3534 OrganizationRole ,
36- type OrganizationRoleType ,
3735 organizations ,
3836 Plan ,
3937 type PlanType ,
@@ -1703,204 +1701,3 @@ export async function deleteOrganization(
17031701
17041702 return ! ! deletedOrganization ;
17051703}
1706-
1707- /**
1708- * Add or update a user's membership in an organization (only admins and owners can do this)
1709- *
1710- * @param db Database instance
1711- * @param organizationIdOrHandle Organization ID or handle
1712- * @param targetUserId User ID to add/update membership for
1713- * @param role Role to assign (member, admin, owner)
1714- * @param adminUserId User ID of the admin/owner making the change
1715- * @returns The created or updated membership record, or null if permission denied
1716- */
1717- export async function addOrUpdateMembership (
1718- db : ReturnType < typeof createDatabase > ,
1719- organizationIdOrHandle : string ,
1720- targetUserId : string ,
1721- role : OrganizationRoleType ,
1722- adminUserId : string
1723- ) : Promise < MembershipRow | null > {
1724- // First, verify the admin user has permission (admin or owner)
1725- const [ adminMembership ] = await db
1726- . select ( )
1727- . from ( memberships )
1728- . innerJoin ( organizations , eq ( memberships . organizationId , organizations . id ) )
1729- . where (
1730- and (
1731- eq ( memberships . userId , adminUserId ) ,
1732- getOrganizationCondition ( organizationIdOrHandle ) ,
1733- inArray ( memberships . role , [
1734- OrganizationRole . ADMIN ,
1735- OrganizationRole . OWNER ,
1736- ] )
1737- )
1738- )
1739- . limit ( 1 ) ;
1740-
1741- if ( ! adminMembership ) {
1742- return null ; // Admin user doesn't have permission
1743- }
1744-
1745- // Additional check: only owners can assign the owner role
1746- if (
1747- role === OrganizationRole . OWNER &&
1748- adminMembership . memberships . role !== OrganizationRole . OWNER
1749- ) {
1750- return null ; // Only owners can assign owner role
1751- }
1752-
1753- const organizationId = adminMembership . organizations . id ;
1754- const now = new Date ( ) ;
1755-
1756- // Check if the target user is already a member
1757- const [ existingMembership ] = await db
1758- . select ( )
1759- . from ( memberships )
1760- . where (
1761- and (
1762- eq ( memberships . userId , targetUserId ) ,
1763- eq ( memberships . organizationId , organizationId )
1764- )
1765- )
1766- . limit ( 1 ) ;
1767-
1768- if ( existingMembership ) {
1769- // Update existing membership
1770- const [ updatedMembership ] = await db
1771- . update ( memberships )
1772- . set ( {
1773- role,
1774- updatedAt : now ,
1775- } )
1776- . where (
1777- and (
1778- eq ( memberships . userId , targetUserId ) ,
1779- eq ( memberships . organizationId , organizationId )
1780- )
1781- )
1782- . returning ( ) ;
1783-
1784- return updatedMembership ;
1785- } else {
1786- // Create new membership
1787- const newMembership : MembershipInsert = {
1788- userId : targetUserId ,
1789- organizationId,
1790- role,
1791- createdAt : now ,
1792- updatedAt : now ,
1793- } ;
1794-
1795- const [ createdMembership ] = await db
1796- . insert ( memberships )
1797- . values ( newMembership )
1798- . returning ( ) ;
1799-
1800- return createdMembership ;
1801- }
1802- }
1803-
1804- /**
1805- * Delete a user's membership from an organization (only admins and owners can do this)
1806- *
1807- * @param db Database instance
1808- * @param organizationIdOrHandle Organization ID or handle
1809- * @param targetUserId User ID to remove from the organization
1810- * @param adminUserId User ID of the admin/owner making the change
1811- * @returns True if membership was deleted, false if permission denied or not found
1812- */
1813- export async function deleteMembership (
1814- db : ReturnType < typeof createDatabase > ,
1815- organizationIdOrHandle : string ,
1816- targetUserId : string ,
1817- adminUserId : string
1818- ) : Promise < boolean > {
1819- // First, verify the admin user has permission (admin or owner)
1820- const [ adminMembership ] = await db
1821- . select ( )
1822- . from ( memberships )
1823- . innerJoin ( organizations , eq ( memberships . organizationId , organizations . id ) )
1824- . where (
1825- and (
1826- eq ( memberships . userId , adminUserId ) ,
1827- getOrganizationCondition ( organizationIdOrHandle ) ,
1828- inArray ( memberships . role , [
1829- OrganizationRole . ADMIN ,
1830- OrganizationRole . OWNER ,
1831- ] )
1832- )
1833- )
1834- . limit ( 1 ) ;
1835-
1836- if ( ! adminMembership ) {
1837- return false ; // Admin user doesn't have permission
1838- }
1839-
1840- // Get the target user's membership to check their role
1841- const [ targetMembership ] = await db
1842- . select ( )
1843- . from ( memberships )
1844- . where (
1845- and (
1846- eq ( memberships . userId , targetUserId ) ,
1847- eq ( memberships . organizationId , adminMembership . organizations . id )
1848- )
1849- )
1850- . limit ( 1 ) ;
1851-
1852- if ( ! targetMembership ) {
1853- return false ; // Target user is not a member
1854- }
1855-
1856- // Additional check: only owners can delete other owners
1857- if (
1858- targetMembership . role === OrganizationRole . OWNER &&
1859- adminMembership . memberships . role !== OrganizationRole . OWNER
1860- ) {
1861- return false ; // Only owners can delete other owners
1862- }
1863-
1864- // Prevent users from deleting themselves
1865- if ( targetUserId === adminUserId ) {
1866- return false ; // Users cannot delete their own membership
1867- }
1868-
1869- // Delete the membership
1870- const [ deletedMembership ] = await db
1871- . delete ( memberships )
1872- . where (
1873- and (
1874- eq ( memberships . userId , targetUserId ) ,
1875- eq ( memberships . organizationId , adminMembership . organizations . id )
1876- )
1877- )
1878- . returning ( { id : memberships . userId } ) ;
1879-
1880- return ! ! deletedMembership ;
1881- }
1882-
1883- /**
1884- * List all memberships for an organization
1885- *
1886- * @param db Database instance
1887- * @param organizationIdOrHandle Organization ID or handle
1888- * @returns Array of membership records
1889- */
1890- export async function getOrganizationMemberships (
1891- db : ReturnType < typeof createDatabase > ,
1892- organizationIdOrHandle : string
1893- ) {
1894- return await db
1895- . select ( {
1896- userId : memberships . userId ,
1897- organizationId : memberships . organizationId ,
1898- role : memberships . role ,
1899- createdAt : memberships . createdAt ,
1900- updatedAt : memberships . updatedAt ,
1901- } )
1902- . from ( memberships )
1903- . innerJoin ( organizations , eq ( memberships . organizationId , organizations . id ) )
1904- . where ( getOrganizationCondition ( organizationIdOrHandle ) )
1905- . orderBy ( memberships . createdAt ) ;
1906- }
0 commit comments