@shipfox/api-workspaces 2.0.0

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 (284) hide show
  1. package/.turbo/turbo-build.log +2 -0
  2. package/.turbo/turbo-type$colon$emit.log +1 -0
  3. package/.turbo/turbo-type.log +1 -0
  4. package/CHANGELOG.md +97 -0
  5. package/LICENSE +21 -0
  6. package/README.md +87 -0
  7. package/dist/config.d.ts +12 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +58 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/core/entities/index.d.ts +4 -0
  12. package/dist/core/entities/index.d.ts.map +1 -0
  13. package/dist/core/entities/index.js +3 -0
  14. package/dist/core/entities/index.js.map +1 -0
  15. package/dist/core/entities/invitation.d.ts +14 -0
  16. package/dist/core/entities/invitation.d.ts.map +1 -0
  17. package/dist/core/entities/invitation.js +3 -0
  18. package/dist/core/entities/invitation.js.map +1 -0
  19. package/dist/core/entities/membership.d.ts +10 -0
  20. package/dist/core/entities/membership.d.ts.map +1 -0
  21. package/dist/core/entities/membership.js +3 -0
  22. package/dist/core/entities/membership.js.map +1 -0
  23. package/dist/core/entities/workspace.d.ts +10 -0
  24. package/dist/core/entities/workspace.d.ts.map +1 -0
  25. package/dist/core/entities/workspace.js +3 -0
  26. package/dist/core/entities/workspace.js.map +1 -0
  27. package/dist/core/errors.d.ts +52 -0
  28. package/dist/core/errors.d.ts.map +1 -0
  29. package/dist/core/errors.js +104 -0
  30. package/dist/core/errors.js.map +1 -0
  31. package/dist/core/index.d.ts +8 -0
  32. package/dist/core/index.d.ts.map +1 -0
  33. package/dist/core/index.js +6 -0
  34. package/dist/core/index.js.map +1 -0
  35. package/dist/core/invitations.d.ts +51 -0
  36. package/dist/core/invitations.d.ts.map +1 -0
  37. package/dist/core/invitations.js +136 -0
  38. package/dist/core/invitations.js.map +1 -0
  39. package/dist/core/memberships.d.ts +9 -0
  40. package/dist/core/memberships.d.ts.map +1 -0
  41. package/dist/core/memberships.js +13 -0
  42. package/dist/core/memberships.js.map +1 -0
  43. package/dist/core/workspaces.d.ts +40 -0
  44. package/dist/core/workspaces.d.ts.map +1 -0
  45. package/dist/core/workspaces.js +85 -0
  46. package/dist/core/workspaces.js.map +1 -0
  47. package/dist/db/db.d.ts +1253 -0
  48. package/dist/db/db.d.ts.map +1 -0
  49. package/dist/db/db.js +24 -0
  50. package/dist/db/db.js.map +1 -0
  51. package/dist/db/index.d.ts +10 -0
  52. package/dist/db/index.d.ts.map +1 -0
  53. package/dist/db/index.js +10 -0
  54. package/dist/db/index.js.map +1 -0
  55. package/dist/db/invitations.d.ts +47 -0
  56. package/dist/db/invitations.d.ts.map +1 -0
  57. package/dist/db/invitations.js +107 -0
  58. package/dist/db/invitations.js.map +1 -0
  59. package/dist/db/memberships.d.ts +44 -0
  60. package/dist/db/memberships.d.ts.map +1 -0
  61. package/dist/db/memberships.js +75 -0
  62. package/dist/db/memberships.js.map +1 -0
  63. package/dist/db/schema/common.d.ts +2 -0
  64. package/dist/db/schema/common.d.ts.map +1 -0
  65. package/dist/db/schema/common.js +4 -0
  66. package/dist/db/schema/common.js.map +1 -0
  67. package/dist/db/schema/invitations.d.ts +199 -0
  68. package/dist/db/schema/invitations.d.ts.map +1 -0
  69. package/dist/db/schema/invitations.js +47 -0
  70. package/dist/db/schema/invitations.js.map +1 -0
  71. package/dist/db/schema/memberships.d.ts +131 -0
  72. package/dist/db/schema/memberships.d.ts.map +1 -0
  73. package/dist/db/schema/memberships.js +35 -0
  74. package/dist/db/schema/memberships.js.map +1 -0
  75. package/dist/db/schema/outbox.d.ts +195 -0
  76. package/dist/db/schema/outbox.d.ts.map +1 -0
  77. package/dist/db/schema/outbox.js +5 -0
  78. package/dist/db/schema/outbox.js.map +1 -0
  79. package/dist/db/schema/workspaces.d.ts +115 -0
  80. package/dist/db/schema/workspaces.d.ts.map +1 -0
  81. package/dist/db/schema/workspaces.js +32 -0
  82. package/dist/db/schema/workspaces.js.map +1 -0
  83. package/dist/db/workspaces.d.ts +20 -0
  84. package/dist/db/workspaces.d.ts.map +1 -0
  85. package/dist/db/workspaces.js +53 -0
  86. package/dist/db/workspaces.js.map +1 -0
  87. package/dist/index.d.ts +13 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +40 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/metrics/index.d.ts +2 -0
  92. package/dist/metrics/index.d.ts.map +1 -0
  93. package/dist/metrics/index.js +3 -0
  94. package/dist/metrics/index.js.map +1 -0
  95. package/dist/metrics/instance.d.ts +8 -0
  96. package/dist/metrics/instance.d.ts.map +1 -0
  97. package/dist/metrics/instance.js +41 -0
  98. package/dist/metrics/instance.js.map +1 -0
  99. package/dist/metrics/service.d.ts +2 -0
  100. package/dist/metrics/service.d.ts.map +1 -0
  101. package/dist/metrics/service.js +26 -0
  102. package/dist/metrics/service.js.map +1 -0
  103. package/dist/presentation/dto/index.d.ts +4 -0
  104. package/dist/presentation/dto/index.d.ts.map +1 -0
  105. package/dist/presentation/dto/index.js +5 -0
  106. package/dist/presentation/dto/index.js.map +1 -0
  107. package/dist/presentation/dto/invitation.d.ts +4 -0
  108. package/dist/presentation/dto/invitation.d.ts.map +1 -0
  109. package/dist/presentation/dto/invitation.js +15 -0
  110. package/dist/presentation/dto/invitation.js.map +1 -0
  111. package/dist/presentation/dto/membership.d.ts +5 -0
  112. package/dist/presentation/dto/membership.d.ts.map +1 -0
  113. package/dist/presentation/dto/membership.js +23 -0
  114. package/dist/presentation/dto/membership.js.map +1 -0
  115. package/dist/presentation/dto/workspace.d.ts +4 -0
  116. package/dist/presentation/dto/workspace.d.ts.map +1 -0
  117. package/dist/presentation/dto/workspace.js +12 -0
  118. package/dist/presentation/dto/workspace.js.map +1 -0
  119. package/dist/presentation/e2eRoutes/create-invitation.d.ts +2 -0
  120. package/dist/presentation/e2eRoutes/create-invitation.d.ts.map +1 -0
  121. package/dist/presentation/e2eRoutes/create-invitation.js +39 -0
  122. package/dist/presentation/e2eRoutes/create-invitation.js.map +1 -0
  123. package/dist/presentation/e2eRoutes/create-workspace.d.ts +2 -0
  124. package/dist/presentation/e2eRoutes/create-workspace.d.ts.map +1 -0
  125. package/dist/presentation/e2eRoutes/create-workspace.js +27 -0
  126. package/dist/presentation/e2eRoutes/create-workspace.js.map +1 -0
  127. package/dist/presentation/e2eRoutes/index.d.ts +3 -0
  128. package/dist/presentation/e2eRoutes/index.d.ts.map +1 -0
  129. package/dist/presentation/e2eRoutes/index.js +11 -0
  130. package/dist/presentation/e2eRoutes/index.js.map +1 -0
  131. package/dist/presentation/index.d.ts +2 -0
  132. package/dist/presentation/index.d.ts.map +1 -0
  133. package/dist/presentation/index.js +3 -0
  134. package/dist/presentation/index.js.map +1 -0
  135. package/dist/presentation/routes/index.d.ts +3 -0
  136. package/dist/presentation/routes/index.d.ts.map +1 -0
  137. package/dist/presentation/routes/index.js +23 -0
  138. package/dist/presentation/routes/index.js.map +1 -0
  139. package/dist/presentation/routes/invitations/accept.d.ts +2 -0
  140. package/dist/presentation/routes/invitations/accept.d.ts.map +1 -0
  141. package/dist/presentation/routes/invitations/accept.js +67 -0
  142. package/dist/presentation/routes/invitations/accept.js.map +1 -0
  143. package/dist/presentation/routes/invitations/create.d.ts +2 -0
  144. package/dist/presentation/routes/invitations/create.d.ts.map +1 -0
  145. package/dist/presentation/routes/invitations/create.js +66 -0
  146. package/dist/presentation/routes/invitations/create.js.map +1 -0
  147. package/dist/presentation/routes/invitations/index.d.ts +4 -0
  148. package/dist/presentation/routes/invitations/index.d.ts.map +1 -0
  149. package/dist/presentation/routes/invitations/index.js +19 -0
  150. package/dist/presentation/routes/invitations/index.js.map +1 -0
  151. package/dist/presentation/routes/invitations/list.d.ts +2 -0
  152. package/dist/presentation/routes/invitations/list.d.ts.map +1 -0
  153. package/dist/presentation/routes/invitations/list.js +58 -0
  154. package/dist/presentation/routes/invitations/list.js.map +1 -0
  155. package/dist/presentation/routes/invitations/preview.d.ts +2 -0
  156. package/dist/presentation/routes/invitations/preview.d.ts.map +1 -0
  157. package/dist/presentation/routes/invitations/preview.js +47 -0
  158. package/dist/presentation/routes/invitations/preview.js.map +1 -0
  159. package/dist/presentation/routes/invitations/revoke.d.ts +2 -0
  160. package/dist/presentation/routes/invitations/revoke.d.ts.map +1 -0
  161. package/dist/presentation/routes/invitations/revoke.js +66 -0
  162. package/dist/presentation/routes/invitations/revoke.js.map +1 -0
  163. package/dist/presentation/routes/members/index.d.ts +3 -0
  164. package/dist/presentation/routes/members/index.d.ts.map +1 -0
  165. package/dist/presentation/routes/members/index.js +8 -0
  166. package/dist/presentation/routes/members/index.js.map +1 -0
  167. package/dist/presentation/routes/members/list.d.ts +2 -0
  168. package/dist/presentation/routes/members/list.d.ts.map +1 -0
  169. package/dist/presentation/routes/members/list.js +58 -0
  170. package/dist/presentation/routes/members/list.js.map +1 -0
  171. package/dist/presentation/routes/members/remove.d.ts +2 -0
  172. package/dist/presentation/routes/members/remove.d.ts.map +1 -0
  173. package/dist/presentation/routes/members/remove.js +71 -0
  174. package/dist/presentation/routes/members/remove.js.map +1 -0
  175. package/dist/presentation/routes/workspaces/create.d.ts +2 -0
  176. package/dist/presentation/routes/workspaces/create.d.ts.map +1 -0
  177. package/dist/presentation/routes/workspaces/create.js +36 -0
  178. package/dist/presentation/routes/workspaces/create.js.map +1 -0
  179. package/dist/presentation/routes/workspaces/index.d.ts +3 -0
  180. package/dist/presentation/routes/workspaces/index.d.ts.map +1 -0
  181. package/dist/presentation/routes/workspaces/index.js +4 -0
  182. package/dist/presentation/routes/workspaces/index.js.map +1 -0
  183. package/dist/presentation/routes/workspaces/list.d.ts +2 -0
  184. package/dist/presentation/routes/workspaces/list.d.ts.map +1 -0
  185. package/dist/presentation/routes/workspaces/list.js +32 -0
  186. package/dist/presentation/routes/workspaces/list.js.map +1 -0
  187. package/dist/presentation/subscribers/index.d.ts +2 -0
  188. package/dist/presentation/subscribers/index.d.ts.map +1 -0
  189. package/dist/presentation/subscribers/index.js +3 -0
  190. package/dist/presentation/subscribers/index.js.map +1 -0
  191. package/dist/presentation/subscribers/on-invitation-send-requested.d.ts +3 -0
  192. package/dist/presentation/subscribers/on-invitation-send-requested.d.ts.map +1 -0
  193. package/dist/presentation/subscribers/on-invitation-send-requested.js +16 -0
  194. package/dist/presentation/subscribers/on-invitation-send-requested.js.map +1 -0
  195. package/dist/tsconfig.test.tsbuildinfo +1 -0
  196. package/drizzle/0000_initial.sql +9 -0
  197. package/drizzle/0001_memberships_invitations.sql +30 -0
  198. package/drizzle/0002_membership_user_snapshots.sql +40 -0
  199. package/drizzle/0003_outgoing_enchantress.sql +16 -0
  200. package/drizzle/meta/0000_snapshot.json +80 -0
  201. package/drizzle/meta/0001_snapshot.json +705 -0
  202. package/drizzle/meta/0003_snapshot.json +442 -0
  203. package/drizzle/meta/_journal.json +34 -0
  204. package/drizzle.config.ts +7 -0
  205. package/package.json +71 -0
  206. package/src/config.ts +51 -0
  207. package/src/core/entities/index.ts +3 -0
  208. package/src/core/entities/invitation.ts +13 -0
  209. package/src/core/entities/membership.ts +9 -0
  210. package/src/core/entities/workspace.ts +10 -0
  211. package/src/core/errors.ts +118 -0
  212. package/src/core/index.ts +35 -0
  213. package/src/core/invitations.test.ts +251 -0
  214. package/src/core/invitations.ts +191 -0
  215. package/src/core/memberships.test.ts +77 -0
  216. package/src/core/memberships.ts +17 -0
  217. package/src/core/workspaces.test.ts +72 -0
  218. package/src/core/workspaces.ts +126 -0
  219. package/src/db/db.ts +24 -0
  220. package/src/db/index.ts +43 -0
  221. package/src/db/invitations.test.ts +204 -0
  222. package/src/db/invitations.ts +235 -0
  223. package/src/db/memberships.test.ts +107 -0
  224. package/src/db/memberships.ts +139 -0
  225. package/src/db/schema/common.ts +5 -0
  226. package/src/db/schema/invitations.ts +47 -0
  227. package/src/db/schema/memberships.ts +39 -0
  228. package/src/db/schema/outbox.ts +4 -0
  229. package/src/db/schema/workspaces.ts +33 -0
  230. package/src/db/workspaces.test.ts +114 -0
  231. package/src/db/workspaces.ts +81 -0
  232. package/src/index.test.ts +25 -0
  233. package/src/index.ts +43 -0
  234. package/src/metrics/index.ts +1 -0
  235. package/src/metrics/instance.test.ts +74 -0
  236. package/src/metrics/instance.ts +57 -0
  237. package/src/metrics/service.ts +26 -0
  238. package/src/presentation/dto/index.ts +3 -0
  239. package/src/presentation/dto/invitation.ts +16 -0
  240. package/src/presentation/dto/membership.ts +27 -0
  241. package/src/presentation/dto/workspace.ts +13 -0
  242. package/src/presentation/e2eRoutes/create-invitation.ts +44 -0
  243. package/src/presentation/e2eRoutes/create-workspace.ts +30 -0
  244. package/src/presentation/e2eRoutes/index.ts +8 -0
  245. package/src/presentation/index.ts +1 -0
  246. package/src/presentation/routes/index.ts +23 -0
  247. package/src/presentation/routes/invitations/accept.test.ts +154 -0
  248. package/src/presentation/routes/invitations/accept.ts +70 -0
  249. package/src/presentation/routes/invitations/create.test.ts +99 -0
  250. package/src/presentation/routes/invitations/create.ts +60 -0
  251. package/src/presentation/routes/invitations/index.ts +17 -0
  252. package/src/presentation/routes/invitations/list.test.ts +94 -0
  253. package/src/presentation/routes/invitations/list.ts +53 -0
  254. package/src/presentation/routes/invitations/preview.test.ts +140 -0
  255. package/src/presentation/routes/invitations/preview.ts +46 -0
  256. package/src/presentation/routes/invitations/revoke.test.ts +99 -0
  257. package/src/presentation/routes/invitations/revoke.ts +64 -0
  258. package/src/presentation/routes/members/index.ts +5 -0
  259. package/src/presentation/routes/members/list.test.ts +95 -0
  260. package/src/presentation/routes/members/list.ts +53 -0
  261. package/src/presentation/routes/members/remove.test.ts +110 -0
  262. package/src/presentation/routes/members/remove.ts +66 -0
  263. package/src/presentation/routes/workspaces/create.test.ts +87 -0
  264. package/src/presentation/routes/workspaces/create.ts +36 -0
  265. package/src/presentation/routes/workspaces/index.ts +2 -0
  266. package/src/presentation/routes/workspaces/list.test.ts +56 -0
  267. package/src/presentation/routes/workspaces/list.ts +29 -0
  268. package/src/presentation/subscribers/index.ts +1 -0
  269. package/src/presentation/subscribers/invitation-send-requested.test.ts +64 -0
  270. package/src/presentation/subscribers/on-invitation-send-requested.ts +15 -0
  271. package/test/env.ts +8 -0
  272. package/test/factories/index.ts +3 -0
  273. package/test/factories/membership.ts +24 -0
  274. package/test/factories/user.ts +15 -0
  275. package/test/factories/workspace.ts +18 -0
  276. package/test/globalSetup.ts +15 -0
  277. package/test/index.ts +3 -0
  278. package/test/routes.ts +255 -0
  279. package/test/setup.ts +17 -0
  280. package/tsconfig.build.json +9 -0
  281. package/tsconfig.build.tsbuildinfo +1 -0
  282. package/tsconfig.json +3 -0
  283. package/tsconfig.test.json +8 -0
  284. package/vitest.config.ts +11 -0
@@ -0,0 +1,53 @@
1
+ import { and, count, eq, gt, isNull, sql } from 'drizzle-orm';
2
+ import { recordWorkspaceCreated } from '#metrics/instance.js';
3
+ import { db } from './db.js';
4
+ import { invitations } from './schema/invitations.js';
5
+ import { memberships } from './schema/memberships.js';
6
+ import { toWorkspace, workspaces } from './schema/workspaces.js';
7
+ export async function createWorkspace(params) {
8
+ const rows = await db().insert(workspaces).values({
9
+ name: params.name
10
+ }).returning();
11
+ const row = rows[0];
12
+ if (!row) throw new Error('Insert returned no rows');
13
+ recordWorkspaceCreated();
14
+ return toWorkspace(row);
15
+ }
16
+ export async function updateWorkspace(params) {
17
+ const set = {
18
+ updatedAt: sql`NOW()`
19
+ };
20
+ if (params.name !== undefined) set.name = params.name;
21
+ if (params.status !== undefined) set.status = params.status;
22
+ if (params.settings !== undefined) set.settings = params.settings;
23
+ const rows = await db().update(workspaces).set(set).where(eq(workspaces.id, params.id)).returning();
24
+ const row = rows[0];
25
+ if (!row) return undefined;
26
+ return toWorkspace(row);
27
+ }
28
+ export async function getWorkspaceById(id) {
29
+ const rows = await db().select().from(workspaces).where(eq(workspaces.id, id)).limit(1);
30
+ const row = rows[0];
31
+ if (!row) return undefined;
32
+ return toWorkspace(row);
33
+ }
34
+ export async function getWorkspaceServiceMetrics() {
35
+ const [workspaceRows, membershipRows, invitationRows] = await Promise.all([
36
+ db().select({
37
+ value: count()
38
+ }).from(workspaces).where(eq(workspaces.status, 'active')),
39
+ db().select({
40
+ value: count()
41
+ }).from(memberships),
42
+ db().select({
43
+ value: count()
44
+ }).from(invitations).where(and(isNull(invitations.acceptedAt), gt(invitations.expiresAt, sql`now()`)))
45
+ ]);
46
+ return {
47
+ activeWorkspaces: workspaceRows[0]?.value ?? 0,
48
+ memberships: membershipRows[0]?.value ?? 0,
49
+ openInvitations: invitationRows[0]?.value ?? 0
50
+ };
51
+ }
52
+
53
+ //# sourceMappingURL=workspaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/db/workspaces.ts"],"sourcesContent":["import {and, count, eq, gt, isNull, sql} from 'drizzle-orm';\nimport type {Workspace, WorkspaceStatus} from '#core/entities/workspace.js';\nimport {recordWorkspaceCreated} from '#metrics/instance.js';\nimport {db} from './db.js';\nimport {invitations} from './schema/invitations.js';\nimport {memberships} from './schema/memberships.js';\nimport {toWorkspace, workspaces} from './schema/workspaces.js';\n\nexport interface CreateWorkspaceParams {\n name: string;\n}\n\nexport async function createWorkspace(params: CreateWorkspaceParams): Promise<Workspace> {\n const rows = await db()\n .insert(workspaces)\n .values({\n name: params.name,\n })\n .returning();\n\n const row = rows[0];\n if (!row) throw new Error('Insert returned no rows');\n recordWorkspaceCreated();\n return toWorkspace(row);\n}\n\nexport interface UpdateWorkspaceParams {\n id: string;\n name?: string | undefined;\n status?: WorkspaceStatus | undefined;\n settings?: Record<string, unknown> | undefined;\n}\n\nexport async function updateWorkspace(\n params: UpdateWorkspaceParams,\n): Promise<Workspace | undefined> {\n const set: Record<string, unknown> = {updatedAt: sql`NOW()`};\n if (params.name !== undefined) set.name = params.name;\n if (params.status !== undefined) set.status = params.status;\n if (params.settings !== undefined) set.settings = params.settings;\n\n const rows = await db()\n .update(workspaces)\n .set(set)\n .where(eq(workspaces.id, params.id))\n .returning();\n\n const row = rows[0];\n if (!row) return undefined;\n return toWorkspace(row);\n}\n\nexport async function getWorkspaceById(id: string): Promise<Workspace | undefined> {\n const rows = await db().select().from(workspaces).where(eq(workspaces.id, id)).limit(1);\n const row = rows[0];\n if (!row) return undefined;\n return toWorkspace(row);\n}\n\nexport interface WorkspaceServiceMetrics {\n activeWorkspaces: number;\n memberships: number;\n openInvitations: number;\n}\n\nexport async function getWorkspaceServiceMetrics(): Promise<WorkspaceServiceMetrics> {\n const [workspaceRows, membershipRows, invitationRows] = await Promise.all([\n db().select({value: count()}).from(workspaces).where(eq(workspaces.status, 'active')),\n db().select({value: count()}).from(memberships),\n db()\n .select({value: count()})\n .from(invitations)\n .where(and(isNull(invitations.acceptedAt), gt(invitations.expiresAt, sql`now()`))),\n ]);\n\n return {\n activeWorkspaces: workspaceRows[0]?.value ?? 0,\n memberships: membershipRows[0]?.value ?? 0,\n openInvitations: invitationRows[0]?.value ?? 0,\n };\n}\n"],"names":["and","count","eq","gt","isNull","sql","recordWorkspaceCreated","db","invitations","memberships","toWorkspace","workspaces","createWorkspace","params","rows","insert","values","name","returning","row","Error","updateWorkspace","set","updatedAt","undefined","status","settings","update","where","id","getWorkspaceById","select","from","limit","getWorkspaceServiceMetrics","workspaceRows","membershipRows","invitationRows","Promise","all","value","acceptedAt","expiresAt","activeWorkspaces","openInvitations"],"mappings":"AAAA,SAAQA,GAAG,EAAEC,KAAK,EAAEC,EAAE,EAAEC,EAAE,EAAEC,MAAM,EAAEC,GAAG,QAAO,cAAc;AAE5D,SAAQC,sBAAsB,QAAO,uBAAuB;AAC5D,SAAQC,EAAE,QAAO,UAAU;AAC3B,SAAQC,WAAW,QAAO,0BAA0B;AACpD,SAAQC,WAAW,QAAO,0BAA0B;AACpD,SAAQC,WAAW,EAAEC,UAAU,QAAO,yBAAyB;AAM/D,OAAO,eAAeC,gBAAgBC,MAA6B;IACjE,MAAMC,OAAO,MAAMP,KAChBQ,MAAM,CAACJ,YACPK,MAAM,CAAC;QACNC,MAAMJ,OAAOI,IAAI;IACnB,GACCC,SAAS;IAEZ,MAAMC,MAAML,IAAI,CAAC,EAAE;IACnB,IAAI,CAACK,KAAK,MAAM,IAAIC,MAAM;IAC1Bd;IACA,OAAOI,YAAYS;AACrB;AASA,OAAO,eAAeE,gBACpBR,MAA6B;IAE7B,MAAMS,MAA+B;QAACC,WAAWlB,GAAG,CAAC,KAAK,CAAC;IAAA;IAC3D,IAAIQ,OAAOI,IAAI,KAAKO,WAAWF,IAAIL,IAAI,GAAGJ,OAAOI,IAAI;IACrD,IAAIJ,OAAOY,MAAM,KAAKD,WAAWF,IAAIG,MAAM,GAAGZ,OAAOY,MAAM;IAC3D,IAAIZ,OAAOa,QAAQ,KAAKF,WAAWF,IAAII,QAAQ,GAAGb,OAAOa,QAAQ;IAEjE,MAAMZ,OAAO,MAAMP,KAChBoB,MAAM,CAAChB,YACPW,GAAG,CAACA,KACJM,KAAK,CAAC1B,GAAGS,WAAWkB,EAAE,EAAEhB,OAAOgB,EAAE,GACjCX,SAAS;IAEZ,MAAMC,MAAML,IAAI,CAAC,EAAE;IACnB,IAAI,CAACK,KAAK,OAAOK;IACjB,OAAOd,YAAYS;AACrB;AAEA,OAAO,eAAeW,iBAAiBD,EAAU;IAC/C,MAAMf,OAAO,MAAMP,KAAKwB,MAAM,GAAGC,IAAI,CAACrB,YAAYiB,KAAK,CAAC1B,GAAGS,WAAWkB,EAAE,EAAEA,KAAKI,KAAK,CAAC;IACrF,MAAMd,MAAML,IAAI,CAAC,EAAE;IACnB,IAAI,CAACK,KAAK,OAAOK;IACjB,OAAOd,YAAYS;AACrB;AAQA,OAAO,eAAee;IACpB,MAAM,CAACC,eAAeC,gBAAgBC,eAAe,GAAG,MAAMC,QAAQC,GAAG,CAAC;QACxEhC,KAAKwB,MAAM,CAAC;YAACS,OAAOvC;QAAO,GAAG+B,IAAI,CAACrB,YAAYiB,KAAK,CAAC1B,GAAGS,WAAWc,MAAM,EAAE;QAC3ElB,KAAKwB,MAAM,CAAC;YAACS,OAAOvC;QAAO,GAAG+B,IAAI,CAACvB;QACnCF,KACGwB,MAAM,CAAC;YAACS,OAAOvC;QAAO,GACtB+B,IAAI,CAACxB,aACLoB,KAAK,CAAC5B,IAAII,OAAOI,YAAYiC,UAAU,GAAGtC,GAAGK,YAAYkC,SAAS,EAAErC,GAAG,CAAC,KAAK,CAAC;KAClF;IAED,OAAO;QACLsC,kBAAkBR,aAAa,CAAC,EAAE,EAAEK,SAAS;QAC7C/B,aAAa2B,cAAc,CAAC,EAAE,EAAEI,SAAS;QACzCI,iBAAiBP,cAAc,CAAC,EAAE,EAAEG,SAAS;IAC/C;AACF"}
@@ -0,0 +1,13 @@
1
+ import type { ShipfoxModule } from '@shipfox/node-module';
2
+ export type { Invitation } from '#core/entities/invitation.js';
3
+ export type { Membership } from '#core/entities/membership.js';
4
+ export type { Workspace, WorkspaceStatus } from '#core/entities/workspace.js';
5
+ export { InvitationEmailMismatchError, TokenAlreadyUsedError, TokenExpiredError, TokenInvalidError, WorkspaceNotFoundError, } from '#core/errors.js';
6
+ export { acceptWorkspaceInvitation, peekInvitationByRawToken } from '#core/invitations.js';
7
+ export { type EnsureMembershipParams, ensureMembership } from '#core/memberships.js';
8
+ export { getWorkspace, requireWorkspaceMembership } from '#core/workspaces.js';
9
+ export { db, migrationsPath } from '#db/index.js';
10
+ export { listMembershipsByUser } from '#db/memberships.js';
11
+ export { workspacesRoutes as routes } from '#presentation/routes/index.js';
12
+ export declare const workspacesModule: ShipfoxModule;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AAQxD,YAAY,EAAC,UAAU,EAAC,MAAM,8BAA8B,CAAC;AAC7D,YAAY,EAAC,UAAU,EAAC,MAAM,8BAA8B,CAAC;AAC7D,YAAY,EAAC,SAAS,EAAE,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EACL,4BAA4B,EAC5B,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAC,yBAAyB,EAAE,wBAAwB,EAAC,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAC,KAAK,sBAAsB,EAAE,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAC,YAAY,EAAE,0BAA0B,EAAC,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAC,EAAE,EAAE,cAAc,EAAC,MAAM,cAAc,CAAC;AAChD,OAAO,EAAC,qBAAqB,EAAC,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAC,gBAAgB,IAAI,MAAM,EAAC,MAAM,+BAA+B,CAAC;AAIzE,eAAO,MAAM,gBAAgB,EAAE,aAU9B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,40 @@
1
+ import { WORKSPACES_INVITATION_SEND_REQUESTED, workspacesEventSchemas } from '@shipfox/api-workspaces-dto';
2
+ import { subscriberFactory } from '@shipfox/node-module';
3
+ import { db, migrationsPath, workspacesOutbox } from '#db/index.js';
4
+ import { registerWorkspacesServiceMetrics } from '#metrics/index.js';
5
+ import { workspacesE2eRoutes } from '#presentation/e2eRoutes/index.js';
6
+ import { workspacesRoutes } from '#presentation/routes/index.js';
7
+ import { onInvitationSendRequested } from '#presentation/subscribers/index.js';
8
+ export { InvitationEmailMismatchError, TokenAlreadyUsedError, TokenExpiredError, TokenInvalidError, WorkspaceNotFoundError } from '#core/errors.js';
9
+ export { acceptWorkspaceInvitation, peekInvitationByRawToken } from '#core/invitations.js';
10
+ export { ensureMembership } from '#core/memberships.js';
11
+ export { getWorkspace, requireWorkspaceMembership } from '#core/workspaces.js';
12
+ export { db, migrationsPath } from '#db/index.js';
13
+ export { listMembershipsByUser } from '#db/memberships.js';
14
+ export { workspacesRoutes as routes } from '#presentation/routes/index.js';
15
+ const subscriber = subscriberFactory();
16
+ export const workspacesModule = {
17
+ name: 'workspaces',
18
+ database: {
19
+ db,
20
+ migrationsPath
21
+ },
22
+ routes: workspacesRoutes,
23
+ e2eRoutes: [
24
+ workspacesE2eRoutes
25
+ ],
26
+ publishers: [
27
+ {
28
+ name: 'workspaces',
29
+ table: workspacesOutbox,
30
+ db,
31
+ eventSchemas: workspacesEventSchemas
32
+ }
33
+ ],
34
+ subscribers: [
35
+ subscriber(WORKSPACES_INVITATION_SEND_REQUESTED, onInvitationSendRequested)
36
+ ],
37
+ metrics: registerWorkspacesServiceMetrics
38
+ };
39
+
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n WORKSPACES_INVITATION_SEND_REQUESTED,\n type WorkspacesEventMap,\n workspacesEventSchemas,\n} from '@shipfox/api-workspaces-dto';\nimport type {ShipfoxModule} from '@shipfox/node-module';\nimport {subscriberFactory} from '@shipfox/node-module';\nimport {db, migrationsPath, workspacesOutbox} from '#db/index.js';\nimport {registerWorkspacesServiceMetrics} from '#metrics/index.js';\nimport {workspacesE2eRoutes} from '#presentation/e2eRoutes/index.js';\nimport {workspacesRoutes} from '#presentation/routes/index.js';\nimport {onInvitationSendRequested} from '#presentation/subscribers/index.js';\n\nexport type {Invitation} from '#core/entities/invitation.js';\nexport type {Membership} from '#core/entities/membership.js';\nexport type {Workspace, WorkspaceStatus} from '#core/entities/workspace.js';\nexport {\n InvitationEmailMismatchError,\n TokenAlreadyUsedError,\n TokenExpiredError,\n TokenInvalidError,\n WorkspaceNotFoundError,\n} from '#core/errors.js';\nexport {acceptWorkspaceInvitation, peekInvitationByRawToken} from '#core/invitations.js';\nexport {type EnsureMembershipParams, ensureMembership} from '#core/memberships.js';\nexport {getWorkspace, requireWorkspaceMembership} from '#core/workspaces.js';\nexport {db, migrationsPath} from '#db/index.js';\nexport {listMembershipsByUser} from '#db/memberships.js';\nexport {workspacesRoutes as routes} from '#presentation/routes/index.js';\n\nconst subscriber = subscriberFactory<WorkspacesEventMap>();\n\nexport const workspacesModule: ShipfoxModule = {\n name: 'workspaces',\n database: {db, migrationsPath},\n routes: workspacesRoutes,\n e2eRoutes: [workspacesE2eRoutes],\n publishers: [\n {name: 'workspaces', table: workspacesOutbox, db, eventSchemas: workspacesEventSchemas},\n ],\n subscribers: [subscriber(WORKSPACES_INVITATION_SEND_REQUESTED, onInvitationSendRequested)],\n metrics: registerWorkspacesServiceMetrics,\n};\n"],"names":["WORKSPACES_INVITATION_SEND_REQUESTED","workspacesEventSchemas","subscriberFactory","db","migrationsPath","workspacesOutbox","registerWorkspacesServiceMetrics","workspacesE2eRoutes","workspacesRoutes","onInvitationSendRequested","InvitationEmailMismatchError","TokenAlreadyUsedError","TokenExpiredError","TokenInvalidError","WorkspaceNotFoundError","acceptWorkspaceInvitation","peekInvitationByRawToken","ensureMembership","getWorkspace","requireWorkspaceMembership","listMembershipsByUser","routes","subscriber","workspacesModule","name","database","e2eRoutes","publishers","table","eventSchemas","subscribers","metrics"],"mappings":"AAAA,SACEA,oCAAoC,EAEpCC,sBAAsB,QACjB,8BAA8B;AAErC,SAAQC,iBAAiB,QAAO,uBAAuB;AACvD,SAAQC,EAAE,EAAEC,cAAc,EAAEC,gBAAgB,QAAO,eAAe;AAClE,SAAQC,gCAAgC,QAAO,oBAAoB;AACnE,SAAQC,mBAAmB,QAAO,mCAAmC;AACrE,SAAQC,gBAAgB,QAAO,gCAAgC;AAC/D,SAAQC,yBAAyB,QAAO,qCAAqC;AAK7E,SACEC,4BAA4B,EAC5BC,qBAAqB,EACrBC,iBAAiB,EACjBC,iBAAiB,EACjBC,sBAAsB,QACjB,kBAAkB;AACzB,SAAQC,yBAAyB,EAAEC,wBAAwB,QAAO,uBAAuB;AACzF,SAAqCC,gBAAgB,QAAO,uBAAuB;AACnF,SAAQC,YAAY,EAAEC,0BAA0B,QAAO,sBAAsB;AAC7E,SAAQhB,EAAE,EAAEC,cAAc,QAAO,eAAe;AAChD,SAAQgB,qBAAqB,QAAO,qBAAqB;AACzD,SAAQZ,oBAAoBa,MAAM,QAAO,gCAAgC;AAEzE,MAAMC,aAAapB;AAEnB,OAAO,MAAMqB,mBAAkC;IAC7CC,MAAM;IACNC,UAAU;QAACtB;QAAIC;IAAc;IAC7BiB,QAAQb;IACRkB,WAAW;QAACnB;KAAoB;IAChCoB,YAAY;QACV;YAACH,MAAM;YAAcI,OAAOvB;YAAkBF;YAAI0B,cAAc5B;QAAsB;KACvF;IACD6B,aAAa;QAACR,WAAWtB,sCAAsCS;KAA2B;IAC1FsB,SAASzB;AACX,EAAE"}
@@ -0,0 +1,2 @@
1
+ export { registerWorkspacesServiceMetrics } from './service.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gCAAgC,EAAC,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { registerWorkspacesServiceMetrics } from './service.js';
2
+
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/metrics/index.ts"],"sourcesContent":["export {registerWorkspacesServiceMetrics} from './service.js';\n"],"names":["registerWorkspacesServiceMetrics"],"mappings":"AAAA,SAAQA,gCAAgC,QAAO,eAAe"}
@@ -0,0 +1,8 @@
1
+ export type WorkspacesInvitationEmailRequested = 'requested' | 'skipped';
2
+ export type WorkspacesMembershipChangeAction = 'added' | 'removed';
3
+ export type WorkspacesInvitationAcceptOutcome = 'added' | 'already_member';
4
+ export declare function recordWorkspaceCreated(): void;
5
+ export declare function recordWorkspaceMembershipChanged(action: WorkspacesMembershipChangeAction): void;
6
+ export declare function recordWorkspaceInvitationCreated(emailRequested: WorkspacesInvitationEmailRequested): void;
7
+ export declare function recordWorkspaceInvitationAccepted(outcome: WorkspacesInvitationAcceptOutcome): void;
8
+ //# sourceMappingURL=instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/metrics/instance.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kCAAkC,GAAG,WAAW,GAAG,SAAS,CAAC;AACzE,MAAM,MAAM,gCAAgC,GAAG,OAAO,GAAG,SAAS,CAAC;AACnE,MAAM,MAAM,iCAAiC,GAAG,OAAO,GAAG,gBAAgB,CAAC;AAkC3E,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,gCAAgC,GAAG,IAAI,CAE/F;AAED,wBAAgB,gCAAgC,CAC9C,cAAc,EAAE,kCAAkC,GACjD,IAAI,CAEN;AAED,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,iCAAiC,GACzC,IAAI,CAEN"}
@@ -0,0 +1,41 @@
1
+ import { instanceMetrics } from '@shipfox/node-opentelemetry';
2
+ const meter = instanceMetrics.getMeter('workspaces');
3
+ const workspaceCreatedCount = meter.createCounter('workspaces_created', {
4
+ description: 'Workspaces created'
5
+ });
6
+ const membershipChangedCount = meter.createCounter('workspaces_membership_changed', {
7
+ description: 'Workspace membership changes by action'
8
+ });
9
+ const invitationCreatedCount = meter.createCounter('workspaces_invitation_created', {
10
+ description: 'Workspace invitations created by whether an invitation email was requested'
11
+ });
12
+ const invitationAcceptedCount = meter.createCounter('workspaces_invitation_accepted', {
13
+ description: 'Workspace invitations accepted by membership outcome'
14
+ });
15
+ function recordMetric(record) {
16
+ try {
17
+ record();
18
+ } catch {
19
+ // Metrics must not affect workspace mutations.
20
+ }
21
+ }
22
+ export function recordWorkspaceCreated() {
23
+ recordMetric(()=>workspaceCreatedCount.add(1));
24
+ }
25
+ export function recordWorkspaceMembershipChanged(action) {
26
+ recordMetric(()=>membershipChangedCount.add(1, {
27
+ action
28
+ }));
29
+ }
30
+ export function recordWorkspaceInvitationCreated(emailRequested) {
31
+ recordMetric(()=>invitationCreatedCount.add(1, {
32
+ email_requested: emailRequested
33
+ }));
34
+ }
35
+ export function recordWorkspaceInvitationAccepted(outcome) {
36
+ recordMetric(()=>invitationAcceptedCount.add(1, {
37
+ outcome
38
+ }));
39
+ }
40
+
41
+ //# sourceMappingURL=instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/metrics/instance.ts"],"sourcesContent":["import {instanceMetrics} from '@shipfox/node-opentelemetry';\n\nexport type WorkspacesInvitationEmailRequested = 'requested' | 'skipped';\nexport type WorkspacesMembershipChangeAction = 'added' | 'removed';\nexport type WorkspacesInvitationAcceptOutcome = 'added' | 'already_member';\n\nconst meter = instanceMetrics.getMeter('workspaces');\n\nconst workspaceCreatedCount = meter.createCounter<Record<string, never>>('workspaces_created', {\n description: 'Workspaces created',\n});\n\nconst membershipChangedCount = meter.createCounter<{\n action: WorkspacesMembershipChangeAction;\n}>('workspaces_membership_changed', {\n description: 'Workspace membership changes by action',\n});\n\nconst invitationCreatedCount = meter.createCounter<{\n email_requested: WorkspacesInvitationEmailRequested;\n}>('workspaces_invitation_created', {\n description: 'Workspace invitations created by whether an invitation email was requested',\n});\n\nconst invitationAcceptedCount = meter.createCounter<{\n outcome: WorkspacesInvitationAcceptOutcome;\n}>('workspaces_invitation_accepted', {\n description: 'Workspace invitations accepted by membership outcome',\n});\n\nfunction recordMetric(record: () => void): void {\n try {\n record();\n } catch {\n // Metrics must not affect workspace mutations.\n }\n}\n\nexport function recordWorkspaceCreated(): void {\n recordMetric(() => workspaceCreatedCount.add(1));\n}\n\nexport function recordWorkspaceMembershipChanged(action: WorkspacesMembershipChangeAction): void {\n recordMetric(() => membershipChangedCount.add(1, {action}));\n}\n\nexport function recordWorkspaceInvitationCreated(\n emailRequested: WorkspacesInvitationEmailRequested,\n): void {\n recordMetric(() => invitationCreatedCount.add(1, {email_requested: emailRequested}));\n}\n\nexport function recordWorkspaceInvitationAccepted(\n outcome: WorkspacesInvitationAcceptOutcome,\n): void {\n recordMetric(() => invitationAcceptedCount.add(1, {outcome}));\n}\n"],"names":["instanceMetrics","meter","getMeter","workspaceCreatedCount","createCounter","description","membershipChangedCount","invitationCreatedCount","invitationAcceptedCount","recordMetric","record","recordWorkspaceCreated","add","recordWorkspaceMembershipChanged","action","recordWorkspaceInvitationCreated","emailRequested","email_requested","recordWorkspaceInvitationAccepted","outcome"],"mappings":"AAAA,SAAQA,eAAe,QAAO,8BAA8B;AAM5D,MAAMC,QAAQD,gBAAgBE,QAAQ,CAAC;AAEvC,MAAMC,wBAAwBF,MAAMG,aAAa,CAAwB,sBAAsB;IAC7FC,aAAa;AACf;AAEA,MAAMC,yBAAyBL,MAAMG,aAAa,CAE/C,iCAAiC;IAClCC,aAAa;AACf;AAEA,MAAME,yBAAyBN,MAAMG,aAAa,CAE/C,iCAAiC;IAClCC,aAAa;AACf;AAEA,MAAMG,0BAA0BP,MAAMG,aAAa,CAEhD,kCAAkC;IACnCC,aAAa;AACf;AAEA,SAASI,aAAaC,MAAkB;IACtC,IAAI;QACFA;IACF,EAAE,OAAM;IACN,+CAA+C;IACjD;AACF;AAEA,OAAO,SAASC;IACdF,aAAa,IAAMN,sBAAsBS,GAAG,CAAC;AAC/C;AAEA,OAAO,SAASC,iCAAiCC,MAAwC;IACvFL,aAAa,IAAMH,uBAAuBM,GAAG,CAAC,GAAG;YAACE;QAAM;AAC1D;AAEA,OAAO,SAASC,iCACdC,cAAkD;IAElDP,aAAa,IAAMF,uBAAuBK,GAAG,CAAC,GAAG;YAACK,iBAAiBD;QAAc;AACnF;AAEA,OAAO,SAASE,kCACdC,OAA0C;IAE1CV,aAAa,IAAMD,wBAAwBI,GAAG,CAAC,GAAG;YAACO;QAAO;AAC5D"}
@@ -0,0 +1,2 @@
1
+ export declare function registerWorkspacesServiceMetrics(): void;
2
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/metrics/service.ts"],"names":[],"mappings":"AAGA,wBAAgB,gCAAgC,IAAI,IAAI,CAsBvD"}
@@ -0,0 +1,26 @@
1
+ import { getServiceMetricsProvider } from '@shipfox/node-opentelemetry';
2
+ import { getWorkspaceServiceMetrics } from '#db/workspaces.js';
3
+ export function registerWorkspacesServiceMetrics() {
4
+ const meter = getServiceMetricsProvider().getMeter('workspaces');
5
+ const activeWorkspaces = meter.createObservableGauge('workspaces_active', {
6
+ description: 'Workspaces currently marked active'
7
+ });
8
+ const memberships = meter.createObservableGauge('workspaces_memberships', {
9
+ description: 'Workspace memberships currently present'
10
+ });
11
+ const openInvitations = meter.createObservableGauge('workspaces_open_invitations', {
12
+ description: 'Workspace invitations currently unaccepted and unexpired'
13
+ });
14
+ meter.addBatchObservableCallback(async (observer)=>{
15
+ const metrics = await getWorkspaceServiceMetrics();
16
+ observer.observe(activeWorkspaces, metrics.activeWorkspaces);
17
+ observer.observe(memberships, metrics.memberships);
18
+ observer.observe(openInvitations, metrics.openInvitations);
19
+ }, [
20
+ activeWorkspaces,
21
+ memberships,
22
+ openInvitations
23
+ ]);
24
+ }
25
+
26
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/metrics/service.ts"],"sourcesContent":["import {getServiceMetricsProvider} from '@shipfox/node-opentelemetry';\nimport {getWorkspaceServiceMetrics} from '#db/workspaces.js';\n\nexport function registerWorkspacesServiceMetrics(): void {\n const meter = getServiceMetricsProvider().getMeter('workspaces');\n\n const activeWorkspaces = meter.createObservableGauge('workspaces_active', {\n description: 'Workspaces currently marked active',\n });\n const memberships = meter.createObservableGauge('workspaces_memberships', {\n description: 'Workspace memberships currently present',\n });\n const openInvitations = meter.createObservableGauge('workspaces_open_invitations', {\n description: 'Workspace invitations currently unaccepted and unexpired',\n });\n\n meter.addBatchObservableCallback(\n async (observer) => {\n const metrics = await getWorkspaceServiceMetrics();\n observer.observe(activeWorkspaces, metrics.activeWorkspaces);\n observer.observe(memberships, metrics.memberships);\n observer.observe(openInvitations, metrics.openInvitations);\n },\n [activeWorkspaces, memberships, openInvitations],\n );\n}\n"],"names":["getServiceMetricsProvider","getWorkspaceServiceMetrics","registerWorkspacesServiceMetrics","meter","getMeter","activeWorkspaces","createObservableGauge","description","memberships","openInvitations","addBatchObservableCallback","observer","metrics","observe"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,8BAA8B;AACtE,SAAQC,0BAA0B,QAAO,oBAAoB;AAE7D,OAAO,SAASC;IACd,MAAMC,QAAQH,4BAA4BI,QAAQ,CAAC;IAEnD,MAAMC,mBAAmBF,MAAMG,qBAAqB,CAAC,qBAAqB;QACxEC,aAAa;IACf;IACA,MAAMC,cAAcL,MAAMG,qBAAqB,CAAC,0BAA0B;QACxEC,aAAa;IACf;IACA,MAAME,kBAAkBN,MAAMG,qBAAqB,CAAC,+BAA+B;QACjFC,aAAa;IACf;IAEAJ,MAAMO,0BAA0B,CAC9B,OAAOC;QACL,MAAMC,UAAU,MAAMX;QACtBU,SAASE,OAAO,CAACR,kBAAkBO,QAAQP,gBAAgB;QAC3DM,SAASE,OAAO,CAACL,aAAaI,QAAQJ,WAAW;QACjDG,SAASE,OAAO,CAACJ,iBAAiBG,QAAQH,eAAe;IAC3D,GACA;QAACJ;QAAkBG;QAAaC;KAAgB;AAEpD"}
@@ -0,0 +1,4 @@
1
+ export { toInvitationDto } from './invitation.js';
2
+ export { toMembershipWithUserDto, toMembershipWithWorkspaceDto } from './membership.js';
3
+ export { toWorkspaceDto } from './workspace.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAC,uBAAuB,EAAE,4BAA4B,EAAC,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAC,cAAc,EAAC,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { toInvitationDto } from './invitation.js';
2
+ export { toMembershipWithUserDto, toMembershipWithWorkspaceDto } from './membership.js';
3
+ export { toWorkspaceDto } from './workspace.js';
4
+
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/dto/index.ts"],"sourcesContent":["export {toInvitationDto} from './invitation.js';\nexport {toMembershipWithUserDto, toMembershipWithWorkspaceDto} from './membership.js';\nexport {toWorkspaceDto} from './workspace.js';\n"],"names":["toInvitationDto","toMembershipWithUserDto","toMembershipWithWorkspaceDto","toWorkspaceDto"],"mappings":"AAAA,SAAQA,eAAe,QAAO,kBAAkB;AAChD,SAAQC,uBAAuB,EAAEC,4BAA4B,QAAO,kBAAkB;AACtF,SAAQC,cAAc,QAAO,iBAAiB"}
@@ -0,0 +1,4 @@
1
+ import type { InvitationDto } from '@shipfox/api-workspaces-dto';
2
+ import type { Invitation } from '#core/entities/invitation.js';
3
+ export declare function toInvitationDto(invitation: Invitation): InvitationDto;
4
+ //# sourceMappingURL=invitation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invitation.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/invitation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,8BAA8B,CAAC;AAE7D,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,CAYrE"}
@@ -0,0 +1,15 @@
1
+ export function toInvitationDto(invitation) {
2
+ return {
3
+ id: invitation.id,
4
+ workspace_id: invitation.workspaceId,
5
+ email: invitation.email,
6
+ expires_at: invitation.expiresAt.toISOString(),
7
+ accepted_at: invitation.acceptedAt ? invitation.acceptedAt.toISOString() : null,
8
+ invited_by_user_id: invitation.invitedByUserId,
9
+ invited_by_display: invitation.invitedByDisplay,
10
+ created_at: invitation.createdAt.toISOString(),
11
+ updated_at: invitation.updatedAt.toISOString()
12
+ };
13
+ }
14
+
15
+ //# sourceMappingURL=invitation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/dto/invitation.ts"],"sourcesContent":["import type {InvitationDto} from '@shipfox/api-workspaces-dto';\nimport type {Invitation} from '#core/entities/invitation.js';\n\nexport function toInvitationDto(invitation: Invitation): InvitationDto {\n return {\n id: invitation.id,\n workspace_id: invitation.workspaceId,\n email: invitation.email,\n expires_at: invitation.expiresAt.toISOString(),\n accepted_at: invitation.acceptedAt ? invitation.acceptedAt.toISOString() : null,\n invited_by_user_id: invitation.invitedByUserId,\n invited_by_display: invitation.invitedByDisplay,\n created_at: invitation.createdAt.toISOString(),\n updated_at: invitation.updatedAt.toISOString(),\n };\n}\n"],"names":["toInvitationDto","invitation","id","workspace_id","workspaceId","email","expires_at","expiresAt","toISOString","accepted_at","acceptedAt","invited_by_user_id","invitedByUserId","invited_by_display","invitedByDisplay","created_at","createdAt","updated_at","updatedAt"],"mappings":"AAGA,OAAO,SAASA,gBAAgBC,UAAsB;IACpD,OAAO;QACLC,IAAID,WAAWC,EAAE;QACjBC,cAAcF,WAAWG,WAAW;QACpCC,OAAOJ,WAAWI,KAAK;QACvBC,YAAYL,WAAWM,SAAS,CAACC,WAAW;QAC5CC,aAAaR,WAAWS,UAAU,GAAGT,WAAWS,UAAU,CAACF,WAAW,KAAK;QAC3EG,oBAAoBV,WAAWW,eAAe;QAC9CC,oBAAoBZ,WAAWa,gBAAgB;QAC/CC,YAAYd,WAAWe,SAAS,CAACR,WAAW;QAC5CS,YAAYhB,WAAWiB,SAAS,CAACV,WAAW;IAC9C;AACF"}
@@ -0,0 +1,5 @@
1
+ import type { MembershipWithUserDto, MembershipWithWorkspaceDto } from '@shipfox/api-workspaces-dto';
2
+ import type { MembershipWithUser, MembershipWithWorkspace } from '#db/memberships.js';
3
+ export declare function toMembershipWithWorkspaceDto(membership: MembershipWithWorkspace): MembershipWithWorkspaceDto;
4
+ export declare function toMembershipWithUserDto(membership: MembershipWithUser): MembershipWithUserDto;
5
+ //# sourceMappingURL=membership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"membership.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/membership.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,qBAAqB,EAAE,0BAA0B,EAAC,MAAM,6BAA6B,CAAC;AACnG,OAAO,KAAK,EAAC,kBAAkB,EAAE,uBAAuB,EAAC,MAAM,oBAAoB,CAAC;AAEpF,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,uBAAuB,GAClC,0BAA0B,CAS5B;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,kBAAkB,GAAG,qBAAqB,CAU7F"}
@@ -0,0 +1,23 @@
1
+ export function toMembershipWithWorkspaceDto(membership) {
2
+ return {
3
+ id: membership.id,
4
+ user_id: membership.userId,
5
+ workspace_id: membership.workspaceId,
6
+ workspace_name: membership.workspaceName,
7
+ created_at: membership.createdAt.toISOString(),
8
+ updated_at: membership.updatedAt.toISOString()
9
+ };
10
+ }
11
+ export function toMembershipWithUserDto(membership) {
12
+ return {
13
+ id: membership.id,
14
+ user_id: membership.userId,
15
+ workspace_id: membership.workspaceId,
16
+ user_email: membership.userEmail,
17
+ user_name: membership.userName,
18
+ created_at: membership.createdAt.toISOString(),
19
+ updated_at: membership.updatedAt.toISOString()
20
+ };
21
+ }
22
+
23
+ //# sourceMappingURL=membership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/dto/membership.ts"],"sourcesContent":["import type {MembershipWithUserDto, MembershipWithWorkspaceDto} from '@shipfox/api-workspaces-dto';\nimport type {MembershipWithUser, MembershipWithWorkspace} from '#db/memberships.js';\n\nexport function toMembershipWithWorkspaceDto(\n membership: MembershipWithWorkspace,\n): MembershipWithWorkspaceDto {\n return {\n id: membership.id,\n user_id: membership.userId,\n workspace_id: membership.workspaceId,\n workspace_name: membership.workspaceName,\n created_at: membership.createdAt.toISOString(),\n updated_at: membership.updatedAt.toISOString(),\n };\n}\n\nexport function toMembershipWithUserDto(membership: MembershipWithUser): MembershipWithUserDto {\n return {\n id: membership.id,\n user_id: membership.userId,\n workspace_id: membership.workspaceId,\n user_email: membership.userEmail,\n user_name: membership.userName,\n created_at: membership.createdAt.toISOString(),\n updated_at: membership.updatedAt.toISOString(),\n };\n}\n"],"names":["toMembershipWithWorkspaceDto","membership","id","user_id","userId","workspace_id","workspaceId","workspace_name","workspaceName","created_at","createdAt","toISOString","updated_at","updatedAt","toMembershipWithUserDto","user_email","userEmail","user_name","userName"],"mappings":"AAGA,OAAO,SAASA,6BACdC,UAAmC;IAEnC,OAAO;QACLC,IAAID,WAAWC,EAAE;QACjBC,SAASF,WAAWG,MAAM;QAC1BC,cAAcJ,WAAWK,WAAW;QACpCC,gBAAgBN,WAAWO,aAAa;QACxCC,YAAYR,WAAWS,SAAS,CAACC,WAAW;QAC5CC,YAAYX,WAAWY,SAAS,CAACF,WAAW;IAC9C;AACF;AAEA,OAAO,SAASG,wBAAwBb,UAA8B;IACpE,OAAO;QACLC,IAAID,WAAWC,EAAE;QACjBC,SAASF,WAAWG,MAAM;QAC1BC,cAAcJ,WAAWK,WAAW;QACpCS,YAAYd,WAAWe,SAAS;QAChCC,WAAWhB,WAAWiB,QAAQ;QAC9BT,YAAYR,WAAWS,SAAS,CAACC,WAAW;QAC5CC,YAAYX,WAAWY,SAAS,CAACF,WAAW;IAC9C;AACF"}
@@ -0,0 +1,4 @@
1
+ import type { WorkspaceDto } from '@shipfox/api-workspaces-dto';
2
+ import type { Workspace } from '#core/entities/workspace.js';
3
+ export declare function toWorkspaceDto(workspace: Workspace): WorkspaceDto;
4
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,6BAA6B,CAAC;AAE3D,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY,CASjE"}
@@ -0,0 +1,12 @@
1
+ export function toWorkspaceDto(workspace) {
2
+ return {
3
+ id: workspace.id,
4
+ name: workspace.name,
5
+ status: workspace.status,
6
+ settings: workspace.settings,
7
+ created_at: workspace.createdAt.toISOString(),
8
+ updated_at: workspace.updatedAt.toISOString()
9
+ };
10
+ }
11
+
12
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/dto/workspace.ts"],"sourcesContent":["import type {WorkspaceDto} from '@shipfox/api-workspaces-dto';\nimport type {Workspace} from '#core/entities/workspace.js';\n\nexport function toWorkspaceDto(workspace: Workspace): WorkspaceDto {\n return {\n id: workspace.id,\n name: workspace.name,\n status: workspace.status,\n settings: workspace.settings,\n created_at: workspace.createdAt.toISOString(),\n updated_at: workspace.updatedAt.toISOString(),\n };\n}\n"],"names":["toWorkspaceDto","workspace","id","name","status","settings","created_at","createdAt","toISOString","updated_at","updatedAt"],"mappings":"AAGA,OAAO,SAASA,eAAeC,SAAoB;IACjD,OAAO;QACLC,IAAID,UAAUC,EAAE;QAChBC,MAAMF,UAAUE,IAAI;QACpBC,QAAQH,UAAUG,MAAM;QACxBC,UAAUJ,UAAUI,QAAQ;QAC5BC,YAAYL,UAAUM,SAAS,CAACC,WAAW;QAC3CC,YAAYR,UAAUS,SAAS,CAACF,WAAW;IAC7C;AACF"}
@@ -0,0 +1,2 @@
1
+ export declare const createE2eInvitationRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=create-invitation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-invitation.d.ts","sourceRoot":"","sources":["../../../src/presentation/e2eRoutes/create-invitation.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,wBAAwB,iDA4BnC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { e2eCreateInvitationBodySchema, e2eCreateInvitationResponseSchema } from '@shipfox/api-workspaces-dto';
2
+ import { defineRoute } from '@shipfox/node-fastify';
3
+ import { generateOpaqueToken, hashOpaqueToken } from '@shipfox/node-tokens';
4
+ import { createInvitation } from '#db/invitations.js';
5
+ import { toInvitationDto } from '#presentation/dto/index.js';
6
+ const INVITATION_TTL_DAYS = 7;
7
+ function daysFromNow(days) {
8
+ return new Date(Date.now() + days * 24 * 60 * 60 * 1000);
9
+ }
10
+ export const createE2eInvitationRoute = defineRoute({
11
+ method: 'POST',
12
+ path: '/invitations',
13
+ description: 'Create a workspace invitation for E2E tests.',
14
+ schema: {
15
+ body: e2eCreateInvitationBodySchema,
16
+ response: {
17
+ 201: e2eCreateInvitationResponseSchema
18
+ }
19
+ },
20
+ handler: async (request, reply)=>{
21
+ const rawToken = generateOpaqueToken('invitation');
22
+ const invitation = await createInvitation({
23
+ workspaceId: request.body.workspace_id,
24
+ email: request.body.email,
25
+ hashedToken: hashOpaqueToken(rawToken),
26
+ expiresAt: daysFromNow(INVITATION_TTL_DAYS),
27
+ invitedByUserId: request.body.invited_by_user_id,
28
+ invitedByDisplay: request.body.invited_by_display ?? null,
29
+ skipEmail: true
30
+ });
31
+ reply.code(201);
32
+ return {
33
+ invitation: toInvitationDto(invitation),
34
+ raw_token: rawToken
35
+ };
36
+ }
37
+ });
38
+
39
+ //# sourceMappingURL=create-invitation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/e2eRoutes/create-invitation.ts"],"sourcesContent":["import {\n e2eCreateInvitationBodySchema,\n e2eCreateInvitationResponseSchema,\n} from '@shipfox/api-workspaces-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {generateOpaqueToken, hashOpaqueToken} from '@shipfox/node-tokens';\nimport {createInvitation} from '#db/invitations.js';\nimport {toInvitationDto} from '#presentation/dto/index.js';\n\nconst INVITATION_TTL_DAYS = 7;\n\nfunction daysFromNow(days: number): Date {\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n}\n\nexport const createE2eInvitationRoute = defineRoute({\n method: 'POST',\n path: '/invitations',\n description: 'Create a workspace invitation for E2E tests.',\n schema: {\n body: e2eCreateInvitationBodySchema,\n response: {\n 201: e2eCreateInvitationResponseSchema,\n },\n },\n handler: async (request, reply) => {\n const rawToken = generateOpaqueToken('invitation');\n const invitation = await createInvitation({\n workspaceId: request.body.workspace_id,\n email: request.body.email,\n hashedToken: hashOpaqueToken(rawToken),\n expiresAt: daysFromNow(INVITATION_TTL_DAYS),\n invitedByUserId: request.body.invited_by_user_id,\n invitedByDisplay: request.body.invited_by_display ?? null,\n skipEmail: true,\n });\n\n reply.code(201);\n return {\n invitation: toInvitationDto(invitation),\n raw_token: rawToken,\n };\n },\n});\n"],"names":["e2eCreateInvitationBodySchema","e2eCreateInvitationResponseSchema","defineRoute","generateOpaqueToken","hashOpaqueToken","createInvitation","toInvitationDto","INVITATION_TTL_DAYS","daysFromNow","days","Date","now","createE2eInvitationRoute","method","path","description","schema","body","response","handler","request","reply","rawToken","invitation","workspaceId","workspace_id","email","hashedToken","expiresAt","invitedByUserId","invited_by_user_id","invitedByDisplay","invited_by_display","skipEmail","code","raw_token"],"mappings":"AAAA,SACEA,6BAA6B,EAC7BC,iCAAiC,QAC5B,8BAA8B;AACrC,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,mBAAmB,EAAEC,eAAe,QAAO,uBAAuB;AAC1E,SAAQC,gBAAgB,QAAO,qBAAqB;AACpD,SAAQC,eAAe,QAAO,6BAA6B;AAE3D,MAAMC,sBAAsB;AAE5B,SAASC,YAAYC,IAAY;IAC/B,OAAO,IAAIC,KAAKA,KAAKC,GAAG,KAAKF,OAAO,KAAK,KAAK,KAAK;AACrD;AAEA,OAAO,MAAMG,2BAA2BV,YAAY;IAClDW,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMjB;QACNkB,UAAU;YACR,KAAKjB;QACP;IACF;IACAkB,SAAS,OAAOC,SAASC;QACvB,MAAMC,WAAWnB,oBAAoB;QACrC,MAAMoB,aAAa,MAAMlB,iBAAiB;YACxCmB,aAAaJ,QAAQH,IAAI,CAACQ,YAAY;YACtCC,OAAON,QAAQH,IAAI,CAACS,KAAK;YACzBC,aAAavB,gBAAgBkB;YAC7BM,WAAWpB,YAAYD;YACvBsB,iBAAiBT,QAAQH,IAAI,CAACa,kBAAkB;YAChDC,kBAAkBX,QAAQH,IAAI,CAACe,kBAAkB,IAAI;YACrDC,WAAW;QACb;QAEAZ,MAAMa,IAAI,CAAC;QACX,OAAO;YACLX,YAAYjB,gBAAgBiB;YAC5BY,WAAWb;QACb;IACF;AACF,GAAG"}
@@ -0,0 +1,2 @@
1
+ export declare const createE2eWorkspaceRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=create-workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-workspace.d.ts","sourceRoot":"","sources":["../../../src/presentation/e2eRoutes/create-workspace.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,uBAAuB,iDAqBlC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { e2eCreateWorkspaceBodySchema, e2eCreateWorkspaceResponseSchema } from '@shipfox/api-workspaces-dto';
2
+ import { defineRoute } from '@shipfox/node-fastify';
3
+ import { createWorkspaceForUser } from '#core/index.js';
4
+ import { toWorkspaceDto } from '#presentation/dto/index.js';
5
+ export const createE2eWorkspaceRoute = defineRoute({
6
+ method: 'POST',
7
+ path: '/',
8
+ description: 'Create a workspace for an existing user for E2E tests.',
9
+ schema: {
10
+ body: e2eCreateWorkspaceBodySchema,
11
+ response: {
12
+ 201: e2eCreateWorkspaceResponseSchema
13
+ }
14
+ },
15
+ handler: async (request, reply)=>{
16
+ const workspace = await createWorkspaceForUser({
17
+ name: request.body.name,
18
+ userId: request.body.user_id,
19
+ userEmail: request.body.user_email,
20
+ userName: request.body.user_name
21
+ });
22
+ reply.code(201);
23
+ return toWorkspaceDto(workspace);
24
+ }
25
+ });
26
+
27
+ //# sourceMappingURL=create-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/e2eRoutes/create-workspace.ts"],"sourcesContent":["import {\n e2eCreateWorkspaceBodySchema,\n e2eCreateWorkspaceResponseSchema,\n} from '@shipfox/api-workspaces-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {createWorkspaceForUser} from '#core/index.js';\nimport {toWorkspaceDto} from '#presentation/dto/index.js';\n\nexport const createE2eWorkspaceRoute = defineRoute({\n method: 'POST',\n path: '/',\n description: 'Create a workspace for an existing user for E2E tests.',\n schema: {\n body: e2eCreateWorkspaceBodySchema,\n response: {\n 201: e2eCreateWorkspaceResponseSchema,\n },\n },\n handler: async (request, reply) => {\n const workspace = await createWorkspaceForUser({\n name: request.body.name,\n userId: request.body.user_id,\n userEmail: request.body.user_email,\n userName: request.body.user_name,\n });\n\n reply.code(201);\n return toWorkspaceDto(workspace);\n },\n});\n"],"names":["e2eCreateWorkspaceBodySchema","e2eCreateWorkspaceResponseSchema","defineRoute","createWorkspaceForUser","toWorkspaceDto","createE2eWorkspaceRoute","method","path","description","schema","body","response","handler","request","reply","workspace","name","userId","user_id","userEmail","user_email","userName","user_name","code"],"mappings":"AAAA,SACEA,4BAA4B,EAC5BC,gCAAgC,QAC3B,8BAA8B;AACrC,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,sBAAsB,QAAO,iBAAiB;AACtD,SAAQC,cAAc,QAAO,6BAA6B;AAE1D,OAAO,MAAMC,0BAA0BH,YAAY;IACjDI,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMV;QACNW,UAAU;YACR,KAAKV;QACP;IACF;IACAW,SAAS,OAAOC,SAASC;QACvB,MAAMC,YAAY,MAAMZ,uBAAuB;YAC7Ca,MAAMH,QAAQH,IAAI,CAACM,IAAI;YACvBC,QAAQJ,QAAQH,IAAI,CAACQ,OAAO;YAC5BC,WAAWN,QAAQH,IAAI,CAACU,UAAU;YAClCC,UAAUR,QAAQH,IAAI,CAACY,SAAS;QAClC;QAEAR,MAAMS,IAAI,CAAC;QACX,OAAOnB,eAAeW;IACxB;AACF,GAAG"}
@@ -0,0 +1,3 @@
1
+ import type { RouteGroup } from '@shipfox/node-fastify';
2
+ export declare const workspacesE2eRoutes: RouteGroup;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/e2eRoutes/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAItD,eAAO,MAAM,mBAAmB,EAAE,UAGjC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { createE2eInvitationRoute } from './create-invitation.js';
2
+ import { createE2eWorkspaceRoute } from './create-workspace.js';
3
+ export const workspacesE2eRoutes = {
4
+ prefix: '/workspaces',
5
+ routes: [
6
+ createE2eWorkspaceRoute,
7
+ createE2eInvitationRoute
8
+ ]
9
+ };
10
+
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/e2eRoutes/index.ts"],"sourcesContent":["import type {RouteGroup} from '@shipfox/node-fastify';\nimport {createE2eInvitationRoute} from './create-invitation.js';\nimport {createE2eWorkspaceRoute} from './create-workspace.js';\n\nexport const workspacesE2eRoutes: RouteGroup = {\n prefix: '/workspaces',\n routes: [createE2eWorkspaceRoute, createE2eInvitationRoute],\n};\n"],"names":["createE2eInvitationRoute","createE2eWorkspaceRoute","workspacesE2eRoutes","prefix","routes"],"mappings":"AACA,SAAQA,wBAAwB,QAAO,yBAAyB;AAChE,SAAQC,uBAAuB,QAAO,wBAAwB;AAE9D,OAAO,MAAMC,sBAAkC;IAC7CC,QAAQ;IACRC,QAAQ;QAACH;QAAyBD;KAAyB;AAC7D,EAAE"}
@@ -0,0 +1,2 @@
1
+ export { workspacesRoutes as routes } from './routes/index.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presentation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,IAAI,MAAM,EAAC,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { workspacesRoutes as routes } from './routes/index.js';
2
+
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/presentation/index.ts"],"sourcesContent":["export {workspacesRoutes as routes} from './routes/index.js';\n"],"names":["workspacesRoutes","routes"],"mappings":"AAAA,SAAQA,oBAAoBC,MAAM,QAAO,oBAAoB"}
@@ -0,0 +1,3 @@
1
+ import type { RouteGroup } from '@shipfox/node-fastify';
2
+ export declare const workspacesRoutes: RouteGroup[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAKtD,eAAO,MAAM,gBAAgB,EAAE,UAAU,EAiBxC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { invitationsAcceptGroup, invitationsWorkspaceScopedRoutes } from './invitations/index.js';
2
+ import { memberRoutes } from './members/index.js';
3
+ import { createWorkspaceRoute, listUserWorkspacesRoute } from './workspaces/index.js';
4
+ export const workspacesRoutes = [
5
+ invitationsAcceptGroup,
6
+ {
7
+ prefix: '/workspaces',
8
+ routes: [
9
+ listUserWorkspacesRoute,
10
+ createWorkspaceRoute,
11
+ {
12
+ prefix: '/:workspaceId/members',
13
+ routes: memberRoutes
14
+ },
15
+ {
16
+ prefix: '/:workspaceId/invitations',
17
+ routes: invitationsWorkspaceScopedRoutes
18
+ }
19
+ ]
20
+ }
21
+ ];
22
+
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/routes/index.ts"],"sourcesContent":["import type {RouteGroup} from '@shipfox/node-fastify';\nimport {invitationsAcceptGroup, invitationsWorkspaceScopedRoutes} from './invitations/index.js';\nimport {memberRoutes} from './members/index.js';\nimport {createWorkspaceRoute, listUserWorkspacesRoute} from './workspaces/index.js';\n\nexport const workspacesRoutes: RouteGroup[] = [\n invitationsAcceptGroup,\n {\n prefix: '/workspaces',\n routes: [\n listUserWorkspacesRoute,\n createWorkspaceRoute,\n {\n prefix: '/:workspaceId/members',\n routes: memberRoutes,\n },\n {\n prefix: '/:workspaceId/invitations',\n routes: invitationsWorkspaceScopedRoutes,\n },\n ],\n },\n];\n"],"names":["invitationsAcceptGroup","invitationsWorkspaceScopedRoutes","memberRoutes","createWorkspaceRoute","listUserWorkspacesRoute","workspacesRoutes","prefix","routes"],"mappings":"AACA,SAAQA,sBAAsB,EAAEC,gCAAgC,QAAO,yBAAyB;AAChG,SAAQC,YAAY,QAAO,qBAAqB;AAChD,SAAQC,oBAAoB,EAAEC,uBAAuB,QAAO,wBAAwB;AAEpF,OAAO,MAAMC,mBAAiC;IAC5CL;IACA;QACEM,QAAQ;QACRC,QAAQ;YACNH;YACAD;YACA;gBACEG,QAAQ;gBACRC,QAAQL;YACV;YACA;gBACEI,QAAQ;gBACRC,QAAQN;YACV;SACD;IACH;CACD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const acceptInvitationRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=accept.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accept.d.ts","sourceRoot":"","sources":["../../../../src/presentation/routes/invitations/accept.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,qBAAqB,iDAuDhC,CAAC"}