From 456d2332f3f3b42130fd77ff23ae70aeca4f3ec0 Mon Sep 17 00:00:00 2001
From: Dhruvit Raithatha <dhruvit.raithatha@gmail.com>
Date: Fri, 8 Sep 2023 10:08:51 +0530
Subject: [PATCH] fix: handle case of missing member in "Add User to
 Repository" flow

---
 services/GitlabService.js | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/services/GitlabService.js b/services/GitlabService.js
index 6d24fd4..c58449f 100644
--- a/services/GitlabService.js
+++ b/services/GitlabService.js
@@ -345,7 +345,17 @@ async function getRepository(user, repoURL) {
 async function addUserToRepository(copilot, repository, user, accessLevel) {
   const refreshedCopilot = await _refreshGitlabUserAccessToken(copilot);
   const gitlab = await _authenticate(refreshedCopilot.accessToken);
-  const member = await gitlab.ProjectMembers.show(repository.id, user.userProviderId);
+  const member = await new Promise((resolve, reject) => {
+    gitlab.ProjectMembers.show(repository.id, user.userProviderId)
+      .then((result) => resolve(result))
+      .catch((err) => {
+        // eslint-disable-next-line no-magic-numbers
+        if (_.get(err, 'cause.response.status') === 404) {
+          return resolve(null);
+        }
+        return reject(err);
+      });
+  });
   if (!member) {
     await gitlab.ProjectMembers.add(repository.id, user.userProviderId, accessLevel);
     return;
@@ -386,16 +396,17 @@ async function _refreshGitlabUserAccessToken(copilot) {
       .end();
       // save user token data
     const expiresIn = refreshTokenResult.body.expires_in || config.GITLAB_ACCESS_TOKEN_DEFAULT_EXPIRATION;
-    return await dbHelper.update(models.User, copilot.id, {
+    const updates = {
       accessToken: refreshTokenResult.body.access_token,
       accessTokenExpiration: new Date(new Date().getTime() + expiresIn * MS_PER_SECOND),
       refreshToken: refreshTokenResult.body.refresh_token
-    });
+    };
+    copilot = _.assign(copilot, updates);
+    return await dbHelper.update(models.User, copilot.id, updates);
   }
   return copilot;
 }
 
-
 module.exports = {
   createComment,
   updateIssue,