| import { |
| Body, |
| Controller, |
| Get, |
| HttpException, |
| Param, |
| Post, |
| Delete, |
| } from '@nestjs/common'; |
| import { ApiTags } from '@nestjs/swagger'; |
| import { ThirdPartyManager } from '@gitroom/nestjs-libraries/3rdparties/thirdparty.manager'; |
| import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; |
| import { Organization } from '@prisma/client'; |
| import { AuthService } from '@gitroom/helpers/auth/auth.service'; |
| import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory'; |
| import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; |
| import { ImportMediaDto } from '@gitroom/nestjs-libraries/dtos/third-party/import-media.dto'; |
|
|
| @ApiTags('Third Party') |
| @Controller('/third-party') |
| export class ThirdPartyController { |
| private storage = UploadFactory.createStorage(); |
|
|
| constructor( |
| private _thirdPartyManager: ThirdPartyManager, |
| private _mediaService: MediaService, |
| ) {} |
|
|
| @Get('/list') |
| async getThirdPartyList() { |
| return this._thirdPartyManager.getAllThirdParties(); |
| } |
|
|
| @Get('/') |
| async getSavedThirdParty(@GetOrgFromRequest() organization: Organization) { |
| return Promise.all( |
| ( |
| await this._thirdPartyManager.getAllThirdPartiesByOrganization( |
| organization.id |
| ) |
| ).map((thirdParty) => { |
| const { description, fields, position, title, identifier } = |
| this._thirdPartyManager.getThirdPartyByName(thirdParty.identifier); |
| return { |
| ...thirdParty, |
| title, |
| position, |
| fields, |
| description, |
| }; |
| }) |
| ); |
| } |
|
|
| @Delete('/:id') |
| deleteById( |
| @GetOrgFromRequest() organization: Organization, |
| @Param('id') id: string |
| ) { |
| return this._thirdPartyManager.deleteIntegration(organization.id, id); |
| } |
|
|
| @Post('/:id/submit') |
| async generate( |
| @GetOrgFromRequest() organization: Organization, |
| @Param('id') id: string, |
| @Body() data: any |
| ) { |
| const thirdParty = await this._thirdPartyManager.getIntegrationById( |
| organization.id, |
| id |
| ); |
|
|
| if (!thirdParty) { |
| throw new HttpException('Integration not found', 404); |
| } |
|
|
| const thirdPartyInstance = this._thirdPartyManager.getThirdPartyByName( |
| thirdParty.identifier |
| ); |
|
|
| if (!thirdPartyInstance) { |
| throw new HttpException('Invalid identifier', 400); |
| } |
|
|
| const loadedData = await thirdPartyInstance?.instance?.sendData( |
| AuthService.fixedDecryption(thirdParty.apiKey), |
| data |
| ); |
|
|
| const file = await this.storage.uploadSimple(loadedData); |
| return this._mediaService.saveFile(organization.id, file.split('/').pop(), file); |
| } |
|
|
| @Post('/function/:id/:functionName') |
| async callFunction( |
| @GetOrgFromRequest() organization: Organization, |
| @Param('id') id: string, |
| @Param('functionName') functionName: string, |
| @Body() data: any |
| ) { |
| const thirdParty = await this._thirdPartyManager.getIntegrationById( |
| organization.id, |
| id |
| ); |
|
|
| if (!thirdParty) { |
| throw new HttpException('Integration not found', 404); |
| } |
|
|
| const thirdPartyInstance = this._thirdPartyManager.getThirdPartyByName( |
| thirdParty.identifier |
| ); |
|
|
| if (!thirdPartyInstance) { |
| throw new HttpException('Invalid identifier', 400); |
| } |
|
|
| return thirdPartyInstance?.instance?.[functionName]( |
| AuthService.fixedDecryption(thirdParty.apiKey), |
| data |
| ); |
| } |
|
|
| @Post('/:id/import') |
| async importMedia( |
| @GetOrgFromRequest() organization: Organization, |
| @Param('id') id: string, |
| @Body() body: ImportMediaDto |
| ) { |
| const thirdParty = await this._thirdPartyManager.getIntegrationById( |
| organization.id, |
| id |
| ); |
|
|
| if (!thirdParty) { |
| throw new HttpException('Integration not found', 404); |
| } |
|
|
| const thirdPartyInstance = this._thirdPartyManager.getThirdPartyByName( |
| thirdParty.identifier |
| ); |
|
|
| if (!thirdPartyInstance) { |
| throw new HttpException('Invalid identifier', 400); |
| } |
|
|
| const downloadUrls = await thirdPartyInstance?.instance?.['importMedia']?.( |
| AuthService.fixedDecryption(thirdParty.apiKey), |
| body.items |
| ); |
|
|
| if (!downloadUrls || !Array.isArray(downloadUrls)) { |
| throw new HttpException('Import not supported', 400); |
| } |
|
|
| const results = []; |
| for (const item of downloadUrls) { |
| const file = await this.storage.uploadSimple(item.url); |
| const saved = await this._mediaService.saveFile( |
| organization.id, |
| item.name || file.split('/').pop(), |
| file |
| ); |
| results.push(saved); |
| } |
|
|
| return results; |
| } |
|
|
| @Post('/:identifier') |
| async addApiKey( |
| @GetOrgFromRequest() organization: Organization, |
| @Param('identifier') identifier: string, |
| @Body('api') api: string |
| ) { |
| const thirdParty = this._thirdPartyManager.getThirdPartyByName(identifier); |
| if (!thirdParty) { |
| throw new HttpException('Invalid identifier', 400); |
| } |
|
|
| const connect = await thirdParty.instance.checkConnection(api); |
| if (!connect) { |
| throw new HttpException('Invalid API key', 400); |
| } |
|
|
| try { |
| const save = await this._thirdPartyManager.saveIntegration( |
| organization.id, |
| identifier, |
| api, |
| { |
| name: connect.name, |
| username: connect.username, |
| id: connect.id, |
| } |
| ); |
|
|
| return { |
| id: save.id, |
| }; |
| } catch (e) { |
| console.log(e); |
| throw new HttpException('Integration Already Exists', 400); |
| } |
| } |
| } |
|
|