payload-plugin-telegram 0.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 (37) hide show
  1. package/dist/collections/TelegramChats.d.ts +4 -0
  2. package/dist/collections/TelegramChats.d.ts.map +1 -0
  3. package/dist/collections/TelegramChats.js +41 -0
  4. package/dist/collections/TelegramChats.js.map +1 -0
  5. package/dist/collections/TelegramUploads.d.ts +4 -0
  6. package/dist/collections/TelegramUploads.d.ts.map +1 -0
  7. package/dist/collections/TelegramUploads.js +51 -0
  8. package/dist/collections/TelegramUploads.js.map +1 -0
  9. package/dist/endpoints/webhook.d.ts +4 -0
  10. package/dist/endpoints/webhook.d.ts.map +1 -0
  11. package/dist/endpoints/webhook.js +260 -0
  12. package/dist/endpoints/webhook.js.map +1 -0
  13. package/dist/hooks/injectTelegramId.d.ts +3 -0
  14. package/dist/hooks/injectTelegramId.d.ts.map +1 -0
  15. package/dist/hooks/injectTelegramId.js +18 -0
  16. package/dist/hooks/injectTelegramId.js.map +1 -0
  17. package/dist/index.d.ts +4 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +4 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/lib/responses.d.ts +3 -0
  22. package/dist/lib/responses.d.ts.map +1 -0
  23. package/dist/lib/responses.js +10 -0
  24. package/dist/lib/responses.js.map +1 -0
  25. package/dist/lib/telegram.d.ts +6 -0
  26. package/dist/lib/telegram.d.ts.map +1 -0
  27. package/dist/lib/telegram.js +64 -0
  28. package/dist/lib/telegram.js.map +1 -0
  29. package/dist/plugin.d.ts +3 -0
  30. package/dist/plugin.d.ts.map +1 -0
  31. package/dist/plugin.js +40 -0
  32. package/dist/plugin.js.map +1 -0
  33. package/dist/types.d.ts +115 -0
  34. package/dist/types.d.ts.map +1 -0
  35. package/dist/types.js +2 -0
  36. package/dist/types.js.map +1 -0
  37. package/package.json +40 -0
@@ -0,0 +1,4 @@
1
+ import type { CollectionConfig } from 'payload';
2
+ import type { PluginContext } from '../types.js';
3
+ export declare function buildTelegramChats(ctx: PluginContext): CollectionConfig;
4
+ //# sourceMappingURL=TelegramChats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelegramChats.d.ts","sourceRoot":"","sources":["../../src/collections/TelegramChats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,GAAG,gBAAgB,CAuCvE"}
@@ -0,0 +1,41 @@
1
+ export function buildTelegramChats(ctx) {
2
+ return {
3
+ slug: ctx.collectionSlugs.chats,
4
+ admin: {
5
+ group: 'Telegram',
6
+ useAsTitle: 'chatTitle',
7
+ },
8
+ access: ctx.config.access?.admin ?? {},
9
+ fields: [
10
+ {
11
+ name: 'chatId',
12
+ type: 'text',
13
+ required: true,
14
+ unique: true,
15
+ index: true,
16
+ },
17
+ {
18
+ name: 'chatTitle',
19
+ type: 'text',
20
+ },
21
+ {
22
+ name: 'tenant',
23
+ type: 'relationship',
24
+ relationTo: ctx.tenantsSlug,
25
+ required: true,
26
+ },
27
+ {
28
+ name: 'status',
29
+ type: 'select',
30
+ required: true,
31
+ defaultValue: 'active',
32
+ options: [
33
+ { label: 'Active', value: 'active' },
34
+ { label: 'Inactive', value: 'inactive' },
35
+ ],
36
+ },
37
+ ],
38
+ timestamps: true,
39
+ };
40
+ }
41
+ //# sourceMappingURL=TelegramChats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelegramChats.js","sourceRoot":"","sources":["../../src/collections/TelegramChats.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,kBAAkB,CAAC,GAAkB;IACnD,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,eAAe,CAAC,KAAK;QAC/B,KAAK,EAAE;YACL,KAAK,EAAE,UAAU;YACjB,UAAU,EAAE,WAAW;SACxB;QACD,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,IAAI;aACZ;YACD;gBACE,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,MAAM;aACb;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,cAAc;gBACpB,UAAU,EAAE,GAAG,CAAC,WAAW;gBAC3B,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI;gBACd,YAAY,EAAE,QAAQ;gBACtB,OAAO,EAAE;oBACP,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACpC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;iBACzC;aACF;SACF;QACD,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CollectionConfig } from 'payload';
2
+ import type { PluginContext } from '../types.js';
3
+ export declare function buildTelegramUploads(ctx: PluginContext): CollectionConfig;
4
+ //# sourceMappingURL=TelegramUploads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelegramUploads.d.ts","sourceRoot":"","sources":["../../src/collections/TelegramUploads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,gBAAgB,CAkDzE"}
@@ -0,0 +1,51 @@
1
+ export function buildTelegramUploads(ctx) {
2
+ const mediaCollection = ctx.config.mediaCollection ?? 'media';
3
+ return {
4
+ slug: ctx.collectionSlugs.uploads,
5
+ admin: {
6
+ group: 'Telegram',
7
+ useAsTitle: 'fileId',
8
+ },
9
+ access: ctx.config.access?.admin ?? {},
10
+ fields: [
11
+ {
12
+ name: 'fileId',
13
+ type: 'text',
14
+ required: true,
15
+ },
16
+ {
17
+ name: 'mediaDoc',
18
+ type: 'relationship',
19
+ relationTo: mediaCollection,
20
+ },
21
+ {
22
+ name: 'tenant',
23
+ type: 'relationship',
24
+ relationTo: ctx.tenantsSlug,
25
+ },
26
+ {
27
+ name: 'telegramUser',
28
+ type: 'json',
29
+ },
30
+ {
31
+ name: 'chatId',
32
+ type: 'text',
33
+ },
34
+ {
35
+ name: 'status',
36
+ type: 'select',
37
+ required: true,
38
+ options: [
39
+ { label: 'Success', value: 'success' },
40
+ { label: 'Failed', value: 'failed' },
41
+ ],
42
+ },
43
+ {
44
+ name: 'error',
45
+ type: 'text',
46
+ },
47
+ ],
48
+ timestamps: true,
49
+ };
50
+ }
51
+ //# sourceMappingURL=TelegramUploads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelegramUploads.js","sourceRoot":"","sources":["../../src/collections/TelegramUploads.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,oBAAoB,CAAC,GAAkB;IACrD,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,OAAO,CAAC;IAE9D,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,eAAe,CAAC,OAAO;QACjC,KAAK,EAAE;YACL,KAAK,EAAE,UAAU;YACjB,UAAU,EAAE,QAAQ;SACrB;QACD,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,cAAc;gBACpB,UAAU,EAAE,eAAe;aAC5B;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,cAAc;gBACpB,UAAU,EAAE,GAAG,CAAC,WAAW;aAC5B;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,MAAM;aACb;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,MAAM;aACb;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE;oBACP,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;oBACtC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;iBACrC;aACF;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,MAAM;aACb;SACF;QACD,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Endpoint } from 'payload';
2
+ import type { PluginContext } from '../types.js';
3
+ export declare function buildWebhookEndpoint(ctx: PluginContext): Endpoint;
4
+ //# sourceMappingURL=webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/endpoints/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA2B,MAAM,SAAS,CAAC;AACjE,OAAO,KAAK,EACV,aAAa,EAKd,MAAM,aAAa,CAAC;AAIrB,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,QAAQ,CAuCjE"}
@@ -0,0 +1,260 @@
1
+ import { getFile, downloadFile, sendMessage, answerCallbackQuery } from '../lib/telegram.js';
2
+ import { jsonResponse, errorResponse } from '../lib/responses.js';
3
+ export function buildWebhookEndpoint(ctx) {
4
+ const mediaCollection = ctx.config.mediaCollection ?? 'media';
5
+ const defaultAlt = ctx.config.defaultAlt ?? 'Uploaded via Telegram';
6
+ return {
7
+ path: '/telegram/webhook',
8
+ method: 'post',
9
+ handler: async (req) => {
10
+ // Validate webhook secret
11
+ const secretHeader = req.headers.get('x-telegram-bot-api-secret-token');
12
+ if (secretHeader !== ctx.config.webhookSecret) {
13
+ return errorResponse('Invalid secret token', 403);
14
+ }
15
+ const payload = req.payload;
16
+ let update;
17
+ try {
18
+ if (!req.json)
19
+ return errorResponse('No JSON parser available', 500);
20
+ update = (await req.json());
21
+ }
22
+ catch {
23
+ return errorResponse('Invalid JSON body', 400);
24
+ }
25
+ // Handle callback queries (tenant selection from /link)
26
+ if (update.callback_query) {
27
+ await handleCallbackQuery(payload, update.callback_query, ctx);
28
+ return jsonResponse({ ok: true });
29
+ }
30
+ // Handle messages
31
+ if (update.message) {
32
+ await handleMessage(payload, update.message, ctx, mediaCollection, defaultAlt);
33
+ return jsonResponse({ ok: true });
34
+ }
35
+ return jsonResponse({ ok: true });
36
+ },
37
+ };
38
+ }
39
+ async function handleMessage(payload, message, ctx, mediaCollection, defaultAlt) {
40
+ const token = ctx.config.botToken;
41
+ // Check for /link command
42
+ if (message.text && message.entities) {
43
+ const commandEntity = message.entities.find((e) => e.type === 'bot_command');
44
+ if (commandEntity) {
45
+ const command = message.text.slice(commandEntity.offset, commandEntity.offset + commandEntity.length);
46
+ if (command === '/link' || command.startsWith('/link@')) {
47
+ await handleLinkCommand(payload, message, ctx);
48
+ return;
49
+ }
50
+ if (command === '/start' || command.startsWith('/start@')) {
51
+ await sendMessage(token, message.chat.id, 'Send photos to upload them to the CMS. Use /link to connect this chat to a tenant.');
52
+ return;
53
+ }
54
+ }
55
+ }
56
+ // Must have a photo or image document
57
+ const hasPhoto = message.photo && message.photo.length > 0;
58
+ const hasImageDoc = message.document?.mime_type?.startsWith('image/');
59
+ if (!hasPhoto && !hasImageDoc) {
60
+ return; // Silently ignore non-image messages
61
+ }
62
+ // Verify sender is in allowlist
63
+ if (!message.from)
64
+ return;
65
+ const users = await payload.find({
66
+ collection: ctx.usersSlug,
67
+ where: { telegramId: { equals: String(message.from.id) } },
68
+ limit: 1,
69
+ });
70
+ if (users.docs.length === 0) {
71
+ await sendMessage(token, message.chat.id, 'You are not authorized to upload. Ask an admin to add your Telegram ID to your CMS user profile.');
72
+ return;
73
+ }
74
+ // Look up chat → tenant mapping
75
+ const chatMapping = await payload.find({
76
+ collection: ctx.collectionSlugs.chats,
77
+ where: {
78
+ chatId: { equals: String(message.chat.id) },
79
+ status: { equals: 'active' },
80
+ },
81
+ limit: 1,
82
+ });
83
+ if (chatMapping.docs.length === 0) {
84
+ await sendMessage(token, message.chat.id, 'This chat is not linked to a tenant. Use /link to set it up.');
85
+ return;
86
+ }
87
+ const chatDoc = chatMapping.docs[0];
88
+ const tenantId = typeof chatDoc.tenant === 'object' ? chatDoc.tenant.id : chatDoc.tenant;
89
+ // Get the file ID — at this point we know either photo or document exists
90
+ let fileId;
91
+ let fileName;
92
+ let mimeType;
93
+ if (hasPhoto && message.photo) {
94
+ const largestPhoto = message.photo[message.photo.length - 1];
95
+ fileId = largestPhoto.file_id;
96
+ fileName = `telegram_${message.message_id}.jpg`;
97
+ mimeType = 'image/jpeg';
98
+ }
99
+ else if (message.document) {
100
+ fileId = message.document.file_id;
101
+ fileName = message.document.file_name ?? `telegram_${message.message_id}`;
102
+ mimeType = message.document.mime_type ?? 'application/octet-stream';
103
+ }
104
+ else {
105
+ return;
106
+ }
107
+ try {
108
+ // Download file from Telegram
109
+ const fileInfo = await getFile(token, fileId);
110
+ if (!fileInfo.file_path) {
111
+ throw new Error('No file_path returned from Telegram');
112
+ }
113
+ const fileBuffer = await downloadFile(token, fileInfo.file_path);
114
+ // Create Media document
115
+ const altText = message.caption ?? defaultAlt;
116
+ const mediaDoc = await payload.create({
117
+ collection: mediaCollection,
118
+ data: {
119
+ alt: altText,
120
+ tenant: tenantId,
121
+ },
122
+ file: {
123
+ data: fileBuffer,
124
+ mimetype: mimeType,
125
+ name: fileName,
126
+ size: fileBuffer.length,
127
+ },
128
+ });
129
+ // Log the upload
130
+ await payload.create({
131
+ collection: ctx.collectionSlugs.uploads,
132
+ data: {
133
+ fileId,
134
+ mediaDoc: mediaDoc.id,
135
+ tenant: tenantId,
136
+ telegramUser: {
137
+ id: message.from.id,
138
+ firstName: message.from.first_name,
139
+ username: message.from.username,
140
+ },
141
+ chatId: String(message.chat.id),
142
+ status: 'success',
143
+ },
144
+ });
145
+ await sendMessage(token, message.chat.id, `Uploaded <b>${fileName}</b>`);
146
+ }
147
+ catch (err) {
148
+ const errorMessage = err instanceof Error ? err.message : 'Unknown error';
149
+ // Log the failed upload
150
+ await payload.create({
151
+ collection: ctx.collectionSlugs.uploads,
152
+ data: {
153
+ fileId,
154
+ tenant: tenantId,
155
+ telegramUser: {
156
+ id: message.from.id,
157
+ firstName: message.from.first_name,
158
+ username: message.from.username,
159
+ },
160
+ chatId: String(message.chat.id),
161
+ status: 'failed',
162
+ error: errorMessage,
163
+ },
164
+ });
165
+ await sendMessage(token, message.chat.id, `Upload failed: ${errorMessage}`);
166
+ }
167
+ }
168
+ async function handleLinkCommand(payload, message, ctx) {
169
+ const token = ctx.config.botToken;
170
+ // Verify sender is in allowlist
171
+ if (!message.from)
172
+ return;
173
+ const users = await payload.find({
174
+ collection: ctx.usersSlug,
175
+ where: { telegramId: { equals: String(message.from.id) } },
176
+ limit: 1,
177
+ });
178
+ if (users.docs.length === 0) {
179
+ await sendMessage(token, message.chat.id, 'You are not authorized. Ask an admin to add your Telegram ID to your CMS user profile.');
180
+ return;
181
+ }
182
+ // Fetch all tenants
183
+ const tenants = await payload.find({
184
+ collection: ctx.tenantsSlug,
185
+ limit: 100,
186
+ });
187
+ if (tenants.docs.length === 0) {
188
+ await sendMessage(token, message.chat.id, 'No tenants found in the CMS.');
189
+ return;
190
+ }
191
+ // Build inline keyboard with tenant options
192
+ const keyboard = tenants.docs.map((tenant) => [
193
+ {
194
+ text: tenant.name,
195
+ callback_data: `link:${tenant.id}`,
196
+ },
197
+ ]);
198
+ await sendMessage(token, message.chat.id, 'Select the tenant to link this chat to:', { inline_keyboard: keyboard });
199
+ }
200
+ async function handleCallbackQuery(payload, query, ctx) {
201
+ const token = ctx.config.botToken;
202
+ if (!query.data?.startsWith('link:')) {
203
+ await answerCallbackQuery(token, query.id);
204
+ return;
205
+ }
206
+ const tenantId = query.data.slice(5);
207
+ const chatId = query.message?.chat.id;
208
+ const chatTitle = query.message?.chat.title;
209
+ if (!chatId) {
210
+ await answerCallbackQuery(token, query.id, 'Could not determine chat.');
211
+ return;
212
+ }
213
+ // Verify sender is in allowlist
214
+ const users = await payload.find({
215
+ collection: ctx.usersSlug,
216
+ where: { telegramId: { equals: String(query.from.id) } },
217
+ limit: 1,
218
+ });
219
+ if (users.docs.length === 0) {
220
+ await answerCallbackQuery(token, query.id, 'Not authorized.');
221
+ return;
222
+ }
223
+ // Upsert the chat mapping
224
+ const existing = await payload.find({
225
+ collection: ctx.collectionSlugs.chats,
226
+ where: { chatId: { equals: String(chatId) } },
227
+ limit: 1,
228
+ });
229
+ if (existing.docs.length > 0) {
230
+ await payload.update({
231
+ collection: ctx.collectionSlugs.chats,
232
+ id: existing.docs[0].id,
233
+ data: {
234
+ tenant: tenantId,
235
+ chatTitle: chatTitle ?? undefined,
236
+ status: 'active',
237
+ },
238
+ });
239
+ }
240
+ else {
241
+ await payload.create({
242
+ collection: ctx.collectionSlugs.chats,
243
+ data: {
244
+ chatId: String(chatId),
245
+ chatTitle: chatTitle ?? undefined,
246
+ tenant: tenantId,
247
+ status: 'active',
248
+ },
249
+ });
250
+ }
251
+ // Fetch tenant name for confirmation
252
+ const tenant = await payload.findByID({
253
+ collection: ctx.tenantsSlug,
254
+ id: tenantId,
255
+ });
256
+ const tenantName = tenant.name;
257
+ await answerCallbackQuery(token, query.id, `Linked to ${tenantName}`);
258
+ await sendMessage(token, chatId, `This chat is now linked to <b>${tenantName}</b>. Send photos to upload them.`);
259
+ }
260
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/endpoints/webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CollectionConfig } from 'payload';
2
+ export declare function injectTelegramIdField(collection: CollectionConfig): CollectionConfig;
3
+ //# sourceMappingURL=injectTelegramId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectTelegramId.d.ts","sourceRoot":"","sources":["../../src/hooks/injectTelegramId.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,gBAAgB,GAAG,gBAAgB,CAgBpF"}
@@ -0,0 +1,18 @@
1
+ export function injectTelegramIdField(collection) {
2
+ return {
3
+ ...collection,
4
+ fields: [
5
+ ...collection.fields,
6
+ {
7
+ name: 'telegramId',
8
+ type: 'text',
9
+ admin: {
10
+ position: 'sidebar',
11
+ description: 'Telegram user ID for bot upload allowlist',
12
+ },
13
+ index: true,
14
+ },
15
+ ],
16
+ };
17
+ }
18
+ //# sourceMappingURL=injectTelegramId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectTelegramId.js","sourceRoot":"","sources":["../../src/hooks/injectTelegramId.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,UAA4B;IAChE,OAAO;QACL,GAAG,UAAU;QACb,MAAM,EAAE;YACN,GAAG,UAAU,CAAC,MAAM;YACpB;gBACE,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE;oBACL,QAAQ,EAAE,SAAS;oBACnB,WAAW,EAAE,2CAA2C;iBACzD;gBACD,KAAK,EAAE,IAAI;aACZ;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { telegramPlugin } from './plugin.js';
2
+ export type { TelegramPluginConfig, TelegramPlugin, PluginContext, TelegramChatDoc, TelegramUploadDoc, TelegramUserInfo, TelegramUpdate, TelegramMessage, TelegramUser, TelegramChat, TelegramPhotoSize, TelegramDocument, TelegramCallbackQuery, TelegramFile, } from './types.js';
3
+ export { getFile, downloadFile, sendMessage, answerCallbackQuery } from './lib/telegram.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,YAAY,EACV,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { telegramPlugin } from './plugin.js';
2
+ // Utilities (for custom usage)
3
+ export { getFile, downloadFile, sendMessage, answerCallbackQuery } from './lib/telegram.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAoB7C,+BAA+B;AAC/B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function jsonResponse(data: unknown, status?: number): Response;
2
+ export declare function errorResponse(message: string, status?: number): Response;
3
+ //# sourceMappingURL=responses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../src/lib/responses.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,SAAM,GAAG,QAAQ,CAKlE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAM,GAAG,QAAQ,CAErE"}
@@ -0,0 +1,10 @@
1
+ export function jsonResponse(data, status = 200) {
2
+ return new Response(JSON.stringify(data), {
3
+ status,
4
+ headers: { 'Content-Type': 'application/json' },
5
+ });
6
+ }
7
+ export function errorResponse(message, status = 400) {
8
+ return jsonResponse({ error: message }, status);
9
+ }
10
+ //# sourceMappingURL=responses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/lib/responses.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG;IACtD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,MAAM,GAAG,GAAG;IACzD,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { TelegramFile } from '../types.js';
2
+ export declare function getFile(token: string, fileId: string): Promise<TelegramFile>;
3
+ export declare function downloadFile(token: string, filePath: string): Promise<Buffer>;
4
+ export declare function sendMessage(token: string, chatId: number, text: string, replyMarkup?: Record<string, unknown>): Promise<void>;
5
+ export declare function answerCallbackQuery(token: string, callbackQueryId: string, text?: string): Promise<void>;
6
+ //# sourceMappingURL=telegram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/lib/telegram.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQhD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAiBlF;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASnF;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,EACvB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAmBf"}
@@ -0,0 +1,64 @@
1
+ const API_BASE = 'https://api.telegram.org';
2
+ function botUrl(token, method) {
3
+ return `${API_BASE}/bot${token}/${method}`;
4
+ }
5
+ export async function getFile(token, fileId) {
6
+ const res = await fetch(botUrl(token, 'getFile'), {
7
+ method: 'POST',
8
+ headers: { 'Content-Type': 'application/json' },
9
+ body: JSON.stringify({ file_id: fileId }),
10
+ });
11
+ if (!res.ok) {
12
+ throw new Error(`getFile failed: ${res.status} ${res.statusText}`);
13
+ }
14
+ const data = (await res.json());
15
+ if (!data.ok) {
16
+ throw new Error('getFile returned ok=false');
17
+ }
18
+ return data.result;
19
+ }
20
+ export async function downloadFile(token, filePath) {
21
+ const url = `${API_BASE}/file/bot${token}/${filePath}`;
22
+ const res = await fetch(url);
23
+ if (!res.ok) {
24
+ throw new Error(`downloadFile failed: ${res.status} ${res.statusText}`);
25
+ }
26
+ return Buffer.from(await res.arrayBuffer());
27
+ }
28
+ export async function sendMessage(token, chatId, text, replyMarkup) {
29
+ const body = {
30
+ chat_id: chatId,
31
+ text,
32
+ parse_mode: 'HTML',
33
+ };
34
+ if (replyMarkup) {
35
+ body.reply_markup = replyMarkup;
36
+ }
37
+ const res = await fetch(botUrl(token, 'sendMessage'), {
38
+ method: 'POST',
39
+ headers: { 'Content-Type': 'application/json' },
40
+ body: JSON.stringify(body),
41
+ });
42
+ if (!res.ok) {
43
+ const err = await res.text();
44
+ throw new Error(`sendMessage failed: ${res.status} ${err}`);
45
+ }
46
+ }
47
+ export async function answerCallbackQuery(token, callbackQueryId, text) {
48
+ const body = {
49
+ callback_query_id: callbackQueryId,
50
+ };
51
+ if (text) {
52
+ body.text = text;
53
+ }
54
+ const res = await fetch(botUrl(token, 'answerCallbackQuery'), {
55
+ method: 'POST',
56
+ headers: { 'Content-Type': 'application/json' },
57
+ body: JSON.stringify(body),
58
+ });
59
+ if (!res.ok) {
60
+ const err = await res.text();
61
+ throw new Error(`answerCallbackQuery failed: ${res.status} ${err}`);
62
+ }
63
+ }
64
+ //# sourceMappingURL=telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/lib/telegram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { TelegramPluginConfig, TelegramPlugin } from './types.js';
2
+ export declare function telegramPlugin(pluginConfig: TelegramPluginConfig): TelegramPlugin;
3
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAMtF,wBAAgB,cAAc,CAAC,YAAY,EAAE,oBAAoB,GAAG,cAAc,CAqCjF"}
package/dist/plugin.js ADDED
@@ -0,0 +1,40 @@
1
+ import { buildTelegramChats } from './collections/TelegramChats.js';
2
+ import { buildTelegramUploads } from './collections/TelegramUploads.js';
3
+ import { injectTelegramIdField } from './hooks/injectTelegramId.js';
4
+ import { buildWebhookEndpoint } from './endpoints/webhook.js';
5
+ export function telegramPlugin(pluginConfig) {
6
+ return (incomingConfig) => {
7
+ const prefix = pluginConfig.slugPrefix ?? 'telegram';
8
+ const collectionSlugs = {
9
+ chats: `${prefix}-chats`,
10
+ uploads: `${prefix}-uploads`,
11
+ };
12
+ const usersSlug = incomingConfig.admin?.user ?? 'users';
13
+ const tenantsSlug = pluginConfig.tenantsCollection ?? 'tenants';
14
+ const ctx = {
15
+ config: pluginConfig,
16
+ collectionSlugs,
17
+ usersSlug,
18
+ tenantsSlug,
19
+ };
20
+ const modifiedCollections = (incomingConfig.collections ?? []).map((collection) => {
21
+ if (collection.slug === usersSlug) {
22
+ return injectTelegramIdField(collection);
23
+ }
24
+ return collection;
25
+ });
26
+ return {
27
+ ...incomingConfig,
28
+ collections: [
29
+ ...modifiedCollections,
30
+ buildTelegramChats(ctx),
31
+ buildTelegramUploads(ctx),
32
+ ],
33
+ endpoints: [
34
+ ...(incomingConfig.endpoints ?? []),
35
+ buildWebhookEndpoint(ctx),
36
+ ],
37
+ };
38
+ };
39
+ }
40
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,UAAU,cAAc,CAAC,YAAkC;IAC/D,OAAO,CAAC,cAAsB,EAAU,EAAE;QACxC,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,IAAI,UAAU,CAAC;QACrD,MAAM,eAAe,GAAG;YACtB,KAAK,EAAE,GAAG,MAAM,QAAQ;YACxB,OAAO,EAAE,GAAG,MAAM,UAAU;SAC7B,CAAC;QAEF,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,IAAI,OAAO,CAAC;QACxD,MAAM,WAAW,GAAG,YAAY,CAAC,iBAAiB,IAAI,SAAS,CAAC;QAEhE,MAAM,GAAG,GAAkB;YACzB,MAAM,EAAE,YAAY;YACpB,eAAe;YACf,SAAS;YACT,WAAW;SACZ,CAAC;QACF,MAAM,mBAAmB,GAAG,CAAC,cAAc,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;YAChF,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAClC,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,GAAG,cAAc;YACjB,WAAW,EAAE;gBACX,GAAG,mBAAmB;gBACtB,kBAAkB,CAAC,GAAG,CAAC;gBACvB,oBAAoB,CAAC,GAAG,CAAC;aAC1B;YACD,SAAS,EAAE;gBACT,GAAG,CAAC,cAAc,CAAC,SAAS,IAAI,EAAE,CAAC;gBACnC,oBAAoB,CAAC,GAAG,CAAC;aAC1B;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,115 @@
1
+ import type { CollectionConfig, Config } from 'payload';
2
+ export interface TelegramPluginConfig {
3
+ /** Telegram Bot API token from @BotFather */
4
+ botToken: string;
5
+ /** Secret token for webhook validation (X-Telegram-Bot-Api-Secret-Token) */
6
+ webhookSecret: string;
7
+ /** Target media collection slug (default: 'media') */
8
+ mediaCollection?: string;
9
+ /** Tenants collection slug (default: 'tenants') */
10
+ tenantsCollection?: string;
11
+ /** Slug prefix for plugin collections (default: 'telegram') */
12
+ slugPrefix?: string;
13
+ /** Default alt text for uploaded images (default: 'Uploaded via Telegram') */
14
+ defaultAlt?: string;
15
+ /** Access control overrides for plugin collections */
16
+ access?: {
17
+ admin?: CollectionConfig['access'];
18
+ };
19
+ }
20
+ export type TelegramPlugin = (config: Config) => Config;
21
+ export interface PluginContext {
22
+ config: TelegramPluginConfig;
23
+ collectionSlugs: {
24
+ chats: string;
25
+ uploads: string;
26
+ };
27
+ usersSlug: string;
28
+ tenantsSlug: string;
29
+ }
30
+ export interface TelegramChatDoc {
31
+ id: string;
32
+ chatId: string;
33
+ chatTitle?: string;
34
+ tenant: string | number;
35
+ status: 'active' | 'inactive';
36
+ createdAt: string;
37
+ updatedAt: string;
38
+ }
39
+ export interface TelegramUploadDoc {
40
+ id: string;
41
+ fileId: string;
42
+ mediaDoc?: string | number;
43
+ tenant?: string | number;
44
+ telegramUser?: TelegramUserInfo;
45
+ chatId?: string;
46
+ status: 'success' | 'failed';
47
+ error?: string;
48
+ createdAt: string;
49
+ updatedAt: string;
50
+ }
51
+ export interface TelegramUserInfo {
52
+ id: number;
53
+ firstName: string;
54
+ username?: string;
55
+ }
56
+ export interface TelegramUpdate {
57
+ update_id: number;
58
+ message?: TelegramMessage;
59
+ callback_query?: TelegramCallbackQuery;
60
+ }
61
+ export interface TelegramMessage {
62
+ message_id: number;
63
+ from?: TelegramUser;
64
+ chat: TelegramChat;
65
+ date: number;
66
+ text?: string;
67
+ photo?: TelegramPhotoSize[];
68
+ document?: TelegramDocument;
69
+ caption?: string;
70
+ entities?: TelegramMessageEntity[];
71
+ }
72
+ export interface TelegramUser {
73
+ id: number;
74
+ is_bot: boolean;
75
+ first_name: string;
76
+ last_name?: string;
77
+ username?: string;
78
+ }
79
+ export interface TelegramChat {
80
+ id: number;
81
+ type: 'private' | 'group' | 'supergroup' | 'channel';
82
+ title?: string;
83
+ }
84
+ export interface TelegramPhotoSize {
85
+ file_id: string;
86
+ file_unique_id: string;
87
+ width: number;
88
+ height: number;
89
+ file_size?: number;
90
+ }
91
+ export interface TelegramDocument {
92
+ file_id: string;
93
+ file_unique_id: string;
94
+ file_name?: string;
95
+ mime_type?: string;
96
+ file_size?: number;
97
+ }
98
+ export interface TelegramMessageEntity {
99
+ type: string;
100
+ offset: number;
101
+ length: number;
102
+ }
103
+ export interface TelegramCallbackQuery {
104
+ id: string;
105
+ from: TelegramUser;
106
+ message?: TelegramMessage;
107
+ data?: string;
108
+ }
109
+ export interface TelegramFile {
110
+ file_id: string;
111
+ file_unique_id: string;
112
+ file_size?: number;
113
+ file_path?: string;
114
+ }
115
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "payload-plugin-telegram",
3
+ "version": "0.1.0",
4
+ "description": "Payload CMS 3.x plugin for uploading media via Telegram bot",
5
+ "license": "Elastic-2.0",
6
+ "type": "module",
7
+ "packageManager": "pnpm@10.29.3",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "dev": "tsc --watch",
22
+ "lint": "eslint src/",
23
+ "typecheck": "tsc --noEmit",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest",
26
+ "test:coverage": "vitest run --coverage"
27
+ },
28
+ "peerDependencies": {
29
+ "payload": "^3.0.0"
30
+ },
31
+ "devDependencies": {
32
+ "@typescript-eslint/eslint-plugin": "^8.56.0",
33
+ "@typescript-eslint/parser": "^8.56.0",
34
+ "eslint": "^10.0.1",
35
+ "payload": "^3.77.0",
36
+ "typescript": "^5.9.3",
37
+ "typescript-eslint": "^8.56.0",
38
+ "vitest": "^4.0.18"
39
+ }
40
+ }