Ivan Asmer 5 years ago
parent
commit
65c06d82e9
1 changed files with 59 additions and 0 deletions
  1. 59 0
      anon.js

+ 59 - 0
anon.js

@@ -0,0 +1,59 @@
+const { buildSchema } = require('graphql');
+const jwt         = require('jsonwebtoken')
+
+module.exports = ({Savable, secret}) => {
+    class User extends Savable {
+        async getACL(){
+            return [this._id.toString(), "user"]
+        }
+    }
+    Savable.addClass(User)
+
+    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()
+        },
+
+        async login({login, password}){
+            const user =  await Savable.m.User.findOne({login, password})
+            if (!user)
+                return null;
+
+            const token = jwt.sign({ sub: {id: user._id, login, acl: await user.getACL()}}, secret); //подписывам токен нашим ключем
+            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
+             login: String
+        }
+    `)
+    return {anonResolvers, anonSchema}
+}