Guest User

Untitled

a guest
Sep 13th, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.37 KB | None | 0 0
  1. const {ApolloServer, gql} = require('apollo-server');
  2. const DataLoader = require('dataloader');
  3. const keyBy = require('lodash/keyBy');
  4. const groupBy = require('lodash/groupBy');
  5. const squel = require('squel').useFlavour('postgres');
  6. const pgp = require('pg-promise')();
  7.  
  8. const db = pgp({
  9. host: 'localhost',
  10. port: 5432,
  11. user: '',
  12. database: 'goodwatch',
  13. password: ''
  14. });
  15.  
  16. // QUERIES
  17. const getSignals = () => {
  18. return squel.select()
  19. .from('signals')
  20. .toString();
  21. };
  22.  
  23. const getUsers = () => {
  24. return squel.select()
  25. .from('users')
  26. .toString();
  27. };
  28.  
  29. const getGoodsByIds = ({ids}) => {
  30. return squel.select()
  31. .from('goods')
  32. .where('id IN ?', ids)
  33. .toString();
  34. };
  35.  
  36. const getUsersGoods = ({ids}) => {
  37. return squel.select()
  38. .from('users_goods')
  39. .field('users_goods.user_id')
  40. .field('goods.*')
  41. .join('goods', null, 'goods.id = users_goods.good_id')
  42. .where('users_goods.user_id IN ?', ids)
  43. .toString();
  44. };
  45.  
  46. // LOADERS
  47.  
  48. const getLoaders = ({db}) => ({
  49. goodLoader: createGoodLoader({db}),
  50. goodsLoader: createGoodsLoader({db}),
  51. });
  52.  
  53. const createGoodLoader = ({db}) => new DataLoader(async ids => {
  54. const goods = await db.manyOrNone(getGoodsByIds({ids}));
  55. const goodsById = keyBy(goods, 'id');
  56. return ids.map(id => goodsById[id]);
  57. });
  58.  
  59. const createGoodsLoader = ({db}) => new DataLoader(async ids => {
  60. const usersGoods = await db.manyOrNone(getUsersGoods({ids}));
  61. const usersGoodsById = groupBy(usersGoods, 'user_id');
  62. return ids.map(id => usersGoodsById[id]);
  63. });
  64.  
  65. // DEFS
  66. const typeDefs = gql`
  67. type User {
  68. id: Int
  69. phone: String,
  70. goods: [Good]
  71. }
  72. type Good {
  73. id: Int
  74. identification: String
  75. }
  76. type Signal {
  77. id: Int
  78. good: Good
  79. }
  80. type Query {
  81. signals: [Signal]
  82. users: [User]
  83. }
  84. `;
  85.  
  86. // RESOLVERS
  87. const resolvers = {
  88. Query: {
  89. signals: async (parents, args) => await db.manyOrNone(getSignals(args)),
  90. users: async (parents, args) => await db.manyOrNone(getUsers(args)),
  91. },
  92.  
  93. Signal: {
  94. good: async (parent, args, context) => context.loaders.goodLoader.load(parent.good_id)
  95. },
  96.  
  97. User: {
  98. goods: async (parent, args, context) => context.loaders.goodsLoader.load(parent.id)
  99. },
  100. };
  101.  
  102. const context = {
  103. loaders: getLoaders({db})
  104. };
  105.  
  106. const server = new ApolloServer({typeDefs, resolvers, context, tracing: true});
  107.  
  108. server.listen().then(({url}) => {
  109. console.log(`🚀 Server ready at ${url}`);
  110. });
Add Comment
Please, Sign In to add comment