diff --git a/.babelrc b/.babelrc index 83b4be1..a3a2c1d 100644 --- a/.babelrc +++ b/.babelrc @@ -1,5 +1,5 @@ { - "stage": 2, + "stage": 0, "env": { "development": { "plugins": ["react-transform"], @@ -9,6 +9,9 @@ "transform": "react-transform-hmr", "imports": ["react"], "locals": ["module"] + }, { + "transform": "react-transform-catch-errors", + "imports": ["react", "redbox-react"] }] } } diff --git a/app/cerebral/signals/index.js b/app/cerebral/signals/index.js deleted file mode 100644 index 84a09a7..0000000 --- a/app/cerebral/signals/index.js +++ /dev/null @@ -1,55 +0,0 @@ -import actions from 'cerebral/actions'; -import {Actions as FeathersActions} from 'feathers_client'; - -export default function(controller) { - // controller.signal('appStarted', [actions.setupServices]); - controller.signal('homeOpened', [actions.setPage('home')]); - controller.signal('postsOpened', [ - actions.setTitle('Posts index'), - actions.setPage('posts'), - actions.setLoading(true), - [ - FeathersActions.load('posts'), { - success: [ - FeathersActions.set('posts'), - actions.setLoading(false) - ] - } - ] - ]); - controller.signal('postOpened', [ - actions.setPage('post'), - actions.setLoading(true), - [ - FeathersActions.loadOne('posts'), { - success: [ - actions.setPost, - actions.setLoading(false) - ] - } - ] - ]); - controller.signal('adminHomeOpened', [actions.setAdminPage('home')]); - - controller.signal('createPost', [ - [ - FeathersActions.create('posts'), { - success: [] - } - ] - ]); - controller.signal('updatePost', [ - [ - FeathersActions.update('posts'), { - success: [] - } - ] - ]); - controller.signal('removePost', [ - [ - FeathersActions.remove('posts'), { - success: [] - } - ] - ]); -} diff --git a/app/feathers_client.js b/app/feathers_client.js deleted file mode 100644 index 73fcf69..0000000 --- a/app/feathers_client.js +++ /dev/null @@ -1,166 +0,0 @@ -import SocketClient from 'socket.io-client'; -import Feathers from 'feathers-client'; -import _ from 'lodash'; - -export const Actions = { - load(service) { - return function load(input, state, output, {feathers}) { - let models = state.get(['data', service]); - if (models) return output.success({models}); - console.log('feathers.load', service); - feathers[service].find((err, items) => { - output.success({models: items}); - }); - } - }, - - loadOne(service) { - return function loadOne(input, state, output, {feathers}) { - let models = state.get(['data', service]) || []; - let model = _.find(models, (p) => { return p.id == input.id; }); - if (model) return output.success({model}); - feathers[service].get(input.id, {}, (err, model) => { - console.log('feathers.loadOne', service); - err ? output.error(err) : output.success({model}); - }) - } - }, - - set(service) { - return function set(input, state, output, {feathers}) { - state.set(['data', service], input.models); - } - }, - - create(service) { - return function create(input, state, output, {feathers}) { - console.log('feathers.create', service, input.model); - feathers[service].create(input.model, {}, (err, model) => { - err ? output.error(err) : output.success({model}); - }); - } - }, - - created(input, state) { - console.log('feathers.created', input.service, input.model); - let path = ['data', input.service] - let serviceData = state.get(path) || []; - state.set(path, serviceData.concat([input.model])); - }, - - remove(service) { - return function remove(input, state, output, {feathers}) { - console.log('feathers.remove', service, input.model); - feathers[service].remove(input.model.id, {}, (err, model) => { - err ? output.error(err) : output.success({model}); - }); - } - }, - - removed(input, state) { - console.log('feathers.removed', input.service, input.model); - let path = ['data', input.service] - let serviceData = state.get(path) || []; - let newData = _.filter(serviceData, (model) => { - return model.id !== input.model.id; - }); - state.set(path, newData); - }, - - update(service) { - return function update(input, state, output, {feathers}) { - feathers[service].update(input.model.id, input.model, {}, (err, model) => { - err ? output.error(err) : output.success({model}); - }); - } - }, - - updated(input, state) { - console.log('feathers.updated', input.service, input.model); - let path = ['data', input.service] - let serviceData = state.get(path) || []; - let newData = _.filter(serviceData, (model) => { - return model.id !== input.model.id; - }); - state.set(path, newData.concat([input.model])); - }, - - login(input, state, output, {feathers}) { - $.post('/api/login', input, (data, result) => { - result === 'success' ? output.success(data) : output.error(data); - }); - }, - - setUser(input, state) { - console.log('setUser', input.data); - state.set(['user'], input.data); - }, - - setToken(input, state) { - if (!input.token) return; - let user = state.get(['user']); - let {token} = input; - let socket = window.feathers.socket; - - state.set(['token'], token); - localStorage.setItem('authToken', token); - if (token && !user) socket.emit('authenticate', {token}); - }, - - logout(input, state) { - state.set(['user'], null); - state.set(['token'], null); - localStorage.removeItem('authToken'); - } -}; - -export default class FeathersClient { - constructor(services) { - this.services = {}; - this.socket = new SocketClient(); - this.feathers = Feathers().configure(Feathers.socketio(this.socket)); - this.socket.on('authenticated', (data) => { - window.controller.signals.feathers.setUser({data}); - }); - for (let service of services) { this.addService(service); }; - } - - addService(name) { - this.services[name] = this.feathers.service('/api/' + name); - return this.services[name]; - } - - setupController(controller) { - controller.services.feathers = {}; - for (let serviceName of Object.keys(this.services)) { - let service = this.services[serviceName]; - controller.services.feathers[serviceName] = service; - for (let callbackName of ['created', 'updated', 'removed']) { - service.on(callbackName, (model) => { - controller.signals.feathers[callbackName]({ - service: serviceName, - model: model - }); - }); - } - } - controller.signal('feathers.created', [Actions.created]); - controller.signal('feathers.updated', [Actions.updated]); - controller.signal('feathers.removed', [Actions.removed]); - controller.signal('feathers.setUser', [Actions.setUser]); - controller.signal('feathers.setToken', [Actions.setToken]); - controller.signal('feathers.logout', [Actions.logout]); - controller.signal('feathers.login', [ - [ - Actions.login, { - success: [Actions.setUser, Actions.setToken], - error: [] - } - ] - ]); - - let token = localStorage.getItem('authToken'); - if (token) controller.signals.feathers.setToken({token}); - return controller; - } -} diff --git a/app/main.js b/app/main.js deleted file mode 100644 index e2bcab2..0000000 --- a/app/main.js +++ /dev/null @@ -1 +0,0 @@ -import 'router'; diff --git a/devServer.js b/devServer.js index 1c05066..09f4447 100644 --- a/devServer.js +++ b/devServer.js @@ -1,11 +1,9 @@ import path from 'path'; -import feathers from 'feathers'; -import hooks from 'feathers-hooks'; +import express from 'express'; import webpack from 'webpack'; -import bodyParser from 'body-parser'; import config from './webpack.config.dev'; -let app = feathers(); +let app = express(); let compiler = webpack(config); app.use(require('webpack-dev-middleware')(compiler, { @@ -14,16 +12,7 @@ app.use(require('webpack-dev-middleware')(compiler, { })); app.use(require('webpack-hot-middleware')(compiler)); - -app.configure(feathers.rest()) - .configure(feathers.socketio()) - .configure(hooks()) - .use(bodyParser.urlencoded({extended: true})) - .use(bodyParser.json()); - -require('./feathers/pg_setup')(app); -require('./feathers/auth_setup')(app); -require('./feathers/services')(app); +app.use('/static', express.static(__dirname + '/static')); app.get('*', (req, res) => { res.sendFile(path.join(__dirname, 'index.html')); diff --git a/feathers/auth_setup.js b/feathers/auth_setup.js deleted file mode 100644 index 9a6fef0..0000000 --- a/feathers/auth_setup.js +++ /dev/null @@ -1,12 +0,0 @@ -import feathersPassport from 'feathers-passport-jwt'; -import UserService from './services/user_service'; - -export default function(app) { - app.configure(feathersPassport({ - secret: 'feathers-secret' // FIXME: change to something secure - })); - app.use('/api/users', UserService); - app.service('/api/users').before({ - create: feathersPassport.hooks.hashPassword() - }); -} diff --git a/feathers/pg_setup.js b/feathers/pg_setup.js deleted file mode 100644 index 9f57076..0000000 --- a/feathers/pg_setup.js +++ /dev/null @@ -1,9 +0,0 @@ -import pg from 'pg'; -import Sequelize from 'sequelize'; - -export default function(app) { - app.dbStr = 'postgres://localhost/lbtest'; - app.pgcli = new pg.Client(app.dbStr); - app.pgcli.connect((err) => { if (err) throw err; }); - app.db = new Sequelize(app.dbStr); -} diff --git a/feathers/service_factory.js b/feathers/service_factory.js deleted file mode 100644 index c3025d8..0000000 --- a/feathers/service_factory.js +++ /dev/null @@ -1,96 +0,0 @@ -import dbmon from 'dbmon'; -import EventEmitter from 'events'; - -export default function(name, schema) { - return { - setup(app) { - this._locks = { created: {}, updated: {}, removed: {} }; - this.db = app.db; - this.model = this.db.define(name, schema, { freezeTableName: true }); - this.model.sync(); - - let emitter = new EventEmitter; - let channel = dbmon.channel({ - driver: 'postgresql', - driverOpts: { - postgresql: { cli: app.pgcli } - }, - table: name, - monitor: 'all', - keyfld: { name: 'id', type: 'integer' }, - transports: 'eventemitter', - transportsOpts: { - eventEmitter: { eventEmitter: emitter} - } - }); - emitter.on('insert', (row) => { - if (!this._locks.created[row.k]) { - this.model.findOne({where: {id: row.k}}).then((obj) => { - this.emit('created', obj); - }); - } else { - delete this._locks.created[row.k]; - } - }); - - emitter.on('update', (row) => { - if (!this._locks.updated[row.k]) { - this.model.findOne({where: {id: row.k}}).then((obj) => { - this.emit('updated', obj); - }); - } else { - delete this._locks.updated[row.k]; - } - }); - - emitter.on('delete', (row) => { - if (!this._locks.removed[row.k]) { - this.emit('removed', {id: row.k}); - } else { - delete this._locks.removed[row.k]; - } - }); - }, - - find(params, callback) { - this.model.findAll({where: params.query}).then((models) => { - callback(null, models); - }).catch(callback); - }, - - create(data, params, callback) { - this.model.create(data).then((model) => { - this._locks.created[model.id] = true; - callback(null, model); - }).catch(callback); - }, - - get(id, params, callback) { - this.model.findOne({where: {id}}).then((model) => { - callback(null, model); - }).catch(callback); - }, - - update(id, data, params, callback) { - this.model.findOne({where: {id}}).then((model) => { - model.update(data).then((model) => { - this._locks.updated[model.id] = true; - callback(null, model); - }).catch(callback); - }).catch(callback); - }, - - patch(id, data, params, callback) { - this.update(id, data, params, callback); - }, - - remove(id, params, callback) { - this.model.findOne({where: {id}}).then((model) => { - model.destroy().then(() => { - this._locks.removed[model.id] = true; - callback(null, model); - }).catch(callback); - }).catch(callback); - } - }; -}; diff --git a/feathers/services/index.js b/feathers/services/index.js deleted file mode 100644 index ec74e1e..0000000 --- a/feathers/services/index.js +++ /dev/null @@ -1,11 +0,0 @@ -import PostService from './post_service'; - -export default function setupServices(app) { - app.use('/api/posts', PostService); - app.service('/api/posts').before({ - create(hook, next) { - console.log('createPost', hook); - next(); - } - }) -} diff --git a/feathers/services/post_service.js b/feathers/services/post_service.js deleted file mode 100644 index 48793da..0000000 --- a/feathers/services/post_service.js +++ /dev/null @@ -1,18 +0,0 @@ -import Sequelize from 'sequelize'; -import ServiceFactory from '../service_factory'; - -let PostService = ServiceFactory('posts', { - title: { - type: Sequelize.STRING - }, - body: { - type: Sequelize.TEXT - } -}); - -// PostService.created = function(data, params, callback) { -// console.log(data, params, callback); -// callback(null, data); -// }; - -export default PostService; diff --git a/feathers/services/user_service.js b/feathers/services/user_service.js deleted file mode 100644 index 9e131d1..0000000 --- a/feathers/services/user_service.js +++ /dev/null @@ -1,22 +0,0 @@ -import Sequelize from 'sequelize'; -import ServiceFactory from '../service_factory'; - -let UserService = ServiceFactory('users', { - username: { - type: Sequelize.STRING, - unique: true - }, - password: { - type: Sequelize.STRING - }, - admin: { - type: Sequelize.BOOLEAN, - defaultValue: false - }, - internal: { - type: Sequelize.BOOLEAN, - defaultValue: true - } -}); - -export default UserService; diff --git a/index.html b/index.html index 747f4d9..b2ee0e6 100644 --- a/index.html +++ b/index.html @@ -5,6 +5,8 @@
+ +