@ameshkin/ticket-mate 0.1.21 → 0.1.23

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 (129) hide show
  1. package/package.json +2 -1
  2. package/public/acceptance-criteria/file-discovery.js +1 -1
  3. package/public/acceptance-criteria/file-discovery.js.map +1 -1
  4. package/public/cli/commands/env-debug.js +1 -1
  5. package/public/cli/commands/env-debug.js.map +1 -1
  6. package/public/cli/commands/init-repo.js +1 -1
  7. package/public/cli/commands/init-repo.js.map +1 -1
  8. package/public/cli/commands/status.js +1 -1
  9. package/public/cli/commands/status.js.map +1 -1
  10. package/public/cli/commands/superadmin.d.ts +9 -0
  11. package/public/cli/commands/superadmin.d.ts.map +1 -0
  12. package/public/cli/commands/superadmin.js +17 -0
  13. package/public/cli/commands/superadmin.js.map +1 -0
  14. package/public/cli/commands/test-workflow.js +1 -1
  15. package/public/cli/commands/test-workflow.js.map +1 -1
  16. package/public/cli/commands/webhook-setup.d.ts +8 -0
  17. package/public/cli/commands/webhook-setup.d.ts.map +1 -0
  18. package/public/cli/commands/webhook-setup.js +92 -0
  19. package/public/cli/commands/webhook-setup.js.map +1 -0
  20. package/public/cli/commands/webhooks-debug.js +1 -1
  21. package/public/cli/commands/webhooks-debug.js.map +1 -1
  22. package/public/cli/index.js +5 -0
  23. package/public/cli/index.js.map +1 -1
  24. package/public/cli/utils/get-cli-client.d.ts.map +1 -1
  25. package/public/cli/utils/get-cli-client.js +2 -1
  26. package/public/cli/utils/get-cli-client.js.map +1 -1
  27. package/public/config/config-loader.js +2 -2
  28. package/public/config/config-loader.js.map +1 -1
  29. package/public/config/config-wizard.js +1 -1
  30. package/public/config/config-wizard.js.map +1 -1
  31. package/public/config/config.js +1 -1
  32. package/public/config/config.js.map +1 -1
  33. package/public/config/jiraConnection.d.ts +3 -3
  34. package/public/config/jiraConnection.d.ts.map +1 -1
  35. package/public/config/jiraConnection.js +47 -41
  36. package/public/config/jiraConnection.js.map +1 -1
  37. package/public/config/pricing.d.ts +2 -2
  38. package/public/config/pricing.d.ts.map +1 -1
  39. package/public/config/pricing.js +164 -50
  40. package/public/config/pricing.js.map +1 -1
  41. package/public/config/project-mapping.js +1 -1
  42. package/public/config/project-mapping.js.map +1 -1
  43. package/public/fast-tasks/storage.d.ts +3 -2
  44. package/public/fast-tasks/storage.d.ts.map +1 -1
  45. package/public/fast-tasks/storage.js +24 -17
  46. package/public/fast-tasks/storage.js.map +1 -1
  47. package/public/jira-management/projects.d.ts.map +1 -1
  48. package/public/jira-management/projects.js +15 -13
  49. package/public/jira-management/projects.js.map +1 -1
  50. package/public/lib/auth/options.d.ts +0 -11
  51. package/public/lib/auth/options.d.ts.map +1 -1
  52. package/public/lib/auth/options.js +180 -698
  53. package/public/lib/auth/options.js.map +1 -1
  54. package/public/lib/dashboard-widgets.d.ts +2 -2
  55. package/public/lib/dashboard-widgets.d.ts.map +1 -1
  56. package/public/lib/dashboard-widgets.js +33 -33
  57. package/public/lib/dashboard-widgets.js.map +1 -1
  58. package/public/lib/docs.d.ts.map +1 -1
  59. package/public/lib/docs.js +5 -2
  60. package/public/lib/docs.js.map +1 -1
  61. package/public/lib/encryption.d.ts +2 -1
  62. package/public/lib/encryption.d.ts.map +1 -1
  63. package/public/lib/encryption.js +27 -20
  64. package/public/lib/encryption.js.map +1 -1
  65. package/public/lib/integrations/teams/auth.d.ts +1 -1
  66. package/public/lib/integrations/teams/auth.d.ts.map +1 -1
  67. package/public/lib/integrations/teams/auth.js +15 -15
  68. package/public/lib/integrations/teams/auth.js.map +1 -1
  69. package/public/lib/integrations/teams/transformer.d.ts.map +1 -1
  70. package/public/lib/integrations/teams/transformer.js +3 -1
  71. package/public/lib/integrations/teams/transformer.js.map +1 -1
  72. package/public/lib/invite/accept.d.ts +1 -0
  73. package/public/lib/invite/accept.d.ts.map +1 -1
  74. package/public/lib/invite/accept.js +22 -33
  75. package/public/lib/invite/accept.js.map +1 -1
  76. package/public/lib/invite/service.d.ts.map +1 -1
  77. package/public/lib/invite/service.js +7 -0
  78. package/public/lib/invite/service.js.map +1 -1
  79. package/public/lib/invite/types.d.ts +1 -0
  80. package/public/lib/invite/types.d.ts.map +1 -1
  81. package/public/lib/markdown/fallback-handler.js +2 -2
  82. package/public/lib/markdown/fallback-handler.js.map +1 -1
  83. package/public/lib/notifications.d.ts +1 -1
  84. package/public/lib/notifications.d.ts.map +1 -1
  85. package/public/lib/notifications.js +24 -7
  86. package/public/lib/notifications.js.map +1 -1
  87. package/public/lib/prisma.d.ts +5 -22
  88. package/public/lib/prisma.d.ts.map +1 -1
  89. package/public/lib/prisma.js +14 -132
  90. package/public/lib/prisma.js.map +1 -1
  91. package/public/lib/projects.d.ts +2 -2
  92. package/public/lib/webhook-events-store.d.ts +5 -6
  93. package/public/lib/webhook-events-store.d.ts.map +1 -1
  94. package/public/lib/webhook-events-store.js +63 -18
  95. package/public/lib/webhook-events-store.js.map +1 -1
  96. package/public/server/account/account.service.d.ts +217 -0
  97. package/public/server/account/account.service.d.ts.map +1 -0
  98. package/public/server/account/account.service.js +307 -0
  99. package/public/server/account/account.service.js.map +1 -0
  100. package/public/server/jira/jiraClient.d.ts +2 -1
  101. package/public/server/jira/jiraClient.d.ts.map +1 -1
  102. package/public/server/jira/jiraClient.js +4 -3
  103. package/public/server/jira/jiraClient.js.map +1 -1
  104. package/public/server/jira/tokens.d.ts.map +1 -1
  105. package/public/server/jira/tokens.js +0 -9
  106. package/public/server/jira/tokens.js.map +1 -1
  107. package/public/types/github.d.ts +18 -0
  108. package/public/types/github.d.ts.map +1 -0
  109. package/public/types/github.js +2 -0
  110. package/public/types/github.js.map +1 -0
  111. package/public/utils/adf.d.ts.map +1 -1
  112. package/public/utils/adf.js +2 -1
  113. package/public/utils/adf.js.map +1 -1
  114. package/public/utils/parseJiraError.d.ts +39 -0
  115. package/public/utils/parseJiraError.d.ts.map +1 -0
  116. package/public/utils/parseJiraError.js +70 -0
  117. package/public/utils/parseJiraError.js.map +1 -0
  118. package/public/utils/validation.d.ts.map +1 -1
  119. package/public/utils/validation.js +20 -20
  120. package/public/utils/validation.js.map +1 -1
  121. package/scripts/cli-wrapper.mjs +1 -0
  122. package/public/server/auth/account-provisioning.d.ts +0 -16
  123. package/public/server/auth/account-provisioning.d.ts.map +0 -1
  124. package/public/server/auth/account-provisioning.js +0 -109
  125. package/public/server/auth/account-provisioning.js.map +0 -1
  126. package/public/server/auth/atlassian-user-mapping.d.ts +0 -36
  127. package/public/server/auth/atlassian-user-mapping.d.ts.map +0 -1
  128. package/public/server/auth/atlassian-user-mapping.js +0 -97
  129. package/public/server/auth/atlassian-user-mapping.js.map +0 -1
@@ -1,13 +1,13 @@
1
- /**
2
- * Shared webhook events store
3
- * Used by both /api/webhooks/jira and /api/webhooks/events
4
- */
5
- let webhookEvents = [];
6
- const MAX_EVENTS = 100; // Keep last 100 events
7
- export function addWebhookEvent(event) {
1
+ import { prisma } from "@/lib/prisma";
2
+ // In-memory fallback if DB fails or for non-critical reads
3
+ let memoryEvents = [];
4
+ const MAX_EVENTS = 100;
5
+ export async function addWebhookEvent(event) {
6
+ const id = event.id || `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
7
+ const timestamp = event.timestamp ? new Date(event.timestamp) : new Date();
8
8
  const fullEvent = {
9
- id: event.id || `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
10
- timestamp: event.timestamp || new Date().toISOString(),
9
+ id,
10
+ timestamp: timestamp.toISOString(),
11
11
  webhookEvent: event.webhookEvent || "unknown",
12
12
  issueKey: event.issueKey,
13
13
  issueType: event.issueType,
@@ -18,22 +18,67 @@ export function addWebhookEvent(event) {
18
18
  direction: event.direction || "INCOMING",
19
19
  rawPayload: event.rawPayload,
20
20
  changelog: event.changelog,
21
+ result: event.result,
22
+ errorMessage: event.errorMessage,
23
+ workflowId: event.workflowId || 'manual',
21
24
  };
22
- // Add to beginning of array (newest first)
23
- webhookEvents.unshift(fullEvent);
24
- // Keep only last MAX_EVENTS
25
- if (webhookEvents.length > MAX_EVENTS) {
26
- webhookEvents = webhookEvents.slice(0, MAX_EVENTS);
25
+ // 1. Try to save to Prisma
26
+ try {
27
+ await prisma.webhookEvent.create({
28
+ data: {
29
+ id: fullEvent.id,
30
+ receivedAt: timestamp,
31
+ payload: event.rawPayload || event || {},
32
+ headers: {}, // Not passed usually
33
+ result: fullEvent.result || 'Accepted',
34
+ workflowId: fullEvent.workflowId || 'manual',
35
+ errorMessage: fullEvent.errorMessage,
36
+ // message field removed as it's not in schema usually, relying on standard fields
37
+ }
38
+ });
39
+ }
40
+ catch (err) {
41
+ console.error('Failed to save webhook to DB:', err);
42
+ // Fallback to memory
43
+ }
44
+ // 2. Update memory cache (optional, or for immediate feedback if polling usage)
45
+ memoryEvents.unshift(fullEvent);
46
+ if (memoryEvents.length > MAX_EVENTS) {
47
+ memoryEvents = memoryEvents.slice(0, MAX_EVENTS);
27
48
  }
28
49
  return fullEvent;
29
50
  }
30
- export function getWebhookEvents() {
31
- return webhookEvents;
51
+ export async function getWebhookEvents() {
52
+ try {
53
+ const dbEvents = await prisma.webhookEvent.findMany({
54
+ orderBy: { createdAt: 'desc' },
55
+ take: MAX_EVENTS
56
+ });
57
+ return dbEvents.map(e => {
58
+ const payload = e.payload;
59
+ return {
60
+ id: e.id,
61
+ timestamp: e.receivedAt.toISOString(),
62
+ webhookEvent: payload.webhookEvent || 'unknown',
63
+ issueKey: payload.issue?.key,
64
+ summary: payload.issue?.fields?.summary,
65
+ direction: 'INCOMING',
66
+ rawPayload: payload,
67
+ result: e.result
68
+ };
69
+ });
70
+ }
71
+ catch (err) {
72
+ console.warn('Failed to fetch from DB, using memory:', err);
73
+ return memoryEvents;
74
+ }
32
75
  }
33
76
  export function clearWebhookEvents() {
34
- webhookEvents = [];
77
+ memoryEvents = [];
78
+ // Also clear DB?
79
+ // prisma.webhookEvent.deleteMany({}).catch(console.error);
35
80
  }
36
81
  export function getWebhookEventsCount() {
37
- return webhookEvents.length;
82
+ return memoryEvents.length; // Approximate
38
83
  }
39
84
  //# sourceMappingURL=webhook-events-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-events-store.js","sourceRoot":"","sources":["../../src/lib/webhook-events-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,IAAI,aAAa,GAAmB,EAAE,CAAC;AACvC,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,uBAAuB;AAE/C,MAAM,UAAU,eAAe,CAAC,KAA4B;IAC1D,MAAM,SAAS,GAAiB;QAC9B,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QAC1E,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACtD,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,SAAS;QAC7C,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,UAAU;QACxC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC;IAEF,2CAA2C;IAC3C,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEjC,4BAA4B;IAC5B,IAAI,aAAa,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QACtC,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,aAAa,GAAG,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,aAAa,CAAC,MAAM,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"webhook-events-store.js","sourceRoot":"","sources":["../../src/lib/webhook-events-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Account Service
3
+ *
4
+ * Manages accounts, account users, and seat limits
5
+ * Multi-tenant seat system: $5 per seat
6
+ */
7
+ export type AccountPlan = 'starter' | 'pro' | 'enterprise';
8
+ export interface SeatUsage {
9
+ used: number;
10
+ max: number;
11
+ canAdd: boolean;
12
+ }
13
+ export declare const AccountService: {
14
+ /**
15
+ * Get account for a user
16
+ */
17
+ getAccountForUser(userId: string): Promise<{
18
+ name: string;
19
+ id: string;
20
+ createdAt: Date;
21
+ updatedAt: Date;
22
+ stripeCustomerId: string | null;
23
+ slug: string;
24
+ plan: string;
25
+ maxSeats: number;
26
+ } | null>;
27
+ /**
28
+ * Get account user record for a user
29
+ */
30
+ getAccountUser(userId: string, accountId?: string): Promise<({
31
+ user: {
32
+ name: string | null;
33
+ id: string;
34
+ email: string;
35
+ hashedPassword: string | null;
36
+ emailVerified: Date | null;
37
+ subscription: string;
38
+ defaultJiraProjectKey: string | null;
39
+ defaultAiModel: string | null;
40
+ createdAt: Date;
41
+ updatedAt: Date;
42
+ hostingTarget: string | null;
43
+ phoneNumber: string | null;
44
+ timeZone: string | null;
45
+ locale: string | null;
46
+ isNewUser: boolean;
47
+ onboardingStep: number;
48
+ };
49
+ account: {
50
+ name: string;
51
+ id: string;
52
+ createdAt: Date;
53
+ updatedAt: Date;
54
+ stripeCustomerId: string | null;
55
+ slug: string;
56
+ plan: string;
57
+ maxSeats: number;
58
+ };
59
+ } & {
60
+ id: string;
61
+ createdAt: Date;
62
+ updatedAt: Date;
63
+ userId: string;
64
+ accountId: string;
65
+ role: string;
66
+ active: boolean;
67
+ }) | null>;
68
+ /**
69
+ * List all users in an account
70
+ */
71
+ listUsers(accountId: string): Promise<({
72
+ user: {
73
+ name: string | null;
74
+ id: string;
75
+ email: string;
76
+ createdAt: Date;
77
+ };
78
+ } & {
79
+ id: string;
80
+ createdAt: Date;
81
+ updatedAt: Date;
82
+ userId: string;
83
+ accountId: string;
84
+ role: string;
85
+ active: boolean;
86
+ })[]>;
87
+ /**
88
+ * Check if account can add another seat
89
+ */
90
+ canAddSeat(accountId: string): Promise<boolean>;
91
+ /**
92
+ * Get seat usage for an account
93
+ */
94
+ getSeatUsage(accountId: string): Promise<SeatUsage>;
95
+ /**
96
+ * Add user to account (enforces seat limits)
97
+ */
98
+ addUserToAccount(accountId: string, userId: string, role?: "OWNER" | "ADMIN" | "MEMBER"): Promise<{
99
+ id: string;
100
+ createdAt: Date;
101
+ updatedAt: Date;
102
+ userId: string;
103
+ accountId: string;
104
+ role: string;
105
+ active: boolean;
106
+ }>;
107
+ /**
108
+ * Remove user from account (deactivate)
109
+ */
110
+ removeUserFromAccount(accountId: string, userId: string): Promise<{
111
+ id: string;
112
+ createdAt: Date;
113
+ updatedAt: Date;
114
+ userId: string;
115
+ accountId: string;
116
+ role: string;
117
+ active: boolean;
118
+ }>;
119
+ /**
120
+ * Update account plan and recalculate maxSeats
121
+ */
122
+ updateAccountPlan(accountId: string, plan: AccountPlan): Promise<{
123
+ name: string;
124
+ id: string;
125
+ createdAt: Date;
126
+ updatedAt: Date;
127
+ stripeCustomerId: string | null;
128
+ slug: string;
129
+ plan: string;
130
+ maxSeats: number;
131
+ }>;
132
+ /**
133
+ * Create a new account
134
+ */
135
+ createAccount(name: string, slug: string, plan: AccountPlan | undefined, ownerUserId: string): Promise<{
136
+ users: ({
137
+ user: {
138
+ name: string | null;
139
+ id: string;
140
+ email: string;
141
+ hashedPassword: string | null;
142
+ emailVerified: Date | null;
143
+ subscription: string;
144
+ defaultJiraProjectKey: string | null;
145
+ defaultAiModel: string | null;
146
+ createdAt: Date;
147
+ updatedAt: Date;
148
+ hostingTarget: string | null;
149
+ phoneNumber: string | null;
150
+ timeZone: string | null;
151
+ locale: string | null;
152
+ isNewUser: boolean;
153
+ onboardingStep: number;
154
+ };
155
+ } & {
156
+ id: string;
157
+ createdAt: Date;
158
+ updatedAt: Date;
159
+ userId: string;
160
+ accountId: string;
161
+ role: string;
162
+ active: boolean;
163
+ })[];
164
+ } & {
165
+ name: string;
166
+ id: string;
167
+ createdAt: Date;
168
+ updatedAt: Date;
169
+ stripeCustomerId: string | null;
170
+ slug: string;
171
+ plan: string;
172
+ maxSeats: number;
173
+ }>;
174
+ /**
175
+ * Get account by ID
176
+ */
177
+ getAccountById(accountId: string): Promise<({
178
+ users: ({
179
+ user: {
180
+ name: string | null;
181
+ id: string;
182
+ email: string;
183
+ };
184
+ } & {
185
+ id: string;
186
+ createdAt: Date;
187
+ updatedAt: Date;
188
+ userId: string;
189
+ accountId: string;
190
+ role: string;
191
+ active: boolean;
192
+ })[];
193
+ } & {
194
+ name: string;
195
+ id: string;
196
+ createdAt: Date;
197
+ updatedAt: Date;
198
+ stripeCustomerId: string | null;
199
+ slug: string;
200
+ plan: string;
201
+ maxSeats: number;
202
+ }) | null>;
203
+ /**
204
+ * Update account maxSeats (for seat purchases)
205
+ */
206
+ updateAccountSeats(accountId: string, newMaxSeats: number): Promise<{
207
+ name: string;
208
+ id: string;
209
+ createdAt: Date;
210
+ updatedAt: Date;
211
+ stripeCustomerId: string | null;
212
+ slug: string;
213
+ plan: string;
214
+ maxSeats: number;
215
+ }>;
216
+ };
217
+ //# sourceMappingURL=account.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.service.d.ts","sourceRoot":"","sources":["../../../src/server/account/account.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,KAAK,GAAG,YAAY,CAAC;AAE3D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,eAAO,MAAM,cAAc;IACzB;;OAEG;8BAC6B,MAAM;;;;;;;;;;IActC;;OAEG;2BAC0B,MAAM,cAAc,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4BvD;;OAEG;yBACwB,MAAM;;;;;;;;;;;;;;;;IAsBjC;;OAEG;0BACyB,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrD;;OAEG;4BAC2B,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IA0BzD;;OAEG;gCAEU,MAAM,UACT,MAAM,SACR,OAAO,GAAG,OAAO,GAAG,QAAQ;;;;;;;;;IAqDpC;;OAEG;qCACoC,MAAM,UAAU,MAAM;;;;;;;;;IA4C7D;;OAEG;iCACgC,MAAM,QAAQ,WAAW;;;;;;;;;;IAmB5D;;OAEG;wBAEK,MAAM,QACN,MAAM,QACN,WAAW,2BACJ,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqCrB;;OAEG;8BAC6B,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;IAoBtC;;OAEG;kCACiC,MAAM,eAAe,MAAM;;;;;;;;;;CAuBhE,CAAC"}
@@ -0,0 +1,307 @@
1
+ /**
2
+ * Account Service
3
+ *
4
+ * Manages accounts, account users, and seat limits
5
+ * Multi-tenant seat system: $5 per seat
6
+ */
7
+ import { prisma } from '@/lib/prisma';
8
+ import { getPlan } from '@/config/pricing';
9
+ export const AccountService = {
10
+ /**
11
+ * Get account for a user
12
+ */
13
+ async getAccountForUser(userId) {
14
+ const accountUser = await prisma.accountUser.findFirst({
15
+ where: {
16
+ userId,
17
+ active: true,
18
+ },
19
+ include: {
20
+ account: true,
21
+ },
22
+ });
23
+ return accountUser?.account || null;
24
+ },
25
+ /**
26
+ * Get account user record for a user
27
+ */
28
+ async getAccountUser(userId, accountId) {
29
+ if (accountId) {
30
+ return prisma.accountUser.findUnique({
31
+ where: {
32
+ accountId_userId: {
33
+ accountId,
34
+ userId,
35
+ },
36
+ },
37
+ include: {
38
+ account: true,
39
+ user: true,
40
+ },
41
+ });
42
+ }
43
+ return prisma.accountUser.findFirst({
44
+ where: {
45
+ userId,
46
+ active: true,
47
+ },
48
+ include: {
49
+ account: true,
50
+ user: true,
51
+ },
52
+ });
53
+ },
54
+ /**
55
+ * List all users in an account
56
+ */
57
+ async listUsers(accountId) {
58
+ return prisma.accountUser.findMany({
59
+ where: {
60
+ accountId,
61
+ active: true,
62
+ },
63
+ include: {
64
+ user: {
65
+ select: {
66
+ id: true,
67
+ email: true,
68
+ name: true,
69
+ createdAt: true,
70
+ },
71
+ },
72
+ },
73
+ orderBy: {
74
+ createdAt: 'asc',
75
+ },
76
+ });
77
+ },
78
+ /**
79
+ * Check if account can add another seat
80
+ */
81
+ async canAddSeat(accountId) {
82
+ const account = await prisma.tenantAccount.findUnique({
83
+ where: { id: accountId },
84
+ });
85
+ if (!account)
86
+ return false;
87
+ const usage = await this.getSeatUsage(accountId);
88
+ return usage.canAdd;
89
+ },
90
+ /**
91
+ * Get seat usage for an account
92
+ */
93
+ async getSeatUsage(accountId) {
94
+ const account = await prisma.tenantAccount.findUnique({
95
+ where: { id: accountId },
96
+ });
97
+ if (!account) {
98
+ return { used: 0, max: 1, canAdd: false };
99
+ }
100
+ const activeUsers = await prisma.accountUser.count({
101
+ where: {
102
+ accountId,
103
+ active: true,
104
+ },
105
+ });
106
+ const maxSeats = account.maxSeats;
107
+ const canAdd = activeUsers < maxSeats;
108
+ return {
109
+ used: activeUsers,
110
+ max: maxSeats,
111
+ canAdd,
112
+ };
113
+ },
114
+ /**
115
+ * Add user to account (enforces seat limits)
116
+ */
117
+ async addUserToAccount(accountId, userId, role = 'MEMBER') {
118
+ // Check if user is already in account
119
+ const existing = await prisma.accountUser.findUnique({
120
+ where: {
121
+ accountId_userId: {
122
+ accountId,
123
+ userId,
124
+ },
125
+ },
126
+ });
127
+ if (existing) {
128
+ // Reactivate if inactive
129
+ if (!existing.active) {
130
+ return prisma.accountUser.update({
131
+ where: {
132
+ accountId_userId: {
133
+ accountId,
134
+ userId,
135
+ },
136
+ },
137
+ data: {
138
+ active: true,
139
+ role,
140
+ updatedAt: new Date(),
141
+ },
142
+ });
143
+ }
144
+ return existing;
145
+ }
146
+ // Check seat limits
147
+ const canAdd = await this.canAddSeat(accountId);
148
+ if (!canAdd) {
149
+ throw new Error('Cannot add user: account has reached seat limit');
150
+ }
151
+ // Add user to account
152
+ return prisma.accountUser.create({
153
+ data: {
154
+ accountId,
155
+ userId,
156
+ role,
157
+ active: true,
158
+ },
159
+ include: {
160
+ account: true,
161
+ user: true,
162
+ },
163
+ });
164
+ },
165
+ /**
166
+ * Remove user from account (deactivate)
167
+ */
168
+ async removeUserFromAccount(accountId, userId) {
169
+ const accountUser = await prisma.accountUser.findUnique({
170
+ where: {
171
+ accountId_userId: {
172
+ accountId,
173
+ userId,
174
+ },
175
+ },
176
+ });
177
+ if (!accountUser) {
178
+ throw new Error('User not found in account');
179
+ }
180
+ // Don't allow removing the last owner
181
+ if (accountUser.role === 'OWNER') {
182
+ const ownerCount = await prisma.accountUser.count({
183
+ where: {
184
+ accountId,
185
+ role: 'OWNER',
186
+ active: true,
187
+ },
188
+ });
189
+ if (ownerCount === 1) {
190
+ throw new Error('Cannot remove the last owner from account');
191
+ }
192
+ }
193
+ // Deactivate instead of delete (soft delete)
194
+ return prisma.accountUser.update({
195
+ where: {
196
+ accountId_userId: {
197
+ accountId,
198
+ userId,
199
+ },
200
+ },
201
+ data: {
202
+ active: false,
203
+ updatedAt: new Date(),
204
+ },
205
+ });
206
+ },
207
+ /**
208
+ * Update account plan and recalculate maxSeats
209
+ */
210
+ async updateAccountPlan(accountId, plan) {
211
+ const planConfig = getPlan(plan);
212
+ if (!planConfig) {
213
+ throw new Error(`Invalid plan: ${plan}`);
214
+ }
215
+ // Use maxSeats from plan config, default to 1 for basic
216
+ const maxSeats = planConfig.maxSeats || 1;
217
+ return prisma.tenantAccount.update({
218
+ where: { id: accountId },
219
+ data: {
220
+ plan,
221
+ maxSeats,
222
+ updatedAt: new Date(),
223
+ },
224
+ });
225
+ },
226
+ /**
227
+ * Create a new account
228
+ */
229
+ async createAccount(name, slug, plan = 'starter', ownerUserId) {
230
+ const planConfig = getPlan(plan);
231
+ if (!planConfig) {
232
+ throw new Error(`Invalid plan: ${plan}`);
233
+ }
234
+ // Use maxSeats from plan config, default to 1 for basic
235
+ const maxSeats = planConfig.maxSeats || 1;
236
+ // Create account and add owner
237
+ const account = await prisma.tenantAccount.create({
238
+ data: {
239
+ name,
240
+ slug,
241
+ plan,
242
+ maxSeats,
243
+ users: {
244
+ create: {
245
+ userId: ownerUserId,
246
+ role: 'OWNER',
247
+ active: true,
248
+ },
249
+ },
250
+ },
251
+ include: {
252
+ users: {
253
+ include: {
254
+ user: true,
255
+ },
256
+ },
257
+ },
258
+ });
259
+ return account;
260
+ },
261
+ /**
262
+ * Get account by ID
263
+ */
264
+ async getAccountById(accountId) {
265
+ return prisma.tenantAccount.findUnique({
266
+ where: { id: accountId },
267
+ include: {
268
+ users: {
269
+ where: { active: true },
270
+ include: {
271
+ user: {
272
+ select: {
273
+ id: true,
274
+ email: true,
275
+ name: true,
276
+ },
277
+ },
278
+ },
279
+ },
280
+ },
281
+ });
282
+ },
283
+ /**
284
+ * Update account maxSeats (for seat purchases)
285
+ */
286
+ async updateAccountSeats(accountId, newMaxSeats) {
287
+ const account = await prisma.tenantAccount.findUnique({
288
+ where: { id: accountId },
289
+ });
290
+ if (!account) {
291
+ throw new Error('Account not found');
292
+ }
293
+ // Don't allow reducing seats below current active users
294
+ const usage = await this.getSeatUsage(accountId);
295
+ if (newMaxSeats < usage.used) {
296
+ throw new Error(`Cannot reduce seats below ${usage.used} active users`);
297
+ }
298
+ return prisma.tenantAccount.update({
299
+ where: { id: accountId },
300
+ data: {
301
+ maxSeats: newMaxSeats,
302
+ updatedAt: new Date(),
303
+ },
304
+ });
305
+ },
306
+ };
307
+ //# sourceMappingURL=account.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.service.js","sourceRoot":"","sources":["../../../src/server/account/account.service.ts"],"names":[],"mappings":"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"}
@@ -53,9 +53,10 @@ export interface JiraClient {
53
53
  /**
54
54
  * Create Jira client from OAuth token
55
55
  */
56
- export declare function createJiraOAuthClient({ baseUrl, accessToken, }: {
56
+ export declare function createJiraOAuthClient({ baseUrl, accessToken, siteUrl, }: {
57
57
  baseUrl: string;
58
58
  accessToken: string;
59
+ siteUrl?: string | null;
59
60
  }): JiraClient;
60
61
  /**
61
62
  * Create Jira client from PAT (Basic Auth)
@@ -1 +1 @@
1
- {"version":3,"file":"jiraClient.d.ts","sourceRoot":"","sources":["../../../src/server/jira/jiraClient.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAE3D;;OAEG;IACH,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEjD;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEhD;;OAEG;IACH,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEpC;;OAEG;IACH,UAAU,IAAI,MAAM,CAAC;IAErB;;OAEG;IACH,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEzC;;OAEG;IACH,WAAW,IAAI,OAAO,GAAG,KAAK,CAAC;IAE/B;;OAEG;IACH,UAAU,IAAI,MAAM,GAAG,SAAS,CAAC;IAEjC;;;OAGG;IACH,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,OAAO,EACP,WAAW,GACZ,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,UAAU,CAgJb;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,KAAK,EACL,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,UAAU,CAkGb;AAsBD;;;;;;;;;;GAUG;AACH;;;GAGG;AACH,eAAO,MAAM,aAAa,QACZ,eAAe,KAAG,OAAO,CAAC,UAAU,CAGjD,CAAC"}
1
+ {"version":3,"file":"jiraClient.d.ts","sourceRoot":"","sources":["../../../src/server/jira/jiraClient.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAE3D;;OAEG;IACH,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEjD;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEhD;;OAEG;IACH,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEpC;;OAEG;IACH,UAAU,IAAI,MAAM,CAAC;IAErB;;OAEG;IACH,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEzC;;OAEG;IACH,WAAW,IAAI,OAAO,GAAG,KAAK,CAAC;IAE/B;;OAEG;IACH,UAAU,IAAI,MAAM,GAAG,SAAS,CAAC;IAEjC;;;OAGG;IACH,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,OAAO,EACP,WAAW,EACX,OAAO,GACR,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,GAAG,UAAU,CAgJb;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,KAAK,EACL,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,UAAU,CAkGb;AAsBD;;;;;;;;;;GAUG;AACH;;;GAGG;AACH,eAAO,MAAM,aAAa,QACZ,eAAe,KAAG,OAAO,CAAC,UAAU,CAGjD,CAAC"}