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,15 @@
|
|
|
1
|
+
export declare class MediaService {
|
|
2
|
+
/**
|
|
3
|
+
* Validate a single media URL
|
|
4
|
+
* Ensures the URL is well-formed and uses HTTP/HTTPS protocol
|
|
5
|
+
* @param url - URL to validate
|
|
6
|
+
* @throws BadRequestException if URL is invalid or uses unsupported protocol
|
|
7
|
+
*/
|
|
8
|
+
validateMediaUrl(url: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* Validate multiple media URLs
|
|
11
|
+
* @param urls - Array of URLs to validate
|
|
12
|
+
* @throws BadRequestException if any URL is invalid
|
|
13
|
+
*/
|
|
14
|
+
validateMediaUrls(urls: string[]): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
import { Injectable, BadRequestException } from '@nestjs/common';
|
|
8
|
+
let MediaService = class MediaService {
|
|
9
|
+
/**
|
|
10
|
+
* Validate a single media URL
|
|
11
|
+
* Ensures the URL is well-formed and uses HTTP/HTTPS protocol
|
|
12
|
+
* @param url - URL to validate
|
|
13
|
+
* @throws BadRequestException if URL is invalid or uses unsupported protocol
|
|
14
|
+
*/
|
|
15
|
+
validateMediaUrl(url) {
|
|
16
|
+
if (!url) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const parsedUrl = new URL(url);
|
|
21
|
+
// Only HTTP and HTTPS protocols are allowed
|
|
22
|
+
if (!['http:', 'https:'].includes(parsedUrl.protocol)) {
|
|
23
|
+
throw new BadRequestException(`Invalid media URL protocol: ${parsedUrl.protocol}. Only HTTP and HTTPS are allowed.`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error instanceof BadRequestException) {
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
throw new BadRequestException(`Invalid media URL format: ${url}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Validate multiple media URLs
|
|
35
|
+
* @param urls - Array of URLs to validate
|
|
36
|
+
* @throws BadRequestException if any URL is invalid
|
|
37
|
+
*/
|
|
38
|
+
validateMediaUrls(urls) {
|
|
39
|
+
if (!urls || urls.length === 0) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
urls.forEach(url => this.validateMediaUrl(url));
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
MediaService = __decorate([
|
|
46
|
+
Injectable()
|
|
47
|
+
], MediaService);
|
|
48
|
+
export { MediaService };
|
|
49
|
+
//# sourceMappingURL=media.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.service.js","sourceRoot":"","sources":["../../../../src/modules/media/media.service.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,IAAM,YAAY,GAAlB,MAAM,YAAY;IACvB;;;;;OAKG;IACH,gBAAgB,CAAC,GAAW;QAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAE/B,4CAA4C;YAC5C,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,mBAAmB,CAC3B,+BAA+B,SAAS,CAAC,QAAQ,oCAAoC,CACtF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;gBACzC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,mBAAmB,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,IAAc;QAC9B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;CACF,CAAA;AAzCY,YAAY;IADxB,UAAU,EAAE;GACA,YAAY,CAyCxB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { IAuthValidator } from './auth-validator.interface.js';
|
|
2
|
+
/**
|
|
3
|
+
* Registry for provider-specific auth validators
|
|
4
|
+
*/
|
|
5
|
+
export declare class AuthValidatorRegistry {
|
|
6
|
+
private readonly validators;
|
|
7
|
+
/**
|
|
8
|
+
* Register an auth validator
|
|
9
|
+
* @param validator - Auth validator instance
|
|
10
|
+
*/
|
|
11
|
+
register(validator: IAuthValidator): void;
|
|
12
|
+
/**
|
|
13
|
+
* Validate auth object for a specific provider
|
|
14
|
+
* @param platform - Platform name
|
|
15
|
+
* @param auth - Auth object to validate
|
|
16
|
+
* @throws BadRequestException if validation fails
|
|
17
|
+
*/
|
|
18
|
+
validate(platform: string, auth: Record<string, any>): void;
|
|
19
|
+
/**
|
|
20
|
+
* Check if validator exists for platform
|
|
21
|
+
* @param platform - Platform name
|
|
22
|
+
* @returns True if validator is registered
|
|
23
|
+
*/
|
|
24
|
+
has(platform: string): boolean;
|
|
25
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
import { Injectable, BadRequestException } from '@nestjs/common';
|
|
8
|
+
/**
|
|
9
|
+
* Registry for provider-specific auth validators
|
|
10
|
+
*/
|
|
11
|
+
let AuthValidatorRegistry = class AuthValidatorRegistry {
|
|
12
|
+
validators = new Map();
|
|
13
|
+
/**
|
|
14
|
+
* Register an auth validator
|
|
15
|
+
* @param validator - Auth validator instance
|
|
16
|
+
*/
|
|
17
|
+
register(validator) {
|
|
18
|
+
this.validators.set(validator.providerName.toLowerCase(), validator);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validate auth object for a specific provider
|
|
22
|
+
* @param platform - Platform name
|
|
23
|
+
* @param auth - Auth object to validate
|
|
24
|
+
* @throws BadRequestException if validation fails
|
|
25
|
+
*/
|
|
26
|
+
validate(platform, auth) {
|
|
27
|
+
const validator = this.validators.get(platform.toLowerCase());
|
|
28
|
+
if (!validator) {
|
|
29
|
+
// No validator registered - skip validation
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const errors = validator.validate(auth);
|
|
33
|
+
if (errors.length > 0) {
|
|
34
|
+
throw new BadRequestException(errors.join('; '));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if validator exists for platform
|
|
39
|
+
* @param platform - Platform name
|
|
40
|
+
* @returns True if validator is registered
|
|
41
|
+
*/
|
|
42
|
+
has(platform) {
|
|
43
|
+
return this.validators.has(platform.toLowerCase());
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
AuthValidatorRegistry = __decorate([
|
|
47
|
+
Injectable()
|
|
48
|
+
], AuthValidatorRegistry);
|
|
49
|
+
export { AuthValidatorRegistry };
|
|
50
|
+
//# sourceMappingURL=auth-validator-registry.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-validator-registry.service.js","sourceRoot":"","sources":["../../../../../src/modules/platforms/base/auth-validator-registry.service.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGjE;;GAEG;AAEI,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACf,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEhE;;;OAGG;IACH,QAAQ,CAAC,SAAyB;QAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,CAAC;IACvE,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,QAAgB,EAAE,IAAyB;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,4CAA4C;YAC5C,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACrD,CAAC;CACF,CAAA;AAtCY,qBAAqB;IADjC,UAAU,EAAE;GACA,qBAAqB,CAsCjC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interface for provider-specific auth validation
|
|
3
|
+
* Each provider implements its own validation logic
|
|
4
|
+
*/
|
|
5
|
+
export interface IAuthValidator {
|
|
6
|
+
/**
|
|
7
|
+
* Provider name this validator is for
|
|
8
|
+
*/
|
|
9
|
+
readonly providerName: string;
|
|
10
|
+
/**
|
|
11
|
+
* Validate auth object for the provider
|
|
12
|
+
* @param auth - Auth object to validate
|
|
13
|
+
* @returns Array of error messages (empty if valid)
|
|
14
|
+
*/
|
|
15
|
+
validate(auth: Record<string, any>): string[];
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-validator.interface.js","sourceRoot":"","sources":["../../../../../src/modules/platforms/base/auth-validator.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/modules/platforms/base/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { IPlatform } from './platform.interface.js';
|
|
2
|
+
/**
|
|
3
|
+
* Registry for managing platform instances
|
|
4
|
+
* Simplifies adding new platforms and eliminates switch-case duplication
|
|
5
|
+
*/
|
|
6
|
+
export declare class PlatformRegistry {
|
|
7
|
+
private readonly platforms;
|
|
8
|
+
/**
|
|
9
|
+
* Register a platform instance
|
|
10
|
+
* @param platform - Platform instance to register
|
|
11
|
+
*/
|
|
12
|
+
register(platform: IPlatform): void;
|
|
13
|
+
/**
|
|
14
|
+
* Get platform by name
|
|
15
|
+
* @param platformName - Platform name (e.g., 'telegram')
|
|
16
|
+
* @returns Platform instance
|
|
17
|
+
* @throws BadRequestException if platform is not found
|
|
18
|
+
*/
|
|
19
|
+
get(platformName: string): IPlatform;
|
|
20
|
+
/**
|
|
21
|
+
* Check if platform exists
|
|
22
|
+
* @param platformName - Platform name
|
|
23
|
+
* @returns True if platform is registered
|
|
24
|
+
*/
|
|
25
|
+
has(platformName: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Get all registered platform names
|
|
28
|
+
* @returns Array of platform names
|
|
29
|
+
*/
|
|
30
|
+
getRegisteredPlatforms(): string[];
|
|
31
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
import { Injectable, BadRequestException } from '@nestjs/common';
|
|
8
|
+
/**
|
|
9
|
+
* Registry for managing platform instances
|
|
10
|
+
* Simplifies adding new platforms and eliminates switch-case duplication
|
|
11
|
+
*/
|
|
12
|
+
let PlatformRegistry = class PlatformRegistry {
|
|
13
|
+
platforms = new Map();
|
|
14
|
+
/**
|
|
15
|
+
* Register a platform instance
|
|
16
|
+
* @param platform - Platform instance to register
|
|
17
|
+
*/
|
|
18
|
+
register(platform) {
|
|
19
|
+
this.platforms.set(platform.name.toLowerCase(), platform);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get platform by name
|
|
23
|
+
* @param platformName - Platform name (e.g., 'telegram')
|
|
24
|
+
* @returns Platform instance
|
|
25
|
+
* @throws BadRequestException if platform is not found
|
|
26
|
+
*/
|
|
27
|
+
get(platformName) {
|
|
28
|
+
const platform = this.platforms.get(platformName.toLowerCase());
|
|
29
|
+
if (!platform) {
|
|
30
|
+
throw new BadRequestException(`Platform "${platformName}" is not supported`);
|
|
31
|
+
}
|
|
32
|
+
return platform;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if platform exists
|
|
36
|
+
* @param platformName - Platform name
|
|
37
|
+
* @returns True if platform is registered
|
|
38
|
+
*/
|
|
39
|
+
has(platformName) {
|
|
40
|
+
return this.platforms.has(platformName.toLowerCase());
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get all registered platform names
|
|
44
|
+
* @returns Array of platform names
|
|
45
|
+
*/
|
|
46
|
+
getRegisteredPlatforms() {
|
|
47
|
+
return Array.from(this.platforms.keys());
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
PlatformRegistry = __decorate([
|
|
51
|
+
Injectable()
|
|
52
|
+
], PlatformRegistry);
|
|
53
|
+
export { PlatformRegistry };
|
|
54
|
+
//# sourceMappingURL=platform-registry.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-registry.service.js","sourceRoot":"","sources":["../../../../../src/modules/platforms/base/platform-registry.service.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGjE;;;GAGG;AAEI,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IACV,SAAS,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE1D;;;OAGG;IACH,QAAQ,CAAC,QAAmB;QAC1B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,YAAoB;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,mBAAmB,CAAC,aAAa,YAAY,oBAAoB,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,YAAoB;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,sBAAsB;QACpB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;CACF,CAAA;AAzCY,gBAAgB;IAD5B,UAAU,EAAE;GACA,gBAAgB,CAyC5B"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { PostType } from '../../../common/enums/index.js';
|
|
2
|
+
import type { PostRequestDto, PreviewResponseDto, PreviewErrorResponseDto } from '../../post/dto/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Response from platform after successful publication
|
|
5
|
+
*/
|
|
6
|
+
export interface PlatformPublishResponse {
|
|
7
|
+
/** Platform-specific post ID */
|
|
8
|
+
postId: string;
|
|
9
|
+
/** Public URL to the post (if available) */
|
|
10
|
+
url?: string;
|
|
11
|
+
/** Raw response from platform API */
|
|
12
|
+
raw?: Record<string, any>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Platform interface that all social media platforms must implement
|
|
16
|
+
* Defines the contract for publishing and previewing posts
|
|
17
|
+
*/
|
|
18
|
+
export interface IPlatform {
|
|
19
|
+
/** Platform name (e.g., 'telegram') */
|
|
20
|
+
readonly name: string;
|
|
21
|
+
/** List of supported post types */
|
|
22
|
+
readonly supportedTypes: PostType[];
|
|
23
|
+
/** Whether the platform supports cover image with other media (e.g. video cover) */
|
|
24
|
+
readonly supportsCoverWithMedia?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Publish a post to the platform
|
|
27
|
+
* @param request - Post request data
|
|
28
|
+
* @param accountConfig - Account configuration
|
|
29
|
+
* @returns Publication result with post ID and URL
|
|
30
|
+
*/
|
|
31
|
+
publish(request: PostRequestDto, accountConfig: any, abortSignal?: AbortSignal): Promise<PlatformPublishResponse>;
|
|
32
|
+
/**
|
|
33
|
+
* Preview a post without publishing
|
|
34
|
+
* @param request - Post request data
|
|
35
|
+
* @param accountConfig - Account configuration
|
|
36
|
+
* @returns Preview result with validation and conversion details
|
|
37
|
+
*/
|
|
38
|
+
preview(request: PostRequestDto, accountConfig: any): Promise<PreviewResponseDto | PreviewErrorResponseDto>;
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.interface.js","sourceRoot":"","sources":["../../../../../src/modules/platforms/base/platform.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import { TelegramPlatform } from './telegram/telegram.platform.js';
|
|
3
|
+
import { TelegramAuthValidator } from './telegram/telegram-auth.validator.js';
|
|
4
|
+
import { PlatformRegistry } from './base/platform-registry.service.js';
|
|
5
|
+
import { AuthValidatorRegistry } from './base/auth-validator-registry.service.js';
|
|
6
|
+
export declare class PlatformsModule implements OnModuleInit {
|
|
7
|
+
private readonly platformRegistry;
|
|
8
|
+
private readonly authValidatorRegistry;
|
|
9
|
+
private readonly telegramPlatform;
|
|
10
|
+
private readonly telegramAuthValidator;
|
|
11
|
+
constructor(platformRegistry: PlatformRegistry, authValidatorRegistry: AuthValidatorRegistry, telegramPlatform: TelegramPlatform, telegramAuthValidator: TelegramAuthValidator);
|
|
12
|
+
onModuleInit(): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
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
|
+
import { Module } from '@nestjs/common';
|
|
11
|
+
import { TelegramPlatform } from './telegram/telegram.platform.js';
|
|
12
|
+
import { MediaModule } from '../media/media.module.js';
|
|
13
|
+
import { TelegramTypeDetector } from './telegram/telegram-type-detector.service.js';
|
|
14
|
+
import { TelegramAuthValidator } from './telegram/telegram-auth.validator.js';
|
|
15
|
+
import { PlatformRegistry } from './base/platform-registry.service.js';
|
|
16
|
+
import { AuthValidatorRegistry } from './base/auth-validator-registry.service.js';
|
|
17
|
+
let PlatformsModule = class PlatformsModule {
|
|
18
|
+
platformRegistry;
|
|
19
|
+
authValidatorRegistry;
|
|
20
|
+
telegramPlatform;
|
|
21
|
+
telegramAuthValidator;
|
|
22
|
+
constructor(platformRegistry, authValidatorRegistry, telegramPlatform, telegramAuthValidator) {
|
|
23
|
+
this.platformRegistry = platformRegistry;
|
|
24
|
+
this.authValidatorRegistry = authValidatorRegistry;
|
|
25
|
+
this.telegramPlatform = telegramPlatform;
|
|
26
|
+
this.telegramAuthValidator = telegramAuthValidator;
|
|
27
|
+
}
|
|
28
|
+
onModuleInit() {
|
|
29
|
+
// Register platforms
|
|
30
|
+
this.platformRegistry.register(this.telegramPlatform);
|
|
31
|
+
// Register auth validators
|
|
32
|
+
this.authValidatorRegistry.register(this.telegramAuthValidator);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
PlatformsModule = __decorate([
|
|
36
|
+
Module({
|
|
37
|
+
imports: [MediaModule],
|
|
38
|
+
providers: [
|
|
39
|
+
PlatformRegistry,
|
|
40
|
+
AuthValidatorRegistry,
|
|
41
|
+
TelegramPlatform,
|
|
42
|
+
TelegramTypeDetector,
|
|
43
|
+
TelegramAuthValidator,
|
|
44
|
+
],
|
|
45
|
+
exports: [
|
|
46
|
+
PlatformRegistry,
|
|
47
|
+
AuthValidatorRegistry,
|
|
48
|
+
TelegramPlatform,
|
|
49
|
+
TelegramTypeDetector,
|
|
50
|
+
MediaModule,
|
|
51
|
+
],
|
|
52
|
+
}),
|
|
53
|
+
__metadata("design:paramtypes", [PlatformRegistry,
|
|
54
|
+
AuthValidatorRegistry,
|
|
55
|
+
TelegramPlatform,
|
|
56
|
+
TelegramAuthValidator])
|
|
57
|
+
], PlatformsModule);
|
|
58
|
+
export { PlatformsModule };
|
|
59
|
+
//# sourceMappingURL=platforms.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platforms.module.js","sourceRoot":"","sources":["../../../../src/modules/platforms/platforms.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAgB,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAmB3E,IAAM,eAAe,GAArB,MAAM,eAAe;IAEP;IACA;IACA;IACA;IAJnB,YACmB,gBAAkC,EAClC,qBAA4C,EAC5C,gBAAkC,EAClC,qBAA4C;QAH5C,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,0BAAqB,GAArB,qBAAqB,CAAuB;IAC5D,CAAC;IAEJ,YAAY;QACV,qBAAqB;QACrB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAEtD,2BAA2B;QAC3B,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClE,CAAC;CACF,CAAA;AAfY,eAAe;IAjB3B,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,WAAW,CAAC;QACtB,SAAS,EAAE;YACT,gBAAgB;YAChB,qBAAqB;YACrB,gBAAgB;YAChB,oBAAoB;YACpB,qBAAqB;SACtB;QACD,OAAO,EAAE;YACP,gBAAgB;YAChB,qBAAqB;YACrB,gBAAgB;YAChB,oBAAoB;YACpB,WAAW;SACZ;KACF,CAAC;qCAGqC,gBAAgB;QACX,qBAAqB;QAC1B,gBAAgB;QACX,qBAAqB;GALpD,eAAe,CAe3B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { IAuthValidator } from '../base/auth-validator.interface.js';
|
|
2
|
+
/**
|
|
3
|
+
* Telegram-specific auth validator
|
|
4
|
+
* Validates apiKey presence and format
|
|
5
|
+
*/
|
|
6
|
+
export declare class TelegramAuthValidator implements IAuthValidator {
|
|
7
|
+
readonly providerName = "telegram";
|
|
8
|
+
/**
|
|
9
|
+
* Validate Telegram auth object
|
|
10
|
+
* @param auth - Auth object with apiKey
|
|
11
|
+
* @returns Array of error messages (empty if valid)
|
|
12
|
+
*/
|
|
13
|
+
validate(auth: Record<string, any>): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Check if apiKey (bot token) has valid format
|
|
16
|
+
* Telegram bot tokens have format: 123456789:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
|
|
17
|
+
*/
|
|
18
|
+
private isValidBotToken;
|
|
19
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
import { Injectable } from '@nestjs/common';
|
|
8
|
+
/**
|
|
9
|
+
* Telegram-specific auth validator
|
|
10
|
+
* Validates apiKey presence and format
|
|
11
|
+
*/
|
|
12
|
+
let TelegramAuthValidator = class TelegramAuthValidator {
|
|
13
|
+
providerName = 'telegram';
|
|
14
|
+
/**
|
|
15
|
+
* Validate Telegram auth object
|
|
16
|
+
* @param auth - Auth object with apiKey
|
|
17
|
+
* @returns Array of error messages (empty if valid)
|
|
18
|
+
*/
|
|
19
|
+
validate(auth) {
|
|
20
|
+
const errors = [];
|
|
21
|
+
if (!auth) {
|
|
22
|
+
errors.push('Auth object is required for Telegram');
|
|
23
|
+
return errors;
|
|
24
|
+
}
|
|
25
|
+
// Validate apiKey
|
|
26
|
+
if (!auth.apiKey) {
|
|
27
|
+
errors.push("Field 'apiKey' is required for Telegram auth");
|
|
28
|
+
}
|
|
29
|
+
else if (typeof auth.apiKey !== 'string') {
|
|
30
|
+
errors.push("Field 'apiKey' must be a string");
|
|
31
|
+
}
|
|
32
|
+
else if (!this.isValidBotToken(auth.apiKey)) {
|
|
33
|
+
errors.push("Field 'apiKey' has invalid format (expected: 123456789:ABC-DEF...)");
|
|
34
|
+
}
|
|
35
|
+
return errors;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if apiKey (bot token) has valid format
|
|
39
|
+
* Telegram bot tokens have format: 123456789:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
|
|
40
|
+
*/
|
|
41
|
+
isValidBotToken(token) {
|
|
42
|
+
// Basic format check: number:alphanumeric-string
|
|
43
|
+
const tokenRegex = /^\d+:[A-Za-z0-9_-]+$/;
|
|
44
|
+
return tokenRegex.test(token);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
TelegramAuthValidator = __decorate([
|
|
48
|
+
Injectable()
|
|
49
|
+
], TelegramAuthValidator);
|
|
50
|
+
export { TelegramAuthValidator };
|
|
51
|
+
//# sourceMappingURL=telegram-auth.validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-auth.validator.js","sourceRoot":"","sources":["../../../../../src/modules/platforms/telegram/telegram-auth.validator.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG5C;;;GAGG;AAEI,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACvB,YAAY,GAAG,UAAU,CAAC;IAEnC;;;;OAIG;IACH,QAAQ,CAAC,IAAyB;QAChC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QACpF,CAAC;QAID,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,KAAa;QACnC,iDAAiD;QACjD,MAAM,UAAU,GAAG,sBAAsB,CAAC;QAC1C,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;CACF,CAAA;AAvCY,qBAAqB;IADjC,UAAU,EAAE;GACA,qBAAqB,CAuCjC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PostRequestDto } from '../../post/dto/index.js';
|
|
2
|
+
import { PostType } from '../../../common/enums/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Service for determining message type for Telegram
|
|
5
|
+
*/
|
|
6
|
+
export declare class TelegramTypeDetector {
|
|
7
|
+
/**
|
|
8
|
+
* Determine Telegram message type based on request data
|
|
9
|
+
* Priority order:
|
|
10
|
+
* 1. media[] -> ALBUM
|
|
11
|
+
* 2. document -> DOCUMENT
|
|
12
|
+
* 3. audio -> AUDIO
|
|
13
|
+
* 4. video -> VIDEO
|
|
14
|
+
* 5. cover -> IMAGE
|
|
15
|
+
* 6. no media -> POST
|
|
16
|
+
*/
|
|
17
|
+
detectType(request: PostRequestDto): PostType;
|
|
18
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
import { Injectable } from '@nestjs/common';
|
|
8
|
+
import { PostType } from '../../../common/enums/index.js';
|
|
9
|
+
import { MediaInputHelper } from '../../../common/helpers/media-input.helper.js';
|
|
10
|
+
import { MediaPriorityValidator } from '../../../common/validators/media-priority.validator.js';
|
|
11
|
+
/**
|
|
12
|
+
* Service for determining message type for Telegram
|
|
13
|
+
*/
|
|
14
|
+
let TelegramTypeDetector = class TelegramTypeDetector {
|
|
15
|
+
/**
|
|
16
|
+
* Determine Telegram message type based on request data
|
|
17
|
+
* Priority order:
|
|
18
|
+
* 1. media[] -> ALBUM
|
|
19
|
+
* 2. document -> DOCUMENT
|
|
20
|
+
* 3. audio -> AUDIO
|
|
21
|
+
* 4. video -> VIDEO
|
|
22
|
+
* 5. cover -> IMAGE
|
|
23
|
+
* 6. no media -> POST
|
|
24
|
+
*/
|
|
25
|
+
detectType(request) {
|
|
26
|
+
// If type is explicitly set and not AUTO, return it
|
|
27
|
+
if (request.type && request.type !== PostType.AUTO) {
|
|
28
|
+
return request.type;
|
|
29
|
+
}
|
|
30
|
+
// Priority 1-4: Check primary media fields (ALBUM, DOCUMENT, AUDIO, VIDEO)
|
|
31
|
+
const primaryType = MediaPriorityValidator.detectPrimaryMediaField(request);
|
|
32
|
+
if (primaryType) {
|
|
33
|
+
return primaryType;
|
|
34
|
+
}
|
|
35
|
+
// Priority 5: cover -> IMAGE
|
|
36
|
+
if (MediaInputHelper.isDefined(request.cover)) {
|
|
37
|
+
return PostType.IMAGE;
|
|
38
|
+
}
|
|
39
|
+
// Priority 6: no media -> POST
|
|
40
|
+
return PostType.POST;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
TelegramTypeDetector = __decorate([
|
|
44
|
+
Injectable()
|
|
45
|
+
], TelegramTypeDetector);
|
|
46
|
+
export { TelegramTypeDetector };
|
|
47
|
+
//# sourceMappingURL=telegram-type-detector.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-type-detector.service.js","sourceRoot":"","sources":["../../../../../src/modules/platforms/telegram/telegram-type-detector.service.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,wDAAwD,CAAC;AAEhG;;GAEG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAC/B;;;;;;;;;OASG;IACH,UAAU,CAAC,OAAuB;QAChC,oDAAoD;QACpD,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnD,OAAO,OAAO,CAAC,IAAI,CAAC;QACtB,CAAC;QAED,2EAA2E;QAC3E,MAAM,WAAW,GAAG,sBAAsB,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAC5E,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,6BAA6B;QAC7B,IAAI,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,OAAO,QAAQ,CAAC,KAAK,CAAC;QACxB,CAAC;QAED,+BAA+B;QAC/B,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CACF,CAAA;AA/BY,oBAAoB;IADhC,UAAU,EAAE;GACA,oBAAoB,CA+BhC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { IPlatform, PlatformPublishResponse } from '../base/platform.interface.js';
|
|
2
|
+
import { PostType } from '../../../common/enums/index.js';
|
|
3
|
+
import { PostRequestDto, PreviewResponseDto, PreviewErrorResponseDto } from '../../post/dto/index.js';
|
|
4
|
+
import { MediaService } from '../../media/media.service.js';
|
|
5
|
+
import { TelegramTypeDetector } from './telegram-type-detector.service.js';
|
|
6
|
+
import type { AccountConfig } from '../../app-config/interfaces/app-config.interface.js';
|
|
7
|
+
export interface TelegramAccountConfig extends AccountConfig {
|
|
8
|
+
/** Whether to disable notifications for this account by default */
|
|
9
|
+
disableNotification?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare class TelegramPlatform implements IPlatform {
|
|
12
|
+
private readonly mediaService;
|
|
13
|
+
private readonly typeDetector;
|
|
14
|
+
readonly name = "telegram";
|
|
15
|
+
readonly supportedTypes: PostType[];
|
|
16
|
+
readonly supportsCoverWithMedia = false;
|
|
17
|
+
private readonly logger;
|
|
18
|
+
private readonly MAX_MEDIA_GROUP_SIZE;
|
|
19
|
+
constructor(mediaService: MediaService, typeDetector: TelegramTypeDetector);
|
|
20
|
+
publish(request: PostRequestDto, accountConfig: TelegramAccountConfig, abortSignal?: AbortSignal): Promise<PlatformPublishResponse>;
|
|
21
|
+
preview(request: PostRequestDto, accountConfig: TelegramAccountConfig): Promise<PreviewResponseDto | PreviewErrorResponseDto>;
|
|
22
|
+
private validateRequest;
|
|
23
|
+
/**
|
|
24
|
+
* Prepares message data for sending to Telegram.
|
|
25
|
+
* Maps bodyFormat to parse_mode without converting the body content.
|
|
26
|
+
* Body is sent as-is to Telegram API.
|
|
27
|
+
*
|
|
28
|
+
* Standard formats (text, html, md) are mapped to Telegram parse_mode.
|
|
29
|
+
* Custom values (e.g., MarkdownV2) are passed as-is.
|
|
30
|
+
* If parse_mode is specified in options, it overrides bodyFormat mapping.
|
|
31
|
+
*/
|
|
32
|
+
private prepareMessageData;
|
|
33
|
+
/**
|
|
34
|
+
* Resolve Telegram chat identifier from request and account configuration.
|
|
35
|
+
*
|
|
36
|
+
* Priority:
|
|
37
|
+
* 1. request.channelId
|
|
38
|
+
* 2. accountConfig.channelId (from config.yaml)
|
|
39
|
+
* 3. accountConfig.auth.chatId (legacy, for backward compatibility)
|
|
40
|
+
*/
|
|
41
|
+
private resolveChatId;
|
|
42
|
+
private sendMessage;
|
|
43
|
+
private sendPhoto;
|
|
44
|
+
private sendVideo;
|
|
45
|
+
private sendAudio;
|
|
46
|
+
private sendDocument;
|
|
47
|
+
private sendMediaGroup;
|
|
48
|
+
/**
|
|
49
|
+
* Map MediaType to Telegram media group type
|
|
50
|
+
* Falls back to URL extension detection if no explicit type provided
|
|
51
|
+
*/
|
|
52
|
+
private mapMediaTypeToTelegram;
|
|
53
|
+
private getRequiredFieldsErrors;
|
|
54
|
+
private getMediaUrlErrors;
|
|
55
|
+
private getIgnoredFieldsWarnings;
|
|
56
|
+
private getIgnoredMediaWarnings;
|
|
57
|
+
private buildPostUrl;
|
|
58
|
+
}
|