[go: up one dir, main page]

Skip to content

Merge conflicts

<<<<<<< HEAD import { Controller, Get, Post, Body, Put, Param, Delete, Query, ParseUUIDPipe, UseInterceptors, NotFoundException, } from '@nestjs/common';

import { Controller, Get, Post, Body, Put, Param, Delete, Query, ParseUUIDPipe, UseInterceptors } from '@nestjs/common';

develop import { PersonService } from './person.service'; import { CreatePersonDto, UpdatePersonDto } from './dto/create-person.dto'; import { v4 as uuid } from 'uuid'; import { Person } from '@/models/person.model'; import { PersonType } from '@nietpluis/common'; import { AddressDTO, CreateContactInfoDTO, CreateDetailDto } from '../details/dto/create-detail.dto'; import { VZLogger } from '../logger/logger.service'; <<<<<<< HEAD import { Result, VerificationTokenPayload } from '@/interfaces'; import EmailService from '../email/email.service'; import { ConfigService } from '@nestjs/config'; import { JwtService } from '@nestjs/jwt'; import { NotFoundInterceptor } from '@/interceptors/not-found.interceptor'; import { Public } from '@/decorators/public'; import { ActivateAccountDto } from '../details/dto/activate-account.dto'; ======= import { Result } from '@/interfaces'; import { NotFoundInterceptor } from '@/interceptors/not-found.interceptor'; develop

@controller('person') export class PersonController { constructor( private readonly personService: PersonService, private readonly mailService: EmailService, private readonly configService: ConfigService, private readonly logger: VZLogger, private readonly jwtService: JwtService ) {}

private createToken(payload: VerificationTokenPayload): string {
    return this.jwtService.sign(payload, {
        secret: this.configService.get('JWT_VERIFICATION_TOKEN_SECRET'),
        expiresIn: this.configService.get('JWT_VERIFICATION_TOKEN_EXPIRATION_TIME'),
    });
}

@Post()
async create(@Body() body: CreatePersonDto): Promise<Person | null> {
    try {
        const id = uuid();
        const addressId = uuid();

        const contact: CreateContactInfoDTO[] = body.details.contact.map((info) => ({
            id: uuid(),
            type: info.type,
            value: info.value,
            detailsId: id,
        }));

        const emailInfo = body.details.contact
            .filter((contactInfo) => {
                return contactInfo.type === 'email' ? contactInfo : undefined;
            })
            .first();

        const token = this.createToken({ email: emailInfo.value });

        let gpId = null;
        let address: AddressDTO = null;
        if (body.type === 'patient') {
            gpId = body.details.gp.id;
            address = { ...body.details.address, id: addressId };
        }

        const details: CreateDetailDto = { id, ...body.details, address, contact, gpId, token };

        body.details.id = id;

        const newPerson = await this.personService.create({ ...body, details });

        if (emailInfo) {
            await this.mailService.send({
                to: emailInfo.value,
                template: 'notification/person-added',
                vars: {
                    name: newPerson.details.fullName(),
                    title: 'Welkom bij Niet Pluis',
                    url: `${this.configService.get('BASE_URL')}/auth/email-activeren/${id}/${token}`,
                    preheader: 'U bent toegevoegd als contactpersoon op Niet Pluis',
                },
            });
        } else {
            this.logger.error(`No emailaddress found for user ${id}`, 'no trace');
        }

        return newPerson;
    } catch (error) {
        this.logger.error(error.message, error.trace);
    }

    return null;
}

@Get()
async findAll(@Query('type') type: PersonType, @Query('open') openReports: boolean) {
    const results: Result<Person> = {
        count: 0,
        results: [],
    };

    const personResults: void | Result<Person> = await this.personService
        .findAll(type, openReports)
        .catch((error) => {
            this.logger.error(error.message, error.trace);
        });

    return personResults ?? results;
}

@Get('find')
findByLastNameAndDOB(
    @Query('lastName') lastName: string,
    @Query('fistName') firstName: string,
    @Query('initials') initials: string,
    @Query('dob') dob?: string,
    @Query('type') type?: PersonType
) {
    if (dob) {
        return this.personService.findByLastNameAndDOB(lastName, dob);
    } else {
        return this.personService.find({ lastName, firstName, initials }, type);
    }
}

<<<<<<< HEAD @UseInterceptors(new NotFoundInterceptor('No user found for given id'))

@UseInterceptors(new NotFoundInterceptor('No person found for given id'))

develop @get(':id') findOne(@param('id', ParseUUIDPipe) id: string) { return this.personService.findOne(id); }

@Put(':id')
update(@Param('id', ParseUUIDPipe) id: string, @Body() updatePersonDto: UpdatePersonDto) {
    return this.personService.update(id, updatePersonDto);
}

@Delete(':id')
remove(@Param('id', ParseUUIDPipe) id: string) {
    return this.personService.remove(id);
}

@Public()
@Get('token/:token')
async checkToken(@Param() token: any): Promise<boolean> {
    return this.personService.checkToken(token.token);
}

@Public()
@Get('active/:id')
async active(@Param('id', ParseUUIDPipe) id: string): Promise<{ active: boolean }> {
    return { active: await this.personService.checkIfActive(id) };
}

@Public()
@Post('resend-activation')
async resendActivation(@Body() body: any): Promise<null> {
    const person = await this.personService.findByEmail(body.email);

    const newToken = await this.personService.updateToken(person, body.email);

    if (newToken) {
        try {
            await this.mailService.send({
                to: body.email,
                template: 'notification/person-added',
                vars: {
                    name: person.details.fullName(),
                    title: 'Uw nieuwe activatie link',
                    url: `${this.configService.get('BASE_URL')}/auth/email-activeren/${body.id}/${newToken}`,
                    preheader: 'Er is een nieuwe activatie link voor u aangevraagd',
                },
            });
        } catch (error) {
            this.logger.error(error.message, error.trace);
        }
    } else {
        this.logger.error('Could not update token', newToken);
    }

    return null;
}

@Public()
@Post('activate')
async activateAccount(@Body() body: ActivateAccountDto): Promise<boolean> {
    console.log('test');
    const person = await this.personService.findByIdAndToken(body.userId, body.token);

    if (!person) {
        throw new NotFoundException();
    }

    const activateAccountDto: ActivateAccountDto = {
        userId: body.userId,
        token: body.token,
    };

    return this.personService.activate(activateAccountDto);
}

}