import { Body, Controller, Delete, Get, Param, Post, Put, Query, Res, } from '@nestjs/common'; import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service'; import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; import { Organization, User } from '@prisma/client'; import { CreatePostDto } from '@gitroom/nestjs-libraries/dtos/posts/create.post.dto'; import { GetPostsDto } from '@gitroom/nestjs-libraries/dtos/posts/get.posts.dto'; import { StarsService } from '@gitroom/nestjs-libraries/database/prisma/stars/stars.service'; import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability'; import { AuthorizationActions, Sections, } from '@gitroom/backend/services/auth/permissions/permissions.service'; import { ApiTags } from '@nestjs/swagger'; import { MessagesService } from '@gitroom/nestjs-libraries/database/prisma/marketplace/messages.service'; import { GeneratorDto } from '@gitroom/nestjs-libraries/dtos/generator/generator.dto'; import { CreateGeneratedPostsDto } from '@gitroom/nestjs-libraries/dtos/generator/create.generated.posts.dto'; import { AgentGraphService } from '@gitroom/nestjs-libraries/agent/agent.graph.service'; import { Response } from 'express'; import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request'; import { ShortLinkService } from '@gitroom/nestjs-libraries/short-linking/short.link.service'; import { CreateTagDto } from '@gitroom/nestjs-libraries/dtos/posts/create.tag.dto'; @ApiTags('Posts') @Controller('/posts') export class PostsController { constructor( private _postsService: PostsService, private _starsService: StarsService, private _messagesService: MessagesService, private _agentGraphService: AgentGraphService, private _shortLinkService: ShortLinkService ) {} @Get('/:id/statistics') async getStatistics( @GetOrgFromRequest() org: Organization, @Param('id') id: string ) { return this._postsService.getStatistics(org.id, id); } @Post('/should-shortlink') async shouldShortlink(@Body() body: { messages: string[] }) { return { ask: this._shortLinkService.askShortLinkedin(body.messages) }; } @Get('/marketplace/:id?') async getMarketplacePosts( @GetOrgFromRequest() org: Organization, @Param('id') id: string ) { return this._messagesService.getMarketplaceAvailableOffers(org.id, id); } @Post('/:id/comments') async createComment( @GetOrgFromRequest() org: Organization, @GetUserFromRequest() user: User, @Param('id') id: string, @Body() body: { comment: string } ) { return this._postsService.createComment(org.id, user.id, id, body.comment); } @Get('/tags') async getTags(@GetOrgFromRequest() org: Organization) { return { tags: await this._postsService.getTags(org.id) }; } @Post('/tags') async createTag( @GetOrgFromRequest() org: Organization, @Body() body: CreateTagDto ) { return this._postsService.createTag(org.id, body); } @Put('/tags/:id') async editTag( @GetOrgFromRequest() org: Organization, @Body() body: CreateTagDto, @Param('id') id: string ) { return this._postsService.editTag(id, org.id, body); } @Get('/') async getPosts( @GetOrgFromRequest() org: Organization, @Query() query: GetPostsDto ) { const posts = await this._postsService.getPosts(org.id, query); return { posts, }; } @Get('/find-slot') async findSlot(@GetOrgFromRequest() org: Organization) { return { date: await this._postsService.findFreeDateTime(org.id) }; } @Get('/predict-trending') predictTrending() { return this._starsService.predictTrending(); } @Get('/old') oldPosts( @GetOrgFromRequest() org: Organization, @Query('date') date: string ) { return this._postsService.getOldPosts(org.id, date); } @Get('/:id') getPost(@GetOrgFromRequest() org: Organization, @Param('id') id: string) { return this._postsService.getPost(org.id, id); } @Post('/') @CheckPolicies([AuthorizationActions.Create, Sections.POSTS_PER_MONTH]) createPost( @GetOrgFromRequest() org: Organization, @Body() body: CreatePostDto ) { console.log(JSON.stringify(body, null, 2)); return this._postsService.createPost(org.id, body); } @Post('/generator/draft') @CheckPolicies([AuthorizationActions.Create, Sections.POSTS_PER_MONTH]) generatePostsDraft( @GetOrgFromRequest() org: Organization, @Body() body: CreateGeneratedPostsDto ) { return this._postsService.generatePostsDraft(org.id, body); } @Post('/generator') @CheckPolicies([AuthorizationActions.Create, Sections.POSTS_PER_MONTH]) async generatePosts( @GetOrgFromRequest() org: Organization, @Body() body: GeneratorDto, @Res({ passthrough: false }) res: Response ) { res.setHeader('Content-Type', 'application/json; charset=utf-8'); for await (const event of this._agentGraphService.start(org.id, body)) { res.write(JSON.stringify(event) + '\n'); } res.end(); } @Delete('/:group') deletePost( @GetOrgFromRequest() org: Organization, @Param('group') group: string ) { return this._postsService.deletePost(org.id, group); } @Put('/:id/date') changeDate( @GetOrgFromRequest() org: Organization, @Param('id') id: string, @Body('date') date: string ) { return this._postsService.changeDate(org.id, id, date); } }