48 lines
2 KiB
JavaScript
48 lines
2 KiB
JavaScript
const crypto = require("crypto");
|
|
const bcrypt = require("bcrypt");
|
|
const databaseHandler = require("../../../lib/database-handler");
|
|
const input_validate = require("../../../lib/input_validate");
|
|
const auth = require("../../../middleware/auth");
|
|
|
|
module.exports = {
|
|
route: ((routeObj) => {
|
|
routeObj.post(auth.auth_token(false, "write:accounts"), (req, res) => {
|
|
const authToken = req.header("Authorization").split(/\s+/)[1];
|
|
|
|
const validation_result = input_validate.validate_exists(req.body, ["username", "email", "password", "agreement", "locale"]);
|
|
if (validation_result !== true) {
|
|
res.status(422);
|
|
res.json(validation_result);
|
|
return;
|
|
}
|
|
|
|
const username = req.body.username;
|
|
if (databaseHandler.getAccountByUsername(username)) {
|
|
res.status(422);
|
|
res.json({error: "Validation failed, username taken.", details: {username: {error: "ERR_TAKEN", description: "Username taken."}}});
|
|
return;
|
|
}
|
|
|
|
// TODO: We're just taking emails at face value for now.
|
|
const email = req.body.email;
|
|
|
|
const password = req.body.password;
|
|
|
|
const password_hash = bcrypt.hashSync(password, bcrypt.genSaltSync());
|
|
databaseHandler.createAccount(username, email, password_hash);
|
|
|
|
const userObject = databaseHandler.getAccountByUsername(username);
|
|
const userToken = crypto.randomBytes(32).toString("base64");
|
|
const created_at = Math.floor(Date.now() / 1000);
|
|
const application = databaseHandler.application[authToken.application_id];
|
|
databaseHandler.createToken(userToken, application.scopes, application.id, userObject.id, created_at);
|
|
res.status(200);
|
|
res.json({
|
|
access_token: userToken,
|
|
token_type: "Bearer",
|
|
scope: application.scopes,
|
|
created_at,
|
|
});
|
|
});
|
|
}),
|
|
};
|