index.js 4.1 KB

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