@tstdl/base 0.92.129 → 0.92.131

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 (72) hide show
  1. package/ai/ai.service.js +4 -4
  2. package/api/server/api-controller.js +1 -2
  3. package/document-management/api/document-management.api.d.ts +25 -55
  4. package/document-management/api/document-management.api.js +9 -18
  5. package/document-management/models/document-request-collection-assignment.model.d.ts +7 -0
  6. package/document-management/models/{document-request-collection.model.js → document-request-collection-assignment.model.js} +6 -6
  7. package/document-management/models/index.d.ts +1 -1
  8. package/document-management/models/index.js +1 -1
  9. package/document-management/server/api/document-management.api.d.ts +26 -0
  10. package/document-management/server/api/document-management.api.js +169 -0
  11. package/document-management/server/api/index.d.ts +1 -0
  12. package/document-management/server/api/index.js +1 -0
  13. package/document-management/server/drizzle/{0000_cool_victor_mancha.sql → 0000_magical_madame_hydra.sql} +128 -96
  14. package/document-management/server/drizzle/meta/0000_snapshot.json +768 -492
  15. package/document-management/server/drizzle/meta/_journal.json +2 -9
  16. package/document-management/server/index.d.ts +1 -0
  17. package/document-management/server/index.js +1 -0
  18. package/document-management/server/schemas.d.ts +3 -2
  19. package/document-management/server/schemas.js +3 -2
  20. package/document-management/server/services/document-category-type.service.d.ts +2 -0
  21. package/document-management/server/services/document-category-type.service.js +26 -15
  22. package/document-management/server/services/document-collection.service.js +13 -2
  23. package/document-management/server/services/document-file.service.js +15 -4
  24. package/document-management/server/services/document-management-ai.service.js +19 -8
  25. package/document-management/server/services/document-management-ancillary.service.d.ts +21 -40
  26. package/document-management/server/services/document-management-ancillary.service.js +25 -14
  27. package/document-management/server/services/document-management.service.d.ts +1 -1
  28. package/document-management/server/services/document-management.service.js +53 -34
  29. package/document-management/server/services/document-property.service.d.ts +2 -34
  30. package/document-management/server/services/document-property.service.js +20 -8
  31. package/document-management/server/services/document-request.service.js +11 -11
  32. package/document-management/server/services/document-validation.service.js +15 -4
  33. package/document-management/server/services/document-workflow.service.js +27 -16
  34. package/document-management/server/services/document.service.d.ts +10 -2
  35. package/document-management/server/services/document.service.js +61 -8
  36. package/document-management/server/services/index.d.ts +1 -0
  37. package/document-management/server/services/index.js +1 -0
  38. package/document-management/server/services/singleton.d.ts +4 -0
  39. package/document-management/server/services/singleton.js +12 -0
  40. package/document-management/service-models/document.service-model.d.ts +8 -9
  41. package/document-management/service-models/document.service-model.js +1 -1
  42. package/eslint.config.js +1 -0
  43. package/examples/document-management/categories-and-types.d.ts +324 -0
  44. package/examples/document-management/categories-and-types.js +363 -0
  45. package/examples/document-management/main.d.ts +7 -8
  46. package/examples/document-management/main.js +86 -27
  47. package/injector/decorators.d.ts +1 -0
  48. package/injector/decorators.js +41 -12
  49. package/injector/inject.d.ts +12 -2
  50. package/injector/injector.d.ts +3 -2
  51. package/injector/injector.js +87 -36
  52. package/injector/symbols.d.ts +1 -0
  53. package/injector/symbols.js +1 -0
  54. package/module/modules/web-server.module.js +4 -4
  55. package/orm/server/database.d.ts +0 -4
  56. package/orm/server/database.js +0 -4
  57. package/orm/server/drizzle/schema-converter.js +5 -4
  58. package/orm/server/module.d.ts +0 -4
  59. package/orm/server/module.js +0 -2
  60. package/orm/server/query-converter.js +11 -38
  61. package/orm/server/repository.d.ts +3 -2
  62. package/orm/server/repository.js +2 -2
  63. package/orm/server/transaction.d.ts +5 -4
  64. package/orm/server/transaction.js +8 -3
  65. package/orm/server/transactional.js +3 -3
  66. package/orm/sqls.d.ts +4 -1
  67. package/orm/sqls.js +4 -1
  68. package/package.json +4 -4
  69. package/reflection/registry.js +6 -6
  70. package/document-management/models/document-request-collection.model.d.ts +0 -7
  71. package/document-management/server/drizzle/0001_concerned_quentin_quire.sql +0 -2
  72. package/document-management/server/drizzle/meta/0001_snapshot.json +0 -1932
@@ -0,0 +1,363 @@
1
+ import { defineEnum } from '../../enumeration/index.js';
2
+ export const TstdlDocumentCategory = defineEnum('TstdlDocumentCategory', {
3
+ // Top-Level Kategorien
4
+ PersoenlicheDokumente: 'persoenliche-dokumente',
5
+ Finanzen: 'finanzen',
6
+ ArbeitBeruf: 'arbeit-beruf',
7
+ HausWohnung: 'haus-wohnung',
8
+ Fahrzeuge: 'fahrzeuge',
9
+ HobbyFreizeit: 'hobby-freizeit',
10
+ DigitalesLizenzen: 'digitales-lizenzen',
11
+ Sonstiges: 'sonstiges',
12
+ // Persönliche Dokumente Unterkategorien
13
+ Ausweisdokumente: 'ausweisdokumente',
14
+ VertraegePrivat: 'vertraege-privat',
15
+ Versicherungsvertraege: 'versicherungsvertraege', // Unterkategorie von Verträge (Privat)
16
+ KfzVersicherung: 'kfz-versicherung', // Unterkategorie von Versicherungsverträge
17
+ ZeugnisseZertifikate: 'zeugnisse-zertifikate',
18
+ Gesundheit: 'gesundheit',
19
+ KorrespondenzPrivat: 'korrespondenz-privat',
20
+ // Finanzen Unterkategorien
21
+ Bankunterlagen: 'bankunterlagen',
22
+ Steuerunterlagen: 'steuerunterlagen',
23
+ Investitionen: 'investitionen',
24
+ AktienWertpapiere: 'aktien-wertpapiere', // Unterkategorie von Investitionen
25
+ ImmobilienFinanzen: 'immobilien-finanzen', // Unterkategorie von Investitionen
26
+ RechnungenBezahlt: 'rechnungen-bezahlt',
27
+ // Arbeit & Beruf Unterkategorien
28
+ ArbeitsvertraegeVereinbarungen: 'arbeitsvertraege-vereinbarungen',
29
+ Projekte: 'projekte',
30
+ ProjektAlpha: 'projekt-alpha', // Unterkategorie von Projekte
31
+ ProjektBeta: 'projekt-beta', // Unterkategorie von Projekte
32
+ WeiterbildungSchulung: 'weiterbildung-schulung',
33
+ Bewerbungsunterlagen: 'bewerbungsunterlagen',
34
+ // Haus & Wohnung Unterkategorien
35
+ HandwerkerRechnungen: 'handwerker-rechnungen', // Allgemeine Kategorie
36
+ Sanitaerarbeiten: 'sanitaerarbeiten', // Unterkategorie von HandwerkerRechnungen
37
+ Elektroarbeiten: 'elektroarbeiten', // Unterkategorie von HandwerkerRechnungen
38
+ Malerarbeiten: 'malerarbeiten', // Unterkategorie von HandwerkerRechnungen
39
+ });
40
+ export const TstdlCategoryParents = {
41
+ [TstdlDocumentCategory.PersoenlicheDokumente]: null,
42
+ [TstdlDocumentCategory.Finanzen]: null,
43
+ [TstdlDocumentCategory.ArbeitBeruf]: null,
44
+ [TstdlDocumentCategory.HausWohnung]: null,
45
+ [TstdlDocumentCategory.Fahrzeuge]: null,
46
+ [TstdlDocumentCategory.HobbyFreizeit]: null,
47
+ [TstdlDocumentCategory.DigitalesLizenzen]: null,
48
+ [TstdlDocumentCategory.Sonstiges]: null,
49
+ // Persönliche Dokumente Unterkategorien
50
+ [TstdlDocumentCategory.Ausweisdokumente]: TstdlDocumentCategory.PersoenlicheDokumente,
51
+ [TstdlDocumentCategory.VertraegePrivat]: TstdlDocumentCategory.PersoenlicheDokumente,
52
+ [TstdlDocumentCategory.Versicherungsvertraege]: TstdlDocumentCategory.VertraegePrivat,
53
+ [TstdlDocumentCategory.KfzVersicherung]: TstdlDocumentCategory.Versicherungsvertraege,
54
+ [TstdlDocumentCategory.ZeugnisseZertifikate]: TstdlDocumentCategory.PersoenlicheDokumente,
55
+ [TstdlDocumentCategory.Gesundheit]: TstdlDocumentCategory.PersoenlicheDokumente,
56
+ [TstdlDocumentCategory.KorrespondenzPrivat]: TstdlDocumentCategory.PersoenlicheDokumente,
57
+ // Finanzen Unterkategorien
58
+ [TstdlDocumentCategory.Bankunterlagen]: TstdlDocumentCategory.Finanzen,
59
+ [TstdlDocumentCategory.Steuerunterlagen]: TstdlDocumentCategory.Finanzen,
60
+ [TstdlDocumentCategory.Investitionen]: TstdlDocumentCategory.Finanzen,
61
+ [TstdlDocumentCategory.AktienWertpapiere]: TstdlDocumentCategory.Investitionen,
62
+ [TstdlDocumentCategory.ImmobilienFinanzen]: TstdlDocumentCategory.Investitionen,
63
+ [TstdlDocumentCategory.RechnungenBezahlt]: TstdlDocumentCategory.Finanzen,
64
+ // Arbeit & Beruf Unterkategorien
65
+ [TstdlDocumentCategory.ArbeitsvertraegeVereinbarungen]: TstdlDocumentCategory.ArbeitBeruf,
66
+ [TstdlDocumentCategory.Projekte]: TstdlDocumentCategory.ArbeitBeruf,
67
+ [TstdlDocumentCategory.ProjektAlpha]: TstdlDocumentCategory.Projekte,
68
+ [TstdlDocumentCategory.ProjektBeta]: TstdlDocumentCategory.Projekte,
69
+ [TstdlDocumentCategory.WeiterbildungSchulung]: TstdlDocumentCategory.ArbeitBeruf,
70
+ [TstdlDocumentCategory.Bewerbungsunterlagen]: TstdlDocumentCategory.ArbeitBeruf,
71
+ // Haus & Wohnung Unterkategorien
72
+ [TstdlDocumentCategory.HandwerkerRechnungen]: TstdlDocumentCategory.HausWohnung,
73
+ [TstdlDocumentCategory.Sanitaerarbeiten]: TstdlDocumentCategory.HandwerkerRechnungen,
74
+ [TstdlDocumentCategory.Elektroarbeiten]: TstdlDocumentCategory.HandwerkerRechnungen,
75
+ [TstdlDocumentCategory.Malerarbeiten]: TstdlDocumentCategory.HandwerkerRechnungen,
76
+ };
77
+ export const TstdlDocumentCategoryLabels = {
78
+ // Top-Level Labels
79
+ [TstdlDocumentCategory.PersoenlicheDokumente]: 'Persönliche Dokumente',
80
+ [TstdlDocumentCategory.Finanzen]: 'Finanzen',
81
+ [TstdlDocumentCategory.ArbeitBeruf]: 'Arbeit & Beruf',
82
+ [TstdlDocumentCategory.HausWohnung]: 'Haus & Wohnung',
83
+ [TstdlDocumentCategory.Fahrzeuge]: 'Fahrzeuge',
84
+ [TstdlDocumentCategory.HobbyFreizeit]: 'Hobby & Freizeit',
85
+ [TstdlDocumentCategory.DigitalesLizenzen]: 'Digitales & Lizenzen',
86
+ [TstdlDocumentCategory.Sonstiges]: 'Sonstiges',
87
+ // Persönliche Dokumente Unterkategorien Labels
88
+ [TstdlDocumentCategory.Ausweisdokumente]: 'Ausweisdokumente',
89
+ [TstdlDocumentCategory.VertraegePrivat]: 'Verträge (Privat)',
90
+ [TstdlDocumentCategory.Versicherungsvertraege]: 'Versicherungsverträge',
91
+ [TstdlDocumentCategory.KfzVersicherung]: 'Kfz-Versicherung',
92
+ [TstdlDocumentCategory.ZeugnisseZertifikate]: 'Zeugnisse und Zertifikate',
93
+ [TstdlDocumentCategory.Gesundheit]: 'Gesundheit',
94
+ [TstdlDocumentCategory.KorrespondenzPrivat]: 'Korrespondenz',
95
+ // Finanzen Unterkategorien Labels
96
+ [TstdlDocumentCategory.Bankunterlagen]: 'Bankunterlagen',
97
+ [TstdlDocumentCategory.Steuerunterlagen]: 'Steuerunterlagen',
98
+ [TstdlDocumentCategory.Investitionen]: 'Investitionen',
99
+ [TstdlDocumentCategory.AktienWertpapiere]: 'Aktien / Wertpapiere',
100
+ [TstdlDocumentCategory.ImmobilienFinanzen]: 'Immobilien (Finanzen)',
101
+ [TstdlDocumentCategory.RechnungenBezahlt]: 'Rechnungen (bezahlt)',
102
+ // Arbeit & Beruf Unterkategorien Labels
103
+ [TstdlDocumentCategory.ArbeitsvertraegeVereinbarungen]: 'Arbeitsverträge & Vereinbarungen',
104
+ [TstdlDocumentCategory.Projekte]: 'Projekte',
105
+ [TstdlDocumentCategory.ProjektAlpha]: 'Projekt Alpha',
106
+ [TstdlDocumentCategory.ProjektBeta]: 'Projekt Beta',
107
+ [TstdlDocumentCategory.WeiterbildungSchulung]: 'Weiterbildung & Schulung',
108
+ [TstdlDocumentCategory.Bewerbungsunterlagen]: 'Bewerbungsunterlagen',
109
+ // Haus & Wohnung Unterkategorien Labels
110
+ [TstdlDocumentCategory.HandwerkerRechnungen]: 'Handwerkerrechnungen',
111
+ [TstdlDocumentCategory.Sanitaerarbeiten]: 'Sanitärarbeiten',
112
+ [TstdlDocumentCategory.Elektroarbeiten]: 'Elektroarbeiten',
113
+ [TstdlDocumentCategory.Malerarbeiten]: 'Malerarbeiten',
114
+ };
115
+ export const TstdlDocumentType = defineEnum('TstdlDocumentType', {
116
+ // Persönliche Dokumente
117
+ Personalausweis: 'personalausweis',
118
+ Reisepass: 'reisepass',
119
+ Fuehrerschein: 'fuehrerschein',
120
+ Geburtsurkunde: 'geburtsurkunde',
121
+ Mietvertrag: 'mietvertrag',
122
+ Handyvertrag: 'handyvertrag',
123
+ HaftpflichtversicherungPolice: 'haftpflichtversicherung-police',
124
+ HausratversicherungPolice: 'hausratversicherung-police',
125
+ KfzVersicherungPolice: 'kfz-versicherung-police',
126
+ KfzVersicherungSchadensmeldung: 'kfz-versicherung-schadensmeldung',
127
+ KrankenversicherungPolice: 'krankenversicherung-police',
128
+ Arztbrief: 'arztbrief',
129
+ Impfpass: 'impfpass',
130
+ Roentgenbilder: 'roentgenbilder',
131
+ RezeptArchiviert: 'rezept-archiviert',
132
+ WichtigerBriefPrivat: 'wichtiger-brief-privat',
133
+ EmailArchiviertPrivat: 'email-archiviert-privat',
134
+ Schulzeugnis: 'schulzeugnis',
135
+ Universitaetsabschluss: 'universitaetsabschluss',
136
+ ArbeitszeugnisPrivat: 'arbeitszeugnis-privat',
137
+ Weiterbildungszertifikat: 'weiterbildungszertifikat',
138
+ // Finanzen
139
+ KontoauszugGirokonto: 'kontoauszug-girokonto',
140
+ KontoauszugSparkonto: 'kontoauszug-sparkonto',
141
+ Kreditkartenabrechnung: 'kreditkartenabrechnung',
142
+ Darlehensvertrag: 'darlehensvertrag',
143
+ Steuererklaerung: 'steuererklaerung', // Jahreszahlen sind Instanzen des Typs
144
+ BelegSteuererklaerung: 'beleg-steuererklaerung',
145
+ Steuerbescheid: 'steuerbescheid',
146
+ AktienKaufbeleg: 'aktien-kaufbeleg',
147
+ AktienVerkaufsbeleg: 'aktien-verkaufsbeleg',
148
+ Depotuebersicht: 'depotuebersicht',
149
+ Grundbuchauszug: 'grundbuchauszug',
150
+ NotarvertragImmobilie: 'notarvertrag-immobilie',
151
+ Haushaltsrechnung: 'haushaltsrechnung', // Strom, Gas, Wasser
152
+ OnlineBestellungRechnung: 'online-bestellung-rechnung',
153
+ // Arbeit & Beruf
154
+ AktuellerArbeitsvertrag: 'aktueller-arbeitsvertrag',
155
+ Gehaltsabrechnung: 'gehaltsabrechnung',
156
+ ZusatzvereinbarungArbeit: 'zusatzvereinbarung-arbeit',
157
+ ProjektAlphaPlanung: 'projekt-alpha-planung',
158
+ ProjektAlphaBericht: 'projekt-alpha-bericht',
159
+ ProjektAlphaPraesentation: 'projekt-alpha-praesentation',
160
+ ProjektBetaKonzept: 'projekt-beta-konzept',
161
+ ProjektBetaKorrespondenz: 'projekt-beta-korrespondenz',
162
+ TeilnahmebescheinigungSchulung: 'teilnahmebescheinigung-schulung',
163
+ Schulungsunterlage: 'schulungsunterlage',
164
+ Lebenslauf: 'lebenslauf',
165
+ AnschreibenBewerbung: 'anschreiben-bewerbung',
166
+ ReferenzBewerbung: 'referenz-bewerbung',
167
+ // Haus & Wohnung
168
+ GrundrissPlan: 'grundriss-plan',
169
+ Nebenkostenabrechnung: 'nebenkostenabrechnung',
170
+ Uebergabeprotokoll: 'uebergabeprotokoll',
171
+ AnleitungGarantieGeraet: 'anleitung-garantie-geraet',
172
+ AngebotSanitaer: 'angebot-sanitaer',
173
+ RechnungSanitaer: 'rechnung-sanitaer',
174
+ AngebotElektro: 'angebot-elektro',
175
+ RechnungElektro: 'rechnung-elektro',
176
+ AngebotMaler: 'angebot-maler',
177
+ RechnungMaler: 'rechnung-maler',
178
+ // Fahrzeuge
179
+ Fahrzeugschein: 'fahrzeugschein',
180
+ Fahrzeugbrief: 'fahrzeugbrief',
181
+ VersicherungsnachweisFahrzeug: 'versicherungsnachweis-fahrzeug',
182
+ TUEVBericht: 'tuev-bericht',
183
+ WerkstattrechnungFahrzeug: 'werkstattrechnung-fahrzeug',
184
+ // Hobby & Freizeit
185
+ MitgliedschaftVerein: 'mitgliedschaft-verein',
186
+ Reisebuchungsbestaetigung: 'reisebuchungsbestaetigung',
187
+ ReiseTicketArchiviert: 'reise-ticket-archiviert',
188
+ AnleitungSportGeraet: 'anleitung-sport-geraet',
189
+ // Digitales & Lizenzen
190
+ Softwarelizenz: 'softwarelizenz',
191
+ Domainregistrierung: 'domainregistrierung',
192
+ ZugangsdatenNotiz: 'zugangsdaten-notiz', // Hinweis: Zugangsdaten sollten separat und sicher verwaltet werden!
193
+ // Sonstiges
194
+ WichtigeNotiz: 'wichtige-notiz',
195
+ FotoDokumentation: 'foto-dokumentation',
196
+ ScanWichtigeKleinigkeit: 'scan-wichtige-kleinigkeit',
197
+ });
198
+ export const TstdlDocumentTypeLabels = {
199
+ // Persönliche Dokumente Labels
200
+ [TstdlDocumentType.Personalausweis]: 'Personalausweis',
201
+ [TstdlDocumentType.Reisepass]: 'Reisepass',
202
+ [TstdlDocumentType.Fuehrerschein]: 'Führerschein',
203
+ [TstdlDocumentType.Geburtsurkunde]: 'Geburtsurkunde',
204
+ [TstdlDocumentType.Mietvertrag]: 'Mietvertrag',
205
+ [TstdlDocumentType.Handyvertrag]: 'Handyvertrag',
206
+ [TstdlDocumentType.HaftpflichtversicherungPolice]: 'Haftpflichtversicherung (Police)',
207
+ [TstdlDocumentType.HausratversicherungPolice]: 'Hausratversicherung (Police)',
208
+ [TstdlDocumentType.KfzVersicherungPolice]: 'Kfz-Versicherung (Police)',
209
+ [TstdlDocumentType.KfzVersicherungSchadensmeldung]: 'Kfz-Versicherung (Schadensmeldung)',
210
+ [TstdlDocumentType.KrankenversicherungPolice]: 'Krankenversicherung (Police)',
211
+ [TstdlDocumentType.Arztbrief]: 'Arztbrief',
212
+ [TstdlDocumentType.Impfpass]: 'Impfpass',
213
+ [TstdlDocumentType.Roentgenbilder]: 'Röntgenbilder',
214
+ [TstdlDocumentType.RezeptArchiviert]: 'Rezept (archiviert)',
215
+ [TstdlDocumentType.WichtigerBriefPrivat]: 'Wichtiger Brief (Privat)',
216
+ [TstdlDocumentType.EmailArchiviertPrivat]: 'E-Mail (archiviert)',
217
+ [TstdlDocumentType.Schulzeugnis]: 'Schulzeugnis',
218
+ [TstdlDocumentType.Universitaetsabschluss]: 'Universitätsabschluss',
219
+ [TstdlDocumentType.ArbeitszeugnisPrivat]: 'Arbeitszeugnis', // Kann doppelt genutzt werden, falls es in persönlichen und Berufsordnern sein soll
220
+ [TstdlDocumentType.Weiterbildungszertifikat]: 'Weiterbildungszertifikat',
221
+ // Finanzen Labels
222
+ [TstdlDocumentType.KontoauszugGirokonto]: 'Kontoauszug (Girokonto)',
223
+ [TstdlDocumentType.KontoauszugSparkonto]: 'Kontoauszug (Sparkonto)',
224
+ [TstdlDocumentType.Kreditkartenabrechnung]: 'Kreditkartenabrechnung',
225
+ [TstdlDocumentType.Darlehensvertrag]: 'Darlehensvertrag',
226
+ [TstdlDocumentType.Steuererklaerung]: 'Steuererklärung',
227
+ [TstdlDocumentType.BelegSteuererklaerung]: 'Beleg für Steuererklärung',
228
+ [TstdlDocumentType.Steuerbescheid]: 'Steuerbescheid',
229
+ [TstdlDocumentType.AktienKaufbeleg]: 'Aktien Kaufbeleg',
230
+ [TstdlDocumentType.AktienVerkaufsbeleg]: 'Aktien Verkaufsbeleg',
231
+ [TstdlDocumentType.Depotuebersicht]: 'Depotübersicht',
232
+ [TstdlDocumentType.Grundbuchauszug]: 'Grundbuchauszug',
233
+ [TstdlDocumentType.NotarvertragImmobilie]: 'Notarvertrag (Immobilie)',
234
+ [TstdlDocumentType.Haushaltsrechnung]: 'Haushaltsrechnung',
235
+ [TstdlDocumentType.OnlineBestellungRechnung]: 'Online-Bestellung (Rechnung)',
236
+ // Arbeit & Beruf Labels
237
+ [TstdlDocumentType.AktuellerArbeitsvertrag]: 'Aktueller Arbeitsvertrag',
238
+ [TstdlDocumentType.Gehaltsabrechnung]: 'Gehaltsabrechnung',
239
+ [TstdlDocumentType.ZusatzvereinbarungArbeit]: 'Zusatzvereinbarung',
240
+ [TstdlDocumentType.ProjektAlphaPlanung]: 'Projekt Alpha - Planung',
241
+ [TstdlDocumentType.ProjektAlphaBericht]: 'Projekt Alpha - Bericht',
242
+ [TstdlDocumentType.ProjektAlphaPraesentation]: 'Projekt Alpha - Präsentation',
243
+ [TstdlDocumentType.ProjektBetaKonzept]: 'Projekt Beta - Konzept',
244
+ [TstdlDocumentType.ProjektBetaKorrespondenz]: 'Projekt Beta - Korrespondenz',
245
+ [TstdlDocumentType.TeilnahmebescheinigungSchulung]: 'Teilnahmebescheinigung',
246
+ [TstdlDocumentType.Schulungsunterlage]: 'Schulungsunterlage',
247
+ [TstdlDocumentType.Lebenslauf]: 'Lebenslauf',
248
+ [TstdlDocumentType.AnschreibenBewerbung]: 'Anschreiben (Bewerbung)',
249
+ [TstdlDocumentType.ReferenzBewerbung]: 'Referenz (Bewerbung)',
250
+ // Haus & Wohnung Labels
251
+ [TstdlDocumentType.GrundrissPlan]: 'Grundriss & Plan',
252
+ [TstdlDocumentType.Nebenkostenabrechnung]: 'Nebenkostenabrechnung',
253
+ [TstdlDocumentType.Uebergabeprotokoll]: 'Übergabeprotokoll',
254
+ [TstdlDocumentType.AnleitungGarantieGeraet]: 'Anleitung & Garantie (Gerät)',
255
+ [TstdlDocumentType.AngebotSanitaer]: 'Angebot Sanitär',
256
+ [TstdlDocumentType.RechnungSanitaer]: 'Rechnung Sanitär',
257
+ [TstdlDocumentType.AngebotElektro]: 'Angebot Elektro',
258
+ [TstdlDocumentType.RechnungElektro]: 'Rechnung Elektro',
259
+ [TstdlDocumentType.AngebotMaler]: 'Angebot Maler',
260
+ [TstdlDocumentType.RechnungMaler]: 'Rechnung Maler',
261
+ // Fahrzeuge Labels
262
+ [TstdlDocumentType.Fahrzeugschein]: 'Fahrzeugschein',
263
+ [TstdlDocumentType.Fahrzeugbrief]: 'Fahrzeugbrief',
264
+ [TstdlDocumentType.VersicherungsnachweisFahrzeug]: 'Versicherungsnachweis (Fahrzeug)',
265
+ [TstdlDocumentType.TUEVBericht]: 'TÜV-Bericht',
266
+ [TstdlDocumentType.WerkstattrechnungFahrzeug]: 'Werkstattrechnung (Fahrzeug)',
267
+ // Hobby & Freizeit Labels
268
+ [TstdlDocumentType.MitgliedschaftVerein]: 'Mitgliedschaft (Verein/Fitness)',
269
+ [TstdlDocumentType.Reisebuchungsbestaetigung]: 'Reisebuchungsbestätigung',
270
+ [TstdlDocumentType.ReiseTicketArchiviert]: 'Reise-Ticket (archiviert)',
271
+ [TstdlDocumentType.AnleitungSportGeraet]: 'Anleitung (Sportgeräte, Instrumente etc.)',
272
+ // Digitales & Lizenzen Labels
273
+ [TstdlDocumentType.Softwarelizenz]: 'Softwarelizenz',
274
+ [TstdlDocumentType.Domainregistrierung]: 'Domainregistrierung',
275
+ [TstdlDocumentType.ZugangsdatenNotiz]: 'Zugangsdaten (Notiz)',
276
+ // Sonstiges Labels
277
+ [TstdlDocumentType.WichtigeNotiz]: 'Wichtige Notiz',
278
+ [TstdlDocumentType.FotoDokumentation]: 'Foto (Dokumentation)',
279
+ [TstdlDocumentType.ScanWichtigeKleinigkeit]: 'Scan von wichtiger Kleinigkeit',
280
+ };
281
+ export const TstdlDocumentTypeCategories = {
282
+ // Persönliche Dokumente Zuordnungen
283
+ [TstdlDocumentType.Personalausweis]: TstdlDocumentCategory.Ausweisdokumente,
284
+ [TstdlDocumentType.Reisepass]: TstdlDocumentCategory.Ausweisdokumente,
285
+ [TstdlDocumentType.Fuehrerschein]: TstdlDocumentCategory.Ausweisdokumente,
286
+ [TstdlDocumentType.Geburtsurkunde]: TstdlDocumentCategory.Ausweisdokumente,
287
+ [TstdlDocumentType.Mietvertrag]: TstdlDocumentCategory.VertraegePrivat,
288
+ [TstdlDocumentType.Handyvertrag]: TstdlDocumentCategory.VertraegePrivat,
289
+ [TstdlDocumentType.HaftpflichtversicherungPolice]: TstdlDocumentCategory.Versicherungsvertraege,
290
+ [TstdlDocumentType.HausratversicherungPolice]: TstdlDocumentCategory.Versicherungsvertraege,
291
+ [TstdlDocumentType.KfzVersicherungPolice]: TstdlDocumentCategory.KfzVersicherung,
292
+ [TstdlDocumentType.KfzVersicherungSchadensmeldung]: TstdlDocumentCategory.KfzVersicherung,
293
+ [TstdlDocumentType.KrankenversicherungPolice]: TstdlDocumentCategory.Versicherungsvertraege,
294
+ [TstdlDocumentType.Arztbrief]: TstdlDocumentCategory.Gesundheit,
295
+ [TstdlDocumentType.Impfpass]: TstdlDocumentCategory.Gesundheit,
296
+ [TstdlDocumentType.Roentgenbilder]: TstdlDocumentCategory.Gesundheit,
297
+ [TstdlDocumentType.RezeptArchiviert]: TstdlDocumentCategory.Gesundheit,
298
+ [TstdlDocumentType.WichtigerBriefPrivat]: TstdlDocumentCategory.KorrespondenzPrivat,
299
+ [TstdlDocumentType.EmailArchiviertPrivat]: TstdlDocumentCategory.KorrespondenzPrivat,
300
+ [TstdlDocumentType.Schulzeugnis]: TstdlDocumentCategory.ZeugnisseZertifikate,
301
+ [TstdlDocumentType.Universitaetsabschluss]: TstdlDocumentCategory.ZeugnisseZertifikate,
302
+ [TstdlDocumentType.ArbeitszeugnisPrivat]: TstdlDocumentCategory.ZeugnisseZertifikate, // Kann auch Arbeitsverträge & Vereinbarungen sein, je nach Kontext
303
+ [TstdlDocumentType.Weiterbildungszertifikat]: TstdlDocumentCategory.ZeugnisseZertifikate,
304
+ // Finanzen Zuordnungen
305
+ [TstdlDocumentType.KontoauszugGirokonto]: TstdlDocumentCategory.Bankunterlagen,
306
+ [TstdlDocumentType.KontoauszugSparkonto]: TstdlDocumentCategory.Bankunterlagen,
307
+ [TstdlDocumentType.Kreditkartenabrechnung]: TstdlDocumentCategory.Bankunterlagen,
308
+ [TstdlDocumentType.Darlehensvertrag]: TstdlDocumentCategory.Bankunterlagen,
309
+ [TstdlDocumentType.Steuererklaerung]: TstdlDocumentCategory.Steuerunterlagen,
310
+ [TstdlDocumentType.BelegSteuererklaerung]: TstdlDocumentCategory.Steuerunterlagen,
311
+ [TstdlDocumentType.Steuerbescheid]: TstdlDocumentCategory.Steuerunterlagen,
312
+ [TstdlDocumentType.AktienKaufbeleg]: TstdlDocumentCategory.AktienWertpapiere,
313
+ [TstdlDocumentType.AktienVerkaufsbeleg]: TstdlDocumentCategory.AktienWertpapiere,
314
+ [TstdlDocumentType.Depotuebersicht]: TstdlDocumentCategory.AktienWertpapiere,
315
+ [TstdlDocumentType.Grundbuchauszug]: TstdlDocumentCategory.ImmobilienFinanzen,
316
+ [TstdlDocumentType.NotarvertragImmobilie]: TstdlDocumentCategory.ImmobilienFinanzen,
317
+ [TstdlDocumentType.Haushaltsrechnung]: TstdlDocumentCategory.RechnungenBezahlt,
318
+ [TstdlDocumentType.OnlineBestellungRechnung]: TstdlDocumentCategory.RechnungenBezahlt,
319
+ // Arbeit & Beruf Zuordnungen
320
+ [TstdlDocumentType.AktuellerArbeitsvertrag]: TstdlDocumentCategory.ArbeitsvertraegeVereinbarungen,
321
+ [TstdlDocumentType.Gehaltsabrechnung]: TstdlDocumentCategory.ArbeitsvertraegeVereinbarungen,
322
+ [TstdlDocumentType.ZusatzvereinbarungArbeit]: TstdlDocumentCategory.ArbeitsvertraegeVereinbarungen,
323
+ [TstdlDocumentType.ProjektAlphaPlanung]: TstdlDocumentCategory.ProjektAlpha,
324
+ [TstdlDocumentType.ProjektAlphaBericht]: TstdlDocumentCategory.ProjektAlpha,
325
+ [TstdlDocumentType.ProjektAlphaPraesentation]: TstdlDocumentCategory.ProjektAlpha,
326
+ [TstdlDocumentType.ProjektBetaKonzept]: TstdlDocumentCategory.ProjektBeta,
327
+ [TstdlDocumentType.ProjektBetaKorrespondenz]: TstdlDocumentCategory.ProjektBeta,
328
+ [TstdlDocumentType.TeilnahmebescheinigungSchulung]: TstdlDocumentCategory.WeiterbildungSchulung,
329
+ [TstdlDocumentType.Schulungsunterlage]: TstdlDocumentCategory.WeiterbildungSchulung,
330
+ [TstdlDocumentType.Lebenslauf]: TstdlDocumentCategory.Bewerbungsunterlagen,
331
+ [TstdlDocumentType.AnschreibenBewerbung]: TstdlDocumentCategory.Bewerbungsunterlagen,
332
+ [TstdlDocumentType.ReferenzBewerbung]: TstdlDocumentCategory.Bewerbungsunterlagen,
333
+ // Haus & Wohnung Zuordnungen
334
+ [TstdlDocumentType.GrundrissPlan]: TstdlDocumentCategory.HausWohnung,
335
+ [TstdlDocumentType.Nebenkostenabrechnung]: TstdlDocumentCategory.HausWohnung,
336
+ [TstdlDocumentType.Uebergabeprotokoll]: TstdlDocumentCategory.HausWohnung,
337
+ [TstdlDocumentType.AnleitungGarantieGeraet]: TstdlDocumentCategory.HausWohnung,
338
+ [TstdlDocumentType.AngebotSanitaer]: TstdlDocumentCategory.Sanitaerarbeiten,
339
+ [TstdlDocumentType.RechnungSanitaer]: TstdlDocumentCategory.Sanitaerarbeiten,
340
+ [TstdlDocumentType.AngebotElektro]: TstdlDocumentCategory.Elektroarbeiten,
341
+ [TstdlDocumentType.RechnungElektro]: TstdlDocumentCategory.Elektroarbeiten,
342
+ [TstdlDocumentType.AngebotMaler]: TstdlDocumentCategory.Malerarbeiten,
343
+ [TstdlDocumentType.RechnungMaler]: TstdlDocumentCategory.Malerarbeiten,
344
+ // Fahrzeuge Zuordnungen
345
+ [TstdlDocumentType.Fahrzeugschein]: TstdlDocumentCategory.Fahrzeuge,
346
+ [TstdlDocumentType.Fahrzeugbrief]: TstdlDocumentCategory.Fahrzeuge,
347
+ [TstdlDocumentType.VersicherungsnachweisFahrzeug]: TstdlDocumentCategory.Fahrzeuge,
348
+ [TstdlDocumentType.TUEVBericht]: TstdlDocumentCategory.Fahrzeuge,
349
+ [TstdlDocumentType.WerkstattrechnungFahrzeug]: TstdlDocumentCategory.Fahrzeuge,
350
+ // Hobby & Freizeit Zuordnungen
351
+ [TstdlDocumentType.MitgliedschaftVerein]: TstdlDocumentCategory.HobbyFreizeit,
352
+ [TstdlDocumentType.Reisebuchungsbestaetigung]: TstdlDocumentCategory.HobbyFreizeit,
353
+ [TstdlDocumentType.ReiseTicketArchiviert]: TstdlDocumentCategory.HobbyFreizeit,
354
+ [TstdlDocumentType.AnleitungSportGeraet]: TstdlDocumentCategory.HobbyFreizeit,
355
+ // Digitales & Lizenzen Zuordnungen
356
+ [TstdlDocumentType.Softwarelizenz]: TstdlDocumentCategory.DigitalesLizenzen,
357
+ [TstdlDocumentType.Domainregistrierung]: TstdlDocumentCategory.DigitalesLizenzen,
358
+ [TstdlDocumentType.ZugangsdatenNotiz]: TstdlDocumentCategory.DigitalesLizenzen,
359
+ // Sonstiges Zuordnungen
360
+ [TstdlDocumentType.WichtigeNotiz]: TstdlDocumentCategory.Sonstiges,
361
+ [TstdlDocumentType.FotoDokumentation]: TstdlDocumentCategory.Sonstiges,
362
+ [TstdlDocumentType.ScanWichtigeKleinigkeit]: TstdlDocumentCategory.Sonstiges,
363
+ };
@@ -1,21 +1,20 @@
1
1
  import '../../polyfills.js';
2
2
  import type { DocumentCollection, DocumentWorkflowStep } from '../../document-management/index.js';
3
3
  import { DocumentManagementAncillaryService, type DocumentCollectionMetadata } from '../../document-management/server/index.js';
4
- export declare class TestDocumentManagementAncillaryService extends DocumentManagementAncillaryService {
4
+ export declare class ExampleDocumentManagementAncillaryService extends DocumentManagementAncillaryService {
5
5
  _resolveMetadata(collections: DocumentCollection[]): DocumentCollectionMetadata[];
6
+ getUserId(_token?: unknown): string;
7
+ canCreateDocuments(_collectionId: string, _token?: unknown): boolean;
8
+ canUpdateDocuments(_collectionId: string, _token?: unknown): boolean;
9
+ canDeleteDocuments(_collectionId: string, _token?: unknown): boolean;
10
+ canAssignDocuments(_collectionId: string, _token?: unknown): boolean;
11
+ canManageRequests(_collectionId: string, _token?: unknown): boolean;
6
12
  canReadCollection(_collectionId: string, _token?: unknown): boolean;
7
- canWriteCollection(_collectionId: string, _token?: unknown): boolean;
8
13
  canApproveDocument(_documentId: string, _token?: unknown): boolean;
9
14
  canRejectDocument(_documentId: string, _token?: unknown): boolean;
10
- canReadDocumentRequest(_requestId: string, _token?: unknown): boolean;
11
- canAssignDocumentToRequest(_requestId: string, _documentId: string, _token?: unknown): boolean;
12
15
  canManageCategoriesAndTypes(_token?: unknown): boolean;
13
16
  canReadDocumentRequestsTemplates(_token?: unknown): boolean;
14
17
  canManageDocumentRequestsTemplates(_token?: unknown): boolean;
15
- canCreateUnassignedDocument(_token?: unknown): boolean;
16
- canCreateRequestAssignedDocument(_token?: unknown): boolean;
17
- canDeleteDocument(_documentId: string, _token?: unknown): boolean;
18
- canManageDocumentRequest(_token?: unknown): boolean;
19
18
  canManageValidationDefinitions(_token?: unknown): boolean;
20
19
  canProgressDocumentWorkflow(_documentId: string, _currentWorkflowStep: DocumentWorkflowStep, _token?: unknown): boolean;
21
20
  }
@@ -5,59 +5,118 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import '../../polyfills.js';
8
+ import { configureAiService } from '../../ai/index.js';
9
+ import { configureApiServer } from '../../api/server/module.js';
8
10
  import { Application } from '../../application/application.js';
9
- import { DocumentCategoryTypeService, DocumentCollectionService, DocumentManagementAncillaryService, DocumentRequestService } from '../../document-management/server/index.js';
11
+ import { AuthenticationApiRequestTokenProvider } from '../../authentication/server/authentication-api-request-token.provider.js';
12
+ import { DocumentCategoryTypeService, DocumentCollectionService, DocumentManagementAncillaryService, DocumentManagementApiController, DocumentRequestService } from '../../document-management/server/index.js';
10
13
  import { configureDocumentManagement, migrateDocumentManagementSchema } from '../../document-management/server/module.js';
11
14
  import { DocumentManagementService } from '../../document-management/server/services/document-management.service.js';
12
- import { Singleton } from '../../injector/index.js';
13
- import { injectManyAsync } from '../../injector/inject.js';
15
+ import { Injector, Singleton } from '../../injector/index.js';
16
+ import { inject, injectManyAsync, runInInjectionContext } from '../../injector/inject.js';
17
+ import { configureLocalMessageBus } from '../../message-bus/index.js';
14
18
  import { configureS3ObjectStorage } from '../../object-storage/index.js';
15
- let TestDocumentManagementAncillaryService = class TestDocumentManagementAncillaryService extends DocumentManagementAncillaryService {
19
+ import { configureOrm } from '../../orm/server/index.js';
20
+ import { configurePostgresQueue, migratePostgresQueueSchema } from '../../queue/postgres/index.js';
21
+ import { boolean, positiveInteger, string } from '../../utils/config-parser.js';
22
+ import { TstdlCategoryParents, TstdlDocumentCategoryLabels, TstdlDocumentTypeCategories, TstdlDocumentTypeLabels } from './categories-and-types.js';
23
+ const config = {
24
+ database: {
25
+ host: string('DATABASE_HOST', '127.0.0.1'),
26
+ port: positiveInteger('DATABASE_PORT', 5432),
27
+ user: string('DATABASE_USER', 'tstdl'),
28
+ pass: string('DATABASE_PASS', 'wf7rq6glrk5jykne'),
29
+ database: string('DATABASE_NAME', 'tstdl'),
30
+ schema: string('DATABASE_SCHEMA', 'tstdl'),
31
+ },
32
+ ai: {
33
+ apiKey: string('AI_API_KEY', undefined),
34
+ keyFile: string('AI_API_KEY_FILE', undefined),
35
+ vertex: {
36
+ project: string('AI_VERTEX_PROJECT', undefined),
37
+ location: string('AI_VERTEX_LOCATION', undefined),
38
+ },
39
+ },
40
+ s3: {
41
+ endpoint: string('S3_ENDPOINT', 'http://localhost:9000'),
42
+ accessKey: string('S3_ACCESS_KEY', 'tstdl-dev'),
43
+ secretKey: string('S3_SECRET_KEY', 'tstdl-dev'),
44
+ bucket: string('S3_BUCKET', undefined),
45
+ bucketPerModule: boolean('S3_BUCKET_PER_MODULE', true),
46
+ },
47
+ };
48
+ let ExampleDocumentManagementAncillaryService = class ExampleDocumentManagementAncillaryService extends DocumentManagementAncillaryService {
16
49
  _resolveMetadata(collections) {
17
- return collections.map((collection) => ({ name: collection.metadata.attributes['name'], group: null }));
50
+ return collections.map((collection) => ({ name: collection.id, group: null }));
18
51
  }
52
+ getUserId(_token) { return 'user-id'; }
53
+ canCreateDocuments(_collectionId, _token) { return true; }
54
+ canUpdateDocuments(_collectionId, _token) { return true; }
55
+ canDeleteDocuments(_collectionId, _token) { return true; }
56
+ canAssignDocuments(_collectionId, _token) { return true; }
57
+ canManageRequests(_collectionId, _token) { return true; }
19
58
  canReadCollection(_collectionId, _token) { return true; }
20
- canWriteCollection(_collectionId, _token) { return true; }
21
59
  canApproveDocument(_documentId, _token) { return true; }
22
60
  canRejectDocument(_documentId, _token) { return true; }
23
- canReadDocumentRequest(_requestId, _token) { return true; }
24
- canAssignDocumentToRequest(_requestId, _documentId, _token) { return true; }
25
61
  canManageCategoriesAndTypes(_token) { return true; }
26
62
  canReadDocumentRequestsTemplates(_token) { return true; }
27
63
  canManageDocumentRequestsTemplates(_token) { return true; }
28
- canCreateUnassignedDocument(_token) { return true; }
29
- canCreateRequestAssignedDocument(_token) { return true; }
30
- canDeleteDocument(_documentId, _token) { return true; }
31
- canManageDocumentRequest(_token) { return true; }
32
64
  canManageValidationDefinitions(_token) { return true; }
33
65
  canProgressDocumentWorkflow(_documentId, _currentWorkflowStep, _token) { return true; }
34
66
  };
35
- TestDocumentManagementAncillaryService = __decorate([
67
+ ExampleDocumentManagementAncillaryService = __decorate([
36
68
  Singleton()
37
- ], TestDocumentManagementAncillaryService);
38
- export { TestDocumentManagementAncillaryService };
69
+ ], ExampleDocumentManagementAncillaryService);
70
+ export { ExampleDocumentManagementAncillaryService };
39
71
  async function bootstrap() {
72
+ const injector = inject(Injector);
73
+ configurePostgresQueue();
74
+ configureLocalMessageBus();
75
+ configureOrm({
76
+ connection: {
77
+ host: config.database.host,
78
+ port: config.database.port,
79
+ user: config.database.user,
80
+ password: config.database.pass,
81
+ database: config.database.database,
82
+ },
83
+ });
40
84
  configureDocumentManagement({
41
- ancillaryService: TestDocumentManagementAncillaryService,
85
+ ancillaryService: ExampleDocumentManagementAncillaryService,
42
86
  fileObjectStorageModule: 'documents',
43
87
  filePreviewObjectStorageModule: 'document-previews',
44
- database: {
45
- connection: {
46
- database: 'xxx',
47
- user: 'xxx',
48
- password: 'xxx',
88
+ });
89
+ configureS3ObjectStorage({
90
+ endpoint: config.s3.endpoint,
91
+ bucket: config.s3.bucket,
92
+ bucketPerModule: config.s3.bucketPerModule,
93
+ accessKey: config.s3.accessKey,
94
+ secretKey: config.s3.secretKey,
95
+ });
96
+ configureApiServer({
97
+ controllers: [DocumentManagementApiController],
98
+ requestTokenProvider: AuthenticationApiRequestTokenProvider,
99
+ gatewayOptions: {
100
+ prefix: null,
101
+ cors: {
102
+ default: {
103
+ autoAccessControlAllowOrigin: 'http://localhost:4200',
104
+ accessControlAllowHeaders: 'Content-Type, Authorization',
105
+ },
49
106
  },
50
107
  },
51
108
  });
52
- configureS3ObjectStorage({ endpoint: 'http://localhost:10000', accessKey: 'tstdl-dev', secretKey: 'tstdl-dev', bucketPerModule: true });
53
- await migrateDocumentManagementSchema();
109
+ configureAiService({
110
+ apiKey: config.ai.apiKey,
111
+ keyFile: config.ai.keyFile,
112
+ });
113
+ await runInInjectionContext(injector, async () => await migrateDocumentManagementSchema());
114
+ await runInInjectionContext(injector, async () => await migratePostgresQueueSchema());
54
115
  }
55
116
  async function main() {
56
- const [documentManagementService, documentCollectionService, documentCategoryTypeService, documentRequestService] = await injectManyAsync(DocumentManagementService, DocumentCollectionService, DocumentCategoryTypeService, DocumentRequestService);
117
+ const [documentManagementService, documentCollectionService] = await injectManyAsync(DocumentManagementService, DocumentCollectionService, DocumentCategoryTypeService, DocumentRequestService);
118
+ const { categories, types } = await documentManagementService.initializeCategoriesAndTypes(TstdlDocumentCategoryLabels, TstdlCategoryParents, TstdlDocumentTypeLabels, TstdlDocumentTypeCategories);
57
119
  const collection = await documentCollectionService.createCollection(null);
58
- const category = await documentCategoryTypeService.createCategory('Testkategorie', null);
59
- const type = await documentCategoryTypeService.createType('Testtyp', category.id);
60
- const request = await documentRequestService.createRequest(type.id, [collection.id], null);
61
120
  const data = await documentManagementService.loadData([collection.id]);
62
121
  console.log(data);
63
122
  }
@@ -18,6 +18,7 @@ export type InjectableOptionsWithoutLifecycle<T, A> = Simplify<TypedOmit<Injecta
18
18
  * @param constructor class to replace with
19
19
  */
20
20
  export declare function ReplaceClass<T>(constructor: Constructor<T>): ClassDecorator;
21
+ export declare function InjectableOptions<T = any, A = any, C extends Record = Record>(options: InjectableOptions<T, A, C>): ClassDecorator;
21
22
  /**
22
23
  * Globally registers the class for injection
23
24
  * @param options registration options
@@ -1,9 +1,9 @@
1
1
  /* eslint-disable @typescript-eslint/naming-convention */
2
- import { createClassDecorator, createDecorator } from '../reflection/index.js';
2
+ import { createClassDecorator, createDecorator, reflectionRegistry } from '../reflection/index.js';
3
3
  import { toArray } from '../utils/array/array.js';
4
- import { isDefined, isFunction } from '../utils/type-guards.js';
4
+ import { isDefined, isFunction, isNotNull } from '../utils/type-guards.js';
5
5
  import { Injector } from './injector.js';
6
- import { injectMetadataSymbol, injectableMetadataSymbol } from './symbols.js';
6
+ import { injectMetadataSymbol, injectableMetadataSymbol, injectableOptionsSymbol } from './symbols.js';
7
7
  /**
8
8
  * Helper decorator to replace a class definition with an other
9
9
  * can be used for example to type external classes with the {@link Resolvable} interface
@@ -12,25 +12,54 @@ import { injectMetadataSymbol, injectableMetadataSymbol } from './symbols.js';
12
12
  export function ReplaceClass(constructor) {
13
13
  return createClassDecorator({ handler: () => constructor });
14
14
  }
15
+ export function InjectableOptions(options) {
16
+ return createClassDecorator({
17
+ data: { [injectableOptionsSymbol]: options },
18
+ mergeData: true,
19
+ });
20
+ }
15
21
  /**
16
22
  * Globally registers the class for injection
17
23
  * @param options registration options
18
24
  */
19
25
  export function Injectable(options = {}) {
20
26
  return createClassDecorator({
21
- data: { [injectableMetadataSymbol]: {} },
27
+ data: {
28
+ [injectableMetadataSymbol]: {},
29
+ [injectableOptionsSymbol]: options,
30
+ },
22
31
  mergeData: true,
23
- handler: (data) => {
32
+ handler: (data, metadata) => {
24
33
  const { alias: aliases, provider, ...registrationOptions } = options;
25
34
  const token = data.constructor;
35
+ let mergedRegistationOptions = registrationOptions;
36
+ if (isNotNull(metadata.parent)) {
37
+ const parentOptions = reflectionRegistry.getMetadata(metadata.parent)?.data.tryGet(injectableOptionsSymbol);
38
+ if (isDefined(parentOptions)) {
39
+ const { alias: _, provider: __, ...parentRegistrationOptions } = parentOptions;
40
+ mergedRegistationOptions = {
41
+ ...parentRegistrationOptions,
42
+ ...registrationOptions,
43
+ providers: [...(parentRegistrationOptions.providers ?? []), ...(registrationOptions.providers ?? [])],
44
+ afterResolve: (instance, argument, context) => {
45
+ parentRegistrationOptions.afterResolve?.(instance, argument, context);
46
+ registrationOptions.afterResolve?.(instance, argument, context);
47
+ },
48
+ metadata: {
49
+ ...parentRegistrationOptions.metadata,
50
+ ...registrationOptions.metadata,
51
+ },
52
+ };
53
+ }
54
+ }
26
55
  const targetProvider = provider ?? { useClass: token };
27
- Injector.register(token, targetProvider, registrationOptions);
56
+ Injector.register(token, targetProvider, mergedRegistationOptions);
28
57
  if (isDefined(aliases)) {
29
58
  for (const alias of toArray(aliases)) {
30
- Injector.register(alias, { useToken: token }, registrationOptions);
59
+ Injector.register(alias, { useToken: token });
31
60
  }
32
61
  }
33
- }
62
+ },
34
63
  });
35
64
  }
36
65
  /**
@@ -109,8 +138,8 @@ export function InjectArg(mapperOrKey) {
109
138
  injectArgumentMapper: isFunction(mapperOrKey)
110
139
  ? mapperOrKey
111
140
  : isDefined(mapperOrKey)
112
- ? ((value) => value[mapperOrKey])
113
- : ((value) => value)
141
+ ? (value) => value[mapperOrKey]
142
+ : (value) => value,
114
143
  });
115
144
  }
116
145
  export function ForwardArg(mapper = (value) => value) {
@@ -131,7 +160,7 @@ export function Optional() {
131
160
  export function ForwardRef(token, argument, options) {
132
161
  const injectMetadata = {
133
162
  forwardRef: token ?? true,
134
- forwardRefTypeHint: options?.forwardRefTypeHint
163
+ forwardRefTypeHint: options?.forwardRefTypeHint,
135
164
  };
136
165
  if (isDefined(argument)) {
137
166
  injectMetadata.resolveArgumentProvider = () => argument;
@@ -144,6 +173,6 @@ function createInjectDecorator(metadata) {
144
173
  accessor: true,
145
174
  constructorParameter: true,
146
175
  data: { [injectMetadataSymbol]: metadata },
147
- mergeData: true
176
+ mergeData: true,
148
177
  });
149
178
  }