continuing to connect models and services
This commit is contained in:
20
db/Seed.js
20
db/Seed.js
@@ -2,8 +2,10 @@ const { Client } = require('pg');
|
||||
require('dotenv').config({ path: "../.env" });
|
||||
|
||||
async function main() {
|
||||
console.log("Beginning database setup.");
|
||||
|
||||
const client = new Client({ connectionString: process.env.CONNECTION });
|
||||
await client.connect().then(console.log("Connection successful."));
|
||||
await client.connect().then(console.log("Now connected to postgres"));
|
||||
|
||||
// user
|
||||
const createUserTable = `
|
||||
@@ -11,8 +13,8 @@ async function main() {
|
||||
id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY NOT NULL,
|
||||
email VARCHAR NOT NULL,
|
||||
password VARCHAR NOT NULL,
|
||||
firstname VARCHAR NOT NULL,
|
||||
lastname VARCHAR NOT NULL
|
||||
firstname VARCHAR,
|
||||
lastname VARCHAR
|
||||
);
|
||||
`;
|
||||
|
||||
@@ -29,7 +31,7 @@ async function main() {
|
||||
CREATE TABLE IF NOT EXISTS orders (
|
||||
id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY NOT NULL,
|
||||
userId INT REFERENCES users(id),
|
||||
total NUMERIC NOT NULL,
|
||||
total NUMERIC,
|
||||
delivered BOOLEAN,
|
||||
processed BOOLEAN,
|
||||
shipped BOOLEAN
|
||||
@@ -61,7 +63,8 @@ async function main() {
|
||||
description VARCHAR,
|
||||
categoryId INT REFERENCES category(id),
|
||||
regionId INT REFERENCES region(id),
|
||||
price NUMERIC
|
||||
price NUMERIC,
|
||||
inventory INT
|
||||
);
|
||||
`;
|
||||
|
||||
@@ -69,7 +72,8 @@ async function main() {
|
||||
const createProductsCarts = `
|
||||
CREATE TABLE IF NOT EXISTS products_carts (
|
||||
productId INT REFERENCES product(id),
|
||||
cartId INT REFERENCES cart(id)
|
||||
cartId INT REFERENCES cart(id),
|
||||
quantity INT
|
||||
);
|
||||
`;
|
||||
|
||||
@@ -94,11 +98,11 @@ async function main() {
|
||||
}
|
||||
|
||||
await client.end();
|
||||
status = "Database setup successful!";
|
||||
status = "Database initialization successful.";
|
||||
} catch(e) {
|
||||
status = e;
|
||||
} finally {
|
||||
if (status !== "Database setup successful!") {
|
||||
if (status !== "Database initialization successful.") {
|
||||
throw new Error(status);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
|
||||
|
||||
async function main() {
|
||||
return;
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
import csv
|
||||
from re import M
|
||||
from psycopg2 import sql
|
||||
|
||||
# function to read from a given csv file into postgres
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from insert_file_contents import insert_file_contents
|
||||
import psycopg2
|
||||
from psycopg2 import sql
|
||||
import os
|
||||
|
||||
# read data from environment if present
|
||||
@@ -26,9 +25,12 @@ os.close(fd)
|
||||
conn = psycopg2.connect("dbname=e-commerce-092122 user=mikayladobson")
|
||||
cur = conn.cursor()
|
||||
|
||||
print("Now attempting to populate database...")
|
||||
|
||||
# read contents of each file into postgres
|
||||
insert_file_contents(conn, cur, "./data/categories.csv", 'category')
|
||||
insert_file_contents(conn, cur, "./data/regions.csv", 'region')
|
||||
insert_file_contents(conn, cur, "./data/products.csv", 'product')
|
||||
|
||||
print("Database insertions executed successfully.")
|
||||
print("Insertions executed successfully.")
|
||||
print("Database preparations complete!")
|
||||
@@ -3,18 +3,51 @@ const pgp = require('pg-promise')({ capSQL: true });
|
||||
|
||||
module.exports = class CartProductModel {
|
||||
async create(data) {
|
||||
|
||||
try {
|
||||
const statement = pgp.helpers.insert(data, null, 'products_orders') + 'RETURNING *';
|
||||
const result = await db.query(statement);
|
||||
if (result.rows.length) return result.rows[0];
|
||||
return null;
|
||||
} catch(e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
async find(cartid) {
|
||||
|
||||
try {
|
||||
const statement = "SELECT * FROM products_orders WHERE cartid = $1";
|
||||
const values = [cartid];
|
||||
const result = await db.query(statement, values);
|
||||
if (result.rows.length) return result.rows[0];
|
||||
return [];
|
||||
} catch(e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
async update(data) {
|
||||
const { id } = data;
|
||||
|
||||
try {
|
||||
const condition = pgp.as.format("WHERE id = $1", [id]);
|
||||
const statement = pgp.helpers.update(data, null, 'products_orders') + condition;
|
||||
const result = await db.query(statement);
|
||||
if (result.rows.length) return result.rows[0];
|
||||
return null;
|
||||
} catch(e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
async delete(productid) {
|
||||
|
||||
try {
|
||||
const statement = "DELETE FROM products_orders WHERE id = $1 RETURNING *";
|
||||
const values = [productid];
|
||||
const result = await db.query(statement, values);
|
||||
if (result.rows.length) return result.rows[0];
|
||||
return null;
|
||||
} catch(e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +1,44 @@
|
||||
module.exports = class OrderModel {
|
||||
async create() {
|
||||
const db = require('../db/Pool');
|
||||
const pgp = require('pg-promise')({ capSQL: true });
|
||||
|
||||
/**
|
||||
* TODO: conceptualize and implement order lifecycle, from not submitted,
|
||||
* to submitted/not shipped, to shipped and pending, to delivered?
|
||||
**/
|
||||
|
||||
module.exports = class OrderModel {
|
||||
async create(userid) {
|
||||
try {
|
||||
const statement = pgp.helpers.insert(userid, null, 'orders') + 'RETURNING *';
|
||||
const result = await db.query(statement);
|
||||
if (result.rows.length) return result.rows[0];
|
||||
return null;
|
||||
} catch(e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
async update(data) {
|
||||
try {
|
||||
|
||||
} catch(e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
async findByUser(userid) {
|
||||
try {
|
||||
|
||||
} catch(e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
async findByOrderId(orderid) {
|
||||
try {
|
||||
|
||||
} catch(e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,8 +6,7 @@
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"start": "nodemon server.js",
|
||||
"seed": "cd db && node seed.js",
|
||||
"populate": "cd db/util && python3 main.py"
|
||||
"seed": "cd db && node seed.js && cd util && python3 main.py"
|
||||
},
|
||||
"engines": {
|
||||
"node": "v16.13.1"
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
require('dotenv').config();
|
||||
const express = require('express');
|
||||
const loaders = require('./loaders');
|
||||
const PORT = process.env.PORT || 8088;
|
||||
|
||||
const app = express();
|
||||
const loaders = require('./loaders');
|
||||
|
||||
async function start() {
|
||||
const app = express();
|
||||
loaders(app);
|
||||
|
||||
app.listen(PORT, () => {
|
||||
|
||||
@@ -36,10 +36,5 @@ module.exports = class AuthService {
|
||||
}
|
||||
}
|
||||
|
||||
// yet to be implemented
|
||||
async deleteOne(data) {
|
||||
return data;
|
||||
}
|
||||
|
||||
// TO IMPLEMENT: google, facebook passport strategies
|
||||
}
|
||||
@@ -1,6 +1,11 @@
|
||||
const createError = require('http-errors');
|
||||
const CartModel = require('../models/CartModel');
|
||||
const OrderModel = require('../models/OrderModel');
|
||||
const CartProductModel = require('../models/CartProductModel');
|
||||
|
||||
const CartInstance = new CartModel();
|
||||
const OrderInstance = new OrderModel();
|
||||
const CartProductInstance = new CartProductModel();
|
||||
|
||||
module.exports = class CartService {
|
||||
async create(userid) {
|
||||
@@ -14,6 +19,14 @@ module.exports = class CartService {
|
||||
|
||||
async addItem(userid, item) {
|
||||
const cart = await CartInstance.findOneByUserId(userid);
|
||||
const item = "await CartProductInstance.create(item)";
|
||||
const item = await CartProductInstance.create(item);
|
||||
}
|
||||
|
||||
async removeItem(userid, item) {
|
||||
|
||||
}
|
||||
|
||||
async checkout() {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
const OrderModel = require('../models/OrderModel');
|
||||
const OrderInstance = new OrderModel();
|
||||
|
||||
module.exports = class OrderService {
|
||||
async create(userid) {
|
||||
const result = await OrderInstance.create(userid);
|
||||
if (!result) throw new Error();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user