plutoapi-v2/src/models/partyplaner/register/Register.router.ts

90 lines
2.8 KiB
TypeScript

/**
* Required External Modules and Interfaces
*/
import express, {Request, Response} from 'express';
import * as UserService from '../user/user.service';
import logger from '../../../middleware/logger';
import {Guid} from 'guid-typescript';
/**
* Router Definition
*/
export const registerRouter = express.Router();
registerRouter.post('/:isDevCall', async (req: Request, res: Response) => {
try {
let username: string = '';
let email: string = '';
let firstName: string = '';
let lastName: string = '';
let password: string = '';
let useDev: boolean = (req.params.isDevCall ?? '') === 'dev'; // TBD
// Send error when content-type header is missing
if (!req.headers['content-type']) {
res.status(400).send({
'status': 'MISSING_CONTENT_TYPE',
'message': 'Please set the content-type header field'
});
return;
}
// API accepts both JSON in body and HTTP parameters
if (req.headers['content-type'] === 'application/json') {
username = req.body.username;
email = req.body.email;
firstName = req.body.firstName;
lastName = req.body.lastName;
password = req.body.password;
} else if (req.headers['content-type'] === 'application/x-www-form-urlencoded') {
username = (req.query.username ?? '').toString();
email = (req.query.email ?? '').toString();
firstName = (req.query.firstName ?? '').toString();
lastName = (req.query.lastName ?? '').toString();
password = (req.query.password ?? '').toString();
} else {
res.status(400).send({
'status': 'WRONG_CONTENT_TYPE',
'message': 'The transmitted content-type is not supported'
});
return;
}
let userIP = req.socket.remoteAddress ?? '';
let deviceInfo = req.headers['user-agent'] ?? '';
if (username === '' || email === '' || firstName === '' || lastName === '' || password === '') {
res.status(400).send({
'status': 'WRONG_PARAMS',
'message': 'Missing or wrong parameters'
});
return;
}
// Check for invalid username / email
const status = await UserService.checkUsernameAndEmail(useDev, username, email);
if (status.hasProblems) {
// Username and/or email are duplicates, return error
res.status(400).send({
'message': status.messages[0],
'status': status.status[0],
'additionalMessages': status.messages.slice(1),
'additionalStatus': status.status.slice(1)
});
return;
}
// Create user
let session = await UserService.registerUser(useDev, username, email, firstName, lastName, password, userIP, deviceInfo);
res.status(201).send(session);
} catch (e: any) {
let errorGuid = Guid.create().toString();
logger.error('Error handling a request: ' + e.message, {reference: errorGuid});
res.status(500).send({
'status': 'PROCESSING_ERROR',
'message': 'Internal Server Error. Try again later.',
'reference': errorGuid
});
}
});