Browse Source

auth: register users

master
Garrit Franke 3 years ago
parent
commit
ff0dabfba8
Signed by: garrit
GPG Key ID: 65586C4DDA55EA2C
  1. 2
      .gitignore
  2. 8
      server/app.js
  3. 5
      server/knexfile.js
  4. 17
      server/migrations/20210708184239_add_users_table.js
  5. 15
      server/model/User.js
  6. 22
      server/routes/auth.js
  7. 12
      server/routes/users.js

2
.gitignore vendored

@ -60,3 +60,5 @@ typings/
.cache
dist/
.parcel-cache/
server/sqlite.db

8
server/app.js

@ -1,9 +1,15 @@
const express = require("express");
const jwt = require("jsonwebtoken");
const bodyParser = require("body-parser");
const { Model } = require("objection");
const knexConfig = require("./knexfile");
require("dotenv").config();
const knex = require('knex')(knexConfig);
Model.knex(knex);
const app = express();
app.use(bodyParser.json());
@ -56,4 +62,4 @@ app.use((req, res, next) => {
app.use("/auth", require("./routes/auth"));
app.listen(8080);
app.listen(8080, () => console.log("Listening on 8080"));

5
server/knexfile.js

@ -1,8 +1,11 @@
const { knexSnakeCaseMappers } = require('objection');
module.exports = {
client: 'sqlite3',
useNullAsDefault: true,
connection: {
filename: 'sqlite.db'
}
},
...knexSnakeCaseMappers(),
};

17
server/migrations/20210708184239_add_users_table.js

@ -0,0 +1,17 @@
exports.up = function(knex) {
return knex.schema
.createTable('users', function (table) {
table.increments('id').primary().notNullable();
table.string('email', 255).notNullable();
table.string('password_hash').notNullable();
table.string('username', 255).notNullable();
table.timestamps(true, true);
})
};
exports.down = function(knex) {
return knex.schema
.dropTable("users");
};

15
server/model/User.js

@ -1,4 +1,4 @@
const { Model } = require('objection');
const { Model } = require("objection");
const Knex = require("knex");
const knexConfig = require("../knexfile");
@ -6,7 +6,18 @@ class User extends Model {
static get tableName() {
return "users";
}
static get jsonSchema() {
return {
type: "object",
required: ["username", "email"],
properties: {
id: { type: "integer" },
email: { type: "string" },
name: { type: "string", minLength: 1, maxLength: 255 },
},
};
}
}
module.exports = User;

22
server/routes/auth.js

@ -5,30 +5,26 @@ const router = require("express").Router();
const User = require("../model/User");
router.post("/register", async (req, res) => {
const { email, full_name, password } = req.body;
const { email, username, password } = req.body;
console.debug("Registering user:", email);
if (await User.findOne({ email })) {
if (await User.query().findOne("email", email)) {
res.status(400).send("Email already taken");
return;
}
if (await User.query().findOne("username", username)) {
res.status(400).send("Username already taken");
return;
}
const salt = await bcrypt.genSalt(10);
const hashedPassword = await bcrypt.hash(password, salt);
const user = new User({ email, full_name, password: hashedPassword });
const result = await user
.save()
.then((user) => {
user.password = undefined;
})
.catch((err) => {
console.log(err);
});
const user = await User.query().insert({ email, username, passwordHash: hashedPassword });
if (req.query.redirect) return res.redirect(req.query.redirect);
else return res.json({ status: "success", token, id: result.id });
else return res.json({ status: "success", id: user.id });
});
router.post("/login", async (req, res) => {

12
server/routes/users.js

@ -10,17 +10,19 @@ router.get("/", async (req, res) => {
router.post("/", async (req, res) => {
console.log("POSTing user");
const { email, full_name } = req.body;
const { email, username } = req.body;
// Don't accept duplicate emails
if (await User.findOne({ email })) {
if (await User.query().findWhere("email", email).count() > 0) {
res.status(400).send("Email already taken");
return;
}
const user = new User({ email, full_name });
const savedUser = await user.save();
res.json(savedUser);
const user = await User.insert({
username,
email,
});
res.json(user);
});
router.get("/:id", async (req, res) => {

Loading…
Cancel
Save