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.
Files changed (157) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1003 -0
  3. package/dist/src/app.constants.d.ts +8 -0
  4. package/dist/src/app.constants.js +9 -0
  5. package/dist/src/app.constants.js.map +1 -0
  6. package/dist/src/common/enums/body-format.enum.d.ts +12 -0
  7. package/dist/src/common/enums/body-format.enum.js +14 -0
  8. package/dist/src/common/enums/body-format.enum.js.map +1 -0
  9. package/dist/src/common/enums/error-code.enum.d.ts +12 -0
  10. package/dist/src/common/enums/error-code.enum.js +14 -0
  11. package/dist/src/common/enums/error-code.enum.js.map +1 -0
  12. package/dist/src/common/enums/index.d.ts +3 -0
  13. package/dist/src/common/enums/index.js +4 -0
  14. package/dist/src/common/enums/index.js.map +1 -0
  15. package/dist/src/common/enums/post-type.enum.d.ts +28 -0
  16. package/dist/src/common/enums/post-type.enum.js +30 -0
  17. package/dist/src/common/enums/post-type.enum.js.map +1 -0
  18. package/dist/src/common/filters/all-exceptions.filter.d.ts +13 -0
  19. package/dist/src/common/filters/all-exceptions.filter.js +103 -0
  20. package/dist/src/common/filters/all-exceptions.filter.js.map +1 -0
  21. package/dist/src/common/helpers/media-input.helper.d.ts +73 -0
  22. package/dist/src/common/helpers/media-input.helper.js +122 -0
  23. package/dist/src/common/helpers/media-input.helper.js.map +1 -0
  24. package/dist/src/common/interceptors/shutdown.interceptor.d.ts +12 -0
  25. package/dist/src/common/interceptors/shutdown.interceptor.js +41 -0
  26. package/dist/src/common/interceptors/shutdown.interceptor.js.map +1 -0
  27. package/dist/src/common/interfaces/logger.interface.d.ts +44 -0
  28. package/dist/src/common/interfaces/logger.interface.js +44 -0
  29. package/dist/src/common/interfaces/logger.interface.js.map +1 -0
  30. package/dist/src/common/services/shutdown.module.d.ts +2 -0
  31. package/dist/src/common/services/shutdown.module.js +18 -0
  32. package/dist/src/common/services/shutdown.module.js.map +1 -0
  33. package/dist/src/common/services/shutdown.service.d.ts +40 -0
  34. package/dist/src/common/services/shutdown.service.js +122 -0
  35. package/dist/src/common/services/shutdown.service.js.map +1 -0
  36. package/dist/src/common/types/index.d.ts +1 -0
  37. package/dist/src/common/types/index.js +2 -0
  38. package/dist/src/common/types/index.js.map +1 -0
  39. package/dist/src/common/types/media-input.type.d.ts +29 -0
  40. package/dist/src/common/types/media-input.type.js +2 -0
  41. package/dist/src/common/types/media-input.type.js.map +1 -0
  42. package/dist/src/common/validators/body-length.validator.d.ts +24 -0
  43. package/dist/src/common/validators/body-length.validator.js +57 -0
  44. package/dist/src/common/validators/body-length.validator.js.map +1 -0
  45. package/dist/src/common/validators/channel-id.validator.d.ts +19 -0
  46. package/dist/src/common/validators/channel-id.validator.js +58 -0
  47. package/dist/src/common/validators/channel-id.validator.js.map +1 -0
  48. package/dist/src/common/validators/has-content.validator.d.ts +23 -0
  49. package/dist/src/common/validators/has-content.validator.js +57 -0
  50. package/dist/src/common/validators/has-content.validator.js.map +1 -0
  51. package/dist/src/common/validators/media-input.validator.d.ts +44 -0
  52. package/dist/src/common/validators/media-input.validator.js +112 -0
  53. package/dist/src/common/validators/media-input.validator.js.map +1 -0
  54. package/dist/src/common/validators/media-priority.validator.d.ts +19 -0
  55. package/dist/src/common/validators/media-priority.validator.js +38 -0
  56. package/dist/src/common/validators/media-priority.validator.js.map +1 -0
  57. package/dist/src/config/app.config.d.ts +33 -0
  58. package/dist/src/config/app.config.js +83 -0
  59. package/dist/src/config/app.config.js.map +1 -0
  60. package/dist/src/config/library.config.d.ts +51 -0
  61. package/dist/src/config/library.config.js +197 -0
  62. package/dist/src/config/library.config.js.map +1 -0
  63. package/dist/src/config/yaml-config.dto.d.ts +37 -0
  64. package/dist/src/config/yaml-config.dto.js +152 -0
  65. package/dist/src/config/yaml-config.dto.js.map +1 -0
  66. package/dist/src/config/yaml.config.d.ts +14 -0
  67. package/dist/src/config/yaml.config.js +72 -0
  68. package/dist/src/config/yaml.config.js.map +1 -0
  69. package/dist/src/index.d.ts +19 -0
  70. package/dist/src/index.js +17 -0
  71. package/dist/src/index.js.map +1 -0
  72. package/dist/src/library.d.ts +57 -0
  73. package/dist/src/library.js +92 -0
  74. package/dist/src/library.js.map +1 -0
  75. package/dist/src/modules/app-config/app-config.module.d.ts +2 -0
  76. package/dist/src/modules/app-config/app-config.module.js +26 -0
  77. package/dist/src/modules/app-config/app-config.module.js.map +1 -0
  78. package/dist/src/modules/app-config/app-config.service.d.ts +14 -0
  79. package/dist/src/modules/app-config/app-config.service.js +18 -0
  80. package/dist/src/modules/app-config/app-config.service.js.map +1 -0
  81. package/dist/src/modules/app-config/interfaces/app-config.interface.d.ts +31 -0
  82. package/dist/src/modules/app-config/interfaces/app-config.interface.js +2 -0
  83. package/dist/src/modules/app-config/interfaces/app-config.interface.js.map +1 -0
  84. package/dist/src/modules/app-config/nest-config.service.d.ts +41 -0
  85. package/dist/src/modules/app-config/nest-config.service.js +91 -0
  86. package/dist/src/modules/app-config/nest-config.service.js.map +1 -0
  87. package/dist/src/modules/health/health.controller.d.ts +12 -0
  88. package/dist/src/modules/health/health.controller.js +33 -0
  89. package/dist/src/modules/health/health.controller.js.map +1 -0
  90. package/dist/src/modules/health/health.module.d.ts +2 -0
  91. package/dist/src/modules/health/health.module.js +17 -0
  92. package/dist/src/modules/health/health.module.js.map +1 -0
  93. package/dist/src/modules/media/media.module.d.ts +2 -0
  94. package/dist/src/modules/media/media.module.js +18 -0
  95. package/dist/src/modules/media/media.module.js.map +1 -0
  96. package/dist/src/modules/media/media.service.d.ts +15 -0
  97. package/dist/src/modules/media/media.service.js +49 -0
  98. package/dist/src/modules/media/media.service.js.map +1 -0
  99. package/dist/src/modules/platforms/base/auth-validator-registry.service.d.ts +25 -0
  100. package/dist/src/modules/platforms/base/auth-validator-registry.service.js +50 -0
  101. package/dist/src/modules/platforms/base/auth-validator-registry.service.js.map +1 -0
  102. package/dist/src/modules/platforms/base/auth-validator.interface.d.ts +16 -0
  103. package/dist/src/modules/platforms/base/auth-validator.interface.js +2 -0
  104. package/dist/src/modules/platforms/base/auth-validator.interface.js.map +1 -0
  105. package/dist/src/modules/platforms/base/index.d.ts +4 -0
  106. package/dist/src/modules/platforms/base/index.js +5 -0
  107. package/dist/src/modules/platforms/base/index.js.map +1 -0
  108. package/dist/src/modules/platforms/base/platform-registry.service.d.ts +31 -0
  109. package/dist/src/modules/platforms/base/platform-registry.service.js +54 -0
  110. package/dist/src/modules/platforms/base/platform-registry.service.js.map +1 -0
  111. package/dist/src/modules/platforms/base/platform.interface.d.ts +39 -0
  112. package/dist/src/modules/platforms/base/platform.interface.js +2 -0
  113. package/dist/src/modules/platforms/base/platform.interface.js.map +1 -0
  114. package/dist/src/modules/platforms/platforms.module.d.ts +13 -0
  115. package/dist/src/modules/platforms/platforms.module.js +59 -0
  116. package/dist/src/modules/platforms/platforms.module.js.map +1 -0
  117. package/dist/src/modules/platforms/telegram/telegram-auth.validator.d.ts +19 -0
  118. package/dist/src/modules/platforms/telegram/telegram-auth.validator.js +51 -0
  119. package/dist/src/modules/platforms/telegram/telegram-auth.validator.js.map +1 -0
  120. package/dist/src/modules/platforms/telegram/telegram-type-detector.service.d.ts +18 -0
  121. package/dist/src/modules/platforms/telegram/telegram-type-detector.service.js +47 -0
  122. package/dist/src/modules/platforms/telegram/telegram-type-detector.service.js.map +1 -0
  123. package/dist/src/modules/platforms/telegram/telegram.platform.d.ts +58 -0
  124. package/dist/src/modules/platforms/telegram/telegram.platform.js +434 -0
  125. package/dist/src/modules/platforms/telegram/telegram.platform.js.map +1 -0
  126. package/dist/src/modules/post/base-post.service.d.ts +64 -0
  127. package/dist/src/modules/post/base-post.service.js +99 -0
  128. package/dist/src/modules/post/base-post.service.js.map +1 -0
  129. package/dist/src/modules/post/dto/index.d.ts +3 -0
  130. package/dist/src/modules/post/dto/index.js +4 -0
  131. package/dist/src/modules/post/dto/index.js.map +1 -0
  132. package/dist/src/modules/post/dto/post-request.dto.d.ts +56 -0
  133. package/dist/src/modules/post/dto/post-request.dto.js +195 -0
  134. package/dist/src/modules/post/dto/post-request.dto.js.map +1 -0
  135. package/dist/src/modules/post/dto/post-response.dto.d.ts +41 -0
  136. package/dist/src/modules/post/dto/post-response.dto.js +2 -0
  137. package/dist/src/modules/post/dto/post-response.dto.js.map +1 -0
  138. package/dist/src/modules/post/dto/preview-response.dto.d.ts +33 -0
  139. package/dist/src/modules/post/dto/preview-response.dto.js +2 -0
  140. package/dist/src/modules/post/dto/preview-response.dto.js.map +1 -0
  141. package/dist/src/modules/post/idempotency.service.d.ts +95 -0
  142. package/dist/src/modules/post/idempotency.service.js +229 -0
  143. package/dist/src/modules/post/idempotency.service.js.map +1 -0
  144. package/dist/src/modules/post/post.controller.d.ts +13 -0
  145. package/dist/src/modules/post/post.controller.js +97 -0
  146. package/dist/src/modules/post/post.controller.js.map +1 -0
  147. package/dist/src/modules/post/post.module.d.ts +2 -0
  148. package/dist/src/modules/post/post.module.js +25 -0
  149. package/dist/src/modules/post/post.module.js.map +1 -0
  150. package/dist/src/modules/post/post.service.d.ts +62 -0
  151. package/dist/src/modules/post/post.service.js +325 -0
  152. package/dist/src/modules/post/post.service.js.map +1 -0
  153. package/dist/src/modules/post/preview.service.d.ts +23 -0
  154. package/dist/src/modules/post/preview.service.js +69 -0
  155. package/dist/src/modules/post/preview.service.js.map +1 -0
  156. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  157. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auth-validator.interface.js.map
@@ -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,4 @@
1
+ export * from './platform.interface.js';
2
+ export * from './platform-registry.service.js';
3
+ export * from './auth-validator.interface.js';
4
+ export * from './auth-validator-registry.service.js';
@@ -0,0 +1,5 @@
1
+ export * from './platform.interface.js';
2
+ export * from './platform-registry.service.js';
3
+ export * from './auth-validator.interface.js';
4
+ export * from './auth-validator-registry.service.js';
5
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=platform.interface.js.map
@@ -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
+ }