import { Context, dependency, HttpResponseRedirect, Post, setSessionCookie, ValidateBody } from '@foal/core';
import { isCommon } from '@foal/password';
import { TypeORMStore } from '@foal/typeorm';
import { getRepository } from 'typeorm';
import { User } from '../entities';
export class SignupController {
@dependency
store: TypeORMStore;
@Post()
@ValidateBody({
additionalProperties: false,
properties: {
email: { type: 'string', format: 'email' },
password: { type: 'string' }
},
required: [ 'email', 'password' ],
type: 'object',
})
async signup(ctx: Context) {
if (await isCommon(ctx.request.body.password)) {
return new HttpResponseRedirect('/signup?password_too_common=true');
}
let user = await getRepository(User).findOne({ email: ctx.request.body.email });
if (user) {
return new HttpResponseRedirect('/signup?email_already_taken=true');
}
user = new User();
user.email = ctx.request.body.email;
await user.setPassword(ctx.request.body.password);
await getRepository(User).save(user);
const session = await this.store.createAndSaveSessionFromUser(user);
const response = new HttpResponseRedirect('/');
setSessionCookie(response, session.getToken());
return response;
}
}