tychat-contracts 1.6.21 → 1.6.24

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 (118) hide show
  1. package/README.md +33 -33
  2. package/dist/storage/delete-object-rpc.dto.d.ts +9 -0
  3. package/dist/storage/delete-object-rpc.dto.d.ts.map +1 -0
  4. package/dist/storage/delete-object-rpc.dto.js +48 -0
  5. package/dist/storage/index.d.ts +1 -0
  6. package/dist/storage/index.d.ts.map +1 -1
  7. package/dist/storage/index.js +1 -0
  8. package/dist/storage/storage-rmq-patterns.d.ts +2 -0
  9. package/dist/storage/storage-rmq-patterns.d.ts.map +1 -1
  10. package/dist/storage/storage-rmq-patterns.js +3 -1
  11. package/jest.config.ts +5 -5
  12. package/package.json +2 -1
  13. package/src/ai/ai-usage-response.dto.ts +47 -47
  14. package/src/ai/create-ai-usage.dto.ts +43 -43
  15. package/src/analytics/analytics-emitter.helper.ts +54 -54
  16. package/src/analytics/analytics-query.dto.ts +222 -222
  17. package/src/analytics/create-analytic-event.dto.ts +85 -85
  18. package/src/analytics/event-analytic.enum.ts +119 -119
  19. package/src/appointments/appointment-procedure.dto.ts +76 -76
  20. package/src/appointments/create-appointment.dto.ts +153 -153
  21. package/src/appointments/index.ts +10 -10
  22. package/src/appointments/list-appointments-query.dto.ts +157 -157
  23. package/src/appointments/update-appointment-procedure.dto.ts +10 -10
  24. package/src/appointments/update-appointment.dto.ts +4 -4
  25. package/src/auth/refresh-token.dto.ts +10 -10
  26. package/src/billing/billing-response.dto.ts +68 -68
  27. package/src/billing/create-billing.dto.ts +70 -70
  28. package/src/billing/index.ts +6 -6
  29. package/src/billing/list-billings-query.dto.ts +61 -61
  30. package/src/billing/update-billing.dto.ts +4 -4
  31. package/src/cashback/cashback-balance-response.dto.ts +33 -33
  32. package/src/cashback/cashback-config-response.dto.ts +43 -43
  33. package/src/cashback/cashback-enums.ts +33 -33
  34. package/src/cashback/cashback-kafka-payloads.ts +102 -102
  35. package/src/cashback/cashback-kafka-topics.ts +23 -23
  36. package/src/cashback/index.ts +7 -7
  37. package/src/cashback/referral-code-response.dto.ts +49 -49
  38. package/src/cashback/use-referral-code-response.dto.ts +15 -15
  39. package/src/configurations/clinic-configuration.dto.ts +39 -39
  40. package/src/configurations/opening-hours-slot.dto.ts +41 -41
  41. package/src/configurations/update-clinic-configuration.dto.ts +39 -39
  42. package/src/connections/whatsapp-official.dto.ts +113 -113
  43. package/src/conversations/conversation-contact-filters-query.validator.spec.ts +221 -221
  44. package/src/conversations/conversation-contact-filters-query.validator.ts +10 -10
  45. package/src/conversations/conversation-intention.dto.ts +24 -24
  46. package/src/conversations/conversation-response.dto.ts +69 -69
  47. package/src/conversations/conversation-session-response.dto.ts +65 -65
  48. package/src/conversations/conversation-type.dto.ts +15 -15
  49. package/src/conversations/create-conversation-session.dto.ts +28 -28
  50. package/src/conversations/create-conversation.dto.ts +69 -69
  51. package/src/conversations/followup-config-response.dto.ts +290 -290
  52. package/src/conversations/followup-log-response.dto.ts +58 -58
  53. package/src/conversations/followup-type.dto.ts +22 -22
  54. package/src/conversations/index.ts +17 -17
  55. package/src/conversations/list-conversation-contacts-filters.dto.ts +15 -15
  56. package/src/conversations/list-conversation-contacts-query.dto.ts +81 -81
  57. package/src/conversations/satisfaction-response.dto.ts +116 -116
  58. package/src/filters/index.ts +1 -1
  59. package/src/filters/parsed-filter.dto.ts +41 -41
  60. package/src/index.ts +23 -23
  61. package/src/patients/create-patient.dto.ts +122 -122
  62. package/src/patients/index.ts +10 -10
  63. package/src/patients/list-patients-filters.dto.ts +15 -15
  64. package/src/patients/list-patients-query.dto.ts +61 -61
  65. package/src/patients/patient-document-response.dto.ts +33 -33
  66. package/src/patients/patient-history-entry.dto.ts +22 -22
  67. package/src/patients/patient-status.dto.ts +9 -9
  68. package/src/patients/update-patient-document.dto.ts +10 -10
  69. package/src/patients/update-patient.dto.ts +15 -15
  70. package/src/payment-gateway/create-gateway-payment.dto.ts +123 -123
  71. package/src/payment-gateway/gateway-payment-response.dto.ts +65 -65
  72. package/src/payment-gateway/index.ts +12 -12
  73. package/src/payment-gateway/list-gateway-payments-query.dto.ts +63 -63
  74. package/src/payment-gateway/payment-gateway-kafka-topics.ts +25 -25
  75. package/src/payment-gateway/payment-gateway.enums.ts +34 -34
  76. package/src/payment-gateway/update-gateway-payment.dto.ts +7 -7
  77. package/src/payment-gateway/webhook-payload.dto.ts +32 -32
  78. package/src/payments/create-payment.dto.ts +73 -73
  79. package/src/payments/index.ts +6 -6
  80. package/src/payments/list-payments-query.dto.ts +44 -44
  81. package/src/payments/payment-response.dto.ts +67 -67
  82. package/src/payments/update-payment.dto.ts +4 -4
  83. package/src/procedures/create-procedure.dto.ts +104 -104
  84. package/src/procedures/index.ts +6 -6
  85. package/src/procedures/list-procedures-query.dto.ts +59 -59
  86. package/src/procedures/update-procedure.dto.ts +4 -4
  87. package/src/storage/delete-object-rpc.dto.ts +28 -0
  88. package/src/storage/index.ts +1 -0
  89. package/src/storage/storage-rmq-patterns.ts +3 -0
  90. package/src/tenants/index.ts +10 -10
  91. package/src/tenants/whatsapp-provider-kind.dto.ts +12 -12
  92. package/dist/analytics/should-skip-analytics-tenant-lookup.d.ts +0 -7
  93. package/dist/analytics/should-skip-analytics-tenant-lookup.d.ts.map +0 -1
  94. package/dist/analytics/should-skip-analytics-tenant-lookup.js +0 -13
  95. package/dist/appointments/opening-hours-slot.dto.d.ts +0 -6
  96. package/dist/appointments/opening-hours-slot.dto.d.ts.map +0 -1
  97. package/dist/appointments/opening-hours-slot.dto.js +0 -2
  98. package/dist/patients/patient-procedure.dto.d.ts +0 -9
  99. package/dist/patients/patient-procedure.dto.d.ts.map +0 -1
  100. package/dist/patients/patient-procedure.dto.js +0 -79
  101. package/dist/patients/update-patient-procedure.dto.d.ts +0 -6
  102. package/dist/patients/update-patient-procedure.dto.d.ts.map +0 -1
  103. package/dist/patients/update-patient-procedure.dto.js +0 -8
  104. package/dist/payments/payment.dto.d.ts +0 -15
  105. package/dist/payments/payment.dto.d.ts.map +0 -1
  106. package/dist/payments/payment.dto.js +0 -2
  107. package/dist/tenants/create-tenant.dto.d.ts +0 -10
  108. package/dist/tenants/create-tenant.dto.d.ts.map +0 -1
  109. package/dist/tenants/create-tenant.dto.js +0 -73
  110. package/dist/tenants/tenant-slug.util.spec.d.ts +0 -2
  111. package/dist/tenants/tenant-slug.util.spec.d.ts.map +0 -1
  112. package/dist/tenants/tenant-slug.util.spec.js +0 -102
  113. package/dist/tenants/update-tenant-payload.dto.d.ts +0 -6
  114. package/dist/tenants/update-tenant-payload.dto.d.ts.map +0 -1
  115. package/dist/tenants/update-tenant-payload.dto.js +0 -25
  116. package/dist/tenants/update-tenant.dto.d.ts +0 -10
  117. package/dist/tenants/update-tenant.dto.d.ts.map +0 -1
  118. package/dist/tenants/update-tenant.dto.js +0 -78
package/README.md CHANGED
@@ -1,33 +1,33 @@
1
- # tychat-contracts-dtos
2
-
3
- DTOs compartilhados com **class-validator** usados pela **tychat-api** e pelos microserviços (ex.: **tychat-tenant-service**).
4
-
5
- ## Estrutura
6
-
7
- - **auth**: `LoginDto`, `RefreshTokenDto`, `RequestPasswordResetDto`, `ConfirmPasswordResetDto`, `AuthLoginResponseDto`, payloads Kafka (`LoginPayload`, `RequestPasswordResetPayload`, etc.)
8
- - **users**: `CreateUserDto` (sem password para criação por admin), `UserListItemDto`, `UpdateSelfUserDto` (apenas **name**), `UpdateUserByAdminDto` (name/email/role; regras de e-mail na API/auth-service), `UpdatedUserDto`, `ChangeForcePasswordDto`
9
- - **professionals**: `ProfessionalProfileDto`, `UpdateProfessionalProfileDto`, `CreateProfessionalWithProfileDto`
10
- - **notifications**: payloads Kafka para notificações de e-mail (`NotificationUserCreatedEventPayload`, `NotificationPasswordResetRequestedEventPayload`)
11
-
12
- ## Uso
13
-
14
- ```bash
15
- # Build (gera dist/)
16
- npm run build
17
- ```
18
-
19
- Nos projetos que consomem (tychat-api, tychat-tenant-service, etc.):
20
-
21
- ```json
22
- "dependencies": {
23
- "tychat-contracts": "^1.0.58"
24
- }
25
- ```
26
-
27
- ```ts
28
- import { LoginDto } from 'tychat-contracts';
29
- ```
30
-
31
- ## Desenvolvimento
32
-
33
- Após alterar os DTOs, rode `npm run build`, publique no registry e atualize os consumidores para a mesma versão.
1
+ # tychat-contracts-dtos
2
+
3
+ DTOs compartilhados com **class-validator** usados pela **tychat-api** e pelos microserviços (ex.: **tychat-tenant-service**).
4
+
5
+ ## Estrutura
6
+
7
+ - **auth**: `LoginDto`, `RefreshTokenDto`, `RequestPasswordResetDto`, `ConfirmPasswordResetDto`, `AuthLoginResponseDto`, payloads Kafka (`LoginPayload`, `RequestPasswordResetPayload`, etc.)
8
+ - **users**: `CreateUserDto` (sem password para criação por admin), `UserListItemDto`, `UpdateSelfUserDto` (apenas **name**), `UpdateUserByAdminDto` (name/email/role; regras de e-mail na API/auth-service), `UpdatedUserDto`, `ChangeForcePasswordDto`
9
+ - **professionals**: `ProfessionalProfileDto`, `UpdateProfessionalProfileDto`, `CreateProfessionalWithProfileDto`
10
+ - **notifications**: payloads Kafka para notificações de e-mail (`NotificationUserCreatedEventPayload`, `NotificationPasswordResetRequestedEventPayload`)
11
+
12
+ ## Uso
13
+
14
+ ```bash
15
+ # Build (gera dist/)
16
+ npm run build
17
+ ```
18
+
19
+ Nos projetos que consomem (tychat-api, tychat-tenant-service, etc.):
20
+
21
+ ```json
22
+ "dependencies": {
23
+ "tychat-contracts": "^1.0.58"
24
+ }
25
+ ```
26
+
27
+ ```ts
28
+ import { LoginDto } from 'tychat-contracts';
29
+ ```
30
+
31
+ ## Desenvolvimento
32
+
33
+ Após alterar os DTOs, rode `npm run build`, publique no registry e atualize os consumidores para a mesma versão.
@@ -0,0 +1,9 @@
1
+ /** RMQ: serviço interno pede remoção de objeto validando escopo por tenant. */
2
+ export declare class DeleteObjectRpcDto {
3
+ tenantSlug: string;
4
+ objectKey: string;
5
+ }
6
+ export declare class DeleteObjectRpcResultDto {
7
+ ok: true;
8
+ }
9
+ //# sourceMappingURL=delete-object-rpc.dto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-object-rpc.dto.d.ts","sourceRoot":"","sources":["../../src/storage/delete-object-rpc.dto.ts"],"names":[],"mappings":"AAGA,+EAA+E;AAC/E,qBAAa,kBAAkB;IAQ7B,UAAU,EAAE,MAAM,CAAC;IASnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,wBAAwB;IAEnC,EAAE,EAAE,IAAI,CAAC;CACV"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.DeleteObjectRpcResultDto = exports.DeleteObjectRpcDto = void 0;
13
+ const swagger_1 = require("@nestjs/swagger");
14
+ const class_validator_1 = require("class-validator");
15
+ /** RMQ: serviço interno pede remoção de objeto validando escopo por tenant. */
16
+ class DeleteObjectRpcDto {
17
+ tenantSlug;
18
+ objectKey;
19
+ }
20
+ exports.DeleteObjectRpcDto = DeleteObjectRpcDto;
21
+ __decorate([
22
+ (0, swagger_1.ApiProperty)({
23
+ description: 'Tenant slug (deve corresponder ao prefixo do objectKey)',
24
+ example: 'clinica_sampaio',
25
+ }),
26
+ (0, class_validator_1.IsString)(),
27
+ (0, class_validator_1.MinLength)(1),
28
+ (0, class_validator_1.MaxLength)(255),
29
+ __metadata("design:type", String)
30
+ ], DeleteObjectRpcDto.prototype, "tenantSlug", void 0);
31
+ __decorate([
32
+ (0, swagger_1.ApiProperty)({
33
+ description: 'Chave S3 do objeto',
34
+ example: 'tenants/clinica_sampaio/patients/.../doc.pdf',
35
+ }),
36
+ (0, class_validator_1.IsString)(),
37
+ (0, class_validator_1.MinLength)(1),
38
+ (0, class_validator_1.MaxLength)(2048),
39
+ __metadata("design:type", String)
40
+ ], DeleteObjectRpcDto.prototype, "objectKey", void 0);
41
+ class DeleteObjectRpcResultDto {
42
+ ok;
43
+ }
44
+ exports.DeleteObjectRpcResultDto = DeleteObjectRpcResultDto;
45
+ __decorate([
46
+ (0, swagger_1.ApiProperty)({ description: 'Confirmação da remoção' }),
47
+ __metadata("design:type", Boolean)
48
+ ], DeleteObjectRpcResultDto.prototype, "ok", void 0);
@@ -5,5 +5,6 @@ export * from './presigned-url-response.dto';
5
5
  export * from './exists-query.dto';
6
6
  export * from './issue-upload-token.dto';
7
7
  export * from './presign-download-rpc.dto';
8
+ export * from './delete-object-rpc.dto';
8
9
  export * from './storage-rmq-patterns';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC"}
@@ -21,4 +21,5 @@ __exportStar(require("./presigned-url-response.dto"), exports);
21
21
  __exportStar(require("./exists-query.dto"), exports);
22
22
  __exportStar(require("./issue-upload-token.dto"), exports);
23
23
  __exportStar(require("./presign-download-rpc.dto"), exports);
24
+ __exportStar(require("./delete-object-rpc.dto"), exports);
24
25
  __exportStar(require("./storage-rmq-patterns"), exports);
@@ -2,4 +2,6 @@
2
2
  export declare const STORAGE_ISSUE_UPLOAD_TOKEN = "storage.issueUploadToken";
3
3
  /** URL presigned GET (chamada interna; sem JWT HTTP para o storage) */
4
4
  export declare const STORAGE_PRESIGN_DOWNLOAD = "storage.presignDownload";
5
+ /** Delete object via RMQ (chamada interna; sem JWT HTTP para o storage) */
6
+ export declare const STORAGE_DELETE_OBJECT = "storage.deleteObject";
5
7
  //# sourceMappingURL=storage-rmq-patterns.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage-rmq-patterns.d.ts","sourceRoot":"","sources":["../../src/storage/storage-rmq-patterns.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,eAAO,MAAM,0BAA0B,6BAA6B,CAAC;AAErE,uEAAuE;AACvE,eAAO,MAAM,wBAAwB,4BAA4B,CAAC"}
1
+ {"version":3,"file":"storage-rmq-patterns.d.ts","sourceRoot":"","sources":["../../src/storage/storage-rmq-patterns.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,eAAO,MAAM,0BAA0B,6BAA6B,CAAC;AAErE,uEAAuE;AACvE,eAAO,MAAM,wBAAwB,4BAA4B,CAAC;AAElE,2EAA2E;AAC3E,eAAO,MAAM,qBAAqB,yBAAyB,CAAC"}
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.STORAGE_PRESIGN_DOWNLOAD = exports.STORAGE_ISSUE_UPLOAD_TOKEN = void 0;
3
+ exports.STORAGE_DELETE_OBJECT = exports.STORAGE_PRESIGN_DOWNLOAD = exports.STORAGE_ISSUE_UPLOAD_TOKEN = void 0;
4
4
  /** Pedido de token OTT para HTTP POST /storage/presign-upload */
5
5
  exports.STORAGE_ISSUE_UPLOAD_TOKEN = 'storage.issueUploadToken';
6
6
  /** URL presigned GET (chamada interna; sem JWT HTTP para o storage) */
7
7
  exports.STORAGE_PRESIGN_DOWNLOAD = 'storage.presignDownload';
8
+ /** Delete object via RMQ (chamada interna; sem JWT HTTP para o storage) */
9
+ exports.STORAGE_DELETE_OBJECT = 'storage.deleteObject';
package/jest.config.ts CHANGED
@@ -1,5 +1,5 @@
1
- export default {
2
- preset: 'ts-jest',
3
- testEnvironment: 'node',
4
- roots: ['<rootDir>/src'],
5
- };
1
+ export default {
2
+ preset: 'ts-jest',
3
+ testEnvironment: 'node',
4
+ roots: ['<rootDir>/src'],
5
+ };
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "tychat-contracts",
3
- "version": "1.6.21",
3
+ "version": "1.6.24",
4
4
  "description": "DTOs compartilhados com class-validator (API e microserviços)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "private": false,
8
8
  "scripts": {
9
9
  "build": "tsc",
10
+ "release": "npm version patch && npm publish",
10
11
  "prepublishOnly": "npm run build"
11
12
  },
12
13
  "dependencies": {
@@ -1,47 +1,47 @@
1
- import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
2
- import { IsNotEmpty, IsOptional, IsString } from 'class-validator';
3
- import { AiIntegrationDto } from './integration-provider.dto';
4
-
5
- /**
6
- * Represents a persisted AI token-usage record returned by the API.
7
- */
8
- export class AiUsageResponseDto {
9
- @ApiProperty({ description: 'AI usage record UUID', example: 'a1b2c3d4-...' })
10
- @IsString()
11
- @IsNotEmpty()
12
- id: string;
13
-
14
- @ApiProperty({ description: 'Tenant slug', example: 'clinic-alpha' })
15
- @IsString()
16
- @IsNotEmpty()
17
- tenant: string;
18
-
19
- @ApiPropertyOptional({ description: 'Tenant unit id', example: 1 })
20
- @IsOptional()
21
- unitId?: number;
22
-
23
- @ApiProperty({ description: 'AI integration used', example: 'OPENAI' })
24
- integration: AiIntegrationDto;
25
-
26
- @ApiProperty({ description: 'Model name', example: 'gpt-4.1-mini' })
27
- @IsString()
28
- @IsNotEmpty()
29
- model: string;
30
-
31
- @ApiProperty({ description: 'Number of prompt tokens consumed', example: 120 })
32
- promptTokens: number;
33
-
34
- @ApiProperty({ description: 'Number of completion tokens generated', example: 60 })
35
- completionTokens: number;
36
-
37
- @ApiProperty({ description: 'Total tokens (prompt + completion)', example: 180 })
38
- totalTokens: number;
39
-
40
- @ApiProperty({
41
- description: 'Creation timestamp (ISO 8601)',
42
- example: '2024-01-01T00:00:00.000Z',
43
- })
44
- @IsString()
45
- @IsNotEmpty()
46
- createdAt: string;
47
- }
1
+ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
2
+ import { IsNotEmpty, IsOptional, IsString } from 'class-validator';
3
+ import { AiIntegrationDto } from './integration-provider.dto';
4
+
5
+ /**
6
+ * Represents a persisted AI token-usage record returned by the API.
7
+ */
8
+ export class AiUsageResponseDto {
9
+ @ApiProperty({ description: 'AI usage record UUID', example: 'a1b2c3d4-...' })
10
+ @IsString()
11
+ @IsNotEmpty()
12
+ id: string;
13
+
14
+ @ApiProperty({ description: 'Tenant slug', example: 'clinic-alpha' })
15
+ @IsString()
16
+ @IsNotEmpty()
17
+ tenant: string;
18
+
19
+ @ApiPropertyOptional({ description: 'Tenant unit id', example: 1 })
20
+ @IsOptional()
21
+ unitId?: number;
22
+
23
+ @ApiProperty({ description: 'AI integration used', example: 'OPENAI' })
24
+ integration: AiIntegrationDto;
25
+
26
+ @ApiProperty({ description: 'Model name', example: 'gpt-4.1-mini' })
27
+ @IsString()
28
+ @IsNotEmpty()
29
+ model: string;
30
+
31
+ @ApiProperty({ description: 'Number of prompt tokens consumed', example: 120 })
32
+ promptTokens: number;
33
+
34
+ @ApiProperty({ description: 'Number of completion tokens generated', example: 60 })
35
+ completionTokens: number;
36
+
37
+ @ApiProperty({ description: 'Total tokens (prompt + completion)', example: 180 })
38
+ totalTokens: number;
39
+
40
+ @ApiProperty({
41
+ description: 'Creation timestamp (ISO 8601)',
42
+ example: '2024-01-01T00:00:00.000Z',
43
+ })
44
+ @IsString()
45
+ @IsNotEmpty()
46
+ createdAt: string;
47
+ }
@@ -1,43 +1,43 @@
1
- import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
2
- import { IsEnum, IsInt, IsNotEmpty, IsOptional, IsString, Min } from 'class-validator';
3
- import { AI_INTEGRATIONS, AiIntegrationDto } from './integration-provider.dto';
4
-
5
- /**
6
- * Payload used to persist an AI token-usage record after a generation call.
7
- */
8
- export class CreateAiUsageDto {
9
- @ApiProperty({ description: 'Tenant slug', example: 'clinic-alpha' })
10
- @IsString()
11
- @IsNotEmpty()
12
- tenant: string;
13
-
14
- @ApiPropertyOptional({ description: 'Tenant unit id', example: 1 })
15
- @IsOptional()
16
- @IsInt()
17
- @Min(1)
18
- unitId?: number;
19
-
20
- @ApiProperty({ description: 'AI integration used', enum: AI_INTEGRATIONS })
21
- @IsEnum(AI_INTEGRATIONS)
22
- integration: AiIntegrationDto;
23
-
24
- @ApiProperty({ description: 'Model name used for generation', example: 'gpt-4.1-mini' })
25
- @IsString()
26
- @IsNotEmpty()
27
- model: string;
28
-
29
- @ApiProperty({ description: 'Number of prompt tokens consumed', example: 120 })
30
- @IsInt()
31
- @Min(0)
32
- promptTokens: number;
33
-
34
- @ApiProperty({ description: 'Number of completion tokens generated', example: 60 })
35
- @IsInt()
36
- @Min(0)
37
- completionTokens: number;
38
-
39
- @ApiProperty({ description: 'Total tokens (prompt + completion)', example: 180 })
40
- @IsInt()
41
- @Min(0)
42
- totalTokens: number;
43
- }
1
+ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
2
+ import { IsEnum, IsInt, IsNotEmpty, IsOptional, IsString, Min } from 'class-validator';
3
+ import { AI_INTEGRATIONS, AiIntegrationDto } from './integration-provider.dto';
4
+
5
+ /**
6
+ * Payload used to persist an AI token-usage record after a generation call.
7
+ */
8
+ export class CreateAiUsageDto {
9
+ @ApiProperty({ description: 'Tenant slug', example: 'clinic-alpha' })
10
+ @IsString()
11
+ @IsNotEmpty()
12
+ tenant: string;
13
+
14
+ @ApiPropertyOptional({ description: 'Tenant unit id', example: 1 })
15
+ @IsOptional()
16
+ @IsInt()
17
+ @Min(1)
18
+ unitId?: number;
19
+
20
+ @ApiProperty({ description: 'AI integration used', enum: AI_INTEGRATIONS })
21
+ @IsEnum(AI_INTEGRATIONS)
22
+ integration: AiIntegrationDto;
23
+
24
+ @ApiProperty({ description: 'Model name used for generation', example: 'gpt-4.1-mini' })
25
+ @IsString()
26
+ @IsNotEmpty()
27
+ model: string;
28
+
29
+ @ApiProperty({ description: 'Number of prompt tokens consumed', example: 120 })
30
+ @IsInt()
31
+ @Min(0)
32
+ promptTokens: number;
33
+
34
+ @ApiProperty({ description: 'Number of completion tokens generated', example: 60 })
35
+ @IsInt()
36
+ @Min(0)
37
+ completionTokens: number;
38
+
39
+ @ApiProperty({ description: 'Total tokens (prompt + completion)', example: 180 })
40
+ @IsInt()
41
+ @Min(0)
42
+ totalTokens: number;
43
+ }
@@ -1,54 +1,54 @@
1
- import { randomUUID } from 'crypto';
2
- import { EventAnalyticType } from './event-analytic.enum';
3
- import { CreateAnalyticEventDto } from './create-analytic-event.dto';
4
- import { TOPIC_ANALYTICS_EVENT } from './analytics-kafka-topics';
5
-
6
- /**
7
- * Options for building an analytic event payload.
8
- */
9
- export interface EmitAnalyticEventOptions {
10
- tenant: string;
11
- eventType: EventAnalyticType;
12
- entityId?: string;
13
- userId?: string;
14
- metadata?: Record<string, unknown>;
15
- }
16
-
17
- /**
18
- * Builds the Kafka payload to be sent to the analytics service.
19
- *
20
- * Usage (fire-and-forget via ClientProxy.emit):
21
- * ```ts
22
- * this.analyticsClient.emit(
23
- * TOPIC_ANALYTICS_EVENT,
24
- * buildAnalyticEventPayload({
25
- * tenant,
26
- * eventType: 'patient.created',
27
- * entityId: patient.id,
28
- * source: 'tychat-patient-service',
29
- * }),
30
- * );
31
- * ```
32
- */
33
- export function buildAnalyticEventPayload(
34
- options: EmitAnalyticEventOptions & { source: string },
35
- ): { tenant: string; payload: CreateAnalyticEventDto } {
36
- return {
37
- tenant: options.tenant,
38
- payload: {
39
- eventId: randomUUID(),
40
- tenant: options.tenant,
41
- eventType: options.eventType,
42
- entityId: options.entityId,
43
- source: options.source,
44
- userId: options.userId,
45
- metadata: options.metadata,
46
- occurredAt: new Date().toISOString(),
47
- },
48
- };
49
- }
50
-
51
- /**
52
- * Re-export for convenience so services only need one import.
53
- */
54
- export { TOPIC_ANALYTICS_EVENT };
1
+ import { randomUUID } from 'crypto';
2
+ import { EventAnalyticType } from './event-analytic.enum';
3
+ import { CreateAnalyticEventDto } from './create-analytic-event.dto';
4
+ import { TOPIC_ANALYTICS_EVENT } from './analytics-kafka-topics';
5
+
6
+ /**
7
+ * Options for building an analytic event payload.
8
+ */
9
+ export interface EmitAnalyticEventOptions {
10
+ tenant: string;
11
+ eventType: EventAnalyticType;
12
+ entityId?: string;
13
+ userId?: string;
14
+ metadata?: Record<string, unknown>;
15
+ }
16
+
17
+ /**
18
+ * Builds the Kafka payload to be sent to the analytics service.
19
+ *
20
+ * Usage (fire-and-forget via ClientProxy.emit):
21
+ * ```ts
22
+ * this.analyticsClient.emit(
23
+ * TOPIC_ANALYTICS_EVENT,
24
+ * buildAnalyticEventPayload({
25
+ * tenant,
26
+ * eventType: 'patient.created',
27
+ * entityId: patient.id,
28
+ * source: 'tychat-patient-service',
29
+ * }),
30
+ * );
31
+ * ```
32
+ */
33
+ export function buildAnalyticEventPayload(
34
+ options: EmitAnalyticEventOptions & { source: string },
35
+ ): { tenant: string; payload: CreateAnalyticEventDto } {
36
+ return {
37
+ tenant: options.tenant,
38
+ payload: {
39
+ eventId: randomUUID(),
40
+ tenant: options.tenant,
41
+ eventType: options.eventType,
42
+ entityId: options.entityId,
43
+ source: options.source,
44
+ userId: options.userId,
45
+ metadata: options.metadata,
46
+ occurredAt: new Date().toISOString(),
47
+ },
48
+ };
49
+ }
50
+
51
+ /**
52
+ * Re-export for convenience so services only need one import.
53
+ */
54
+ export { TOPIC_ANALYTICS_EVENT };