import { Body, Controller, Delete, Get, HttpException, Param, Post, Query, UploadedFile, UseInterceptors, } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; import { Organization } from '@prisma/client'; import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/integrations/integration.service'; import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability'; import { AuthorizationActions, Sections, } from '@gitroom/backend/services/auth/permissions/permissions.service'; import { CreatePostDto } from '@gitroom/nestjs-libraries/dtos/posts/create.post.dto'; import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service'; import { FileInterceptor } from '@nestjs/platform-express'; import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory'; import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; import { GetPostsDto } from '@gitroom/nestjs-libraries/dtos/posts/get.posts.dto'; @ApiTags('Public API') @Controller('/public/v1') export class PublicIntegrationsController { private storage = UploadFactory.createStorage(); constructor( private _integrationService: IntegrationService, private _postsService: PostsService, private _mediaService: MediaService ) {} @Post('/upload') @UseInterceptors(FileInterceptor('file')) async uploadSimple( @GetOrgFromRequest() org: Organization, @UploadedFile('file') file: Express.Multer.File ) { if (!file) { throw new HttpException({ msg: 'No file provided' }, 400); } const getFile = await this.storage.uploadFile(file); return this._mediaService.saveFile( org.id, getFile.originalname, getFile.path ); } @Get('/posts') async getPosts( @GetOrgFromRequest() org: Organization, @Query() query: GetPostsDto ) { const posts = await this._postsService.getPosts(org.id, query); return { posts, // comments, }; } @Post('/posts') @CheckPolicies([AuthorizationActions.Create, Sections.POSTS_PER_MONTH]) async createPost( @GetOrgFromRequest() org: Organization, @Body() rawBody: any ) { const body = await this._postsService.mapTypeToPost(rawBody, org.id); console.log(JSON.stringify(body, null, 2)); return this._postsService.createPost(org.id, body); } @Delete('/posts/:id') async deletePost( @GetOrgFromRequest() org: Organization, @Param() body: { id: string } ) { const getPostById = await this._postsService.getPost(org.id, body.id); return this._postsService.deletePost(org.id, getPostById.group); } @Get('/integrations') async listIntegration(@GetOrgFromRequest() org: Organization) { return (await this._integrationService.getIntegrationsList(org.id)).map( (org) => ({ id: org.id, name: org.name, identifier: org.providerIdentifier, picture: org.picture, disabled: org.disabled, profile: org.profile, customer: org.customer ? { id: org.customer.id, name: org.customer.name, } : undefined, }) ); } }