| import { Body, Controller, Param, Post, Res } from '@nestjs/common'; |
| import { ApiTags } from '@nestjs/swagger'; |
| import { AuthService } from '@gitroom/helpers/auth/auth.service'; |
| import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service'; |
| import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integration.manager'; |
| import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service'; |
| import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/integrations/integration.service'; |
| import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service'; |
|
|
| @ApiTags('Enterprise') |
| @Controller('/enterprise') |
| export class EnterpriseController { |
| constructor( |
| private _integrationManager: IntegrationManager, |
| private _organizationService: OrganizationService, |
| private _integrationService: IntegrationService, |
| private _postsService: PostsService |
| ) {} |
|
|
| @Post('/create-user') |
| async createUser(@Body('params') params: string) { |
| try { |
| const { id, name, saasName, email } = AuthService.verifyJWT(params) as { |
| id: string; |
| name: string; |
| email: string; |
| saasName: string; |
| }; |
|
|
| try { |
| return await this._organizationService.createMaxUser( |
| id, |
| name, |
| saasName, |
| email |
| ); |
| } catch (err) { |
| return { create: false }; |
| } |
| } catch (err) { |
| return { success: false }; |
| } |
| } |
|
|
| @Post('/url') |
| async redirectParams(@Body('params') params: string) { |
| try { |
| const load = AuthService.verifyJWT(params) as { |
| redirectUrl: string; |
| apiKey: string; |
| refreshId?: string; |
| provider: string; |
| webhookUrl: string; |
| }; |
|
|
| if (!load || !load.redirectUrl || !load.apiKey || !load.provider) { |
| return; |
| } |
|
|
| const org = await this._organizationService.getOrgByApiKey(load.apiKey); |
|
|
| if (!org) { |
| throw new Error('Organization not found'); |
| } |
|
|
| if ( |
| !this._integrationManager |
| .getAllowedSocialsIntegrations() |
| .includes(load.provider) |
| ) { |
| throw new Error('Integration not allowed'); |
| } |
|
|
| const integrationProvider = this._integrationManager.getSocialIntegration( |
| load.provider |
| ); |
|
|
| const { codeVerifier, state, url } = |
| await integrationProvider.generateAuthUrl(); |
|
|
| if (load.refreshId) { |
| await ioRedis.set(`refresh:${state}`, load.refreshId, 'EX', 3600); |
| } |
|
|
| await ioRedis.set(`webhookUrl:${state}`, load.webhookUrl, 'EX', 3600); |
| await ioRedis.set(`redirect:${state}`, load.redirectUrl, 'EX', 3600); |
| await ioRedis.set(`organization:${state}`, org.id, 'EX', 3600); |
| await ioRedis.set(`login:${state}`, codeVerifier, 'EX', 3600); |
|
|
| return url; |
| } catch (err) {} |
| } |
|
|
| @Post('/delete-channel') |
| async deleteChannel(@Body('params') params: string) { |
| try { |
| const load = AuthService.verifyJWT(params) as { |
| apiKey: string; |
| id: string; |
| }; |
|
|
| if (!load || !load.apiKey || !load.id) { |
| return { success: false }; |
| } |
|
|
| const org = await this._organizationService.getOrgByApiKey(load.apiKey); |
|
|
| if (!org) { |
| return { success: false }; |
| } |
|
|
| const isTherePosts = await this._integrationService.getPostsForChannel( |
| org.id, |
| load.id |
| ); |
| if (isTherePosts.length) { |
| for (const post of isTherePosts) { |
| this._postsService.deletePost(org.id, post.group).catch(() => {}); |
| } |
| } |
|
|
| await this._integrationService.deleteChannel(org.id, load.id); |
| return { success: true }; |
| } catch (err) { |
| return { success: false }; |
| } |
| } |
| } |
|
|