From 51a0e40f559d012607836574e31855785a36afa5 Mon Sep 17 00:00:00 2001 From: Eric Hulburd Date: Sun, 31 Jan 2016 17:49:02 -0600 Subject: [PATCH] clean up database model setting --- lib/relay/app.relay.js | 15 +++++ lib/relay/components/App.js | 34 +++++++++++ {relay => lib/relay}/routes/AppHomeRoute.js | 0 models/house.js | 66 ++++++++++++--------- models/power_datum.js | 6 ++ models/user.js | 35 ++++++----- relay/components/App.js | 34 ----------- 7 files changed, 114 insertions(+), 76 deletions(-) create mode 100644 lib/relay/app.relay.js create mode 100644 lib/relay/components/App.js rename {relay => lib/relay}/routes/AppHomeRoute.js (100%) delete mode 100644 relay/components/App.js diff --git a/lib/relay/app.relay.js b/lib/relay/app.relay.js new file mode 100644 index 0000000..e3d8963 --- /dev/null +++ b/lib/relay/app.relay.js @@ -0,0 +1,15 @@ +import 'babel-polyfill'; + +import App from './components/App'; +import AppHomeRoute from './routes/AppHomeRoute'; +import React from 'react'; +import ReactDOM from 'react-dom'; +import Relay from 'react-relay'; + +ReactDOM.render( + , + document.getElementById('root') +); diff --git a/lib/relay/components/App.js b/lib/relay/components/App.js new file mode 100644 index 0000000..c56199d --- /dev/null +++ b/lib/relay/components/App.js @@ -0,0 +1,34 @@ +import React from 'react'; +import Relay from 'react-relay'; + +import DB from './../../config/database' + +class App extends React.Component { + render() { + var viewer = this.props.viewer, + house = viewer.house.edge.node; + return ( +
+

Hi, {viewer.username}

+

You are living in the {house.name} house!!!!

+
+ ); + } +} + +export default Relay.createContainer(App, { + fragments: { + viewer: () => Relay.QL` + fragment on ${DB.User.name} { + username + house { + edge { + node { + name + } + } + } + } + `, + }, +}); diff --git a/relay/routes/AppHomeRoute.js b/lib/relay/routes/AppHomeRoute.js similarity index 100% rename from relay/routes/AppHomeRoute.js rename to lib/relay/routes/AppHomeRoute.js diff --git a/models/house.js b/models/house.js index 2ef5672..962fbfc 100644 --- a/models/house.js +++ b/models/house.js @@ -37,42 +37,52 @@ var House = DB.sequelize.define(NAME, { }, classMethods: { set: ()=>{ + + }, + associate: ()=>{ House.hasMany(DB.PowerDatum, {as: 'PowerData'}); House.hasMany(DB.User, {as: 'Habitants'}); + }, + defineGraphQLType: ()=>{ House.graphql_type = new GraphQLObjectType({ name: NAME, description: 'A house', - fields: () => ({ - id: globalIdField(NAME), - name: { - type: new GraphQLNonNull(GraphQLString) - }, - power_data: { - type: connectionDefinitions({name: DB.PowerDatum.name, nodeType: DB.PowerDatum.graphql_type}).connectionType, - description: "Returns house's power data.", - args: connectionArgs, - resolve: (house, args) => { - return house.getPowerDataByTime(args); + fields: () => { + var {connectionType: power_data_connection} = connectionDefinitions({name: DB.PowerDatum.name, nodeType: DB.PowerDatum.graphql_type}), + {connectionType: habitants_connection} = connectionDefinitions({name: DB.User.name, nodeType: DB.User.graphql_type}); + + return { + id: globalIdField(NAME), + name: { + type: new GraphQLNonNull(GraphQLString) + }, + power_data: { + type: power_data_connection, + description: "Returns house's power data.", + args: connectionArgs, + resolve: (house, args) => { + return house.getPowerDataByTime(args); + } + }, + habitants: { + type: habitants_connection, + description: "Returns list of house's habitants.", + args: connectionArgs, + resolve: (house, args) => { + var params = extend({ + order: 'name ASC', + limit: 50, + offset: 0, + }, args); + delete params.where; // don't allow any additional query params. + return house.getHabitants(params); + } } - }, - habitants: { - type: connectionDefinitions({name: DB.User.name, nodeType: DB.User.graphql_type}).connectionType, - description: "Returns list of house's habitants.", - args: connectionArgs, - resolve: (house, args) => { - var params = extend({ - order: 'name ASC', - limit: 50, - offset: 0, - }, args); - delete params.where; // don't allow any additional query params. - return house.getHabitants(params); - } - } - }), + }; + }, interfaces: [nodeInterface] }); - }, + } getPowerDataByTime: (start_date, end_date, page)=>{ var params = extend({ order: 'time ASC', diff --git a/models/power_datum.js b/models/power_datum.js index 82293a9..edf11e4 100644 --- a/models/power_datum.js +++ b/models/power_datum.js @@ -34,7 +34,13 @@ var PowerDatum = DB.sequelize.define(NAME, { }, classMethods: { set: ()=>{ + PowerDatum.associate(); + PowerDatum.defineGraphQLType(); + }, + associate: ()=>{ PowerDatum.belongsTo(DB.House); + }, + defineGraphQLType: ()=>{ PowerDatum.graphql_type = new GraphQLObjectType({ name: NAME, description: 'A person who uses our app', diff --git a/models/user.js b/models/user.js index f025e1f..b758ec3 100644 --- a/models/user.js +++ b/models/user.js @@ -38,25 +38,32 @@ var User = DB.sequelize.define(NAME, { }, classMethods: { set: ()=>{ + User.associate(); + User.defineGraqhQLType() + }, + associate: ()=>{ User.belongsTo(DB.House); + }, + defineGraqhQLType: ()=>{ User.graphql_type = new GraphQLObjectType({ name: NAME, description: 'A house', - fields: () => ({ - id: globalIdField(NAME), - username: { - type: new GraphQLNonNull(GraphQLString) - }, - house: { - type: connectionDefinitions({name: DB.House.name, nodeType: DB.House.graphql_type}).connectionType, - description: "Returns user's house.", - args: connectionArgs, - ref: DB.PowerDatum.name, - resolve: (user, args) => { - return user.getHouse(); + fields: () => { + var {connectionType: house_connection} = connectionDefinitions({name: DB.House.name, nodeType: DB.House.graphql_type}); + return { + id: globalIdField(NAME), + username: { + type: new GraphQLNonNull(GraphQLString) + }, + house: { + type: house_connection, + description: "Returns user's house.", + resolve: (user, args) => { + return user.getHouse(); + } } - } - }), + }; + }, interfaces: [nodeInterface] }); } diff --git a/relay/components/App.js b/relay/components/App.js deleted file mode 100644 index 4492632..0000000 --- a/relay/components/App.js +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; -import Relay from 'react-relay'; - -class App extends React.Component { - render() { - return ( -
-

Widget list

-
    - {this.props.viewer.widgets.edges.map(edge => -
  • {edge.node.name} (ID: {edge.node.id})
  • - )} -
-
- ); - } -} - -export default Relay.createContainer(App, { - fragments: { - viewer: () => Relay.QL` - fragment on User { - widgets(first: 10) { - edges { - node { - id, - name, - }, - }, - }, - } - `, - }, -});