bozonx-social-media-posting 1.1.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.
- package/LICENSE +21 -0
- package/README.md +1003 -0
- package/dist/src/app.constants.d.ts +8 -0
- package/dist/src/app.constants.js +9 -0
- package/dist/src/app.constants.js.map +1 -0
- package/dist/src/common/enums/body-format.enum.d.ts +12 -0
- package/dist/src/common/enums/body-format.enum.js +14 -0
- package/dist/src/common/enums/body-format.enum.js.map +1 -0
- package/dist/src/common/enums/error-code.enum.d.ts +12 -0
- package/dist/src/common/enums/error-code.enum.js +14 -0
- package/dist/src/common/enums/error-code.enum.js.map +1 -0
- package/dist/src/common/enums/index.d.ts +3 -0
- package/dist/src/common/enums/index.js +4 -0
- package/dist/src/common/enums/index.js.map +1 -0
- package/dist/src/common/enums/post-type.enum.d.ts +28 -0
- package/dist/src/common/enums/post-type.enum.js +30 -0
- package/dist/src/common/enums/post-type.enum.js.map +1 -0
- package/dist/src/common/filters/all-exceptions.filter.d.ts +13 -0
- package/dist/src/common/filters/all-exceptions.filter.js +103 -0
- package/dist/src/common/filters/all-exceptions.filter.js.map +1 -0
- package/dist/src/common/helpers/media-input.helper.d.ts +73 -0
- package/dist/src/common/helpers/media-input.helper.js +122 -0
- package/dist/src/common/helpers/media-input.helper.js.map +1 -0
- package/dist/src/common/interceptors/shutdown.interceptor.d.ts +12 -0
- package/dist/src/common/interceptors/shutdown.interceptor.js +41 -0
- package/dist/src/common/interceptors/shutdown.interceptor.js.map +1 -0
- package/dist/src/common/interfaces/logger.interface.d.ts +44 -0
- package/dist/src/common/interfaces/logger.interface.js +44 -0
- package/dist/src/common/interfaces/logger.interface.js.map +1 -0
- package/dist/src/common/services/shutdown.module.d.ts +2 -0
- package/dist/src/common/services/shutdown.module.js +18 -0
- package/dist/src/common/services/shutdown.module.js.map +1 -0
- package/dist/src/common/services/shutdown.service.d.ts +40 -0
- package/dist/src/common/services/shutdown.service.js +122 -0
- package/dist/src/common/services/shutdown.service.js.map +1 -0
- package/dist/src/common/types/index.d.ts +1 -0
- package/dist/src/common/types/index.js +2 -0
- package/dist/src/common/types/index.js.map +1 -0
- package/dist/src/common/types/media-input.type.d.ts +29 -0
- package/dist/src/common/types/media-input.type.js +2 -0
- package/dist/src/common/types/media-input.type.js.map +1 -0
- package/dist/src/common/validators/body-length.validator.d.ts +24 -0
- package/dist/src/common/validators/body-length.validator.js +57 -0
- package/dist/src/common/validators/body-length.validator.js.map +1 -0
- package/dist/src/common/validators/channel-id.validator.d.ts +19 -0
- package/dist/src/common/validators/channel-id.validator.js +58 -0
- package/dist/src/common/validators/channel-id.validator.js.map +1 -0
- package/dist/src/common/validators/has-content.validator.d.ts +23 -0
- package/dist/src/common/validators/has-content.validator.js +57 -0
- package/dist/src/common/validators/has-content.validator.js.map +1 -0
- package/dist/src/common/validators/media-input.validator.d.ts +44 -0
- package/dist/src/common/validators/media-input.validator.js +112 -0
- package/dist/src/common/validators/media-input.validator.js.map +1 -0
- package/dist/src/common/validators/media-priority.validator.d.ts +19 -0
- package/dist/src/common/validators/media-priority.validator.js +38 -0
- package/dist/src/common/validators/media-priority.validator.js.map +1 -0
- package/dist/src/config/app.config.d.ts +33 -0
- package/dist/src/config/app.config.js +83 -0
- package/dist/src/config/app.config.js.map +1 -0
- package/dist/src/config/library.config.d.ts +51 -0
- package/dist/src/config/library.config.js +197 -0
- package/dist/src/config/library.config.js.map +1 -0
- package/dist/src/config/yaml-config.dto.d.ts +37 -0
- package/dist/src/config/yaml-config.dto.js +152 -0
- package/dist/src/config/yaml-config.dto.js.map +1 -0
- package/dist/src/config/yaml.config.d.ts +14 -0
- package/dist/src/config/yaml.config.js +72 -0
- package/dist/src/config/yaml.config.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.js +17 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/library.d.ts +57 -0
- package/dist/src/library.js +92 -0
- package/dist/src/library.js.map +1 -0
- package/dist/src/modules/app-config/app-config.module.d.ts +2 -0
- package/dist/src/modules/app-config/app-config.module.js +26 -0
- package/dist/src/modules/app-config/app-config.module.js.map +1 -0
- package/dist/src/modules/app-config/app-config.service.d.ts +14 -0
- package/dist/src/modules/app-config/app-config.service.js +18 -0
- package/dist/src/modules/app-config/app-config.service.js.map +1 -0
- package/dist/src/modules/app-config/interfaces/app-config.interface.d.ts +31 -0
- package/dist/src/modules/app-config/interfaces/app-config.interface.js +2 -0
- package/dist/src/modules/app-config/interfaces/app-config.interface.js.map +1 -0
- package/dist/src/modules/app-config/nest-config.service.d.ts +41 -0
- package/dist/src/modules/app-config/nest-config.service.js +91 -0
- package/dist/src/modules/app-config/nest-config.service.js.map +1 -0
- package/dist/src/modules/health/health.controller.d.ts +12 -0
- package/dist/src/modules/health/health.controller.js +33 -0
- package/dist/src/modules/health/health.controller.js.map +1 -0
- package/dist/src/modules/health/health.module.d.ts +2 -0
- package/dist/src/modules/health/health.module.js +17 -0
- package/dist/src/modules/health/health.module.js.map +1 -0
- package/dist/src/modules/media/media.module.d.ts +2 -0
- package/dist/src/modules/media/media.module.js +18 -0
- package/dist/src/modules/media/media.module.js.map +1 -0
- package/dist/src/modules/media/media.service.d.ts +15 -0
- package/dist/src/modules/media/media.service.js +49 -0
- package/dist/src/modules/media/media.service.js.map +1 -0
- package/dist/src/modules/platforms/base/auth-validator-registry.service.d.ts +25 -0
- package/dist/src/modules/platforms/base/auth-validator-registry.service.js +50 -0
- package/dist/src/modules/platforms/base/auth-validator-registry.service.js.map +1 -0
- package/dist/src/modules/platforms/base/auth-validator.interface.d.ts +16 -0
- package/dist/src/modules/platforms/base/auth-validator.interface.js +2 -0
- package/dist/src/modules/platforms/base/auth-validator.interface.js.map +1 -0
- package/dist/src/modules/platforms/base/index.d.ts +4 -0
- package/dist/src/modules/platforms/base/index.js +5 -0
- package/dist/src/modules/platforms/base/index.js.map +1 -0
- package/dist/src/modules/platforms/base/platform-registry.service.d.ts +31 -0
- package/dist/src/modules/platforms/base/platform-registry.service.js +54 -0
- package/dist/src/modules/platforms/base/platform-registry.service.js.map +1 -0
- package/dist/src/modules/platforms/base/platform.interface.d.ts +39 -0
- package/dist/src/modules/platforms/base/platform.interface.js +2 -0
- package/dist/src/modules/platforms/base/platform.interface.js.map +1 -0
- package/dist/src/modules/platforms/platforms.module.d.ts +13 -0
- package/dist/src/modules/platforms/platforms.module.js +59 -0
- package/dist/src/modules/platforms/platforms.module.js.map +1 -0
- package/dist/src/modules/platforms/telegram/telegram-auth.validator.d.ts +19 -0
- package/dist/src/modules/platforms/telegram/telegram-auth.validator.js +51 -0
- package/dist/src/modules/platforms/telegram/telegram-auth.validator.js.map +1 -0
- package/dist/src/modules/platforms/telegram/telegram-type-detector.service.d.ts +18 -0
- package/dist/src/modules/platforms/telegram/telegram-type-detector.service.js +47 -0
- package/dist/src/modules/platforms/telegram/telegram-type-detector.service.js.map +1 -0
- package/dist/src/modules/platforms/telegram/telegram.platform.d.ts +58 -0
- package/dist/src/modules/platforms/telegram/telegram.platform.js +434 -0
- package/dist/src/modules/platforms/telegram/telegram.platform.js.map +1 -0
- package/dist/src/modules/post/base-post.service.d.ts +64 -0
- package/dist/src/modules/post/base-post.service.js +99 -0
- package/dist/src/modules/post/base-post.service.js.map +1 -0
- package/dist/src/modules/post/dto/index.d.ts +3 -0
- package/dist/src/modules/post/dto/index.js +4 -0
- package/dist/src/modules/post/dto/index.js.map +1 -0
- package/dist/src/modules/post/dto/post-request.dto.d.ts +56 -0
- package/dist/src/modules/post/dto/post-request.dto.js +195 -0
- package/dist/src/modules/post/dto/post-request.dto.js.map +1 -0
- package/dist/src/modules/post/dto/post-response.dto.d.ts +41 -0
- package/dist/src/modules/post/dto/post-response.dto.js +2 -0
- package/dist/src/modules/post/dto/post-response.dto.js.map +1 -0
- package/dist/src/modules/post/dto/preview-response.dto.d.ts +33 -0
- package/dist/src/modules/post/dto/preview-response.dto.js +2 -0
- package/dist/src/modules/post/dto/preview-response.dto.js.map +1 -0
- package/dist/src/modules/post/idempotency.service.d.ts +95 -0
- package/dist/src/modules/post/idempotency.service.js +229 -0
- package/dist/src/modules/post/idempotency.service.js.map +1 -0
- package/dist/src/modules/post/post.controller.d.ts +13 -0
- package/dist/src/modules/post/post.controller.js +97 -0
- package/dist/src/modules/post/post.controller.js.map +1 -0
- package/dist/src/modules/post/post.module.d.ts +2 -0
- package/dist/src/modules/post/post.module.js +25 -0
- package/dist/src/modules/post/post.module.js.map +1 -0
- package/dist/src/modules/post/post.service.d.ts +62 -0
- package/dist/src/modules/post/post.service.js +325 -0
- package/dist/src/modules/post/post.service.js.map +1 -0
- package/dist/src/modules/post/preview.service.d.ts +23 -0
- package/dist/src/modules/post/preview.service.js +69 -0
- package/dist/src/modules/post/preview.service.js.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +102 -0
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var TelegramPlatform_1;
|
|
11
|
+
import { Injectable, Logger, BadRequestException } from '@nestjs/common';
|
|
12
|
+
import { Bot } from 'grammy';
|
|
13
|
+
import { PostType } from '../../../common/enums/index.js';
|
|
14
|
+
import { MediaService } from '../../media/media.service.js';
|
|
15
|
+
import { MediaInputHelper } from '../../../common/helpers/media-input.helper.js';
|
|
16
|
+
import { TelegramTypeDetector } from './telegram-type-detector.service.js';
|
|
17
|
+
let TelegramPlatform = TelegramPlatform_1 = class TelegramPlatform {
|
|
18
|
+
mediaService;
|
|
19
|
+
typeDetector;
|
|
20
|
+
name = 'telegram';
|
|
21
|
+
supportedTypes = [
|
|
22
|
+
PostType.AUTO,
|
|
23
|
+
PostType.POST,
|
|
24
|
+
PostType.IMAGE,
|
|
25
|
+
PostType.VIDEO,
|
|
26
|
+
PostType.ALBUM,
|
|
27
|
+
PostType.AUDIO,
|
|
28
|
+
PostType.DOCUMENT,
|
|
29
|
+
];
|
|
30
|
+
supportsCoverWithMedia = false;
|
|
31
|
+
logger = new Logger(TelegramPlatform_1.name);
|
|
32
|
+
MAX_MEDIA_GROUP_SIZE = 10;
|
|
33
|
+
constructor(mediaService, typeDetector) {
|
|
34
|
+
this.mediaService = mediaService;
|
|
35
|
+
this.typeDetector = typeDetector;
|
|
36
|
+
}
|
|
37
|
+
async publish(request, accountConfig,
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
39
|
+
abortSignal) {
|
|
40
|
+
const { errors, warnings, actualType } = this.validateRequest(request);
|
|
41
|
+
if (errors.length > 0) {
|
|
42
|
+
throw new BadRequestException(errors.join('; '));
|
|
43
|
+
}
|
|
44
|
+
if (warnings.length > 0) {
|
|
45
|
+
this.logger.warn({
|
|
46
|
+
message: 'Warnings during publish',
|
|
47
|
+
metadata: {
|
|
48
|
+
platform: request.platform,
|
|
49
|
+
type: actualType,
|
|
50
|
+
warnings,
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const { apiKey } = accountConfig.auth;
|
|
55
|
+
const bot = new Bot(apiKey);
|
|
56
|
+
const chatId = this.resolveChatId(request, accountConfig);
|
|
57
|
+
const { processedBody, parseMode, disableNotification, options } = this.prepareMessageData(request, accountConfig);
|
|
58
|
+
let result;
|
|
59
|
+
switch (actualType) {
|
|
60
|
+
case PostType.POST:
|
|
61
|
+
result = await this.sendMessage(bot, chatId, processedBody, // Validated in validateRequest
|
|
62
|
+
parseMode, disableNotification, options);
|
|
63
|
+
break;
|
|
64
|
+
case PostType.IMAGE:
|
|
65
|
+
result = await this.sendPhoto(bot, chatId, request.cover, processedBody, parseMode, disableNotification, options);
|
|
66
|
+
break;
|
|
67
|
+
case PostType.VIDEO:
|
|
68
|
+
result = await this.sendVideo(bot, chatId, request.video, processedBody, parseMode, disableNotification, options);
|
|
69
|
+
break;
|
|
70
|
+
case PostType.AUDIO:
|
|
71
|
+
result = await this.sendAudio(bot, chatId, request.audio, processedBody, parseMode, disableNotification, options);
|
|
72
|
+
break;
|
|
73
|
+
case PostType.DOCUMENT:
|
|
74
|
+
result = await this.sendDocument(bot, chatId, request.document, processedBody, parseMode, disableNotification, options);
|
|
75
|
+
break;
|
|
76
|
+
case PostType.ALBUM:
|
|
77
|
+
result = await this.sendMediaGroup(bot, chatId, request.media, processedBody, parseMode, disableNotification);
|
|
78
|
+
break;
|
|
79
|
+
default:
|
|
80
|
+
throw new BadRequestException(`Unsupported post type: ${actualType}`);
|
|
81
|
+
}
|
|
82
|
+
this.logger.log({
|
|
83
|
+
message: `Published to Telegram`,
|
|
84
|
+
metadata: {
|
|
85
|
+
platform: request.platform,
|
|
86
|
+
channelId: chatId,
|
|
87
|
+
type: actualType,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
postId: String(result.message_id || result[0]?.message_id),
|
|
92
|
+
url: this.buildPostUrl(chatId, result.message_id || result[0]?.message_id),
|
|
93
|
+
raw: { ok: true, result },
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
async preview(request, accountConfig) {
|
|
97
|
+
const { errors, warnings, actualType } = this.validateRequest(request);
|
|
98
|
+
if (errors.length > 0) {
|
|
99
|
+
return {
|
|
100
|
+
success: false,
|
|
101
|
+
data: {
|
|
102
|
+
valid: false,
|
|
103
|
+
errors,
|
|
104
|
+
warnings,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const { processedBody, targetFormat } = this.prepareMessageData(request, accountConfig);
|
|
109
|
+
return {
|
|
110
|
+
success: true,
|
|
111
|
+
data: {
|
|
112
|
+
valid: true,
|
|
113
|
+
detectedType: actualType,
|
|
114
|
+
convertedBody: processedBody,
|
|
115
|
+
targetFormat: targetFormat,
|
|
116
|
+
convertedBodyLength: processedBody?.length,
|
|
117
|
+
warnings,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
validateRequest(request) {
|
|
122
|
+
const errors = [];
|
|
123
|
+
const warnings = [];
|
|
124
|
+
// Detect Type
|
|
125
|
+
const actualType = this.typeDetector.detectType(request);
|
|
126
|
+
if (!this.supportedTypes.includes(actualType)) {
|
|
127
|
+
errors.push(`Post type '${actualType}' is not supported for Telegram`);
|
|
128
|
+
}
|
|
129
|
+
// Required Fields
|
|
130
|
+
errors.push(...this.getRequiredFieldsErrors(request, actualType));
|
|
131
|
+
// Media URLs
|
|
132
|
+
errors.push(...this.getMediaUrlErrors(request));
|
|
133
|
+
// Ignored Fields
|
|
134
|
+
warnings.push(...this.getIgnoredFieldsWarnings(request));
|
|
135
|
+
warnings.push(...this.getIgnoredMediaWarnings(request, actualType));
|
|
136
|
+
return { errors, warnings, actualType };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Prepares message data for sending to Telegram.
|
|
140
|
+
* Maps bodyFormat to parse_mode without converting the body content.
|
|
141
|
+
* Body is sent as-is to Telegram API.
|
|
142
|
+
*
|
|
143
|
+
* Standard formats (text, html, md) are mapped to Telegram parse_mode.
|
|
144
|
+
* Custom values (e.g., MarkdownV2) are passed as-is.
|
|
145
|
+
* If parse_mode is specified in options, it overrides bodyFormat mapping.
|
|
146
|
+
*/
|
|
147
|
+
prepareMessageData(request, accountConfig) {
|
|
148
|
+
const processedBody = request.body;
|
|
149
|
+
// Map bodyFormat to Telegram parse_mode
|
|
150
|
+
let parseMode;
|
|
151
|
+
const bodyFormat = request.bodyFormat || 'text';
|
|
152
|
+
// Standard format mappings
|
|
153
|
+
if (bodyFormat === 'html') {
|
|
154
|
+
parseMode = 'HTML';
|
|
155
|
+
}
|
|
156
|
+
else if (bodyFormat === 'md') {
|
|
157
|
+
parseMode = 'Markdown';
|
|
158
|
+
}
|
|
159
|
+
else if (bodyFormat === 'text') {
|
|
160
|
+
// Plain text - no parse_mode
|
|
161
|
+
parseMode = undefined;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// Any other value is passed as-is (e.g., 'MarkdownV2' → parse_mode: 'MarkdownV2')
|
|
165
|
+
parseMode = bodyFormat;
|
|
166
|
+
}
|
|
167
|
+
const disableNotification = request.disableNotification ?? accountConfig.disableNotification ?? false;
|
|
168
|
+
// Options are passed directly to Telegram API
|
|
169
|
+
const options = request.options || {};
|
|
170
|
+
// If parse_mode is specified in options, it overrides our mapping
|
|
171
|
+
if (options.parse_mode !== undefined) {
|
|
172
|
+
parseMode = options.parse_mode;
|
|
173
|
+
}
|
|
174
|
+
return { processedBody, targetFormat: bodyFormat, parseMode, disableNotification, options };
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Resolve Telegram chat identifier from request and account configuration.
|
|
178
|
+
*
|
|
179
|
+
* Priority:
|
|
180
|
+
* 1. request.channelId
|
|
181
|
+
* 2. accountConfig.channelId (from config.yaml)
|
|
182
|
+
* 3. accountConfig.auth.chatId (legacy, for backward compatibility)
|
|
183
|
+
*/
|
|
184
|
+
resolveChatId(request, accountConfig) {
|
|
185
|
+
const requestChannelId = request.channelId;
|
|
186
|
+
const configChannelId = accountConfig.channelId;
|
|
187
|
+
const legacyChatId = accountConfig.auth?.chatId;
|
|
188
|
+
const finalId = requestChannelId ?? configChannelId ?? legacyChatId;
|
|
189
|
+
if (finalId === undefined || finalId === null || finalId === '') {
|
|
190
|
+
throw new BadRequestException('Field "channelId" is required for Telegram (provide via request.channelId, account config channelId, or legacy auth.chatId)');
|
|
191
|
+
}
|
|
192
|
+
if (typeof finalId !== 'string' && typeof finalId !== 'number') {
|
|
193
|
+
throw new BadRequestException('Field "channelId" must be a string or number');
|
|
194
|
+
}
|
|
195
|
+
return finalId;
|
|
196
|
+
}
|
|
197
|
+
async sendMessage(bot, chatId, text, parseMode, disableNotification, options) {
|
|
198
|
+
return await bot.api.sendMessage(chatId, text, {
|
|
199
|
+
...(parseMode && { parse_mode: parseMode }),
|
|
200
|
+
disable_notification: disableNotification,
|
|
201
|
+
...options,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
async sendPhoto(bot, chatId, cover, caption, parseMode, disableNotification, options) {
|
|
205
|
+
const photo = MediaInputHelper.toTelegramInput(cover);
|
|
206
|
+
const hasSpoiler = MediaInputHelper.getHasSpoiler(cover);
|
|
207
|
+
return await bot.api.sendPhoto(chatId, photo, {
|
|
208
|
+
caption,
|
|
209
|
+
...(parseMode && { parse_mode: parseMode }),
|
|
210
|
+
disable_notification: disableNotification,
|
|
211
|
+
has_spoiler: hasSpoiler,
|
|
212
|
+
...options,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
async sendVideo(bot, chatId, video, caption, parseMode, disableNotification, options) {
|
|
216
|
+
const videoInput = MediaInputHelper.toTelegramInput(video);
|
|
217
|
+
const hasSpoiler = MediaInputHelper.getHasSpoiler(video);
|
|
218
|
+
return await bot.api.sendVideo(chatId, videoInput, {
|
|
219
|
+
caption,
|
|
220
|
+
...(parseMode && { parse_mode: parseMode }),
|
|
221
|
+
disable_notification: disableNotification,
|
|
222
|
+
has_spoiler: hasSpoiler,
|
|
223
|
+
...options,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
async sendAudio(bot, chatId, audio, caption, parseMode, disableNotification, options) {
|
|
227
|
+
const audioInput = MediaInputHelper.toTelegramInput(audio);
|
|
228
|
+
return await bot.api.sendAudio(chatId, audioInput, {
|
|
229
|
+
caption,
|
|
230
|
+
...(parseMode && { parse_mode: parseMode }),
|
|
231
|
+
disable_notification: disableNotification,
|
|
232
|
+
...options,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
async sendDocument(bot, chatId, document, caption, parseMode, disableNotification, options) {
|
|
236
|
+
const documentInput = MediaInputHelper.toTelegramInput(document);
|
|
237
|
+
return await bot.api.sendDocument(chatId, documentInput, {
|
|
238
|
+
caption,
|
|
239
|
+
...(parseMode && { parse_mode: parseMode }),
|
|
240
|
+
disable_notification: disableNotification,
|
|
241
|
+
...options,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
async sendMediaGroup(bot, chatId, media, caption, parseMode, disableNotification) {
|
|
245
|
+
const mediaGroup = media.slice(0, this.MAX_MEDIA_GROUP_SIZE).map((item, index) => {
|
|
246
|
+
const url = MediaInputHelper.getUrl(item);
|
|
247
|
+
const fileId = MediaInputHelper.getFileId(item);
|
|
248
|
+
const hasSpoiler = MediaInputHelper.getHasSpoiler(item);
|
|
249
|
+
const explicitType = MediaInputHelper.getType(item);
|
|
250
|
+
const mediaInput = fileId || url;
|
|
251
|
+
if (!mediaInput) {
|
|
252
|
+
throw new BadRequestException(`Media item at index ${index} must have either url or fileId`);
|
|
253
|
+
}
|
|
254
|
+
// Use explicit type if provided, otherwise detect by URL extension
|
|
255
|
+
const telegramType = this.mapMediaTypeToTelegram(explicitType, url);
|
|
256
|
+
return {
|
|
257
|
+
type: telegramType,
|
|
258
|
+
media: mediaInput,
|
|
259
|
+
caption: index === 0 ? caption : undefined,
|
|
260
|
+
...(parseMode && index === 0 && { parse_mode: parseMode }),
|
|
261
|
+
has_spoiler: hasSpoiler,
|
|
262
|
+
};
|
|
263
|
+
});
|
|
264
|
+
return await bot.api.sendMediaGroup(chatId, mediaGroup, {
|
|
265
|
+
disable_notification: disableNotification,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Map MediaType to Telegram media group type
|
|
270
|
+
* Falls back to URL extension detection if no explicit type provided
|
|
271
|
+
*/
|
|
272
|
+
mapMediaTypeToTelegram(explicitType, url) {
|
|
273
|
+
if (explicitType) {
|
|
274
|
+
// Telegram sendMediaGroup only supports photo and video
|
|
275
|
+
if (explicitType === 'video') {
|
|
276
|
+
return 'video';
|
|
277
|
+
}
|
|
278
|
+
// image, audio, document all map to photo in media groups
|
|
279
|
+
return 'photo';
|
|
280
|
+
}
|
|
281
|
+
// Fallback: detect by URL extension
|
|
282
|
+
const isVideo = url ? /\.(mp4|mov|avi|mkv)$/i.test(url) : false;
|
|
283
|
+
return isVideo ? 'video' : 'photo';
|
|
284
|
+
}
|
|
285
|
+
getRequiredFieldsErrors(request, type) {
|
|
286
|
+
const errors = [];
|
|
287
|
+
switch (type) {
|
|
288
|
+
case PostType.POST:
|
|
289
|
+
if (request.body === undefined || request.body === null || request.body.trim() === '') {
|
|
290
|
+
errors.push("Field 'body' is required for type 'post'");
|
|
291
|
+
}
|
|
292
|
+
if (MediaInputHelper.isDefined(request.cover) ||
|
|
293
|
+
MediaInputHelper.isDefined(request.video) ||
|
|
294
|
+
MediaInputHelper.isDefined(request.audio) ||
|
|
295
|
+
MediaInputHelper.isDefined(request.document) ||
|
|
296
|
+
MediaInputHelper.isNotEmpty(request.media)) {
|
|
297
|
+
errors.push("For type 'post', media fields must not be provided");
|
|
298
|
+
}
|
|
299
|
+
break;
|
|
300
|
+
case PostType.IMAGE:
|
|
301
|
+
if (!MediaInputHelper.isDefined(request.cover)) {
|
|
302
|
+
errors.push("Field 'cover' is required for type 'image'");
|
|
303
|
+
}
|
|
304
|
+
break;
|
|
305
|
+
case PostType.VIDEO:
|
|
306
|
+
if (!MediaInputHelper.isDefined(request.video)) {
|
|
307
|
+
errors.push("Field 'video' is required for type 'video'");
|
|
308
|
+
}
|
|
309
|
+
break;
|
|
310
|
+
case PostType.AUDIO:
|
|
311
|
+
if (!MediaInputHelper.isDefined(request.audio)) {
|
|
312
|
+
errors.push("Field 'audio' is required for type 'audio'");
|
|
313
|
+
}
|
|
314
|
+
break;
|
|
315
|
+
case PostType.DOCUMENT:
|
|
316
|
+
if (!MediaInputHelper.isDefined(request.document)) {
|
|
317
|
+
errors.push("Field 'document' is required for type 'document'");
|
|
318
|
+
}
|
|
319
|
+
break;
|
|
320
|
+
case PostType.ALBUM:
|
|
321
|
+
if (!MediaInputHelper.isNotEmpty(request.media)) {
|
|
322
|
+
errors.push("Field 'media' is required for type 'album'");
|
|
323
|
+
}
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
return errors;
|
|
327
|
+
}
|
|
328
|
+
getMediaUrlErrors(request) {
|
|
329
|
+
const errors = [];
|
|
330
|
+
const validateIfUrl = (media) => {
|
|
331
|
+
const url = MediaInputHelper.getUrl(media);
|
|
332
|
+
if (url) {
|
|
333
|
+
try {
|
|
334
|
+
this.mediaService.validateMediaUrl(url);
|
|
335
|
+
}
|
|
336
|
+
catch (e) {
|
|
337
|
+
errors.push(e.message);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
if (request.cover)
|
|
342
|
+
validateIfUrl(request.cover);
|
|
343
|
+
if (request.video)
|
|
344
|
+
validateIfUrl(request.video);
|
|
345
|
+
if (request.audio)
|
|
346
|
+
validateIfUrl(request.audio);
|
|
347
|
+
if (request.document)
|
|
348
|
+
validateIfUrl(request.document);
|
|
349
|
+
if (request.media) {
|
|
350
|
+
request.media.forEach(validateIfUrl);
|
|
351
|
+
}
|
|
352
|
+
return errors;
|
|
353
|
+
}
|
|
354
|
+
getIgnoredFieldsWarnings(request) {
|
|
355
|
+
const warnings = [];
|
|
356
|
+
const ignoredFields = [];
|
|
357
|
+
if (request.title)
|
|
358
|
+
ignoredFields.push('title');
|
|
359
|
+
if (request.description)
|
|
360
|
+
ignoredFields.push('description');
|
|
361
|
+
if (request.postLanguage)
|
|
362
|
+
ignoredFields.push('postLanguage');
|
|
363
|
+
if (request.tags)
|
|
364
|
+
ignoredFields.push('tags');
|
|
365
|
+
if (request.mode)
|
|
366
|
+
ignoredFields.push('mode');
|
|
367
|
+
if (request.scheduledAt)
|
|
368
|
+
ignoredFields.push('scheduledAt');
|
|
369
|
+
if (ignoredFields.length > 0) {
|
|
370
|
+
warnings.push(`Fields ${ignoredFields.join(', ')} are not used by Telegram and will be ignored`);
|
|
371
|
+
}
|
|
372
|
+
return warnings;
|
|
373
|
+
}
|
|
374
|
+
getIgnoredMediaWarnings(request, type) {
|
|
375
|
+
const warnings = [];
|
|
376
|
+
const ignoredFields = [];
|
|
377
|
+
const checkField = (field, value, isArray = false) => {
|
|
378
|
+
if (isArray ? MediaInputHelper.isNotEmpty(value) : MediaInputHelper.isDefined(value)) {
|
|
379
|
+
ignoredFields.push(field);
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
switch (type) {
|
|
383
|
+
case PostType.IMAGE:
|
|
384
|
+
checkField('media', request.media, true);
|
|
385
|
+
checkField('video', request.video);
|
|
386
|
+
checkField('audio', request.audio);
|
|
387
|
+
checkField('document', request.document);
|
|
388
|
+
break;
|
|
389
|
+
case PostType.VIDEO:
|
|
390
|
+
checkField('media', request.media, true);
|
|
391
|
+
checkField('cover', request.cover);
|
|
392
|
+
checkField('audio', request.audio);
|
|
393
|
+
checkField('document', request.document);
|
|
394
|
+
break;
|
|
395
|
+
case PostType.AUDIO:
|
|
396
|
+
checkField('media', request.media, true);
|
|
397
|
+
checkField('cover', request.cover);
|
|
398
|
+
checkField('video', request.video);
|
|
399
|
+
checkField('document', request.document);
|
|
400
|
+
break;
|
|
401
|
+
case PostType.DOCUMENT:
|
|
402
|
+
checkField('media', request.media, true);
|
|
403
|
+
checkField('cover', request.cover);
|
|
404
|
+
checkField('video', request.video);
|
|
405
|
+
checkField('audio', request.audio);
|
|
406
|
+
break;
|
|
407
|
+
case PostType.ALBUM:
|
|
408
|
+
checkField('cover', request.cover);
|
|
409
|
+
checkField('video', request.video);
|
|
410
|
+
checkField('audio', request.audio);
|
|
411
|
+
checkField('document', request.document);
|
|
412
|
+
break;
|
|
413
|
+
}
|
|
414
|
+
if (ignoredFields.length > 0) {
|
|
415
|
+
warnings.push(`Fields ${ignoredFields.join(', ')} will be ignored for type '${type}'`);
|
|
416
|
+
}
|
|
417
|
+
return warnings;
|
|
418
|
+
}
|
|
419
|
+
buildPostUrl(chatId, messageId) {
|
|
420
|
+
const chatIdStr = String(chatId);
|
|
421
|
+
if (chatIdStr.startsWith('@')) {
|
|
422
|
+
const channelName = chatIdStr.substring(1);
|
|
423
|
+
return `https://t.me/${channelName}/${messageId}`;
|
|
424
|
+
}
|
|
425
|
+
return undefined;
|
|
426
|
+
}
|
|
427
|
+
};
|
|
428
|
+
TelegramPlatform = TelegramPlatform_1 = __decorate([
|
|
429
|
+
Injectable(),
|
|
430
|
+
__metadata("design:paramtypes", [MediaService,
|
|
431
|
+
TelegramTypeDetector])
|
|
432
|
+
], TelegramPlatform);
|
|
433
|
+
export { TelegramPlatform };
|
|
434
|
+
//# sourceMappingURL=telegram.platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram.platform.js","sourceRoot":"","sources":["../../../../../src/modules/platforms/telegram/telegram.platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Logger } from '@nestjs/common';
|
|
2
|
+
import { AppConfigService } from '../app-config/app-config.service.js';
|
|
3
|
+
import { PlatformRegistry } from '../platforms/base/platform-registry.service.js';
|
|
4
|
+
import { AuthValidatorRegistry } from '../platforms/base/auth-validator-registry.service.js';
|
|
5
|
+
import { IPlatform } from '../platforms/base/platform.interface.js';
|
|
6
|
+
import { PostRequestDto } from './dto/index.js';
|
|
7
|
+
import type { AccountConfig } from '../app-config/interfaces/app-config.interface.js';
|
|
8
|
+
/**
|
|
9
|
+
* Account configuration with inline auth support
|
|
10
|
+
*/
|
|
11
|
+
export interface ResolvedAccountConfig extends AccountConfig {
|
|
12
|
+
/** Source of the config: 'account' or 'inline' */
|
|
13
|
+
source: 'account' | 'inline';
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Base service with shared logic for PostService and PreviewService
|
|
17
|
+
* Handles platform resolution, account config, and auth validation
|
|
18
|
+
*/
|
|
19
|
+
export declare abstract class BasePostService {
|
|
20
|
+
protected readonly appConfig: AppConfigService;
|
|
21
|
+
protected readonly platformRegistry: PlatformRegistry;
|
|
22
|
+
protected readonly authValidatorRegistry: AuthValidatorRegistry;
|
|
23
|
+
protected abstract readonly logger: Logger;
|
|
24
|
+
constructor(appConfig: AppConfigService, platformRegistry: PlatformRegistry, authValidatorRegistry: AuthValidatorRegistry);
|
|
25
|
+
/**
|
|
26
|
+
* Get platform instance by name
|
|
27
|
+
* @param platformName - Platform name (e.g., 'telegram')
|
|
28
|
+
* @returns Platform instance
|
|
29
|
+
* @throws BadRequestException if platform is not found
|
|
30
|
+
*/
|
|
31
|
+
protected getPlatform(platformName: string): IPlatform;
|
|
32
|
+
/**
|
|
33
|
+
* Get account configuration from request
|
|
34
|
+
* Supports both named accounts from config and inline auth
|
|
35
|
+
* @param request - Post request
|
|
36
|
+
* @returns Account configuration object with source indicator
|
|
37
|
+
* @throws BadRequestException if neither account nor auth is provided
|
|
38
|
+
*/
|
|
39
|
+
protected getAccountConfig(request: PostRequestDto): ResolvedAccountConfig;
|
|
40
|
+
/**
|
|
41
|
+
* Validate that platform matches account platform
|
|
42
|
+
* @param platformName - Requested platform
|
|
43
|
+
* @param accountConfig - Account configuration
|
|
44
|
+
* @throws BadRequestException if platform doesn't match
|
|
45
|
+
*/
|
|
46
|
+
protected validatePlatformMatch(platformName: string, accountConfig: AccountConfig): void;
|
|
47
|
+
/**
|
|
48
|
+
* Validate auth object for the platform
|
|
49
|
+
* @param platformName - Platform name
|
|
50
|
+
* @param auth - Auth object
|
|
51
|
+
* @throws BadRequestException if auth is invalid
|
|
52
|
+
*/
|
|
53
|
+
protected validateAuth(platformName: string, auth: Record<string, any>): void;
|
|
54
|
+
/**
|
|
55
|
+
* Full validation chain for request
|
|
56
|
+
* @param request - Post request
|
|
57
|
+
* @returns Object with platform and accountConfig
|
|
58
|
+
* @throws BadRequestException on validation failure
|
|
59
|
+
*/
|
|
60
|
+
protected validateRequest(request: PostRequestDto): {
|
|
61
|
+
platform: IPlatform;
|
|
62
|
+
accountConfig: ResolvedAccountConfig;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { BadRequestException } from '@nestjs/common';
|
|
2
|
+
/**
|
|
3
|
+
* Base service with shared logic for PostService and PreviewService
|
|
4
|
+
* Handles platform resolution, account config, and auth validation
|
|
5
|
+
*/
|
|
6
|
+
export class BasePostService {
|
|
7
|
+
appConfig;
|
|
8
|
+
platformRegistry;
|
|
9
|
+
authValidatorRegistry;
|
|
10
|
+
constructor(appConfig, platformRegistry, authValidatorRegistry) {
|
|
11
|
+
this.appConfig = appConfig;
|
|
12
|
+
this.platformRegistry = platformRegistry;
|
|
13
|
+
this.authValidatorRegistry = authValidatorRegistry;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get platform instance by name
|
|
17
|
+
* @param platformName - Platform name (e.g., 'telegram')
|
|
18
|
+
* @returns Platform instance
|
|
19
|
+
* @throws BadRequestException if platform is not found
|
|
20
|
+
*/
|
|
21
|
+
getPlatform(platformName) {
|
|
22
|
+
return this.platformRegistry.get(platformName);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get account configuration from request
|
|
26
|
+
* Supports both named accounts from config and inline auth
|
|
27
|
+
* @param request - Post request
|
|
28
|
+
* @returns Account configuration object with source indicator
|
|
29
|
+
* @throws BadRequestException if neither account nor auth is provided
|
|
30
|
+
*/
|
|
31
|
+
getAccountConfig(request) {
|
|
32
|
+
// Get base config from account or create inline config
|
|
33
|
+
let baseConfig;
|
|
34
|
+
let source;
|
|
35
|
+
if (request.account) {
|
|
36
|
+
baseConfig = this.appConfig.getAccount(request.account);
|
|
37
|
+
source = 'account';
|
|
38
|
+
}
|
|
39
|
+
else if (request.auth) {
|
|
40
|
+
// Create inline config with auth from request
|
|
41
|
+
baseConfig = {
|
|
42
|
+
platform: request.platform.toLowerCase(),
|
|
43
|
+
auth: {},
|
|
44
|
+
};
|
|
45
|
+
source = 'inline';
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
throw new BadRequestException('Either "account" or "auth" must be provided');
|
|
49
|
+
}
|
|
50
|
+
// Merge auth: request.auth fields override account auth fields
|
|
51
|
+
const mergedAuth = {
|
|
52
|
+
...baseConfig.auth,
|
|
53
|
+
...(request.auth || {}),
|
|
54
|
+
};
|
|
55
|
+
return {
|
|
56
|
+
...baseConfig,
|
|
57
|
+
auth: mergedAuth,
|
|
58
|
+
source,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Validate that platform matches account platform
|
|
63
|
+
* @param platformName - Requested platform
|
|
64
|
+
* @param accountConfig - Account configuration
|
|
65
|
+
* @throws BadRequestException if platform doesn't match
|
|
66
|
+
*/
|
|
67
|
+
validatePlatformMatch(platformName, accountConfig) {
|
|
68
|
+
if (String(accountConfig.platform).toLowerCase() !== platformName.toLowerCase()) {
|
|
69
|
+
throw new BadRequestException(`Account platform "${accountConfig.platform}" does not match requested platform "${platformName}"`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Validate auth object for the platform
|
|
74
|
+
* @param platformName - Platform name
|
|
75
|
+
* @param auth - Auth object
|
|
76
|
+
* @throws BadRequestException if auth is invalid
|
|
77
|
+
*/
|
|
78
|
+
validateAuth(platformName, auth) {
|
|
79
|
+
this.authValidatorRegistry.validate(platformName, auth);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Full validation chain for request
|
|
83
|
+
* @param request - Post request
|
|
84
|
+
* @returns Object with platform and accountConfig
|
|
85
|
+
* @throws BadRequestException on validation failure
|
|
86
|
+
*/
|
|
87
|
+
validateRequest(request) {
|
|
88
|
+
const platformName = request.platform?.toLowerCase();
|
|
89
|
+
if (!platformName) {
|
|
90
|
+
throw new BadRequestException("Field 'platform' is required");
|
|
91
|
+
}
|
|
92
|
+
const platform = this.getPlatform(platformName);
|
|
93
|
+
const accountConfig = this.getAccountConfig(request);
|
|
94
|
+
this.validatePlatformMatch(platformName, accountConfig);
|
|
95
|
+
this.validateAuth(platformName, accountConfig.auth);
|
|
96
|
+
return { platform, accountConfig };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=base-post.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-post.service.js","sourceRoot":"","sources":["../../../../src/modules/post/base-post.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAU,MAAM,gBAAgB,CAAC;AAgB7D;;;GAGG;AACH,MAAM,OAAgB,eAAe;IAId;IACA;IACA;IAHrB,YACqB,SAA2B,EAC3B,gBAAkC,EAClC,qBAA4C;QAF5C,cAAS,GAAT,SAAS,CAAkB;QAC3B,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,0BAAqB,GAArB,qBAAqB,CAAuB;IAC7D,CAAC;IAEL;;;;;OAKG;IACO,WAAW,CAAC,YAAoB;QACxC,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IAED;;;;;;OAMG;IACO,gBAAgB,CAAC,OAAuB;QAChD,uDAAuD;QACvD,IAAI,UAAyB,CAAC;QAC9B,IAAI,MAA4B,CAAC;QAEjC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACxB,8CAA8C;YAC9C,UAAU,GAAG;gBACX,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE;gBACxC,IAAI,EAAE,EAAE;aACT,CAAC;YACF,MAAM,GAAG,QAAQ,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,mBAAmB,CAAC,6CAA6C,CAAC,CAAC;QAC/E,CAAC;QAED,+DAA+D;QAC/D,MAAM,UAAU,GAAG;YACjB,GAAG,UAAU,CAAC,IAAI;YAClB,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;SACxB,CAAC;QAEF,OAAO;YACL,GAAG,UAAU;YACb,IAAI,EAAE,UAAU;YAChB,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACO,qBAAqB,CAAC,YAAoB,EAAE,aAA4B;QAChF,IAAI,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;YAChF,MAAM,IAAI,mBAAmB,CAC3B,qBAAqB,aAAa,CAAC,QAAQ,wCAAwC,YAAY,GAAG,CACnG,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACO,YAAY,CAAC,YAAoB,EAAE,IAAyB;QACpE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IAID;;;;;OAKG;IACO,eAAe,CAAC,OAAuB;QAI/C,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;QACrD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,mBAAmB,CAAC,8BAA8B,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAErD,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAExD,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QAEpD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/modules/post/dto/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC"}
|