123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- const ObjectID = require("mongodb").ObjectID;
- const jwt = require('jsonwebtoken')
- const jwtSecret = 'CbymrfGfnB'
- const express = require('express');
- const express_graphql = require('express-graphql');
- const { buildSchema, printSchema } = require('graphql');
- const expand = require('./expand')
- ;(async () => {
- const {Savable, slice, getModels} = await require('./models.js')()
- const jwtGQL = require('./jwt')
- class User extends Savable {
- static get relations(){
- return {
- }
- }
- }
- Savable.addClass(User)
- let schema = buildSchema(`
- type User {
- _id: String
- createdAt: String
- login: String
- nick : String
- orders: [Order]
- }
- input UserInput {
- _id: String
- login: String
- nick : String
- }
- type Category {
- _id: ID,
- createdAt: String
- name: String!,
- goods: [Good]
- }
- input CategoryInput {
- _id: ID,
- name: String,
- goods: [GoodInput]
- }
- type Good {
- _id: ID,
- createdAt: String
- name: String!,
- description: String
- price: Float
- imgUrls: [String]
- orderGoods: [OrderGood]
- categories: [Category]
- }
- input GoodInput {
- _id: ID,
- name: String,
- description: String
- imgUrls: [String]
- price: Float
- categories: [CategoryInput]
- }
- type OrderGood {
- _id: ID,
- createdAt: String
- price: Float,
- count: Float,
- good: Good,
- order: Order
- total: Float
- }
- input OrderGoodInput {
- _id: ID,
- count: Int,
- good: GoodInput,
- order: OrderInput
- }
- type Order {
- _id: ID
- createdAt: String
- orderGoods: [OrderGood]
- total: Float
- }
- input OrderInput {
- _id: ID
- orderGoods: [OrderGoodInput]
- }
- `);
- schema = expand(schema)
- console.log(printSchema(schema))
- var app = express();
- app.use(express.static('public'));
- const anonResolvers = {
- createUser:async function ({login, password}){
- let user = await Savable.m.User.findOne({login, password})
- if (user)
- return null;
- user = await (new User({login, password})).save()
- user.___owner = user._id.toString()
- user.___permissions = {
- read: ["owner", "user"]
- }
- return await user.save()
- },
- login: async function({login, password}){
- console.log(Savable.classes)
- const user = await Savable.m.User.findOne({login, password})
- if (!user)
- return null;
- const token = jwt.sign({ sub: {id: user._id, login}}, jwtSecret); //подписывам токен нашим ключем
- return token
- },
- changePassword:async function ({login, password, newPassword}){
- const user = await Savable.m.User.findOne({login, password})
- if (!user) return null;
- user.password = newPassword;
- return await user.save()
- },
- }
- const anonSchema = buildSchema(`
- type Query {
- login(login: String!, password: String!): String
- }
- type Mutation {
- createUser(login: String!, password: String!): User
- changePassword(login: String!, password: String!, newPassword: String!): User
- }
- type User {
- _id: String
- createdAt: String
- login: String
- nick : String
- }
- `)
- app.use('/graphql', express_graphql(jwtGQL({anonSchema, anonResolvers, schema, createContext: getModels, graphiql: true, secret: jwtSecret})))
- app.listen(4000, () => console.log('Express GraphQL Server Now Running On localhost:4000/graphql'));
- })()
|