diff --git a/api/authentication.js b/api/authentication.js index 5e725ba52e..ab4c71c72b 100644 --- a/api/authentication.js +++ b/api/authentication.js @@ -274,6 +274,12 @@ const init = () => { async (req, token, tokenSecret, profile, done) => { const name = profile.displayName || profile.username || profile._json.name || ''; + + const splitProfileUrl = profile.profileUrl.split('/'); + const fallbackUsername = splitProfileUrl[splitProfileUrl.length - 1]; + const githubUsername = + profile.username || profile._json.login || fallbackUsername; + if (req.user) { // if a user exists in the request body, it means the user is already // authed and is trying to connect a github account. Before we do so @@ -284,6 +290,23 @@ const init = () => { // 1 // if the user already has a githubProviderId, don't override it if (req.user.githubProviderId) { + if (!req.user.githubUsername) { + return saveUserProvider( + req.user.id, + 'githubProviderId', + profile.id, + { githubUsername: githubUsername } + ) + .then(user => { + done(null, user); + return user; + }) + .catch(err => { + done(err); + return null; + }); + } + return done(null, req.user); } @@ -299,7 +322,7 @@ const init = () => { req.user.id, 'githubProviderId', profile.id, - { githubUsername: profile.username } + { githubUsername: githubUsername } ) .then(user => { done(null, user); @@ -322,7 +345,7 @@ const init = () => { fbProviderId: null, googleProviderId: null, githubProviderId: profile.id, - githubUsername: profile.username, + githubUsername: githubUsername, username: null, name: name, description: profile._json.bio, diff --git a/api/mutations/message/addMessage.js b/api/mutations/message/addMessage.js index 2e4fca8301..6942348e0b 100644 --- a/api/mutations/message/addMessage.js +++ b/api/mutations/message/addMessage.js @@ -11,6 +11,7 @@ import { createParticipantWithoutNotificationsInThread, } from '../../models/usersThreads'; import addCommunityMember from '../communityMember/addCommunityMember'; +import { trackUserThreadLastSeenQueue } from 'shared/bull/queues'; import type { FileUpload } from 'shared/types'; type AddMessageInput = { @@ -189,6 +190,12 @@ export default async ( isOwner: communityPermissions ? communityPermissions.isOwner : false, }; + trackUserThreadLastSeenQueue.add({ + userId: currentUser.id, + threadId: message.threadId, + timestamp: Date.now(), + }); + return { ...dbMessage, contextPermissions, diff --git a/api/subscriptions/message.js b/api/subscriptions/message.js index 6f2d4b8c38..19343550de 100644 --- a/api/subscriptions/message.js +++ b/api/subscriptions/message.js @@ -57,7 +57,18 @@ module.exports = { debug(`${moniker} listening to new messages in ${thread}`); try { return addMessageListener({ - filter: message => message.threadId === thread, + filter: message => { + if (message.threadId === thread) { + trackUserThreadLastSeenQueue.add({ + userId: user.id, + threadId: message.threadId, + timestamp: new Date(message.timestamp).getTime() + 100, + }); + return true; + } + + return false; + }, onError: err => { // Don't crash the whole API server on error in the listener console.error(err); diff --git a/package.json b/package.json index e8b77cb0b0..bbb078dd8a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Spectrum", - "version": "2.2.2", + "version": "2.2.3", "private": true, "devDependencies": { "babel-cli": "^6.24.1",