index.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. const ObjectID = require("mongodb").ObjectID;
  2. const jwt = require('jsonwebtoken')
  3. const jwtSecret = 'CbymrfGfnB'
  4. const express = require('express');
  5. const express_graphql = require('express-graphql');
  6. const { buildSchema, printSchema } = require('graphql');
  7. const expand = require('./expand')
  8. ;(async () => {
  9. const {Savable, slice, getModels} = await require('./models.js')()
  10. const jwtGQL = require('./jwt')
  11. class User extends Savable {
  12. static get relations(){
  13. return {
  14. }
  15. }
  16. }
  17. Savable.addClass(User)
  18. let schema = buildSchema(`
  19. type User {
  20. _id: String
  21. createdAt: String
  22. login: String
  23. nick : String
  24. orders: [Order]
  25. }
  26. input UserInput {
  27. _id: String
  28. login: String
  29. nick : String
  30. }
  31. type Category {
  32. _id: ID,
  33. createdAt: String
  34. name: String!,
  35. goods: [Good]
  36. }
  37. input CategoryInput {
  38. _id: ID,
  39. name: String,
  40. goods: [GoodInput]
  41. }
  42. type Good {
  43. _id: ID,
  44. createdAt: String
  45. name: String!,
  46. description: String
  47. price: Float
  48. imgUrls: [String]
  49. orderGoods: [OrderGood]
  50. categories: [Category]
  51. }
  52. input GoodInput {
  53. _id: ID,
  54. name: String,
  55. description: String
  56. imgUrls: [String]
  57. price: Float
  58. categories: [CategoryInput]
  59. }
  60. type OrderGood {
  61. _id: ID,
  62. createdAt: String
  63. price: Float,
  64. count: Float,
  65. good: Good,
  66. order: Order
  67. total: Float
  68. }
  69. input OrderGoodInput {
  70. _id: ID,
  71. count: Int,
  72. good: GoodInput,
  73. order: OrderInput
  74. }
  75. type Order {
  76. _id: ID
  77. createdAt: String
  78. orderGoods: [OrderGood]
  79. total: Float
  80. }
  81. input OrderInput {
  82. _id: ID
  83. orderGoods: [OrderGoodInput]
  84. }
  85. `);
  86. schema = expand(schema)
  87. console.log(printSchema(schema))
  88. var app = express();
  89. app.use(express.static('public'));
  90. const anonResolvers = {
  91. createUser:async function ({login, password}){
  92. let user = await Savable.m.User.findOne({login, password})
  93. if (user)
  94. return null;
  95. user = await (new User({login, password})).save()
  96. user.___owner = user._id.toString()
  97. user.___permissions = {
  98. read: ["owner", "user"]
  99. }
  100. return await user.save()
  101. },
  102. login: async function({login, password}){
  103. console.log(Savable.classes)
  104. const user = await Savable.m.User.findOne({login, password})
  105. if (!user)
  106. return null;
  107. const token = jwt.sign({ sub: {id: user._id, login}}, jwtSecret); //подписывам токен нашим ключем
  108. return token
  109. },
  110. changePassword:async function ({login, password, newPassword}){
  111. const user = await Savable.m.User.findOne({login, password})
  112. if (!user) return null;
  113. user.password = newPassword;
  114. return await user.save()
  115. },
  116. }
  117. const anonSchema = buildSchema(`
  118. type Query {
  119. login(login: String!, password: String!): String
  120. }
  121. type Mutation {
  122. createUser(login: String!, password: String!): User
  123. changePassword(login: String!, password: String!, newPassword: String!): User
  124. }
  125. type User {
  126. _id: String
  127. createdAt: String
  128. login: String
  129. nick : String
  130. }
  131. `)
  132. app.use('/graphql', express_graphql(jwtGQL({anonSchema, anonResolvers, schema, createContext: getModels, graphiql: true, secret: jwtSecret})))
  133. app.listen(4000, () => console.log('Express GraphQL Server Now Running On localhost:4000/graphql'));
  134. })()