@primocaredentgroup/elettromedicali 0.1.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 (197) hide show
  1. package/dist/client/index.d.ts +72 -0
  2. package/dist/client/index.d.ts.map +1 -0
  3. package/dist/client/index.js +233 -0
  4. package/dist/client/index.js.map +1 -0
  5. package/dist/component/_generated/api.d.ts +94 -0
  6. package/dist/component/_generated/api.d.ts.map +1 -0
  7. package/dist/component/_generated/api.js +31 -0
  8. package/dist/component/_generated/api.js.map +1 -0
  9. package/dist/component/_generated/component.d.ts +1444 -0
  10. package/dist/component/_generated/component.d.ts.map +1 -0
  11. package/dist/component/_generated/component.js +11 -0
  12. package/dist/component/_generated/component.js.map +1 -0
  13. package/dist/component/_generated/dataModel.d.ts +46 -0
  14. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  15. package/dist/component/_generated/dataModel.js +11 -0
  16. package/dist/component/_generated/dataModel.js.map +1 -0
  17. package/dist/component/_generated/server.d.ts +121 -0
  18. package/dist/component/_generated/server.d.ts.map +1 -0
  19. package/dist/component/_generated/server.js +78 -0
  20. package/dist/component/_generated/server.js.map +1 -0
  21. package/dist/component/apiKeys.d.ts +69 -0
  22. package/dist/component/apiKeys.d.ts.map +1 -0
  23. package/dist/component/apiKeys.js +207 -0
  24. package/dist/component/apiKeys.js.map +1 -0
  25. package/dist/component/clinics.d.ts +103 -0
  26. package/dist/component/clinics.d.ts.map +1 -0
  27. package/dist/component/clinics.js +126 -0
  28. package/dist/component/clinics.js.map +1 -0
  29. package/dist/component/contracts.d.ts +85 -0
  30. package/dist/component/contracts.d.ts.map +1 -0
  31. package/dist/component/contracts.js +115 -0
  32. package/dist/component/contracts.js.map +1 -0
  33. package/dist/component/convex.config.d.ts +3 -0
  34. package/dist/component/convex.config.d.ts.map +1 -0
  35. package/dist/component/convex.config.js +3 -0
  36. package/dist/component/convex.config.js.map +1 -0
  37. package/dist/component/crons.d.ts +3 -0
  38. package/dist/component/crons.d.ts.map +1 -0
  39. package/dist/component/crons.js +7 -0
  40. package/dist/component/crons.js.map +1 -0
  41. package/dist/component/dashboardStats.d.ts +14 -0
  42. package/dist/component/dashboardStats.d.ts.map +1 -0
  43. package/dist/component/dashboardStats.js +136 -0
  44. package/dist/component/dashboardStats.js.map +1 -0
  45. package/dist/component/dashboardStatsCache.d.ts +32 -0
  46. package/dist/component/dashboardStatsCache.d.ts.map +1 -0
  47. package/dist/component/dashboardStatsCache.js +129 -0
  48. package/dist/component/dashboardStatsCache.js.map +1 -0
  49. package/dist/component/deviceCategories.d.ts +108 -0
  50. package/dist/component/deviceCategories.d.ts.map +1 -0
  51. package/dist/component/deviceCategories.js +254 -0
  52. package/dist/component/deviceCategories.js.map +1 -0
  53. package/dist/component/deviceQuestions.d.ts +129 -0
  54. package/dist/component/deviceQuestions.d.ts.map +1 -0
  55. package/dist/component/deviceQuestions.js +175 -0
  56. package/dist/component/deviceQuestions.js.map +1 -0
  57. package/dist/component/deviceRepairHistory.d.ts +30 -0
  58. package/dist/component/deviceRepairHistory.d.ts.map +1 -0
  59. package/dist/component/deviceRepairHistory.js +84 -0
  60. package/dist/component/deviceRepairHistory.js.map +1 -0
  61. package/dist/component/deviceStatus.d.ts +63 -0
  62. package/dist/component/deviceStatus.d.ts.map +1 -0
  63. package/dist/component/deviceStatus.js +58 -0
  64. package/dist/component/deviceStatus.js.map +1 -0
  65. package/dist/component/devices.d.ts +299 -0
  66. package/dist/component/devices.d.ts.map +1 -0
  67. package/dist/component/devices.js +587 -0
  68. package/dist/component/devices.js.map +1 -0
  69. package/dist/component/emailHelpers.d.ts +17 -0
  70. package/dist/component/emailHelpers.d.ts.map +1 -0
  71. package/dist/component/emailHelpers.js +39 -0
  72. package/dist/component/emailHelpers.js.map +1 -0
  73. package/dist/component/emails.d.ts +56 -0
  74. package/dist/component/emails.d.ts.map +1 -0
  75. package/dist/component/emails.js +58 -0
  76. package/dist/component/emails.js.map +1 -0
  77. package/dist/component/http.d.ts +3 -0
  78. package/dist/component/http.d.ts.map +1 -0
  79. package/dist/component/http.js +229 -0
  80. package/dist/component/http.js.map +1 -0
  81. package/dist/component/maintenanceTasks.d.ts +733 -0
  82. package/dist/component/maintenanceTasks.d.ts.map +1 -0
  83. package/dist/component/maintenanceTasks.js +937 -0
  84. package/dist/component/maintenanceTasks.js.map +1 -0
  85. package/dist/component/roles.d.ts +75 -0
  86. package/dist/component/roles.d.ts.map +1 -0
  87. package/dist/component/roles.js +98 -0
  88. package/dist/component/roles.js.map +1 -0
  89. package/dist/component/schema.d.ts +1295 -0
  90. package/dist/component/schema.d.ts.map +1 -0
  91. package/dist/component/schema.js +724 -0
  92. package/dist/component/schema.js.map +1 -0
  93. package/dist/component/slaMonitoring.d.ts +32 -0
  94. package/dist/component/slaMonitoring.d.ts.map +1 -0
  95. package/dist/component/slaMonitoring.js +111 -0
  96. package/dist/component/slaMonitoring.js.map +1 -0
  97. package/dist/component/slaRules.d.ts +72 -0
  98. package/dist/component/slaRules.d.ts.map +1 -0
  99. package/dist/component/slaRules.js +193 -0
  100. package/dist/component/slaRules.js.map +1 -0
  101. package/dist/component/sparePartOrders.d.ts +177 -0
  102. package/dist/component/sparePartOrders.d.ts.map +1 -0
  103. package/dist/component/sparePartOrders.js +243 -0
  104. package/dist/component/sparePartOrders.js.map +1 -0
  105. package/dist/component/spareParts.d.ts +472 -0
  106. package/dist/component/spareParts.d.ts.map +1 -0
  107. package/dist/component/spareParts.js +319 -0
  108. package/dist/component/spareParts.js.map +1 -0
  109. package/dist/component/supplierCategories.d.ts +22 -0
  110. package/dist/component/supplierCategories.d.ts.map +1 -0
  111. package/dist/component/supplierCategories.js +64 -0
  112. package/dist/component/supplierCategories.js.map +1 -0
  113. package/dist/component/suppliers.d.ts +94 -0
  114. package/dist/component/suppliers.d.ts.map +1 -0
  115. package/dist/component/suppliers.js +195 -0
  116. package/dist/component/suppliers.js.map +1 -0
  117. package/dist/component/ticketComments.d.ts +89 -0
  118. package/dist/component/ticketComments.d.ts.map +1 -0
  119. package/dist/component/ticketComments.js +246 -0
  120. package/dist/component/ticketComments.js.map +1 -0
  121. package/dist/component/ticketCustomFields.d.ts +149 -0
  122. package/dist/component/ticketCustomFields.d.ts.map +1 -0
  123. package/dist/component/ticketCustomFields.js +215 -0
  124. package/dist/component/ticketCustomFields.js.map +1 -0
  125. package/dist/component/ticketExport.d.ts +83 -0
  126. package/dist/component/ticketExport.d.ts.map +1 -0
  127. package/dist/component/ticketExport.js +182 -0
  128. package/dist/component/ticketExport.js.map +1 -0
  129. package/dist/component/ticketHistory.d.ts +57 -0
  130. package/dist/component/ticketHistory.d.ts.map +1 -0
  131. package/dist/component/ticketHistory.js +81 -0
  132. package/dist/component/ticketHistory.js.map +1 -0
  133. package/dist/component/ticketMacros.d.ts +141 -0
  134. package/dist/component/ticketMacros.d.ts.map +1 -0
  135. package/dist/component/ticketMacros.js +255 -0
  136. package/dist/component/ticketMacros.js.map +1 -0
  137. package/dist/component/ticketStatuses.d.ts +60 -0
  138. package/dist/component/ticketStatuses.d.ts.map +1 -0
  139. package/dist/component/ticketStatuses.js +110 -0
  140. package/dist/component/ticketStatuses.js.map +1 -0
  141. package/dist/component/ticketTriggers.d.ts +408 -0
  142. package/dist/component/ticketTriggers.d.ts.map +1 -0
  143. package/dist/component/ticketTriggers.js +941 -0
  144. package/dist/component/ticketTriggers.js.map +1 -0
  145. package/dist/component/userProfiles.d.ts +259 -0
  146. package/dist/component/userProfiles.d.ts.map +1 -0
  147. package/dist/component/userProfiles.js +634 -0
  148. package/dist/component/userProfiles.js.map +1 -0
  149. package/dist/component/vendorArticles.d.ts +64 -0
  150. package/dist/component/vendorArticles.d.ts.map +1 -0
  151. package/dist/component/vendorArticles.js +116 -0
  152. package/dist/component/vendorArticles.js.map +1 -0
  153. package/dist/test.d.ts +1302 -0
  154. package/dist/test.d.ts.map +1 -0
  155. package/dist/test.js +7 -0
  156. package/dist/test.js.map +1 -0
  157. package/package.json +71 -0
  158. package/src/client/index.ts +344 -0
  159. package/src/component/_generated/api.ts +110 -0
  160. package/src/component/_generated/component.ts +2460 -0
  161. package/src/component/_generated/dataModel.ts +60 -0
  162. package/src/component/_generated/server.ts +156 -0
  163. package/src/component/apiKeys.ts +229 -0
  164. package/src/component/clinics.ts +136 -0
  165. package/src/component/contracts.ts +136 -0
  166. package/src/component/convex.config.js +2 -0
  167. package/src/component/convex.config.ts +3 -0
  168. package/src/component/crons.ts +18 -0
  169. package/src/component/dashboardStats.ts +141 -0
  170. package/src/component/dashboardStatsCache.ts +145 -0
  171. package/src/component/deviceCategories.ts +280 -0
  172. package/src/component/deviceQuestions.ts +225 -0
  173. package/src/component/deviceRepairHistory.ts +94 -0
  174. package/src/component/deviceStatus.ts +79 -0
  175. package/src/component/devices.ts +645 -0
  176. package/src/component/emailHelpers.ts +38 -0
  177. package/src/component/emails.ts +61 -0
  178. package/src/component/http.ts +231 -0
  179. package/src/component/maintenanceTasks.ts +1003 -0
  180. package/src/component/roles.ts +99 -0
  181. package/src/component/schema.ts +842 -0
  182. package/src/component/slaMonitoring.ts +125 -0
  183. package/src/component/slaRules.ts +231 -0
  184. package/src/component/sparePartOrders.ts +290 -0
  185. package/src/component/spareParts.ts +362 -0
  186. package/src/component/supplierCategories.ts +65 -0
  187. package/src/component/suppliers.ts +234 -0
  188. package/src/component/ticketComments.ts +288 -0
  189. package/src/component/ticketCustomFields.ts +260 -0
  190. package/src/component/ticketExport.ts +220 -0
  191. package/src/component/ticketHistory.ts +106 -0
  192. package/src/component/ticketMacros.ts +291 -0
  193. package/src/component/ticketStatuses.ts +109 -0
  194. package/src/component/ticketTriggers.ts +1152 -0
  195. package/src/component/userProfiles.ts +745 -0
  196. package/src/component/vendorArticles.ts +139 -0
  197. package/src/test.ts +15 -0
@@ -0,0 +1,634 @@
1
+ import { v } from 'convex/values';
2
+ import { query, mutation } from './_generated/server';
3
+ import { paginationOptsValidator } from 'convex/server';
4
+ export const getUserProfile = query({
5
+ args: { auth0Id: v.string() },
6
+ handler: async (ctx, args) => {
7
+ const profile = await ctx.db
8
+ .query('user_profiles')
9
+ .withIndex('by_auth0Id', (q) => q.eq('auth0Id', args.auth0Id))
10
+ .first();
11
+ return profile;
12
+ },
13
+ });
14
+ export const getCurrentUserProfile = query({
15
+ args: { auth0Id: v.string() },
16
+ handler: async (ctx, args) => {
17
+ const realProfile = await ctx.db
18
+ .query('user_profiles')
19
+ .withIndex('by_auth0Id', (q) => q.eq('auth0Id', args.auth0Id))
20
+ .first();
21
+ if (!realProfile) {
22
+ return null;
23
+ }
24
+ if (realProfile.isActive === false) {
25
+ return {
26
+ ...realProfile,
27
+ role: null,
28
+ isDisabled: true,
29
+ isImpersonating: false,
30
+ };
31
+ }
32
+ const realRole = realProfile.roleId ? await ctx.db.get(realProfile.roleId) : null;
33
+ const isAdmin = realRole?.name === 'admin';
34
+ if (isAdmin && realProfile.impersonatingUserId) {
35
+ const impersonatedProfile = await ctx.db.get(realProfile.impersonatingUserId);
36
+ if (impersonatedProfile) {
37
+ const impersonatedRole = impersonatedProfile.roleId
38
+ ? await ctx.db.get(impersonatedProfile.roleId)
39
+ : null;
40
+ return {
41
+ ...impersonatedProfile,
42
+ role: impersonatedRole?.name,
43
+ isImpersonating: true,
44
+ realAdminId: realProfile._id,
45
+ realAdminName: realProfile.name || realProfile.email,
46
+ realAdminEmail: realProfile.email,
47
+ isDisabled: false,
48
+ };
49
+ }
50
+ }
51
+ return {
52
+ ...realProfile,
53
+ role: realRole?.name,
54
+ isImpersonating: false,
55
+ isDisabled: false,
56
+ };
57
+ },
58
+ });
59
+ function isPlaceholderAuth0Id(auth0Id) {
60
+ return auth0Id.startsWith('placeholder_') ||
61
+ auth0Id.startsWith('manual_') ||
62
+ !auth0Id.includes('|');
63
+ }
64
+ export const upsertUserProfile = mutation({
65
+ args: {
66
+ auth0Id: v.string(),
67
+ email: v.string(),
68
+ name: v.optional(v.string()),
69
+ roleName: v.optional(v.string()),
70
+ clinicId: v.optional(v.id('clinics')),
71
+ supplierId: v.optional(v.id('suppliers')),
72
+ },
73
+ handler: async (ctx, args) => {
74
+ let existing = await ctx.db
75
+ .query('user_profiles')
76
+ .withIndex('by_auth0Id', (q) => q.eq('auth0Id', args.auth0Id))
77
+ .first();
78
+ let shouldUpdateAuth0Id = false;
79
+ if (!existing) {
80
+ const existingByEmail = await ctx.db
81
+ .query('user_profiles')
82
+ .withIndex('by_email', (q) => q.eq('email', args.email))
83
+ .first();
84
+ if (existingByEmail && isPlaceholderAuth0Id(existingByEmail.auth0Id)) {
85
+ existing = existingByEmail;
86
+ shouldUpdateAuth0Id = true;
87
+ console.log(`🔄 Found pre-created user with email ${args.email}, updating auth0Id from placeholder to real Auth0 ID`);
88
+ }
89
+ }
90
+ let roleId = existing?.roleId;
91
+ if (args.roleName || !roleId) {
92
+ const roleName = args.roleName || 'user';
93
+ let role = await ctx.db
94
+ .query('roles')
95
+ .withIndex('by_name', (q) => q.eq('name', roleName))
96
+ .first();
97
+ if (!role) {
98
+ const newRoleId = await ctx.db.insert('roles', {
99
+ name: roleName,
100
+ description: roleName === 'admin' ? 'Administrator with full access' :
101
+ roleName === 'user' ? 'Standard user with limited access' :
102
+ roleName === 'supplier' ? 'Supplier with access to assigned tickets' :
103
+ `${roleName} role`,
104
+ createdAt: Date.now(),
105
+ });
106
+ role = await ctx.db.get(newRoleId);
107
+ }
108
+ if (role) {
109
+ roleId = role._id;
110
+ }
111
+ }
112
+ if (existing) {
113
+ const updateData = {
114
+ email: args.email,
115
+ name: args.name,
116
+ ...(args.clinicId && { clinicId: args.clinicId }),
117
+ ...(args.supplierId && { supplierId: args.supplierId }),
118
+ };
119
+ if (shouldUpdateAuth0Id) {
120
+ updateData.auth0Id = args.auth0Id;
121
+ console.log(`✅ Updated auth0Id for user ${args.email}`);
122
+ }
123
+ if (roleId) {
124
+ updateData.roleId = roleId;
125
+ }
126
+ await ctx.db.patch(existing._id, updateData);
127
+ return existing._id;
128
+ }
129
+ else {
130
+ const newProfile = {
131
+ auth0Id: args.auth0Id,
132
+ email: args.email,
133
+ name: args.name,
134
+ ...(args.clinicId && { clinicId: args.clinicId }),
135
+ ...(args.supplierId && { supplierId: args.supplierId }),
136
+ };
137
+ if (roleId) {
138
+ newProfile.roleId = roleId;
139
+ }
140
+ const profileId = await ctx.db.insert('user_profiles', newProfile);
141
+ return profileId;
142
+ }
143
+ },
144
+ });
145
+ export const updateUserRole = mutation({
146
+ args: {
147
+ userId: v.id('user_profiles'),
148
+ roleName: v.string(),
149
+ clinicId: v.optional(v.id('clinics')),
150
+ supplierId: v.optional(v.id('suppliers')),
151
+ },
152
+ handler: async (ctx, args) => {
153
+ const newRole = await ctx.db
154
+ .query('roles')
155
+ .withIndex('by_name', (q) => q.eq('name', args.roleName))
156
+ .first();
157
+ if (!newRole) {
158
+ throw new Error(`Role ${args.roleName} not found`);
159
+ }
160
+ await ctx.db.patch(args.userId, {
161
+ roleId: newRole._id,
162
+ ...(args.clinicId !== undefined && { clinicId: args.clinicId }),
163
+ ...(args.supplierId !== undefined && { supplierId: args.supplierId }),
164
+ });
165
+ return args.userId;
166
+ },
167
+ });
168
+ export const updateUserSupplier = mutation({
169
+ args: {
170
+ userId: v.id('user_profiles'),
171
+ supplierId: v.id('suppliers'),
172
+ },
173
+ handler: async (ctx, args) => {
174
+ await ctx.db.patch(args.userId, {
175
+ supplierId: args.supplierId,
176
+ });
177
+ return args.userId;
178
+ },
179
+ });
180
+ export const listUsers = query({
181
+ args: {
182
+ limit: v.optional(v.number()),
183
+ },
184
+ handler: async (ctx, args) => {
185
+ const maxResults = args.limit || 500;
186
+ const users = await ctx.db.query('user_profiles').order('desc').take(maxResults);
187
+ const usersWithRoles = await Promise.all(users.map(async (user) => {
188
+ const role = user.roleId ? await ctx.db.get(user.roleId) : null;
189
+ return {
190
+ ...user,
191
+ role: role?.name || user.role,
192
+ };
193
+ }));
194
+ return usersWithRoles;
195
+ },
196
+ });
197
+ export const listUsersPaginated = query({
198
+ args: {
199
+ paginationOpts: paginationOptsValidator,
200
+ roleId: v.optional(v.id('roles')),
201
+ isActive: v.optional(v.boolean()),
202
+ searchTerm: v.optional(v.string()),
203
+ },
204
+ handler: async (ctx, args) => {
205
+ let baseQuery;
206
+ if (args.roleId) {
207
+ baseQuery = ctx.db
208
+ .query('user_profiles')
209
+ .withIndex('by_roleId', (q) => q.eq('roleId', args.roleId));
210
+ }
211
+ else if (args.isActive !== undefined) {
212
+ baseQuery = ctx.db
213
+ .query('user_profiles')
214
+ .withIndex('by_isActive', (q) => q.eq('isActive', args.isActive));
215
+ }
216
+ else {
217
+ baseQuery = ctx.db.query('user_profiles');
218
+ }
219
+ let filteredQuery = baseQuery.order('desc');
220
+ if (args.isActive !== undefined && args.roleId) {
221
+ filteredQuery = filteredQuery.filter((q) => q.eq(q.field('isActive'), args.isActive));
222
+ }
223
+ const result = await filteredQuery.paginate(args.paginationOpts);
224
+ let filteredPage = result.page;
225
+ if (args.searchTerm) {
226
+ const search = args.searchTerm.toLowerCase();
227
+ filteredPage = filteredPage.filter((user) => user.name?.toLowerCase().includes(search) ||
228
+ user.email?.toLowerCase().includes(search));
229
+ }
230
+ const roleIds = [...new Set(filteredPage.map((u) => u.roleId).filter(Boolean))];
231
+ const roles = await Promise.all(roleIds.map(id => ctx.db.get(id)));
232
+ const roleMap = new Map(roles.filter(Boolean).map((r) => [r._id.toString(), r.name]));
233
+ const minimalPage = filteredPage.map((user) => ({
234
+ _id: user._id,
235
+ auth0Id: user.auth0Id,
236
+ email: user.email,
237
+ name: user.name,
238
+ roleId: user.roleId,
239
+ role: roleMap.get(user.roleId?.toString()) || user.role || 'user',
240
+ isActive: user.isActive,
241
+ clinicId: user.clinicId,
242
+ supplierId: user.supplierId,
243
+ createdAt: user.createdAt || user._creationTime,
244
+ }));
245
+ return {
246
+ page: minimalPage,
247
+ isDone: result.isDone,
248
+ continueCursor: result.continueCursor,
249
+ };
250
+ },
251
+ });
252
+ export const getUsersCount = query({
253
+ args: {
254
+ roleId: v.optional(v.id('roles')),
255
+ isActive: v.optional(v.boolean()),
256
+ },
257
+ handler: async (ctx, args) => {
258
+ let query;
259
+ if (args.roleId) {
260
+ query = ctx.db.query('user_profiles')
261
+ .withIndex('by_roleId', (q) => q.eq('roleId', args.roleId));
262
+ }
263
+ else if (args.isActive !== undefined) {
264
+ query = ctx.db.query('user_profiles')
265
+ .withIndex('by_isActive', (q) => q.eq('isActive', args.isActive));
266
+ }
267
+ else {
268
+ query = ctx.db.query('user_profiles');
269
+ }
270
+ if (args.isActive !== undefined && args.roleId) {
271
+ query = query.filter((q) => q.eq(q.field('isActive'), args.isActive));
272
+ }
273
+ const users = await query.take(1000);
274
+ return { total: users.length };
275
+ },
276
+ });
277
+ export const savePrimoUPToken = mutation({
278
+ args: {
279
+ auth0Id: v.string(),
280
+ token: v.string(),
281
+ expiresAt: v.optional(v.number()),
282
+ refreshToken: v.optional(v.string()),
283
+ },
284
+ handler: async (ctx, args) => {
285
+ const existingTokens = await ctx.db
286
+ .query('primoup_tokens')
287
+ .withIndex('by_userId', (q) => q.eq('userId', args.auth0Id))
288
+ .collect();
289
+ for (const token of existingTokens) {
290
+ await ctx.db.patch(token._id, { isActive: false });
291
+ }
292
+ await ctx.db.insert('primoup_tokens', {
293
+ userId: args.auth0Id,
294
+ token: args.token,
295
+ refreshToken: args.refreshToken,
296
+ expiresAt: args.expiresAt,
297
+ createdAt: Date.now(),
298
+ isActive: true,
299
+ });
300
+ await ctx.db.insert('primoup_access_logs', {
301
+ userId: args.auth0Id,
302
+ action: 'login',
303
+ success: true,
304
+ timestamp: Date.now(),
305
+ });
306
+ return { success: true };
307
+ },
308
+ });
309
+ export const getPrimoUPToken = query({
310
+ args: { auth0Id: v.string() },
311
+ handler: async (ctx, args) => {
312
+ const activeToken = await ctx.db
313
+ .query('primoup_tokens')
314
+ .withIndex('by_userId_active', (q) => q.eq('userId', args.auth0Id).eq('isActive', true))
315
+ .first();
316
+ if (!activeToken) {
317
+ return null;
318
+ }
319
+ if (activeToken.expiresAt && activeToken.expiresAt < Date.now()) {
320
+ return {
321
+ token: null,
322
+ expired: true,
323
+ refreshToken: activeToken.refreshToken,
324
+ };
325
+ }
326
+ return {
327
+ token: activeToken.token,
328
+ expired: false,
329
+ expiresAt: activeToken.expiresAt,
330
+ tokenId: activeToken._id,
331
+ };
332
+ },
333
+ });
334
+ export const logPrimoUPAccess = mutation({
335
+ args: {
336
+ auth0Id: v.string(),
337
+ action: v.string(),
338
+ endpoint: v.optional(v.string()),
339
+ success: v.boolean(),
340
+ errorMessage: v.optional(v.string()),
341
+ metadata: v.optional(v.any()),
342
+ },
343
+ handler: async (ctx, args) => {
344
+ await ctx.db.insert('primoup_access_logs', {
345
+ userId: args.auth0Id,
346
+ action: args.action,
347
+ endpoint: args.endpoint,
348
+ success: args.success,
349
+ errorMessage: args.errorMessage,
350
+ timestamp: Date.now(),
351
+ metadata: args.metadata,
352
+ });
353
+ return { success: true };
354
+ },
355
+ });
356
+ export const getPrimoUPAccessLogs = query({
357
+ args: {
358
+ auth0Id: v.string(),
359
+ isAdmin: v.optional(v.boolean()),
360
+ userId: v.optional(v.string()),
361
+ limit: v.optional(v.number()),
362
+ },
363
+ handler: async (ctx, args) => {
364
+ const targetUserId = args.isAdmin && args.userId ? args.userId : args.auth0Id;
365
+ const logs = await ctx.db
366
+ .query('primoup_access_logs')
367
+ .withIndex('by_userId_timestamp', (q) => q.eq('userId', targetUserId))
368
+ .order('desc')
369
+ .take(args.limit || 50);
370
+ return logs;
371
+ },
372
+ });
373
+ export const updateUserRoleByEmail = mutation({
374
+ args: {
375
+ email: v.string(),
376
+ roleName: v.string(),
377
+ },
378
+ handler: async (ctx, args) => {
379
+ const user = await ctx.db
380
+ .query('user_profiles')
381
+ .filter((q) => q.eq(q.field('email'), args.email))
382
+ .first();
383
+ if (!user) {
384
+ throw new Error(`User with email ${args.email} not found`);
385
+ }
386
+ const role = await ctx.db
387
+ .query('roles')
388
+ .withIndex('by_name', (q) => q.eq('name', args.roleName))
389
+ .first();
390
+ if (!role) {
391
+ throw new Error(`Role ${args.roleName} not found`);
392
+ }
393
+ await ctx.db.patch(user._id, {
394
+ roleId: role._id,
395
+ });
396
+ return {
397
+ success: true,
398
+ userId: user._id,
399
+ email: user.email,
400
+ newRole: args.roleName,
401
+ };
402
+ },
403
+ });
404
+ export const saveUserClinics = mutation({
405
+ args: {
406
+ auth0Id: v.string(),
407
+ primoupClinics: v.array(v.any()),
408
+ },
409
+ handler: async (ctx, args) => {
410
+ const profile = await ctx.db
411
+ .query('user_profiles')
412
+ .withIndex('by_auth0Id', (q) => q.eq('auth0Id', args.auth0Id))
413
+ .first();
414
+ if (!profile) {
415
+ throw new Error('User profile not found');
416
+ }
417
+ const optimizedClinics = args.primoupClinics.map((clinic) => ({
418
+ id: clinic.id,
419
+ name: clinic.name,
420
+ role: clinic.role ? { id: clinic.role.id, name: clinic.role.name, slug: clinic.role.slug } : undefined,
421
+ }));
422
+ const selectedClinicId = profile.selectedClinicId || (optimizedClinics.length > 0 ? optimizedClinics[0].id : undefined);
423
+ await ctx.db.patch(profile._id, {
424
+ primoupClinics: optimizedClinics,
425
+ selectedClinicId,
426
+ });
427
+ return profile._id;
428
+ },
429
+ });
430
+ export const updateSelectedClinic = mutation({
431
+ args: {
432
+ auth0Id: v.string(),
433
+ clinicId: v.number(),
434
+ },
435
+ handler: async (ctx, args) => {
436
+ const profile = await ctx.db
437
+ .query('user_profiles')
438
+ .withIndex('by_auth0Id', (q) => q.eq('auth0Id', args.auth0Id))
439
+ .first();
440
+ if (!profile) {
441
+ throw new Error('User profile not found');
442
+ }
443
+ if (profile.primoupClinics) {
444
+ const hasClinic = profile.primoupClinics.some((clinic) => clinic.id === args.clinicId);
445
+ if (!hasClinic) {
446
+ throw new Error('Clinic not found in user clinics');
447
+ }
448
+ }
449
+ const clinic = await ctx.db
450
+ .query('clinics')
451
+ .withIndex('by_primoupId', (q) => q.eq('primoupId', args.clinicId.toString()))
452
+ .first();
453
+ if (!clinic) {
454
+ console.warn(`⚠️ Clinic NOT FOUND in Convex with primoupId: ${args.clinicId}`);
455
+ const newCounter = (profile.clinicChangeCounter || 0) + 1;
456
+ await ctx.db.patch(profile._id, {
457
+ selectedClinicId: args.clinicId,
458
+ clinicId: undefined,
459
+ clinicChangeCounter: newCounter,
460
+ });
461
+ return profile._id;
462
+ }
463
+ const newCounter = (profile.clinicChangeCounter || 0) + 1;
464
+ await ctx.db.patch(profile._id, {
465
+ selectedClinicId: args.clinicId,
466
+ clinicId: clinic._id,
467
+ clinicChangeCounter: newCounter,
468
+ });
469
+ return profile._id;
470
+ },
471
+ });
472
+ export const startImpersonation = mutation({
473
+ args: {
474
+ auth0Id: v.string(),
475
+ targetUserId: v.id('user_profiles'),
476
+ },
477
+ handler: async (ctx, args) => {
478
+ const currentUser = await ctx.db
479
+ .query('user_profiles')
480
+ .withIndex('by_auth0Id', (q) => q.eq('auth0Id', args.auth0Id))
481
+ .first();
482
+ if (!currentUser) {
483
+ throw new Error('User profile not found');
484
+ }
485
+ const currentRole = currentUser.roleId ? await ctx.db.get(currentUser.roleId) : null;
486
+ if (!currentRole || currentRole.name !== 'admin') {
487
+ throw new Error('Solo gli amministratori possono impersonare altri utenti');
488
+ }
489
+ const targetUser = await ctx.db.get(args.targetUserId);
490
+ if (!targetUser) {
491
+ throw new Error('Utente target non trovato');
492
+ }
493
+ if (targetUser._id === currentUser._id) {
494
+ throw new Error('Non puoi impersonare te stesso');
495
+ }
496
+ await ctx.db.patch(currentUser._id, {
497
+ impersonatingUserId: args.targetUserId,
498
+ });
499
+ return {
500
+ success: true,
501
+ impersonatedUser: {
502
+ id: targetUser._id,
503
+ name: targetUser.name,
504
+ email: targetUser.email,
505
+ },
506
+ };
507
+ },
508
+ });
509
+ export const stopImpersonation = mutation({
510
+ args: { auth0Id: v.string() },
511
+ handler: async (ctx, args) => {
512
+ const currentUser = await ctx.db
513
+ .query('user_profiles')
514
+ .withIndex('by_auth0Id', (q) => q.eq('auth0Id', args.auth0Id))
515
+ .first();
516
+ if (!currentUser) {
517
+ throw new Error('User profile not found');
518
+ }
519
+ const currentRole = currentUser.roleId ? await ctx.db.get(currentUser.roleId) : null;
520
+ if (!currentRole || currentRole.name !== 'admin') {
521
+ throw new Error('Solo gli amministratori possono terminare l\'impersonazione');
522
+ }
523
+ await ctx.db.patch(currentUser._id, {
524
+ impersonatingUserId: undefined,
525
+ });
526
+ return { success: true };
527
+ },
528
+ });
529
+ export const updateUserProfile = mutation({
530
+ args: {
531
+ userId: v.id('user_profiles'),
532
+ name: v.optional(v.string()),
533
+ email: v.optional(v.string()),
534
+ roleName: v.optional(v.string()),
535
+ clinicId: v.optional(v.id('clinics')),
536
+ supplierId: v.optional(v.id('suppliers')),
537
+ },
538
+ handler: async (ctx, args) => {
539
+ const targetUser = await ctx.db.get(args.userId);
540
+ if (!targetUser) {
541
+ throw new Error('Target user not found');
542
+ }
543
+ const updateData = {};
544
+ if (args.name !== undefined) {
545
+ updateData.name = args.name;
546
+ }
547
+ if (args.email !== undefined) {
548
+ const existingUser = await ctx.db
549
+ .query('user_profiles')
550
+ .withIndex('by_email', (q) => q.eq('email', args.email))
551
+ .first();
552
+ if (existingUser && existingUser._id !== args.userId) {
553
+ throw new Error('Email già in uso da un altro utente');
554
+ }
555
+ updateData.email = args.email;
556
+ }
557
+ if (args.roleName !== undefined) {
558
+ const newRole = await ctx.db
559
+ .query('roles')
560
+ .withIndex('by_name', (q) => q.eq('name', args.roleName))
561
+ .first();
562
+ if (!newRole) {
563
+ throw new Error(`Ruolo ${args.roleName} non trovato`);
564
+ }
565
+ updateData.roleId = newRole._id;
566
+ }
567
+ if (args.clinicId !== undefined) {
568
+ updateData.clinicId = args.clinicId;
569
+ }
570
+ if (args.supplierId !== undefined) {
571
+ updateData.supplierId = args.supplierId;
572
+ }
573
+ if (Object.keys(updateData).length > 0) {
574
+ await ctx.db.patch(args.userId, updateData);
575
+ }
576
+ return args.userId;
577
+ },
578
+ });
579
+ export const disableUser = mutation({
580
+ args: {
581
+ userId: v.id('user_profiles'),
582
+ callerUserId: v.optional(v.id('user_profiles')),
583
+ },
584
+ handler: async (ctx, args) => {
585
+ if (args.callerUserId && args.userId === args.callerUserId) {
586
+ throw new Error('Non puoi disabilitare te stesso');
587
+ }
588
+ const targetUser = await ctx.db.get(args.userId);
589
+ if (!targetUser) {
590
+ throw new Error('Utente non trovato');
591
+ }
592
+ await ctx.db.patch(args.userId, {
593
+ isActive: false,
594
+ });
595
+ return { success: true, userId: args.userId };
596
+ },
597
+ });
598
+ export const enableUser = mutation({
599
+ args: {
600
+ userId: v.id('user_profiles'),
601
+ },
602
+ handler: async (ctx, args) => {
603
+ const targetUser = await ctx.db.get(args.userId);
604
+ if (!targetUser) {
605
+ throw new Error('Utente non trovato');
606
+ }
607
+ await ctx.db.patch(args.userId, {
608
+ isActive: true,
609
+ });
610
+ return { success: true, userId: args.userId };
611
+ },
612
+ });
613
+ export const getRealAdminProfile = query({
614
+ args: { auth0Id: v.string() },
615
+ handler: async (ctx, args) => {
616
+ const profile = await ctx.db
617
+ .query('user_profiles')
618
+ .withIndex('by_auth0Id', (q) => q.eq('auth0Id', args.auth0Id))
619
+ .first();
620
+ if (!profile) {
621
+ return null;
622
+ }
623
+ const role = profile.roleId ? await ctx.db.get(profile.roleId) : null;
624
+ return {
625
+ _id: profile._id,
626
+ name: profile.name,
627
+ email: profile.email,
628
+ role: role?.name,
629
+ isImpersonating: !!profile.impersonatingUserId,
630
+ impersonatingUserId: profile.impersonatingUserId,
631
+ };
632
+ },
633
+ });
634
+ //# sourceMappingURL=userProfiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userProfiles.js","sourceRoot":"","sources":["../../src/component/userProfiles.ts"],"names":[],"mappings":"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"}