@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,39 @@
1
+ import { query } from './_generated/server';
2
+ import { v } from 'convex/values';
3
+ export const getAdminEmails = query({
4
+ args: {},
5
+ handler: async (ctx) => {
6
+ const adminRole = await ctx.db
7
+ .query('roles')
8
+ .withIndex('by_name', (q) => q.eq('name', 'admin'))
9
+ .first();
10
+ if (!adminRole)
11
+ return [];
12
+ const adminUsers = await ctx.db
13
+ .query('user_profiles')
14
+ .withIndex('by_roleId', (q) => q.eq('roleId', adminRole._id))
15
+ .collect();
16
+ return adminUsers
17
+ .filter((user) => user.email)
18
+ .map((user) => ({ email: user.email, name: user.name || user.email }));
19
+ },
20
+ });
21
+ export const getSupplierEmail = query({
22
+ args: { supplierId: v.id('suppliers') },
23
+ handler: async (ctx, args) => {
24
+ const supplier = await ctx.db.get(args.supplierId);
25
+ if (!supplier || !supplier.contact_email)
26
+ return null;
27
+ return { email: supplier.contact_email, name: supplier.name };
28
+ },
29
+ });
30
+ export const getClinicEmail = query({
31
+ args: { clinicId: v.id('clinics') },
32
+ handler: async (ctx, args) => {
33
+ const clinic = await ctx.db.get(args.clinicId);
34
+ if (!clinic || !clinic.contact_email)
35
+ return null;
36
+ return { email: clinic.contact_email, name: clinic.name };
37
+ },
38
+ });
39
+ //# sourceMappingURL=emailHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emailHelpers.js","sourceRoot":"","sources":["../../src/component/emailHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC;IAClC,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE;aAC3B,KAAK,CAAC,OAAO,CAAC;aACd,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;aAClD,KAAK,EAAE,CAAC;QACX,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,EAAE;aAC5B,KAAK,CAAC,eAAe,CAAC;aACtB,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;aAC5D,OAAO,EAAE,CAAC;QACb,OAAO,UAAU;aACd,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;aAC5B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;IACpC,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE;IACvC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QACtD,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChE,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC;IAClC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE;IACnC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IAC5D,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,56 @@
1
+ export declare const logEmail: import("convex/server").RegisteredMutation<"public", {
2
+ errorMessage?: string | undefined;
3
+ ticketId?: import("convex/values").GenericId<"maintenance_tasks"> | undefined;
4
+ resendId?: string | undefined;
5
+ status: "pending" | "sent" | "failed";
6
+ from: string;
7
+ to: string | string[];
8
+ subject: string;
9
+ html: string;
10
+ }, Promise<import("convex/values").GenericId<"email_logs">>>;
11
+ export declare const getEmailLogsByTicket: import("convex/server").RegisteredQuery<"public", {
12
+ ticketId: import("convex/values").GenericId<"maintenance_tasks">;
13
+ }, Promise<{
14
+ _id: import("convex/values").GenericId<"email_logs">;
15
+ _creationTime: number;
16
+ errorMessage?: string | undefined;
17
+ ticketId?: import("convex/values").GenericId<"maintenance_tasks"> | undefined;
18
+ resendId?: string | undefined;
19
+ status: "pending" | "sent" | "failed";
20
+ from: string;
21
+ to: string | string[];
22
+ subject: string;
23
+ html: string;
24
+ sentAt: number;
25
+ }[]>>;
26
+ export declare const getAllEmailLogs: import("convex/server").RegisteredQuery<"public", {
27
+ limit?: number | undefined;
28
+ }, Promise<{
29
+ _id: import("convex/values").GenericId<"email_logs">;
30
+ _creationTime: number;
31
+ errorMessage?: string | undefined;
32
+ ticketId?: import("convex/values").GenericId<"maintenance_tasks"> | undefined;
33
+ resendId?: string | undefined;
34
+ status: "pending" | "sent" | "failed";
35
+ from: string;
36
+ to: string | string[];
37
+ subject: string;
38
+ html: string;
39
+ sentAt: number;
40
+ }[]>>;
41
+ export declare const getFailedEmails: import("convex/server").RegisteredQuery<"public", {
42
+ limit?: number | undefined;
43
+ }, Promise<{
44
+ _id: import("convex/values").GenericId<"email_logs">;
45
+ _creationTime: number;
46
+ errorMessage?: string | undefined;
47
+ ticketId?: import("convex/values").GenericId<"maintenance_tasks"> | undefined;
48
+ resendId?: string | undefined;
49
+ status: "pending" | "sent" | "failed";
50
+ from: string;
51
+ to: string | string[];
52
+ subject: string;
53
+ html: string;
54
+ sentAt: number;
55
+ }[]>>;
56
+ //# sourceMappingURL=emails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emails.d.ts","sourceRoot":"","sources":["../../src/component/emails.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ;;;;;;;;;4DAwBnB,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;KAS/B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;KAS1B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;KAS1B,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { v } from 'convex/values';
2
+ import { mutation, query } from './_generated/server';
3
+ export const logEmail = mutation({
4
+ args: {
5
+ from: v.string(),
6
+ to: v.union(v.string(), v.array(v.string())),
7
+ subject: v.string(),
8
+ html: v.string(),
9
+ ticketId: v.optional(v.id('maintenance_tasks')),
10
+ status: v.union(v.literal('sent'), v.literal('failed'), v.literal('pending')),
11
+ resendId: v.optional(v.string()),
12
+ errorMessage: v.optional(v.string()),
13
+ },
14
+ handler: async (ctx, args) => {
15
+ return await ctx.db.insert('email_logs', {
16
+ from: args.from,
17
+ to: args.to,
18
+ subject: args.subject,
19
+ html: args.html,
20
+ ticketId: args.ticketId,
21
+ status: args.status,
22
+ resendId: args.resendId,
23
+ errorMessage: args.errorMessage,
24
+ sentAt: Date.now(),
25
+ });
26
+ },
27
+ });
28
+ export const getEmailLogsByTicket = query({
29
+ args: { ticketId: v.id('maintenance_tasks') },
30
+ handler: async (ctx, args) => {
31
+ return await ctx.db
32
+ .query('email_logs')
33
+ .withIndex('by_ticketId', (q) => q.eq('ticketId', args.ticketId))
34
+ .order('desc')
35
+ .collect();
36
+ },
37
+ });
38
+ export const getAllEmailLogs = query({
39
+ args: { limit: v.optional(v.number()) },
40
+ handler: async (ctx, args) => {
41
+ return await ctx.db
42
+ .query('email_logs')
43
+ .withIndex('by_sentAt')
44
+ .order('desc')
45
+ .take(args.limit || 100);
46
+ },
47
+ });
48
+ export const getFailedEmails = query({
49
+ args: { limit: v.optional(v.number()) },
50
+ handler: async (ctx, args) => {
51
+ return await ctx.db
52
+ .query('email_logs')
53
+ .withIndex('by_status', (q) => q.eq('status', 'failed'))
54
+ .order('desc')
55
+ .take(args.limit || 50);
56
+ },
57
+ });
58
+ //# sourceMappingURL=emails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emails.js","sourceRoot":"","sources":["../../src/component/emails.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const http: import("convex/server").HttpRouter;
2
+ export default http;
3
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/component/http.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,IAAI,oCAAe,CAAC;AAkO1B,eAAe,IAAI,CAAC"}
@@ -0,0 +1,229 @@
1
+ import { httpRouter } from 'convex/server';
2
+ import { httpAction } from './_generated/server';
3
+ import { api, internal } from './_generated/api';
4
+ const http = httpRouter();
5
+ const corsHeaders = {
6
+ 'Access-Control-Allow-Origin': '*',
7
+ 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
8
+ 'Access-Control-Allow-Headers': 'Content-Type, X-API-Key, Authorization',
9
+ };
10
+ function jsonResponse(data, status = 200) {
11
+ return new Response(JSON.stringify(data), {
12
+ status,
13
+ headers: { 'Content-Type': 'application/json', ...corsHeaders },
14
+ });
15
+ }
16
+ function errorResponse(message, status = 400) {
17
+ return jsonResponse({ success: false, error: message }, status);
18
+ }
19
+ http.route({
20
+ path: '/api/comments/add',
21
+ method: 'OPTIONS',
22
+ handler: httpAction(async () => {
23
+ return new Response(null, { status: 204, headers: corsHeaders });
24
+ }),
25
+ });
26
+ http.route({
27
+ path: '/api/comments/add',
28
+ method: 'POST',
29
+ handler: httpAction(async (ctx, request) => {
30
+ try {
31
+ const apiKey = request.headers.get('X-API-Key');
32
+ if (!apiKey)
33
+ return errorResponse('API key mancante. Usa header X-API-Key', 401);
34
+ const keyData = await ctx.runQuery(api.apiKeys.validateApiKey, { plainKey: apiKey });
35
+ if (!keyData)
36
+ return errorResponse('API key non valida o scaduta', 401);
37
+ if (!keyData.permissions.includes('comments:add')) {
38
+ return errorResponse('API key non ha il permesso "comments:add"', 403);
39
+ }
40
+ let body;
41
+ try {
42
+ body = await request.json();
43
+ }
44
+ catch {
45
+ return errorResponse('Body JSON non valido', 400);
46
+ }
47
+ const { ticketId, content, authorEmail, authorName, isInternal } = body;
48
+ if (!ticketId)
49
+ return errorResponse('Campo "ticketId" obbligatorio', 400);
50
+ if (!content || typeof content !== 'string' || content.trim().length === 0) {
51
+ return errorResponse('Campo "content" obbligatorio e non vuoto', 400);
52
+ }
53
+ try {
54
+ const commentId = await ctx.runMutation(api.ticketComments.addCommentFromApi, {
55
+ taskId: ticketId,
56
+ content: content.trim(),
57
+ authorEmail: authorEmail || undefined,
58
+ authorName: authorName || undefined,
59
+ isInternal: isInternal || false,
60
+ });
61
+ await ctx.runMutation(internal.apiKeys.recordApiKeyUsage, { keyId: keyData.keyId });
62
+ return jsonResponse({ success: true, commentId, message: 'Commento aggiunto con successo' });
63
+ }
64
+ catch (error) {
65
+ if (error.message?.includes('Ticket not found'))
66
+ return errorResponse('Ticket non trovato', 404);
67
+ throw error;
68
+ }
69
+ }
70
+ catch (error) {
71
+ console.error('Error in /api/comments/add:', error);
72
+ return errorResponse('Errore interno del server: ' + error.message, 500);
73
+ }
74
+ }),
75
+ });
76
+ http.route({
77
+ path: '/api/comments/list',
78
+ method: 'OPTIONS',
79
+ handler: httpAction(async () => {
80
+ return new Response(null, { status: 204, headers: corsHeaders });
81
+ }),
82
+ });
83
+ http.route({
84
+ path: '/api/comments/list',
85
+ method: 'GET',
86
+ handler: httpAction(async (ctx, request) => {
87
+ try {
88
+ const apiKey = request.headers.get('X-API-Key');
89
+ if (!apiKey)
90
+ return errorResponse('API key mancante', 401);
91
+ const keyData = await ctx.runQuery(api.apiKeys.validateApiKey, { plainKey: apiKey });
92
+ if (!keyData)
93
+ return errorResponse('API key non valida', 401);
94
+ if (!keyData.permissions.includes('comments:read')) {
95
+ return errorResponse('API key non ha il permesso "comments:read"', 403);
96
+ }
97
+ const url = new URL(request.url);
98
+ const ticketId = url.searchParams.get('ticketId');
99
+ if (!ticketId)
100
+ return errorResponse('Parametro "ticketId" obbligatorio', 400);
101
+ const comments = await ctx.runQuery(internal.ticketComments.listCommentsInternal, { taskId: ticketId });
102
+ await ctx.runMutation(internal.apiKeys.recordApiKeyUsage, { keyId: keyData.keyId });
103
+ return jsonResponse({ success: true, comments, count: comments.length });
104
+ }
105
+ catch (error) {
106
+ console.error('Error in /api/comments/list:', error);
107
+ return errorResponse('Errore interno: ' + error.message, 500);
108
+ }
109
+ }),
110
+ });
111
+ http.route({
112
+ path: '/api/tickets/get',
113
+ method: 'OPTIONS',
114
+ handler: httpAction(async () => {
115
+ return new Response(null, { status: 204, headers: corsHeaders });
116
+ }),
117
+ });
118
+ http.route({
119
+ path: '/api/tickets/get',
120
+ method: 'GET',
121
+ handler: httpAction(async (ctx, request) => {
122
+ try {
123
+ const apiKey = request.headers.get('X-API-Key');
124
+ if (!apiKey)
125
+ return errorResponse('API key mancante', 401);
126
+ const keyData = await ctx.runQuery(api.apiKeys.validateApiKey, { plainKey: apiKey });
127
+ if (!keyData)
128
+ return errorResponse('API key non valida', 401);
129
+ if (!keyData.permissions.includes('tickets:read')) {
130
+ return errorResponse('API key non ha il permesso "tickets:read"', 403);
131
+ }
132
+ const url = new URL(request.url);
133
+ const ticketId = url.searchParams.get('ticketId');
134
+ if (!ticketId)
135
+ return errorResponse('Parametro "ticketId" obbligatorio', 400);
136
+ const ticket = await ctx.runQuery(internal.maintenanceTasks.getTicketInternal, { taskId: ticketId });
137
+ if (!ticket)
138
+ return errorResponse('Ticket non trovato', 404);
139
+ await ctx.runMutation(internal.apiKeys.recordApiKeyUsage, { keyId: keyData.keyId });
140
+ return jsonResponse({ success: true, ticket });
141
+ }
142
+ catch (error) {
143
+ console.error('Error in /api/tickets/get:', error);
144
+ return errorResponse('Errore interno: ' + error.message, 500);
145
+ }
146
+ }),
147
+ });
148
+ http.route({
149
+ path: '/api/tickets/create',
150
+ method: 'OPTIONS',
151
+ handler: httpAction(async () => {
152
+ return new Response(null, { status: 204, headers: corsHeaders });
153
+ }),
154
+ });
155
+ http.route({
156
+ path: '/api/tickets/create',
157
+ method: 'POST',
158
+ handler: httpAction(async (ctx, request) => {
159
+ try {
160
+ const apiKey = request.headers.get('X-API-Key');
161
+ if (!apiKey)
162
+ return errorResponse('API key mancante. Usa header X-API-Key', 401);
163
+ const keyData = await ctx.runQuery(api.apiKeys.validateApiKey, { plainKey: apiKey });
164
+ if (!keyData)
165
+ return errorResponse('API key non valida o scaduta', 401);
166
+ if (!keyData.permissions.includes('tickets:create')) {
167
+ return errorResponse('API key non ha il permesso "tickets:create"', 403);
168
+ }
169
+ let body;
170
+ try {
171
+ body = await request.json();
172
+ }
173
+ catch {
174
+ return errorResponse('Body JSON non valido', 400);
175
+ }
176
+ const { clinicId, primoupId, clinicName, description, title, externalTicketId, externalTicketNumber, creatorEmail, creatorName, priority } = body;
177
+ if (!clinicId && !primoupId && !clinicName) {
178
+ return errorResponse('Devi fornire almeno uno tra: clinicId, primoupId, clinicName', 400);
179
+ }
180
+ if (!description || typeof description !== 'string' || description.trim().length === 0) {
181
+ return errorResponse('Campo "description" obbligatorio e non vuoto', 400);
182
+ }
183
+ const clinic = await ctx.runQuery(internal.maintenanceTasks.findClinicInternal, {
184
+ clinicId, primoupId: primoupId?.toString(), clinicName,
185
+ });
186
+ if (!clinic)
187
+ return errorResponse('Clinica non trovata', 404);
188
+ const validPriorities = ['low', 'medium', 'high'];
189
+ if (priority && !validPriorities.includes(priority)) {
190
+ return errorResponse(`Priorità non valida. Usa: ${validPriorities.join(', ')}`, 400);
191
+ }
192
+ try {
193
+ const taskId = await ctx.runMutation(internal.maintenanceTasks.createExternalTicket, {
194
+ clinicId: clinic._id,
195
+ description: description.trim(),
196
+ title: title || undefined,
197
+ externalTicketId: externalTicketId || undefined,
198
+ externalTicketNumber: externalTicketNumber || undefined,
199
+ creatorEmail: creatorEmail || undefined,
200
+ creatorName: creatorName || undefined,
201
+ priority: priority || undefined,
202
+ });
203
+ await ctx.runMutation(internal.apiKeys.recordApiKeyUsage, { keyId: keyData.keyId });
204
+ return jsonResponse({ success: true, ticketId: taskId, message: 'Segnalazione creata con successo.' });
205
+ }
206
+ catch (error) {
207
+ return errorResponse('Errore nella creazione del ticket: ' + error.message, 500);
208
+ }
209
+ }
210
+ catch (error) {
211
+ console.error('Error in /api/tickets/create:', error);
212
+ return errorResponse('Errore interno del server: ' + error.message, 500);
213
+ }
214
+ }),
215
+ });
216
+ http.route({
217
+ path: '/api/health',
218
+ method: 'GET',
219
+ handler: httpAction(async () => {
220
+ return jsonResponse({
221
+ success: true,
222
+ status: 'healthy',
223
+ timestamp: new Date().toISOString(),
224
+ version: '1.0.0',
225
+ });
226
+ }),
227
+ });
228
+ export default http;
229
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/component/http.ts"],"names":[],"mappings":"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"}