import { Body, Controller, Get, Post, Query, UseInterceptors, } from '@nestjs/common'; import { UnprocessableEntityException } from '@nestjs/common/exceptions/unprocessable-entity.exception'; import { ApiOperation, ApiSecurity, ApiTags } from '@nestjs/swagger'; import { SessionManager } from '../core/abc/manager.abc'; import { WhatsappSession } from '../core/abc/session.abc'; import { CaptchaBody, OTPRequest, QRCodeFormat, QRCodeQuery, QRCodeValue, RequestCodeRequest, } from '../structures/auth.dto'; import { WAHASessionStatus } from '../structures/enums.dto'; import { Base64File } from '../structures/files.dto'; import { BufferResponseInterceptor } from './BufferResponseInterceptor'; import { ApiFileAcceptHeader, SessionApiParam, SessionParam } from './helpers'; @ApiSecurity('api_key') @Controller('api/:session/auth') @ApiTags('auth') class AuthController { constructor(private manager: SessionManager) {} @Get('qr') @ApiOperation({ summary: 'Get QR code for pairing WhatsApp Web.', }) @SessionApiParam @ApiFileAcceptHeader(Base64File, QRCodeValue) @UseInterceptors(new BufferResponseInterceptor()) async getQR( @SessionParam session: WhatsappSession, @Query() query: QRCodeQuery, ): Promise { if (session.status != WAHASessionStatus.SCAN_QR_CODE) { const err = `Can get QR code only in SCAN_QR_CODE status. The current status is '${session.status}'`; throw new UnprocessableEntityException(err); } const qr = session.getQR(); if (query.format == QRCodeFormat.RAW) { return { value: qr.raw }; } return qr.get(); } @Post('request-code') @SessionApiParam @ApiOperation({ summary: 'Request authentication code.', }) requestCode( @SessionParam session: WhatsappSession, @Body() request: RequestCodeRequest, ) { return session.requestCode(request.phoneNumber, request.method, request); } @Post('authorize-code') @SessionApiParam @ApiOperation({ summary: 'Send OTP authentication code.', }) authorizeCode( @SessionParam session: WhatsappSession, @Body() request: OTPRequest, ) { return session.authorizeCode(request.code); } @Get('captcha') @SessionApiParam @ApiFileAcceptHeader() @UseInterceptors(new BufferResponseInterceptor()) @ApiOperation({ summary: 'Get captcha image.', }) async getCaptcha(@SessionParam session: WhatsappSession): Promise { const image = await session.getCaptcha(); return image.get(); } @Post('captcha') @SessionApiParam @ApiOperation({ summary: 'Enter captcha code.', }) saveCaptcha( @SessionParam session: WhatsappSession, @Body() body: CaptchaBody, ) { return session.saveCaptcha(body.code); } } export { AuthController };