@multitenantkit/adapter-persistence-supabase 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +225 -0
  2. package/dist/client/SupabaseClient.d.ts +29 -0
  3. package/dist/client/SupabaseClient.d.ts.map +1 -0
  4. package/dist/client/SupabaseClient.js +36 -0
  5. package/dist/client/SupabaseClient.js.map +1 -0
  6. package/dist/factory/SupabaseFactory.d.ts +45 -0
  7. package/dist/factory/SupabaseFactory.d.ts.map +1 -0
  8. package/dist/factory/SupabaseFactory.js +33 -0
  9. package/dist/factory/SupabaseFactory.js.map +1 -0
  10. package/dist/factory/UseCaseFactory.d.ts +26 -0
  11. package/dist/factory/UseCaseFactory.d.ts.map +1 -0
  12. package/dist/factory/UseCaseFactory.js +76 -0
  13. package/dist/factory/UseCaseFactory.js.map +1 -0
  14. package/dist/index.d.ts +30 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +34 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/mappers/OrganizationMapper.d.ts +47 -0
  19. package/dist/mappers/OrganizationMapper.d.ts.map +1 -0
  20. package/dist/mappers/OrganizationMapper.js +56 -0
  21. package/dist/mappers/OrganizationMapper.js.map +1 -0
  22. package/dist/mappers/OrganizationMembershipMapper.d.ts +59 -0
  23. package/dist/mappers/OrganizationMembershipMapper.d.ts.map +1 -0
  24. package/dist/mappers/OrganizationMembershipMapper.js +78 -0
  25. package/dist/mappers/OrganizationMembershipMapper.js.map +1 -0
  26. package/dist/mappers/UserMapper.d.ts +53 -0
  27. package/dist/mappers/UserMapper.d.ts.map +1 -0
  28. package/dist/mappers/UserMapper.js +62 -0
  29. package/dist/mappers/UserMapper.js.map +1 -0
  30. package/dist/repositories/SupabaseOrganizationMembershipRepository.d.ts +33 -0
  31. package/dist/repositories/SupabaseOrganizationMembershipRepository.d.ts.map +1 -0
  32. package/dist/repositories/SupabaseOrganizationMembershipRepository.js +239 -0
  33. package/dist/repositories/SupabaseOrganizationMembershipRepository.js.map +1 -0
  34. package/dist/repositories/SupabaseOrganizationRepository.d.ts +33 -0
  35. package/dist/repositories/SupabaseOrganizationRepository.d.ts.map +1 -0
  36. package/dist/repositories/SupabaseOrganizationRepository.js +150 -0
  37. package/dist/repositories/SupabaseOrganizationRepository.js.map +1 -0
  38. package/dist/repositories/SupabaseUserRepository.d.ts +60 -0
  39. package/dist/repositories/SupabaseUserRepository.d.ts.map +1 -0
  40. package/dist/repositories/SupabaseUserRepository.js +168 -0
  41. package/dist/repositories/SupabaseUserRepository.js.map +1 -0
  42. package/dist/system/WebClock.d.ts +17 -0
  43. package/dist/system/WebClock.d.ts.map +1 -0
  44. package/dist/system/WebClock.js +18 -0
  45. package/dist/system/WebClock.js.map +1 -0
  46. package/dist/system/WebCryptoUuid.d.ts +21 -0
  47. package/dist/system/WebCryptoUuid.d.ts.map +1 -0
  48. package/dist/system/WebCryptoUuid.js +22 -0
  49. package/dist/system/WebCryptoUuid.js.map +1 -0
  50. package/dist/system/index.d.ts +3 -0
  51. package/dist/system/index.d.ts.map +1 -0
  52. package/dist/system/index.js +3 -0
  53. package/dist/system/index.js.map +1 -0
  54. package/package.json +68 -0
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Organization Mapper for Supabase
3
+ */
4
+ /**
5
+ * Default column mapping (snake_case)
6
+ */
7
+ export const DEFAULT_ORGANIZATION_COLUMN_MAP = {
8
+ id: 'id',
9
+ ownerUserId: 'owner_user_id',
10
+ createdAt: 'created_at',
11
+ updatedAt: 'updated_at',
12
+ deletedAt: 'deleted_at'
13
+ };
14
+ /**
15
+ * Organization mapper utilities
16
+ */
17
+ export class OrganizationMapper {
18
+ /**
19
+ * Map database row to domain Organization entity
20
+ */
21
+ static toDomain(row, columnMap = DEFAULT_ORGANIZATION_COLUMN_MAP) {
22
+ return {
23
+ id: row[columnMap.id],
24
+ ownerUserId: row[columnMap.ownerUserId],
25
+ createdAt: new Date(row[columnMap.createdAt]),
26
+ updatedAt: new Date(row[columnMap.updatedAt]),
27
+ deletedAt: row[columnMap.deletedAt]
28
+ ? new Date(row[columnMap.deletedAt])
29
+ : undefined
30
+ };
31
+ }
32
+ /**
33
+ * Map database row to domain Organization entity with custom fields
34
+ */
35
+ static toDomainWithCustom(row, columnMap = DEFAULT_ORGANIZATION_COLUMN_MAP, customFieldsMapper) {
36
+ const baseOrg = OrganizationMapper.toDomain(row, columnMap);
37
+ if (customFieldsMapper) {
38
+ const customFields = customFieldsMapper(row);
39
+ return { ...baseOrg, ...customFields };
40
+ }
41
+ return baseOrg;
42
+ }
43
+ /**
44
+ * Map domain Organization entity to database row
45
+ */
46
+ static toDb(org, columnMap = DEFAULT_ORGANIZATION_COLUMN_MAP) {
47
+ return {
48
+ [columnMap.id]: org.id,
49
+ [columnMap.ownerUserId]: org.ownerUserId,
50
+ [columnMap.createdAt]: org.createdAt.toISOString(),
51
+ [columnMap.updatedAt]: org.updatedAt.toISOString(),
52
+ [columnMap.deletedAt]: org.deletedAt?.toISOString() ?? null
53
+ };
54
+ }
55
+ }
56
+ //# sourceMappingURL=OrganizationMapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationMapper.js","sourceRoot":"","sources":["../../src/mappers/OrganizationMapper.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2BH;;GAEG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAA0B;IAClE,EAAE,EAAE,IAAI;IACR,WAAW,EAAE,eAAe;IAC5B,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAC3B;;OAEG;IACH,MAAM,CAAC,QAAQ,CACX,GAAsB,EACtB,YAAmC,+BAA+B;QAElE,OAAO;YACH,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAW;YAC/B,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,CAAW;YACjD,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAW,CAAC;YACvD,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAW,CAAC;YACvD,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC;gBAC/B,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAW,CAAC;gBAC9C,CAAC,CAAC,SAAS;SAClB,CAAC;IACN,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,kBAAkB,CACrB,GAAsB,EACtB,YAAmC,+BAA+B,EAClE,kBAA8D;QAE9D,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAE5D,IAAI,kBAAkB,EAAE,CAAC;YACrB,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;YAC7C,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,YAAY,EAAkC,CAAC;QAC3E,CAAC;QAED,OAAO,OAAuC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,CACP,GAAiB,EACjB,YAAmC,+BAA+B;QAElE,OAAO;YACH,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;YACtB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,WAAW;YACxC,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE;YAClD,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE;YAClD,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,IAAI;SAC9D,CAAC;IACN,CAAC;CACJ"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Organization Membership Mapper for Supabase
3
+ */
4
+ import type { OrganizationMembership } from '@multitenantkit/domain-contracts';
5
+ /**
6
+ * Database row type for organization memberships
7
+ */
8
+ export interface OrganizationMembershipDbRow {
9
+ id: string;
10
+ user_id: string;
11
+ username: string;
12
+ organization_id: string;
13
+ role_code: string;
14
+ invited_at?: string | null;
15
+ joined_at?: string | null;
16
+ left_at?: string | null;
17
+ deleted_at?: string | null;
18
+ created_at: string;
19
+ updated_at: string;
20
+ [key: string]: unknown;
21
+ }
22
+ /**
23
+ * Column mapping configuration
24
+ */
25
+ export interface OrganizationMembershipColumnMap {
26
+ id: string;
27
+ userId: string;
28
+ username: string;
29
+ organizationId: string;
30
+ roleCode: string;
31
+ invitedAt: string;
32
+ joinedAt: string;
33
+ leftAt: string;
34
+ deletedAt: string;
35
+ createdAt: string;
36
+ updatedAt: string;
37
+ }
38
+ /**
39
+ * Default column mapping (snake_case)
40
+ */
41
+ export declare const DEFAULT_MEMBERSHIP_COLUMN_MAP: OrganizationMembershipColumnMap;
42
+ /**
43
+ * Organization Membership mapper utilities
44
+ */
45
+ export declare class OrganizationMembershipMapper {
46
+ /**
47
+ * Map database row to domain OrganizationMembership entity
48
+ */
49
+ static toDomain(row: OrganizationMembershipDbRow, columnMap?: OrganizationMembershipColumnMap): OrganizationMembership;
50
+ /**
51
+ * Map database row to domain entity with custom fields
52
+ */
53
+ static toDomainWithCustom<TCustomFields>(row: OrganizationMembershipDbRow, columnMap?: OrganizationMembershipColumnMap, customFieldsMapper?: (row: OrganizationMembershipDbRow) => TCustomFields): OrganizationMembership & TCustomFields;
54
+ /**
55
+ * Map domain entity to database row
56
+ */
57
+ static toDb(membership: OrganizationMembership, columnMap?: OrganizationMembershipColumnMap): Record<string, unknown>;
58
+ }
59
+ //# sourceMappingURL=OrganizationMembershipMapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationMembershipMapper.d.ts","sourceRoot":"","sources":["../../src/mappers/OrganizationMembershipMapper.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAE/E;;GAEG;AACH,MAAM,WAAW,2BAA2B;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,6BAA6B,EAAE,+BAY3C,CAAC;AAEF;;GAEG;AACH,qBAAa,4BAA4B;IACrC;;OAEG;IACH,MAAM,CAAC,QAAQ,CACX,GAAG,EAAE,2BAA2B,EAChC,SAAS,GAAE,+BAA+D,GAC3E,sBAAsB;IAsBzB;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,aAAa,EACnC,GAAG,EAAE,2BAA2B,EAChC,SAAS,GAAE,+BAA+D,EAC1E,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,2BAA2B,KAAK,aAAa,GACzE,sBAAsB,GAAG,aAAa;IAWzC;;OAEG;IACH,MAAM,CAAC,IAAI,CACP,UAAU,EAAE,sBAAsB,EAClC,SAAS,GAAE,+BAA+D,GAC3E,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAe7B"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Organization Membership Mapper for Supabase
3
+ */
4
+ /**
5
+ * Default column mapping (snake_case)
6
+ */
7
+ export const DEFAULT_MEMBERSHIP_COLUMN_MAP = {
8
+ id: 'id',
9
+ userId: 'user_id',
10
+ username: 'username',
11
+ organizationId: 'organization_id',
12
+ roleCode: 'role_code',
13
+ invitedAt: 'invited_at',
14
+ joinedAt: 'joined_at',
15
+ leftAt: 'left_at',
16
+ deletedAt: 'deleted_at',
17
+ createdAt: 'created_at',
18
+ updatedAt: 'updated_at'
19
+ };
20
+ /**
21
+ * Organization Membership mapper utilities
22
+ */
23
+ export class OrganizationMembershipMapper {
24
+ /**
25
+ * Map database row to domain OrganizationMembership entity
26
+ */
27
+ static toDomain(row, columnMap = DEFAULT_MEMBERSHIP_COLUMN_MAP) {
28
+ return {
29
+ id: row[columnMap.id],
30
+ userId: row[columnMap.userId],
31
+ username: row[columnMap.username],
32
+ organizationId: row[columnMap.organizationId],
33
+ roleCode: row[columnMap.roleCode],
34
+ invitedAt: row[columnMap.invitedAt]
35
+ ? new Date(row[columnMap.invitedAt])
36
+ : undefined,
37
+ joinedAt: row[columnMap.joinedAt]
38
+ ? new Date(row[columnMap.joinedAt])
39
+ : undefined,
40
+ leftAt: row[columnMap.leftAt] ? new Date(row[columnMap.leftAt]) : undefined,
41
+ deletedAt: row[columnMap.deletedAt]
42
+ ? new Date(row[columnMap.deletedAt])
43
+ : undefined,
44
+ createdAt: new Date(row[columnMap.createdAt]),
45
+ updatedAt: new Date(row[columnMap.updatedAt])
46
+ };
47
+ }
48
+ /**
49
+ * Map database row to domain entity with custom fields
50
+ */
51
+ static toDomainWithCustom(row, columnMap = DEFAULT_MEMBERSHIP_COLUMN_MAP, customFieldsMapper) {
52
+ const baseMembership = OrganizationMembershipMapper.toDomain(row, columnMap);
53
+ if (customFieldsMapper) {
54
+ const customFields = customFieldsMapper(row);
55
+ return { ...baseMembership, ...customFields };
56
+ }
57
+ return baseMembership;
58
+ }
59
+ /**
60
+ * Map domain entity to database row
61
+ */
62
+ static toDb(membership, columnMap = DEFAULT_MEMBERSHIP_COLUMN_MAP) {
63
+ return {
64
+ [columnMap.id]: membership.id,
65
+ [columnMap.userId]: membership.userId,
66
+ [columnMap.username]: membership.username,
67
+ [columnMap.organizationId]: membership.organizationId,
68
+ [columnMap.roleCode]: membership.roleCode,
69
+ [columnMap.invitedAt]: membership.invitedAt?.toISOString() ?? null,
70
+ [columnMap.joinedAt]: membership.joinedAt?.toISOString() ?? null,
71
+ [columnMap.leftAt]: membership.leftAt?.toISOString() ?? null,
72
+ [columnMap.deletedAt]: membership.deletedAt?.toISOString() ?? null,
73
+ [columnMap.createdAt]: membership.createdAt.toISOString(),
74
+ [columnMap.updatedAt]: membership.updatedAt.toISOString()
75
+ };
76
+ }
77
+ }
78
+ //# sourceMappingURL=OrganizationMembershipMapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationMembershipMapper.js","sourceRoot":"","sources":["../../src/mappers/OrganizationMembershipMapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * User Mapper for Supabase
3
+ *
4
+ * Maps between database rows and domain User entities.
5
+ * Handles column name mapping and custom fields transformation.
6
+ */
7
+ import type { User } from '@multitenantkit/domain-contracts';
8
+ /**
9
+ * Database row type for users
10
+ */
11
+ export interface UserDbRow {
12
+ id: string;
13
+ external_id?: string;
14
+ email?: string;
15
+ username?: string;
16
+ created_at: string;
17
+ updated_at: string;
18
+ deleted_at?: string | null;
19
+ [key: string]: unknown;
20
+ }
21
+ /**
22
+ * Column mapping configuration
23
+ */
24
+ export interface ColumnMap {
25
+ id: string;
26
+ externalId: string;
27
+ username: string;
28
+ createdAt: string;
29
+ updatedAt: string;
30
+ deletedAt: string;
31
+ }
32
+ /**
33
+ * Default column mapping (snake_case)
34
+ */
35
+ export declare const DEFAULT_COLUMN_MAP: ColumnMap;
36
+ /**
37
+ * User mapper utilities
38
+ */
39
+ export declare class UserMapper {
40
+ /**
41
+ * Map database row to domain User entity
42
+ */
43
+ static toDomain(row: UserDbRow, columnMap?: ColumnMap): User;
44
+ /**
45
+ * Map database row to domain User entity with custom fields
46
+ */
47
+ static toDomainWithCustom<TCustomFields>(row: UserDbRow, columnMap?: ColumnMap, customFieldsMapper?: (row: UserDbRow) => TCustomFields): User & TCustomFields;
48
+ /**
49
+ * Map domain User entity to database row
50
+ */
51
+ static toDb(user: User, columnMap?: ColumnMap): Record<string, unknown>;
52
+ }
53
+ //# sourceMappingURL=UserMapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserMapper.d.ts","sourceRoot":"","sources":["../../src/mappers/UserMapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kCAAkC,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAOhC,CAAC;AAEF;;GAEG;AACH,qBAAa,UAAU;IACnB;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,SAA8B,GAAG,IAAI;IAahF;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,aAAa,EACnC,GAAG,EAAE,SAAS,EACd,SAAS,GAAE,SAA8B,EACzC,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,aAAa,GACvD,IAAI,GAAG,aAAa;IAWvB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,GAAE,SAA8B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAU9F"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * User Mapper for Supabase
3
+ *
4
+ * Maps between database rows and domain User entities.
5
+ * Handles column name mapping and custom fields transformation.
6
+ */
7
+ /**
8
+ * Default column mapping (snake_case)
9
+ */
10
+ export const DEFAULT_COLUMN_MAP = {
11
+ id: 'id',
12
+ externalId: 'external_id',
13
+ username: 'username',
14
+ createdAt: 'created_at',
15
+ updatedAt: 'updated_at',
16
+ deletedAt: 'deleted_at'
17
+ };
18
+ /**
19
+ * User mapper utilities
20
+ */
21
+ export class UserMapper {
22
+ /**
23
+ * Map database row to domain User entity
24
+ */
25
+ static toDomain(row, columnMap = DEFAULT_COLUMN_MAP) {
26
+ return {
27
+ id: row[columnMap.id],
28
+ externalId: row[columnMap.externalId],
29
+ username: row[columnMap.username],
30
+ createdAt: new Date(row[columnMap.createdAt]),
31
+ updatedAt: new Date(row[columnMap.updatedAt]),
32
+ deletedAt: row[columnMap.deletedAt]
33
+ ? new Date(row[columnMap.deletedAt])
34
+ : undefined
35
+ };
36
+ }
37
+ /**
38
+ * Map database row to domain User entity with custom fields
39
+ */
40
+ static toDomainWithCustom(row, columnMap = DEFAULT_COLUMN_MAP, customFieldsMapper) {
41
+ const baseUser = this.toDomain(row, columnMap);
42
+ if (customFieldsMapper) {
43
+ const customFields = customFieldsMapper(row);
44
+ return { ...baseUser, ...customFields };
45
+ }
46
+ return baseUser;
47
+ }
48
+ /**
49
+ * Map domain User entity to database row
50
+ */
51
+ static toDb(user, columnMap = DEFAULT_COLUMN_MAP) {
52
+ return {
53
+ [columnMap.id]: user.id,
54
+ [columnMap.externalId]: user.externalId,
55
+ [columnMap.username]: user.username,
56
+ [columnMap.createdAt]: user.createdAt.toISOString(),
57
+ [columnMap.updatedAt]: user.updatedAt.toISOString(),
58
+ [columnMap.deletedAt]: user.deletedAt?.toISOString() ?? null
59
+ };
60
+ }
61
+ }
62
+ //# sourceMappingURL=UserMapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserMapper.js","sourceRoot":"","sources":["../../src/mappers/UserMapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8BH;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAc;IACzC,EAAE,EAAE,IAAI;IACR,UAAU,EAAE,aAAa;IACzB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,UAAU;IACnB;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,GAAc,EAAE,YAAuB,kBAAkB;QACrE,OAAO;YACH,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAW;YAC/B,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,UAAU,CAAW;YAC/C,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAW;YAC3C,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAW,CAAC;YACvD,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAW,CAAC;YACvD,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC;gBAC/B,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAW,CAAC;gBAC9C,CAAC,CAAC,SAAS;SAClB,CAAC;IACN,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,kBAAkB,CACrB,GAAc,EACd,YAAuB,kBAAkB,EACzC,kBAAsD;QAEtD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAE/C,IAAI,kBAAkB,EAAE,CAAC;YACrB,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;YAC7C,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,YAAY,EAA0B,CAAC;QACpE,CAAC;QAED,OAAO,QAAgC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,IAAU,EAAE,YAAuB,kBAAkB;QAC7D,OAAO;YACH,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;YACvB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU;YACvC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ;YACnC,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;YACnD,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;YACnD,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,IAAI;SAC/D,CAAC;IACN,CAAC;CACJ"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Supabase Organization Membership Repository
3
+ */
4
+ import type { FindMembersOptions, OrganizationMembership, OrganizationMembershipRepository, OrganizationMemberWithUserInfo, PaginatedResult, ToolkitOptions } from '@multitenantkit/domain-contracts';
5
+ import type { OperationContext } from '@multitenantkit/domain-contracts/shared';
6
+ import type { SupabaseClient } from '@supabase/supabase-js';
7
+ /**
8
+ * Supabase implementation of OrganizationMembershipRepository
9
+ */
10
+ export declare class SupabaseOrganizationMembershipRepository<TUserCustomFields = {}, TOrganizationCustomFields = {}, TOrganizationMembershipCustomFields = {}> implements OrganizationMembershipRepository<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields> {
11
+ private readonly client;
12
+ private readonly configHelper;
13
+ private readonly schemaName?;
14
+ private readonly tableName;
15
+ private readonly usersTableName;
16
+ private readonly usersSchemaName?;
17
+ constructor(client: SupabaseClient, toolkitOptions?: ToolkitOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>);
18
+ private getTable;
19
+ private getSelectColumns;
20
+ private mapToDomain;
21
+ findById(id: string): Promise<(OrganizationMembership & TOrganizationMembershipCustomFields) | null>;
22
+ findByUserIdAndOrganizationId(userId: string, organizationId: string): Promise<(OrganizationMembership & TOrganizationMembershipCustomFields) | null>;
23
+ findByUsernameAndOrganizationId(username: string, organizationId: string): Promise<(OrganizationMembership & TOrganizationMembershipCustomFields) | null>;
24
+ findByOrganization(organizationId: string, activeOnly?: boolean): Promise<(OrganizationMembership & TOrganizationMembershipCustomFields)[]>;
25
+ findByOrganizationWithUserInfo(organizationId: string, activeOnly?: boolean): Promise<OrganizationMemberWithUserInfo<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>[]>;
26
+ findByOrganizationWithUserInfoPaginated(organizationId: string, options?: FindMembersOptions): Promise<PaginatedResult<OrganizationMemberWithUserInfo<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>>>;
27
+ findByUser(userId: string): Promise<(OrganizationMembership & TOrganizationMembershipCustomFields)[]>;
28
+ findAll(): Promise<(OrganizationMembership & TOrganizationMembershipCustomFields)[]>;
29
+ insert(membership: OrganizationMembership & TOrganizationMembershipCustomFields, _context?: OperationContext): Promise<void>;
30
+ update(membership: OrganizationMembership & TOrganizationMembershipCustomFields, _context?: OperationContext): Promise<void>;
31
+ delete(id: string, _context?: OperationContext): Promise<void>;
32
+ }
33
+ //# sourceMappingURL=SupabaseOrganizationMembershipRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SupabaseOrganizationMembershipRepository.d.ts","sourceRoot":"","sources":["../../src/repositories/SupabaseOrganizationMembershipRepository.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACR,kBAAkB,EAClB,sBAAsB,EACtB,gCAAgC,EAChC,8BAA8B,EAC9B,eAAe,EACf,cAAc,EACjB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM5D;;GAEG;AAEH,qBAAa,wCAAwC,CACjD,iBAAiB,GAAG,EAAE,EAEtB,yBAAyB,GAAG,EAAE,EAE9B,mCAAmC,GAAG,EAAE,CAC1C,YACM,gCAAgC,CAC5B,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC;IASD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAP3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoF;IACjH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAS;gBAGrB,MAAM,EAAE,cAAc,EACvC,cAAc,CAAC,EAAE,cAAc,CAC3B,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC;IAqBL,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,WAAW;IAYb,QAAQ,CACV,EAAE,EAAE,MAAM,GACX,OAAO,CAAC,CAAC,sBAAsB,GAAG,mCAAmC,CAAC,GAAG,IAAI,CAAC;IAc3E,6BAA6B,CAC/B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,GACvB,OAAO,CAAC,CAAC,sBAAsB,GAAG,mCAAmC,CAAC,GAAG,IAAI,CAAC;IAe3E,+BAA+B,CACjC,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GACvB,OAAO,CAAC,CAAC,sBAAsB,GAAG,mCAAmC,CAAC,GAAG,IAAI,CAAC;IAe3E,kBAAkB,CACpB,cAAc,EAAE,MAAM,EACtB,UAAU,UAAQ,GACnB,OAAO,CAAC,CAAC,sBAAsB,GAAG,mCAAmC,CAAC,EAAE,CAAC;IAuBtE,8BAA8B,CAChC,cAAc,EAAE,MAAM,EACtB,UAAU,UAAQ,GACnB,OAAO,CACN,8BAA8B,CAC1B,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,EAAE,CACN;IAmBK,uCAAuC,CACzC,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC7B,OAAO,CACN,eAAe,CACX,8BAA8B,CAC1B,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,CACJ,CACJ;IA+DK,UAAU,CACZ,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,CAAC,sBAAsB,GAAG,mCAAmC,CAAC,EAAE,CAAC;IActE,OAAO,IAAI,OAAO,CAAC,CAAC,sBAAsB,GAAG,mCAAmC,CAAC,EAAE,CAAC;IAYpF,MAAM,CACR,UAAU,EAAE,sBAAsB,GAAG,mCAAmC,EACxE,QAAQ,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,IAAI,CAAC;IA4BV,MAAM,CACR,UAAU,EAAE,sBAAsB,GAAG,mCAAmC,EACxE,QAAQ,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,IAAI,CAAC;IAgCV,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CASvE"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Supabase Organization Membership Repository
3
+ */
4
+ import { OrganizationMembershipRepositoryConfigHelper } from '@multitenantkit/domain-contracts';
5
+ import { OrganizationMembershipMapper } from '../mappers/OrganizationMembershipMapper';
6
+ /**
7
+ * Supabase implementation of OrganizationMembershipRepository
8
+ */
9
+ // biome-ignore lint/complexity/noBannedTypes: Empty object {} is the correct default
10
+ export class SupabaseOrganizationMembershipRepository {
11
+ client;
12
+ configHelper;
13
+ schemaName;
14
+ tableName;
15
+ usersTableName;
16
+ usersSchemaName;
17
+ constructor(client, toolkitOptions) {
18
+ this.client = client;
19
+ const membershipConfig = toolkitOptions?.organizationMemberships?.customFields;
20
+ this.schemaName = toolkitOptions?.organizationMemberships?.database?.schema;
21
+ this.tableName =
22
+ toolkitOptions?.organizationMemberships?.database?.table || 'organization_memberships';
23
+ this.usersSchemaName = toolkitOptions?.users?.database?.schema;
24
+ this.usersTableName = toolkitOptions?.users?.database?.table || 'users';
25
+ const databaseNamingStrategy = toolkitOptions?.organizationMemberships?.database?.namingStrategy;
26
+ const globalNamingStrategy = toolkitOptions?.namingStrategy;
27
+ this.configHelper = new OrganizationMembershipRepositoryConfigHelper(membershipConfig, databaseNamingStrategy, globalNamingStrategy);
28
+ }
29
+ getTable() {
30
+ if (this.schemaName) {
31
+ return this.client.schema(this.schemaName).from(this.tableName);
32
+ }
33
+ return this.client.from(this.tableName);
34
+ }
35
+ getSelectColumns() {
36
+ if (this.configHelper.hasCustomFields) {
37
+ return '*';
38
+ }
39
+ return [
40
+ this.configHelper.getColumnName('id'),
41
+ this.configHelper.getColumnName('userId'),
42
+ this.configHelper.getColumnName('username'),
43
+ this.configHelper.getColumnName('organizationId'),
44
+ this.configHelper.getColumnName('roleCode'),
45
+ this.configHelper.getColumnName('invitedAt'),
46
+ this.configHelper.getColumnName('joinedAt'),
47
+ this.configHelper.getColumnName('leftAt'),
48
+ this.configHelper.getColumnName('deletedAt'),
49
+ this.configHelper.getColumnName('createdAt'),
50
+ this.configHelper.getColumnName('updatedAt')
51
+ ].join(', ');
52
+ }
53
+ mapToDomain(row) {
54
+ return OrganizationMembershipMapper.toDomainWithCustom(row, this.configHelper.columnMap, this.configHelper.hasCustomFields
55
+ ? (dbRow) => this.configHelper.customFieldsToDomain(dbRow)
56
+ : undefined);
57
+ }
58
+ async findById(id) {
59
+ const { data, error } = await this.getTable()
60
+ .select(this.getSelectColumns())
61
+ .eq(this.configHelper.getColumnName('id'), id)
62
+ .limit(1)
63
+ .single();
64
+ if (error || !data) {
65
+ return null;
66
+ }
67
+ return this.mapToDomain(data);
68
+ }
69
+ async findByUserIdAndOrganizationId(userId, organizationId) {
70
+ const { data, error } = await this.getTable()
71
+ .select(this.getSelectColumns())
72
+ .eq(this.configHelper.getColumnName('userId'), userId)
73
+ .eq(this.configHelper.getColumnName('organizationId'), organizationId)
74
+ .limit(1)
75
+ .single();
76
+ if (error || !data) {
77
+ return null;
78
+ }
79
+ return this.mapToDomain(data);
80
+ }
81
+ async findByUsernameAndOrganizationId(username, organizationId) {
82
+ const { data, error } = await this.getTable()
83
+ .select(this.getSelectColumns())
84
+ .ilike(this.configHelper.getColumnName('username'), username)
85
+ .eq(this.configHelper.getColumnName('organizationId'), organizationId)
86
+ .limit(1)
87
+ .single();
88
+ if (error || !data) {
89
+ return null;
90
+ }
91
+ return this.mapToDomain(data);
92
+ }
93
+ async findByOrganization(organizationId, activeOnly = false) {
94
+ let query = this.getTable()
95
+ .select(this.getSelectColumns())
96
+ .eq(this.configHelper.getColumnName('organizationId'), organizationId);
97
+ if (activeOnly) {
98
+ query = query
99
+ .not(this.configHelper.getColumnName('joinedAt'), 'is', null)
100
+ .is(this.configHelper.getColumnName('leftAt'), null)
101
+ .is(this.configHelper.getColumnName('deletedAt'), null);
102
+ }
103
+ const { data, error } = await query;
104
+ if (error || !data) {
105
+ return [];
106
+ }
107
+ return data.map((row) => this.mapToDomain(row));
108
+ }
109
+ async findByOrganizationWithUserInfo(organizationId, activeOnly = false) {
110
+ // For now, return memberships without full user/org info
111
+ // A more complete implementation would join with users and organizations tables
112
+ const memberships = await this.findByOrganization(organizationId, activeOnly);
113
+ // Return memberships with spread operator to match OrganizationMemberWithUserInfo type
114
+ // Note: user and organization would need joins for full implementation
115
+ return memberships.map((m) => ({
116
+ ...m,
117
+ membership: m,
118
+ user: null,
119
+ organization: null
120
+ }));
121
+ }
122
+ async findByOrganizationWithUserInfoPaginated(organizationId, options) {
123
+ let query = this.getTable()
124
+ .select(this.getSelectColumns(), { count: 'exact' })
125
+ .eq(this.configHelper.getColumnName('organizationId'), organizationId);
126
+ // Build filter conditions based on options
127
+ if (options?.includeActive) {
128
+ query = query
129
+ .not(this.configHelper.getColumnName('joinedAt'), 'is', null)
130
+ .is(this.configHelper.getColumnName('leftAt'), null)
131
+ .is(this.configHelper.getColumnName('deletedAt'), null);
132
+ }
133
+ else if (options?.includePending) {
134
+ query = query
135
+ .not(this.configHelper.getColumnName('invitedAt'), 'is', null)
136
+ .is(this.configHelper.getColumnName('joinedAt'), null)
137
+ .is(this.configHelper.getColumnName('leftAt'), null)
138
+ .is(this.configHelper.getColumnName('deletedAt'), null);
139
+ }
140
+ else {
141
+ // Default to active only
142
+ query = query
143
+ .not(this.configHelper.getColumnName('joinedAt'), 'is', null)
144
+ .is(this.configHelper.getColumnName('leftAt'), null)
145
+ .is(this.configHelper.getColumnName('deletedAt'), null);
146
+ }
147
+ // Apply pagination using page and pageSize
148
+ const page = options?.page ?? 1;
149
+ const pageSize = options?.pageSize ?? 10;
150
+ const offset = (page - 1) * pageSize;
151
+ query = query.range(offset, offset + pageSize - 1);
152
+ const { data, error, count } = await query;
153
+ if (error || !data) {
154
+ const total = 0;
155
+ return { items: [], total, page, pageSize, totalPages: 0 };
156
+ }
157
+ const memberships = data.map((row) => this.mapToDomain(row));
158
+ const total = count ?? 0;
159
+ const totalPages = Math.ceil(total / pageSize);
160
+ return {
161
+ items: memberships.map((m) => ({
162
+ ...m,
163
+ membership: m,
164
+ user: null,
165
+ organization: null
166
+ })),
167
+ total,
168
+ page,
169
+ pageSize,
170
+ totalPages
171
+ };
172
+ }
173
+ async findByUser(userId) {
174
+ const { data, error } = await this.getTable()
175
+ .select(this.getSelectColumns())
176
+ .eq(this.configHelper.getColumnName('userId'), userId);
177
+ if (error || !data) {
178
+ return [];
179
+ }
180
+ return data.map((row) => this.mapToDomain(row));
181
+ }
182
+ async findAll() {
183
+ const { data, error } = await this.getTable().select(this.getSelectColumns());
184
+ if (error || !data) {
185
+ return [];
186
+ }
187
+ return data.map((row) => this.mapToDomain(row));
188
+ }
189
+ async insert(membership, _context) {
190
+ const columns = {
191
+ [this.configHelper.getColumnName('id')]: membership.id,
192
+ [this.configHelper.getColumnName('userId')]: membership.userId,
193
+ [this.configHelper.getColumnName('username')]: membership.username,
194
+ [this.configHelper.getColumnName('organizationId')]: membership.organizationId,
195
+ [this.configHelper.getColumnName('roleCode')]: membership.roleCode,
196
+ [this.configHelper.getColumnName('invitedAt')]: membership.invitedAt?.toISOString() ?? null,
197
+ [this.configHelper.getColumnName('joinedAt')]: membership.joinedAt?.toISOString() ?? null,
198
+ [this.configHelper.getColumnName('leftAt')]: membership.leftAt?.toISOString() ?? null,
199
+ [this.configHelper.getColumnName('deletedAt')]: membership.deletedAt?.toISOString() ?? null,
200
+ [this.configHelper.getColumnName('createdAt')]: membership.createdAt.toISOString(),
201
+ [this.configHelper.getColumnName('updatedAt')]: membership.updatedAt.toISOString()
202
+ };
203
+ const customFields = this.configHelper.customFieldsToDb(membership);
204
+ Object.assign(columns, customFields);
205
+ const { error } = await this.getTable().insert(columns);
206
+ if (error) {
207
+ throw new Error(`Failed to insert membership: ${error.message}`);
208
+ }
209
+ }
210
+ async update(membership, _context) {
211
+ const columns = {
212
+ [this.configHelper.getColumnName('roleCode')]: membership.roleCode,
213
+ [this.configHelper.getColumnName('invitedAt')]: membership.invitedAt?.toISOString() ?? null,
214
+ [this.configHelper.getColumnName('joinedAt')]: membership.joinedAt?.toISOString() ?? null,
215
+ [this.configHelper.getColumnName('leftAt')]: membership.leftAt?.toISOString() ?? null,
216
+ [this.configHelper.getColumnName('deletedAt')]: membership.deletedAt?.toISOString() ?? null,
217
+ [this.configHelper.getColumnName('updatedAt')]: membership.updatedAt.toISOString()
218
+ };
219
+ const rawCustom = this.configHelper.customFieldsToDb(membership);
220
+ const cleanCustom = Object.fromEntries(Object.entries(rawCustom || {}).filter(([, v]) => v !== undefined));
221
+ Object.assign(columns, cleanCustom);
222
+ const updateData = Object.fromEntries(Object.entries(columns).filter(([, v]) => v !== undefined));
223
+ const { error } = await this.getTable()
224
+ .update(updateData)
225
+ .eq(this.configHelper.getColumnName('id'), membership.id);
226
+ if (error) {
227
+ throw new Error(`Failed to update membership: ${error.message}`);
228
+ }
229
+ }
230
+ async delete(id, _context) {
231
+ const { error } = await this.getTable()
232
+ .delete()
233
+ .eq(this.configHelper.getColumnName('id'), id);
234
+ if (error) {
235
+ throw new Error(`Failed to delete membership: ${error.message}`);
236
+ }
237
+ }
238
+ }
239
+ //# sourceMappingURL=SupabaseOrganizationMembershipRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SupabaseOrganizationMembershipRepository.js","sourceRoot":"","sources":["../../src/repositories/SupabaseOrganizationMembershipRepository.ts"],"names":[],"mappings":"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"}