From 63873c2258bbf7a2f17bbbd51104653e3a92dc7f Mon Sep 17 00:00:00 2001 From: Cesar Date: Tue, 13 Dec 2016 15:42:43 -0800 Subject: [PATCH] correctly filter subscribed query fields (#52) * refactor: changed var to let changed parameter name * refactor: delete unecessary forEach in triggerType and code cleanup * refact: code cleanup * fixing conflicts * code clean up --- experimentation/jobqueueserver.js | 41 ++++++++++++++++++++++++++----- experimentation/sockets.js | 14 ++++++++++- src/subql.js | 7 ++++-- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/experimentation/jobqueueserver.js b/experimentation/jobqueueserver.js index ab6c8b2..6baa316 100644 --- a/experimentation/jobqueueserver.js +++ b/experimentation/jobqueueserver.js @@ -16,11 +16,18 @@ parseSchema(` id: ID! content: String author: String + date: Date + } + + type Date{ + month: Int + day: Int + year: Int } type Query { getMessage(id: ID!): Message - getMessages(id: ID!, test: String, another: String, something: String): [Message] + getMessages: [Message] } type Mutation { @@ -28,7 +35,7 @@ parseSchema(` updateMessage(id: ID!, input: MessageInput): Message } `); - +//(id: ID!, test: String, another: String, something: String) // Construct a schema, using GraphQL schema language var schema = buildSchema(` input MessageInput { @@ -40,11 +47,18 @@ var schema = buildSchema(` id: ID! content: String author: String + date: Date + } + + type Date{ + month: Int + day: Int + year: Int } type Query { getMessage(id: ID!): Message - getMessages(id: ID!): [Message] + getMessages: [Message] } type Mutation { @@ -52,22 +66,36 @@ var schema = buildSchema(` updateMessage(id: ID!, input: MessageInput): Message } `); - +//(id: ID!) // If Message had any complex fields, we'd put them on this object. class Message { constructor(id, {content, author}) { this.id = id; this.content = content; this.author = author; + this.date = new Date(Math.floor(Math.random() * 12), Math.floor(Math.random() * 30), Math.floor(Math.random() * 3000)); + } +} +class Date { + constructor(month, day, year) { + this.month = month; + this.day = day; + this.year = year; } } registerType(Message, 'id', 'author'); +registerType(Date, '') // Maps username to content var fakeDatabase = { 0 : { content: "cesar is cool", - author: "dean" + author: "dean", + date: { + month: 12, + day: 13, + year: 2016 + } } }; @@ -116,7 +144,8 @@ function updateMessage({id, input}) { return new Message(id, input); } //getMessages(id: ID!, test: String, another: String, something: String): [Message] -function getMessages({id, test, another, something}){ +function getMessages() { + // {id, test, another, something} // console.log(`Arguments to getMessages\nid: ${id}\ntest: ${test}\nanother: ${another}\nsomething: ${something}`); return Object.keys(fakeDatabase).reduce((acc, curr) =>{ acc.push(fakeDatabase[curr]); diff --git a/experimentation/sockets.js b/experimentation/sockets.js index 8b35b72..c3d7ffa 100644 --- a/experimentation/sockets.js +++ b/experimentation/sockets.js @@ -27,11 +27,23 @@ function unsubscribe() { socket.emit('unsubscribe', { socketid }); } + //subscribe(null, '{ getMessages(id: 0, test:"testarg", another:"anotherarg", something:"somethingarg"){content, author} }', null, function (data) { subscribe(null, ` { getMessage(id: 0){ - id, content, author + id + content + author + date{ + year + } + } + getMessages{ + content + date{ + day + } } } `, null, function (data) { diff --git a/src/subql.js b/src/subql.js index 8ffd616..975bafa 100644 --- a/src/subql.js +++ b/src/subql.js @@ -90,6 +90,7 @@ function handleSubscribe(query, socketid) { connected[socketid].query = query.query; connected[socketid].operationFields = findFields(parseQuery, {}); + queryOperations.forEach((resolverName) => { if(operations[resolverName].kind === 'ListType') { let queries = parseQuery.definitions.reduce((acc, curr) => { @@ -178,7 +179,7 @@ function triggerType(typename, resolverResult) { let uniqIdentifier = generateUniqueIdentifier(typename, resolverResult); if(db[uniqIdentifier] !== undefined) { db[uniqIdentifier].forEach((socket) => { - if(connected[socket] !== undefined) { + if (connected[socket] !== undefined) { connected[socket].socket.emit(socket, queryFilter(resolverResult, connected[socket])); } }); @@ -190,7 +191,9 @@ function queryFilter(resolverResult, clientObj) { let resolverNames = Object.keys(clientObj.operationFields); let matchedResolver; resolverNames.forEach((resolver) => { - if(operations[resolver].value === typeOfObj) matchedResolver = resolver; + if(operations[resolver].value === typeOfObj && operations[resolver].kind === "NamedType") { + matchedResolver = resolver; + } }); let retObjectTemplate = { data: {} }; retObjectTemplate.data[matchedResolver] = {};