brainz-social-old/routes/api/v1/accounts.js

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,
});
});
}),
};