diff --git a/server/db/index.js b/server/db/index.js new file mode 100644 index 0000000..f832997 --- /dev/null +++ b/server/db/index.js @@ -0,0 +1,14 @@ +const { Pool } = require("pg"); +require('dotenv').config(); + +const constring = process.env.constring; + +function main() { + if (!constring) { + throw new Error("Did not find connection string for database"); + } + + return new Pool({ connectionString: constring }) +} + +module.exports = main(); diff --git a/server/db/pgSessionStore.js b/server/db/pgSessionStore.js new file mode 100644 index 0000000..3b9472f --- /dev/null +++ b/server/db/pgSessionStore.js @@ -0,0 +1,14 @@ +const connectPgSimple = require('connect-pg-simple'); +const pool = require('.'); + +function pgSessionStore(s) { + const pgSession = connectPgSimple(s) + + return new pgSession({ + pool: pool, + tableName: "pgsessions", + createTableIfMissing: true + }) +} + +module.exports = pgSessionStore; \ No newline at end of file diff --git a/server/db/seed.js b/server/db/seed.js new file mode 100644 index 0000000..62e6fcf --- /dev/null +++ b/server/db/seed.js @@ -0,0 +1,29 @@ +const fs = require('fs'); +const path = require('path'); +const pool = require('.'); + +require('dotenv').config(); + +const root = path.resolve(__dirname); + +async function seed() { + console.clear(); + + const createUserTable = fs.readFileSync(root + "/sql/create/createUserTable.sql").toString(); + const createItemTable = fs.readFileSync(root + "/sql/create/createItemTable.sql").toString(); + const populateItemTable = fs.readFileSync(root + "/sql/populate/populateItemTable.sql").toString(); + + try { + for (let statement of [createUserTable, createItemTable, populateItemTable]) { + await pool.query(statement); + } + } catch(error) { + console.log(error); + process.exit(0); + } + + console.log("Database seed successful."); + process.exit(1); +} + +seed(); \ No newline at end of file diff --git a/server/db/sql/create/createItemTable.sql b/server/db/sql/create/createItemTable.sql new file mode 100644 index 0000000..02562c2 --- /dev/null +++ b/server/db/sql/create/createItemTable.sql @@ -0,0 +1,5 @@ +CREATE TABLE IF NOT EXISTS item ( + id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + name VARCHAR NOT NULL, + description VARCHAR +); \ No newline at end of file diff --git a/server/db/sql/create/createUserTable.sql b/server/db/sql/create/createUserTable.sql new file mode 100644 index 0000000..6bc6099 --- /dev/null +++ b/server/db/sql/create/createUserTable.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS appuser ( + id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + username VARCHAR NOT NULL, + email VARCHAR UNIQUE, + password VARCHAR NOT NULL, + created VARCHAR NOT NULL, + modified VARCHAR NOT NULL +); \ No newline at end of file diff --git a/server/db/sql/populate/populateItemTable.sql b/server/db/sql/populate/populateItemTable.sql new file mode 100644 index 0000000..321b374 --- /dev/null +++ b/server/db/sql/populate/populateItemTable.sql @@ -0,0 +1,6 @@ +INSERT INTO item (name, description) VALUES + ('computer', 'fancy rocks with electricity'), + ('coffee', 'caffeinated beverage'), + ('book', 'thing that holds information'), + ('cell phone', 'telecommunications device') +; \ No newline at end of file diff --git a/server/index.js b/server/index.js index e69de29..b3643d7 100644 --- a/server/index.js +++ b/server/index.js @@ -0,0 +1,22 @@ +const express = require("express"); +const loaders = require("./loaders"); +const dotenv = require('dotenv'); + +dotenv.config(); + +const PORT = process.env.PORT || 8080; +const app = express(); + +async function main() { + try { + await loaders(app); + app.listen(PORT, () => { + console.log("Listening on port " + PORT); + }) + } catch(err) { + console.log(err); + process.exit(0); + } +} + +main(); \ No newline at end of file diff --git a/server/loaders/express.js b/server/loaders/express.js index e69de29..49966e8 100644 --- a/server/loaders/express.js +++ b/server/loaders/express.js @@ -0,0 +1,33 @@ +const session = require('express-session'); +const express = require('express'); +const pgSessionStore = require('../db/pgSessionStore'); +const cors = require('cors'); + +require('dotenv').config(); + +const secret = process.env.SECRET; + +async function expressLoader(app) { + app.use(cors()); + app.use(express.json()); + app.use(express.urlencoded({ extended: true })); + + if (!secret) { + throw new Error("Express secret is undefined"); + } + + app.use(session({ + secret: secret, + cookie: { + maxAge: 8 * 60 * 60 * 1000, + secure: false + }, + resave: false, + saveUninitialized: false, + store: pgSessionStore(session) + })) + + return app; +} + +module.exports = expressLoader; \ No newline at end of file diff --git a/server/loaders/index.js b/server/loaders/index.js index e69de29..4941da4 100644 --- a/server/loaders/index.js +++ b/server/loaders/index.js @@ -0,0 +1,11 @@ +const routesLoader = require("../routes"); +const expressLoader = require("./express"); +const passportLoader = require("./passport"); + +async function loaders(app) { + const expressApp = await expressLoader(app); + const passportApp = await passportLoader(expressApp); + await routesLoader(expressApp, passportApp); +} + +module.exports = loaders; \ No newline at end of file diff --git a/server/loaders/passport.js b/server/loaders/passport.js index e69de29..f942f3f 100644 --- a/server/loaders/passport.js +++ b/server/loaders/passport.js @@ -0,0 +1,25 @@ +const passport = require('passport'); +const { Strategy } = require('passport-local'); + +async function passportLoader(app) { + app.use(passport.initialize()); + app.use(passport.session()); + + passport.serializeUser((user, done) => { + done(null, user); + }) + + passport.deserializeUser((user, done) => { + done(null, user); + }) + + passport.use(new Strategy(async (email, password, done) => { + try { + console.log(email, password); + } catch (error) { + return done(error); + } + })) +} + +module.exports = passportLoader; \ No newline at end of file diff --git a/server/models/Item.js b/server/models/Item.js new file mode 100644 index 0000000..b7f9587 --- /dev/null +++ b/server/models/Item.js @@ -0,0 +1,18 @@ +class Item { + name; + description; + created; + modified; + + constructor(name, description) { + this.name = name; + this.description = description; + + this.created = new Date(Date.now()).toDateString(); + this.modified = new Date(Date.now()).toDateString(); + } + + async getAll() { + + } +} \ No newline at end of file diff --git a/server/models/User.js b/server/models/User.js new file mode 100644 index 0000000..b305f4f --- /dev/null +++ b/server/models/User.js @@ -0,0 +1,15 @@ +module.exports = class User { + username; + email; + password; + created; + modified; + + constructor(username, email, password) { + this.username = username; + this.email = email; + this.password = password; + this.created = new Date(Date.now()).toDateString(); + this.modified = new Date(Date.now()).toDateString(); + } +} \ No newline at end of file diff --git a/server/package.json b/server/package.json index 0bf7f87..33760e1 100644 --- a/server/package.json +++ b/server/package.json @@ -4,7 +4,9 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "nodemon .", + "seed": "node db/seed.js" }, "keywords": [], "author": "", @@ -13,6 +15,7 @@ "bcrypt": "^5.1.0", "connect-pg-simple": "^8.0.0", "cors": "^2.8.5", + "dotenv": "^16.0.3", "express": "^4.18.2", "express-session": "^1.17.3", "passport": "^0.6.0", diff --git a/server/routes/auth.js b/server/routes/auth.js new file mode 100644 index 0000000..d6a91b4 --- /dev/null +++ b/server/routes/auth.js @@ -0,0 +1,5 @@ +function authRoute(app, passport) { + +} + +module.exports = authRoute; \ No newline at end of file diff --git a/server/routes/index.js b/server/routes/index.js index e69de29..2872907 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -0,0 +1,5 @@ +async function routesLoader(app, passport) { + +} + +module.exports = routesLoader; \ No newline at end of file diff --git a/server/routes/item.js b/server/routes/item.js new file mode 100644 index 0000000..77b9346 --- /dev/null +++ b/server/routes/item.js @@ -0,0 +1,9 @@ +const router = require('express').Router(); + +function itemRoute(app, passport) { + app.use('/app/items', router); + + router.get('/', (req, res) => { + res.status(200).send('items'); + }) +} \ No newline at end of file