@endora-commerce/mod-settings 0.100.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 (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +58 -0
  3. package/dist/admin/api/settings-client.d.ts +47 -0
  4. package/dist/admin/api/settings-client.d.ts.map +1 -0
  5. package/dist/admin/api/settings-client.js +41 -0
  6. package/dist/admin/api/settings-client.js.map +1 -0
  7. package/dist/admin/components/ActivationPointerRow.d.ts +21 -0
  8. package/dist/admin/components/ActivationPointerRow.d.ts.map +1 -0
  9. package/dist/admin/components/ActivationPointerRow.js +28 -0
  10. package/dist/admin/components/ActivationPointerRow.js.map +1 -0
  11. package/dist/admin/components/AssetIdSettingInput.d.ts +12 -0
  12. package/dist/admin/components/AssetIdSettingInput.d.ts.map +1 -0
  13. package/dist/admin/components/AssetIdSettingInput.js +10 -0
  14. package/dist/admin/components/AssetIdSettingInput.js.map +1 -0
  15. package/dist/admin/components/ConfigurationReferenceInput.d.ts +39 -0
  16. package/dist/admin/components/ConfigurationReferenceInput.d.ts.map +1 -0
  17. package/dist/admin/components/ConfigurationReferenceInput.js +74 -0
  18. package/dist/admin/components/ConfigurationReferenceInput.js.map +1 -0
  19. package/dist/admin/components/ConflictBanner.d.ts +13 -0
  20. package/dist/admin/components/ConflictBanner.d.ts.map +1 -0
  21. package/dist/admin/components/ConflictBanner.js +12 -0
  22. package/dist/admin/components/ConflictBanner.js.map +1 -0
  23. package/dist/admin/components/ImageSettingInput.d.ts +34 -0
  24. package/dist/admin/components/ImageSettingInput.d.ts.map +1 -0
  25. package/dist/admin/components/ImageSettingInput.js +36 -0
  26. package/dist/admin/components/ImageSettingInput.js.map +1 -0
  27. package/dist/admin/components/QuoteRequestsSettingsTab.d.ts +3 -0
  28. package/dist/admin/components/QuoteRequestsSettingsTab.d.ts.map +1 -0
  29. package/dist/admin/components/QuoteRequestsSettingsTab.js +69 -0
  30. package/dist/admin/components/QuoteRequestsSettingsTab.js.map +1 -0
  31. package/dist/admin/components/SellerCompanyDataInput.d.ts +22 -0
  32. package/dist/admin/components/SellerCompanyDataInput.d.ts.map +1 -0
  33. package/dist/admin/components/SellerCompanyDataInput.js +53 -0
  34. package/dist/admin/components/SellerCompanyDataInput.js.map +1 -0
  35. package/dist/admin/components/SettingRowEditor.d.ts +55 -0
  36. package/dist/admin/components/SettingRowEditor.d.ts.map +1 -0
  37. package/dist/admin/components/SettingRowEditor.js +160 -0
  38. package/dist/admin/components/SettingRowEditor.js.map +1 -0
  39. package/dist/admin/index.d.ts +39 -0
  40. package/dist/admin/index.d.ts.map +1 -0
  41. package/dist/admin/index.js +87 -0
  42. package/dist/admin/index.js.map +1 -0
  43. package/dist/admin/pages/CachePage.d.ts +14 -0
  44. package/dist/admin/pages/CachePage.d.ts.map +1 -0
  45. package/dist/admin/pages/CachePage.js +124 -0
  46. package/dist/admin/pages/CachePage.js.map +1 -0
  47. package/dist/admin/pages/GroupsPage.d.ts +17 -0
  48. package/dist/admin/pages/GroupsPage.d.ts.map +1 -0
  49. package/dist/admin/pages/GroupsPage.js +84 -0
  50. package/dist/admin/pages/GroupsPage.js.map +1 -0
  51. package/dist/admin/pages/SettingsPage.d.ts +20 -0
  52. package/dist/admin/pages/SettingsPage.d.ts.map +1 -0
  53. package/dist/admin/pages/SettingsPage.js +453 -0
  54. package/dist/admin/pages/SettingsPage.js.map +1 -0
  55. package/dist/backend/cli/cache-clear.d.ts +23 -0
  56. package/dist/backend/cli/cache-clear.d.ts.map +1 -0
  57. package/dist/backend/cli/cache-clear.js +37 -0
  58. package/dist/backend/cli/cache-clear.js.map +1 -0
  59. package/dist/backend/index.d.ts +100 -0
  60. package/dist/backend/index.d.ts.map +1 -0
  61. package/dist/backend/index.js +125 -0
  62. package/dist/backend/index.js.map +1 -0
  63. package/dist/backend/routes.admin.d.ts +308 -0
  64. package/dist/backend/routes.admin.d.ts.map +1 -0
  65. package/dist/backend/routes.admin.js +188 -0
  66. package/dist/backend/routes.admin.js.map +1 -0
  67. package/dist/backend/routes.cache.d.ts +20 -0
  68. package/dist/backend/routes.cache.d.ts.map +1 -0
  69. package/dist/backend/routes.cache.js +22 -0
  70. package/dist/backend/routes.cache.js.map +1 -0
  71. package/dist/backend/routes.homepage.d.ts +15 -0
  72. package/dist/backend/routes.homepage.d.ts.map +1 -0
  73. package/dist/backend/routes.homepage.js +20 -0
  74. package/dist/backend/routes.homepage.js.map +1 -0
  75. package/dist/backend/routes.product-card-buttons.d.ts +15 -0
  76. package/dist/backend/routes.product-card-buttons.d.ts.map +1 -0
  77. package/dist/backend/routes.product-card-buttons.js +21 -0
  78. package/dist/backend/routes.product-card-buttons.js.map +1 -0
  79. package/dist/backend/routes.speculation-rules.d.ts +16 -0
  80. package/dist/backend/routes.speculation-rules.d.ts.map +1 -0
  81. package/dist/backend/routes.speculation-rules.js +21 -0
  82. package/dist/backend/routes.speculation-rules.js.map +1 -0
  83. package/dist/backend/routes.storefront.d.ts +15 -0
  84. package/dist/backend/routes.storefront.d.ts.map +1 -0
  85. package/dist/backend/routes.storefront.js +20 -0
  86. package/dist/backend/routes.storefront.js.map +1 -0
  87. package/dist/backend/services/cache-admin.service.d.ts +83 -0
  88. package/dist/backend/services/cache-admin.service.d.ts.map +1 -0
  89. package/dist/backend/services/cache-admin.service.js +148 -0
  90. package/dist/backend/services/cache-admin.service.js.map +1 -0
  91. package/dist/backend/services/homepage-resolver.d.ts +25 -0
  92. package/dist/backend/services/homepage-resolver.d.ts.map +1 -0
  93. package/dist/backend/services/homepage-resolver.js +31 -0
  94. package/dist/backend/services/homepage-resolver.js.map +1 -0
  95. package/dist/backend/services/product-card-buttons-resolver.d.ts +25 -0
  96. package/dist/backend/services/product-card-buttons-resolver.d.ts.map +1 -0
  97. package/dist/backend/services/product-card-buttons-resolver.js +37 -0
  98. package/dist/backend/services/product-card-buttons-resolver.js.map +1 -0
  99. package/dist/backend/services/registered-settings-manifests.d.ts +45 -0
  100. package/dist/backend/services/registered-settings-manifests.d.ts.map +1 -0
  101. package/dist/backend/services/registered-settings-manifests.js +55 -0
  102. package/dist/backend/services/registered-settings-manifests.js.map +1 -0
  103. package/dist/backend/services/setting-write-validators.d.ts +43 -0
  104. package/dist/backend/services/setting-write-validators.d.ts.map +1 -0
  105. package/dist/backend/services/setting-write-validators.js +43 -0
  106. package/dist/backend/services/setting-write-validators.js.map +1 -0
  107. package/dist/backend/services/settings-admin.service.d.ts +206 -0
  108. package/dist/backend/services/settings-admin.service.d.ts.map +1 -0
  109. package/dist/backend/services/settings-admin.service.js +642 -0
  110. package/dist/backend/services/settings-admin.service.js.map +1 -0
  111. package/dist/backend/services/shop-info-resolver.d.ts +15 -0
  112. package/dist/backend/services/shop-info-resolver.d.ts.map +1 -0
  113. package/dist/backend/services/shop-info-resolver.js +44 -0
  114. package/dist/backend/services/shop-info-resolver.js.map +1 -0
  115. package/dist/backend/services/speculation-rules-resolver.d.ts +28 -0
  116. package/dist/backend/services/speculation-rules-resolver.d.ts.map +1 -0
  117. package/dist/backend/services/speculation-rules-resolver.js +39 -0
  118. package/dist/backend/services/speculation-rules-resolver.js.map +1 -0
  119. package/dist/manifest.d.ts +194 -0
  120. package/dist/manifest.d.ts.map +1 -0
  121. package/dist/manifest.js +379 -0
  122. package/dist/manifest.js.map +1 -0
  123. package/docs/settings/index.md +171 -0
  124. package/i18n/en.json +167 -0
  125. package/i18n/pl.json +167 -0
  126. package/package.json +96 -0
  127. package/tailwind.css +14 -0
@@ -0,0 +1,206 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql';
2
+ import { type SettingWriteValidatorRegistryPort } from '@endora-commerce/contracts';
3
+ import type { EventBus } from '@endora-commerce/platform/events';
4
+ import type { AuditPort } from '@endora-commerce/platform/kernel';
5
+ import { SettingGroup } from '@endora-commerce/platform/kernel';
6
+ import { Setting } from '@endora-commerce/platform/kernel';
7
+ import { SettingValue } from '@endora-commerce/platform/kernel';
8
+ import type { SettingsCacheInvalidation } from '@endora-commerce/platform/kernel';
9
+ /**
10
+ * SettingsAdminService — feature 004 / US2 (T034).
11
+ *
12
+ * Centralises every mutation an Admin UI client can make to settings:
13
+ * - per-channel value writes (apply-to-all / apply-to-subset / reset)
14
+ * - group CRUD (create / rename / rescope / delete-with-reassign-to-general)
15
+ *
16
+ * Optimistic concurrency uses an ISO-timestamp `expectedVersion` field
17
+ * matching the pattern adopted in feature 003 governance: when present and
18
+ * stale, the service rejects with `409 VERSION_CONFLICT`.
19
+ *
20
+ * Every successful mutation, in this order:
21
+ * - flushes;
22
+ * - records an `audit_log_entries` row via {@link AuditPort};
23
+ * - **drops the settings cache** through {@link SettingsCacheInvalidation};
24
+ * - emits an EventBus event (see contract section E).
25
+ *
26
+ * The third step is the write seam this service exists to be (issue #45). The
27
+ * drop used to be a *consequence* of the fourth: the kernel subscribed
28
+ * `SettingsCacheInvalidator` to `settings.value_changed`, and `EventBus`
29
+ * dispatches handlers in registration order and fire-and-forget outside a
30
+ * scope. So the cache was dropped in time only because that subscriber
31
+ * happened to be registered first and reached `SharedDropMarks.begin`
32
+ * synchronously — a module subscribing ahead of it deferred the drop past a
33
+ * caller's read, and a write inside an `EventBus.run` scope (every Command —
34
+ * `CommandBus.run` opens one) deferred it past the whole command. Three
35
+ * separate defects came out of that arrangement (MR !540 / issue #30, issue
36
+ * #33, issue #45), so the fourth fix is not another correction of the ordering:
37
+ * the drop is now part of the write and is awaited, and nothing on the bus can
38
+ * be early or late for it.
39
+ *
40
+ * It stays **before** the emit, which also gives every subscriber what the
41
+ * ordering used to promise them: `inventory`'s threshold mirror, `search`'s LLM
42
+ * reactor and `product_feeds`' schedule reconcile all re-read the setting they
43
+ * were told about, and all three now read post-invalidation state by
44
+ * construction rather than by registration luck.
45
+ */
46
+ export interface AdminAuditContext {
47
+ actorAdminUserId: string | null;
48
+ requestId?: string | null;
49
+ }
50
+ /**
51
+ * The effective-state surface this module needs — feature 073, Constitution
52
+ * XVII. Injected rather than imported so `settings` keeps no edge into the
53
+ * lifecycle service graph; `_lifecycle` already depends on this module's
54
+ * `Setting` entity, and reversing that edge in code would make the direction of
55
+ * the dependency a matter of which file you happened to open.
56
+ */
57
+ export interface ModulePresencePort {
58
+ /**
59
+ * Platform availability AND operator activation, resolved in memory.
60
+ * `undefined` when the platform has never heard of this owner — a
61
+ * hand-created group, a legacy row, a fixture. Those are not modules whose
62
+ * presence anybody can toggle, and treating them as absent would take an
63
+ * operator's configuration away for a module that does not exist.
64
+ */
65
+ presenceOf(moduleId: string): boolean | undefined;
66
+ /** The module whose activation control this code holds, if any. */
67
+ activationControlOwner(settingCode: string): string | undefined;
68
+ }
69
+ /** One setting, plus what feature 073 says an operator may do with it. */
70
+ export interface ClassifiedSetting {
71
+ setting: Setting;
72
+ values: SettingValue[];
73
+ /**
74
+ * `false` when the owning module is not effectively present. The value is
75
+ * still readable — off is not uninstall — but every write is refused
76
+ * (FR-033).
77
+ */
78
+ editable: boolean;
79
+ /**
80
+ * This setting IS its module's activation control: the single exception that
81
+ * stays writable while the module is off, and the one setting this service
82
+ * refuses outright (the audited Command owns it).
83
+ */
84
+ activationControl: boolean;
85
+ }
86
+ export interface SetValueResult {
87
+ setting: Setting;
88
+ affectedChannelIds: string[];
89
+ newVersion: string;
90
+ }
91
+ export declare class SettingsAdminService {
92
+ private readonly emFactory;
93
+ private readonly eventBus;
94
+ /**
95
+ * The kernel's settings cache, contributed by a root as `settingsCache`.
96
+ * Required, and deliberately not optional: an optional cache is a cache
97
+ * that is silently absent in one composition and present in the other,
98
+ * which is the shape every previous defect in this area had.
99
+ */
100
+ private readonly cache;
101
+ private readonly auditLogService?;
102
+ /** Base64 32-byte key for `secret` settings (feature 043, FR-021). */
103
+ private readonly secretEncryptionKey?;
104
+ /**
105
+ * Feature 073. Absent in a composition with no lifecycle (unit tests):
106
+ * every setting then classifies as editable, which is the pre-073
107
+ * behaviour rather than a fall-open — there is no activation axis to
108
+ * resolve at all.
109
+ */
110
+ private readonly presence?;
111
+ /**
112
+ * Feature 078, D-95.2. Absent in a composition that registers no registry:
113
+ * every write is then accepted on shape alone, which is the pre-078
114
+ * behaviour. Present, it is where the module that declared the setting gets
115
+ * to refuse a value `settings` cannot judge.
116
+ */
117
+ private readonly writeValidators?;
118
+ constructor(emFactory: () => EntityManager, eventBus: EventBus,
119
+ /**
120
+ * The kernel's settings cache, contributed by a root as `settingsCache`.
121
+ * Required, and deliberately not optional: an optional cache is a cache
122
+ * that is silently absent in one composition and present in the other,
123
+ * which is the shape every previous defect in this area had.
124
+ */
125
+ cache: SettingsCacheInvalidation, auditLogService?: AuditPort | undefined,
126
+ /** Base64 32-byte key for `secret` settings (feature 043, FR-021). */
127
+ secretEncryptionKey?: string | undefined,
128
+ /**
129
+ * Feature 073. Absent in a composition with no lifecycle (unit tests):
130
+ * every setting then classifies as editable, which is the pre-073
131
+ * behaviour rather than a fall-open — there is no activation axis to
132
+ * resolve at all.
133
+ */
134
+ presence?: ModulePresencePort | undefined,
135
+ /**
136
+ * Feature 078, D-95.2. Absent in a composition that registers no registry:
137
+ * every write is then accepted on shape alone, which is the pre-078
138
+ * behaviour. Present, it is where the module that declared the setting gets
139
+ * to refuse a value `settings` cannot judge.
140
+ */
141
+ writeValidators?: SettingWriteValidatorRegistryPort | undefined);
142
+ /**
143
+ * Classify one setting against the effective state of the module that owns
144
+ * it. Per setting, not per group: a disabled module's activation control must
145
+ * stay visible and writable (Constitution XVII's single exception), so its
146
+ * group stays non-empty and a group-level filter would render the whole
147
+ * group — every knob of a module that is supposed to be gone.
148
+ */
149
+ private classify;
150
+ /**
151
+ * Refuse a write the classification says is not available.
152
+ *
153
+ * Two distinct refusals, because they mean different things to an operator:
154
+ * an activation code has a *different* door (the audited Command), while an
155
+ * absent module's ordinary setting has *no* door until the module is back.
156
+ */
157
+ private assertWritable;
158
+ listGroups(filter?: {
159
+ groupCode?: string;
160
+ }): Promise<{
161
+ groups: Array<{
162
+ group: SettingGroup;
163
+ settings: ClassifiedSetting[];
164
+ }>;
165
+ }>;
166
+ getSettingByCode(code: string): Promise<{
167
+ setting: Setting;
168
+ values: SettingValue[];
169
+ version: string;
170
+ editable: boolean;
171
+ activationControl: boolean;
172
+ }>;
173
+ setValueForAllChannels(code: string, rawValue: unknown, expectedVersion: string | null, actor: AdminAuditContext): Promise<SetValueResult>;
174
+ setValueForSubset(code: string, channelCodes: string[], rawValue: unknown, expectedVersion: string | null, actor: AdminAuditContext): Promise<SetValueResult>;
175
+ private setValue;
176
+ /**
177
+ * Hand every channel's **post-write** value to the validators the owning
178
+ * module contributed, and let their throw reach the caller unchanged.
179
+ *
180
+ * `settings` computes the projection because it owns three-tier resolution
181
+ * (per-channel row → globalValue → manifest defaultValue); a validator that
182
+ * re-derived it would drift from it. The extra `SalesChannel` read only
183
+ * happens when a validator is actually registered for the code.
184
+ */
185
+ private runWriteValidators;
186
+ resetValues(code: string, channelCodes: string[] | undefined, actor: AdminAuditContext): Promise<{
187
+ setting: Setting;
188
+ resetChannelIds: string[];
189
+ globalValueCleared: boolean;
190
+ newVersion: string;
191
+ }>;
192
+ createGroup(input: {
193
+ code: string;
194
+ name: string;
195
+ salesChannelCodes?: string[];
196
+ }, actor: AdminAuditContext): Promise<SettingGroup>;
197
+ updateGroup(code: string, patch: {
198
+ name?: string;
199
+ salesChannelCodes?: string[];
200
+ }, expectedVersion: string | null, actor: AdminAuditContext): Promise<SettingGroup>;
201
+ deleteGroup(code: string, actor: AdminAuditContext): Promise<void>;
202
+ /** Compute the setting's effective version = max(setting.updated_at, max(values.updated_at)). */
203
+ computeSettingVersion(setting: Setting, values: SettingValue[]): string;
204
+ private assertVersion;
205
+ }
206
+ //# sourceMappingURL=settings-admin.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-admin.service.d.ts","sourceRoot":"","sources":["../../../src/backend/services/settings-admin.service.ts"],"names":[],"mappings":"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"}