lots of layout; server not really running yet
This commit is contained in:
5
.gitignore
vendored
5
.gitignore
vendored
@@ -21,4 +21,7 @@ dist-ssr
|
|||||||
*.ntvs*
|
*.ntvs*
|
||||||
*.njsproj
|
*.njsproj
|
||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
|
|
||||||
|
# Environment variables
|
||||||
|
*.env
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
import createError from 'http-errors';
|
||||||
|
import { User } from "../models/user";
|
||||||
|
const UserInstance = new User();
|
||||||
|
|
||||||
|
export default class UserCtl {
|
||||||
|
async getAll() {
|
||||||
|
try {
|
||||||
|
const users = await UserInstance.getAllUsers();
|
||||||
|
if (!users) throw createError(404, "No users found");
|
||||||
|
return users;
|
||||||
|
} catch (error) {
|
||||||
|
throw new Error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// async getOne(id: string) {
|
||||||
|
// try {
|
||||||
|
// const user = await UserInstance.getOneByID(id);
|
||||||
|
// if (!user) throw createError(404, "User not found");
|
||||||
|
// return user;
|
||||||
|
// } catch (error) {
|
||||||
|
// throw new Error(error);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// async updateOne(id: string, data: IUser) {
|
||||||
|
// try {
|
||||||
|
// const result = await UserInstance.updateOneByID(id, data);
|
||||||
|
// if (!result) throw createError(400, "Bad request");
|
||||||
|
// return result;
|
||||||
|
// } catch (error) {
|
||||||
|
// throw new Error(error);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
8
server/db/index.ts
Normal file
8
server/db/index.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import createConnectionPool, { sql } from "@databases/pg";
|
||||||
|
import dotenv from 'dotenv';
|
||||||
|
dotenv.config({ path: '../.env' });
|
||||||
|
|
||||||
|
const db = createConnectionPool(process.env.CONSTRING);
|
||||||
|
|
||||||
|
export { sql };
|
||||||
|
export default db;
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
import express from 'express';
|
import express from 'express';
|
||||||
import cors from 'cors';
|
import cors from 'cors';
|
||||||
|
import dotenv from 'dotenv';
|
||||||
|
dotenv.config({ path: './.env' });
|
||||||
|
|
||||||
import { loaders } from './loaders';
|
import { loaders } from './loaders';
|
||||||
|
|
||||||
const port = 8080;
|
const port = 8080;
|
||||||
@@ -10,6 +13,6 @@ app.use(cors());
|
|||||||
const app = express();
|
const app = express();
|
||||||
await loaders(app);
|
await loaders(app);
|
||||||
app.listen(port, () => {
|
app.listen(port, () => {
|
||||||
console.log('listening on ' + port);
|
console.log('listening on port ' + port);
|
||||||
})
|
})
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
export class Recipe {
|
||||||
|
async getOneByID(id: string) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import { IUser } from "../schemas";
|
||||||
|
import { sql } from "@databases/pg";
|
||||||
|
import pgPromise from "pg-promise";
|
||||||
|
import db from "../db";
|
||||||
|
|
||||||
|
const pgp = pgPromise({ capSQL: true });
|
||||||
|
export class User {
|
||||||
|
async getAllUsers() {
|
||||||
|
// behind auth
|
||||||
|
try {
|
||||||
|
const statement = sql`SELECT * FROM recipe`
|
||||||
|
const result = await db.query(statement);
|
||||||
|
|
||||||
|
console.log(result);
|
||||||
|
await db.dispose();
|
||||||
|
return result;
|
||||||
|
} catch (error) {
|
||||||
|
throw new Error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// async getOneByID(id: string): Promise<Array<IUser | null>> {
|
||||||
|
// try {
|
||||||
|
// const statement = `SELECT * FROM users WHERE id = $1;`;
|
||||||
|
// const values = [id];
|
||||||
|
// const result = await db.query(statement, values);
|
||||||
|
// if (result.rows.length) return result.rows[0];
|
||||||
|
// return [];
|
||||||
|
// } catch (error) {
|
||||||
|
// throw new Error(error);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// async updateOneByID(id: string, data: IUser): Promise<IUser | null> {
|
||||||
|
// try {
|
||||||
|
// // does this formatting work?
|
||||||
|
// const condition = pgp.as.format('WHERE id = $1 RETURNING *', id);
|
||||||
|
// const statement = pgp.helpers.update(data, null, 'users') + condition;
|
||||||
|
// const result = await db.query(statement);
|
||||||
|
// if (result.rows.length) return result.rows[0];
|
||||||
|
// return null;
|
||||||
|
// } catch (error) {
|
||||||
|
// throw new Error(error);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
1979
server/package-lock.json
generated
1979
server/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -10,16 +10,30 @@
|
|||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@databases/pg": "^5.4.1",
|
||||||
|
"bcrypt": "^5.1.0",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
|
"dotenv": "^16.0.3",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
|
"express-session": "^1.17.3",
|
||||||
|
"helmet": "^6.0.0",
|
||||||
|
"http-errors": "^2.0.0",
|
||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
|
"passport": "^0.6.0",
|
||||||
|
"passport-local": "^1.0.0",
|
||||||
|
"pg": "^8.8.0",
|
||||||
|
"pg-promise": "^10.15.0",
|
||||||
"swagger-ui-express": "^4.6.0"
|
"swagger-ui-express": "^4.6.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/cors": "^2.8.12",
|
"@types/cors": "^2.8.12",
|
||||||
|
"@types/dotenv": "^8.2.0",
|
||||||
"@types/express": "^4.17.14",
|
"@types/express": "^4.17.14",
|
||||||
|
"@types/http-errors": "^2.0.1",
|
||||||
"@types/js-yaml": "^4.0.5",
|
"@types/js-yaml": "^4.0.5",
|
||||||
"@types/node": "^18.11.9",
|
"@types/node": "^18.11.9",
|
||||||
|
"@types/pg": "^8.6.5",
|
||||||
|
"@types/pg-promise": "^5.4.3",
|
||||||
"@types/swagger-ui-express": "^4.1.3",
|
"@types/swagger-ui-express": "^4.1.3",
|
||||||
"nodemon": "^2.0.20",
|
"nodemon": "^2.0.20",
|
||||||
"tslint": "^6.1.3",
|
"tslint": "^6.1.3",
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
import { Express } from "express"
|
import { Express } from "express"
|
||||||
|
import { userRoute } from "./users";
|
||||||
|
|
||||||
export const routes = (app: Express, passport?: any) => {
|
export const routes = (app: Express, passport?: any) => {
|
||||||
|
console.log('routes called');
|
||||||
|
|
||||||
|
userRoute(app);
|
||||||
|
|
||||||
app.get('/hello', (req, res) => {
|
app.get('/hello', (req, res) => {
|
||||||
res.send({ message: "hello from the server!!" });
|
res.send({ message: "hello from the server!!" });
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
import db, { sql } from '../db';
|
||||||
|
import { Express, Router } from 'express';
|
||||||
|
import UserCtl from '../controllers/UserCtl';
|
||||||
|
const router = Router();
|
||||||
|
const userCtl = new UserCtl();
|
||||||
|
|
||||||
|
export const userRoute = (app: Express) => {
|
||||||
|
app.use('/users', router);
|
||||||
|
|
||||||
|
// get all users
|
||||||
|
router.get('/', async (req, res, next) => {
|
||||||
|
await db.query(sql`SELECT * FROM users`).then(response => console.log(response));
|
||||||
|
// const data = userCtl.getAll();
|
||||||
|
// res.status(200).send(data);
|
||||||
|
})
|
||||||
|
|
||||||
|
router.get('/hidden-thing', (req, res) => {
|
||||||
|
res.send('does this route actually work?');
|
||||||
|
})
|
||||||
|
}
|
||||||
35
server/schemas/index.ts
Normal file
35
server/schemas/index.ts
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
export interface IUser {
|
||||||
|
firstname: string
|
||||||
|
lastname: string
|
||||||
|
handle: string
|
||||||
|
email: string
|
||||||
|
password: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IRecipe {
|
||||||
|
name: string
|
||||||
|
description?: string
|
||||||
|
preptime: string
|
||||||
|
ingredients: IIngredient[]
|
||||||
|
removed: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IIngredient {
|
||||||
|
name: string
|
||||||
|
description?: string
|
||||||
|
active: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ICollection {
|
||||||
|
name: string
|
||||||
|
owner: IUser
|
||||||
|
active: boolean
|
||||||
|
default: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IGroceryList {
|
||||||
|
owner: IUser
|
||||||
|
listname: string
|
||||||
|
recipes?: IRecipe[]
|
||||||
|
active: boolean
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user