server mounts

This commit is contained in:
Mikayla Dobson
2023-01-31 17:34:32 -06:00
parent 5e7cfd6079
commit cfe4898ec9
16 changed files with 223 additions and 1 deletions

14
server/db/index.js Normal file
View File

@@ -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();

View File

@@ -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;

29
server/db/seed.js Normal file
View File

@@ -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();

View File

@@ -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
);

View File

@@ -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
);

View File

@@ -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')
;

View File

@@ -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();

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

18
server/models/Item.js Normal file
View File

@@ -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() {
}
}

15
server/models/User.js Normal file
View File

@@ -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();
}
}

View File

@@ -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",

5
server/routes/auth.js Normal file
View File

@@ -0,0 +1,5 @@
function authRoute(app, passport) {
}
module.exports = authRoute;

View File

@@ -0,0 +1,5 @@
async function routesLoader(app, passport) {
}
module.exports = routesLoader;

9
server/routes/item.js Normal file
View File

@@ -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');
})
}