@owox/backend 0.0.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 (107) hide show
  1. package/README.md +144 -0
  2. package/dist/app.module.js +39 -0
  3. package/dist/common/authorization-context/authorization.context.js +21 -0
  4. package/dist/common/common.module.js +21 -0
  5. package/dist/common/exceptions/access-validation.exception.js +15 -0
  6. package/dist/common/exceptions/base-exception.filter.js +30 -0
  7. package/dist/common/exceptions/base.exception.js +3 -0
  8. package/dist/common/exceptions/business-violation.exception.js +14 -0
  9. package/dist/common/resolver/type-resolver.js +33 -0
  10. package/dist/common/resolver/typed-component.resolver.js +3 -0
  11. package/dist/common/scheduler/facades/scheduler-facade.impl.js +55 -0
  12. package/dist/common/scheduler/scheduler.module.js +32 -0
  13. package/dist/common/scheduler/services/fetchers/time-based-trigger-fetcher.factory.js +24 -0
  14. package/dist/common/scheduler/services/fetchers/time-based-trigger-fetcher.service.js +82 -0
  15. package/dist/common/scheduler/services/graceful-shutdown.service.js +96 -0
  16. package/dist/common/scheduler/services/runners/abstract-trigger-runner.service.js +82 -0
  17. package/dist/common/scheduler/services/runners/direct-trigger-runner.service.js +14 -0
  18. package/dist/common/scheduler/services/runners/pubsub-trigger-runner.service.js +145 -0
  19. package/dist/common/scheduler/services/runners/trigger-runner.factory.js +87 -0
  20. package/dist/common/scheduler/services/runners/trigger-runner.interface.js +3 -0
  21. package/dist/common/scheduler/services/system-time.service.js +20 -0
  22. package/dist/common/scheduler/shared/entities/scheduled-trigger.entity.js +47 -0
  23. package/dist/common/scheduler/shared/entities/time-based-trigger.entity.js +72 -0
  24. package/dist/common/scheduler/shared/scheduler.facade.js +5 -0
  25. package/dist/common/scheduler/shared/time-based-trigger-handler.interface.js +3 -0
  26. package/dist/config/database.config.js +31 -0
  27. package/dist/config/express-static.config.js +33 -0
  28. package/dist/config/global-pipes.config.js +12 -0
  29. package/dist/config/swagger.config.js +16 -0
  30. package/dist/data-marts/controllers/data-mart.controller.js +182 -0
  31. package/dist/data-marts/controllers/data-storage.controller.js +124 -0
  32. package/dist/data-marts/controllers/spec/data-mart.api.js +43 -0
  33. package/dist/data-marts/controllers/spec/data-storage.api.js +29 -0
  34. package/dist/data-marts/data-marts.module.js +65 -0
  35. package/dist/data-marts/data-storage-types/athena/schemas/athena-config.schema.js +10 -0
  36. package/dist/data-marts/data-storage-types/athena/schemas/athena-credentials.schema.js +12 -0
  37. package/dist/data-marts/data-storage-types/athena/services/athena-access.validator.js +39 -0
  38. package/dist/data-marts/data-storage-types/athena/services/athena-title.generator.js +24 -0
  39. package/dist/data-marts/data-storage-types/bigquery/schemas/bigquery-config.schema.js +9 -0
  40. package/dist/data-marts/data-storage-types/bigquery/schemas/bigquery-credentials.schema.js +11 -0
  41. package/dist/data-marts/data-storage-types/bigquery/services/bigquery-access.validator.js +39 -0
  42. package/dist/data-marts/data-storage-types/bigquery/services/bigquery-title.generator.js +24 -0
  43. package/dist/data-marts/data-storage-types/data-storage-config.type.js +3 -0
  44. package/dist/data-marts/data-storage-types/data-storage-facades.js +7 -0
  45. package/dist/data-marts/data-storage-types/data-storage-providers.js +27 -0
  46. package/dist/data-marts/data-storage-types/enums/data-storage-type.enum.js +20 -0
  47. package/dist/data-marts/data-storage-types/facades/data-storage-access.facade.js +38 -0
  48. package/dist/data-marts/data-storage-types/facades/data-storage-title.facade.js +38 -0
  49. package/dist/data-marts/data-storage-types/interfaces/data-storage-access-validator.interface.js +15 -0
  50. package/dist/data-marts/data-storage-types/interfaces/data-storage-title-generator.interface.js +3 -0
  51. package/dist/data-marts/dto/domain/create-data-mart.command.js +17 -0
  52. package/dist/data-marts/dto/domain/create-data-storage.command.js +13 -0
  53. package/dist/data-marts/dto/domain/data-mart.dto.js +27 -0
  54. package/dist/data-marts/dto/domain/data-storage.dto.js +25 -0
  55. package/dist/data-marts/dto/domain/delete-data-mart.command.js +15 -0
  56. package/dist/data-marts/dto/domain/delete-data-storage.command.js +13 -0
  57. package/dist/data-marts/dto/domain/get-data-mart.command.js +15 -0
  58. package/dist/data-marts/dto/domain/get-data-storage.command.js +13 -0
  59. package/dist/data-marts/dto/domain/list-data-marts.command.js +13 -0
  60. package/dist/data-marts/dto/domain/list-data-storages.command.js +11 -0
  61. package/dist/data-marts/dto/domain/publish-data-mart.command.js +15 -0
  62. package/dist/data-marts/dto/domain/update-data-mart-definition.command.js +19 -0
  63. package/dist/data-marts/dto/domain/update-data-mart-description.command.js +17 -0
  64. package/dist/data-marts/dto/domain/update-data-mart-title.command.js +17 -0
  65. package/dist/data-marts/dto/domain/update-data-storage.command.js +19 -0
  66. package/dist/data-marts/dto/presentation/create-data-mart-request-api.dto.js +32 -0
  67. package/dist/data-marts/dto/presentation/create-data-mart-response-api.dto.js +27 -0
  68. package/dist/data-marts/dto/presentation/create-data-storage-api.dto.js +25 -0
  69. package/dist/data-marts/dto/presentation/data-mart-response-api.dto.js +65 -0
  70. package/dist/data-marts/dto/presentation/data-storage-list-response-api.dto.js +43 -0
  71. package/dist/data-marts/dto/presentation/data-storage-response-api.dto.js +64 -0
  72. package/dist/data-marts/dto/presentation/update-data-mart-definition-api.dto.js +31 -0
  73. package/dist/data-marts/dto/presentation/update-data-mart-description-api.dto.js +27 -0
  74. package/dist/data-marts/dto/presentation/update-data-mart-title-api.dto.js +25 -0
  75. package/dist/data-marts/dto/presentation/update-data-storage-api.dto.js +50 -0
  76. package/dist/data-marts/dto/schemas/data-mart-table-definitions/data-mart-definition.js +3 -0
  77. package/dist/data-marts/dto/schemas/data-mart-table-definitions/sql-definition.schema.js +8 -0
  78. package/dist/data-marts/dto/schemas/data-mart-table-definitions/table-definition.schema.js +8 -0
  79. package/dist/data-marts/dto/schemas/data-mart-table-definitions/table-pattern-definition.schema.js +8 -0
  80. package/dist/data-marts/dto/schemas/data-mart-table-definitions/view-definition.schema.js +8 -0
  81. package/dist/data-marts/entities/data-mart.entity.js +84 -0
  82. package/dist/data-marts/entities/data-storage.entity.js +66 -0
  83. package/dist/data-marts/enums/data-mart-definition-type.enum.js +11 -0
  84. package/dist/data-marts/enums/data-mart-status.enum.js +9 -0
  85. package/dist/data-marts/mappers/data-mart.mapper.js +87 -0
  86. package/dist/data-marts/mappers/data-storage.mapper.js +75 -0
  87. package/dist/data-marts/services/data-mart.service.js +44 -0
  88. package/dist/data-marts/services/data-storage.service.js +39 -0
  89. package/dist/data-marts/use-cases/create-data-mart.service.js +51 -0
  90. package/dist/data-marts/use-cases/create-data-storage.service.js +44 -0
  91. package/dist/data-marts/use-cases/delete-data-mart.service.js +39 -0
  92. package/dist/data-marts/use-cases/delete-data-storage.service.js +52 -0
  93. package/dist/data-marts/use-cases/get-data-mart.service.js +34 -0
  94. package/dist/data-marts/use-cases/get-data-storage.service.js +34 -0
  95. package/dist/data-marts/use-cases/list-data-marts.service.js +42 -0
  96. package/dist/data-marts/use-cases/list-data-storages.service.js +42 -0
  97. package/dist/data-marts/use-cases/publish-data-mart.service.js +54 -0
  98. package/dist/data-marts/use-cases/update-data-mart-definition.service.js +51 -0
  99. package/dist/data-marts/use-cases/update-data-mart-description.service.js +46 -0
  100. package/dist/data-marts/use-cases/update-data-mart-title.service.js +46 -0
  101. package/dist/data-marts/use-cases/update-data-storage.service.js +53 -0
  102. package/dist/main.js +33 -0
  103. package/dist/public/assets/index-BZJIHZWS.js +502 -0
  104. package/dist/public/assets/index-BpZgB8Pl.css +1 -0
  105. package/dist/public/favicon.png +0 -0
  106. package/dist/public/index.html +14 -0
  107. package/package.json +106 -0
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractTriggerRunnerService = void 0;
4
+ const time_based_trigger_entity_1 = require("../../shared/entities/time-based-trigger.entity");
5
+ const common_1 = require("@nestjs/common");
6
+ const typeorm_1 = require("typeorm");
7
+ class AbstractTriggerRunnerService {
8
+ handler;
9
+ systemClock;
10
+ shutdownService;
11
+ logger = new common_1.Logger(this.constructor.name);
12
+ handlerName;
13
+ constructor(handler, systemClock, shutdownService) {
14
+ this.handler = handler;
15
+ this.systemClock = systemClock;
16
+ this.shutdownService = shutdownService;
17
+ this.handlerName = this.handler.constructor.name;
18
+ }
19
+ async runTriggers(triggers) {
20
+ if (triggers.length === 0) {
21
+ this.logger.debug(`[${this.handlerName}] No triggers found for processing`);
22
+ return;
23
+ }
24
+ this.logger.debug(`[${this.handlerName}] Processing ${triggers.length} triggers`);
25
+ await this.processTriggers(triggers);
26
+ }
27
+ async processTriggerSafely(trigger) {
28
+ const repository = this.handler.getTriggerRepository();
29
+ let processId = null;
30
+ if (this.shutdownService.isInShutdownMode()) {
31
+ const shutdownError = new Error(`Cannot process trigger ${trigger.id}: Application is shutting down`);
32
+ this.logger.warn(`[${this.handlerName}] ${shutdownError.message}`);
33
+ throw shutdownError;
34
+ }
35
+ try {
36
+ processId = this.shutdownService.registerActiveProcess(`${this.handlerName}-trigger-${trigger.id}`);
37
+ await this.updateTriggerStatus(trigger, time_based_trigger_entity_1.TriggerStatus.PROCESSING, repository);
38
+ await this.executeTrigger(trigger, repository);
39
+ this.logger.debug(`[${this.handlerName}] Successfully processed trigger: ${trigger.id}`);
40
+ }
41
+ catch (error) {
42
+ await this.handleTriggerError(error, trigger, repository);
43
+ }
44
+ finally {
45
+ if (processId) {
46
+ this.shutdownService.unregisterActiveProcess(processId);
47
+ }
48
+ }
49
+ }
50
+ async executeTrigger(trigger, repository) {
51
+ await this.handler.handleTrigger(trigger);
52
+ trigger.onSuccess(this.systemClock.now());
53
+ await repository.save(trigger);
54
+ }
55
+ async handleTriggerError(error, trigger, repository) {
56
+ if (this.isOptimisticLockError(error)) {
57
+ this.logger.debug(`[${this.handlerName}] Optimistic lock conflict for trigger ${trigger.id}. Skipping as likely processed by another instance.`);
58
+ return;
59
+ }
60
+ this.logger.error(`[${this.handlerName}] Failed to process trigger ${trigger.id}:`, error);
61
+ try {
62
+ await this.markTriggerAsError(trigger, repository);
63
+ }
64
+ catch (secondaryError) {
65
+ this.logger.error(`[${this.handlerName}] Failed to mark trigger ${trigger.id} as error:`, secondaryError);
66
+ }
67
+ }
68
+ async updateTriggerStatus(trigger, status, repository) {
69
+ trigger.status = status;
70
+ await repository.save(trigger);
71
+ }
72
+ async markTriggerAsError(trigger, repository) {
73
+ trigger.onError(this.systemClock.now());
74
+ await repository.save(trigger);
75
+ }
76
+ isOptimisticLockError(error) {
77
+ return (error instanceof typeorm_1.QueryFailedError &&
78
+ (error.message.includes('version') || error.message.includes('optimistic lock')));
79
+ }
80
+ }
81
+ exports.AbstractTriggerRunnerService = AbstractTriggerRunnerService;
82
+ //# sourceMappingURL=abstract-trigger-runner.service.js.map
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DirectTriggerRunnerService = void 0;
4
+ const abstract_trigger_runner_service_1 = require("./abstract-trigger-runner.service");
5
+ class DirectTriggerRunnerService extends abstract_trigger_runner_service_1.AbstractTriggerRunnerService {
6
+ constructor(handler, systemClock, shutdownService) {
7
+ super(handler, systemClock, shutdownService);
8
+ }
9
+ async processTriggers(triggers) {
10
+ await Promise.all(triggers.map(trigger => this.processTriggerSafely(trigger)));
11
+ }
12
+ }
13
+ exports.DirectTriggerRunnerService = DirectTriggerRunnerService;
14
+ //# sourceMappingURL=direct-trigger-runner.service.js.map
@@ -0,0 +1,145 @@
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.PubsubTriggerRunnerService = void 0;
13
+ const pubsub_1 = require("@google-cloud/pubsub");
14
+ const common_1 = require("@nestjs/common");
15
+ const system_time_service_1 = require("../system-time.service");
16
+ const abstract_trigger_runner_service_1 = require("./abstract-trigger-runner.service");
17
+ const graceful_shutdown_service_1 = require("../graceful-shutdown.service");
18
+ let PubsubTriggerRunnerService = class PubsubTriggerRunnerService extends abstract_trigger_runner_service_1.AbstractTriggerRunnerService {
19
+ googleCloudProject;
20
+ pubSubClient;
21
+ topicName;
22
+ subscriptionName;
23
+ constructor(handler, systemClock, googleCloudProject, shutdownService) {
24
+ super(handler, systemClock, shutdownService);
25
+ this.googleCloudProject = googleCloudProject;
26
+ this.topicName = this.generateTopicName();
27
+ this.subscriptionName = this.generateSubscriptionName();
28
+ this.pubSubClient = this.createPubSubClient();
29
+ }
30
+ async initialize() {
31
+ await this.setupPubSubListener();
32
+ }
33
+ generateTopicName() {
34
+ return `owox-data-marts-${this.handlerName.toLowerCase()}-triggers`;
35
+ }
36
+ generateSubscriptionName() {
37
+ return `${this.topicName}-subscription`;
38
+ }
39
+ createPubSubClient() {
40
+ return new pubsub_1.PubSub({ projectId: this.googleCloudProject });
41
+ }
42
+ async setupPubSubListener() {
43
+ try {
44
+ await this.ensureTopicExists();
45
+ await this.ensureSubscriptionExists();
46
+ this.setupMessageHandlers();
47
+ this.logger.log('PubSub listener setup complete');
48
+ }
49
+ catch (error) {
50
+ this.logger.error('Error setting up PubSub listener:', error);
51
+ throw error;
52
+ }
53
+ }
54
+ async ensureTopicExists() {
55
+ const [topicExists] = await this.pubSubClient.topic(this.topicName).exists();
56
+ if (!topicExists) {
57
+ await this.pubSubClient.createTopic(this.topicName);
58
+ this.logger.log(`Created topic: ${this.topicName}`);
59
+ }
60
+ }
61
+ async ensureSubscriptionExists() {
62
+ const [subscriptionExists] = await this.pubSubClient
63
+ .topic(this.topicName)
64
+ .subscription(this.subscriptionName)
65
+ .exists();
66
+ if (!subscriptionExists) {
67
+ await this.pubSubClient.topic(this.topicName).createSubscription(this.subscriptionName);
68
+ this.logger.log(`Created subscription: ${this.subscriptionName}`);
69
+ }
70
+ }
71
+ setupMessageHandlers() {
72
+ const subscription = this.pubSubClient
73
+ .topic(this.topicName)
74
+ .subscription(this.subscriptionName);
75
+ subscription.on('message', this.handlePubSubMessage.bind(this));
76
+ subscription.on('error', this.handlePubSubError.bind(this));
77
+ }
78
+ async handlePubSubMessage(message) {
79
+ try {
80
+ const messageData = message.data.toString();
81
+ const payload = JSON.parse(messageData);
82
+ const triggerId = payload.id;
83
+ const messageVersion = payload.version;
84
+ this.logger.log(`Received message with trigger ID: ${triggerId}, version: ${messageVersion}`);
85
+ const trigger = await this.findTriggerById(triggerId);
86
+ if (!trigger) {
87
+ this.logger.error(`Trigger with ID ${triggerId} not found`);
88
+ }
89
+ else if (trigger.version !== messageVersion) {
90
+ this.logger.warn(`Skipping outdated message for trigger ${triggerId}: message version ${messageVersion}, current version ${trigger.version}`);
91
+ }
92
+ else {
93
+ await this.processTriggerSafely(trigger);
94
+ }
95
+ }
96
+ catch (error) {
97
+ this.logger.error('Error processing PubSub message:', error);
98
+ }
99
+ finally {
100
+ message.ack();
101
+ }
102
+ }
103
+ async findTriggerById(triggerId) {
104
+ const options = { where: { id: triggerId } };
105
+ return this.handler.getTriggerRepository().findOne(options);
106
+ }
107
+ handlePubSubError(error) {
108
+ this.logger.error('PubSub subscription error:', error);
109
+ }
110
+ async processTriggers(triggers) {
111
+ try {
112
+ const publishPromises = triggers.map(trigger => this.publishTriggerToPubSub(trigger));
113
+ await Promise.all(publishPromises);
114
+ this.logger.debug(`Successfully published ${triggers.length} triggers to PubSub`);
115
+ }
116
+ catch (error) {
117
+ this.logger.error('Error publishing triggers to PubSub:', error);
118
+ throw error;
119
+ }
120
+ }
121
+ async publishTriggerToPubSub(trigger) {
122
+ const payload = {
123
+ id: trigger.id,
124
+ version: trigger.version,
125
+ };
126
+ const dataBuffer = Buffer.from(JSON.stringify(payload));
127
+ try {
128
+ const messageId = await this.pubSubClient
129
+ .topic(this.topicName)
130
+ .publishMessage({ data: dataBuffer });
131
+ this.logger.debug(`Published message ${messageId} for trigger ${trigger.id} (version ${trigger.version})`);
132
+ return messageId;
133
+ }
134
+ catch (error) {
135
+ this.logger.error(`Error publishing trigger ${trigger.id}:`, error);
136
+ throw error;
137
+ }
138
+ }
139
+ };
140
+ exports.PubsubTriggerRunnerService = PubsubTriggerRunnerService;
141
+ exports.PubsubTriggerRunnerService = PubsubTriggerRunnerService = __decorate([
142
+ (0, common_1.Injectable)(),
143
+ __metadata("design:paramtypes", [Object, system_time_service_1.SystemTimeService, String, graceful_shutdown_service_1.GracefulShutdownService])
144
+ ], PubsubTriggerRunnerService);
145
+ //# sourceMappingURL=pubsub-trigger-runner.service.js.map
@@ -0,0 +1,87 @@
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
+ var TriggerRunnerFactory_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.TriggerRunnerFactory = exports.TriggerRunnerType = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const config_1 = require("@nestjs/config");
16
+ const direct_trigger_runner_service_1 = require("./direct-trigger-runner.service");
17
+ const pubsub_trigger_runner_service_1 = require("./pubsub-trigger-runner.service");
18
+ const graceful_shutdown_service_1 = require("../graceful-shutdown.service");
19
+ var TriggerRunnerType;
20
+ (function (TriggerRunnerType) {
21
+ TriggerRunnerType["DIRECT"] = "direct";
22
+ TriggerRunnerType["PUBSUB"] = "pubsub";
23
+ })(TriggerRunnerType || (exports.TriggerRunnerType = TriggerRunnerType = {}));
24
+ let TriggerRunnerFactory = TriggerRunnerFactory_1 = class TriggerRunnerFactory {
25
+ configService;
26
+ shutdownService;
27
+ logger = new common_1.Logger(TriggerRunnerFactory_1.name);
28
+ runnerTypes = new Map();
29
+ constructor(configService, shutdownService) {
30
+ this.configService = configService;
31
+ this.shutdownService = shutdownService;
32
+ this.registerDefaultRunnerTypes();
33
+ }
34
+ registerDefaultRunnerTypes() {
35
+ this.registerRunnerType(TriggerRunnerType.DIRECT, {
36
+ type: direct_trigger_runner_service_1.DirectTriggerRunnerService,
37
+ configFactory: () => ({}),
38
+ });
39
+ this.registerRunnerType(TriggerRunnerType.PUBSUB, {
40
+ type: pubsub_trigger_runner_service_1.PubsubTriggerRunnerService,
41
+ configFactory: (configService) => ({
42
+ projectId: configService.get('SCHEDULER_PUBSUB_PROJECT_ID'),
43
+ }),
44
+ });
45
+ }
46
+ registerRunnerType(type, options) {
47
+ this.runnerTypes.set(type, options);
48
+ this.logger.log(`Registered runner type: ${type}`);
49
+ }
50
+ stringToRunnerType(typeString) {
51
+ const enumValues = Object.values(TriggerRunnerType);
52
+ if (enumValues.includes(typeString)) {
53
+ return typeString;
54
+ }
55
+ this.logger.warn(`Invalid runner type string: ${typeString}, using default`);
56
+ return TriggerRunnerType.DIRECT;
57
+ }
58
+ async createRunner(triggerHandler, systemTimeService) {
59
+ const runnerTypeString = this.configService.get('SCHEDULER_TRIGGER_RUNNER_TYPE', TriggerRunnerType.DIRECT);
60
+ const runnerType = this.stringToRunnerType(runnerTypeString);
61
+ const runnerConfig = this.runnerTypes.get(runnerType);
62
+ if (!runnerConfig) {
63
+ this.logger.warn(`Unknown runner type: ${runnerType}, falling back to direct runner`);
64
+ return new direct_trigger_runner_service_1.DirectTriggerRunnerService(triggerHandler, systemTimeService, this.shutdownService);
65
+ }
66
+ const { type: RunnerClass, configFactory } = runnerConfig;
67
+ const config = configFactory(this.configService);
68
+ const runner = await this.createRunnerInstance(RunnerClass, triggerHandler, systemTimeService, config, this.shutdownService);
69
+ this.logger.log(`Created ${runnerType} trigger runner`);
70
+ return runner;
71
+ }
72
+ async createRunnerInstance(RunnerClass, triggerHandler, systemTimeService, config, shutdownService) {
73
+ if (RunnerClass === pubsub_trigger_runner_service_1.PubsubTriggerRunnerService) {
74
+ const pubSubRunner = new pubsub_trigger_runner_service_1.PubsubTriggerRunnerService(triggerHandler, systemTimeService, config.projectId, shutdownService);
75
+ await pubSubRunner.initialize();
76
+ return pubSubRunner;
77
+ }
78
+ return new direct_trigger_runner_service_1.DirectTriggerRunnerService(triggerHandler, systemTimeService, shutdownService);
79
+ }
80
+ };
81
+ exports.TriggerRunnerFactory = TriggerRunnerFactory;
82
+ exports.TriggerRunnerFactory = TriggerRunnerFactory = TriggerRunnerFactory_1 = __decorate([
83
+ (0, common_1.Injectable)(),
84
+ __metadata("design:paramtypes", [config_1.ConfigService,
85
+ graceful_shutdown_service_1.GracefulShutdownService])
86
+ ], TriggerRunnerFactory);
87
+ //# sourceMappingURL=trigger-runner.factory.js.map
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=trigger-runner.interface.js.map
@@ -0,0 +1,20 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SystemTimeService = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ let SystemTimeService = class SystemTimeService {
12
+ now() {
13
+ return new Date();
14
+ }
15
+ };
16
+ exports.SystemTimeService = SystemTimeService;
17
+ exports.SystemTimeService = SystemTimeService = __decorate([
18
+ (0, common_1.Injectable)()
19
+ ], SystemTimeService);
20
+ //# sourceMappingURL=system-time.service.js.map
@@ -0,0 +1,47 @@
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.ScheduledTrigger = void 0;
13
+ const time_based_trigger_entity_1 = require("./time-based-trigger.entity");
14
+ const typeorm_1 = require("typeorm");
15
+ const cron_1 = require("cron");
16
+ class ScheduledTrigger extends time_based_trigger_entity_1.TimeBasedTrigger {
17
+ cronExpression;
18
+ timeZone;
19
+ onSuccess(lastRunTimestamp) {
20
+ this.lastRunTimestamp = lastRunTimestamp;
21
+ this.scheduleNextRun(lastRunTimestamp);
22
+ }
23
+ onError(lastRunTimestamp) {
24
+ this.lastRunTimestamp = lastRunTimestamp;
25
+ this.scheduleNextRun(lastRunTimestamp);
26
+ }
27
+ scheduleNextRun(startFrom) {
28
+ const cronTime = new cron_1.CronTime(this.cronExpression, this.timeZone);
29
+ const nextRunTimestamp = cronTime.getNextDateFrom(startFrom).toJSDate();
30
+ if (nextRunTimestamp <= startFrom) {
31
+ throw new Error('Next run timestamp is in the past');
32
+ }
33
+ this.nextRunTimestamp = nextRunTimestamp;
34
+ this.isActive = true;
35
+ this.status = time_based_trigger_entity_1.TriggerStatus.IDLE;
36
+ }
37
+ }
38
+ exports.ScheduledTrigger = ScheduledTrigger;
39
+ __decorate([
40
+ (0, typeorm_1.Column)(),
41
+ __metadata("design:type", String)
42
+ ], ScheduledTrigger.prototype, "cronExpression", void 0);
43
+ __decorate([
44
+ (0, typeorm_1.Column)(),
45
+ __metadata("design:type", String)
46
+ ], ScheduledTrigger.prototype, "timeZone", void 0);
47
+ //# sourceMappingURL=scheduled-trigger.entity.js.map
@@ -0,0 +1,72 @@
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.TimeBasedTrigger = exports.TriggerStatus = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ var TriggerStatus;
15
+ (function (TriggerStatus) {
16
+ TriggerStatus["IDLE"] = "IDLE";
17
+ TriggerStatus["READY"] = "READY";
18
+ TriggerStatus["PROCESSING"] = "PROCESSING";
19
+ TriggerStatus["SUCCESS"] = "SUCCESS";
20
+ TriggerStatus["ERROR"] = "ERROR";
21
+ })(TriggerStatus || (exports.TriggerStatus = TriggerStatus = {}));
22
+ class TimeBasedTrigger {
23
+ id;
24
+ nextRunTimestamp;
25
+ lastRunTimestamp;
26
+ isActive;
27
+ version;
28
+ status;
29
+ onSuccess(lastRunTimestamp) {
30
+ this.lastRunTimestamp = lastRunTimestamp;
31
+ this.status = TriggerStatus.SUCCESS;
32
+ this.discardNextRun();
33
+ }
34
+ onError(lastRunTimestamp) {
35
+ this.lastRunTimestamp = lastRunTimestamp;
36
+ this.status = TriggerStatus.ERROR;
37
+ }
38
+ discardNextRun() {
39
+ this.nextRunTimestamp = null;
40
+ this.isActive = false;
41
+ }
42
+ }
43
+ exports.TimeBasedTrigger = TimeBasedTrigger;
44
+ __decorate([
45
+ (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
46
+ __metadata("design:type", String)
47
+ ], TimeBasedTrigger.prototype, "id", void 0);
48
+ __decorate([
49
+ (0, typeorm_1.Column)({ type: 'datetime', nullable: true }),
50
+ __metadata("design:type", Object)
51
+ ], TimeBasedTrigger.prototype, "nextRunTimestamp", void 0);
52
+ __decorate([
53
+ (0, typeorm_1.Column)({ type: 'datetime', nullable: true }),
54
+ __metadata("design:type", Object)
55
+ ], TimeBasedTrigger.prototype, "lastRunTimestamp", void 0);
56
+ __decorate([
57
+ (0, typeorm_1.Column)(),
58
+ __metadata("design:type", Boolean)
59
+ ], TimeBasedTrigger.prototype, "isActive", void 0);
60
+ __decorate([
61
+ (0, typeorm_1.VersionColumn)(),
62
+ __metadata("design:type", Number)
63
+ ], TimeBasedTrigger.prototype, "version", void 0);
64
+ __decorate([
65
+ (0, typeorm_1.Column)({
66
+ type: 'varchar',
67
+ enum: TriggerStatus,
68
+ default: TriggerStatus.IDLE,
69
+ }),
70
+ __metadata("design:type", String)
71
+ ], TimeBasedTrigger.prototype, "status", void 0);
72
+ //# sourceMappingURL=time-based-trigger.entity.js.map
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SCHEDULER_FACADE = void 0;
4
+ exports.SCHEDULER_FACADE = 'SCHEDULER_FACADE';
5
+ //# sourceMappingURL=scheduler.facade.js.map
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=time-based-trigger-handler.interface.js.map
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDatabaseConfig = getDatabaseConfig;
4
+ var DbType;
5
+ (function (DbType) {
6
+ DbType["sqlite"] = "sqlite";
7
+ DbType["mysql"] = "mysql";
8
+ })(DbType || (DbType = {}));
9
+ function getDatabaseConfig(config) {
10
+ const type = config.get('DB_TYPE', DbType.sqlite);
11
+ const dbConfigs = {
12
+ [DbType.sqlite]: {
13
+ type: DbType.sqlite,
14
+ database: config.get('DB_NAME', 'var/sqlite/backend.db'),
15
+ entities: [__dirname + '/../**/*.entity{.ts,.js}'],
16
+ synchronize: true,
17
+ },
18
+ [DbType.mysql]: {
19
+ type: DbType.mysql,
20
+ host: config.get('DB_HOST'),
21
+ port: config.get('DB_PORT'),
22
+ username: config.get('DB_USERNAME'),
23
+ password: config.get('DB_PASSWORD'),
24
+ database: config.get('DB_DATABASE'),
25
+ entities: [__dirname + '/../**/*.entity{.ts,.js}'],
26
+ synchronize: true,
27
+ },
28
+ };
29
+ return dbConfigs[type];
30
+ }
31
+ //# sourceMappingURL=database.config.js.map
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupStaticAssets = setupStaticAssets;
4
+ const common_1 = require("@nestjs/common");
5
+ const fs_1 = require("fs");
6
+ const path_1 = require("path");
7
+ function getWebDistPath() {
8
+ const logger = new common_1.Logger('StaticAssets');
9
+ const publishedPath = (0, path_1.join)(__dirname, '..', 'public');
10
+ const devPath = (0, path_1.join)(__dirname, '..', '..', '..', 'web', 'dist');
11
+ if ((0, fs_1.existsSync)(publishedPath)) {
12
+ logger.log(`Using published static assets: ${publishedPath}`);
13
+ return publishedPath;
14
+ }
15
+ if ((0, fs_1.existsSync)(devPath)) {
16
+ logger.log(`Using development static assets: ${devPath}`);
17
+ return devPath;
18
+ }
19
+ throw new Error(`Static assets not found. Checked:\n - ${publishedPath}\n - ${devPath}`);
20
+ }
21
+ function setupStaticAssets(app, pathPrefix) {
22
+ const distPath = getWebDistPath();
23
+ app.useStaticAssets(distPath);
24
+ app.use((req, res, next) => {
25
+ if (req.path.startsWith(`/${pathPrefix}`)) {
26
+ next();
27
+ }
28
+ else {
29
+ res.sendFile((0, path_1.join)(distPath, 'index.html'));
30
+ }
31
+ });
32
+ }
33
+ //# sourceMappingURL=express-static.config.js.map
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupGlobalPipes = setupGlobalPipes;
4
+ const common_1 = require("@nestjs/common");
5
+ function setupGlobalPipes(app) {
6
+ app.useGlobalPipes(new common_1.ValidationPipe({
7
+ whitelist: true,
8
+ forbidNonWhitelisted: true,
9
+ transform: true,
10
+ }));
11
+ }
12
+ //# sourceMappingURL=global-pipes.config.js.map
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupSwagger = setupSwagger;
4
+ const swagger_1 = require("@nestjs/swagger");
5
+ function setupSwagger(app, path) {
6
+ const config = new swagger_1.DocumentBuilder()
7
+ .setTitle('Backend API')
8
+ .setDescription('REST API used by frontend clients and service integrations.')
9
+ .setVersion('1.0')
10
+ .build();
11
+ const document = swagger_1.SwaggerModule.createDocument(app, config);
12
+ swagger_1.SwaggerModule.setup(path, app, document, {
13
+ useGlobalPrefix: false,
14
+ });
15
+ }
16
+ //# sourceMappingURL=swagger.config.js.map