diff --git a/.env.example b/.env.example index b846791..ca5134e 100644 --- a/.env.example +++ b/.env.example @@ -5,3 +5,5 @@ CLOUDINARY_KEY=CLOUDINARY_KEY CLOUDINARY_SECRET=CLOUDINARY_SECRET JWT_SECRET=JWT_SECRET SENTRY_DSN=SENTRY_DSN +POSTMARK_API_TOKEN=POSTMARK_API_TOKEN +POSTMARK_TEMPLATE_ID=POSTMARK_TEMPLATE_ID \ No newline at end of file diff --git a/package.json b/package.json index 32f08ce..39965f1 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "passport": "^0.7.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", + "postmark": "^4.0.2", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1" }, diff --git a/src/report/postmark.service.ts b/src/report/postmark.service.ts new file mode 100644 index 0000000..293d64a --- /dev/null +++ b/src/report/postmark.service.ts @@ -0,0 +1,52 @@ +import { Injectable } from '@nestjs/common'; +import * as postmark from 'postmark'; +import { CreateReportDto } from './dto'; +import { TemplatedMessage } from 'postmark'; +import * as process from 'process'; +import { MessageSendingResponse } from 'postmark/dist/client/models'; + +@Injectable() +export class PostmarkService { + private client: postmark.ServerClient; + + constructor() { + this.client = new postmark.ServerClient(process.env['POSTMARK_API_TOKEN']!); + } + + async sendBarkBeetleReport( + createReportDto: CreateReportDto, + images: Array, + to: string, + ): Promise { + function encodeToBase64(file: Express.Multer.File) { + return Buffer.from(file.buffer).toString('base64'); + } + + const attachments = []; + + for (let i = 0; i < images.length; i++) { + const encodedImageContent = encodeToBase64(images[i]); + attachments.push({ + Name: 'nuotrauka' + i + '.jpg', + Content: encodedImageContent, + ContentType: 'image/jpeg', + ContentID: 'photo' + i, + }); + } + + const templatedMessage: TemplatedMessage = { + TemplateId: Number(process.env['POSTMARK_TEMPLATE_ID']), + From: 'neatsakyti@tvarkaulietuva.lt', + To: to, + TemplateModel: { + description: createReportDto.name, + longitude: createReportDto.longitude, + latitude: createReportDto.latitude, + email: createReportDto.email, + }, + Attachments: attachments, + }; + + return this.client.sendEmailWithTemplate(templatedMessage); + } +} diff --git a/src/report/report.controller.ts b/src/report/report.controller.ts index aa94cca..7fda911 100644 --- a/src/report/report.controller.ts +++ b/src/report/report.controller.ts @@ -25,11 +25,16 @@ import { CreateReportDto } from './dto'; import { FilesInterceptor } from '@nestjs/platform-express'; import { ReportStatisticsDto } from './dto/report-statistics.dto'; import { ReportCategory } from '../common/dto/report-category'; +import { PostmarkService } from './postmark.service'; +import { Message, MessageSendingResponse } from 'postmark/dist/client/models'; @Controller('reports') @ApiTags('reports') export class ReportController { - constructor(private readonly reportService: ReportService) {} + constructor( + private readonly reportService: ReportService, + private readonly postmarkService: PostmarkService, + ) {} @ApiCreatedResponse({ description: 'New Report has been successfully created', @@ -45,6 +50,24 @@ export class ReportController { return this.reportService.createReport(createReportDto, images); } + @ApiCreatedResponse({ + description: 'New Report has been successfully sent', + type: Message, + }) + @ApiConsumes('multipart/form-data') + @UseInterceptors(FilesInterceptor('images', 4)) + @Post('/bark-beetle') + sendBarkBeetleReport( + @Body() createReportDto: CreateReportDto, + @UploadedFiles() images: Array, + ): Promise { + return this.postmarkService.sendBarkBeetleReport( + createReportDto, + images, + 'benas.svedas@aad.am.lt', + ); + } + @ApiOkResponse({ description: 'All visible reports have been successfully found', type: [PublicReportDto], diff --git a/src/report/report.module.ts b/src/report/report.module.ts index 6059c0d..249dcb5 100644 --- a/src/report/report.module.ts +++ b/src/report/report.module.ts @@ -5,6 +5,7 @@ import { MongooseModule } from '@nestjs/mongoose'; import { ReportRepository } from '../repositories/reports/report.repository'; import { Report, ReportSchema } from '../repositories/reports/schemas'; import { CloudinaryModule } from '../cloudinary/cloudinary.module'; +import { PostmarkService } from './postmark.service'; @Module({ imports: [ @@ -12,6 +13,6 @@ import { CloudinaryModule } from '../cloudinary/cloudinary.module'; CloudinaryModule, ], controllers: [ReportController], - providers: [ReportService, ReportRepository], + providers: [ReportService, ReportRepository, PostmarkService], }) export class ReportModule {} diff --git a/yarn.lock b/yarn.lock index d7e3dfe..e89563b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4997,6 +4997,13 @@ pluralize@8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +postmark@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postmark/-/postmark-4.0.2.tgz#0c0410ac427d85f2a43454360cf8d07e0fbda317" + integrity sha512-2zlCv+KVVQ0KoamXZHE7d+gXzLlr8tPE+PxQmtUaIZhbHzZAq4D6yH2b+ykhA8wYCc5ISodcx8U1aNLenXBs9g== + dependencies: + axios "^1.6.2" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"