@ttkit/daily-hot-api 0.1.3 → 0.1.5

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 (64) hide show
  1. package/.env.example +24 -0
  2. package/README.md +1 -0
  3. package/dist/app.module.js +2 -0
  4. package/dist/app.module.js.map +1 -1
  5. package/dist/config/validation.schema.d.ts +51 -0
  6. package/dist/config/validation.schema.js +69 -0
  7. package/dist/config/validation.schema.js.map +1 -1
  8. package/dist/daily-brief/clients/ai-analysis.client.d.ts +15 -6
  9. package/dist/daily-brief/clients/ai-analysis.client.js +103 -15
  10. package/dist/daily-brief/clients/ai-analysis.client.js.map +1 -1
  11. package/dist/daily-brief/daily-brief.module.js +1 -1
  12. package/dist/daily-brief/daily-brief.module.js.map +1 -1
  13. package/dist/daily-brief/daily-brief.service.js +1 -1
  14. package/dist/daily-brief/daily-brief.service.js.map +1 -1
  15. package/dist/database/database.module.js +15 -2
  16. package/dist/database/database.module.js.map +1 -1
  17. package/dist/database/repositories/daily-brief.repository.js +11 -1
  18. package/dist/database/repositories/daily-brief.repository.js.map +1 -1
  19. package/dist/database/repositories/hot-item.repository.d.ts +1 -1
  20. package/dist/database/repositories/hot-item.repository.js +7 -4
  21. package/dist/database/repositories/hot-item.repository.js.map +1 -1
  22. package/dist/database/repositories/news-brief.repository.d.ts +81 -0
  23. package/dist/database/repositories/news-brief.repository.js +208 -0
  24. package/dist/database/repositories/news-brief.repository.js.map +1 -0
  25. package/dist/database/schemas/news-brief.schema.d.ts +48 -0
  26. package/dist/database/schemas/news-brief.schema.js +130 -0
  27. package/dist/database/schemas/news-brief.schema.js.map +1 -0
  28. package/dist/news-brief/categories/news-category.registry.d.ts +5 -0
  29. package/dist/news-brief/categories/news-category.registry.js +106 -0
  30. package/dist/news-brief/categories/news-category.registry.js.map +1 -0
  31. package/dist/news-brief/clients/news-brief-ai.client.d.ts +45 -0
  32. package/dist/news-brief/clients/news-brief-ai.client.js +314 -0
  33. package/dist/news-brief/clients/news-brief-ai.client.js.map +1 -0
  34. package/dist/news-brief/clients/news-brief-search.service.d.ts +12 -0
  35. package/dist/news-brief/clients/news-brief-search.service.js +57 -0
  36. package/dist/news-brief/clients/news-brief-search.service.js.map +1 -0
  37. package/dist/news-brief/dto/generate-news-brief.dto.d.ts +7 -0
  38. package/dist/news-brief/dto/generate-news-brief.dto.js +45 -0
  39. package/dist/news-brief/dto/generate-news-brief.dto.js.map +1 -0
  40. package/dist/news-brief/dto/list-news-briefs-query.dto.d.ts +7 -0
  41. package/dist/news-brief/dto/list-news-briefs-query.dto.js +59 -0
  42. package/dist/news-brief/dto/list-news-briefs-query.dto.js.map +1 -0
  43. package/dist/news-brief/dto/news-brief-date-param.dto.d.ts +3 -0
  44. package/dist/news-brief/dto/news-brief-date-param.dto.js +22 -0
  45. package/dist/news-brief/dto/news-brief-date-param.dto.js.map +1 -0
  46. package/dist/news-brief/interfaces/news-brief.interface.d.ts +202 -0
  47. package/dist/news-brief/interfaces/news-brief.interface.js +3 -0
  48. package/dist/news-brief/interfaces/news-brief.interface.js.map +1 -0
  49. package/dist/news-brief/news-brief.config.d.ts +33 -0
  50. package/dist/news-brief/news-brief.config.js +118 -0
  51. package/dist/news-brief/news-brief.config.js.map +1 -0
  52. package/dist/news-brief/news-brief.controller.d.ts +56 -0
  53. package/dist/news-brief/news-brief.controller.js +185 -0
  54. package/dist/news-brief/news-brief.controller.js.map +1 -0
  55. package/dist/news-brief/news-brief.module.d.ts +2 -0
  56. package/dist/news-brief/news-brief.module.js +47 -0
  57. package/dist/news-brief/news-brief.module.js.map +1 -0
  58. package/dist/news-brief/news-brief.scheduler.d.ts +34 -0
  59. package/dist/news-brief/news-brief.scheduler.js +143 -0
  60. package/dist/news-brief/news-brief.scheduler.js.map +1 -0
  61. package/dist/news-brief/news-brief.service.d.ts +60 -0
  62. package/dist/news-brief/news-brief.service.js +676 -0
  63. package/dist/news-brief/news-brief.service.js.map +1 -0
  64. package/package.json +1 -1
@@ -0,0 +1,185 @@
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 __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.NewsBriefController = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const news_brief_config_1 = require("./news-brief.config");
18
+ const news_brief_service_1 = require("./news-brief.service");
19
+ const news_brief_scheduler_1 = require("./news-brief.scheduler");
20
+ const generate_news_brief_dto_1 = require("./dto/generate-news-brief.dto");
21
+ const news_brief_date_param_dto_1 = require("./dto/news-brief-date-param.dto");
22
+ const list_news_briefs_query_dto_1 = require("./dto/list-news-briefs-query.dto");
23
+ let NewsBriefController = class NewsBriefController {
24
+ constructor(newsBriefService, newsBriefScheduler, config) {
25
+ this.newsBriefService = newsBriefService;
26
+ this.newsBriefScheduler = newsBriefScheduler;
27
+ this.config = config;
28
+ }
29
+ generate(body) {
30
+ if (!this.config.manualGenerateEnabled) {
31
+ throw new common_1.ForbiddenException('Manual news brief generation is disabled. Set NEWS_BRIEF_MANUAL_GENERATE_ENABLED=true for ops use; frontend must not call this endpoint.');
32
+ }
33
+ return this.newsBriefService.generate(body);
34
+ }
35
+ getConfig() {
36
+ return {
37
+ enabled: this.newsBriefScheduler.isEnabled(),
38
+ ...this.newsBriefService.getConfig(),
39
+ };
40
+ }
41
+ getCategories() {
42
+ return this.newsBriefService.getCategories();
43
+ }
44
+ getDigest(categories, date, period) {
45
+ return this.newsBriefService.findDigest(categories, date, period);
46
+ }
47
+ getSchedulerStatus() {
48
+ return this.newsBriefScheduler.getStatus();
49
+ }
50
+ startScheduler() {
51
+ this.newsBriefScheduler.start();
52
+ return { message: 'News brief scheduler started' };
53
+ }
54
+ stopScheduler() {
55
+ this.newsBriefScheduler.stop();
56
+ return { message: 'News brief scheduler stopped' };
57
+ }
58
+ reconfigureScheduler() {
59
+ this.newsBriefScheduler.reconfigure();
60
+ return { message: 'News brief scheduler reconfigured' };
61
+ }
62
+ findLatest(category, period, includeDebug) {
63
+ return this.newsBriefService.findLatest(category, period, includeDebug === 'true');
64
+ }
65
+ list(query) {
66
+ return this.newsBriefService.list(query);
67
+ }
68
+ deleteHistory(olderThan, beforeDate, category) {
69
+ return this.newsBriefService.deleteHistory({
70
+ olderThan,
71
+ beforeDate,
72
+ category,
73
+ });
74
+ }
75
+ deleteByDate(params, category, period) {
76
+ return this.newsBriefService.deleteByDate(params.date, category, period);
77
+ }
78
+ findByDate(params, category, period, includeDebug) {
79
+ return this.newsBriefService.findByDate(params.date, category, period, includeDebug === 'true');
80
+ }
81
+ };
82
+ exports.NewsBriefController = NewsBriefController;
83
+ __decorate([
84
+ (0, common_1.Post)('generate'),
85
+ __param(0, (0, common_1.Body)()),
86
+ __metadata("design:type", Function),
87
+ __metadata("design:paramtypes", [generate_news_brief_dto_1.GenerateNewsBriefDto]),
88
+ __metadata("design:returntype", void 0)
89
+ ], NewsBriefController.prototype, "generate", null);
90
+ __decorate([
91
+ (0, common_1.Get)('config'),
92
+ __metadata("design:type", Function),
93
+ __metadata("design:paramtypes", []),
94
+ __metadata("design:returntype", void 0)
95
+ ], NewsBriefController.prototype, "getConfig", null);
96
+ __decorate([
97
+ (0, common_1.Get)('categories'),
98
+ __metadata("design:type", Function),
99
+ __metadata("design:paramtypes", []),
100
+ __metadata("design:returntype", void 0)
101
+ ], NewsBriefController.prototype, "getCategories", null);
102
+ __decorate([
103
+ (0, common_1.Get)('digest'),
104
+ __param(0, (0, common_1.Query)('categories')),
105
+ __param(1, (0, common_1.Query)('date')),
106
+ __param(2, (0, common_1.Query)('period')),
107
+ __metadata("design:type", Function),
108
+ __metadata("design:paramtypes", [Object, String, String]),
109
+ __metadata("design:returntype", void 0)
110
+ ], NewsBriefController.prototype, "getDigest", null);
111
+ __decorate([
112
+ (0, common_1.Get)('scheduler/status'),
113
+ __metadata("design:type", Function),
114
+ __metadata("design:paramtypes", []),
115
+ __metadata("design:returntype", void 0)
116
+ ], NewsBriefController.prototype, "getSchedulerStatus", null);
117
+ __decorate([
118
+ (0, common_1.Post)('scheduler/start'),
119
+ __metadata("design:type", Function),
120
+ __metadata("design:paramtypes", []),
121
+ __metadata("design:returntype", void 0)
122
+ ], NewsBriefController.prototype, "startScheduler", null);
123
+ __decorate([
124
+ (0, common_1.Post)('scheduler/stop'),
125
+ __metadata("design:type", Function),
126
+ __metadata("design:paramtypes", []),
127
+ __metadata("design:returntype", void 0)
128
+ ], NewsBriefController.prototype, "stopScheduler", null);
129
+ __decorate([
130
+ (0, common_1.Post)('scheduler/reconfigure'),
131
+ __metadata("design:type", Function),
132
+ __metadata("design:paramtypes", []),
133
+ __metadata("design:returntype", void 0)
134
+ ], NewsBriefController.prototype, "reconfigureScheduler", null);
135
+ __decorate([
136
+ (0, common_1.Get)('latest'),
137
+ __param(0, (0, common_1.Query)('category')),
138
+ __param(1, (0, common_1.Query)('period')),
139
+ __param(2, (0, common_1.Query)('includeDebug')),
140
+ __metadata("design:type", Function),
141
+ __metadata("design:paramtypes", [String, String, String]),
142
+ __metadata("design:returntype", void 0)
143
+ ], NewsBriefController.prototype, "findLatest", null);
144
+ __decorate([
145
+ (0, common_1.Get)(),
146
+ __param(0, (0, common_1.Query)()),
147
+ __metadata("design:type", Function),
148
+ __metadata("design:paramtypes", [list_news_briefs_query_dto_1.ListNewsBriefsQueryDto]),
149
+ __metadata("design:returntype", void 0)
150
+ ], NewsBriefController.prototype, "list", null);
151
+ __decorate([
152
+ (0, common_1.Delete)('history'),
153
+ __param(0, (0, common_1.Query)('olderThan')),
154
+ __param(1, (0, common_1.Query)('beforeDate')),
155
+ __param(2, (0, common_1.Query)('category')),
156
+ __metadata("design:type", Function),
157
+ __metadata("design:paramtypes", [String, String, String]),
158
+ __metadata("design:returntype", void 0)
159
+ ], NewsBriefController.prototype, "deleteHistory", null);
160
+ __decorate([
161
+ (0, common_1.Delete)(':date'),
162
+ __param(0, (0, common_1.Param)()),
163
+ __param(1, (0, common_1.Query)('category')),
164
+ __param(2, (0, common_1.Query)('period')),
165
+ __metadata("design:type", Function),
166
+ __metadata("design:paramtypes", [news_brief_date_param_dto_1.NewsBriefDateParamDto, String, String]),
167
+ __metadata("design:returntype", void 0)
168
+ ], NewsBriefController.prototype, "deleteByDate", null);
169
+ __decorate([
170
+ (0, common_1.Get)(':date'),
171
+ __param(0, (0, common_1.Param)()),
172
+ __param(1, (0, common_1.Query)('category')),
173
+ __param(2, (0, common_1.Query)('period')),
174
+ __param(3, (0, common_1.Query)('includeDebug')),
175
+ __metadata("design:type", Function),
176
+ __metadata("design:paramtypes", [news_brief_date_param_dto_1.NewsBriefDateParamDto, String, String, String]),
177
+ __metadata("design:returntype", void 0)
178
+ ], NewsBriefController.prototype, "findByDate", null);
179
+ exports.NewsBriefController = NewsBriefController = __decorate([
180
+ (0, common_1.Controller)('api/news-briefs'),
181
+ __metadata("design:paramtypes", [news_brief_service_1.NewsBriefService,
182
+ news_brief_scheduler_1.NewsBriefScheduler,
183
+ news_brief_config_1.NewsBriefConfigService])
184
+ ], NewsBriefController);
185
+ //# sourceMappingURL=news-brief.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"news-brief.controller.js","sourceRoot":"","sources":["../../src/news-brief/news-brief.controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare class NewsBriefModule {
2
+ }
@@ -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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.NewsBriefModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const schedule_1 = require("@nestjs/schedule");
12
+ const cache_module_1 = require("../cache/cache.module");
13
+ const database_module_1 = require("../database/database.module");
14
+ const daily_brief_module_1 = require("../daily-brief/daily-brief.module");
15
+ const hot_lists_module_1 = require("../host-lists/hot-lists.module");
16
+ const scheduler_module_1 = require("../scheduler/scheduler.module");
17
+ const news_brief_ai_client_1 = require("./clients/news-brief-ai.client");
18
+ const news_brief_search_service_1 = require("./clients/news-brief-search.service");
19
+ const news_brief_config_1 = require("./news-brief.config");
20
+ const news_brief_controller_1 = require("./news-brief.controller");
21
+ const news_brief_scheduler_1 = require("./news-brief.scheduler");
22
+ const news_brief_service_1 = require("./news-brief.service");
23
+ let NewsBriefModule = class NewsBriefModule {
24
+ };
25
+ exports.NewsBriefModule = NewsBriefModule;
26
+ exports.NewsBriefModule = NewsBriefModule = __decorate([
27
+ (0, common_1.Module)({
28
+ imports: [
29
+ schedule_1.ScheduleModule,
30
+ cache_module_1.CacheModule,
31
+ database_module_1.DatabaseModule,
32
+ hot_lists_module_1.HotListsModule,
33
+ scheduler_module_1.SchedulerModule,
34
+ daily_brief_module_1.DailyBriefModule,
35
+ ],
36
+ controllers: [news_brief_controller_1.NewsBriefController],
37
+ providers: [
38
+ news_brief_config_1.NewsBriefConfigService,
39
+ news_brief_service_1.NewsBriefService,
40
+ news_brief_scheduler_1.NewsBriefScheduler,
41
+ news_brief_ai_client_1.NewsBriefAiClient,
42
+ news_brief_search_service_1.NewsBriefSearchService,
43
+ ],
44
+ exports: [news_brief_service_1.NewsBriefService],
45
+ })
46
+ ], NewsBriefModule);
47
+ //# sourceMappingURL=news-brief.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"news-brief.module.js","sourceRoot":"","sources":["../../src/news-brief/news-brief.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,+CAAkD;AAClD,wDAAoD;AACpD,iEAA6D;AAC7D,0EAAqE;AACrE,qEAAgE;AAChE,oEAAgE;AAChE,yEAAmE;AACnE,mFAA6E;AAC7E,2DAA6D;AAC7D,mEAA8D;AAC9D,iEAA4D;AAC5D,6DAAwD;AA2BjD,IAAM,eAAe,GAArB,MAAM,eAAe;CAAG,CAAA;AAAlB,0CAAe;0BAAf,eAAe;IArB3B,IAAA,eAAM,EAAC;QAEN,OAAO,EAAE;YACP,yBAAc;YACd,0BAAW;YACX,gCAAc;YACd,iCAAc;YACd,kCAAe;YAEf,qCAAgB;SACjB;QACD,WAAW,EAAE,CAAC,2CAAmB,CAAC;QAClC,SAAS,EAAE;YACT,0CAAsB;YACtB,qCAAgB;YAChB,yCAAkB;YAClB,wCAAiB;YACjB,kDAAsB;SACvB;QACD,OAAO,EAAE,CAAC,qCAAgB,CAAC;KAC5B,CAAC;GACW,eAAe,CAAG"}
@@ -0,0 +1,34 @@
1
+ import { OnModuleDestroy, OnModuleInit } from '@nestjs/common';
2
+ import { SchedulerRegistry } from '@nestjs/schedule';
3
+ import { HotListsService } from '../host-lists/hot-lists.service';
4
+ import { NewsBriefConfigService } from './news-brief.config';
5
+ import { NewsBriefService } from './news-brief.service';
6
+ export declare class NewsBriefScheduler implements OnModuleInit, OnModuleDestroy {
7
+ private readonly config;
8
+ private readonly schedulerRegistry;
9
+ private readonly newsBriefService;
10
+ private readonly hotListsService;
11
+ private readonly logger;
12
+ private readonly cronJobName;
13
+ private isRunning;
14
+ private enabled;
15
+ constructor(config: NewsBriefConfigService, schedulerRegistry: SchedulerRegistry, newsBriefService: NewsBriefService, hotListsService: HotListsService);
16
+ onModuleInit(): void;
17
+ onModuleDestroy(): void;
18
+ isEnabled(): boolean;
19
+ getStatus(): {
20
+ isRunning: boolean;
21
+ enabled: boolean;
22
+ cronExpression: string;
23
+ timezone: string;
24
+ categories: string[];
25
+ cronJobExists: boolean;
26
+ };
27
+ start(): void;
28
+ stop(): void;
29
+ reconfigure(): void;
30
+ private setupCronJob;
31
+ private stopCronJob;
32
+ private handleCron;
33
+ private validateCategoryProfiles;
34
+ }
@@ -0,0 +1,143 @@
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 NewsBriefScheduler_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.NewsBriefScheduler = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const schedule_1 = require("@nestjs/schedule");
16
+ const cron_1 = require("cron");
17
+ const hot_lists_service_1 = require("../host-lists/hot-lists.service");
18
+ const news_brief_config_1 = require("./news-brief.config");
19
+ const news_brief_service_1 = require("./news-brief.service");
20
+ const news_brief_ai_client_1 = require("./clients/news-brief-ai.client");
21
+ let NewsBriefScheduler = NewsBriefScheduler_1 = class NewsBriefScheduler {
22
+ constructor(config, schedulerRegistry, newsBriefService, hotListsService) {
23
+ this.config = config;
24
+ this.schedulerRegistry = schedulerRegistry;
25
+ this.newsBriefService = newsBriefService;
26
+ this.hotListsService = hotListsService;
27
+ this.logger = new common_1.Logger(NewsBriefScheduler_1.name);
28
+ this.cronJobName = 'news-brief-generate';
29
+ this.isRunning = false;
30
+ this.enabled = false;
31
+ this.enabled = this.config.enabled;
32
+ }
33
+ onModuleInit() {
34
+ this.validateCategoryProfiles(this.config.knownCategories);
35
+ this.setupCronJob();
36
+ }
37
+ onModuleDestroy() {
38
+ this.stopCronJob();
39
+ }
40
+ isEnabled() {
41
+ return this.enabled;
42
+ }
43
+ getStatus() {
44
+ return {
45
+ isRunning: this.isRunning,
46
+ enabled: this.enabled,
47
+ cronExpression: this.config.cronExpression,
48
+ timezone: this.config.timezone,
49
+ categories: this.config.categoryCodes,
50
+ cronJobExists: this.schedulerRegistry.doesExist('cron', this.cronJobName),
51
+ };
52
+ }
53
+ start() {
54
+ this.enabled = true;
55
+ this.setupCronJob();
56
+ }
57
+ stop() {
58
+ this.enabled = false;
59
+ this.stopCronJob();
60
+ }
61
+ reconfigure() {
62
+ this.setupCronJob();
63
+ }
64
+ setupCronJob() {
65
+ try {
66
+ this.stopCronJob();
67
+ if (!this.enabled) {
68
+ this.logger.log('News brief scheduler is disabled');
69
+ return;
70
+ }
71
+ const cronExpression = this.config.cronExpression;
72
+ const timezone = this.config.timezone;
73
+ const job = new cron_1.CronJob(cronExpression, () => {
74
+ void this.handleCron();
75
+ }, null, false, timezone);
76
+ this.schedulerRegistry.addCronJob(this.cronJobName, job);
77
+ job.start();
78
+ this.logger.log(`News brief cron job setup with expression: ${cronExpression}`);
79
+ }
80
+ catch (error) {
81
+ this.logger.error('Failed to setup news brief cron job:', error);
82
+ }
83
+ }
84
+ stopCronJob() {
85
+ try {
86
+ if (this.schedulerRegistry.doesExist('cron', this.cronJobName)) {
87
+ this.schedulerRegistry.deleteCronJob(this.cronJobName);
88
+ this.logger.log(`Stopped cron job: ${this.cronJobName}`);
89
+ }
90
+ }
91
+ catch (error) {
92
+ this.logger.error('Failed to stop news brief cron job:', error);
93
+ }
94
+ }
95
+ async handleCron() {
96
+ if (!this.enabled || this.isRunning) {
97
+ return;
98
+ }
99
+ this.isRunning = true;
100
+ try {
101
+ const result = await this.newsBriefService.generate();
102
+ const succeeded = result.results.filter((item) => item.status === 'success').length;
103
+ const failed = result.results.filter((item) => item.status === 'failed').length;
104
+ this.logger.log(`News brief run for ${result.briefDate}/${result.period}: ${succeeded} succeeded, ${failed} failed`);
105
+ }
106
+ catch (error) {
107
+ this.logger.error('News brief generation failed:', error);
108
+ }
109
+ finally {
110
+ this.isRunning = false;
111
+ }
112
+ }
113
+ validateCategoryProfiles(profiles) {
114
+ const registeredSources = new Set(this.hotListsService.getAllSources());
115
+ const missingSources = [];
116
+ const oversized = [];
117
+ for (const profile of profiles) {
118
+ for (const source of profile.sources) {
119
+ if (!registeredSources.has(source)) {
120
+ missingSources.push(`${profile.code}:${source}`);
121
+ }
122
+ }
123
+ if (profile.maxItems > news_brief_ai_client_1.PROMPT_BUDGET.maxOutputItems) {
124
+ oversized.push(`${profile.code}:${profile.maxItems}`);
125
+ }
126
+ }
127
+ if (missingSources.length > 0) {
128
+ throw new Error(`Unknown hot list source(s) in news category registry: ${missingSources.join(', ')}`);
129
+ }
130
+ if (oversized.length > 0) {
131
+ throw new Error(`News category maxItems exceeds PROMPT_BUDGET.maxOutputItems (${news_brief_ai_client_1.PROMPT_BUDGET.maxOutputItems}): ${oversized.join(', ')}`);
132
+ }
133
+ }
134
+ };
135
+ exports.NewsBriefScheduler = NewsBriefScheduler;
136
+ exports.NewsBriefScheduler = NewsBriefScheduler = NewsBriefScheduler_1 = __decorate([
137
+ (0, common_1.Injectable)(),
138
+ __metadata("design:paramtypes", [news_brief_config_1.NewsBriefConfigService,
139
+ schedule_1.SchedulerRegistry,
140
+ news_brief_service_1.NewsBriefService,
141
+ hot_lists_service_1.HotListsService])
142
+ ], NewsBriefScheduler);
143
+ //# sourceMappingURL=news-brief.scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"news-brief.scheduler.js","sourceRoot":"","sources":["../../src/news-brief/news-brief.scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { CacheService } from '../cache/cache.service';
2
+ import { HotListsService } from '../host-lists/hot-lists.service';
3
+ import { HotItemRepository } from '../database/repositories/hot-item.repository';
4
+ import { NewsBriefRepository } from '../database/repositories/news-brief.repository';
5
+ import { FetchHotDataTask } from '../scheduler/tasks/fetch-hot-data.task';
6
+ import { GenerateNewsBriefOptions, ListNewsBriefsOptions, NewsBriefDeleteHistoryResponse, NewsBriefDeleteResponse, NewsBriefDigestResponse, NewsBriefGenerateResponse, NewsBriefListResponse, NewsBriefPublicConfig, NewsBriefResponse, NewsCategorySummary } from './interfaces/news-brief.interface';
7
+ import { NewsBriefAiClient } from './clients/news-brief-ai.client';
8
+ import { NewsBriefSearchService } from './clients/news-brief-search.service';
9
+ import { NewsBriefConfigService } from './news-brief.config';
10
+ export declare class NewsBriefService {
11
+ private readonly config;
12
+ private readonly newsBriefRepository;
13
+ private readonly hotItemRepository;
14
+ private readonly fetchHotDataTask;
15
+ private readonly hotListsService;
16
+ private readonly aiClient;
17
+ private readonly searchService;
18
+ private readonly cacheService;
19
+ private readonly logger;
20
+ constructor(config: NewsBriefConfigService, newsBriefRepository: NewsBriefRepository, hotItemRepository: HotItemRepository, fetchHotDataTask: FetchHotDataTask, hotListsService: HotListsService, aiClient: NewsBriefAiClient, searchService: NewsBriefSearchService, cacheService: CacheService);
21
+ generate(options?: GenerateNewsBriefOptions): Promise<NewsBriefGenerateResponse>;
22
+ findLatest(category: string | undefined, period?: string, includeDebug?: boolean): Promise<NewsBriefResponse | null>;
23
+ findByDate(date: string, category: string | undefined, period?: string, includeDebug?: boolean): Promise<NewsBriefResponse | null>;
24
+ findDigest(categories?: string | string[], date?: string, period?: string): Promise<NewsBriefDigestResponse>;
25
+ list(options: ListNewsBriefsOptions): Promise<NewsBriefListResponse>;
26
+ deleteByDate(date: string, category?: string, period?: string): Promise<NewsBriefDeleteResponse>;
27
+ deleteHistory(options: {
28
+ olderThan?: string;
29
+ beforeDate?: string;
30
+ category?: string;
31
+ }): Promise<NewsBriefDeleteHistoryResponse>;
32
+ getConfig(): NewsBriefPublicConfig;
33
+ getCategories(): NewsCategorySummary[];
34
+ private generateForCategory;
35
+ private generateClaimedBrief;
36
+ private fetchLatestSourceItems;
37
+ private refreshSourceOnce;
38
+ private refreshSource;
39
+ private loadHistoryItems;
40
+ private buildSourceNameMap;
41
+ private toInputItem;
42
+ private mergeAndLimitItems;
43
+ private timestampOf;
44
+ private effectiveMaxItems;
45
+ private isSearchActive;
46
+ private buildSearchEvidence;
47
+ private buildSearchQuery;
48
+ private resolveDigestProfiles;
49
+ private resolveGenerateProfiles;
50
+ private requireKnownCategory;
51
+ private unknownCategoryMessage;
52
+ private resolveSourcesOverride;
53
+ private resolveBriefDate;
54
+ private validateDate;
55
+ private normalizePeriod;
56
+ private normalizeOptionalPeriod;
57
+ private resolveOlderThanDate;
58
+ private resolveInputWindow;
59
+ private toResponse;
60
+ }