You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
3.1 KiB
142 lines
3.1 KiB
import { Request, Response, Router } from "express" |
|
import Stacker from "../middlewares/stacker"; |
|
import verify, { Types } from "../middlewares/verify"; |
|
import promiseMiddleware from "../../helper/promiseMiddleware"; |
|
import User, { Gender } from "../../models/user"; |
|
import { HttpStatusCode } from "../../helper/request_error"; |
|
import Mail from "../../models/mail"; |
|
import RegCode from "../../models/regcodes"; |
|
|
|
const Register = Stacker(verify({ |
|
mail: { |
|
type: Types.EMAIL, |
|
notempty: true |
|
}, |
|
username: { |
|
type: Types.STRING, |
|
notempty: true |
|
}, |
|
password: { |
|
type: Types.STRING, |
|
notempty: true |
|
}, |
|
salt: { |
|
type: Types.STRING, |
|
notempty: true |
|
}, |
|
regcode: { |
|
type: Types.STRING, |
|
notempty: true |
|
}, |
|
gender: { |
|
type: Types.STRING, |
|
notempty: true |
|
}, |
|
name: { |
|
type: Types.STRING, |
|
notempty: true |
|
}, |
|
// birthday: { |
|
// type: Types.DATE |
|
// } |
|
}), promiseMiddleware(async (req: Request, res: Response) => { |
|
let { username, password, salt, mail, gender, name, birthday, regcode } = req.body; |
|
let u = await User.findOne({ username: username.toLowerCase() }) |
|
if (u) { |
|
let err = { |
|
message: [ |
|
{ |
|
message: req.__("Username taken"), |
|
field: "username" |
|
} |
|
], |
|
status: HttpStatusCode.BAD_REQUEST, |
|
nolog: true |
|
} |
|
throw err; |
|
} |
|
|
|
|
|
let m = await Mail.findOne({ mail: mail }) |
|
if (m) { |
|
let err = { |
|
message: [ |
|
{ |
|
message: req.__("Mail linked with other account"), |
|
field: "mail" |
|
} |
|
], |
|
status: HttpStatusCode.BAD_REQUEST, |
|
nolog: true |
|
} |
|
throw err; |
|
} |
|
|
|
let regc = await RegCode.findOne({ token: regcode }) |
|
if (!regc) { |
|
let err = { |
|
message: [ |
|
{ |
|
message: req.__("Invalid registration code"), |
|
field: "regcode" |
|
} |
|
], |
|
status: HttpStatusCode.BAD_REQUEST, |
|
nolog: true |
|
} |
|
throw err; |
|
} |
|
|
|
if (!regc.valid) { |
|
let err = { |
|
message: [ |
|
{ |
|
message: req.__("Registration code already used"), |
|
field: "regcode" |
|
} |
|
], |
|
status: HttpStatusCode.BAD_REQUEST, |
|
nolog: true |
|
} |
|
throw err; |
|
} |
|
|
|
let g = -1; |
|
switch (gender) { |
|
case "male": |
|
g = Gender.male |
|
break; |
|
case "female": |
|
g = Gender.female |
|
break; |
|
case "other": |
|
g = Gender.other |
|
break; |
|
default: |
|
g = Gender.none |
|
break; |
|
} |
|
|
|
let user = User.new({ |
|
username: username.toLowerCase(), |
|
password: password, |
|
salt: salt, |
|
gender: g, |
|
name: name, |
|
// birthday: birthday, |
|
admin: false |
|
}) |
|
|
|
regc.valid = false; |
|
await RegCode.save(regc); |
|
|
|
let ml = Mail.new({ |
|
mail: mail, |
|
primary: true |
|
}) |
|
|
|
user.mails.push(ml._id); |
|
await User.save(user) |
|
res.json({ success: true }); |
|
})) |
|
export default Register; |