Added basic shack creation.
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
"parserOptions": {
|
||||
"parser": "@babel/eslint-parser",
|
||||
"ecmaVersion": 2019,
|
||||
"sourceType": "script",
|
||||
"sourceType": "module",
|
||||
"requireConfigFile": false
|
||||
},
|
||||
"rules": {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// const config = require('config');
|
||||
const yargs = require('yargs');
|
||||
// import config from 'config';
|
||||
import yargs from 'yargs';
|
||||
|
||||
const { argv } = yargs
|
||||
.command('npm start')
|
||||
@@ -8,4 +8,4 @@ const { argv } = yargs
|
||||
type: 'string',
|
||||
});
|
||||
|
||||
module.exports = argv;
|
||||
export default argv;
|
||||
|
||||
@@ -9,4 +9,4 @@ class HttpError extends Error {
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { HttpError };
|
||||
export { HttpError };
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
const config = require('config');
|
||||
const knex = require('knex');
|
||||
import config from 'config';
|
||||
import knex from 'knex';
|
||||
|
||||
module.exports = knex({
|
||||
export default knex({
|
||||
client: 'pg',
|
||||
connection: config.database,
|
||||
// performance overhead, don't use asyncStackTraces in production
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
const util = require('util');
|
||||
const path = require('path');
|
||||
const winston = require('winston');
|
||||
|
||||
require('winston-daily-rotate-file');
|
||||
import util from 'util';
|
||||
import path from 'path';
|
||||
import * as winston from 'winston';
|
||||
import 'winston-daily-rotate-file';
|
||||
import stackParser from 'error-stack-parser';
|
||||
|
||||
// import args from './args';
|
||||
|
||||
module.exports = function initLogger(filepath) {
|
||||
const contextLabel = path.basename(filepath, '.js');
|
||||
export default function initLogger(customLabel) {
|
||||
const filepath = stackParser.parse(new Error())[1]?.fileName;
|
||||
const contextLabel = customLabel || path.basename(filepath, '.js');
|
||||
|
||||
return winston.createLogger({
|
||||
format: winston.format.combine(
|
||||
@@ -32,4 +33,4 @@ module.exports = function initLogger(filepath) {
|
||||
}),
|
||||
],
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
13
src/redis.js
13
src/redis.js
@@ -1,6 +1,9 @@
|
||||
const config = require('config');
|
||||
const redis = require('redis');
|
||||
const logger = require('./logger')(__filename);
|
||||
import config from 'config';
|
||||
import redis from 'redis';
|
||||
|
||||
import initLogger from './logger';
|
||||
|
||||
const logger = initLogger();
|
||||
|
||||
const client = redis.createClient({
|
||||
socket: config.redis,
|
||||
@@ -9,6 +12,4 @@ const client = redis.createClient({
|
||||
client.connect();
|
||||
logger.info('Redis module initialized');
|
||||
|
||||
module.exports = {
|
||||
client,
|
||||
};
|
||||
export { client };
|
||||
|
||||
@@ -1,17 +1,54 @@
|
||||
const knex = require('./knex');
|
||||
import knex from './knex';
|
||||
|
||||
async function createShelf(shelf) {
|
||||
console.log('create', shelf);
|
||||
function curateDatabaseShelf(shelf) {
|
||||
if (!shelf) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const shelfEntry = await knex('shelves').insert({
|
||||
return {
|
||||
id: shelf.id,
|
||||
slug: shelf.slug,
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
async function fetchShelf(shelfId) {
|
||||
const shelfEntry = await knex('shelves')
|
||||
.where((builder) => {
|
||||
const id = Number(shelfId);
|
||||
|
||||
if (Number.isNaN(id)) {
|
||||
builder.where('slug', shelfId);
|
||||
return;
|
||||
}
|
||||
|
||||
builder.where('id', shelfId);
|
||||
})
|
||||
.first();
|
||||
|
||||
return curateDatabaseShelf(shelfEntry);
|
||||
}
|
||||
|
||||
async function fetchShelves({ limit = 10 } = {}) {
|
||||
const shelfEntries = await knex('shelves').limit(limit);
|
||||
|
||||
return shelfEntries.map((shelfEntry) => curateDatabaseShelf(shelfEntry));
|
||||
}
|
||||
|
||||
async function createShelf(shelf, user) {
|
||||
const shelfEntry = await knex('shelves')
|
||||
.insert({
|
||||
slug: shelf.slug,
|
||||
founder_id: user.id,
|
||||
})
|
||||
.returning('*');
|
||||
|
||||
console.log('entry', shelfEntry);
|
||||
|
||||
return true;
|
||||
return curateDatabaseShelf(shelfEntry);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
export {
|
||||
fetchShelf,
|
||||
fetchShelves,
|
||||
createShelf,
|
||||
};
|
||||
|
||||
17
src/users.js
17
src/users.js
@@ -1,12 +1,13 @@
|
||||
const config = require('config');
|
||||
const util = require('util');
|
||||
const crypto = require('crypto');
|
||||
const bhttp = require('bhttp');
|
||||
import config from 'config';
|
||||
import util from 'util';
|
||||
import crypto from 'crypto';
|
||||
import bhttp from 'bhttp';
|
||||
|
||||
const logger = require('./logger')(__filename);
|
||||
const { HttpError } = require('./errors');
|
||||
const knex = require('./knex');
|
||||
import initLogger from './logger';
|
||||
import { HttpError } from './errors';
|
||||
import knex from './knex';
|
||||
|
||||
const logger = initLogger();
|
||||
const scrypt = util.promisify(crypto.scrypt);
|
||||
|
||||
function curateDatabaseUser(user) {
|
||||
@@ -141,7 +142,7 @@ async function createUser(credentials, context) {
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
export {
|
||||
createUser,
|
||||
login,
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { renderPage } = require('vite-plugin-ssr/server');
|
||||
import { renderPage } from 'vite-plugin-ssr/server';
|
||||
|
||||
async function initDefaultHandler() {
|
||||
export default async function initDefaultHandler() {
|
||||
async function defaultHandler(req, res, next) {
|
||||
const pageContextInit = {
|
||||
urlOriginal: req.originalUrl,
|
||||
@@ -16,9 +16,13 @@ async function initDefaultHandler() {
|
||||
}
|
||||
|
||||
const {
|
||||
body, statusCode, contentType, earlyHints,
|
||||
statusCode, contentType, earlyHints,
|
||||
} = httpResponse;
|
||||
|
||||
const body = await httpResponse.getBody();
|
||||
|
||||
console.log(pageContext.pageData);
|
||||
|
||||
if (res.writeEarlyHints) {
|
||||
res.writeEarlyHints({ link: earlyHints.map((e) => e.earlyHintLink) });
|
||||
}
|
||||
@@ -28,5 +32,3 @@ async function initDefaultHandler() {
|
||||
|
||||
return defaultHandler;
|
||||
}
|
||||
|
||||
module.exports = initDefaultHandler;
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
const logger = require('../logger')(__filename);
|
||||
import initLogger from '../logger';
|
||||
|
||||
function errorHandler(error, req, res, _next) {
|
||||
const logger = initLogger();
|
||||
|
||||
export default function errorHandler(error, req, res, _next) {
|
||||
logger.warn(`Failed to fulfill request to ${req.path}: ${error.message}`);
|
||||
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
@@ -18,5 +20,3 @@ function errorHandler(error, req, res, _next) {
|
||||
|
||||
res.status(500).send('Something didn\'t quite go as expected... Our apologies for the inconvenience.');
|
||||
}
|
||||
|
||||
module.exports = errorHandler;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const IPCIDR = require('ip-cidr');
|
||||
import IPCIDR from 'ip-cidr';
|
||||
|
||||
function setIp(req, res, next) {
|
||||
export default function setIp(req, res, next) {
|
||||
const ip = req.headers['x-forwarded-for']
|
||||
? req.headers['x-forwarded-for'].split(',')[0]
|
||||
: req.connection.remoteAddress;
|
||||
@@ -14,5 +14,3 @@ function setIp(req, res, next) {
|
||||
|
||||
next();
|
||||
}
|
||||
|
||||
module.exports = setIp;
|
||||
|
||||
@@ -1,32 +1,31 @@
|
||||
// Note that this file isn't processed by Vite, see https://github.com/brillout/vite-plugin-ssr/issues/562
|
||||
const config = require('config');
|
||||
const express = require('express');
|
||||
const Router = require('express-promise-router');
|
||||
const session = require('express-session');
|
||||
const RedisStore = require('connect-redis').default;
|
||||
const bodyParser = require('body-parser');
|
||||
const compression = require('compression');
|
||||
const sirv = require('sirv');
|
||||
const vite = require('vite');
|
||||
import config from 'config';
|
||||
import express from 'express';
|
||||
import Router from 'express-promise-router';
|
||||
import bodyParser from 'body-parser';
|
||||
import session from 'express-session';
|
||||
import RedisStore from 'connect-redis';
|
||||
import compression from 'compression';
|
||||
import sirv from 'sirv';
|
||||
import * as vite from 'vite';
|
||||
|
||||
const logger = require('../logger')(__filename);
|
||||
const redis = require('../redis').client;
|
||||
import { client as redis } from '../redis';
|
||||
|
||||
const initDefaultHandler = require('./default');
|
||||
import initLogger from '../logger';
|
||||
import initDefaultHandler from './default';
|
||||
import setIp from './ip';
|
||||
import errorHandler from './error';
|
||||
|
||||
const setIp = require('./ip');
|
||||
const errorHandler = require('./error');
|
||||
|
||||
const {
|
||||
import {
|
||||
setUser,
|
||||
login,
|
||||
logout,
|
||||
fetchUser,
|
||||
createUser,
|
||||
} = require('./users');
|
||||
} from './users';
|
||||
|
||||
const { createShelf } = require('./shelves');
|
||||
import { createShelf } from './shelves';
|
||||
|
||||
const root = `${__dirname}/../..`;
|
||||
const logger = initLogger();
|
||||
|
||||
async function startServer() {
|
||||
const app = express();
|
||||
@@ -38,16 +37,17 @@ async function startServer() {
|
||||
app.disable('x-powered-by');
|
||||
app.set('trust proxy', 1);
|
||||
|
||||
router.use(session({ ...config.web.session, store: sessionStore }));
|
||||
router.use(setIp);
|
||||
router.use(bodyParser.json({ strict: false }));
|
||||
app.use(compression());
|
||||
|
||||
router.use(session({ ...config.web.session, store: sessionStore }));
|
||||
router.use(setIp);
|
||||
router.use(setUser);
|
||||
router.use(bodyParser.json({ strict: false }));
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
app.use(sirv(`${root}/dist/client`));
|
||||
app.use(sirv('dist/client'));
|
||||
} else {
|
||||
const viteDevMiddleware = (await vite.createServer({
|
||||
root,
|
||||
server: { middlewareMode: true },
|
||||
})).middlewares;
|
||||
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
const { createShelf } = require('../shelves');
|
||||
import { createShelf } from '../shelves';
|
||||
|
||||
async function createShelfApi(req) {
|
||||
console.log('create shelf', req.body);
|
||||
|
||||
const shelf = await createShelf(req.body);
|
||||
const shelf = await createShelf(req.body, req.user);
|
||||
|
||||
return shelf;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
createShelf: createShelfApi,
|
||||
export {
|
||||
createShelfApi as createShelf,
|
||||
};
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
const {
|
||||
login,
|
||||
createUser,
|
||||
} = require('../users');
|
||||
import { login, createUser } from '../users';
|
||||
|
||||
async function setUser(req, res, next) {
|
||||
req.user = req.session.user; // eslint-disable-line no-param-reassign
|
||||
|
||||
next();
|
||||
}
|
||||
|
||||
async function fetchUserApi(req, res) {
|
||||
res.send(req.session.user);
|
||||
@@ -25,9 +28,10 @@ async function createUserApi(req, res) {
|
||||
res.send(user);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
login: loginApi,
|
||||
logout: logoutApi,
|
||||
fetchUser: fetchUserApi,
|
||||
createUser: createUserApi,
|
||||
export {
|
||||
setUser,
|
||||
loginApi as login,
|
||||
logoutApi as logout,
|
||||
fetchUserApi as fetchUser,
|
||||
createUserApi as createUser,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user