Skip to content

Commit d3e69f5

Browse files
authored
feat: upload photo to s3 (#159)
1 parent b8a07a2 commit d3e69f5

2 files changed

Lines changed: 44 additions & 11 deletions

File tree

apps/web-app/server/services/telegram/wasabi-bot.ts

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import { repository } from '@roll-stack/database'
44
import { Bot } from 'grammy'
55
import { generateAccessCode } from './common'
66

7+
const S3_TELEGRAM_DIRECTORY = 'telegram/files'
8+
79
const logger = useLogger('telegram:wasabi-bot')
8-
const { telegram } = useRuntimeConfig()
10+
const { telegram, public: { mediaUrl } } = useRuntimeConfig()
911

1012
let bot: Bot | null = null
1113

@@ -131,21 +133,36 @@ async function handlePhoto(ctx: Context) {
131133
return
132134
}
133135

136+
const fileId = bestQuality.file_id
137+
134138
const botToken = await getBotToken()
135139
if (!botToken) {
136140
return null
137141
}
138142

139-
const downloadUrl = await getFileDownloadUrl({ ctx, fileId: bestQuality.file_id, botToken })
143+
const downloadUrl = await getFileDownloadUrl({ ctx, fileId, botToken })
144+
if (!downloadUrl) {
145+
return
146+
}
147+
148+
const extension = downloadUrl.split('.').pop()
149+
const buffer = await fetch(downloadUrl).then((res) => res.arrayBuffer())
150+
151+
const fileUri = `/${S3_TELEGRAM_DIRECTORY}/${fileId}.${extension}`
152+
const fileUrl = `${mediaUrl}${fileUri}`
153+
154+
const storage = useStorage('s3')
155+
await storage.setItemRaw(fileUri, buffer)
140156

141157
await repository.ticket.createMessage({
142158
ticketId: data.ticket.id,
143159
userId: data.user.id,
144-
text: JSON.stringify({ downloadUrl, photo: ctx.message.photo }),
160+
telegramFileId: fileId,
161+
fileUrl,
162+
text: ctx.message.caption ?? '',
145163
})
146164

147-
// Save photo?
148-
logger.log('photo', data.user.id, ctx.message.from.id, ctx.message.text, ctx.message.photo, downloadUrl)
165+
logger.log('photo', data.user.id, ctx.message.from.id, ctx.message.caption, ctx.message.photo, downloadUrl)
149166
ctx.reply('Фото передано в службу поддержки.')
150167
}
151168

@@ -159,14 +176,21 @@ async function handleVideo(ctx: Context) {
159176
return
160177
}
161178

179+
const botToken = await getBotToken()
180+
if (!botToken) {
181+
return null
182+
}
183+
184+
const downloadUrl = await getFileDownloadUrl({ ctx, fileId: ctx.message.video.file_id, botToken })
185+
162186
await repository.ticket.createMessage({
163187
ticketId: data.ticket.id,
164188
userId: data.user.id,
165-
text: JSON.stringify(ctx.message.video),
189+
telegramFileId: ctx.message.video.file_id,
190+
text: ctx.message.caption ?? '',
166191
})
167192

168-
// Save video?
169-
logger.log('video', data.user.id, ctx.message.from.id, ctx.message.text, ctx.message.video)
193+
logger.log('video', data.user.id, ctx.message.from.id, ctx.message.text, ctx.message.caption, ctx.message.video, downloadUrl)
170194
ctx.reply('Видео передано в службу поддержки.')
171195
}
172196

@@ -180,14 +204,21 @@ async function handleFile(ctx: Context) {
180204
return
181205
}
182206

207+
const botToken = await getBotToken()
208+
if (!botToken) {
209+
return null
210+
}
211+
212+
const downloadUrl = await getFileDownloadUrl({ ctx, fileId: ctx.message.document.file_id, botToken })
213+
183214
await repository.ticket.createMessage({
184215
ticketId: data.ticket.id,
185216
userId: data.user.id,
186-
text: JSON.stringify(ctx.message.document),
217+
telegramFileId: ctx.message.document.file_id,
218+
text: `${ctx.message.caption ?? ''} ${ctx.message.document?.file_name ?? ''} ${ctx.message.document?.mime_type ?? ''}`,
187219
})
188220

189-
// Save file?
190-
logger.log('file', data.user.id, ctx.message.from.id, ctx.message.text, ctx.message.document)
221+
logger.log('file', data.user.id, ctx.message.from.id, ctx.message.text, ctx.message.caption, ctx.message.document, downloadUrl)
191222
ctx.reply('Файл передан в службу поддержки.')
192223
}
193224

packages/database/src/tables.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,8 @@ export const ticketMessages = pgTable('ticket_messages', {
703703
createdAt: timestamp('created_at', { precision: 3, withTimezone: true, mode: 'string' }).notNull().defaultNow(),
704704
updatedAt: timestamp('updated_at', { precision: 3, withTimezone: true, mode: 'string' }).notNull().defaultNow(),
705705
text: varchar('text').notNull(),
706+
telegramFileId: varchar('telegram_file_id'),
707+
fileUrl: varchar('file_url'),
706708
userId: cuid2('user_id').notNull().references(() => users.id, {
707709
onDelete: 'cascade',
708710
onUpdate: 'cascade',

0 commit comments

Comments
 (0)