@primocaredentgroup/prescriptions-component 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 (120) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -0
  3. package/dist/_internal/client/PrescriptionsComponentClient.d.ts +25 -0
  4. package/dist/_internal/client/PrescriptionsComponentClient.d.ts.map +1 -0
  5. package/dist/_internal/client/PrescriptionsComponentClient.js +61 -0
  6. package/dist/_internal/client/PrescriptionsComponentClient.js.map +1 -0
  7. package/dist/_internal/client/index.d.ts +3 -0
  8. package/dist/_internal/client/index.d.ts.map +1 -0
  9. package/dist/_internal/client/index.js +2 -0
  10. package/dist/_internal/client/index.js.map +1 -0
  11. package/dist/_internal/client/types.d.ts +47 -0
  12. package/dist/_internal/client/types.d.ts.map +1 -0
  13. package/dist/_internal/client/types.js +2 -0
  14. package/dist/_internal/client/types.js.map +1 -0
  15. package/dist/_internal/component/convex.config.d.ts +7 -0
  16. package/dist/_internal/component/convex.config.d.ts.map +1 -0
  17. package/dist/_internal/component/convex.config.js +8 -0
  18. package/dist/_internal/component/convex.config.js.map +1 -0
  19. package/dist/_internal/component/functions.d.ts +9 -0
  20. package/dist/_internal/component/functions.d.ts.map +1 -0
  21. package/dist/_internal/component/functions.js +11 -0
  22. package/dist/_internal/component/functions.js.map +1 -0
  23. package/dist/_internal/component/index.d.ts +18 -0
  24. package/dist/_internal/component/index.d.ts.map +1 -0
  25. package/dist/_internal/component/index.js +20 -0
  26. package/dist/_internal/component/index.js.map +1 -0
  27. package/dist/_internal/component/schema.d.ts +2 -0
  28. package/dist/_internal/component/schema.d.ts.map +1 -0
  29. package/dist/_internal/component/schema.js +2 -0
  30. package/dist/_internal/component/schema.js.map +1 -0
  31. package/dist/_internal/react/PrescriptionsWidget.d.ts +18 -0
  32. package/dist/_internal/react/PrescriptionsWidget.d.ts.map +1 -0
  33. package/dist/_internal/react/PrescriptionsWidget.js +137 -0
  34. package/dist/_internal/react/PrescriptionsWidget.js.map +1 -0
  35. package/dist/_internal/react/index.d.ts +3 -0
  36. package/dist/_internal/react/index.d.ts.map +1 -0
  37. package/dist/_internal/react/index.js +2 -0
  38. package/dist/_internal/react/index.js.map +1 -0
  39. package/dist/client/index.d.ts +1 -0
  40. package/dist/client/index.js +1 -0
  41. package/dist/component/convex.config.d.ts +2 -0
  42. package/dist/component/convex.config.js +2 -0
  43. package/dist/component/index.d.ts +1 -0
  44. package/dist/component/index.js +1 -0
  45. package/dist/convex/lib/auth.d.ts +7 -0
  46. package/dist/convex/lib/auth.d.ts.map +1 -0
  47. package/dist/convex/lib/auth.js +38 -0
  48. package/dist/convex/lib/auth.js.map +1 -0
  49. package/dist/convex/lib/clinicalNormalize.d.ts +13 -0
  50. package/dist/convex/lib/clinicalNormalize.d.ts.map +1 -0
  51. package/dist/convex/lib/clinicalNormalize.js +82 -0
  52. package/dist/convex/lib/clinicalNormalize.js.map +1 -0
  53. package/dist/convex/lib/dental.d.ts +13 -0
  54. package/dist/convex/lib/dental.d.ts.map +1 -0
  55. package/dist/convex/lib/dental.js +79 -0
  56. package/dist/convex/lib/dental.js.map +1 -0
  57. package/dist/convex/lib/dynamicFieldsStrict.d.ts +9 -0
  58. package/dist/convex/lib/dynamicFieldsStrict.d.ts.map +1 -0
  59. package/dist/convex/lib/dynamicFieldsStrict.js +65 -0
  60. package/dist/convex/lib/dynamicFieldsStrict.js.map +1 -0
  61. package/dist/convex/lib/dynamicRules.d.ts +61 -0
  62. package/dist/convex/lib/dynamicRules.d.ts.map +1 -0
  63. package/dist/convex/lib/dynamicRules.js +221 -0
  64. package/dist/convex/lib/dynamicRules.js.map +1 -0
  65. package/dist/convex/lib/storage.d.ts +59 -0
  66. package/dist/convex/lib/storage.d.ts.map +1 -0
  67. package/dist/convex/lib/storage.js +120 -0
  68. package/dist/convex/lib/storage.js.map +1 -0
  69. package/dist/convex/lib/utils.d.ts +61 -0
  70. package/dist/convex/lib/utils.d.ts.map +1 -0
  71. package/dist/convex/lib/utils.js +135 -0
  72. package/dist/convex/lib/utils.js.map +1 -0
  73. package/dist/convex/lib/validation.d.ts +24 -0
  74. package/dist/convex/lib/validation.d.ts.map +1 -0
  75. package/dist/convex/lib/validation.js +333 -0
  76. package/dist/convex/lib/validation.js.map +1 -0
  77. package/dist/convex/mutations/digitalAssets.d.ts +54 -0
  78. package/dist/convex/mutations/digitalAssets.d.ts.map +1 -0
  79. package/dist/convex/mutations/digitalAssets.js +297 -0
  80. package/dist/convex/mutations/digitalAssets.js.map +1 -0
  81. package/dist/convex/mutations/operational.d.ts +38 -0
  82. package/dist/convex/mutations/operational.d.ts.map +1 -0
  83. package/dist/convex/mutations/operational.js +226 -0
  84. package/dist/convex/mutations/operational.js.map +1 -0
  85. package/dist/convex/mutations/phases.d.ts +45 -0
  86. package/dist/convex/mutations/phases.d.ts.map +1 -0
  87. package/dist/convex/mutations/phases.js +334 -0
  88. package/dist/convex/mutations/phases.js.map +1 -0
  89. package/dist/convex/mutations/prescriptions.d.ts +191 -0
  90. package/dist/convex/mutations/prescriptions.d.ts.map +1 -0
  91. package/dist/convex/mutations/prescriptions.js +1263 -0
  92. package/dist/convex/mutations/prescriptions.js.map +1 -0
  93. package/dist/convex/mutations/syncJobs.d.ts +37 -0
  94. package/dist/convex/mutations/syncJobs.d.ts.map +1 -0
  95. package/dist/convex/mutations/syncJobs.js +238 -0
  96. package/dist/convex/mutations/syncJobs.js.map +1 -0
  97. package/dist/convex/prescriptions/fields.d.ts +50 -0
  98. package/dist/convex/prescriptions/fields.d.ts.map +1 -0
  99. package/dist/convex/prescriptions/fields.js +242 -0
  100. package/dist/convex/prescriptions/fields.js.map +1 -0
  101. package/dist/convex/queries/dynamicFields.d.ts +27 -0
  102. package/dist/convex/queries/dynamicFields.d.ts.map +1 -0
  103. package/dist/convex/queries/dynamicFields.js +119 -0
  104. package/dist/convex/queries/dynamicFields.js.map +1 -0
  105. package/dist/convex/queries/prescriptions.d.ts +583 -0
  106. package/dist/convex/queries/prescriptions.d.ts.map +1 -0
  107. package/dist/convex/queries/prescriptions.js +208 -0
  108. package/dist/convex/queries/prescriptions.js.map +1 -0
  109. package/dist/convex/schema.d.ts +962 -0
  110. package/dist/convex/schema.d.ts.map +1 -0
  111. package/dist/convex/schema.js +434 -0
  112. package/dist/convex/schema.js.map +1 -0
  113. package/dist/convex/types.d.ts +267 -0
  114. package/dist/convex/types.d.ts.map +1 -0
  115. package/dist/convex/types.js +2 -0
  116. package/dist/convex/types.js.map +1 -0
  117. package/dist/react/index.d.ts +1 -0
  118. package/dist/react/index.js +1 -0
  119. package/dist/react/styles.css +54 -0
  120. package/package.json +82 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamicRules.js","sourceRoot":"","sources":["../../../convex/lib/dynamicRules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { MutationCtx, QueryCtx, ActionCtx } from "../_generated/server";
2
+ export type StorageProvider = "CONVEX" | "S3";
3
+ export interface DigitalAsset {
4
+ assetId: string;
5
+ fileName: string;
6
+ fileSize: number;
7
+ mimeType: string;
8
+ description?: string;
9
+ storageProvider: StorageProvider;
10
+ storageId: string;
11
+ storageUrl?: string;
12
+ uploadedAt: number;
13
+ uploadedBy: string;
14
+ }
15
+ export interface UploadResult {
16
+ success: boolean;
17
+ asset?: DigitalAsset;
18
+ error?: string;
19
+ }
20
+ export declare const STORAGE_CONFIG: {
21
+ activeProvider: StorageProvider;
22
+ s3: {
23
+ bucket: string;
24
+ region: string;
25
+ };
26
+ maxFileSize: number;
27
+ maxFilesPerPrescription: number;
28
+ allowedMimeTypes: string[];
29
+ };
30
+ /**
31
+ * Genera un URL per accedere al file.
32
+ * Per Convex usa getUrl(), per S3 userà URL firmati.
33
+ */
34
+ export declare function getFileUrl(ctx: QueryCtx | ActionCtx, asset: DigitalAsset): Promise<string | null>;
35
+ /**
36
+ * Genera un URL di upload per il client.
37
+ * Per Convex usa generateUploadUrl(), per S3 userà presigned URL.
38
+ */
39
+ export declare function generateUploadUrl(ctx: MutationCtx): Promise<string>;
40
+ /**
41
+ * Elimina un file dallo storage.
42
+ */
43
+ export declare function deleteFile(ctx: MutationCtx, asset: DigitalAsset): Promise<boolean>;
44
+ /**
45
+ * Valida un file prima dell'upload.
46
+ */
47
+ export declare function validateFile(fileName: string, fileSize: number, mimeType: string): {
48
+ valid: boolean;
49
+ error?: string;
50
+ };
51
+ /**
52
+ * Genera un ID univoco per l'asset.
53
+ */
54
+ export declare function generateAssetId(): string;
55
+ /**
56
+ * Crea un oggetto DigitalAsset dai dati di upload.
57
+ */
58
+ export declare function createDigitalAsset(storageId: string, fileName: string, fileSize: number, mimeType: string, uploadedBy: string, description?: string): DigitalAsset;
59
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../convex/lib/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAUxE,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,IAAI,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,eAAe,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,eAAO,MAAM,cAAc;oBAEG,eAAe;;;;;;;;CAkB5C,CAAC;AAEF;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,QAAQ,GAAG,SAAS,EACzB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWxB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,OAAO,CAAC,CAelB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA0BpC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,YAAY,CAYd"}
@@ -0,0 +1,120 @@
1
+ // Configurazione storage (cambierà quando S3 sarà pronto)
2
+ export const STORAGE_CONFIG = {
3
+ // Provider attivo (cambiare a "S3" quando pronto)
4
+ activeProvider: "CONVEX",
5
+ // Configurazione S3 (da completare)
6
+ s3: {
7
+ bucket: globalThis.process?.env?.AWS_S3_BUCKET || "",
8
+ region: globalThis.process?.env?.AWS_REGION || "eu-west-1",
9
+ // Le credenziali verranno da variabili d'ambiente
10
+ },
11
+ // Limiti
12
+ maxFileSize: 100 * 1024 * 1024, // 100MB max
13
+ maxFilesPerPrescription: 5,
14
+ allowedMimeTypes: [
15
+ "model/stl",
16
+ "application/sla",
17
+ "application/vnd.ms-pki.stl",
18
+ "application/octet-stream", // Alcuni browser inviano STL così
19
+ ],
20
+ };
21
+ /**
22
+ * Genera un URL per accedere al file.
23
+ * Per Convex usa getUrl(), per S3 userà URL firmati.
24
+ */
25
+ export async function getFileUrl(ctx, asset) {
26
+ if (asset.storageProvider === "CONVEX") {
27
+ // Convex File Storage
28
+ const url = await ctx.storage.getUrl(asset.storageId);
29
+ return url;
30
+ }
31
+ else if (asset.storageProvider === "S3") {
32
+ // AWS S3 - per ora ritorna l'URL salvato
33
+ // In futuro genererà URL firmati on-demand
34
+ return asset.storageUrl || null;
35
+ }
36
+ return null;
37
+ }
38
+ /**
39
+ * Genera un URL di upload per il client.
40
+ * Per Convex usa generateUploadUrl(), per S3 userà presigned URL.
41
+ */
42
+ export async function generateUploadUrl(ctx) {
43
+ if (STORAGE_CONFIG.activeProvider === "CONVEX") {
44
+ return await ctx.storage.generateUploadUrl();
45
+ }
46
+ else {
47
+ // S3 - da implementare con presigned URL
48
+ throw new Error("S3 upload non ancora implementato");
49
+ }
50
+ }
51
+ /**
52
+ * Elimina un file dallo storage.
53
+ */
54
+ export async function deleteFile(ctx, asset) {
55
+ try {
56
+ if (asset.storageProvider === "CONVEX") {
57
+ await ctx.storage.delete(asset.storageId);
58
+ return true;
59
+ }
60
+ else if (asset.storageProvider === "S3") {
61
+ // S3 - da implementare
62
+ console.warn("S3 delete non ancora implementato");
63
+ return false;
64
+ }
65
+ return false;
66
+ }
67
+ catch (error) {
68
+ console.error("Errore eliminazione file:", error);
69
+ return false;
70
+ }
71
+ }
72
+ /**
73
+ * Valida un file prima dell'upload.
74
+ */
75
+ export function validateFile(fileName, fileSize, mimeType) {
76
+ // Verifica estensione
77
+ const ext = fileName.toLowerCase().split(".").pop();
78
+ if (ext !== "stl") {
79
+ return { valid: false, error: "Solo file STL sono ammessi" };
80
+ }
81
+ // Verifica dimensione
82
+ if (fileSize > STORAGE_CONFIG.maxFileSize) {
83
+ const maxMB = STORAGE_CONFIG.maxFileSize / (1024 * 1024);
84
+ return { valid: false, error: `File troppo grande (max ${maxMB}MB)` };
85
+ }
86
+ // Verifica MIME type (permissivo perché i browser variano)
87
+ // STL può arrivare come vari MIME types
88
+ const allowedTypes = [
89
+ ...STORAGE_CONFIG.allowedMimeTypes,
90
+ "", // Alcuni browser non inviano MIME type
91
+ ];
92
+ if (mimeType && !allowedTypes.includes(mimeType)) {
93
+ // Log warning ma non bloccare (MIME type STL non è standardizzato)
94
+ console.warn(`MIME type non standard per STL: ${mimeType}`);
95
+ }
96
+ return { valid: true };
97
+ }
98
+ /**
99
+ * Genera un ID univoco per l'asset.
100
+ */
101
+ export function generateAssetId() {
102
+ return `stl_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
103
+ }
104
+ /**
105
+ * Crea un oggetto DigitalAsset dai dati di upload.
106
+ */
107
+ export function createDigitalAsset(storageId, fileName, fileSize, mimeType, uploadedBy, description) {
108
+ return {
109
+ assetId: generateAssetId(),
110
+ fileName,
111
+ fileSize,
112
+ mimeType: mimeType || "model/stl",
113
+ description,
114
+ storageProvider: STORAGE_CONFIG.activeProvider,
115
+ storageId,
116
+ uploadedAt: Date.now(),
117
+ uploadedBy,
118
+ };
119
+ }
120
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../convex/lib/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Canonicalizza un oggetto JSON in modo deterministico.
3
+ * Le chiavi vengono ordinate ricorsivamente in ordine alfabetico.
4
+ * Questo è fondamentale per garantire hash consistenti.
5
+ */
6
+ export declare function canonicalizeJson(obj: unknown): string;
7
+ /**
8
+ * Calcola SHA-256 hash di una stringa.
9
+ * Nota: in Convex runtime, usiamo SubtleCrypto.
10
+ */
11
+ export declare function sha256Hash(data: string): Promise<string>;
12
+ /**
13
+ * Calcola l'hash clinico dei dati.
14
+ * Canonicalizza prima l'oggetto, poi calcola SHA-256.
15
+ */
16
+ export declare function computeClinicalHash(clinicalData: unknown): Promise<string>;
17
+ /**
18
+ * Genera una chiave di idempotenza stabile.
19
+ */
20
+ export declare function generateIdempotencyKey(...parts: string[]): string;
21
+ /**
22
+ * Calcola il tempo per il prossimo retry con backoff esponenziale.
23
+ * @param attempts Numero di tentativi già effettuati
24
+ * @param baseDelayMs Delay base in millisecondi (default: 1000)
25
+ * @param maxDelayMs Delay massimo in millisecondi (default: 3600000 = 1 ora)
26
+ */
27
+ export declare function calculateNextRetryTime(attempts: number, baseDelayMs?: number, maxDelayMs?: number): number;
28
+ /**
29
+ * Verifica se un valore esiste (non è null/undefined).
30
+ */
31
+ export declare function exists(value: unknown): boolean;
32
+ /**
33
+ * Deep get di un valore da un oggetto usando dot notation.
34
+ * Es: getNestedValue(obj, "application.type") => obj.application.type
35
+ */
36
+ export declare function getNestedValue(obj: unknown, path: string): unknown;
37
+ /**
38
+ * Valida una condizione del flow.
39
+ */
40
+ export declare function evaluateCondition(data: unknown, condition: {
41
+ fieldPath: string;
42
+ op: "eq" | "neq" | "in" | "exists";
43
+ value?: unknown;
44
+ }): boolean;
45
+ /**
46
+ * Formatta una data timestamp in stringa leggibile.
47
+ */
48
+ export declare function formatTimestamp(timestamp: number): string;
49
+ /**
50
+ * Verifica se uno status è "attivo" (non terminale).
51
+ */
52
+ export declare function isActiveStatus(status: string): boolean;
53
+ /**
54
+ * Lista di status che permettono modifiche cliniche.
55
+ */
56
+ export declare const EDITABLE_STATUSES: readonly ["DRAFT", "PENDING_DOCTOR"];
57
+ /**
58
+ * Verifica se una prescrizione è modificabile.
59
+ */
60
+ export declare function isEditable(status: string): boolean;
61
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../convex/lib/utils.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAErD;AA0BD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM9D;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEjE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAO,EAClB,UAAU,SAAU,GACnB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE9C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAelE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,EACb,SAAS,EAAE;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACA,OAAO,CAgBT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,sCAAuC,CAAC;AAEtE;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAElD"}
@@ -0,0 +1,135 @@
1
+ // ============================================
2
+ // UTILITY FUNCTIONS
3
+ // ============================================
4
+ /**
5
+ * Canonicalizza un oggetto JSON in modo deterministico.
6
+ * Le chiavi vengono ordinate ricorsivamente in ordine alfabetico.
7
+ * Questo è fondamentale per garantire hash consistenti.
8
+ */
9
+ export function canonicalizeJson(obj) {
10
+ return JSON.stringify(sortObjectKeys(obj));
11
+ }
12
+ /**
13
+ * Ordina ricorsivamente le chiavi di un oggetto.
14
+ */
15
+ function sortObjectKeys(obj) {
16
+ if (obj === null || obj === undefined) {
17
+ return obj;
18
+ }
19
+ if (Array.isArray(obj)) {
20
+ return obj.map(sortObjectKeys);
21
+ }
22
+ if (typeof obj === "object") {
23
+ const sorted = {};
24
+ const keys = Object.keys(obj).sort();
25
+ for (const key of keys) {
26
+ sorted[key] = sortObjectKeys(obj[key]);
27
+ }
28
+ return sorted;
29
+ }
30
+ return obj;
31
+ }
32
+ /**
33
+ * Calcola SHA-256 hash di una stringa.
34
+ * Nota: in Convex runtime, usiamo SubtleCrypto.
35
+ */
36
+ export async function sha256Hash(data) {
37
+ const encoder = new TextEncoder();
38
+ const dataBuffer = encoder.encode(data);
39
+ const hashBuffer = await crypto.subtle.digest("SHA-256", dataBuffer);
40
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
41
+ return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
42
+ }
43
+ /**
44
+ * Calcola l'hash clinico dei dati.
45
+ * Canonicalizza prima l'oggetto, poi calcola SHA-256.
46
+ */
47
+ export async function computeClinicalHash(clinicalData) {
48
+ const canonical = canonicalizeJson(clinicalData);
49
+ return sha256Hash(canonical);
50
+ }
51
+ /**
52
+ * Genera una chiave di idempotenza stabile.
53
+ */
54
+ export function generateIdempotencyKey(...parts) {
55
+ return parts.join("-");
56
+ }
57
+ /**
58
+ * Calcola il tempo per il prossimo retry con backoff esponenziale.
59
+ * @param attempts Numero di tentativi già effettuati
60
+ * @param baseDelayMs Delay base in millisecondi (default: 1000)
61
+ * @param maxDelayMs Delay massimo in millisecondi (default: 3600000 = 1 ora)
62
+ */
63
+ export function calculateNextRetryTime(attempts, baseDelayMs = 1000, maxDelayMs = 3600000) {
64
+ const delay = Math.min(baseDelayMs * Math.pow(2, attempts), maxDelayMs);
65
+ // Aggiungi jitter per evitare thundering herd
66
+ const jitter = Math.random() * delay * 0.1;
67
+ return Date.now() + delay + jitter;
68
+ }
69
+ /**
70
+ * Verifica se un valore esiste (non è null/undefined).
71
+ */
72
+ export function exists(value) {
73
+ return value !== null && value !== undefined;
74
+ }
75
+ /**
76
+ * Deep get di un valore da un oggetto usando dot notation.
77
+ * Es: getNestedValue(obj, "application.type") => obj.application.type
78
+ */
79
+ export function getNestedValue(obj, path) {
80
+ const parts = path.split(".");
81
+ let current = obj;
82
+ for (const part of parts) {
83
+ if (current === null || current === undefined) {
84
+ return undefined;
85
+ }
86
+ if (typeof current !== "object") {
87
+ return undefined;
88
+ }
89
+ current = current[part];
90
+ }
91
+ return current;
92
+ }
93
+ /**
94
+ * Valida una condizione del flow.
95
+ */
96
+ export function evaluateCondition(data, condition) {
97
+ const fieldValue = getNestedValue(data, condition.fieldPath);
98
+ switch (condition.op) {
99
+ case "eq":
100
+ return fieldValue === condition.value;
101
+ case "neq":
102
+ return fieldValue !== condition.value;
103
+ case "in":
104
+ if (!Array.isArray(condition.value))
105
+ return false;
106
+ return condition.value.includes(fieldValue);
107
+ case "exists":
108
+ return exists(fieldValue);
109
+ default:
110
+ return false;
111
+ }
112
+ }
113
+ /**
114
+ * Formatta una data timestamp in stringa leggibile.
115
+ */
116
+ export function formatTimestamp(timestamp) {
117
+ return new Date(timestamp).toISOString();
118
+ }
119
+ /**
120
+ * Verifica se uno status è "attivo" (non terminale).
121
+ */
122
+ export function isActiveStatus(status) {
123
+ return !["CANCELLED", "SUPERSEDED", "SYNCED"].includes(status);
124
+ }
125
+ /**
126
+ * Lista di status che permettono modifiche cliniche.
127
+ */
128
+ export const EDITABLE_STATUSES = ["DRAFT", "PENDING_DOCTOR"];
129
+ /**
130
+ * Verifica se una prescrizione è modificabile.
131
+ */
132
+ export function isEditable(status) {
133
+ return EDITABLE_STATUSES.includes(status);
134
+ }
135
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../convex/lib/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { ClinicalData, FlowDefinition, FlowPhase, ValidationError } from "../types";
2
+ /**
3
+ * Valida i dati clinici secondo le regole del flow.
4
+ */
5
+ export declare function validateClinicalData(clinicalData: ClinicalData, flowDefinition: FlowDefinition, forSignature?: boolean): ValidationError[];
6
+ /**
7
+ * Valida che le fasi richieste siano completate.
8
+ */
9
+ export declare function validatePhaseCompletion(phases: FlowPhase[], phaseStatuses: Map<string, string>, clinicalData: ClinicalData, conditions: FlowDefinition["conditions"]): ValidationError[];
10
+ /**
11
+ * Valida i requisiti per una prescrizione digitale.
12
+ * Se il tipo è DIGITAL, deve avere almeno 1 file STL.
13
+ */
14
+ export declare function validateDigitalRequirements(prescriptionType: string | undefined, digitalAssets: Array<{
15
+ assetId: string;
16
+ }> | undefined): ValidationError[];
17
+ /**
18
+ * Verifica che un utente possa eseguire un'azione.
19
+ */
20
+ export declare function canUserPerformAction(userRole: string, action: string, prescriptionStatus: string): {
21
+ allowed: boolean;
22
+ reason?: string;
23
+ };
24
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../convex/lib/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAQpF;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,cAAc,EAC9B,YAAY,GAAE,OAAe,GAC5B,eAAe,EAAE,CA6FnB;AAqKD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EAAE,EACnB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,cAAc,CAAC,YAAY,CAAC,GACvC,eAAe,EAAE,CAsCnB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,aAAa,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,GACpD,eAAe,EAAE,CAiBnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,GACzB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAgCvC"}