aboutsummaryrefslogtreecommitdiffstats
path: root/db.js
blob: 445df70e54f9f73ddcbde029530947e2f3d0b018 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import config from './config/config.json'
import Sequelize from 'sequelize'
import SequelizeAuto from 'sequelize-auto'
import { resolver, defaultArgs, defaultListArgs, attributeFields } from 'graphql-sequelize'
import {
    graphql,
    GraphQLSchema,
    GraphQLObjectType,
    GraphQLInputObjectType,
    GraphQLString,
    GraphQLInt,
    GraphQLNonNull,
    GraphQLList
} from 'graphql'

const Op = Sequelize.Op
const l = console.log

const auto = new SequelizeAuto(
  config.development.database, 
  config.development.username, 
  config.development.password, 
  config.auto
)

const tables = { 
  User: 'users',
  Transaction: 'transactions',
  Invoice: 'invoices',
}

const db = new Sequelize(
  config.development.database,
  config.development.username,
  config.development.password,
  {
    host: config.development.host,
    dialect: config.development.dialect,
    logging: false, 
    dialectOptions: { multipleStatements: true },
    operatorsAliases: false,
  },
)

const gqlfields = {}
const gqltypes = {}

const p = (lnrpc) => {
  return new Promise((resolve, reject) => {
    return auto.run(() => {
      Object.keys(tables).forEach((k) => {
        let t = tables[k]
        let fields = {}

        Object.keys(auto.tables[t]).forEach(f => {
          let isKey = f === 'id'
          let rawtype = auto.tables[t][f].type.toLowerCase()
          let type = Sequelize.STRING

          if (rawtype.match(/^int/)) type = Sequelize.INTEGER
          if (rawtype.match(/^date/)) type = Sequelize.DATE

          fields[f] = {
            type: type,
            field: f,
            primaryKey: isKey,
            autoIncrement: isKey,
          }
        })

        db[k] = db.define(k, fields, { tableName: t })

        let typefields = {}
        let options = {}

        gqltypes[t] = new GraphQLObjectType({
          name: t,
          desc: t,
          fields: Object.assign(typefields, attributeFields(db[k])),
        })

        gqlfields[t] = {
          type: new GraphQLList(gqltypes[t]),
          args: Object.assign({}, defaultArgs(db[k]), defaultListArgs()),
          resolve: resolver(db[k], options),
        }
      })

      db.gqlschema = new GraphQLSchema({
        query: new GraphQLObjectType({
          name: 'RootQueryType',
          fields: gqlfields
        }),
        mutation: require('./mutations')(db, gqltypes, lnrpc)
      })

      resolve(db)
    })
  })
}

module.exports = p