diff --git a/.gitignore b/.gitignore index 75a53e3..5aa3494 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,5 @@ typings/ .cache dist/ .parcel-cache/ + +server/sqlite.db diff --git a/server/app.js b/server/app.js index 8a93292..b94f30d 100644 --- a/server/app.js +++ b/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")); diff --git a/server/knexfile.js b/server/knexfile.js index 46f7d87..3da5dc3 100644 --- a/server/knexfile.js +++ b/server/knexfile.js @@ -1,8 +1,11 @@ +const { knexSnakeCaseMappers } = require('objection'); + module.exports = { client: 'sqlite3', useNullAsDefault: true, connection: { filename: 'sqlite.db' - } + }, + ...knexSnakeCaseMappers(), }; diff --git a/server/migrations/20210708184239_add_users_table.js b/server/migrations/20210708184239_add_users_table.js new file mode 100644 index 0000000..71d1207 --- /dev/null +++ b/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"); +}; + diff --git a/server/model/User.js b/server/model/User.js index a5c8c55..16c5d17 100644 --- a/server/model/User.js +++ b/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; - diff --git a/server/routes/auth.js b/server/routes/auth.js index 608dccd..04413a9 100644 --- a/server/routes/auth.js +++ b/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) => { diff --git a/server/routes/users.js b/server/routes/users.js index 2b5a61e..b10ffd2 100644 --- a/server/routes/users.js +++ b/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) => {