Browse Source

some updates: +socket about new chat, not message, lastmodified and group permissions

asmer@controller 3 years ago
parent
commit
03285c1711
3 changed files with 41 additions and 10 deletions
  1. 22 3
      index.js
  2. 18 7
      models.js
  3. 1 0
      public/index.html

+ 22 - 3
index.js

@@ -67,6 +67,7 @@ const upload  = require('multer')({ dest: uploadPath })
         type Chat {
             _id: ID
             createdAt: String
+            lastModified: String
             owner: User
 
             title: String
@@ -96,7 +97,7 @@ const upload  = require('multer')({ dest: uploadPath })
 
 
             userAvatar: User
-            chatAvatar: [Chat]
+            chatAvatars: [Chat]
             messages: [Message]
         }
 
@@ -104,7 +105,7 @@ const upload  = require('multer')({ dest: uploadPath })
             _id: ID,
             text: String,
             userAvatar: UserInput,
-            chatAvatar: [ChatInput]
+            chatAvatars: [ChatInput]
             messages: [MessageInput]
         }
     `);
@@ -136,7 +137,7 @@ const upload  = require('multer')({ dest: uploadPath })
 
     app.use(require('cors')())
     app.use(express.static('public'));
-    app.use('/graphql', express_graphql(jwtGQLAnon({schema, createContext: decoded => getModels(decoded, messageWatcher), graphiql: true, secret: jwtSecret})))
+    app.use('/graphql', express_graphql(jwtGQLAnon({schema, createContext: decoded => getModels(decoded, messageWatcher, chatWatcher), graphiql: true, secret: jwtSecret})))
 
 
     app.post('/upload', upload.single('media'), async (req, res, next) => {
@@ -176,6 +177,24 @@ const upload  = require('multer')({ dest: uploadPath })
         }
     }
 
+    async function chatWatcher({members, _id, createdAt, title, messages, avatar, lastModified}){
+
+        console.log('CHAT SAVE', _id, title)
+        for (let [id,{user, socket}] of Object.entries(sockets)){
+            if (members.some(member => member._id.toString() === user._id.toString())){
+                //await chat;
+                //await media;
+                //await replyTo;
+                //await forwarded;
+                await avatar;
+                await Promise.all(members)
+                //owner = await owner;
+                console.log('EMIT', _id, createdAt, title)
+                socket.emit('chat', {_id, createdAt, title, avatar: avatar && {_id: avatar._id, url: avatar.url}, members: members.map(({_id, login, nick}) => ({_id, login, nick})), lastModified})
+            }
+        }
+    }
+
     io.on('connection', socket => {
         console.log('connect', socket.id)
         socket.on('disconnect', () => {

+ 18 - 7
models.js

@@ -4,8 +4,11 @@ const {connect}   = require('mm')
 module.exports = async (dbName='graphql-chat') => {
     const {Savable, slice} = await connect(dbName)
 
-    async function getModels({id, acl}, onMsgSave){
-        const SlicedSavable = slice(id === 'anon' ? [id] : [...acl])
+    async function getModels({id, acl}, onMsgSave, onChatSave){
+        const thisUser = id !== 'anon' && await Savable.m.User.findOne({_id: ObjectID(id)})
+        const chatACL  = thisUser && thisUser.chats.map(c => c._id.toString())
+
+        const SlicedSavable = slice(id === 'anon' ? [id] : [...acl, ...chatACL])
 
         class User extends SlicedSavable {
             constructor(...params){
@@ -124,7 +127,14 @@ module.exports = async (dbName='graphql-chat') => {
                 this.___permissions.read.push(chatId)
                 this.___permissions.read = [...new Set(this.___permissions.read)]
 
+
                 let result =  await super.save(...params)
+
+                await this.chat
+                this.chat.lastModified = this.createdAt
+                await this.chat.save()
+
+
                 onMsgSave(this)
                 return result
             }
@@ -143,15 +153,14 @@ module.exports = async (dbName='graphql-chat') => {
             static get defaultPermissions(){
                 return {
                     create: ['user', 'admin'],
-                    read: ['user', 'owner',  'admin'],
+                    read: ['owner',  'admin'],
                     write: ['owner','admin'],
                     delete: ['admin']
                 }
             }
 
             static get guestRelations(){
-                return ['replies']
-                return ['forwardWith']
+                return ['replies', 'forwardWith']
             }
         }
         SlicedSavable.addClass(Message)
@@ -164,9 +173,12 @@ module.exports = async (dbName='graphql-chat') => {
 
             async save(...params){
                 if (!this._id){
+                    this.members.push(thisUser)
                     await super.save(...params)
-                    this.___permissions.read.push(this._id)
+                    this.lastModified = this.createdAt.toISOString()
+                    this.___permissions.read.push(this._id.toString())
                 }
+                onChatSave(this)
                 return await super.save(...params)
             }
 
@@ -193,7 +205,6 @@ module.exports = async (dbName='graphql-chat') => {
         }
         SlicedSavable.addClass(Chat)
 
-        const thisUser = id !== 'anon' && await Savable.m.User.findOne({_id: ObjectID(id)})
 
 
 

+ 1 - 0
public/index.html

@@ -19,4 +19,5 @@
     socket.on('jwt_ok',   data => console.log(data))
     socket.on('jwt_fail', error => console.log(error))
     socket.on('msg', msg => console.log(msg))
+    socket.on('chat', chat => console.log(chat))
 </script>