/
guselnikov
/
inst
Обзор
Документация
Войти
/
guselnikov
/
inst
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
back/src/modules/ig-posts/ig-posts.controller.ts
175 строк
5 KB
Viktor Guselnikov
first_commit
07 июл 2026, 11:54
07 июл 2026, 11:54
098126a
Код
Авторство
О чём код?
import { Body, Controller, Delete, Get, Header, Param, Patch, Post, Query, Res, UploadedFiles, UseGuards, UseInterceptors, } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { FilesInterceptor } from '@nestjs/platform-express'; import { diskStorage } from 'multer'; import { join } from 'path'; import { tmpdir } from 'os'; import type { Response } from 'express'; import { CurrentUser } from '../../common/decorators/current-user.decorator'; import type { AuthUserPayload } from '../../common/decorators/current-user.decorator'; import { CreateIgPostDto, CreateIgPostFromDesignDto, DuplicateIgPostDto, PublishIgPostDto, UpdateIgPostDto, UpdateIgPostFromDesignDto, } from './dto/ig-post.dto'; import { IgPostLogService } from './ig-post-log.service'; import { IgPostsService } from './ig-posts.service'; const uploadInterceptor = FilesInterceptor('images', 15, { storage: diskStorage({ destination: join(tmpdir(), 'inst-uploads'), filename: (_req, file, cb) => { cb(null, `${Date.now()}-${file.originalname.replace(/[^a-zA-Z0-9._-]/g, '_')}`); }, }), limits: { fileSize: 15 * 1024 * 1024 }, fileFilter: (_req, file, cb) => { if (!file.mimetype.startsWith('image/')) { cb(new Error('Only image files allowed'), false); return; } cb(null, true); }, }); @Controller('ig-posts') @UseGuards(AuthGuard('jwt')) export class IgPostsController { constructor( private readonly service: IgPostsService, private readonly postLog: IgPostLogService, ) {} @Get() list(@CurrentUser() user: AuthUserPayload) { return this.service.list(user.organizationId); } @Post() @UseInterceptors(uploadInterceptor) create( @CurrentUser() user: AuthUserPayload, @Body() dto: CreateIgPostDto, @UploadedFiles() files: Express.Multer.File[], ) { return this.service.createDraft(user.organizationId, dto, files); } @Post('from-design') @UseInterceptors(uploadInterceptor) createFromDesign( @CurrentUser() user: AuthUserPayload, @Body() dto: CreateIgPostFromDesignDto, @UploadedFiles() files: Express.Multer.File[], ) { return this.service.createFromDesign(user.organizationId, dto, files); } @Get(':id/slides') slides(@CurrentUser() user: AuthUserPayload, @Param('id') id: string) { return this.service.getSlides(id, user.organizationId); } @Get(':id/media/:mediaId/file') @Header('Cache-Control', 'private, max-age=3600') async mediaFile( @CurrentUser() user: AuthUserPayload, @Param('id') id: string, @Param('mediaId') mediaId: string, @Res({ passthrough: true }) res: Response, ) { const { stream, mime } = await this.service.getMediaFile(id, mediaId, user.organizationId); res.setHeader('Content-Type', mime); return stream; } @Patch(':id') update( @CurrentUser() user: AuthUserPayload, @Param('id') id: string, @Body() dto: UpdateIgPostDto, ) { return this.service.update(id, user.organizationId, dto); } @Patch(':id/from-design') @UseInterceptors(uploadInterceptor) updateFromDesign( @CurrentUser() user: AuthUserPayload, @Param('id') id: string, @Body() dto: UpdateIgPostFromDesignDto, @UploadedFiles() files: Express.Multer.File[], ) { return this.service.updateFromDesign(id, user.organizationId, dto, files); } @Post(':id/duplicate') duplicate( @CurrentUser() user: AuthUserPayload, @Param('id') id: string, @Body() dto: DuplicateIgPostDto, ) { return this.service.duplicate(id, user.organizationId, dto); } @Post(':id/media') @UseInterceptors(uploadInterceptor) appendMedia( @CurrentUser() user: AuthUserPayload, @Param('id') id: string, @UploadedFiles() files: Express.Multer.File[], ) { return this.service.appendMedia(id, user.organizationId, files); } @Delete(':id/media/:mediaId') removeMedia( @CurrentUser() user: AuthUserPayload, @Param('id') id: string, @Param('mediaId') mediaId: string, ) { return this.service.removeMedia(id, mediaId, user.organizationId); } @Post(':id/publish') publish( @CurrentUser() user: AuthUserPayload, @Param('id') id: string, @Body() dto: PublishIgPostDto, ) { return this.service.publish(id, user.organizationId, dto.igAccountId); } @Delete(':id') remove(@CurrentUser() user: AuthUserPayload, @Param('id') id: string) { return this.service.remove(id, user.organizationId); } @Get(':id/logs') async logs( @CurrentUser() user: AuthUserPayload, @Param('id') id: string, @Query('tail') tail = '500', ) { await this.service.getOrFail(id, user.organizationId); const lines = await this.postLog.readTail(id, Math.min(parseInt(tail, 10), 2000)); return { lines }; } }