@discover-cloud/shared 1.2.9 → 1.4.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 (183) hide show
  1. package/dist/authorization/index.d.ts +2 -2
  2. package/dist/authorization/index.js +1 -1
  3. package/dist/authorization/permission-cache.service.d.ts +104 -16
  4. package/dist/authorization/permission-cache.service.js +177 -148
  5. package/dist/authorization/permission-checker.d.ts +30 -0
  6. package/dist/authorization/permission-checker.js +40 -0
  7. package/dist/context/index.d.ts +1 -1
  8. package/dist/context/index.js +1 -1
  9. package/dist/context/request-context.storage.d.ts +21 -0
  10. package/dist/context/request-context.storage.js +37 -0
  11. package/dist/contracts/auth-service/account.dto.d.ts +30 -0
  12. package/dist/contracts/auth-service/account.dto.js +7 -0
  13. package/dist/contracts/auth-service/auth.dto.d.ts +21 -0
  14. package/dist/contracts/auth-service/auth.dto.js +10 -0
  15. package/dist/contracts/index.d.ts +1 -0
  16. package/dist/{security → contracts}/index.js +1 -1
  17. package/dist/contracts/visibility.d.ts +63 -0
  18. package/dist/contracts/visibility.js +10 -0
  19. package/dist/dtos/audit-service.types.d.ts +42 -0
  20. package/dist/dtos/audit-service.types.js +31 -0
  21. package/dist/dtos/auth-service.dto.d.ts +87 -26
  22. package/dist/dtos/auth-service.dto.js +4 -0
  23. package/dist/dtos/cloud-service.dto.d.ts +57 -27
  24. package/dist/dtos/cloud-service.dto.js +5 -0
  25. package/dist/dtos/index.d.ts +6 -5
  26. package/dist/dtos/index.js +1 -0
  27. package/dist/dtos/insights-service.dto.d.ts +184 -32
  28. package/dist/dtos/insights-service.dto.js +8 -0
  29. package/dist/dtos/response.dto.d.ts +12 -83
  30. package/dist/dtos/response.dto.js +2 -21
  31. package/dist/dtos/user-service.dto.d.ts +163 -13
  32. package/dist/enums/domain.enums.d.ts +272 -75
  33. package/dist/enums/domain.enums.js +329 -102
  34. package/dist/enums/index.d.ts +2 -2
  35. package/dist/enums/permissions.enums.d.ts +142 -80
  36. package/dist/enums/permissions.enums.js +174 -133
  37. package/dist/errors/app-error.d.ts +13 -18
  38. package/dist/errors/app-error.js +15 -21
  39. package/dist/errors/http-errors.d.ts +106 -18
  40. package/dist/errors/http-errors.js +136 -51
  41. package/dist/errors/index.d.ts +2 -2
  42. package/dist/http/index.d.ts +2 -1
  43. package/dist/http/index.js +1 -0
  44. package/dist/http/request-context.d.ts +8 -0
  45. package/dist/http/request-context.js +37 -0
  46. package/dist/http/service-client.d.ts +93 -40
  47. package/dist/http/service-client.js +104 -55
  48. package/dist/index.d.ts +11 -9
  49. package/dist/index.js +2 -0
  50. package/dist/jwt/index.d.ts +3 -2
  51. package/dist/jwt/index.js +2 -1
  52. package/dist/jwt/machine-jwt-verifier.d.ts +21 -0
  53. package/dist/jwt/machine-jwt-verifier.js +83 -0
  54. package/dist/jwt/machine-token-client.d.ts +36 -5
  55. package/dist/jwt/machine-token-client.js +61 -27
  56. package/dist/jwt/user-jwt-verifier.d.ts +31 -0
  57. package/dist/jwt/user-jwt-verifier.js +102 -0
  58. package/dist/messaging/audit.publisher.d.ts +14 -0
  59. package/dist/messaging/audit.publisher.js +49 -0
  60. package/dist/messaging/index.d.ts +2 -0
  61. package/dist/{dto → messaging}/index.js +2 -3
  62. package/dist/messaging/rabbitmq.client.d.ts +15 -0
  63. package/dist/messaging/rabbitmq.client.js +133 -0
  64. package/dist/middleware/error-handler.middleware.d.ts +8 -28
  65. package/dist/middleware/error-handler.middleware.js +63 -54
  66. package/dist/middleware/index.d.ts +10 -8
  67. package/dist/middleware/index.js +7 -5
  68. package/dist/middleware/request-context.middleware.d.ts +6 -0
  69. package/dist/middleware/request-context.middleware.js +48 -0
  70. package/dist/middleware/require-auth.middleware.d.ts +7 -76
  71. package/dist/middleware/require-auth.middleware.js +29 -117
  72. package/dist/middleware/require-machine.middleware.d.ts +13 -0
  73. package/dist/middleware/require-machine.middleware.js +128 -0
  74. package/dist/middleware/require-org-permission-from-body.middleware.d.ts +10 -0
  75. package/dist/middleware/require-org-permission-from-body.middleware.js +23 -0
  76. package/dist/middleware/require-org-permission.middleware.d.ts +19 -0
  77. package/dist/middleware/require-org-permission.middleware.js +115 -0
  78. package/dist/middleware/require-platform-permission.middleware.d.ts +19 -0
  79. package/dist/middleware/require-platform-permission.middleware.js +91 -0
  80. package/dist/middleware/require-user.middleware.d.ts +14 -0
  81. package/dist/middleware/require-user.middleware.js +30 -0
  82. package/dist/middleware/require-workspace-permission.middleware.d.ts +20 -0
  83. package/dist/middleware/require-workspace-permission.middleware.js +114 -0
  84. package/dist/middleware/validate.middleware.d.ts +31 -31
  85. package/dist/middleware/validate.middleware.js +31 -33
  86. package/dist/types/audit.types.d.ts +39 -0
  87. package/dist/types/audit.types.js +30 -0
  88. package/dist/types/express.types.d.ts +92 -124
  89. package/dist/types/express.types.js +30 -49
  90. package/dist/types/index.d.ts +1 -1
  91. package/dist/utils/date.util.d.ts +6 -0
  92. package/dist/utils/date.util.js +11 -0
  93. package/dist/utils/env.util.d.ts +6 -0
  94. package/dist/utils/env.util.js +19 -0
  95. package/dist/utils/index.d.ts +5 -4
  96. package/dist/utils/index.js +5 -4
  97. package/dist/utils/logger.util.d.ts +31 -0
  98. package/dist/utils/logger.util.js +91 -0
  99. package/dist/utils/pagination.util.d.ts +6 -0
  100. package/dist/utils/pagination.util.js +20 -0
  101. package/dist/utils/request-context.als.d.ts +10 -0
  102. package/dist/utils/request-context.als.js +5 -0
  103. package/dist/utils/response.util.d.ts +27 -0
  104. package/dist/utils/response.util.js +56 -0
  105. package/dist/utils/slug.util.d.ts +9 -0
  106. package/dist/utils/slug.util.js +32 -0
  107. package/dist/utils/url-safety.util.d.ts +6 -0
  108. package/dist/utils/url-safety.util.js +75 -0
  109. package/package.json +3 -1
  110. package/dist/authorization/permissions.d.ts +0 -78
  111. package/dist/authorization/permissions.js +0 -174
  112. package/dist/context/access-context.d.ts +0 -10
  113. package/dist/context/access-context.js +0 -2
  114. package/dist/dto/auth-service.dtos.d.ts +0 -44
  115. package/dist/dto/auth-service.dtos.js +0 -2
  116. package/dist/dto/index.d.ts +0 -3
  117. package/dist/dto/response.dtos.d.ts +0 -55
  118. package/dist/dto/response.dtos.js +0 -6
  119. package/dist/dto/user-service.dtos.d.ts +0 -50
  120. package/dist/dto/user-service.dtos.js +0 -2
  121. package/dist/enums/auth-service.enums.d.ts +0 -12
  122. package/dist/enums/auth-service.enums.js +0 -17
  123. package/dist/enums/permissions.types.d.ts +0 -12
  124. package/dist/enums/permissions.types.js +0 -17
  125. package/dist/enums/user-service.enums.d.ts +0 -32
  126. package/dist/enums/user-service.enums.js +0 -41
  127. package/dist/internal/index.d.ts +0 -4
  128. package/dist/internal/index.js +0 -20
  129. package/dist/internal/internal-jwt.service.d.ts +0 -13
  130. package/dist/internal/internal-jwt.service.js +0 -88
  131. package/dist/internal/internal-jwt.types.d.ts +0 -7
  132. package/dist/internal/internal-jwt.types.js +0 -2
  133. package/dist/internal/internal-key-manager.d.ts +0 -16
  134. package/dist/internal/internal-key-manager.js +0 -67
  135. package/dist/internal/registry.d.ts +0 -8
  136. package/dist/internal/registry.js +0 -34
  137. package/dist/internal/service-client.d.ts +0 -9
  138. package/dist/internal/service-client.js +0 -94
  139. package/dist/jwt/internal-jwt-verifier.d.ts +0 -41
  140. package/dist/jwt/internal-jwt-verifier.js +0 -185
  141. package/dist/jwt/jwt-verifier.d.ts +0 -9
  142. package/dist/jwt/jwt-verifier.js +0 -36
  143. package/dist/jwt/service-client.d.ts +0 -7
  144. package/dist/jwt/service-client.js +0 -87
  145. package/dist/middleware/authorize.d.ts +0 -3
  146. package/dist/middleware/authorize.js +0 -24
  147. package/dist/middleware/authorize.middleware.d.ts +0 -54
  148. package/dist/middleware/authorize.middleware.js +0 -104
  149. package/dist/middleware/error-handler.d.ts +0 -4
  150. package/dist/middleware/error-handler.js +0 -23
  151. package/dist/middleware/request-id.d.ts +0 -2
  152. package/dist/middleware/request-id.js +0 -9
  153. package/dist/middleware/request-id.middleware.d.ts +0 -22
  154. package/dist/middleware/request-id.middleware.js +0 -34
  155. package/dist/middleware/require-auth.d.ts +0 -10
  156. package/dist/middleware/require-auth.js +0 -34
  157. package/dist/middleware/require-human.middleware.d.ts +0 -2
  158. package/dist/middleware/require-human.middleware.js +0 -18
  159. package/dist/middleware/require-internal.middleware.d.ts +0 -18
  160. package/dist/middleware/require-internal.middleware.js +0 -183
  161. package/dist/middleware/validate.d.ts +0 -5
  162. package/dist/middleware/validate.js +0 -18
  163. package/dist/middleware/validated-merge.middleware.d.ts +0 -20
  164. package/dist/middleware/validated-merge.middleware.js +0 -33
  165. package/dist/middleware/verify-internal-jwt.d.ts +0 -7
  166. package/dist/middleware/verify-internal-jwt.js +0 -25
  167. package/dist/security/guard.d.ts +0 -10
  168. package/dist/security/guard.js +0 -40
  169. package/dist/security/index.d.ts +0 -1
  170. package/dist/types/express.d.ts +0 -22
  171. package/dist/types/express.js +0 -3
  172. package/dist/utils/date.utils.d.ts +0 -25
  173. package/dist/utils/date.utils.js +0 -30
  174. package/dist/utils/env.d.ts +0 -46
  175. package/dist/utils/env.js +0 -61
  176. package/dist/utils/env.utils.d.ts +0 -46
  177. package/dist/utils/env.utils.js +0 -61
  178. package/dist/utils/logger.utils.d.ts +0 -66
  179. package/dist/utils/logger.utils.js +0 -97
  180. package/dist/utils/response.d.ts +0 -4
  181. package/dist/utils/response.js +0 -35
  182. package/dist/utils/response.utils.d.ts +0 -54
  183. package/dist/utils/response.utils.js +0 -85
@@ -1,22 +1,12 @@
1
- import { CloudProvider } from "../enums";
2
1
  /**
3
- * INSIGHTS SERVICE DTOs (@discover-cloud/shared)
4
- * ─────────────────────────────────────────────────
5
- * Four groups of types, each with a distinct role:
2
+ * @file insights-service.dto.ts
3
+ * @description Data transfer objects (DTOs) for cost tracking, cloud resource inventory,
4
+ * budgets, and aggregated analytics reports in the Insights Service.
6
5
  *
7
- * Push payloads cloud-service insights-service (internal HTTP).
8
- * Carry raw provider data collected during a sync job.
9
- *
10
- * Record DTOs — insights-service → frontend (public HTTP).
11
- * Stored/enriched records returned to clients.
12
- * All timestamps are ISO 8601 strings (JSON has no Date).
13
- *
14
- * Query DTO — internal query params passed between service layers.
15
- * Never crosses an HTTP boundary — Date is fine here.
16
- *
17
- * Summary DTOs — assembled aggregations with no corresponding domain
18
- * model or mapper. Built directly from DB query results.
6
+ * All push payloads and query DTOs are scoped to a workspaceId — the sole
7
+ * multi-tenancy discriminator. userId / organizationId have been removed.
19
8
  */
9
+ import { CloudProvider, RecommendationCategory, RecommendationStatus, Severity, AlertStatus, ReportType, ReportStatus, ReportFormat, ResourceEventType } from '../enums';
20
10
  export interface PushCostItem {
21
11
  service: string;
22
12
  region: string;
@@ -43,27 +33,66 @@ export interface PushBudgetItem {
43
33
  forecastSpend: number;
44
34
  period: string;
45
35
  }
36
+ export interface PushResourceEventItem {
37
+ resourceId: string;
38
+ resourceType: string;
39
+ eventType: ResourceEventType;
40
+ severity?: Severity;
41
+ title: string;
42
+ description?: string;
43
+ before?: Record<string, unknown>;
44
+ after?: Record<string, unknown>;
45
+ metadata?: Record<string, unknown>;
46
+ occurredAt: string;
47
+ }
48
+ export interface PushRecommendationItem {
49
+ resourceId?: string;
50
+ resourceType?: string;
51
+ category: RecommendationCategory;
52
+ severity?: Severity;
53
+ title: string;
54
+ description: string;
55
+ estimatedSaving?: number;
56
+ estimatedSavingCurrency?: string;
57
+ metadata?: Record<string, unknown>;
58
+ expiresAt?: string;
59
+ }
46
60
  export interface PushCostPayload {
47
61
  cloudAccountId: string;
48
- userId: string;
62
+ /** Workspace that owns this data — the sole tenancy scope. */
49
63
  provider: CloudProvider;
50
64
  costs: PushCostItem[];
51
65
  }
52
66
  export interface PushResourcePayload {
53
67
  cloudAccountId: string;
54
- userId: string;
68
+ /** Workspace that owns this data — the sole tenancy scope. */
55
69
  provider: CloudProvider;
56
70
  resources: PushResourceItem[];
57
71
  }
58
72
  export interface PushBudgetPayload {
59
73
  cloudAccountId: string;
60
- userId: string;
74
+ /** Workspace that owns this data — the sole tenancy scope. */
75
+ provider: CloudProvider;
61
76
  budgets: PushBudgetItem[];
62
77
  }
78
+ /**
79
+ * Bundled fetch-result payload — matches the shape cloud-service's
80
+ * SyncOrchestrator.publishSyncData() emits on "cloud.fetch.completed".
81
+ * Used by the event consumer rather than a direct HTTP push.
82
+ */
83
+ export interface PushResourceEventPayload {
84
+ cloudAccountId: string;
85
+ provider: CloudProvider;
86
+ events: PushResourceEventItem[];
87
+ }
88
+ export interface PushRecommendationPayload {
89
+ cloudAccountId: string;
90
+ provider: CloudProvider;
91
+ recommendations: PushRecommendationItem[];
92
+ }
63
93
  export interface CostRecordDto {
64
94
  id: string;
65
95
  cloudAccountId: string;
66
- userId: string;
67
96
  provider: CloudProvider;
68
97
  service: string;
69
98
  region: string;
@@ -77,7 +106,6 @@ export interface CostRecordDto {
77
106
  export interface ResourceRecordDto {
78
107
  id: string;
79
108
  cloudAccountId: string;
80
- userId: string;
81
109
  provider: CloudProvider;
82
110
  resourceType: string;
83
111
  resourceId: string;
@@ -88,10 +116,23 @@ export interface ResourceRecordDto {
88
116
  metadata: Record<string, unknown>;
89
117
  recordedAt: string;
90
118
  }
119
+ export interface LatestResourceSnapshotDto {
120
+ resourceId: string;
121
+ resourceType: string;
122
+ cloudAccountId: string;
123
+ provider: CloudProvider;
124
+ region: string;
125
+ name: string | null;
126
+ status: string;
127
+ tags: Record<string, string>;
128
+ metadata: Record<string, unknown>;
129
+ firstSeenAt: string;
130
+ lastSeenAt: string;
131
+ deletedAt: string | null;
132
+ }
91
133
  export interface BudgetRecordDto {
92
134
  id: string;
93
135
  cloudAccountId: string;
94
- userId: string;
95
136
  name: string;
96
137
  limitAmount: number;
97
138
  currency: string;
@@ -103,19 +144,129 @@ export interface BudgetRecordDto {
103
144
  isForecastOver: boolean;
104
145
  recordedAt: string;
105
146
  }
147
+ export interface ResourceEventDto {
148
+ id: string;
149
+ cloudAccountId: string;
150
+ provider: CloudProvider;
151
+ resourceId: string;
152
+ resourceType: string;
153
+ eventType: ResourceEventType;
154
+ severity: Severity;
155
+ title: string;
156
+ description: string | null;
157
+ before: Record<string, unknown> | null;
158
+ after: Record<string, unknown> | null;
159
+ metadata: Record<string, unknown>;
160
+ occurredAt: string;
161
+ detectedAt: string;
162
+ }
163
+ export interface RecommendationDto {
164
+ id: string;
165
+ cloudAccountId: string;
166
+ provider: CloudProvider;
167
+ resourceId: string | null;
168
+ resourceType: string | null;
169
+ category: RecommendationCategory;
170
+ severity: Severity;
171
+ title: string;
172
+ description: string;
173
+ estimatedSaving: number | null;
174
+ estimatedSavingCurrency: string;
175
+ status: RecommendationStatus;
176
+ metadata: Record<string, unknown>;
177
+ appliedAt: string | null;
178
+ appliedBy: string | null;
179
+ dismissedAt: string | null;
180
+ dismissedBy: string | null;
181
+ expiresAt: string | null;
182
+ staleAt: string | null;
183
+ createdAt: string;
184
+ updatedAt: string;
185
+ }
186
+ export interface AlertDto {
187
+ id: string;
188
+ cloudAccountId: string | null;
189
+ provider: CloudProvider | null;
190
+ alertRuleId: string | null;
191
+ resourceId: string | null;
192
+ resourceType: string | null;
193
+ severity: Severity;
194
+ status: AlertStatus;
195
+ title: string;
196
+ message: string;
197
+ metadata: Record<string, unknown>;
198
+ acknowledgedAt: string | null;
199
+ acknowledgedBy: string | null;
200
+ resolvedAt: string | null;
201
+ resolvedBy: string | null;
202
+ createdAt: string;
203
+ updatedAt: string;
204
+ }
205
+ export interface ReportDto {
206
+ id: string;
207
+ cloudAccountId: string | null;
208
+ name: string;
209
+ type: ReportType;
210
+ format: ReportFormat;
211
+ status: ReportStatus;
212
+ filters: Record<string, unknown>;
213
+ storageUrl: string | null;
214
+ fileSizeBytes: string | null;
215
+ mimeType: string | null;
216
+ errorMessage: string | null;
217
+ generatedBy: string;
218
+ generatedAt: string | null;
219
+ expiresAt: string | null;
220
+ cleanedAt: string | null;
221
+ createdAt: string;
222
+ updatedAt: string;
223
+ }
224
+ export interface ExchangeRateDto {
225
+ id: string;
226
+ fromCurrency: string;
227
+ toCurrency: string;
228
+ rate: number;
229
+ source: string;
230
+ effectiveDate: string;
231
+ createdAt: string;
232
+ }
233
+ export interface IngestionSnapshotDto {
234
+ id: string;
235
+ cloudAccountId: string;
236
+ syncJobId: string;
237
+ resourcesFound: number;
238
+ resourcesAdded: number;
239
+ resourcesUpdated: number;
240
+ resourcesRemoved: number;
241
+ costRecordsImported: number;
242
+ budgetsImported: number;
243
+ durationMs: number | null;
244
+ createdAt: string;
245
+ }
246
+ export interface BulkWriteResultDto {
247
+ count: number;
248
+ }
249
+ export interface CloudAccountPurgeResultDto {
250
+ cloudAccountId: string;
251
+ costRecords: number;
252
+ resourceRecords: number;
253
+ resourceEvents: number;
254
+ budgetSnapshots: number;
255
+ recommendations: number;
256
+ alerts: number;
257
+ reports: number;
258
+ ingestionSnapshots: number;
259
+ }
106
260
  /**
107
- * CostQueryDto
108
- * Used by the insights-service query layer internally.
109
- * Date fields are fine here — this never reaches JSON serialisation.
110
- * If this ever needs to cross HTTP, convert from/to to ISO 8601 strings.
261
+ * Parameter model for cost queries.
262
+ * Scoped to a workspaceId callers must always provide this.
111
263
  */
112
264
  export interface CostQueryDto {
113
- userId?: string;
114
265
  cloudAccountId?: string;
115
266
  provider?: CloudProvider;
116
267
  from?: Date;
117
268
  to?: Date;
118
- groupBy?: "service" | "region" | "provider" | "day" | "month";
269
+ groupBy?: 'service' | 'region' | 'provider' | 'day' | 'month';
119
270
  }
120
271
  export interface DashboardSummaryDto {
121
272
  totalSpend: number;
@@ -127,8 +278,9 @@ export interface DashboardSummaryDto {
127
278
  label: string;
128
279
  amount: number;
129
280
  }[];
130
- costTrend: {
131
- date: string;
132
- amount: number;
133
- }[];
281
+ costTrend: CostTrendDto[];
282
+ }
283
+ export interface CostTrendDto {
284
+ date: string;
285
+ amount: number;
134
286
  }
@@ -1,2 +1,10 @@
1
1
  "use strict";
2
+ /**
3
+ * @file insights-service.dto.ts
4
+ * @description Data transfer objects (DTOs) for cost tracking, cloud resource inventory,
5
+ * budgets, and aggregated analytics reports in the Insights Service.
6
+ *
7
+ * All push payloads and query DTOs are scoped to a workspaceId — the sole
8
+ * multi-tenancy discriminator. userId / organizationId have been removed.
9
+ */
2
10
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,25 +1,6 @@
1
1
  /**
2
- * RESPONSE DTOs (@discover-cloud/shared)
3
- * ─────────────────────────────────────────
4
- * Shared HTTP response shapes used across all services.
5
- * Every response — success or error — is wrapped in the ApiSuccessResponse
6
- * or ApiErrorResponse envelope so clients have a consistent shape to key on.
7
- *
8
- * Envelope shape:
9
- * {
10
- * success: true,
11
- * data: T,
12
- * meta: { requestId, timestamp }
13
- * }
14
- * or
15
- * {
16
- * success: false,
17
- * error: { code, message, details? },
18
- * meta: { requestId, timestamp }
19
- * }
20
- *
21
- * The success() and failure() utils in shared/utils construct these
22
- * envelopes — don't build them manually in controllers.
2
+ * @file response.dto.ts
3
+ * @description Shared HTTP response envelopes, pagination models, and generic response contracts.
23
4
  */
24
5
  export interface ApiMeta {
25
6
  requestId: string;
@@ -39,39 +20,9 @@ export interface ApiErrorResponse {
39
20
  };
40
21
  meta: ApiMeta;
41
22
  }
42
- /**
43
- * TokensResponseDto
44
- * Returned on successful login or token refresh.
45
- *
46
- * accessToken — short-lived JWT returned in the response body.
47
- * refreshToken — long-lived token sent as an HttpOnly cookie by the auth
48
- * service; it is intentionally absent from this DTO.
49
- * Mobile clients that cannot use cookies should request a
50
- * separate endpoint that returns the refresh token explicitly.
51
- */
52
- export interface TokensResponseDto {
53
- accessToken: string;
54
- }
55
- /**
56
- * MessageResponseDto
57
- * Use for simple confirmations where no structured data is needed.
58
- * Example: { message: "Email verification sent" }
59
- */
60
23
  export interface MessageResponseDto {
61
24
  message: string;
62
25
  }
63
- /**
64
- * ActionResponseDto
65
- * Use when the client needs a machine-readable signal of what happened,
66
- * e.g. for polling loops, event-driven UIs, or audit trails.
67
- *
68
- * action — stable machine-readable identifier, e.g. "account.suspended"
69
- * message — human-readable description for display or logging
70
- *
71
- * Boolean-only DTOs (LoggedOutResponseDto, SuspendedResponseDto, etc.)
72
- * are intentionally collapsed into this shape — a boolean that is always
73
- * true on a 200 response carries no additional information.
74
- */
75
26
  export interface ActionResponseDto {
76
27
  action: string;
77
28
  message: string;
@@ -84,42 +35,20 @@ export interface PaginationMeta {
84
35
  hasNext: boolean;
85
36
  hasPrev: boolean;
86
37
  }
87
- /**
88
- * PaginatedResponseDto
89
- * Wrap paginated list results in this before passing to success().
90
- *
91
- * Usage:
92
- * success<PaginatedResponseDto<CloudAccountDto>>(res, req, {
93
- * items: accounts,
94
- * pagination: { page, pageSize, totalItems, totalPages, hasNext, hasPrev },
95
- * });
96
- */
97
38
  export interface PaginatedResponseDto<T> {
98
39
  items: T[];
99
40
  pagination: PaginationMeta;
100
41
  }
101
- /**
102
- * LoginResultDto
103
- * Internal auth service response returned after successful login.
104
- *
105
- * The optional cookie metadata allows controllers or gateways
106
- * to apply refresh-token cookies without coupling shared DTOs
107
- * to a specific HTTP framework.
108
- */
109
- export interface CookieMetadataDto {
110
- httpOnly?: boolean;
111
- secure?: boolean;
112
- sameSite?: boolean | "strict" | "lax" | "none";
113
- maxAge?: number;
114
- path?: string;
115
- domain?: string;
42
+ export interface AuthTokenDto {
43
+ accessToken: string;
44
+ }
45
+ export interface MachineTokenDto {
46
+ accessToken: string;
47
+ expiresIn: number;
116
48
  }
117
- export interface LoginResultCookieDto {
118
- name: string;
119
- value: string;
120
- options: CookieMetadataDto;
49
+ export interface CountResponseDto {
50
+ count: number;
121
51
  }
122
- export interface LoginResultDto {
123
- tokens: TokensResponseDto;
124
- cookie?: LoginResultCookieDto;
52
+ export interface SecretResponseDto {
53
+ secret: string;
125
54
  }
@@ -1,25 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
- * RESPONSE DTOs (@discover-cloud/shared)
4
- * ─────────────────────────────────────────
5
- * Shared HTTP response shapes used across all services.
6
- * Every response — success or error — is wrapped in the ApiSuccessResponse
7
- * or ApiErrorResponse envelope so clients have a consistent shape to key on.
8
- *
9
- * Envelope shape:
10
- * {
11
- * success: true,
12
- * data: T,
13
- * meta: { requestId, timestamp }
14
- * }
15
- * or
16
- * {
17
- * success: false,
18
- * error: { code, message, details? },
19
- * meta: { requestId, timestamp }
20
- * }
21
- *
22
- * The success() and failure() utils in shared/utils construct these
23
- * envelopes — don't build them manually in controllers.
3
+ * @file response.dto.ts
4
+ * @description Shared HTTP response envelopes, pagination models, and generic response contracts.
24
5
  */
25
6
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,11 +1,5 @@
1
- import { OrganizationRole, MembershipStatus, OrganizationStatus, Theme, Currency } from "../enums";
2
- /**
3
- * USER SERVICE DTOs (@discover-cloud/shared)
4
- * ─────────────────────────────────────────────
5
- * Shapes returned by the user service over HTTP.
6
- * All timestamps are ISO 8601 strings — JSON has no Date type.
7
- * Domain models use Date internally; mappers convert at the boundary.
8
- */
1
+ import { Currency, Theme, OrganizationStatus, MembershipStatus, WorkspaceType, RoleType, RoleCategory, RoleAssignmentStatus, InviteScopeType, InviteStatus, AlertRuleMetric, AlertRuleOperator, NotificationChannelType, ScopeType } from '../enums';
2
+ import { PaginatedResponseDto } from './response.dto';
9
3
  export interface UserDto {
10
4
  id: string;
11
5
  email: string;
@@ -19,23 +13,27 @@ export interface UserProfileDto {
19
13
  avatarUrl: string | null;
20
14
  jobTitle: string | null;
21
15
  bio: string | null;
22
- timezone: string | null;
23
- locale: string;
24
16
  country: string | null;
25
17
  pronouns: string | null;
18
+ phoneNumber: string | null;
26
19
  createdAt: string;
27
20
  updatedAt: string;
28
21
  }
29
22
  export interface UserPreferencesDto {
30
23
  id: string;
31
24
  userId: string;
25
+ locale: string;
26
+ timezone: string;
32
27
  theme: Theme;
33
- language: string;
34
28
  currency: Currency;
35
- emailAlerts: boolean;
29
+ emailNotifications: boolean;
36
30
  createdAt: string;
37
31
  updatedAt: string;
38
32
  }
33
+ export interface UserWithProfileDto extends UserDto {
34
+ profile: UserProfileDto | null;
35
+ preferences: UserPreferencesDto | null;
36
+ }
39
37
  export interface OrganizationDto {
40
38
  id: string;
41
39
  name: string;
@@ -45,12 +43,164 @@ export interface OrganizationDto {
45
43
  updatedAt: string;
46
44
  deletedAt: string | null;
47
45
  }
46
+ export interface OrganizationWithMembersCountDto extends OrganizationDto {
47
+ membersCount: number;
48
+ }
48
49
  export interface OrganizationMemberDto {
49
50
  id: string;
50
51
  userId: string;
51
52
  organizationId: string;
52
- role: OrganizationRole;
53
53
  status: MembershipStatus;
54
54
  createdAt: string;
55
55
  updatedAt: string;
56
56
  }
57
+ export interface WorkspaceDto {
58
+ id: string;
59
+ name: string;
60
+ slug: string;
61
+ type: WorkspaceType;
62
+ organizationId: string | null;
63
+ ownerId: string;
64
+ /** JSON resource filter defining which cloud resources belong to this workspace. */
65
+ resourceFilter: Record<string, unknown> | null;
66
+ linkedToOrgAt: string | null;
67
+ createdAt: string;
68
+ updatedAt: string;
69
+ deletedAt: string | null;
70
+ }
71
+ /** Maps a Workspace to the Cloud Accounts it can access. */
72
+ export interface WorkspaceCloudAccountDto {
73
+ workspaceId: string;
74
+ cloudAccountId: string;
75
+ createdAt: string;
76
+ }
77
+ export interface WorkspaceMemberDto {
78
+ id: string;
79
+ workspaceId: string;
80
+ userId: string;
81
+ createdAt: string;
82
+ updatedAt: string;
83
+ }
84
+ export interface PermissionDto {
85
+ id: string;
86
+ key: string;
87
+ resource: string;
88
+ action: string;
89
+ description: string | null;
90
+ serviceOwner: string;
91
+ dangerous: boolean;
92
+ createdAt: string;
93
+ }
94
+ export interface RoleDto {
95
+ id: string;
96
+ name: string;
97
+ type: RoleType;
98
+ category: RoleCategory;
99
+ organizationId: string | null;
100
+ isProtected: boolean;
101
+ createdAt: string;
102
+ updatedAt: string;
103
+ }
104
+ export interface RoleWithPermissionsDto extends RoleDto {
105
+ permissions: PermissionDto[];
106
+ }
107
+ export interface WorkspaceMemberWithRolesDto {
108
+ member: WorkspaceMemberDto;
109
+ user: UserDto;
110
+ roles: RoleDto[];
111
+ }
112
+ export interface RoleAssignmentDto {
113
+ id: string;
114
+ userId: string;
115
+ roleId: string;
116
+ scopeType: string;
117
+ organizationId: string | null;
118
+ workspaceId: string | null;
119
+ status: RoleAssignmentStatus;
120
+ role?: RoleDto;
121
+ createdAt: string;
122
+ updatedAt: string;
123
+ }
124
+ export interface InviteDto {
125
+ id: string;
126
+ email: string;
127
+ token: string;
128
+ userId: string | null;
129
+ scopeType: InviteScopeType;
130
+ organizationId: string | null;
131
+ workspaceId: string | null;
132
+ roleId: string;
133
+ status: InviteStatus;
134
+ invitedById: string;
135
+ invitedAt: string;
136
+ expiresAt: string;
137
+ acceptedAt: string | null;
138
+ rejectedAt: string | null;
139
+ revokedById: string | null;
140
+ revokedAt: string | null;
141
+ createdAt: string;
142
+ updatedAt: string;
143
+ }
144
+ export interface ProvisionUserResponseDto {
145
+ user: UserWithProfileDto;
146
+ personalWorkspace: WorkspaceDto;
147
+ }
148
+ export interface AlertRuleDto {
149
+ id: string;
150
+ workspaceId: string;
151
+ createdBy: string;
152
+ name: string;
153
+ metric: AlertRuleMetric;
154
+ operator: AlertRuleOperator;
155
+ threshold: number;
156
+ isActive: boolean;
157
+ createdAt: string;
158
+ updatedAt: string;
159
+ }
160
+ export interface AlertRuleChannelDto {
161
+ id: string;
162
+ alertRuleId: string;
163
+ type: NotificationChannelType;
164
+ destination: string;
165
+ createdAt: string;
166
+ updatedAt: string;
167
+ }
168
+ export interface AlertRuleWithChannelsDto extends AlertRuleDto {
169
+ channels: AlertRuleChannelDto[];
170
+ }
171
+ export interface PermissionCheckDto {
172
+ userId: string;
173
+ permissionKey: string;
174
+ scopeType: ScopeType;
175
+ organizationId?: string;
176
+ workspaceId?: string;
177
+ }
178
+ export interface PermissionCheckResultDto extends PermissionCheckDto {
179
+ allowed: boolean;
180
+ }
181
+ export interface UserContextDto {
182
+ user: UserDto;
183
+ organizations: OrganizationDto[];
184
+ workspaces: WorkspaceDto[];
185
+ permissions: PermissionDto[];
186
+ }
187
+ export interface SecurityContextDto {
188
+ user: UserDto;
189
+ roles: RoleAssignmentDto[];
190
+ }
191
+ export interface MyInvitesListDto {
192
+ organizations: PaginatedResponseDto<InviteDto>;
193
+ workspaces: PaginatedResponseDto<InviteDto>;
194
+ }
195
+ export interface ResentInviteDto {
196
+ invite: InviteDto;
197
+ token: string;
198
+ }
199
+ export interface PermissionPreviewDto {
200
+ count: number;
201
+ permissions: PermissionDto[];
202
+ }
203
+ export interface PurgeStatsDto {
204
+ workspaces: number;
205
+ organizations: number;
206
+ }