@m5kdev/backend 0.7.0 → 0.8.2

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 (559) hide show
  1. package/dist/_virtual/_rolldown/runtime.mjs +13 -0
  2. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/api/index.d.mts +1 -0
  3. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/adapter/factory.d.mts +1 -0
  4. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/adapter/get-field-attributes.d.mts +1 -0
  5. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/adapter/get-id-field.d.mts +1 -0
  6. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/adapter/index.d.mts +1 -0
  7. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/adapter/types.d.mts +1 -0
  8. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/get-tables.d.mts +1 -0
  9. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/index.d.mts +1 -0
  10. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/account.d.mts +1 -0
  11. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/rate-limit.d.mts +1 -0
  12. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/session.d.mts +1 -0
  13. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/shared.d.mts +1 -0
  14. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/user.d.mts +1 -0
  15. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/verification.d.mts +1 -0
  16. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/index.d.mts +1 -0
  17. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/social-providers/index.d.mts +1 -0
  18. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/types/context.d.mts +1 -0
  19. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/types/helper.d.mts +7 -0
  20. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/types/init-options.d.mts +1 -0
  21. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/types/plugin-client.d.mts +1 -0
  22. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/types/plugin.d.mts +1 -0
  23. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/dialect-adapter-base.d.mts +1 -0
  24. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/dialect-adapter.d.mts +1 -0
  25. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/dialect.d.mts +1 -0
  26. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mssql/mssql-adapter.d.mts +1 -0
  27. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mssql/mssql-dialect.d.mts +1 -0
  28. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mssql/mssql-introspector.d.mts +1 -0
  29. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mysql/mysql-adapter.d.mts +1 -0
  30. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mysql/mysql-dialect.d.mts +1 -0
  31. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mysql/mysql-introspector.d.mts +1 -0
  32. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/postgres/postgres-adapter.d.mts +1 -0
  33. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/postgres/postgres-dialect.d.mts +1 -0
  34. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/postgres/postgres-introspector.d.mts +1 -0
  35. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-adapter.d.mts +1 -0
  36. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-dialect.d.mts +1 -0
  37. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-introspector.d.mts +1 -0
  38. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/expression/expression-builder.d.mts +1 -0
  39. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/index.d.mts +1 -0
  40. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/kysely.d.mts +38 -0
  41. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/migration/file-migration-provider.d.mts +1 -0
  42. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/migration/migrator.d.mts +1 -0
  43. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/binary-operation-parser.d.mts +1 -0
  44. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/delete-from-parser.d.mts +1 -0
  45. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/expression-parser.d.mts +1 -0
  46. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/group-by-parser.d.mts +1 -0
  47. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/insert-values-parser.d.mts +1 -0
  48. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/join-parser.d.mts +1 -0
  49. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/merge-into-parser.d.mts +1 -0
  50. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/reference-parser.d.mts +1 -0
  51. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/returning-parser.d.mts +1 -0
  52. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/select-from-parser.d.mts +1 -0
  53. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/select-parser.d.mts +1 -0
  54. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/set-operation-parser.d.mts +1 -0
  55. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/tuple-parser.d.mts +1 -0
  56. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/unary-operation-parser.d.mts +1 -0
  57. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/update-parser.d.mts +1 -0
  58. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/update-set-parser.d.mts +1 -0
  59. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/value-parser.d.mts +1 -0
  60. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/with-parser.d.mts +1 -0
  61. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/case-builder.d.mts +1 -0
  62. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/delete-query-builder.d.mts +1 -0
  63. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/having-interface.d.mts +1 -0
  64. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/insert-query-builder.d.mts +1 -0
  65. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/join-builder.d.mts +1 -0
  66. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/merge-query-builder.d.mts +1 -0
  67. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/on-conflict-builder.d.mts +1 -0
  68. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/output-interface.d.mts +1 -0
  69. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/returning-interface.d.mts +1 -0
  70. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/select-query-builder.d.mts +1 -0
  71. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/update-query-builder.d.mts +1 -0
  72. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/where-interface.d.mts +1 -0
  73. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-creator.d.mts +1 -0
  74. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/default-query-executor.d.mts +1 -0
  75. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/noop-query-executor.d.mts +1 -0
  76. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/query-executor-base.d.mts +1 -0
  77. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/query-executor-provider.d.mts +1 -0
  78. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/query-executor.d.mts +1 -0
  79. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/raw-builder/raw-builder.d.mts +1 -0
  80. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/raw-builder/sql.d.mts +1 -0
  81. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-add-foreign-key-constraint-builder.d.mts +1 -0
  82. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-add-index-builder.d.mts +1 -0
  83. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-builder.d.mts +1 -0
  84. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-drop-constraint-builder.d.mts +1 -0
  85. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-executor.d.mts +1 -0
  86. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-index-builder.d.mts +1 -0
  87. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-schema-builder.d.mts +1 -0
  88. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-table-builder.d.mts +1 -0
  89. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-type-builder.d.mts +1 -0
  90. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-view-builder.d.mts +1 -0
  91. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-index-builder.d.mts +1 -0
  92. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-schema-builder.d.mts +1 -0
  93. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-table-builder.d.mts +1 -0
  94. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-type-builder.d.mts +1 -0
  95. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-view-builder.d.mts +1 -0
  96. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/refresh-materialized-view-builder.d.mts +1 -0
  97. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/schema.d.mts +1 -0
  98. package/dist/src/lib/posthog.d.mts +7 -0
  99. package/dist/src/lib/posthog.mjs +7 -0
  100. package/dist/src/lib/posthog.mjs.map +1 -0
  101. package/dist/src/lib/sentry.d.mts +1 -0
  102. package/dist/src/lib/sentry.mjs +10 -0
  103. package/dist/src/lib/sentry.mjs.map +1 -0
  104. package/dist/src/modules/access/access.repository.d.mts +2352 -0
  105. package/dist/src/modules/access/access.repository.mjs +24 -0
  106. package/dist/src/modules/access/access.repository.mjs.map +1 -0
  107. package/dist/src/modules/access/access.service.d.mts +25 -0
  108. package/dist/src/modules/access/access.service.mjs +40 -0
  109. package/dist/src/modules/access/access.service.mjs.map +1 -0
  110. package/dist/src/modules/access/access.utils.d.mts +19 -0
  111. package/dist/src/modules/access/access.utils.mjs +21 -0
  112. package/dist/src/modules/access/access.utils.mjs.map +1 -0
  113. package/dist/src/modules/ai/ai.db.d.mts +401 -0
  114. package/dist/src/modules/ai/ai.db.mjs +38 -0
  115. package/dist/src/modules/ai/ai.db.mjs.map +1 -0
  116. package/dist/src/modules/ai/ai.prompt.d.mts +30 -0
  117. package/dist/src/modules/ai/ai.prompt.mjs +30 -0
  118. package/dist/src/modules/ai/ai.prompt.mjs.map +1 -0
  119. package/dist/src/modules/ai/ai.prompts.d.mts +10 -0
  120. package/dist/src/modules/ai/{ai.prompts.js → ai.prompts.mjs} +17 -15
  121. package/dist/src/modules/ai/ai.prompts.mjs.map +1 -0
  122. package/dist/src/modules/ai/ai.repository.d.mts +428 -0
  123. package/dist/src/modules/ai/ai.repository.mjs +23 -0
  124. package/dist/src/modules/ai/ai.repository.mjs.map +1 -0
  125. package/dist/src/modules/ai/ai.router.d.mts +1 -0
  126. package/dist/src/modules/ai/ai.service.d.mts +129 -0
  127. package/dist/src/modules/ai/ai.service.mjs +267 -0
  128. package/dist/src/modules/ai/ai.service.mjs.map +1 -0
  129. package/dist/src/modules/ai/ai.trpc.d.mts +31 -0
  130. package/dist/src/modules/ai/ai.trpc.mjs +17 -0
  131. package/dist/src/modules/ai/ai.trpc.mjs.map +1 -0
  132. package/dist/src/modules/ai/ideogram/ideogram.constants.d.mts +11 -0
  133. package/dist/src/modules/ai/ideogram/ideogram.constants.mjs +184 -0
  134. package/dist/src/modules/ai/ideogram/ideogram.constants.mjs.map +1 -0
  135. package/dist/src/modules/ai/ideogram/ideogram.dto.d.mts +234 -0
  136. package/dist/src/modules/ai/ideogram/ideogram.dto.mjs +45 -0
  137. package/dist/src/modules/ai/ideogram/ideogram.dto.mjs.map +1 -0
  138. package/dist/src/modules/ai/ideogram/ideogram.prompt.d.mts +7 -0
  139. package/dist/src/modules/ai/ideogram/{ideogram.prompt.js → ideogram.prompt.mjs} +861 -859
  140. package/dist/src/modules/ai/ideogram/ideogram.prompt.mjs.map +1 -0
  141. package/dist/src/modules/ai/ideogram/ideogram.repository.d.mts +11 -0
  142. package/dist/src/modules/ai/ideogram/ideogram.repository.mjs +32 -0
  143. package/dist/src/modules/ai/ideogram/ideogram.repository.mjs.map +1 -0
  144. package/dist/src/modules/ai/ideogram/ideogram.service.d.mts +14 -0
  145. package/dist/src/modules/ai/ideogram/ideogram.service.mjs +11 -0
  146. package/dist/src/modules/ai/ideogram/ideogram.service.mjs.map +1 -0
  147. package/dist/src/modules/auth/auth.db.d.mts +2341 -0
  148. package/dist/src/modules/auth/auth.db.mjs +169 -0
  149. package/dist/src/modules/auth/auth.db.mjs.map +1 -0
  150. package/dist/src/modules/auth/auth.dto.d.mts +70 -0
  151. package/dist/src/modules/auth/auth.dto.mjs +43 -0
  152. package/dist/src/modules/auth/auth.dto.mjs.map +1 -0
  153. package/dist/src/modules/auth/auth.lib.d.mts +4894 -0
  154. package/dist/src/modules/auth/auth.lib.mjs +232 -0
  155. package/dist/src/modules/auth/auth.lib.mjs.map +1 -0
  156. package/dist/src/modules/auth/auth.middleware.d.mts +619 -0
  157. package/dist/src/modules/auth/auth.middleware.mjs +38 -0
  158. package/dist/src/modules/auth/auth.middleware.mjs.map +1 -0
  159. package/dist/src/modules/auth/auth.repository.d.mts +2453 -0
  160. package/dist/src/modules/auth/auth.repository.mjs +401 -0
  161. package/dist/src/modules/auth/auth.repository.mjs.map +1 -0
  162. package/dist/src/modules/auth/auth.service.d.mts +105 -0
  163. package/dist/src/modules/auth/auth.service.mjs +227 -0
  164. package/dist/src/modules/auth/auth.service.mjs.map +1 -0
  165. package/dist/src/modules/auth/auth.trpc.d.mts +303 -0
  166. package/dist/src/modules/auth/auth.trpc.mjs +108 -0
  167. package/dist/src/modules/auth/auth.trpc.mjs.map +1 -0
  168. package/dist/src/modules/auth/auth.utils.d.mts +2356 -0
  169. package/dist/src/modules/auth/auth.utils.mjs +77 -0
  170. package/dist/src/modules/auth/auth.utils.mjs.map +1 -0
  171. package/dist/src/modules/base/base.abstract.d.mts +29 -0
  172. package/dist/src/modules/base/base.abstract.mjs +60 -0
  173. package/dist/src/modules/base/base.abstract.mjs.map +1 -0
  174. package/dist/src/modules/base/base.actor.d.mts +73 -0
  175. package/dist/src/modules/base/base.actor.mjs +78 -0
  176. package/dist/src/modules/base/base.actor.mjs.map +1 -0
  177. package/dist/src/modules/base/base.dto.d.mts +67 -0
  178. package/dist/src/modules/base/base.dto.mjs +79 -0
  179. package/dist/src/modules/base/base.dto.mjs.map +1 -0
  180. package/dist/src/modules/base/base.grants.d.mts +28 -0
  181. package/dist/src/modules/base/base.grants.mjs +103 -0
  182. package/dist/src/modules/base/base.grants.mjs.map +1 -0
  183. package/dist/src/modules/base/base.procedure.d.mts +111 -0
  184. package/dist/src/modules/base/base.procedure.mjs +252 -0
  185. package/dist/src/modules/base/base.procedure.mjs.map +1 -0
  186. package/dist/src/modules/base/base.repository.d.mts +123 -0
  187. package/dist/src/modules/base/base.repository.mjs +250 -0
  188. package/dist/src/modules/base/base.repository.mjs.map +1 -0
  189. package/dist/src/modules/base/base.service.d.mts +44 -0
  190. package/dist/src/modules/base/base.service.mjs +116 -0
  191. package/dist/src/modules/base/base.service.mjs.map +1 -0
  192. package/dist/src/modules/base/base.types.d.mts +5 -0
  193. package/dist/src/modules/billing/billing.db.d.mts +371 -0
  194. package/dist/src/modules/billing/billing.db.mjs +31 -0
  195. package/dist/src/modules/billing/billing.db.mjs.map +1 -0
  196. package/dist/src/modules/billing/billing.repository.d.mts +2787 -0
  197. package/dist/src/modules/billing/billing.repository.mjs +188 -0
  198. package/dist/src/modules/billing/billing.repository.mjs.map +1 -0
  199. package/dist/src/modules/billing/billing.router.d.mts +9 -0
  200. package/dist/src/modules/billing/billing.router.mjs +40 -0
  201. package/dist/src/modules/billing/billing.router.mjs.map +1 -0
  202. package/dist/src/modules/billing/billing.service.d.mts +53 -0
  203. package/dist/src/modules/billing/billing.service.mjs +125 -0
  204. package/dist/src/modules/billing/billing.service.mjs.map +1 -0
  205. package/dist/src/modules/billing/billing.trpc.d.mts +48 -0
  206. package/dist/src/modules/billing/billing.trpc.mjs +17 -0
  207. package/dist/src/modules/billing/billing.trpc.mjs.map +1 -0
  208. package/dist/src/modules/clay/clay.repository.d.mts +10 -0
  209. package/dist/src/modules/clay/clay.repository.mjs +27 -0
  210. package/dist/src/modules/clay/clay.repository.mjs.map +1 -0
  211. package/dist/src/modules/clay/clay.service.d.mts +32 -0
  212. package/dist/src/modules/clay/clay.service.mjs +23 -0
  213. package/dist/src/modules/clay/clay.service.mjs.map +1 -0
  214. package/dist/src/modules/connect/connect.db.d.mts +362 -0
  215. package/dist/src/modules/connect/connect.db.mjs +30 -0
  216. package/dist/src/modules/connect/connect.db.mjs.map +1 -0
  217. package/dist/src/modules/connect/connect.dto.d.mts +79 -0
  218. package/dist/src/modules/connect/connect.dto.mjs +38 -0
  219. package/dist/src/modules/connect/connect.dto.mjs.map +1 -0
  220. package/dist/src/modules/connect/connect.linkedin.d.mts +7 -0
  221. package/dist/src/modules/connect/connect.linkedin.mjs +47 -0
  222. package/dist/src/modules/connect/connect.linkedin.mjs.map +1 -0
  223. package/dist/src/modules/connect/connect.oauth.d.mts +32 -0
  224. package/dist/src/modules/connect/connect.oauth.mjs +145 -0
  225. package/dist/src/modules/connect/connect.oauth.mjs.map +1 -0
  226. package/dist/src/modules/connect/connect.repository.d.mts +419 -0
  227. package/dist/src/modules/connect/connect.repository.mjs +40 -0
  228. package/dist/src/modules/connect/connect.repository.mjs.map +1 -0
  229. package/dist/src/modules/connect/connect.router.d.mts +9 -0
  230. package/dist/src/modules/connect/connect.router.mjs +46 -0
  231. package/dist/src/modules/connect/connect.router.mjs.map +1 -0
  232. package/dist/src/modules/connect/connect.service.d.mts +103 -0
  233. package/dist/src/modules/connect/connect.service.mjs +88 -0
  234. package/dist/src/modules/connect/connect.service.mjs.map +1 -0
  235. package/dist/src/modules/connect/connect.trpc.d.mts +53 -0
  236. package/dist/src/modules/connect/connect.trpc.mjs +17 -0
  237. package/dist/src/modules/connect/connect.trpc.mjs.map +1 -0
  238. package/dist/src/modules/connect/connect.types.d.mts +29 -0
  239. package/dist/src/modules/crypto/crypto.db.d.mts +157 -0
  240. package/dist/src/modules/crypto/crypto.db.mjs +19 -0
  241. package/dist/src/modules/crypto/crypto.db.mjs.map +1 -0
  242. package/dist/src/modules/crypto/crypto.repository.d.mts +163 -0
  243. package/dist/src/modules/crypto/crypto.repository.mjs +9 -0
  244. package/dist/src/modules/crypto/crypto.repository.mjs.map +1 -0
  245. package/dist/src/modules/crypto/crypto.service.d.mts +15 -0
  246. package/dist/src/modules/crypto/crypto.service.mjs +40 -0
  247. package/dist/src/modules/crypto/crypto.service.mjs.map +1 -0
  248. package/dist/src/modules/email/email.service.d.mts +62 -0
  249. package/dist/src/modules/email/email.service.mjs +105 -0
  250. package/dist/src/modules/email/email.service.mjs.map +1 -0
  251. package/dist/src/modules/file/file.repository.d.mts +17 -0
  252. package/dist/src/modules/file/file.repository.mjs +72 -0
  253. package/dist/src/modules/file/file.repository.mjs.map +1 -0
  254. package/dist/src/modules/file/{file.router.d.ts → file.router.d.mts} +4 -0
  255. package/dist/src/modules/file/file.router.mjs +88 -0
  256. package/dist/src/modules/file/file.router.mjs.map +1 -0
  257. package/dist/src/modules/file/file.service.d.mts +30 -0
  258. package/dist/src/modules/file/file.service.mjs +117 -0
  259. package/dist/src/modules/file/file.service.mjs.map +1 -0
  260. package/dist/src/modules/recurrence/recurrence.db.d.mts +568 -0
  261. package/dist/src/modules/recurrence/recurrence.db.mjs +47 -0
  262. package/dist/src/modules/recurrence/recurrence.db.mjs.map +1 -0
  263. package/dist/src/modules/recurrence/recurrence.repository.d.mts +588 -0
  264. package/dist/src/modules/recurrence/recurrence.repository.mjs +28 -0
  265. package/dist/src/modules/recurrence/recurrence.repository.mjs.map +1 -0
  266. package/dist/src/modules/recurrence/recurrence.service.d.mts +87 -0
  267. package/dist/src/modules/recurrence/recurrence.service.mjs +64 -0
  268. package/dist/src/modules/recurrence/recurrence.service.mjs.map +1 -0
  269. package/dist/src/modules/recurrence/recurrence.trpc.d.mts +215 -0
  270. package/dist/src/modules/recurrence/recurrence.trpc.mjs +44 -0
  271. package/dist/src/modules/recurrence/recurrence.trpc.mjs.map +1 -0
  272. package/dist/src/modules/social/social.dto.d.mts +39 -0
  273. package/dist/src/modules/social/social.dto.mjs +22 -0
  274. package/dist/src/modules/social/social.dto.mjs.map +1 -0
  275. package/dist/src/modules/social/{social.linkedin.d.ts → social.linkedin.d.mts} +8 -3
  276. package/dist/src/modules/social/social.linkedin.mjs +346 -0
  277. package/dist/src/modules/social/social.linkedin.mjs.map +1 -0
  278. package/dist/src/modules/social/social.service.d.mts +34 -0
  279. package/dist/src/modules/social/social.service.mjs +55 -0
  280. package/dist/src/modules/social/social.service.mjs.map +1 -0
  281. package/dist/src/modules/social/social.types.d.mts +40 -0
  282. package/dist/src/modules/tag/tag.db.d.mts +352 -0
  283. package/dist/src/modules/tag/tag.db.mjs +35 -0
  284. package/dist/src/modules/tag/tag.db.mjs.map +1 -0
  285. package/dist/src/modules/tag/tag.dto.d.mts +1025 -0
  286. package/dist/src/modules/tag/tag.dto.mjs +11 -0
  287. package/dist/src/modules/tag/tag.dto.mjs.map +1 -0
  288. package/dist/src/modules/tag/tag.repository.d.mts +394 -0
  289. package/dist/src/modules/tag/tag.repository.mjs +114 -0
  290. package/dist/src/modules/tag/tag.repository.mjs.map +1 -0
  291. package/dist/src/modules/tag/tag.service.d.mts +120 -0
  292. package/dist/src/modules/tag/tag.service.mjs +47 -0
  293. package/dist/src/modules/tag/tag.service.mjs.map +1 -0
  294. package/dist/src/modules/tag/tag.trpc.d.mts +173 -0
  295. package/dist/src/modules/tag/tag.trpc.mjs +30 -0
  296. package/dist/src/modules/tag/tag.trpc.mjs.map +1 -0
  297. package/dist/src/modules/utils/{applyPagination.d.ts → applyPagination.d.mts} +5 -1
  298. package/dist/src/modules/utils/applyPagination.mjs +15 -0
  299. package/dist/src/modules/utils/applyPagination.mjs.map +1 -0
  300. package/dist/src/modules/utils/applySorting.d.mts +13 -0
  301. package/dist/src/modules/utils/applySorting.mjs +18 -0
  302. package/dist/src/modules/utils/applySorting.mjs.map +1 -0
  303. package/dist/src/modules/utils/getConditionsFromFilters.d.mts +9 -0
  304. package/dist/src/modules/utils/getConditionsFromFilters.mjs +150 -0
  305. package/dist/src/modules/utils/getConditionsFromFilters.mjs.map +1 -0
  306. package/dist/src/modules/video/video.service.d.mts +12 -0
  307. package/dist/src/modules/video/video.service.mjs +50 -0
  308. package/dist/src/modules/video/video.service.mjs.map +1 -0
  309. package/dist/src/modules/webhook/webhook.constants.d.mts +12 -0
  310. package/dist/src/modules/webhook/webhook.constants.mjs +12 -0
  311. package/dist/src/modules/webhook/webhook.constants.mjs.map +1 -0
  312. package/dist/src/modules/webhook/webhook.db.d.mts +142 -0
  313. package/dist/src/modules/webhook/webhook.db.mjs +17 -0
  314. package/dist/src/modules/webhook/webhook.db.mjs.map +1 -0
  315. package/dist/src/modules/webhook/webhook.dto.d.mts +402 -0
  316. package/dist/src/modules/webhook/webhook.dto.mjs +9 -0
  317. package/dist/src/modules/webhook/webhook.dto.mjs.map +1 -0
  318. package/dist/src/modules/webhook/webhook.repository.d.mts +154 -0
  319. package/dist/src/modules/webhook/webhook.repository.mjs +50 -0
  320. package/dist/src/modules/webhook/webhook.repository.mjs.map +1 -0
  321. package/dist/src/modules/webhook/webhook.router.d.mts +8 -0
  322. package/dist/src/modules/webhook/webhook.router.mjs +23 -0
  323. package/dist/src/modules/webhook/webhook.router.mjs.map +1 -0
  324. package/dist/src/modules/webhook/webhook.service.d.mts +14 -0
  325. package/dist/src/modules/webhook/webhook.service.mjs +59 -0
  326. package/dist/src/modules/webhook/webhook.service.mjs.map +1 -0
  327. package/dist/src/modules/workflow/workflow.db.d.mts +302 -0
  328. package/dist/src/modules/workflow/workflow.db.mjs +28 -0
  329. package/dist/src/modules/workflow/workflow.db.mjs.map +1 -0
  330. package/dist/src/modules/workflow/workflow.repository.d.mts +371 -0
  331. package/dist/src/modules/workflow/workflow.repository.mjs +93 -0
  332. package/dist/src/modules/workflow/workflow.repository.mjs.map +1 -0
  333. package/dist/src/modules/workflow/workflow.service.d.mts +68 -0
  334. package/dist/src/modules/workflow/workflow.service.mjs +40 -0
  335. package/dist/src/modules/workflow/workflow.service.mjs.map +1 -0
  336. package/dist/src/modules/workflow/workflow.trpc.d.mts +65 -0
  337. package/dist/src/modules/workflow/workflow.trpc.mjs +17 -0
  338. package/dist/src/modules/workflow/workflow.trpc.mjs.map +1 -0
  339. package/dist/src/modules/workflow/workflow.types.d.mts +25 -0
  340. package/dist/src/modules/workflow/workflow.utils.d.mts +36 -0
  341. package/dist/src/modules/workflow/workflow.utils.mjs +181 -0
  342. package/dist/src/modules/workflow/workflow.utils.mjs.map +1 -0
  343. package/dist/src/types.d.mts +344 -0
  344. package/dist/src/types.mjs +11 -0
  345. package/dist/src/types.mjs.map +1 -0
  346. package/dist/src/utils/errors.d.mts +62 -0
  347. package/dist/src/utils/errors.mjs +96 -0
  348. package/dist/src/utils/errors.mjs.map +1 -0
  349. package/dist/src/utils/logger.d.mts +7 -0
  350. package/dist/src/utils/logger.mjs +10 -0
  351. package/dist/src/utils/logger.mjs.map +1 -0
  352. package/dist/src/utils/posthog.d.mts +17 -0
  353. package/dist/src/utils/posthog.mjs +25 -0
  354. package/dist/src/utils/posthog.mjs.map +1 -0
  355. package/dist/src/utils/trpc.d.mts +54 -0
  356. package/dist/src/utils/trpc.mjs +146 -0
  357. package/dist/src/utils/trpc.mjs.map +1 -0
  358. package/dist/src/utils/types.d.mts +9 -0
  359. package/package.json +47 -46
  360. package/dist/src/lib/posthog.d.ts +0 -2
  361. package/dist/src/lib/posthog.js +0 -7
  362. package/dist/src/lib/sentry.d.ts +0 -1
  363. package/dist/src/lib/sentry.js +0 -9
  364. package/dist/src/modules/access/access.repository.d.ts +0 -2347
  365. package/dist/src/modules/access/access.repository.js +0 -32
  366. package/dist/src/modules/access/access.service.d.ts +0 -21
  367. package/dist/src/modules/access/access.service.js +0 -51
  368. package/dist/src/modules/access/access.test.d.ts +0 -1
  369. package/dist/src/modules/access/access.test.js +0 -182
  370. package/dist/src/modules/access/access.utils.d.ts +0 -16
  371. package/dist/src/modules/access/access.utils.js +0 -20
  372. package/dist/src/modules/ai/ai.db.d.ts +0 -395
  373. package/dist/src/modules/ai/ai.db.js +0 -39
  374. package/dist/src/modules/ai/ai.prompt.d.ts +0 -26
  375. package/dist/src/modules/ai/ai.prompt.js +0 -30
  376. package/dist/src/modules/ai/ai.prompts.d.ts +0 -5
  377. package/dist/src/modules/ai/ai.repository.d.ts +0 -423
  378. package/dist/src/modules/ai/ai.repository.js +0 -26
  379. package/dist/src/modules/ai/ai.router.js +0 -132
  380. package/dist/src/modules/ai/ai.service.d.ts +0 -125
  381. package/dist/src/modules/ai/ai.service.js +0 -297
  382. package/dist/src/modules/ai/ai.trpc.d.ts +0 -22
  383. package/dist/src/modules/ai/ai.trpc.js +0 -20
  384. package/dist/src/modules/ai/ideogram/ideogram.constants.d.ts +0 -7
  385. package/dist/src/modules/ai/ideogram/ideogram.constants.js +0 -167
  386. package/dist/src/modules/ai/ideogram/ideogram.dto.d.ts +0 -229
  387. package/dist/src/modules/ai/ideogram/ideogram.dto.js +0 -49
  388. package/dist/src/modules/ai/ideogram/ideogram.prompt.d.ts +0 -2
  389. package/dist/src/modules/ai/ideogram/ideogram.repository.d.ts +0 -6
  390. package/dist/src/modules/ai/ideogram/ideogram.repository.js +0 -46
  391. package/dist/src/modules/ai/ideogram/ideogram.service.d.ts +0 -9
  392. package/dist/src/modules/ai/ideogram/ideogram.service.js +0 -11
  393. package/dist/src/modules/auth/auth.db.d.ts +0 -2335
  394. package/dist/src/modules/auth/auth.db.js +0 -215
  395. package/dist/src/modules/auth/auth.dto.d.ts +0 -65
  396. package/dist/src/modules/auth/auth.dto.js +0 -38
  397. package/dist/src/modules/auth/auth.lib.d.ts +0 -4869
  398. package/dist/src/modules/auth/auth.lib.js +0 -284
  399. package/dist/src/modules/auth/auth.middleware.d.ts +0 -614
  400. package/dist/src/modules/auth/auth.middleware.js +0 -52
  401. package/dist/src/modules/auth/auth.repository.d.ts +0 -2421
  402. package/dist/src/modules/auth/auth.repository.js +0 -636
  403. package/dist/src/modules/auth/auth.service.d.ts +0 -78
  404. package/dist/src/modules/auth/auth.service.js +0 -259
  405. package/dist/src/modules/auth/auth.trpc.d.ts +0 -292
  406. package/dist/src/modules/auth/auth.trpc.js +0 -179
  407. package/dist/src/modules/auth/auth.utils.d.ts +0 -2351
  408. package/dist/src/modules/auth/auth.utils.js +0 -97
  409. package/dist/src/modules/base/base.abstract.d.ts +0 -19
  410. package/dist/src/modules/base/base.abstract.js +0 -62
  411. package/dist/src/modules/base/base.actor.d.ts +0 -68
  412. package/dist/src/modules/base/base.actor.js +0 -99
  413. package/dist/src/modules/base/base.actor.test.js +0 -58
  414. package/dist/src/modules/base/base.dto.d.ts +0 -69
  415. package/dist/src/modules/base/base.dto.js +0 -112
  416. package/dist/src/modules/base/base.grants.d.ts +0 -24
  417. package/dist/src/modules/base/base.grants.js +0 -135
  418. package/dist/src/modules/base/base.grants.test.js +0 -639
  419. package/dist/src/modules/base/base.procedure.d.ts +0 -109
  420. package/dist/src/modules/base/base.procedure.js +0 -301
  421. package/dist/src/modules/base/base.repository.d.ts +0 -97
  422. package/dist/src/modules/base/base.repository.js +0 -317
  423. package/dist/src/modules/base/base.service.d.ts +0 -40
  424. package/dist/src/modules/base/base.service.js +0 -123
  425. package/dist/src/modules/base/base.service.test.js +0 -443
  426. package/dist/src/modules/base/base.types.d.ts +0 -1
  427. package/dist/src/modules/base/base.types.js +0 -2
  428. package/dist/src/modules/billing/billing.db.d.ts +0 -365
  429. package/dist/src/modules/billing/billing.db.js +0 -29
  430. package/dist/src/modules/billing/billing.repository.d.ts +0 -2763
  431. package/dist/src/modules/billing/billing.repository.js +0 -235
  432. package/dist/src/modules/billing/billing.router.d.ts +0 -4
  433. package/dist/src/modules/billing/billing.router.js +0 -56
  434. package/dist/src/modules/billing/billing.service.d.ts +0 -38
  435. package/dist/src/modules/billing/billing.service.js +0 -147
  436. package/dist/src/modules/billing/billing.trpc.d.ts +0 -38
  437. package/dist/src/modules/billing/billing.trpc.js +0 -15
  438. package/dist/src/modules/clay/clay.repository.d.ts +0 -5
  439. package/dist/src/modules/clay/clay.repository.js +0 -26
  440. package/dist/src/modules/clay/clay.service.d.ts +0 -28
  441. package/dist/src/modules/clay/clay.service.js +0 -24
  442. package/dist/src/modules/connect/connect.db.d.ts +0 -356
  443. package/dist/src/modules/connect/connect.db.js +0 -30
  444. package/dist/src/modules/connect/connect.dto.d.ts +0 -74
  445. package/dist/src/modules/connect/connect.dto.js +0 -36
  446. package/dist/src/modules/connect/connect.linkedin.d.ts +0 -2
  447. package/dist/src/modules/connect/connect.linkedin.js +0 -53
  448. package/dist/src/modules/connect/connect.oauth.d.ts +0 -27
  449. package/dist/src/modules/connect/connect.oauth.js +0 -198
  450. package/dist/src/modules/connect/connect.repository.d.ts +0 -413
  451. package/dist/src/modules/connect/connect.repository.js +0 -54
  452. package/dist/src/modules/connect/connect.router.d.ts +0 -4
  453. package/dist/src/modules/connect/connect.router.js +0 -54
  454. package/dist/src/modules/connect/connect.service.d.ts +0 -96
  455. package/dist/src/modules/connect/connect.service.js +0 -116
  456. package/dist/src/modules/connect/connect.trpc.d.ts +0 -44
  457. package/dist/src/modules/connect/connect.trpc.js +0 -21
  458. package/dist/src/modules/connect/connect.types.d.ts +0 -25
  459. package/dist/src/modules/connect/connect.types.js +0 -2
  460. package/dist/src/modules/crypto/crypto.db.d.ts +0 -151
  461. package/dist/src/modules/crypto/crypto.db.js +0 -17
  462. package/dist/src/modules/crypto/crypto.repository.d.ts +0 -159
  463. package/dist/src/modules/crypto/crypto.repository.js +0 -10
  464. package/dist/src/modules/crypto/crypto.service.d.ts +0 -10
  465. package/dist/src/modules/crypto/crypto.service.js +0 -52
  466. package/dist/src/modules/email/email.service.d.ts +0 -56
  467. package/dist/src/modules/email/email.service.js +0 -106
  468. package/dist/src/modules/file/file.repository.d.ts +0 -12
  469. package/dist/src/modules/file/file.repository.js +0 -79
  470. package/dist/src/modules/file/file.router.js +0 -99
  471. package/dist/src/modules/file/file.service.d.ts +0 -24
  472. package/dist/src/modules/file/file.service.js +0 -150
  473. package/dist/src/modules/recurrence/recurrence.db.d.ts +0 -562
  474. package/dist/src/modules/recurrence/recurrence.db.js +0 -66
  475. package/dist/src/modules/recurrence/recurrence.repository.d.ts +0 -584
  476. package/dist/src/modules/recurrence/recurrence.repository.js +0 -39
  477. package/dist/src/modules/recurrence/recurrence.service.d.ts +0 -80
  478. package/dist/src/modules/recurrence/recurrence.service.js +0 -72
  479. package/dist/src/modules/recurrence/recurrence.trpc.d.ts +0 -206
  480. package/dist/src/modules/recurrence/recurrence.trpc.js +0 -65
  481. package/dist/src/modules/social/social.dto.d.ts +0 -34
  482. package/dist/src/modules/social/social.dto.js +0 -18
  483. package/dist/src/modules/social/social.linkedin.js +0 -427
  484. package/dist/src/modules/social/social.linkedin.test.js +0 -235
  485. package/dist/src/modules/social/social.service.d.ts +0 -27
  486. package/dist/src/modules/social/social.service.js +0 -76
  487. package/dist/src/modules/social/social.types.d.ts +0 -35
  488. package/dist/src/modules/social/social.types.js +0 -2
  489. package/dist/src/modules/tag/tag.db.d.ts +0 -346
  490. package/dist/src/modules/tag/tag.db.js +0 -42
  491. package/dist/src/modules/tag/tag.dto.d.ts +0 -1018
  492. package/dist/src/modules/tag/tag.dto.js +0 -9
  493. package/dist/src/modules/tag/tag.repository.d.ts +0 -383
  494. package/dist/src/modules/tag/tag.repository.js +0 -156
  495. package/dist/src/modules/tag/tag.service.d.ts +0 -113
  496. package/dist/src/modules/tag/tag.service.js +0 -42
  497. package/dist/src/modules/tag/tag.trpc.d.ts +0 -164
  498. package/dist/src/modules/tag/tag.trpc.js +0 -53
  499. package/dist/src/modules/utils/applyPagination.js +0 -16
  500. package/dist/src/modules/utils/applySorting.d.ts +0 -8
  501. package/dist/src/modules/utils/applySorting.js +0 -18
  502. package/dist/src/modules/utils/getConditionsFromFilters.d.ts +0 -4
  503. package/dist/src/modules/utils/getConditionsFromFilters.js +0 -200
  504. package/dist/src/modules/video/video.service.d.ts +0 -7
  505. package/dist/src/modules/video/video.service.js +0 -84
  506. package/dist/src/modules/webhook/webhook.constants.d.ts +0 -8
  507. package/dist/src/modules/webhook/webhook.constants.js +0 -10
  508. package/dist/src/modules/webhook/webhook.db.d.ts +0 -136
  509. package/dist/src/modules/webhook/webhook.db.js +0 -17
  510. package/dist/src/modules/webhook/webhook.dto.d.ts +0 -394
  511. package/dist/src/modules/webhook/webhook.dto.js +0 -7
  512. package/dist/src/modules/webhook/webhook.repository.d.ts +0 -148
  513. package/dist/src/modules/webhook/webhook.repository.js +0 -56
  514. package/dist/src/modules/webhook/webhook.router.d.ts +0 -3
  515. package/dist/src/modules/webhook/webhook.router.js +0 -30
  516. package/dist/src/modules/webhook/webhook.service.d.ts +0 -9
  517. package/dist/src/modules/webhook/webhook.service.js +0 -68
  518. package/dist/src/modules/workflow/workflow.db.d.ts +0 -296
  519. package/dist/src/modules/workflow/workflow.db.js +0 -30
  520. package/dist/src/modules/workflow/workflow.repository.d.ts +0 -343
  521. package/dist/src/modules/workflow/workflow.repository.js +0 -105
  522. package/dist/src/modules/workflow/workflow.service.d.ts +0 -61
  523. package/dist/src/modules/workflow/workflow.service.js +0 -37
  524. package/dist/src/modules/workflow/workflow.trpc.d.ts +0 -56
  525. package/dist/src/modules/workflow/workflow.trpc.js +0 -21
  526. package/dist/src/modules/workflow/workflow.types.d.ts +0 -20
  527. package/dist/src/modules/workflow/workflow.types.js +0 -2
  528. package/dist/src/modules/workflow/workflow.utils.d.ts +0 -21
  529. package/dist/src/modules/workflow/workflow.utils.js +0 -173
  530. package/dist/src/test/stubs/utils.d.ts +0 -2
  531. package/dist/src/test/stubs/utils.js +0 -5
  532. package/dist/src/trpc/context.d.ts +0 -41
  533. package/dist/src/trpc/context.js +0 -17
  534. package/dist/src/trpc/index.d.ts +0 -3
  535. package/dist/src/trpc/index.js +0 -6
  536. package/dist/src/trpc/procedures.d.ts +0 -233
  537. package/dist/src/trpc/procedures.js +0 -32
  538. package/dist/src/trpc/utils.d.ts +0 -4
  539. package/dist/src/trpc/utils.js +0 -20
  540. package/dist/src/types.d.ts +0 -358
  541. package/dist/src/types.js +0 -12
  542. package/dist/src/utils/errors.d.ts +0 -49
  543. package/dist/src/utils/errors.js +0 -104
  544. package/dist/src/utils/logger.d.ts +0 -1
  545. package/dist/src/utils/logger.js +0 -11
  546. package/dist/src/utils/posthog.d.ts +0 -13
  547. package/dist/src/utils/posthog.js +0 -31
  548. package/dist/src/utils/trpc.d.ts +0 -48
  549. package/dist/src/utils/trpc.js +0 -158
  550. package/dist/src/utils/trpc.test.js +0 -154
  551. package/dist/src/utils/types.d.ts +0 -4
  552. package/dist/src/utils/types.js +0 -2
  553. package/dist/tsconfig.tsbuildinfo +0 -1
  554. /package/dist/src/{utils/trpc.test.d.ts → modules/ai/ai.router.mjs} +0 -0
  555. /package/dist/src/modules/{social/social.linkedin.test.d.ts → base/base.types.mjs} +0 -0
  556. /package/dist/src/modules/{base/base.service.test.d.ts → connect/connect.types.mjs} +0 -0
  557. /package/dist/src/modules/{base/base.grants.test.d.ts → social/social.types.mjs} +0 -0
  558. /package/dist/src/modules/{base/base.actor.test.d.ts → workflow/workflow.types.mjs} +0 -0
  559. /package/dist/src/{modules/ai/ai.router.d.ts → utils/types.mjs} +0 -0
@@ -0,0 +1,346 @@
1
+ import { createReadStream } from "node:fs";
2
+ import { stat, unlink } from "node:fs/promises";
3
+ //#region src/modules/social/social.linkedin.ts
4
+ const LINKEDIN_API_BASE = "https://api.linkedin.com/rest";
5
+ const LINKEDIN_VERSION = "202601";
6
+ const IMAGES_URL = `${LINKEDIN_API_BASE}/images?action=initializeUpload`;
7
+ const VIDEOS_URL = `${LINKEDIN_API_BASE}/videos?action=initializeUpload`;
8
+ const VIDEOS_FINALIZE_URL = `${LINKEDIN_API_BASE}/videos?action=finalizeUpload`;
9
+ const DOCUMENTS_URL = `${LINKEDIN_API_BASE}/documents?action=initializeUpload`;
10
+ const POSTS_URL = `${LINKEDIN_API_BASE}/posts`;
11
+ function getApiHeaders(accessToken) {
12
+ return {
13
+ Authorization: `Bearer ${accessToken}`,
14
+ "Content-Type": "application/json",
15
+ "Linkedin-Version": LINKEDIN_VERSION,
16
+ "X-Restli-Protocol-Version": "2.0.0"
17
+ };
18
+ }
19
+ function createLinkedInSocialProvider() {
20
+ return {
21
+ id: "linkedin",
22
+ async post({ deps, context, payload }) {
23
+ const personUrn = resolveAuthorUrn(context.connection);
24
+ const mediaDescriptors = payload.media ?? [];
25
+ let uploadedAssets = [];
26
+ if (mediaDescriptors.length > 0) uploadedAssets = await uploadMediaAssets({
27
+ accessToken: context.accessToken,
28
+ fileService: deps.fileService,
29
+ mediaDescriptors,
30
+ personUrn
31
+ });
32
+ const response = await publishPost({
33
+ accessToken: context.accessToken,
34
+ personUrn,
35
+ payload,
36
+ uploadedAssets
37
+ });
38
+ return {
39
+ shareUrn: response.postUrn,
40
+ rawResponse: response.raw
41
+ };
42
+ }
43
+ };
44
+ }
45
+ function resolveAuthorUrn(connection) {
46
+ if (connection.metadataJson) try {
47
+ const metadata = connection.metadataJson;
48
+ if (metadata.linkedInUrn && typeof metadata.linkedInUrn === "string") return metadata.linkedInUrn;
49
+ } catch {
50
+ throw new Error("Failed to parse LinkedIn connection metadata");
51
+ }
52
+ if (connection.providerAccountId) return `urn:li:person:${connection.providerAccountId}`;
53
+ throw new Error("LinkedIn connection is missing a person URN");
54
+ }
55
+ async function uploadMediaAssets(params) {
56
+ const results = [];
57
+ for (const descriptor of params.mediaDescriptors) {
58
+ const download = await params.fileService.downloadS3ToFile(descriptor.s3Path);
59
+ if (download.isErr()) throw download.error;
60
+ const localPath = download.value;
61
+ try {
62
+ const mediaType = determineMediaType(descriptor.mediaType, localPath);
63
+ let assetUrn;
64
+ switch (mediaType) {
65
+ case "image":
66
+ assetUrn = await uploadImage({
67
+ accessToken: params.accessToken,
68
+ personUrn: params.personUrn,
69
+ localPath
70
+ });
71
+ break;
72
+ case "video":
73
+ assetUrn = await uploadVideo({
74
+ accessToken: params.accessToken,
75
+ personUrn: params.personUrn,
76
+ localPath
77
+ });
78
+ break;
79
+ case "document":
80
+ assetUrn = await uploadDocument({
81
+ accessToken: params.accessToken,
82
+ personUrn: params.personUrn,
83
+ localPath
84
+ });
85
+ break;
86
+ }
87
+ results.push({
88
+ assetUrn,
89
+ mediaType,
90
+ title: descriptor.title,
91
+ description: descriptor.description
92
+ });
93
+ } finally {
94
+ await unlink(localPath).catch(() => void 0);
95
+ }
96
+ }
97
+ return results;
98
+ }
99
+ function determineMediaType(explicitType, localPath) {
100
+ if (explicitType) return explicitType;
101
+ const extension = localPath.split(".").pop()?.toLowerCase();
102
+ if (!extension) throw new Error("Unable to determine media type from file extension");
103
+ const imageExtensions = new Set([
104
+ "jpg",
105
+ "jpeg",
106
+ "png",
107
+ "gif",
108
+ "webp"
109
+ ]);
110
+ const videoExtensions = new Set([
111
+ "mp4",
112
+ "mov",
113
+ "m4v",
114
+ "avi",
115
+ "mkv",
116
+ "webm"
117
+ ]);
118
+ const documentExtensions = new Set([
119
+ "pdf",
120
+ "ppt",
121
+ "pptx",
122
+ "doc",
123
+ "docx"
124
+ ]);
125
+ if (imageExtensions.has(extension)) return "image";
126
+ if (videoExtensions.has(extension)) return "video";
127
+ if (documentExtensions.has(extension)) return "document";
128
+ throw new Error(`Unsupported media extension: ${extension}`);
129
+ }
130
+ async function uploadImage(params) {
131
+ const initResponse = await fetch(IMAGES_URL, {
132
+ method: "POST",
133
+ headers: getApiHeaders(params.accessToken),
134
+ body: JSON.stringify({ initializeUploadRequest: { owner: params.personUrn } })
135
+ });
136
+ if (!initResponse.ok) {
137
+ const errorText = await initResponse.text().catch(() => "");
138
+ throw new Error(`LinkedIn image upload initialization failed: ${initResponse.status} ${errorText}`);
139
+ }
140
+ const { uploadUrl, image } = (await initResponse.json()).value;
141
+ if (!uploadUrl || !image) throw new Error("LinkedIn image initialization response missing required fields");
142
+ await uploadBinaryToLinkedIn({
143
+ uploadUrl,
144
+ localPath: params.localPath,
145
+ mimeType: inferImageMime(params.localPath)
146
+ });
147
+ return image;
148
+ }
149
+ async function uploadVideo(params) {
150
+ const fileSizeBytes = await getFileSize(params.localPath);
151
+ const initResponse = await fetch(VIDEOS_URL, {
152
+ method: "POST",
153
+ headers: getApiHeaders(params.accessToken),
154
+ body: JSON.stringify({ initializeUploadRequest: {
155
+ owner: params.personUrn,
156
+ fileSizeBytes,
157
+ uploadCaptions: false,
158
+ uploadThumbnail: false
159
+ } })
160
+ });
161
+ if (!initResponse.ok) {
162
+ const errorText = await initResponse.text().catch(() => "");
163
+ throw new Error(`LinkedIn video upload initialization failed: ${initResponse.status} ${errorText}`);
164
+ }
165
+ const { uploadInstructions, video, uploadToken } = (await initResponse.json()).value;
166
+ if (!uploadInstructions || !video || !uploadToken) throw new Error("LinkedIn video initialization response missing required fields");
167
+ const uploadedPartIds = await uploadVideoMultipart({
168
+ localPath: params.localPath,
169
+ uploadInstructions
170
+ });
171
+ await finalizeVideoUpload({
172
+ accessToken: params.accessToken,
173
+ video,
174
+ uploadToken,
175
+ uploadedPartIds
176
+ });
177
+ return video;
178
+ }
179
+ async function uploadVideoMultipart(params) {
180
+ const uploadedPartIds = [];
181
+ for (const instruction of params.uploadInstructions) {
182
+ const chunkStream = createReadStream(params.localPath, {
183
+ start: instruction.firstByte,
184
+ end: instruction.lastByte
185
+ });
186
+ const uploadResponse = await fetch(instruction.uploadUrl, {
187
+ method: "PUT",
188
+ headers: { "Content-Type": "application/octet-stream" },
189
+ body: chunkStream,
190
+ duplex: "half"
191
+ });
192
+ if (!uploadResponse.ok) {
193
+ const errorText = await uploadResponse.text().catch(() => "");
194
+ throw new Error(`LinkedIn video part upload failed: ${uploadResponse.status} ${errorText}`);
195
+ }
196
+ const etag = uploadResponse.headers.get("etag");
197
+ if (!etag) throw new Error("LinkedIn video part upload response missing ETag header");
198
+ uploadedPartIds.push(etag.replace(/"/g, ""));
199
+ }
200
+ return uploadedPartIds;
201
+ }
202
+ async function finalizeVideoUpload(params) {
203
+ const response = await fetch(VIDEOS_FINALIZE_URL, {
204
+ method: "POST",
205
+ headers: getApiHeaders(params.accessToken),
206
+ body: JSON.stringify({ finalizeUploadRequest: {
207
+ video: params.video,
208
+ uploadToken: params.uploadToken,
209
+ uploadedPartIds: params.uploadedPartIds
210
+ } })
211
+ });
212
+ if (!response.ok) {
213
+ const errorText = await response.text().catch(() => "");
214
+ throw new Error(`LinkedIn video finalize failed: ${response.status} ${errorText}`);
215
+ }
216
+ }
217
+ async function uploadDocument(params) {
218
+ const initResponse = await fetch(DOCUMENTS_URL, {
219
+ method: "POST",
220
+ headers: getApiHeaders(params.accessToken),
221
+ body: JSON.stringify({ initializeUploadRequest: { owner: params.personUrn } })
222
+ });
223
+ if (!initResponse.ok) {
224
+ const errorText = await initResponse.text().catch(() => "");
225
+ throw new Error(`LinkedIn document upload initialization failed: ${initResponse.status} ${errorText}`);
226
+ }
227
+ const { uploadUrl, document } = (await initResponse.json()).value;
228
+ if (!uploadUrl || !document) throw new Error("LinkedIn document initialization response missing required fields");
229
+ await uploadBinaryToLinkedIn({
230
+ uploadUrl,
231
+ localPath: params.localPath,
232
+ mimeType: inferDocumentMime(params.localPath)
233
+ });
234
+ return document;
235
+ }
236
+ async function uploadBinaryToLinkedIn(params) {
237
+ const uploadResponse = await fetch(params.uploadUrl, {
238
+ method: "PUT",
239
+ headers: { "Content-Type": params.mimeType },
240
+ body: createReadStream(params.localPath),
241
+ duplex: "half"
242
+ });
243
+ if (!uploadResponse.ok) {
244
+ const errorText = await uploadResponse.text().catch(() => "");
245
+ throw new Error(`LinkedIn media upload failed: ${uploadResponse.status} ${errorText}`);
246
+ }
247
+ }
248
+ async function getFileSize(filePath) {
249
+ return (await stat(filePath)).size;
250
+ }
251
+ function inferImageMime(localPath) {
252
+ switch (localPath.split(".").pop()?.toLowerCase()) {
253
+ case "png": return "image/png";
254
+ case "webp": return "image/webp";
255
+ case "gif": return "image/gif";
256
+ case "jpg":
257
+ case "jpeg": return "image/jpeg";
258
+ default: return "application/octet-stream";
259
+ }
260
+ }
261
+ function inferDocumentMime(localPath) {
262
+ switch (localPath.split(".").pop()?.toLowerCase()) {
263
+ case "pdf": return "application/pdf";
264
+ case "doc": return "application/msword";
265
+ case "docx": return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
266
+ case "ppt": return "application/vnd.ms-powerpoint";
267
+ case "pptx": return "application/vnd.openxmlformats-officedocument.presentationml.presentation";
268
+ default: return "application/octet-stream";
269
+ }
270
+ }
271
+ async function publishPost(params) {
272
+ const body = buildPostBody(params);
273
+ const response = await fetch(POSTS_URL, {
274
+ method: "POST",
275
+ headers: getApiHeaders(params.accessToken),
276
+ body: JSON.stringify(body)
277
+ });
278
+ if (!response.ok) {
279
+ const errorText = await response.text().catch(() => "");
280
+ throw new Error(`LinkedIn post failed: ${response.status} ${errorText}`);
281
+ }
282
+ return {
283
+ postUrn: response.headers.get("x-restli-id") ?? void 0,
284
+ raw: await safeJson(response)
285
+ };
286
+ }
287
+ /**
288
+ * Escapes special characters in text for LinkedIn's post commentary field.
289
+ * LinkedIn requires certain characters to be backslash-escaped.
290
+ * Preserves mentions (@[Name](urn:li:...)) and hashtag templates ({hashtag|#|tag}).
291
+ * Converts simple hashtags (#tag) to the template format.
292
+ * @see https://learn.microsoft.com/en-us/linkedin/marketing/community-management/shares/little-text-format
293
+ */
294
+ function escapeLinkedInText(text) {
295
+ const mentionPattern = /@\[[^\]]*\]\(urn:li:[^)]+\)/g;
296
+ const hashtagTemplatePattern = /\{hashtag\|\\?[##]\|[^}]+\}/g;
297
+ const simpleHashtagPattern = /#([a-zA-Z\u00C0-\u024F\u1E00-\u1EFF][\w\u00C0-\u024F\u1E00-\u1EFF]*)/g;
298
+ const preserved = [];
299
+ const createPlaceholder = (content) => {
300
+ const index = preserved.length;
301
+ preserved.push(content);
302
+ return `\x00${index}\x00`;
303
+ };
304
+ let result = text.replace(mentionPattern, (match) => createPlaceholder(match));
305
+ result = result.replace(hashtagTemplatePattern, (match) => createPlaceholder(match));
306
+ result = result.replace(simpleHashtagPattern, (_match, tag) => createPlaceholder(`{hashtag|\\#|${tag}}`));
307
+ result = result.replace(/\\/g, "\\\\").replace(/\|/g, "\\|").replace(/\{/g, "\\{").replace(/\}/g, "\\}").replace(/@/g, "\\@").replace(/\[/g, "\\[").replace(/\]/g, "\\]").replace(/\(/g, "\\(").replace(/\)/g, "\\)").replace(/</g, "\\<").replace(/>/g, "\\>").replace(/#/g, "\\#").replace(/\*/g, "\\*").replace(/_/g, "\\_").replace(/~/g, "\\~");
308
+ result = result.replace(/\x00(\d+)\x00/g, (_match, index) => preserved[Number(index)]);
309
+ return result;
310
+ }
311
+ function buildPostBody(params) {
312
+ const { personUrn, payload, uploadedAssets } = params;
313
+ const basePost = {
314
+ author: personUrn,
315
+ commentary: escapeLinkedInText(payload.text),
316
+ visibility: payload.visibility,
317
+ distribution: {
318
+ feedDistribution: "MAIN_FEED",
319
+ targetEntities: [],
320
+ thirdPartyDistributionChannels: []
321
+ },
322
+ lifecycleState: "PUBLISHED",
323
+ isReshareDisabledByAuthor: false
324
+ };
325
+ if (uploadedAssets.length === 0) return basePost;
326
+ if (uploadedAssets.length > 1) throw new Error("LinkedIn Posts API currently supports only a single media asset per post");
327
+ const asset = uploadedAssets[0];
328
+ const mediaContent = { id: asset.assetUrn };
329
+ if (asset.title) mediaContent.title = asset.title;
330
+ if (asset.description && asset.mediaType === "image") mediaContent.altText = asset.description;
331
+ return {
332
+ ...basePost,
333
+ content: { media: mediaContent }
334
+ };
335
+ }
336
+ async function safeJson(response) {
337
+ try {
338
+ return await response.json();
339
+ } catch {
340
+ return;
341
+ }
342
+ }
343
+ //#endregion
344
+ export { createLinkedInSocialProvider, escapeLinkedInText };
345
+
346
+ //# sourceMappingURL=social.linkedin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"social.linkedin.mjs","names":[],"sources":["../../../../src/modules/social/social.linkedin.ts"],"sourcesContent":["import { createReadStream } from \"node:fs\";\r\nimport { stat, unlink } from \"node:fs/promises\";\r\nimport type { ConnectRow } from \"../connect/connect.repository\";\r\nimport type { FileService } from \"../file/file.service\";\r\nimport type { SocialMediaDescriptor, SocialPostPayload, SocialProvider } from \"./social.types\";\r\n\r\nconst LINKEDIN_API_BASE = \"https://api.linkedin.com/rest\";\r\nconst LINKEDIN_VERSION = \"202601\";\r\n\r\nconst IMAGES_URL = `${LINKEDIN_API_BASE}/images?action=initializeUpload`;\r\nconst VIDEOS_URL = `${LINKEDIN_API_BASE}/videos?action=initializeUpload`;\r\nconst VIDEOS_FINALIZE_URL = `${LINKEDIN_API_BASE}/videos?action=finalizeUpload`;\r\nconst DOCUMENTS_URL = `${LINKEDIN_API_BASE}/documents?action=initializeUpload`;\r\nconst POSTS_URL = `${LINKEDIN_API_BASE}/posts`;\r\n\r\ninterface LinkedInMetadata {\r\n linkedInUrn?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\ninterface UploadedAsset {\r\n assetUrn: string;\r\n mediaType: \"image\" | \"video\" | \"document\";\r\n title?: string;\r\n description?: string;\r\n}\r\n\r\ninterface ImageInitResponse {\r\n value: {\r\n uploadUrlExpiresAt: number;\r\n uploadUrl: string;\r\n image: string;\r\n };\r\n}\r\n\r\ninterface VideoInitResponse {\r\n value: {\r\n uploadUrlsExpireAt: number;\r\n video: string;\r\n uploadInstructions: Array<{\r\n uploadUrl: string;\r\n lastByte: number;\r\n firstByte: number;\r\n }>;\r\n uploadToken: string;\r\n };\r\n}\r\n\r\ninterface DocumentInitResponse {\r\n value: {\r\n uploadUrlExpiresAt: number;\r\n uploadUrl: string;\r\n document: string;\r\n };\r\n}\r\n\r\nfunction getApiHeaders(accessToken: string): Record<string, string> {\r\n return {\r\n Authorization: `Bearer ${accessToken}`,\r\n \"Content-Type\": \"application/json\",\r\n \"Linkedin-Version\": LINKEDIN_VERSION,\r\n \"X-Restli-Protocol-Version\": \"2.0.0\",\r\n };\r\n}\r\n\r\nexport function createLinkedInSocialProvider(): SocialProvider {\r\n return {\r\n id: \"linkedin\",\r\n async post({ deps, context, payload }) {\r\n const personUrn = resolveAuthorUrn(context.connection);\r\n const mediaDescriptors = payload.media ?? [];\r\n\r\n let uploadedAssets: UploadedAsset[] = [];\r\n if (mediaDescriptors.length > 0) {\r\n uploadedAssets = await uploadMediaAssets({\r\n accessToken: context.accessToken,\r\n fileService: deps.fileService,\r\n mediaDescriptors,\r\n personUrn,\r\n });\r\n }\r\n\r\n const response = await publishPost({\r\n accessToken: context.accessToken,\r\n personUrn,\r\n payload,\r\n uploadedAssets,\r\n });\r\n\r\n return {\r\n shareUrn: response.postUrn,\r\n rawResponse: response.raw,\r\n };\r\n },\r\n };\r\n}\r\n\r\nfunction resolveAuthorUrn(connection: ConnectRow): string {\r\n if (connection.metadataJson) {\r\n try {\r\n const metadata = connection.metadataJson as LinkedInMetadata;\r\n if (metadata.linkedInUrn && typeof metadata.linkedInUrn === \"string\") {\r\n return metadata.linkedInUrn;\r\n }\r\n } catch {\r\n throw new Error(\"Failed to parse LinkedIn connection metadata\");\r\n }\r\n }\r\n\r\n if (connection.providerAccountId) {\r\n return `urn:li:person:${connection.providerAccountId}`;\r\n }\r\n\r\n throw new Error(\"LinkedIn connection is missing a person URN\");\r\n}\r\n\r\nasync function uploadMediaAssets(params: {\r\n accessToken: string;\r\n fileService: FileService;\r\n mediaDescriptors: readonly SocialMediaDescriptor[];\r\n personUrn: string;\r\n}): Promise<UploadedAsset[]> {\r\n const results: UploadedAsset[] = [];\r\n\r\n for (const descriptor of params.mediaDescriptors) {\r\n const download = await params.fileService.downloadS3ToFile(descriptor.s3Path);\r\n if (download.isErr()) {\r\n throw download.error;\r\n }\r\n\r\n const localPath = download.value;\r\n try {\r\n const mediaType = determineMediaType(descriptor.mediaType, localPath);\r\n\r\n let assetUrn: string;\r\n switch (mediaType) {\r\n case \"image\":\r\n assetUrn = await uploadImage({\r\n accessToken: params.accessToken,\r\n personUrn: params.personUrn,\r\n localPath,\r\n });\r\n break;\r\n case \"video\":\r\n assetUrn = await uploadVideo({\r\n accessToken: params.accessToken,\r\n personUrn: params.personUrn,\r\n localPath,\r\n });\r\n break;\r\n case \"document\":\r\n assetUrn = await uploadDocument({\r\n accessToken: params.accessToken,\r\n personUrn: params.personUrn,\r\n localPath,\r\n });\r\n break;\r\n }\r\n\r\n results.push({\r\n assetUrn,\r\n mediaType,\r\n title: descriptor.title,\r\n description: descriptor.description,\r\n });\r\n } finally {\r\n await unlink(localPath).catch(() => undefined);\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction determineMediaType(\r\n explicitType: SocialMediaDescriptor[\"mediaType\"],\r\n localPath: string\r\n): \"image\" | \"video\" | \"document\" {\r\n if (explicitType) {\r\n return explicitType;\r\n }\r\n\r\n const extension = localPath.split(\".\").pop()?.toLowerCase();\r\n if (!extension) {\r\n throw new Error(\"Unable to determine media type from file extension\");\r\n }\r\n\r\n const imageExtensions = new Set([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"]);\r\n const videoExtensions = new Set([\"mp4\", \"mov\", \"m4v\", \"avi\", \"mkv\", \"webm\"]);\r\n const documentExtensions = new Set([\"pdf\", \"ppt\", \"pptx\", \"doc\", \"docx\"]);\r\n\r\n if (imageExtensions.has(extension)) {\r\n return \"image\";\r\n }\r\n if (videoExtensions.has(extension)) {\r\n return \"video\";\r\n }\r\n if (documentExtensions.has(extension)) {\r\n return \"document\";\r\n }\r\n\r\n throw new Error(`Unsupported media extension: ${extension}`);\r\n}\r\n\r\nasync function uploadImage(params: {\r\n accessToken: string;\r\n personUrn: string;\r\n localPath: string;\r\n}): Promise<string> {\r\n const initResponse = await fetch(IMAGES_URL, {\r\n method: \"POST\",\r\n headers: getApiHeaders(params.accessToken),\r\n body: JSON.stringify({\r\n initializeUploadRequest: {\r\n owner: params.personUrn,\r\n },\r\n }),\r\n });\r\n\r\n if (!initResponse.ok) {\r\n const errorText = await initResponse.text().catch(() => \"\");\r\n throw new Error(\r\n `LinkedIn image upload initialization failed: ${initResponse.status} ${errorText}`\r\n );\r\n }\r\n\r\n const initJson = (await initResponse.json()) as ImageInitResponse;\r\n const { uploadUrl, image } = initJson.value;\r\n\r\n if (!uploadUrl || !image) {\r\n throw new Error(\"LinkedIn image initialization response missing required fields\");\r\n }\r\n\r\n await uploadBinaryToLinkedIn({\r\n uploadUrl,\r\n localPath: params.localPath,\r\n mimeType: inferImageMime(params.localPath),\r\n });\r\n\r\n return image;\r\n}\r\n\r\nasync function uploadVideo(params: {\r\n accessToken: string;\r\n personUrn: string;\r\n localPath: string;\r\n}): Promise<string> {\r\n const fileSizeBytes = await getFileSize(params.localPath);\r\n\r\n const initResponse = await fetch(VIDEOS_URL, {\r\n method: \"POST\",\r\n headers: getApiHeaders(params.accessToken),\r\n body: JSON.stringify({\r\n initializeUploadRequest: {\r\n owner: params.personUrn,\r\n fileSizeBytes,\r\n uploadCaptions: false,\r\n uploadThumbnail: false,\r\n },\r\n }),\r\n });\r\n\r\n if (!initResponse.ok) {\r\n const errorText = await initResponse.text().catch(() => \"\");\r\n throw new Error(\r\n `LinkedIn video upload initialization failed: ${initResponse.status} ${errorText}`\r\n );\r\n }\r\n\r\n const initJson = (await initResponse.json()) as VideoInitResponse;\r\n const { uploadInstructions, video, uploadToken } = initJson.value;\r\n\r\n if (!uploadInstructions || !video || !uploadToken) {\r\n throw new Error(\"LinkedIn video initialization response missing required fields\");\r\n }\r\n\r\n const uploadedPartIds = await uploadVideoMultipart({\r\n localPath: params.localPath,\r\n uploadInstructions,\r\n });\r\n\r\n await finalizeVideoUpload({\r\n accessToken: params.accessToken,\r\n video,\r\n uploadToken,\r\n uploadedPartIds,\r\n });\r\n\r\n return video;\r\n}\r\n\r\nasync function uploadVideoMultipart(params: {\r\n localPath: string;\r\n uploadInstructions: VideoInitResponse[\"value\"][\"uploadInstructions\"];\r\n}): Promise<string[]> {\r\n const uploadedPartIds: string[] = [];\r\n\r\n for (const instruction of params.uploadInstructions) {\r\n const chunkStream = createReadStream(params.localPath, {\r\n start: instruction.firstByte,\r\n end: instruction.lastByte,\r\n });\r\n\r\n const uploadResponse = await fetch(instruction.uploadUrl, {\r\n method: \"PUT\",\r\n headers: {\r\n \"Content-Type\": \"application/octet-stream\",\r\n },\r\n body: chunkStream,\r\n duplex: \"half\",\r\n });\r\n\r\n if (!uploadResponse.ok) {\r\n const errorText = await uploadResponse.text().catch(() => \"\");\r\n throw new Error(`LinkedIn video part upload failed: ${uploadResponse.status} ${errorText}`);\r\n }\r\n\r\n const etag = uploadResponse.headers.get(\"etag\");\r\n if (!etag) {\r\n throw new Error(\"LinkedIn video part upload response missing ETag header\");\r\n }\r\n\r\n uploadedPartIds.push(etag.replace(/\"/g, \"\"));\r\n }\r\n\r\n return uploadedPartIds;\r\n}\r\n\r\nasync function finalizeVideoUpload(params: {\r\n accessToken: string;\r\n video: string;\r\n uploadToken: string;\r\n uploadedPartIds: string[];\r\n}): Promise<void> {\r\n const response = await fetch(VIDEOS_FINALIZE_URL, {\r\n method: \"POST\",\r\n headers: getApiHeaders(params.accessToken),\r\n body: JSON.stringify({\r\n finalizeUploadRequest: {\r\n video: params.video,\r\n uploadToken: params.uploadToken,\r\n uploadedPartIds: params.uploadedPartIds,\r\n },\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text().catch(() => \"\");\r\n throw new Error(`LinkedIn video finalize failed: ${response.status} ${errorText}`);\r\n }\r\n}\r\n\r\nasync function uploadDocument(params: {\r\n accessToken: string;\r\n personUrn: string;\r\n localPath: string;\r\n}): Promise<string> {\r\n const initResponse = await fetch(DOCUMENTS_URL, {\r\n method: \"POST\",\r\n headers: getApiHeaders(params.accessToken),\r\n body: JSON.stringify({\r\n initializeUploadRequest: {\r\n owner: params.personUrn,\r\n },\r\n }),\r\n });\r\n\r\n if (!initResponse.ok) {\r\n const errorText = await initResponse.text().catch(() => \"\");\r\n throw new Error(\r\n `LinkedIn document upload initialization failed: ${initResponse.status} ${errorText}`\r\n );\r\n }\r\n\r\n const initJson = (await initResponse.json()) as DocumentInitResponse;\r\n const { uploadUrl, document } = initJson.value;\r\n\r\n if (!uploadUrl || !document) {\r\n throw new Error(\"LinkedIn document initialization response missing required fields\");\r\n }\r\n\r\n await uploadBinaryToLinkedIn({\r\n uploadUrl,\r\n localPath: params.localPath,\r\n mimeType: inferDocumentMime(params.localPath),\r\n });\r\n\r\n return document;\r\n}\r\n\r\nasync function uploadBinaryToLinkedIn(params: {\r\n uploadUrl: string;\r\n localPath: string;\r\n mimeType: string;\r\n}): Promise<void> {\r\n const uploadResponse = await fetch(params.uploadUrl, {\r\n method: \"PUT\",\r\n headers: {\r\n \"Content-Type\": params.mimeType,\r\n },\r\n body: createReadStream(params.localPath),\r\n duplex: \"half\",\r\n });\r\n\r\n if (!uploadResponse.ok) {\r\n const errorText = await uploadResponse.text().catch(() => \"\");\r\n throw new Error(`LinkedIn media upload failed: ${uploadResponse.status} ${errorText}`);\r\n }\r\n}\r\n\r\nasync function getFileSize(filePath: string): Promise<number> {\r\n const stats = await stat(filePath);\r\n return stats.size;\r\n}\r\n\r\nfunction inferImageMime(localPath: string): string {\r\n const extension = localPath.split(\".\").pop()?.toLowerCase();\r\n switch (extension) {\r\n case \"png\":\r\n return \"image/png\";\r\n case \"webp\":\r\n return \"image/webp\";\r\n case \"gif\":\r\n return \"image/gif\";\r\n case \"jpg\":\r\n case \"jpeg\":\r\n return \"image/jpeg\";\r\n default:\r\n return \"application/octet-stream\";\r\n }\r\n}\r\n\r\nfunction inferDocumentMime(localPath: string): string {\r\n const extension = localPath.split(\".\").pop()?.toLowerCase();\r\n switch (extension) {\r\n case \"pdf\":\r\n return \"application/pdf\";\r\n case \"doc\":\r\n return \"application/msword\";\r\n case \"docx\":\r\n return \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\r\n case \"ppt\":\r\n return \"application/vnd.ms-powerpoint\";\r\n case \"pptx\":\r\n return \"application/vnd.openxmlformats-officedocument.presentationml.presentation\";\r\n default:\r\n return \"application/octet-stream\";\r\n }\r\n}\r\n\r\nasync function publishPost(params: {\r\n accessToken: string;\r\n personUrn: string;\r\n payload: SocialPostPayload;\r\n uploadedAssets: UploadedAsset[];\r\n}): Promise<{ postUrn?: string; raw: unknown }> {\r\n const body = buildPostBody(params);\r\n\r\n const response = await fetch(POSTS_URL, {\r\n method: \"POST\",\r\n headers: getApiHeaders(params.accessToken),\r\n body: JSON.stringify(body),\r\n });\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text().catch(() => \"\");\r\n throw new Error(`LinkedIn post failed: ${response.status} ${errorText}`);\r\n }\r\n\r\n const postUrn = response.headers.get(\"x-restli-id\") ?? undefined;\r\n const raw = await safeJson(response);\r\n\r\n return { postUrn, raw };\r\n}\r\n\r\n/**\r\n * Escapes special characters in text for LinkedIn's post commentary field.\r\n * LinkedIn requires certain characters to be backslash-escaped.\r\n * Preserves mentions (@[Name](urn:li:...)) and hashtag templates ({hashtag|#|tag}).\r\n * Converts simple hashtags (#tag) to the template format.\r\n * @see https://learn.microsoft.com/en-us/linkedin/marketing/community-management/shares/little-text-format\r\n */\r\nexport function escapeLinkedInText(text: string): string {\r\n // Patterns for LinkedIn elements that should not be escaped\r\n // MentionElement: @[FallbackText](urn:li:...)\r\n const mentionPattern = /@\\[[^\\]]*\\]\\(urn:li:[^)]+\\)/g;\r\n // HashtagTemplate: {hashtag|#|text} or {hashtag|#|text} (with optional escaped #)\r\n const hashtagTemplatePattern = /\\{hashtag\\|\\\\?[##]\\|[^}]+\\}/g;\r\n // Simple hashtag: #word (must start with a letter, not digit-only)\r\n const simpleHashtagPattern =\r\n /#([a-zA-Z\\u00C0-\\u024F\\u1E00-\\u1EFF][\\w\\u00C0-\\u024F\\u1E00-\\u1EFF]*)/g;\r\n\r\n // Store matches in array, use index-based placeholders with null character delimiters\r\n const preserved: string[] = [];\r\n\r\n const createPlaceholder = (content: string): string => {\r\n const index = preserved.length;\r\n preserved.push(content);\r\n return `\\x00${index}\\x00`;\r\n };\r\n\r\n // Replace mentions with placeholders (preserve as-is)\r\n let result = text.replace(mentionPattern, (match) => createPlaceholder(match));\r\n\r\n // Replace hashtag templates with placeholders (preserve as-is)\r\n result = result.replace(hashtagTemplatePattern, (match) => createPlaceholder(match));\r\n\r\n // Convert simple hashtags to template format with escaped #\r\n result = result.replace(simpleHashtagPattern, (_match, tag: string) =>\r\n createPlaceholder(`{hashtag|\\\\#|${tag}}`)\r\n );\r\n\r\n // Escape remaining special characters (order matters: backslash first)\r\n result = result\r\n .replace(/\\\\/g, \"\\\\\\\\\")\r\n .replace(/\\|/g, \"\\\\|\")\r\n .replace(/\\{/g, \"\\\\{\")\r\n .replace(/\\}/g, \"\\\\}\")\r\n .replace(/@/g, \"\\\\@\")\r\n .replace(/\\[/g, \"\\\\[\")\r\n .replace(/\\]/g, \"\\\\]\")\r\n .replace(/\\(/g, \"\\\\(\")\r\n .replace(/\\)/g, \"\\\\)\")\r\n .replace(/</g, \"\\\\<\")\r\n .replace(/>/g, \"\\\\>\")\r\n .replace(/#/g, \"\\\\#\")\r\n .replace(/\\*/g, \"\\\\*\")\r\n .replace(/_/g, \"\\\\_\")\r\n .replace(/~/g, \"\\\\~\");\r\n\r\n // Restore placeholders with preserved/transformed content\r\n // biome-ignore lint/suspicious/noControlCharactersInRegex: null chars are intentional placeholders\r\n result = result.replace(/\\x00(\\d+)\\x00/g, (_match, index: string) => preserved[Number(index)]);\r\n\r\n return result;\r\n}\r\n\r\nfunction buildPostBody(params: {\r\n personUrn: string;\r\n payload: SocialPostPayload;\r\n uploadedAssets: UploadedAsset[];\r\n}): Record<string, unknown> {\r\n const { personUrn, payload, uploadedAssets } = params;\r\n\r\n const basePost = {\r\n author: personUrn,\r\n commentary: escapeLinkedInText(payload.text),\r\n visibility: payload.visibility,\r\n distribution: {\r\n feedDistribution: \"MAIN_FEED\",\r\n targetEntities: [],\r\n thirdPartyDistributionChannels: [],\r\n },\r\n lifecycleState: \"PUBLISHED\",\r\n isReshareDisabledByAuthor: false,\r\n };\r\n\r\n if (uploadedAssets.length === 0) {\r\n return basePost;\r\n }\r\n\r\n if (uploadedAssets.length > 1) {\r\n throw new Error(\"LinkedIn Posts API currently supports only a single media asset per post\");\r\n }\r\n\r\n const asset = uploadedAssets[0];\r\n\r\n const mediaContent: Record<string, unknown> = {\r\n id: asset.assetUrn,\r\n };\r\n\r\n if (asset.title) {\r\n mediaContent.title = asset.title;\r\n }\r\n\r\n if (asset.description && asset.mediaType === \"image\") {\r\n mediaContent.altText = asset.description;\r\n }\r\n\r\n return {\r\n ...basePost,\r\n content: {\r\n media: mediaContent,\r\n },\r\n };\r\n}\r\n\r\nasync function safeJson(response: globalThis.Response): Promise<unknown> {\r\n try {\r\n return await response.json();\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { ServerResultAsync } from "../base/base.dto.mjs";
2
+ import { RequiredServiceActor } from "../base/base.actor.mjs";
3
+ import { BaseService } from "../base/base.service.mjs";
4
+ import { ConnectRepository } from "../connect/connect.repository.mjs";
5
+ import { ConnectService } from "../connect/connect.service.mjs";
6
+ import { FileService } from "../file/file.service.mjs";
7
+ import { SocialPostInput } from "./social.dto.mjs";
8
+ import { SocialPostResult, SocialProvider } from "./social.types.mjs";
9
+
10
+ //#region src/modules/social/social.service.d.ts
11
+ declare class SocialService extends BaseService<{
12
+ connect: ConnectRepository;
13
+ }, {
14
+ connect: ConnectService;
15
+ file: FileService;
16
+ }> {
17
+ private providers;
18
+ constructor(repositories: {
19
+ connect: ConnectRepository;
20
+ }, services: {
21
+ connect: ConnectService;
22
+ file: FileService;
23
+ }, providers: SocialProvider[]);
24
+ getProvider(id: string): SocialProvider | null;
25
+ postToProvider(providerId: string, input: SocialPostInput, {
26
+ actor
27
+ }: {
28
+ actor: RequiredServiceActor<"user">;
29
+ }): ServerResultAsync<SocialPostResult>;
30
+ private ensureFreshConnection;
31
+ }
32
+ //#endregion
33
+ export { SocialService };
34
+ //# sourceMappingURL=social.service.d.mts.map
@@ -0,0 +1,55 @@
1
+ import { BaseService } from "../base/base.service.mjs";
2
+ import { ok } from "neverthrow";
3
+ //#region src/modules/social/social.service.ts
4
+ var SocialService = class extends BaseService {
5
+ providers = /* @__PURE__ */ new Map();
6
+ constructor(repositories, services, providers) {
7
+ super(repositories, services);
8
+ this.providers = new Map(providers.map((provider) => [provider.id, provider]));
9
+ }
10
+ getProvider(id) {
11
+ return this.providers.get(id) ?? null;
12
+ }
13
+ async postToProvider(providerId, input, { actor }) {
14
+ return this.throwableAsync(async () => {
15
+ const provider = this.getProvider(providerId);
16
+ if (!provider) return this.error("BAD_REQUEST", `Unknown provider: ${providerId}`);
17
+ const connectionResult = await this.repository.connect.list({
18
+ userId: actor.userId,
19
+ providers: [providerId]
20
+ });
21
+ if (connectionResult.isErr()) return this.error("INTERNAL_SERVER_ERROR", "Failed to load connection", { cause: connectionResult.error });
22
+ const activeConnection = connectionResult.value.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime())[0];
23
+ const connection = await this.ensureFreshConnection(activeConnection);
24
+ if (connection.isErr()) return this.error("INTERNAL_SERVER_ERROR", "Failed to refresh connection", { cause: connection.error });
25
+ const payload = {
26
+ text: input.text,
27
+ media: input.media,
28
+ visibility: input.visibility ?? "PUBLIC"
29
+ };
30
+ const accessToken = connection.value.accessToken;
31
+ if (!accessToken) return this.error("BAD_REQUEST", "Missing access token for connection");
32
+ return ok(await provider.post({
33
+ deps: { fileService: this.service.file },
34
+ context: {
35
+ userId: actor.userId,
36
+ connection: connection.value,
37
+ accessToken
38
+ },
39
+ payload
40
+ }));
41
+ });
42
+ }
43
+ async ensureFreshConnection(connection) {
44
+ if (!connection.expiresAt || !connection.refreshToken) return ok(connection);
45
+ const expiresAt = new Date(connection.expiresAt);
46
+ if (Date.now() < expiresAt.getTime() - 60 * 1e3) return ok(connection);
47
+ const refreshed = await this.service.connect.refreshToken(connection.id);
48
+ if (refreshed.isErr()) return this.error("INTERNAL_SERVER_ERROR", "Failed to refresh access token", { cause: refreshed.error });
49
+ return ok(refreshed.value);
50
+ }
51
+ };
52
+ //#endregion
53
+ export { SocialService };
54
+
55
+ //# sourceMappingURL=social.service.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"social.service.mjs","names":[],"sources":["../../../../src/modules/social/social.service.ts"],"sourcesContent":["import { ok } from \"neverthrow\";\r\nimport type { RequiredServiceActor } from \"../base/base.actor\";\r\nimport type { ServerResultAsync } from \"../base/base.dto\";\r\nimport { BaseService } from \"../base/base.service\";\r\nimport type { ConnectRepository, ConnectRow } from \"../connect/connect.repository\";\r\nimport type { ConnectService } from \"../connect/connect.service\";\r\nimport type { FileService } from \"../file/file.service\";\r\nimport type { SocialPostInput } from \"./social.dto\";\r\nimport type { SocialPostPayload, SocialPostResult, SocialProvider } from \"./social.types\";\r\n\r\nexport class SocialService extends BaseService<\r\n {\r\n connect: ConnectRepository;\r\n },\r\n {\r\n connect: ConnectService;\r\n file: FileService;\r\n }\r\n> {\r\n private providers = new Map<string, SocialProvider>();\r\n\r\n constructor(\r\n repositories: { connect: ConnectRepository },\r\n services: { connect: ConnectService; file: FileService },\r\n providers: SocialProvider[]\r\n ) {\r\n super(repositories, services);\r\n this.providers = new Map(providers.map((provider) => [provider.id, provider]));\r\n }\r\n\r\n getProvider(id: string): SocialProvider | null {\r\n return this.providers.get(id) ?? null;\r\n }\r\n\r\n async postToProvider(\r\n providerId: string,\r\n input: SocialPostInput,\r\n { actor }: { actor: RequiredServiceActor<\"user\"> }\r\n ): ServerResultAsync<SocialPostResult> {\r\n return this.throwableAsync(async () => {\r\n const provider = this.getProvider(providerId);\r\n if (!provider) {\r\n return this.error(\"BAD_REQUEST\", `Unknown provider: ${providerId}`);\r\n }\r\n\r\n const connectionResult = await this.repository.connect.list({\r\n userId: actor.userId,\r\n providers: [providerId],\r\n });\r\n\r\n if (connectionResult.isErr()) {\r\n return this.error(\"INTERNAL_SERVER_ERROR\", \"Failed to load connection\", {\r\n cause: connectionResult.error,\r\n });\r\n }\r\n\r\n const activeConnection = connectionResult.value.sort(\r\n (a, b) => a.createdAt.getTime() - b.createdAt.getTime()\r\n )[0];\r\n\r\n const connection = await this.ensureFreshConnection(activeConnection);\r\n if (connection.isErr()) {\r\n return this.error(\"INTERNAL_SERVER_ERROR\", \"Failed to refresh connection\", {\r\n cause: connection.error,\r\n });\r\n }\r\n\r\n const payload: SocialPostPayload = {\r\n text: input.text,\r\n media: input.media,\r\n visibility: input.visibility ?? \"PUBLIC\",\r\n };\r\n\r\n const accessToken = connection.value.accessToken;\r\n if (!accessToken) {\r\n return this.error(\"BAD_REQUEST\", \"Missing access token for connection\");\r\n }\r\n\r\n const result = await provider.post({\r\n deps: { fileService: this.service.file },\r\n context: {\r\n userId: actor.userId,\r\n connection: connection.value,\r\n accessToken,\r\n },\r\n payload,\r\n });\r\n\r\n return ok(result);\r\n });\r\n }\r\n\r\n private async ensureFreshConnection(connection: ConnectRow): ServerResultAsync<ConnectRow> {\r\n if (!connection.expiresAt || !connection.refreshToken) {\r\n return ok(connection);\r\n }\r\n\r\n const expiresAt = new Date(connection.expiresAt);\r\n const bufferMs = 60 * 1000; // Refresh 1 minute before expiry\r\n if (Date.now() < expiresAt.getTime() - bufferMs) {\r\n return ok(connection);\r\n }\r\n\r\n const refreshed = await this.service.connect.refreshToken(connection.id);\r\n if (refreshed.isErr()) {\r\n return this.error(\"INTERNAL_SERVER_ERROR\", \"Failed to refresh access token\", {\r\n cause: refreshed.error,\r\n });\r\n }\r\n\r\n return ok(refreshed.value);\r\n }\r\n}\r\n"],"mappings":";;;AAUA,IAAa,gBAAb,cAAmC,YAQjC;CACA,4BAAoB,IAAI,KAA6B;CAErD,YACE,cACA,UACA,WACA;AACA,QAAM,cAAc,SAAS;AAC7B,OAAK,YAAY,IAAI,IAAI,UAAU,KAAK,aAAa,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;;CAGhF,YAAY,IAAmC;AAC7C,SAAO,KAAK,UAAU,IAAI,GAAG,IAAI;;CAGnC,MAAM,eACJ,YACA,OACA,EAAE,SACmC;AACrC,SAAO,KAAK,eAAe,YAAY;GACrC,MAAM,WAAW,KAAK,YAAY,WAAW;AAC7C,OAAI,CAAC,SACH,QAAO,KAAK,MAAM,eAAe,qBAAqB,aAAa;GAGrE,MAAM,mBAAmB,MAAM,KAAK,WAAW,QAAQ,KAAK;IAC1D,QAAQ,MAAM;IACd,WAAW,CAAC,WAAW;IACxB,CAAC;AAEF,OAAI,iBAAiB,OAAO,CAC1B,QAAO,KAAK,MAAM,yBAAyB,6BAA6B,EACtE,OAAO,iBAAiB,OACzB,CAAC;GAGJ,MAAM,mBAAmB,iBAAiB,MAAM,MAC7C,GAAG,MAAM,EAAE,UAAU,SAAS,GAAG,EAAE,UAAU,SAAS,CACxD,CAAC;GAEF,MAAM,aAAa,MAAM,KAAK,sBAAsB,iBAAiB;AACrE,OAAI,WAAW,OAAO,CACpB,QAAO,KAAK,MAAM,yBAAyB,gCAAgC,EACzE,OAAO,WAAW,OACnB,CAAC;GAGJ,MAAM,UAA6B;IACjC,MAAM,MAAM;IACZ,OAAO,MAAM;IACb,YAAY,MAAM,cAAc;IACjC;GAED,MAAM,cAAc,WAAW,MAAM;AACrC,OAAI,CAAC,YACH,QAAO,KAAK,MAAM,eAAe,sCAAsC;AAazE,UAAO,GAVQ,MAAM,SAAS,KAAK;IACjC,MAAM,EAAE,aAAa,KAAK,QAAQ,MAAM;IACxC,SAAS;KACP,QAAQ,MAAM;KACd,YAAY,WAAW;KACvB;KACD;IACD;IACD,CAAC,CAEe;IACjB;;CAGJ,MAAc,sBAAsB,YAAuD;AACzF,MAAI,CAAC,WAAW,aAAa,CAAC,WAAW,aACvC,QAAO,GAAG,WAAW;EAGvB,MAAM,YAAY,IAAI,KAAK,WAAW,UAAU;AAEhD,MAAI,KAAK,KAAK,GAAG,UAAU,SAAS,GADnB,KAAK,IAEpB,QAAO,GAAG,WAAW;EAGvB,MAAM,YAAY,MAAM,KAAK,QAAQ,QAAQ,aAAa,WAAW,GAAG;AACxE,MAAI,UAAU,OAAO,CACnB,QAAO,KAAK,MAAM,yBAAyB,kCAAkC,EAC3E,OAAO,UAAU,OAClB,CAAC;AAGJ,SAAO,GAAG,UAAU,MAAM"}
@@ -0,0 +1,40 @@
1
+ import { ConnectRow } from "../connect/connect.repository.mjs";
2
+ import { FileService } from "../file/file.service.mjs";
3
+
4
+ //#region src/modules/social/social.types.d.ts
5
+ type SocialMediaType = "image" | "video" | "document";
6
+ interface SocialMediaDescriptor {
7
+ readonly s3Path: string;
8
+ readonly mediaType?: SocialMediaType;
9
+ readonly title?: string;
10
+ readonly description?: string;
11
+ }
12
+ type SocialVisibility = "PUBLIC" | "CONNECTIONS";
13
+ interface SocialPostPayload {
14
+ readonly text: string;
15
+ readonly media?: readonly SocialMediaDescriptor[];
16
+ readonly visibility: SocialVisibility;
17
+ }
18
+ interface SocialProviderContext {
19
+ readonly userId: string;
20
+ readonly connection: ConnectRow;
21
+ readonly accessToken: string;
22
+ }
23
+ interface SocialProviderDeps {
24
+ readonly fileService: FileService;
25
+ }
26
+ interface SocialPostResult {
27
+ readonly shareUrn?: string;
28
+ readonly rawResponse?: unknown;
29
+ }
30
+ interface SocialProvider {
31
+ readonly id: string;
32
+ post(options: {
33
+ deps: SocialProviderDeps;
34
+ context: SocialProviderContext;
35
+ payload: SocialPostPayload;
36
+ }): Promise<SocialPostResult>;
37
+ }
38
+ //#endregion
39
+ export { SocialMediaDescriptor, SocialMediaType, SocialPostPayload, SocialPostResult, SocialProvider, SocialProviderContext, SocialProviderDeps, SocialVisibility };
40
+ //# sourceMappingURL=social.types.d.mts.map