binds all API routes to api prefix route, refactors to support
This commit is contained in:
@@ -1,20 +0,0 @@
|
||||
const passport = require('passport');
|
||||
const AnonymousStrategy = require('passport-anonymous');
|
||||
const jwtStrategy = require('./jwt');
|
||||
const initRoutes = require('../routes/init');
|
||||
const authRoutes = require('./routes');
|
||||
|
||||
const initUserAuth = (User, config, router) => {
|
||||
passport.use(User.createStrategy());
|
||||
|
||||
passport.use(jwtStrategy(User, config));
|
||||
passport.serializeUser(User.serializeUser());
|
||||
passport.deserializeUser(User.deserializeUser());
|
||||
|
||||
passport.use(new AnonymousStrategy.Strategy());
|
||||
|
||||
router.use('', initRoutes(User));
|
||||
router.use('', authRoutes(config, User));
|
||||
};
|
||||
|
||||
module.exports = initUserAuth;
|
||||
31
src/auth/register.js
Normal file
31
src/auth/register.js
Normal file
@@ -0,0 +1,31 @@
|
||||
const mongoose = require('mongoose');
|
||||
const passport = require('passport');
|
||||
const AnonymousStrategy = require('passport-anonymous');
|
||||
const passportLocalMongoose = require('passport-local-mongoose');
|
||||
const jwtStrategy = require('./jwt');
|
||||
const authRoutes = require('./routes');
|
||||
const buildCollectionSchema = require('../collections/buildSchema');
|
||||
const baseUserFields = require('../auth/baseFields');
|
||||
const collectionRoutes = require('../collections/routes');
|
||||
|
||||
function registerUser() {
|
||||
this.config.user.fields.push(...baseUserFields);
|
||||
const userSchema = buildCollectionSchema(this.config.user, this.config);
|
||||
userSchema.plugin(passportLocalMongoose, { usernameField: this.config.user.auth.useAsUsername });
|
||||
this.User = mongoose.model(this.config.user.labels.singular, userSchema);
|
||||
|
||||
passport.use(this.User.createStrategy());
|
||||
passport.use(jwtStrategy(this.User, this.config));
|
||||
passport.serializeUser(this.User.serializeUser());
|
||||
passport.deserializeUser(this.User.deserializeUser());
|
||||
passport.use(new AnonymousStrategy.Strategy());
|
||||
|
||||
this.router.use(authRoutes(this.config, this.User));
|
||||
|
||||
this.router.use(collectionRoutes({
|
||||
model: this.User,
|
||||
config: this.config.user,
|
||||
}));
|
||||
}
|
||||
|
||||
module.exports = registerUser;
|
||||
@@ -8,6 +8,17 @@ const router = express.Router();
|
||||
const authRoutes = (config, User) => {
|
||||
const auth = authRequestHandlers(config, User);
|
||||
|
||||
router
|
||||
.route('/init')
|
||||
.get((req, res) => {
|
||||
User.countDocuments({}, (err, count) => {
|
||||
if (err) res.status(200).json({ error: err });
|
||||
return count >= 1
|
||||
? res.status(200).json({ initialized: true })
|
||||
: res.status(200).json({ initialized: false });
|
||||
});
|
||||
});
|
||||
|
||||
router
|
||||
.route('/login')
|
||||
.post(auth.login);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
const path = require('path');
|
||||
const webpack = require('webpack');
|
||||
const getWebpackProdConfig = require('../client/config/getWebpackProdConfig');
|
||||
const getWebpackProdConfig = require('../webpack/getWebpackProdConfig');
|
||||
|
||||
module.exports = (args) => {
|
||||
const configPath = path.resolve(process.cwd(), (args.config || './payload.config.js'));
|
||||
|
||||
@@ -3,7 +3,7 @@ import {
|
||||
Route, Switch, withRouter, Redirect,
|
||||
} from 'react-router-dom';
|
||||
import DefaultList from './views/collections/List';
|
||||
import config from '../config/sanitizedClientConfig';
|
||||
import config from '../securedConfig';
|
||||
import { useUser } from './data/User';
|
||||
import Dashboard from './views/Dashboard';
|
||||
import Login from './views/Login';
|
||||
|
||||
@@ -7,7 +7,7 @@ import PropTypes from 'prop-types';
|
||||
import Cookies from 'universal-cookie';
|
||||
import { useModal } from '@trbl/react-modal';
|
||||
import { requests } from '../../api';
|
||||
import config from '../../config/sanitizedClientConfig';
|
||||
import config from '../../securedConfig';
|
||||
import StayLoggedInModal from '../modals/StayLoggedIn';
|
||||
import useThrottledEffect from '../../hooks/useThrottledEffect';
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import Cookies from 'universal-cookie';
|
||||
import some from 'async-some';
|
||||
import ReactSelect from '../../../modules/ReactSelect';
|
||||
import useFieldType from '../../useFieldType';
|
||||
import config from '../../../../config/sanitizedClientConfig';
|
||||
import config from '../../../../securedConfig';
|
||||
import Label from '../../Label';
|
||||
import Error from '../../Error';
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import React from 'react';
|
||||
import { useLocation, NavLink, Link } from 'react-router-dom';
|
||||
import config from '../../../config/sanitizedClientConfig';
|
||||
import config from '../../../securedConfig';
|
||||
|
||||
import Arrow from '../../graphics/Arrow';
|
||||
import Icon from '../../graphics/Icon';
|
||||
|
||||
@@ -4,7 +4,7 @@ import { useHistory } from 'react-router-dom';
|
||||
import { asModal } from '@trbl/react-modal';
|
||||
import ContentBlock from '../../layout/ContentBlock';
|
||||
import Button from '../../controls/Button';
|
||||
import config from '../../../config/sanitizedClientConfig';
|
||||
import config from '../../../securedConfig';
|
||||
|
||||
import './index.scss';
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import React, { useState } from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import qs from 'qs';
|
||||
import config from '../../../config/sanitizedClientConfig';
|
||||
import config from '../../../securedConfig';
|
||||
import { useLocale } from '../../utilities/Locale';
|
||||
import { useSearchParams } from '../../utilities/SearchParams';
|
||||
import Arrow from '../../graphics/Arrow';
|
||||
|
||||
@@ -2,7 +2,7 @@ import React, { Component } from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import Filter from '../Filter';
|
||||
import Table from '../../layout/Table';
|
||||
import config from '../../../config/sanitizedClientConfig';
|
||||
import config from '../../../securedConfig';
|
||||
|
||||
const { routes: { admin } } = config;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import React, { Component } from 'react';
|
||||
import { createPortal } from 'react-dom';
|
||||
import Button from '../../controls/Button';
|
||||
import api from '../../../api';
|
||||
import config from '../../../config/sanitizedClientConfig';
|
||||
import config from '../../../securedConfig';
|
||||
|
||||
import './index.scss';
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import React, {
|
||||
createContext, useContext, useState, useEffect,
|
||||
} from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import config from '../../../config/sanitizedClientConfig';
|
||||
import config from '../../../securedConfig';
|
||||
import { useSearchParams } from '../SearchParams';
|
||||
|
||||
const defaultLocale = (config.localization && config.localization.defaultLocale) ? config.localization.defaultLocale : 'en';
|
||||
|
||||
@@ -3,7 +3,7 @@ import {
|
||||
Redirect,
|
||||
} from 'react-router-dom';
|
||||
import { useStatusList } from '../../modules/Status';
|
||||
import config from '../../../config/sanitizedClientConfig';
|
||||
import config from '../../../securedConfig';
|
||||
|
||||
const RedirectToLogin = () => {
|
||||
const { addStatus } = useStatusList();
|
||||
|
||||
@@ -6,7 +6,7 @@ import ContentBlock from '../../layout/ContentBlock';
|
||||
import Form from '../../forms/Form';
|
||||
import RenderFields from '../../forms/RenderFields';
|
||||
import FormSubmit from '../../forms/Submit';
|
||||
import config from '../../../config/sanitizedClientConfig';
|
||||
import config from '../../../securedConfig';
|
||||
import { useUser } from '../../data/User';
|
||||
|
||||
import './index.scss';
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import React from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import DefaultTemplate from '../../layout/DefaultTemplate';
|
||||
import config from '../../../config/sanitizedClientConfig';
|
||||
import config from '../../../securedConfig';
|
||||
|
||||
import './index.scss';
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import Form from '../../forms/Form';
|
||||
import Email from '../../forms/field-types/Email';
|
||||
import Password from '../../forms/field-types/Password';
|
||||
import FormSubmit from '../../forms/Submit';
|
||||
import config from '../../../config/sanitizedClientConfig';
|
||||
import config from '../../../securedConfig';
|
||||
import Button from '../../controls/Button';
|
||||
import { useUser } from '../../data/User';
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import React, { useEffect } from 'react';
|
||||
import { useUser } from '../../data/User';
|
||||
import ContentBlock from '../../layout/ContentBlock';
|
||||
import config from '../../../config/sanitizedClientConfig';
|
||||
import config from '../../../securedConfig';
|
||||
import Button from '../../controls/Button';
|
||||
|
||||
import './index.scss';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React from 'react';
|
||||
import config from '../../../config/sanitizedClientConfig';
|
||||
import config from '../../../securedConfig';
|
||||
import Button from '../../controls/Button';
|
||||
import DefaultTemplate from '../../layout/DefaultTemplate';
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { useRouteMatch, useHistory } from 'react-router-dom';
|
||||
import config from '../../../../config/sanitizedClientConfig';
|
||||
import config from '../../../../securedConfig';
|
||||
import DefaultTemplate from '../../../layout/DefaultTemplate';
|
||||
import usePayloadAPI from '../../../../hooks/usePayloadAPI';
|
||||
import Form from '../../../forms/Form';
|
||||
|
||||
@@ -3,7 +3,7 @@ import { useLocation } from 'react-router-dom';
|
||||
import queryString from 'qs';
|
||||
import PropTypes from 'prop-types';
|
||||
import usePayloadAPI from '../../../../hooks/usePayloadAPI';
|
||||
import config from '../../../../config/sanitizedClientConfig';
|
||||
import config from '../../../../securedConfig';
|
||||
import DefaultTemplate from '../../../layout/DefaultTemplate';
|
||||
import HeadingButton from '../../../modules/HeadingButton';
|
||||
import SearchableTable from '../../../modules/SearchableTable';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import config from '../../../../config/sanitizedClientConfig';
|
||||
import config from '../../../../securedConfig';
|
||||
import DefaultTemplate from '../../../layout/DefaultTemplate';
|
||||
import usePayloadAPI from '../../../../hooks/usePayloadAPI';
|
||||
import Form from '../../../forms/Form';
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
const sanitizeConfig = require('../utilities/sanitizeConfig');
|
||||
|
||||
module.exports = config => sanitizeConfig(config);
|
||||
@@ -1,5 +1,5 @@
|
||||
const sanitizeConfig = require('../../utilities/sanitizeConfig');
|
||||
const secureConfig = require('../../utilities/secureConfig');
|
||||
const sanitizeConfig = require('../utilities/sanitizeConfig');
|
||||
const secureConfig = require('../utilities/secureConfig');
|
||||
|
||||
module.exports = (config) => {
|
||||
const sanitizedConfig = sanitizeConfig(config);
|
||||
19
src/collections/register.js
Normal file
19
src/collections/register.js
Normal file
@@ -0,0 +1,19 @@
|
||||
const mongoose = require('mongoose');
|
||||
const collectionRoutes = require('./routes');
|
||||
const validate = require('./validate');
|
||||
const buildSchema = require('./buildSchema');
|
||||
|
||||
function registerCollections() {
|
||||
this.config.collections.forEach((collection) => {
|
||||
validate(collection, this.collections);
|
||||
|
||||
this.collections[collection.slug] = {
|
||||
model: mongoose.model(collection.slug, buildSchema(collection, this.config)),
|
||||
config: collection,
|
||||
};
|
||||
|
||||
this.router.use(collectionRoutes(this.collections[collection.slug]));
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = registerCollections;
|
||||
@@ -1,3 +1,4 @@
|
||||
const express = require('express');
|
||||
const requestHandlers = require('../mongoose/requestHandlers');
|
||||
const bindModelMiddleware = require('../mongoose/bindModel');
|
||||
const setModelLocaleMiddleware = require('../localization/setModelLocale');
|
||||
@@ -8,7 +9,9 @@ const {
|
||||
query, create, findOne, destroy, update,
|
||||
} = requestHandlers;
|
||||
|
||||
const registerRoutes = ({ model, config }, router) => {
|
||||
const router = express.Router();
|
||||
|
||||
const registerRoutes = ({ model, config }) => {
|
||||
router.all(`/${config.slug}*`,
|
||||
bindModelMiddleware(model),
|
||||
bindCollectionMiddleware(config),
|
||||
@@ -22,6 +25,8 @@ const registerRoutes = ({ model, config }, router) => {
|
||||
.get(loadPolicy(config.policies.read), findOne)
|
||||
.put(loadPolicy(config.policies.update), update)
|
||||
.delete(loadPolicy(config.policies.destroy), destroy);
|
||||
|
||||
return router;
|
||||
};
|
||||
|
||||
module.exports = registerRoutes;
|
||||
35
src/express/middleware.js
Normal file
35
src/express/middleware.js
Normal file
@@ -0,0 +1,35 @@
|
||||
const express = require('express');
|
||||
const passport = require('passport');
|
||||
const compression = require('compression');
|
||||
const bodyParser = require('body-parser');
|
||||
const methodOverride = require('method-override');
|
||||
const localizationMiddleware = require('../localization/middleware');
|
||||
|
||||
const middleware = (config) => {
|
||||
return [
|
||||
passport.initialize(),
|
||||
passport.session(),
|
||||
express.json(),
|
||||
methodOverride('X-HTTP-Method-Override'),
|
||||
express.urlencoded({ extended: true }),
|
||||
bodyParser.urlencoded({ extended: true }),
|
||||
compression(config.compression),
|
||||
localizationMiddleware(config.localization),
|
||||
(req, res, next) => {
|
||||
if (config.cors) {
|
||||
if (config.cors.indexOf(req.headers.origin) > -1) {
|
||||
res.setHeader('Access-Control-Allow-Origin', req.headers.origin);
|
||||
res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
|
||||
}
|
||||
|
||||
res.header('Access-Control-Allow-Headers',
|
||||
'Origin X-Requested-With, Content-Type, Accept, Authorization');
|
||||
res.header('Content-Language', config.localization.locale);
|
||||
}
|
||||
|
||||
next();
|
||||
},
|
||||
];
|
||||
};
|
||||
|
||||
module.exports = middleware;
|
||||
@@ -1,8 +0,0 @@
|
||||
const bindGlobalMiddleware = (global) => {
|
||||
return (req, res, next) => {
|
||||
req.global = global;
|
||||
next();
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = bindGlobalMiddleware;
|
||||
@@ -4,13 +4,13 @@ const mongooseHidden = require('mongoose-hidden');
|
||||
const buildSchema = require('../mongoose/schema/buildSchema');
|
||||
const localizationPlugin = require('../localization/plugin');
|
||||
|
||||
const registerSchema = (globalConfigs, config) => {
|
||||
const registerSchema = (config) => {
|
||||
const globals = {
|
||||
config: globalConfigs,
|
||||
config: config.globals,
|
||||
model: {},
|
||||
};
|
||||
|
||||
if (globalConfigs && globalConfigs.length > 0) {
|
||||
if (config.globals && config.globals.length > 0) {
|
||||
const globalsSchema = new mongoose.Schema({}, { discriminatorKey: 'globalType', timestamps: false })
|
||||
.plugin(localizationPlugin, config.localization)
|
||||
.plugin(autopopulate)
|
||||
@@ -18,7 +18,7 @@ const registerSchema = (globalConfigs, config) => {
|
||||
|
||||
const Globals = mongoose.model('globals', globalsSchema);
|
||||
|
||||
Object.values(globalConfigs).forEach((globalConfig) => {
|
||||
Object.values(config.globals).forEach((globalConfig) => {
|
||||
const globalSchema = buildSchema(globalConfig.fields, config);
|
||||
|
||||
globalSchema
|
||||
8
src/globals/middleware.js
Normal file
8
src/globals/middleware.js
Normal file
@@ -0,0 +1,8 @@
|
||||
const getMiddleware = (global) => {
|
||||
return (req, res, next) => {
|
||||
req.global = global;
|
||||
next();
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = getMiddleware;
|
||||
12
src/globals/register.js
Normal file
12
src/globals/register.js
Normal file
@@ -0,0 +1,12 @@
|
||||
const validate = require('./validate');
|
||||
const buildSchema = require('./buildSchema');
|
||||
const routes = require('./routes');
|
||||
|
||||
|
||||
function registerGlobals() {
|
||||
validate(this.config.globals);
|
||||
this.globals = buildSchema(this.config);
|
||||
this.router.use(routes(this.config.globals, this.globals));
|
||||
}
|
||||
|
||||
module.exports = registerGlobals;
|
||||
@@ -1,18 +1,21 @@
|
||||
const express = require('express');
|
||||
const requestHandlers = require('./requestHandlers');
|
||||
const setModelLocaleMiddleware = require('../localization/setModelLocale');
|
||||
const bindModelMiddleware = require('../mongoose/bindModel');
|
||||
const loadPolicy = require('../auth/loadPolicy');
|
||||
const bindGlobalMiddleware = require('../globals/bindGlobalMiddleware');
|
||||
const getMiddleware = require('./middleware');
|
||||
|
||||
const { upsert, findOne } = requestHandlers;
|
||||
|
||||
const registerGlobals = (globals, router) => {
|
||||
const router = express.Router();
|
||||
|
||||
const registerGlobals = (globalConfigs, Globals) => {
|
||||
router.all('/globals*',
|
||||
bindModelMiddleware(globals.model),
|
||||
bindModelMiddleware(Globals),
|
||||
setModelLocaleMiddleware());
|
||||
|
||||
globals.config.forEach((global) => {
|
||||
router.all(`/globals/${global.slug}`, bindGlobalMiddleware(global));
|
||||
globalConfigs.forEach((global) => {
|
||||
router.all(`/globals/${global.slug}`, getMiddleware(global));
|
||||
|
||||
router
|
||||
.route(`/globals/${global.slug}`)
|
||||
@@ -20,6 +23,8 @@ const registerGlobals = (globals, router) => {
|
||||
.post(loadPolicy(global.policies.create), upsert)
|
||||
.put(loadPolicy(global.policies.update), upsert);
|
||||
});
|
||||
|
||||
return router;
|
||||
};
|
||||
|
||||
module.exports = registerGlobals;
|
||||
119
src/index.js
119
src/index.js
@@ -1,45 +1,33 @@
|
||||
const mongoose = require('mongoose');
|
||||
const passportLocalMongoose = require('passport-local-mongoose');
|
||||
const connectMongoose = require('./init/connectMongoose');
|
||||
const registerExpressMiddleware = require('./init/registerExpressMiddleware');
|
||||
const initPassport = require('./init/passport');
|
||||
const initCORS = require('./init/cors');
|
||||
const initUploads = require('./init/uploads');
|
||||
const initWebpack = require('./init/webpack');
|
||||
const initUserAuth = require('./auth/init');
|
||||
const baseUserFields = require('./auth/baseFields');
|
||||
const baseUploadFields = require('./uploads/baseUploadFields');
|
||||
const baseImageFields = require('./uploads/baseImageFields');
|
||||
const registerUploadRoutes = require('./uploads/routes');
|
||||
const validateCollection = require('./collections/validate');
|
||||
const buildCollectionSchema = require('./collections/buildSchema');
|
||||
const registerCollectionRoutes = require('./collections/registerRoutes');
|
||||
const validateGlobals = require('./globals/validate');
|
||||
const registerGlobalSchema = require('./globals/registerSchema');
|
||||
const registerGlobalRoutes = require('./globals/registerRoutes');
|
||||
const express = require('express');
|
||||
|
||||
const connectMongoose = require('./mongoose/connect');
|
||||
const expressMiddleware = require('./express/middleware');
|
||||
const initWebpack = require('./webpack/init');
|
||||
const registerUser = require('./auth/register');
|
||||
const registerUpload = require('./uploads/register');
|
||||
const registerCollections = require('./collections/register');
|
||||
const registerGlobals = require('./globals/register');
|
||||
const sanitizeConfig = require('./utilities/sanitizeConfig');
|
||||
|
||||
class Payload {
|
||||
constructor(options) {
|
||||
this.config = sanitizeConfig(options.config);
|
||||
this.express = options.express;
|
||||
this.router = express.Router();
|
||||
this.collections = {};
|
||||
this.registerUser.bind(this);
|
||||
this.registerUpload.bind(this);
|
||||
this.registerGlobals.bind(this);
|
||||
this.registerCollections.bind(this);
|
||||
|
||||
this.registerUser = registerUser.bind(this);
|
||||
this.registerUpload = registerUpload.bind(this);
|
||||
this.registerCollections = registerCollections.bind(this);
|
||||
this.registerGlobals = registerGlobals.bind(this);
|
||||
|
||||
this.getCollections.bind(this);
|
||||
this.getGlobals.bind(this);
|
||||
|
||||
// Bind options, app, router
|
||||
this.app = options.app;
|
||||
this.config = sanitizeConfig(options.config);
|
||||
this.router = options.router;
|
||||
|
||||
// Setup & initialization
|
||||
connectMongoose(this.config.mongoURL);
|
||||
registerExpressMiddleware(this.app, this.config, this.router);
|
||||
initPassport(this.app);
|
||||
initUploads(this.app, this.config);
|
||||
initCORS(this.app, this.config);
|
||||
|
||||
this.router.use(...expressMiddleware(this.config));
|
||||
|
||||
// Register and bind required collections
|
||||
this.registerUser();
|
||||
@@ -51,67 +39,16 @@ class Payload {
|
||||
// Register globals
|
||||
this.registerGlobals();
|
||||
|
||||
// Enable client webpack
|
||||
if (!this.config.disableAdmin) initWebpack(this.app, this.config);
|
||||
}
|
||||
// Enable client
|
||||
if (!this.config.disableAdmin) {
|
||||
this.express.use(initWebpack(this.config));
|
||||
}
|
||||
|
||||
registerUser() {
|
||||
this.config.user.fields.push(...baseUserFields);
|
||||
const userSchema = buildCollectionSchema(this.config.user, this.config);
|
||||
userSchema.plugin(passportLocalMongoose, { usernameField: this.config.user.auth.useAsUsername });
|
||||
// Bind router to API
|
||||
this.express.use(this.config.routes.api, this.router);
|
||||
|
||||
this.User = mongoose.model(this.config.user.labels.singular, userSchema);
|
||||
initUserAuth(this.User, this.config, this.router);
|
||||
|
||||
registerCollectionRoutes({
|
||||
model: this.User,
|
||||
config: this.config.user,
|
||||
}, this.router);
|
||||
}
|
||||
|
||||
registerUpload() {
|
||||
// TODO: mongooseHidden on our upload model is hiding all the fields
|
||||
const uploadSchema = buildCollectionSchema(
|
||||
this.config.upload,
|
||||
this.config,
|
||||
{ discriminatorKey: 'type' },
|
||||
);
|
||||
|
||||
uploadSchema.add(baseUploadFields);
|
||||
|
||||
const imageSchema = new mongoose.Schema(baseImageFields, {
|
||||
discriminatorKey: 'type',
|
||||
});
|
||||
|
||||
this.Upload = mongoose.model(this.config.upload.labels.singular, uploadSchema);
|
||||
// TODO: image type hard coded, but in the future we need some way of customizing how uploads are handled in customizable pattern
|
||||
this.Upload.discriminator('image', imageSchema);
|
||||
|
||||
registerUploadRoutes(this.Upload, this.config, this.router);
|
||||
|
||||
registerCollectionRoutes({
|
||||
model: this.Upload,
|
||||
config: this.config.upload,
|
||||
}, this.router);
|
||||
}
|
||||
|
||||
registerCollections() {
|
||||
this.config.collections.forEach((collection) => {
|
||||
validateCollection(collection, this.collections);
|
||||
|
||||
this.collections[collection.slug] = {
|
||||
model: mongoose.model(collection.slug, buildCollectionSchema(collection, this.config)),
|
||||
config: collection,
|
||||
};
|
||||
|
||||
registerCollectionRoutes(this.collections[collection.slug], this.router);
|
||||
});
|
||||
}
|
||||
|
||||
registerGlobals() {
|
||||
validateGlobals(this.config.globals);
|
||||
this.globals = registerGlobalSchema(this.config.globals, this.config);
|
||||
registerGlobalRoutes(this.globals, this.router);
|
||||
// Bind static
|
||||
this.express.use(this.config.staticURL, express.static(this.config.staticDir));
|
||||
}
|
||||
|
||||
getCollections() {
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
const initCORS = (app, config) => {
|
||||
if (config.cors) {
|
||||
app.use((req, res, next) => {
|
||||
if (config.cors.indexOf(req.headers.origin) > -1) {
|
||||
res.setHeader('Access-Control-Allow-Origin', req.headers.origin);
|
||||
res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
|
||||
}
|
||||
|
||||
res.header('Access-Control-Allow-Headers',
|
||||
'Origin X-Requested-With, Content-Type, Accept, Authorization');
|
||||
res.header('Content-Language', config.localization.locale);
|
||||
|
||||
next();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = initCORS;
|
||||
@@ -1,8 +0,0 @@
|
||||
const passport = require('passport');
|
||||
|
||||
const initPassport = (app) => {
|
||||
app.use(passport.initialize());
|
||||
app.use(passport.session());
|
||||
};
|
||||
|
||||
module.exports = initPassport;
|
||||
@@ -1,17 +0,0 @@
|
||||
const express = require('express');
|
||||
const compression = require('compression');
|
||||
const bodyParser = require('body-parser');
|
||||
const methodOverride = require('method-override');
|
||||
const localizationMiddleware = require('../localization/middleware');
|
||||
|
||||
const registerExpressMiddleware = (app, config, router) => {
|
||||
app.use(express.json());
|
||||
app.use(methodOverride('X-HTTP-Method-Override'));
|
||||
app.use(express.urlencoded({ extended: true }));
|
||||
app.use(bodyParser.urlencoded({ extended: true }));
|
||||
app.use(compression(config.compression));
|
||||
app.use(localizationMiddleware(config.localization));
|
||||
app.use(router);
|
||||
};
|
||||
|
||||
module.exports = registerExpressMiddleware;
|
||||
@@ -1,8 +0,0 @@
|
||||
const express = require('express');
|
||||
|
||||
const initUploads = (app, config) => {
|
||||
const staticUrl = config.staticUrl ? config.staticUrl : `/${config.staticDir}`;
|
||||
app.use(staticUrl, express.static(config.staticDir));
|
||||
};
|
||||
|
||||
module.exports = initUploads;
|
||||
@@ -1,19 +0,0 @@
|
||||
const express = require('express');
|
||||
|
||||
const router = express.Router();
|
||||
const initRoutes = (User) => {
|
||||
router
|
||||
.route('/init')
|
||||
.get((req, res) => {
|
||||
User.countDocuments({}, (err, count) => {
|
||||
if (err) res.status(200).json({ error: err });
|
||||
return count >= 1
|
||||
? res.status(200).json({ initialized: true })
|
||||
: res.status(200).json({ initialized: false });
|
||||
});
|
||||
});
|
||||
|
||||
return router;
|
||||
};
|
||||
|
||||
module.exports = initRoutes;
|
||||
35
src/uploads/register.js
Normal file
35
src/uploads/register.js
Normal file
@@ -0,0 +1,35 @@
|
||||
const mongoose = require('mongoose');
|
||||
const collectionRoutes = require('../collections/routes');
|
||||
const uploadRoutes = require('./routes');
|
||||
const baseUploadFields = require('./baseUploadFields');
|
||||
const baseImageFields = require('./baseImageFields');
|
||||
const buildCollectionSchema = require('../collections/buildSchema');
|
||||
|
||||
function registerUpload() {
|
||||
// TODO: mongooseHidden on our upload model is hiding all the fields
|
||||
const uploadSchema = buildCollectionSchema(
|
||||
this.config.upload,
|
||||
this.config,
|
||||
{ discriminatorKey: 'type' },
|
||||
);
|
||||
|
||||
uploadSchema.add(baseUploadFields);
|
||||
|
||||
const imageSchema = new mongoose.Schema(baseImageFields, {
|
||||
discriminatorKey: 'type',
|
||||
});
|
||||
|
||||
this.Upload = mongoose.model(this.config.upload.labels.singular, uploadSchema);
|
||||
|
||||
// TODO: image type hard coded, but in the future we need some way of customizing how uploads are handled in customizable pattern
|
||||
this.Upload.discriminator('image', imageSchema);
|
||||
|
||||
this.router.use(uploadRoutes(this.config, this.Upload));
|
||||
|
||||
this.router.use(collectionRoutes({
|
||||
model: this.Upload,
|
||||
config: this.config.upload,
|
||||
}));
|
||||
}
|
||||
|
||||
module.exports = registerUpload;
|
||||
@@ -1,10 +1,13 @@
|
||||
const express = require('express');
|
||||
const passport = require('passport');
|
||||
const fileUpload = require('express-fileupload');
|
||||
const { upload, update } = require('./requestHandlers');
|
||||
const uploadMiddleware = require('./middleware');
|
||||
const setModelLocaleMiddleware = require('../localization/setModelLocale');
|
||||
|
||||
const uploadRoutes = (Upload, config, router) => {
|
||||
const router = express.Router();
|
||||
|
||||
const uploadRoutes = (config, Upload) => {
|
||||
const { upload: uploadConfig } = config;
|
||||
|
||||
router.all(`/${uploadConfig.slug}*`,
|
||||
|
||||
@@ -6,7 +6,10 @@ const getStyleLoaders = require('./getStyleLoaders');
|
||||
module.exports = (config) => {
|
||||
return {
|
||||
entry: {
|
||||
main: [path.resolve(__dirname, '../../../node_modules/webpack-hot-middleware/client?path=/__webpack_hmr&timeout=20000'), path.resolve(__dirname, '../components/index.js')],
|
||||
main: [
|
||||
path.resolve(__dirname, '../../node_modules/webpack-hot-middleware/client?path=/__webpack_hmr&timeout=20000'),
|
||||
path.resolve(__dirname, '../client/components/index.js'),
|
||||
],
|
||||
},
|
||||
output: {
|
||||
path: '/',
|
||||
@@ -21,11 +24,11 @@ module.exports = (config) => {
|
||||
node: {
|
||||
__dirname: true,
|
||||
},
|
||||
resolveLoader: { modules: [path.join(__dirname, '../../../node_modules')] },
|
||||
resolveLoader: { modules: [path.join(__dirname, '../../node_modules')] },
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: require.resolve('../components/customComponents'),
|
||||
test: require.resolve('../client/components/customComponents'),
|
||||
use: [
|
||||
{
|
||||
loader: 'val-loader',
|
||||
@@ -34,7 +37,7 @@ module.exports = (config) => {
|
||||
],
|
||||
},
|
||||
{
|
||||
test: require.resolve('./sanitizedClientConfig'),
|
||||
test: require.resolve('../client/securedConfig'),
|
||||
use: [
|
||||
{
|
||||
loader: 'val-loader',
|
||||
@@ -116,13 +119,13 @@ module.exports = (config) => {
|
||||
},
|
||||
plugins: [
|
||||
new HtmlWebpackPlugin({
|
||||
template: path.resolve(__dirname, '../index.html'),
|
||||
template: path.resolve(__dirname, '../client/index.html'),
|
||||
filename: './index.html',
|
||||
}),
|
||||
new webpack.HotModuleReplacementPlugin(),
|
||||
],
|
||||
resolve: {
|
||||
modules: ['node_modules', path.resolve(__dirname, '../../../node_modules')],
|
||||
modules: ['node_modules', path.resolve(__dirname, '../../node_modules')],
|
||||
alias: {
|
||||
'payload-scss-overrides': config.paths.scssOverrides,
|
||||
},
|
||||
@@ -1,28 +1,31 @@
|
||||
const webpack = require('webpack');
|
||||
const express = require('express');
|
||||
const webpackDevMiddleware = require('webpack-dev-middleware');
|
||||
const webpackHotMiddleware = require('webpack-hot-middleware');
|
||||
const getWebpackDevConfig = require('../client/config/getWebpackDevConfig');
|
||||
const getWebpackDevConfig = require('./getWebpackDevConfig');
|
||||
|
||||
const initWebpack = (app, config) => {
|
||||
const router = express.Router();
|
||||
|
||||
const initWebpack = (config) => {
|
||||
const webpackDevConfig = getWebpackDevConfig(config);
|
||||
const compiler = webpack(webpackDevConfig);
|
||||
|
||||
app.use(webpackDevMiddleware(compiler, {
|
||||
router.use(webpackDevMiddleware(compiler, {
|
||||
publicPath: webpackDevConfig.output.publicPath,
|
||||
}));
|
||||
|
||||
app.use(webpackHotMiddleware(compiler));
|
||||
router.use(webpackHotMiddleware(compiler));
|
||||
|
||||
app.get(`${config.routes.admin}*`, (req, res, next) => {
|
||||
router.get(`${config.routes.admin}*`, (req, res, next) => {
|
||||
compiler.outputFileSystem.readFile('/index.html', (err, result) => {
|
||||
if (err) {
|
||||
return next(err);
|
||||
}
|
||||
res.set('content-type', 'text/html');
|
||||
res.send(result);
|
||||
res.end();
|
||||
return res.set('content-type', 'text/html').send(result);
|
||||
});
|
||||
});
|
||||
|
||||
return router;
|
||||
};
|
||||
|
||||
module.exports = initWebpack;
|
||||
Reference in New Issue
Block a user