@sudobility/entity_service 1.0.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 (72) hide show
  1. package/CLAUDE.md +124 -0
  2. package/dist/helpers/EntityHelper.cjs +234 -0
  3. package/dist/helpers/EntityHelper.d.ts +60 -0
  4. package/dist/helpers/EntityHelper.d.ts.map +1 -0
  5. package/dist/helpers/EntityHelper.js +234 -0
  6. package/dist/helpers/EntityHelper.js.map +1 -0
  7. package/dist/helpers/EntityMemberHelper.cjs +215 -0
  8. package/dist/helpers/EntityMemberHelper.d.ts +45 -0
  9. package/dist/helpers/EntityMemberHelper.d.ts.map +1 -0
  10. package/dist/helpers/EntityMemberHelper.js +215 -0
  11. package/dist/helpers/EntityMemberHelper.js.map +1 -0
  12. package/dist/helpers/InvitationHelper.cjs +251 -0
  13. package/dist/helpers/InvitationHelper.d.ts +59 -0
  14. package/dist/helpers/InvitationHelper.d.ts.map +1 -0
  15. package/dist/helpers/InvitationHelper.js +251 -0
  16. package/dist/helpers/InvitationHelper.js.map +1 -0
  17. package/dist/helpers/PermissionHelper.cjs +197 -0
  18. package/dist/helpers/PermissionHelper.d.ts +86 -0
  19. package/dist/helpers/PermissionHelper.d.ts.map +1 -0
  20. package/dist/helpers/PermissionHelper.js +197 -0
  21. package/dist/helpers/PermissionHelper.js.map +1 -0
  22. package/dist/helpers/index.cjs +15 -0
  23. package/dist/helpers/index.d.ts +8 -0
  24. package/dist/helpers/index.d.ts.map +1 -0
  25. package/dist/helpers/index.js +15 -0
  26. package/dist/helpers/index.js.map +1 -0
  27. package/dist/index.cjs +76 -0
  28. package/dist/index.d.ts +36 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +76 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/middleware/hono.cjs +148 -0
  33. package/dist/middleware/hono.d.ts +102 -0
  34. package/dist/middleware/hono.d.ts.map +1 -0
  35. package/dist/middleware/hono.js +148 -0
  36. package/dist/middleware/hono.js.map +1 -0
  37. package/dist/middleware/index.cjs +12 -0
  38. package/dist/middleware/index.d.ts +5 -0
  39. package/dist/middleware/index.d.ts.map +1 -0
  40. package/dist/middleware/index.js +12 -0
  41. package/dist/middleware/index.js.map +1 -0
  42. package/dist/migrations/001_add_entities.cjs +269 -0
  43. package/dist/migrations/001_add_entities.d.ts +29 -0
  44. package/dist/migrations/001_add_entities.d.ts.map +1 -0
  45. package/dist/migrations/001_add_entities.js +269 -0
  46. package/dist/migrations/001_add_entities.js.map +1 -0
  47. package/dist/migrations/index.cjs +10 -0
  48. package/dist/migrations/index.d.ts +5 -0
  49. package/dist/migrations/index.d.ts.map +1 -0
  50. package/dist/migrations/index.js +10 -0
  51. package/dist/migrations/index.js.map +1 -0
  52. package/dist/schema/entities.cjs +304 -0
  53. package/dist/schema/entities.d.ts +1047 -0
  54. package/dist/schema/entities.d.ts.map +1 -0
  55. package/dist/schema/entities.js +304 -0
  56. package/dist/schema/entities.js.map +1 -0
  57. package/dist/types/index.cjs +14 -0
  58. package/dist/types/index.d.ts +71 -0
  59. package/dist/types/index.d.ts.map +1 -0
  60. package/dist/types/index.js +14 -0
  61. package/dist/types/index.js.map +1 -0
  62. package/dist/utils/index.cjs +21 -0
  63. package/dist/utils/index.d.ts +5 -0
  64. package/dist/utils/index.d.ts.map +1 -0
  65. package/dist/utils/index.js +21 -0
  66. package/dist/utils/index.js.map +1 -0
  67. package/dist/utils/slug-generator.cjs +92 -0
  68. package/dist/utils/slug-generator.d.ts +41 -0
  69. package/dist/utils/slug-generator.d.ts.map +1 -0
  70. package/dist/utils/slug-generator.js +92 -0
  71. package/dist/utils/slug-generator.js.map +1 -0
  72. package/package.json +78 -0
@@ -0,0 +1,304 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Drizzle Schema for Entity/Organization Tables
4
+ * @description Database schema definitions for entities, members, and invitations
5
+ *
6
+ * Provides:
7
+ * - Factory functions for custom PostgreSQL schemas
8
+ * - Default tables for public schema
9
+ * - Initialization functions for table creation
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.entityInvitations = exports.entityMembers = exports.entities = void 0;
13
+ exports.createEntitiesTable = createEntitiesTable;
14
+ exports.createEntitiesTablePublic = createEntitiesTablePublic;
15
+ exports.createEntityMembersTable = createEntityMembersTable;
16
+ exports.createEntityMembersTablePublic = createEntityMembersTablePublic;
17
+ exports.createEntityInvitationsTable = createEntityInvitationsTable;
18
+ exports.createEntityInvitationsTablePublic = createEntityInvitationsTablePublic;
19
+ exports.initEntityTables = initEntityTables;
20
+ const pg_core_1 = require("drizzle-orm/pg-core");
21
+ // ========================================
22
+ // ENTITIES TABLE
23
+ // ========================================
24
+ /**
25
+ * Create an entities table for a specific PostgreSQL schema.
26
+ *
27
+ * @param schema - The Drizzle pgSchema object
28
+ * @param indexPrefix - Prefix for index names to avoid conflicts
29
+ * @returns Drizzle table definition
30
+ */
31
+ function createEntitiesTable(schema, indexPrefix) {
32
+ return schema.table('entities', {
33
+ id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
34
+ entity_slug: (0, pg_core_1.varchar)('entity_slug', { length: 12 }).notNull().unique(),
35
+ entity_type: (0, pg_core_1.varchar)('entity_type', { length: 20 }).notNull(),
36
+ display_name: (0, pg_core_1.varchar)('display_name', { length: 255 }).notNull(),
37
+ description: (0, pg_core_1.text)('description'),
38
+ avatar_url: (0, pg_core_1.text)('avatar_url'),
39
+ owner_user_id: (0, pg_core_1.uuid)('owner_user_id').notNull(),
40
+ created_at: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow(),
41
+ updated_at: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow(),
42
+ }, (table) => ({
43
+ slugIdx: (0, pg_core_1.uniqueIndex)(`${indexPrefix}_entities_slug_idx`).on(table.entity_slug),
44
+ ownerIdx: (0, pg_core_1.index)(`${indexPrefix}_entities_owner_idx`).on(table.owner_user_id),
45
+ typeIdx: (0, pg_core_1.index)(`${indexPrefix}_entities_type_idx`).on(table.entity_type),
46
+ }));
47
+ }
48
+ /**
49
+ * Create an entities table for the public schema.
50
+ */
51
+ function createEntitiesTablePublic(indexPrefix) {
52
+ return (0, pg_core_1.pgTable)('entities', {
53
+ id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
54
+ entity_slug: (0, pg_core_1.varchar)('entity_slug', { length: 12 }).notNull().unique(),
55
+ entity_type: (0, pg_core_1.varchar)('entity_type', { length: 20 }).notNull(),
56
+ display_name: (0, pg_core_1.varchar)('display_name', { length: 255 }).notNull(),
57
+ description: (0, pg_core_1.text)('description'),
58
+ avatar_url: (0, pg_core_1.text)('avatar_url'),
59
+ owner_user_id: (0, pg_core_1.uuid)('owner_user_id').notNull(),
60
+ created_at: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow(),
61
+ updated_at: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow(),
62
+ }, (table) => ({
63
+ slugIdx: (0, pg_core_1.uniqueIndex)(`${indexPrefix}_entities_slug_idx`).on(table.entity_slug),
64
+ ownerIdx: (0, pg_core_1.index)(`${indexPrefix}_entities_owner_idx`).on(table.owner_user_id),
65
+ typeIdx: (0, pg_core_1.index)(`${indexPrefix}_entities_type_idx`).on(table.entity_type),
66
+ }));
67
+ }
68
+ // ========================================
69
+ // ENTITY MEMBERS TABLE
70
+ // ========================================
71
+ /**
72
+ * Create an entity_members table for a specific PostgreSQL schema.
73
+ */
74
+ function createEntityMembersTable(schema, indexPrefix) {
75
+ return schema.table('entity_members', {
76
+ id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
77
+ entity_id: (0, pg_core_1.uuid)('entity_id').notNull(),
78
+ user_id: (0, pg_core_1.uuid)('user_id').notNull(),
79
+ role: (0, pg_core_1.varchar)('role', { length: 20 }).notNull(),
80
+ joined_at: (0, pg_core_1.timestamp)('joined_at', { withTimezone: true }).defaultNow(),
81
+ created_at: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow(),
82
+ updated_at: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow(),
83
+ }, (table) => ({
84
+ entityUserUniqueIdx: (0, pg_core_1.uniqueIndex)(`${indexPrefix}_entity_members_entity_user_idx`).on(table.entity_id, table.user_id),
85
+ entityIdx: (0, pg_core_1.index)(`${indexPrefix}_entity_members_entity_idx`).on(table.entity_id),
86
+ userIdx: (0, pg_core_1.index)(`${indexPrefix}_entity_members_user_idx`).on(table.user_id),
87
+ }));
88
+ }
89
+ /**
90
+ * Create an entity_members table for the public schema.
91
+ */
92
+ function createEntityMembersTablePublic(indexPrefix) {
93
+ return (0, pg_core_1.pgTable)('entity_members', {
94
+ id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
95
+ entity_id: (0, pg_core_1.uuid)('entity_id').notNull(),
96
+ user_id: (0, pg_core_1.uuid)('user_id').notNull(),
97
+ role: (0, pg_core_1.varchar)('role', { length: 20 }).notNull(),
98
+ joined_at: (0, pg_core_1.timestamp)('joined_at', { withTimezone: true }).defaultNow(),
99
+ created_at: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow(),
100
+ updated_at: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow(),
101
+ }, (table) => ({
102
+ entityUserUniqueIdx: (0, pg_core_1.uniqueIndex)(`${indexPrefix}_entity_members_entity_user_idx`).on(table.entity_id, table.user_id),
103
+ entityIdx: (0, pg_core_1.index)(`${indexPrefix}_entity_members_entity_idx`).on(table.entity_id),
104
+ userIdx: (0, pg_core_1.index)(`${indexPrefix}_entity_members_user_idx`).on(table.user_id),
105
+ }));
106
+ }
107
+ // ========================================
108
+ // ENTITY INVITATIONS TABLE
109
+ // ========================================
110
+ /**
111
+ * Create an entity_invitations table for a specific PostgreSQL schema.
112
+ */
113
+ function createEntityInvitationsTable(schema, indexPrefix) {
114
+ return schema.table('entity_invitations', {
115
+ id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
116
+ entity_id: (0, pg_core_1.uuid)('entity_id').notNull(),
117
+ email: (0, pg_core_1.varchar)('email', { length: 255 }).notNull(),
118
+ role: (0, pg_core_1.varchar)('role', { length: 20 }).notNull(),
119
+ status: (0, pg_core_1.varchar)('status', { length: 20 }).notNull().default('pending'),
120
+ invited_by_user_id: (0, pg_core_1.uuid)('invited_by_user_id').notNull(),
121
+ token: (0, pg_core_1.varchar)('token', { length: 64 }).notNull().unique(),
122
+ expires_at: (0, pg_core_1.timestamp)('expires_at', { withTimezone: true }).notNull(),
123
+ accepted_at: (0, pg_core_1.timestamp)('accepted_at', { withTimezone: true }),
124
+ created_at: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow(),
125
+ updated_at: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow(),
126
+ }, (table) => ({
127
+ tokenIdx: (0, pg_core_1.uniqueIndex)(`${indexPrefix}_entity_invitations_token_idx`).on(table.token),
128
+ entityIdx: (0, pg_core_1.index)(`${indexPrefix}_entity_invitations_entity_idx`).on(table.entity_id),
129
+ emailIdx: (0, pg_core_1.index)(`${indexPrefix}_entity_invitations_email_idx`).on(table.email),
130
+ statusIdx: (0, pg_core_1.index)(`${indexPrefix}_entity_invitations_status_idx`).on(table.status),
131
+ }));
132
+ }
133
+ /**
134
+ * Create an entity_invitations table for the public schema.
135
+ */
136
+ function createEntityInvitationsTablePublic(indexPrefix) {
137
+ return (0, pg_core_1.pgTable)('entity_invitations', {
138
+ id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
139
+ entity_id: (0, pg_core_1.uuid)('entity_id').notNull(),
140
+ email: (0, pg_core_1.varchar)('email', { length: 255 }).notNull(),
141
+ role: (0, pg_core_1.varchar)('role', { length: 20 }).notNull(),
142
+ status: (0, pg_core_1.varchar)('status', { length: 20 }).notNull().default('pending'),
143
+ invited_by_user_id: (0, pg_core_1.uuid)('invited_by_user_id').notNull(),
144
+ token: (0, pg_core_1.varchar)('token', { length: 64 }).notNull().unique(),
145
+ expires_at: (0, pg_core_1.timestamp)('expires_at', { withTimezone: true }).notNull(),
146
+ accepted_at: (0, pg_core_1.timestamp)('accepted_at', { withTimezone: true }),
147
+ created_at: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow(),
148
+ updated_at: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow(),
149
+ }, (table) => ({
150
+ tokenIdx: (0, pg_core_1.uniqueIndex)(`${indexPrefix}_entity_invitations_token_idx`).on(table.token),
151
+ entityIdx: (0, pg_core_1.index)(`${indexPrefix}_entity_invitations_entity_idx`).on(table.entity_id),
152
+ emailIdx: (0, pg_core_1.index)(`${indexPrefix}_entity_invitations_email_idx`).on(table.email),
153
+ statusIdx: (0, pg_core_1.index)(`${indexPrefix}_entity_invitations_status_idx`).on(table.status),
154
+ }));
155
+ }
156
+ // ========================================
157
+ // DEFAULT TABLES (Public Schema)
158
+ // ========================================
159
+ /** Default entities table for public schema */
160
+ exports.entities = (0, pg_core_1.pgTable)('entities', {
161
+ id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
162
+ entity_slug: (0, pg_core_1.varchar)('entity_slug', { length: 12 }).notNull().unique(),
163
+ entity_type: (0, pg_core_1.varchar)('entity_type', { length: 20 }).notNull(),
164
+ display_name: (0, pg_core_1.varchar)('display_name', { length: 255 }).notNull(),
165
+ description: (0, pg_core_1.text)('description'),
166
+ avatar_url: (0, pg_core_1.text)('avatar_url'),
167
+ owner_user_id: (0, pg_core_1.uuid)('owner_user_id').notNull(),
168
+ created_at: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow(),
169
+ updated_at: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow(),
170
+ }, (table) => ({
171
+ slugIdx: (0, pg_core_1.uniqueIndex)('entities_slug_idx').on(table.entity_slug),
172
+ ownerIdx: (0, pg_core_1.index)('entities_owner_idx').on(table.owner_user_id),
173
+ typeIdx: (0, pg_core_1.index)('entities_type_idx').on(table.entity_type),
174
+ }));
175
+ /** Default entity_members table for public schema */
176
+ exports.entityMembers = (0, pg_core_1.pgTable)('entity_members', {
177
+ id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
178
+ entity_id: (0, pg_core_1.uuid)('entity_id').notNull(),
179
+ user_id: (0, pg_core_1.uuid)('user_id').notNull(),
180
+ role: (0, pg_core_1.varchar)('role', { length: 20 }).notNull(),
181
+ joined_at: (0, pg_core_1.timestamp)('joined_at', { withTimezone: true }).defaultNow(),
182
+ created_at: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow(),
183
+ updated_at: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow(),
184
+ }, (table) => ({
185
+ entityUserUniqueIdx: (0, pg_core_1.uniqueIndex)('entity_members_entity_user_idx').on(table.entity_id, table.user_id),
186
+ entityIdx: (0, pg_core_1.index)('entity_members_entity_idx').on(table.entity_id),
187
+ userIdx: (0, pg_core_1.index)('entity_members_user_idx').on(table.user_id),
188
+ }));
189
+ /** Default entity_invitations table for public schema */
190
+ exports.entityInvitations = (0, pg_core_1.pgTable)('entity_invitations', {
191
+ id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
192
+ entity_id: (0, pg_core_1.uuid)('entity_id').notNull(),
193
+ email: (0, pg_core_1.varchar)('email', { length: 255 }).notNull(),
194
+ role: (0, pg_core_1.varchar)('role', { length: 20 }).notNull(),
195
+ status: (0, pg_core_1.varchar)('status', { length: 20 }).notNull().default('pending'),
196
+ invited_by_user_id: (0, pg_core_1.uuid)('invited_by_user_id').notNull(),
197
+ token: (0, pg_core_1.varchar)('token', { length: 64 }).notNull().unique(),
198
+ expires_at: (0, pg_core_1.timestamp)('expires_at', { withTimezone: true }).notNull(),
199
+ accepted_at: (0, pg_core_1.timestamp)('accepted_at', { withTimezone: true }),
200
+ created_at: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow(),
201
+ updated_at: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow(),
202
+ }, (table) => ({
203
+ tokenIdx: (0, pg_core_1.uniqueIndex)('entity_invitations_token_idx').on(table.token),
204
+ entityIdx: (0, pg_core_1.index)('entity_invitations_entity_idx').on(table.entity_id),
205
+ emailIdx: (0, pg_core_1.index)('entity_invitations_email_idx').on(table.email),
206
+ statusIdx: (0, pg_core_1.index)('entity_invitations_status_idx').on(table.status),
207
+ }));
208
+ // ========================================
209
+ // INITIALIZATION FUNCTIONS
210
+ // ========================================
211
+ /**
212
+ * Initialize all entity tables in the database.
213
+ *
214
+ * @param client - postgres-js client instance
215
+ * @param schemaName - PostgreSQL schema name (null for public)
216
+ * @param indexPrefix - Prefix for index names
217
+ */
218
+ async function initEntityTables(client, schemaName, indexPrefix) {
219
+ const prefix = schemaName ? `${schemaName}.` : '';
220
+ // Create entities table
221
+ await client.unsafe(`
222
+ CREATE TABLE IF NOT EXISTS ${prefix}entities (
223
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
224
+ entity_slug VARCHAR(12) NOT NULL UNIQUE,
225
+ entity_type VARCHAR(20) NOT NULL CHECK (entity_type IN ('personal', 'organization')),
226
+ display_name VARCHAR(255) NOT NULL,
227
+ description TEXT,
228
+ avatar_url TEXT,
229
+ owner_user_id UUID NOT NULL,
230
+ created_at TIMESTAMPTZ DEFAULT NOW(),
231
+ updated_at TIMESTAMPTZ DEFAULT NOW()
232
+ )
233
+ `);
234
+ await client.unsafe(`
235
+ CREATE UNIQUE INDEX IF NOT EXISTS ${indexPrefix}_entities_slug_idx
236
+ ON ${prefix}entities (entity_slug)
237
+ `);
238
+ await client.unsafe(`
239
+ CREATE INDEX IF NOT EXISTS ${indexPrefix}_entities_owner_idx
240
+ ON ${prefix}entities (owner_user_id)
241
+ `);
242
+ await client.unsafe(`
243
+ CREATE INDEX IF NOT EXISTS ${indexPrefix}_entities_type_idx
244
+ ON ${prefix}entities (entity_type)
245
+ `);
246
+ // Create entity_members table
247
+ await client.unsafe(`
248
+ CREATE TABLE IF NOT EXISTS ${prefix}entity_members (
249
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
250
+ entity_id UUID NOT NULL REFERENCES ${prefix}entities(id) ON DELETE CASCADE,
251
+ user_id UUID NOT NULL,
252
+ role VARCHAR(20) NOT NULL CHECK (role IN ('admin', 'manager', 'viewer')),
253
+ joined_at TIMESTAMPTZ DEFAULT NOW(),
254
+ created_at TIMESTAMPTZ DEFAULT NOW(),
255
+ updated_at TIMESTAMPTZ DEFAULT NOW(),
256
+ UNIQUE(entity_id, user_id)
257
+ )
258
+ `);
259
+ await client.unsafe(`
260
+ CREATE UNIQUE INDEX IF NOT EXISTS ${indexPrefix}_entity_members_entity_user_idx
261
+ ON ${prefix}entity_members (entity_id, user_id)
262
+ `);
263
+ await client.unsafe(`
264
+ CREATE INDEX IF NOT EXISTS ${indexPrefix}_entity_members_entity_idx
265
+ ON ${prefix}entity_members (entity_id)
266
+ `);
267
+ await client.unsafe(`
268
+ CREATE INDEX IF NOT EXISTS ${indexPrefix}_entity_members_user_idx
269
+ ON ${prefix}entity_members (user_id)
270
+ `);
271
+ // Create entity_invitations table
272
+ await client.unsafe(`
273
+ CREATE TABLE IF NOT EXISTS ${prefix}entity_invitations (
274
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
275
+ entity_id UUID NOT NULL REFERENCES ${prefix}entities(id) ON DELETE CASCADE,
276
+ email VARCHAR(255) NOT NULL,
277
+ role VARCHAR(20) NOT NULL CHECK (role IN ('admin', 'manager', 'viewer')),
278
+ status VARCHAR(20) NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'accepted', 'declined', 'expired')),
279
+ invited_by_user_id UUID NOT NULL,
280
+ token VARCHAR(64) NOT NULL UNIQUE,
281
+ expires_at TIMESTAMPTZ NOT NULL,
282
+ accepted_at TIMESTAMPTZ,
283
+ created_at TIMESTAMPTZ DEFAULT NOW(),
284
+ updated_at TIMESTAMPTZ DEFAULT NOW()
285
+ )
286
+ `);
287
+ await client.unsafe(`
288
+ CREATE UNIQUE INDEX IF NOT EXISTS ${indexPrefix}_entity_invitations_token_idx
289
+ ON ${prefix}entity_invitations (token)
290
+ `);
291
+ await client.unsafe(`
292
+ CREATE INDEX IF NOT EXISTS ${indexPrefix}_entity_invitations_entity_idx
293
+ ON ${prefix}entity_invitations (entity_id)
294
+ `);
295
+ await client.unsafe(`
296
+ CREATE INDEX IF NOT EXISTS ${indexPrefix}_entity_invitations_email_idx
297
+ ON ${prefix}entity_invitations (email)
298
+ `);
299
+ await client.unsafe(`
300
+ CREATE INDEX IF NOT EXISTS ${indexPrefix}_entity_invitations_status_idx
301
+ ON ${prefix}entity_invitations (status)
302
+ `);
303
+ }
304
+ //# sourceMappingURL=entities.js.map