{"action":"created","comment":{"url":"https://api.github.com/repos/andela/rivendell-ah/pulls/comments/208463616","pull_request_review_id":144276473,"id":208463616,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwODQ2MzYxNg==","diff_hunk":"@@ -0,0 +1,329 @@\n+import passport from 'passport';\n+import models from '../database/models';\n+import tokenService from '../utils/services/tokenService';\n+import verificationHelper from '../utils/helpers/verificationHelper';\n+import emailService from '../utils/services/emailService';\n+import hashPassowrd from '../utils/services/passwordHashService';\n+import emailTemplates from '../utils/services/emailTemplates';\n+\n+const { User } = models;\n+\n+/**\n+ *\n+ * The UserController contains static methods that are used as controllers to handle the\n+ * different user routes.\n+ *  @class UserController\n+ *  @returns {void} this is a class thus does not return anything\n+ */\n+class UserController {\n+  /**\n+   * Method adds a new user information to the database\n+   * with a json response of the user consisting of\n+   * properties email, username and token, if successful.\n+   * It handles the POST /api/users endpoint.\n+   * @param {Object} req the request body\n+   * @param {Object} res the response body\n+   * @param {function} next a call to the next function\n+   * @returns {undefined}\n+   */\n+  static signup(req, res, next) {\n+    const {\n+      username, email, password: hash,\n+    } = req.body.user;\n+    User.create({ username, email, hash })\n+      // return the user and a promise call to send the verification email\n+      .then(user => (\n+        { sendMail: verificationHelper.sendVerificationEmail(user), user }))\n+      .then(({ user }) => {\n+        const payload = {\n+          username: user.username,\n+          email: user.email,\n+        };\n+        const token = tokenService.generateToken(payload, '3d');\n+\n+        res.status(201).json({\n+          user: {\n+            email: user.email,\n+            username: user.username,\n+            token,\n+          },\n+          message: 'Sign up successful, visit your email'\n+          + 'to verify your account.',\n+        });\n+      })\n+      .catch(next);\n+  }\n+\n+  /**\n+   * Method login an existing user that provides email and password\n+   * with a json response of the user consisting of\n+   * properties email, username and token, if successful.\n+   * It handles the POST /api/users/login endpoint.\n+   * @param {Object} req the request body\n+   * @param {Object} res the response body\n+   * @param {function} next a call to the next function\n+   * @returns {undefined}\n+   */\n+  static login(req, res, next) {\n+    if (!req.body.user) {\n+      return res.status(422)\n+        .json({ errors: { user: 'must be an object' } });\n+    }\n+\n+    if (!req.body.user.email) {\n+      return res.status(422)\n+        .json({ errors: { email: 'can\\'t be blank' } });\n+    }\n+\n+    if (!req.body.user.password) {\n+      return res.status(422)\n+        .json({ errors: { password: 'can\\'t be blank' } });\n+    }\n+    return passport.authenticate(\n+      'local', { session: false },\n+      (err, user, info) => {\n+        if (err) {\n+          return next(err);\n+        }\n+\n+        if (user) {\n+          const payload = {\n+            username: user.username,\n+            email: user.email,\n+          };\n+\n+          const token = tokenService.generateToken(payload, '3d');\n+          return res.status(200).json({\n+            user: {\n+              email: user.email,\n+              username: user.username,\n+              token,\n+            },\n+          });\n+        }\n+        return res.status(422)\n+          .json(info);\n+      },\n+    )(req, res, next);\n+  }\n+\n+  /**\n+   * Method finds a single user by its id and\n+   * gives a json response of the user, if successful.\n+   * It handles the GET /api/user endpoint.\n+   * @param {Object} req the request body\n+   * @param {Object} res the response body\n+   * @param {function} next a call to the next function\n+   * @returns {undefined}\n+   */\n+  static get(req, res, next) {\n+    User.findById(req.payload.id)\n+      .then((user) => {\n+        if (!user) {\n+          return res.sendStatus(401);\n+        }\n+        return res.json({ user: user.toAuthJSON() });\n+      })\n+      .catch(next);\n+  }\n+\n+  /**\n+   * Method updates an existing user information in the database.\n+   * It handles the PUT /api/user endpoint.\n+   * @param {Object} req the request body\n+   * @param {Object} res the response body\n+   * @param {function} next a call to the next function\n+   * @returns {undefined}\n+   */\n+  static update(req, res, next) {\n+    User.findById(req.payload.id)\n+      .then((foundUser) => {\n+        if (!foundUser) {\n+          return res.sendStatus(401);\n+        }\n+        const user = foundUser;\n+        const {\n+          username, email, bio, image, password,\n+        } = req.body.user;\n+\n+        // only update fields that were actually passed..\n+        if (!username) {\n+          user.username = username;\n+        }\n+        if (!email) {\n+          user.email = email;\n+        }\n+        if (!bio) {\n+          user.bio = bio;\n+        }\n+        if (!image) {\n+          user.image = image;\n+        }\n+        if (!password) {\n+          user.setPassword(req.body.user.password);\n+        }\n+\n+        return user.save().then(() => res.json({ user: user.toAuthJSON() }));\n+      })\n+      .catch(next);\n+  }\n+\n+  /**\n+   * Method verifies a user with a token.\n+   * It handles the GET /api/users/verify/:token' endpoint.\n+   * @param {Object} req the request body\n+   * @param {Object} res the response body\n+   * @param {function} next a call to the next function\n+   * @returns {undefined}\n+   */\n+  static verify(req, res, next) {\n+    const { token } = req.params;\n+    const decoded = tokenService.verifyToken(token, process.env.AUTH_SECRET);\n+    if (!decoded) {\n+      return res.status(400)\n+        .json({ errors: { message: 'The link has expired' } });\n+    }\n+    User.findById(decoded.id)\n+      .then((user) => {\n+        const validateUser = verificationHelper.validateUser(user);\n+        if (!validateUser.status) {\n+          return res.status(validateUser.statusCode).json(validateUser.error);\n+        }\n+        const verifyUser = user;\n+        verifyUser.verified = true;\n+        verifyUser.save();\n+        return res.status(200)\n+          .json({\n+            status: 'success',\n+            message: 'Your account has been verified',\n+          });\n+      })\n+      .catch(next);\n+    return null;\n+  }\n+\n+  /**\n+   * Method resends an email to a user.\n+   * It handles the POST /api/users/verify/resend-email endpoint.\n+   * @param {Object} req the request body\n+   * @param {Object} res the response body\n+   * @param {function} next a call to the next function\n+   * @returns {null}\n+   */\n+  static resendEmail(req, res, next) {\n+    let { email } = req.body;\n+    email = email ? email.trim() : undefined;\n+    const validateEmail = verificationHelper.validateEmail(email);\n+    if (!validateEmail.status) {\n+      return res.status(validateEmail.statusCode).json(validateEmail.error);\n+    }\n+    User.findOne({ where: { email } })\n+      .then((user) => {\n+        const validateUser = verificationHelper.validateUser(user);\n+        if (validateUser.status) {\n+          // return a promise call to send verification\n+          // email if validation passes\n+          return verificationHelper.sendVerificationEmail(user);\n+        }\n+        // generate and throw an error if user validation fails\n+        const error = new Error(validateUser.error.errors.message);\n+        error.status = validateUser.statusCode;\n+        throw error;\n+      })\n+      .then(() => res.status(200)\n+        .json({ message: 'Your verification link has been resent' }))\n+      .catch(next);\n+    return null;\n+  }\n+\n+  /**\n+   * Method sends a reset password link to a user email.\n+   * It handles the POST /api/users/forgot-password endpoint.\n+   * @param {Object} req the request body\n+   * @param {Object} res the response body\n+   * @param {function} next a call to the next function\n+   * @returns {null}\n+   */\n+  static forgotPassword(req, res, next) {\n+    const { email } = req.body.user;\n+    User.findOne({\n+      where: { email },\n+    })\n+      .then((user) => {\n+        if (!user) {\n+          return res.status(404)\n+            .json({ errors: { message: 'User not found!' } });\n+        }\n+        const token = tokenService\n+          .generateToken({ id: user.id, username: user.username }, 60 * 30);\n+        let url = `${process.env.BASEURL}`;\n+        url += `/api/users/reset-password?token=${token}`;\n+        const mailOptions = emailService.mailOptions(\n+          user.email,\n+          \"Authors Heaven's account token\",\n+          emailTemplates.resetPasswordTemplate(url, user),\n+        );\n+        emailService.sendMail(mailOptions)\n+          .then(() => res.status(200).json({\n+            message: 'Check your email for password reset token',\n+          }))\n+          .catch(next);\n+        return null;\n+      })\n+      .catch(next);\n+    return null;\n+  }\n+\n+  /**\n+   * Method verifies a user with a token from reset password url.\n+   * It handles the GET /api/users/reset-password endpoint.\n+   * @param {Object} req the request body\n+   * @param {Object} res the response body\n+   * @returns {undefined}\n+   */\n+  static resetPassword(req, res) {\n+    const { token } = req.query;\n+    const decoded = tokenService.verifyToken(token);\n+\n+    if (!decoded) {\n+      return res.status(401)\n+        .json({ errors: { message: 'Invalid token' } });\n+    }\n+\n+    return res.status(200)\n+      .json({\n+        message: 'Verification Successful, You can now reset your password',\n+      });\n+  }\n+\n+  /**","path":"server/controllers/User.js","position":299,"original_position":299,"commit_id":"a0507f945b97234c6c5e417396ba9e3c9a7ded87","original_commit_id":"a0507f945b97234c6c5e417396ba9e3c9a7ded87","user":{"login":"houndci-bot","id":6697940,"node_id":"MDQ6VXNlcjY2OTc5NDA=","avatar_url":"https://avatars0.githubusercontent.com/u/6697940?v=4","gravatar_id":"","url":"https://api.github.com/users/houndci-bot","html_url":"https://github.com/houndci-bot","followers_url":"https://api.github.com/users/houndci-bot/followers","following_url":"https://api.github.com/users/houndci-bot/following{/other_user}","gists_url":"https://api.github.com/users/houndci-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/houndci-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/houndci-bot/subscriptions","organizations_url":"https://api.github.com/users/houndci-bot/orgs","repos_url":"https://api.github.com/users/houndci-bot/repos","events_url":"https://api.github.com/users/houndci-bot/events{/privacy}","received_events_url":"https://api.github.com/users/houndci-bot/received_events","type":"User","site_admin":false},"body":"Missing JSDoc return description               valid-jsdoc","created_at":"2018-08-08T05:59:36Z","updated_at":"2018-08-08T05:59:37Z","html_url":"https://github.com/andela/rivendell-ah/pull/25#discussion_r208463616","pull_request_url":"https://api.github.com/repos/andela/rivendell-ah/pulls/25","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/andela/rivendell-ah/pulls/comments/208463616"},"html":{"href":"https://github.com/andela/rivendell-ah/pull/25#discussion_r208463616"},"pull_request":{"href":"https://api.github.com/repos/andela/rivendell-ah/pulls/25"}}},"pull_request":{"url":"https://api.github.com/repos/andela/rivendell-ah/pulls/25","id":206400780,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA2NDAwNzgw","html_url":"https://github.com/andela/rivendell-ah/pull/25","diff_url":"https://github.com/andela/rivendell-ah/pull/25.diff","patch_url":"https://github.com/andela/rivendell-ah/pull/25.patch","issue_url":"https://api.github.com/repos/andela/rivendell-ah/issues/25","number":25,"state":"open","locked":false,"title":"#159316769 Setup the project folder structure","user":{"login":"mppdg","id":39072402,"node_id":"MDQ6VXNlcjM5MDcyNDAy","avatar_url":"https://avatars2.githubusercontent.com/u/39072402?v=4","gravatar_id":"","url":"https://api.github.com/users/mppdg","html_url":"https://github.com/mppdg","followers_url":"https://api.github.com/users/mppdg/followers","following_url":"https://api.github.com/users/mppdg/following{/other_user}","gists_url":"https://api.github.com/users/mppdg/gists{/gist_id}","starred_url":"https://api.github.com/users/mppdg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mppdg/subscriptions","organizations_url":"https://api.github.com/users/mppdg/orgs","repos_url":"https://api.github.com/users/mppdg/repos","events_url":"https://api.github.com/users/mppdg/events{/privacy}","received_events_url":"https://api.github.com/users/mppdg/received_events","type":"User","site_admin":false},"body":"#### What does this PR do?\r\n- This PR setup and refactor the project folder structure\r\n\r\n#### Description of Task to be completed?\r\n- Create a `server` folder for organizing server codebase\r\n- Add the relevant folders to `server` folder\r\n- Add the corresponding files and code\r\n- Update the import references\r\n\r\n#### How should this be manually tested?\r\n- Checkout to `chore/159316769/setup-folder-structure` branch\r\n- `npm test` to ensure the existing functionalities are working\r\n\r\n#### Any background context you want to provide?\r\n- This is the how the new folder structure looks like:\r\n```\r\n/server\r\n- /configs\r\n- /controllers\r\n- /database\r\n-- /migrations\r\n-- /models\r\n-- /seeders\r\n- /routes\r\n- /test\r\n-- /routes\r\n- /utils\r\n-- /helpers\r\n-- /middleware\r\n-- /services\r\n- index.js\r\npackage.json\r\n```\r\n\r\nTop level only:\r\n\r\n```\r\n/server\r\n- /configs\r\n- /controllers\r\n- /database\r\n- /routes\r\n- /test\r\n- /utils\r\n- index.js\r\npackage.json\r\n```\r\n#### What are the relevant pivotal tracker stories?\r\n#159316769","created_at":"2018-08-06T13:34:20Z","updated_at":"2018-08-08T05:59:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"aff67f528cda7ee610152b41ddc0862dcfa2c408","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/andela/rivendell-ah/pulls/25/commits","review_comments_url":"https://api.github.com/repos/andela/rivendell-ah/pulls/25/comments","review_comment_url":"https://api.github.com/repos/andela/rivendell-ah/pulls/comments{/number}","comments_url":"https://api.github.com/repos/andela/rivendell-ah/issues/25/comments","statuses_url":"https://api.github.com/repos/andela/rivendell-ah/statuses/a0507f945b97234c6c5e417396ba9e3c9a7ded87","head":{"label":"andela:chore/159316769/setup-folder-structure","ref":"chore/159316769/setup-folder-structure","sha":"a0507f945b97234c6c5e417396ba9e3c9a7ded87","user":{"login":"andela","id":4100206,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQxMDAyMDY=","avatar_url":"https://avatars2.githubusercontent.com/u/4100206?v=4","gravatar_id":"","url":"https://api.github.com/users/andela","html_url":"https://github.com/andela","followers_url":"https://api.github.com/users/andela/followers","following_url":"https://api.github.com/users/andela/following{/other_user}","gists_url":"https://api.github.com/users/andela/gists{/gist_id}","starred_url":"https://api.github.com/users/andela/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andela/subscriptions","organizations_url":"https://api.github.com/users/andela/orgs","repos_url":"https://api.github.com/users/andela/repos","events_url":"https://api.github.com/users/andela/events{/privacy}","received_events_url":"https://api.github.com/users/andela/received_events","type":"Organization","site_admin":false},"repo":{"id":141551362,"node_id":"MDEwOlJlcG9zaXRvcnkxNDE1NTEzNjI=","name":"rivendell-ah","full_name":"andela/rivendell-ah","owner":{"login":"andela","id":4100206,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQxMDAyMDY=","avatar_url":"https://avatars2.githubusercontent.com/u/4100206?v=4","gravatar_id":"","url":"https://api.github.com/users/andela","html_url":"https://github.com/andela","followers_url":"https://api.github.com/users/andela/followers","following_url":"https://api.github.com/users/andela/following{/other_user}","gists_url":"https://api.github.com/users/andela/gists{/gist_id}","starred_url":"https://api.github.com/users/andela/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andela/subscriptions","organizations_url":"https://api.github.com/users/andela/orgs","repos_url":"https://api.github.com/users/andela/repos","events_url":"https://api.github.com/users/andela/events{/privacy}","received_events_url":"https://api.github.com/users/andela/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/andela/rivendell-ah","description":null,"fork":false,"url":"https://api.github.com/repos/andela/rivendell-ah","forks_url":"https://api.github.com/repos/andela/rivendell-ah/forks","keys_url":"https://api.github.com/repos/andela/rivendell-ah/keys{/key_id}","collaborators_url":"https://api.github.com/repos/andela/rivendell-ah/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/andela/rivendell-ah/teams","hooks_url":"https://api.github.com/repos/andela/rivendell-ah/hooks","issue_events_url":"https://api.github.com/repos/andela/rivendell-ah/issues/events{/number}","events_url":"https://api.github.com/repos/andela/rivendell-ah/events","assignees_url":"https://api.github.com/repos/andela/rivendell-ah/assignees{/user}","branches_url":"https://api.github.com/repos/andela/rivendell-ah/branches{/branch}","tags_url":"https://api.github.com/repos/andela/rivendell-ah/tags","blobs_url":"https://api.github.com/repos/andela/rivendell-ah/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/andela/rivendell-ah/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/andela/rivendell-ah/git/refs{/sha}","trees_url":"https://api.github.com/repos/andela/rivendell-ah/git/trees{/sha}","statuses_url":"https://api.github.com/repos/andela/rivendell-ah/statuses/{sha}","languages_url":"https://api.github.com/repos/andela/rivendell-ah/languages","stargazers_url":"https://api.github.com/repos/andela/rivendell-ah/stargazers","contributors_url":"https://api.github.com/repos/andela/rivendell-ah/contributors","subscribers_url":"https://api.github.com/repos/andela/rivendell-ah/subscribers","subscription_url":"https://api.github.com/repos/andela/rivendell-ah/subscription","commits_url":"https://api.github.com/repos/andela/rivendell-ah/commits{/sha}","git_commits_url":"https://api.github.com/repos/andela/rivendell-ah/git/commits{/sha}","comments_url":"https://api.github.com/repos/andela/rivendell-ah/comments{/number}","issue_comment_url":"https://api.github.com/repos/andela/rivendell-ah/issues/comments{/number}","contents_url":"https://api.github.com/repos/andela/rivendell-ah/contents/{+path}","compare_url":"https://api.github.com/repos/andela/rivendell-ah/compare/{base}...{head}","merges_url":"https://api.github.com/repos/andela/rivendell-ah/merges","archive_url":"https://api.github.com/repos/andela/rivendell-ah/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/andela/rivendell-ah/downloads","issues_url":"https://api.github.com/repos/andela/rivendell-ah/issues{/number}","pulls_url":"https://api.github.com/repos/andela/rivendell-ah/pulls{/number}","milestones_url":"https://api.github.com/repos/andela/rivendell-ah/milestones{/number}","notifications_url":"https://api.github.com/repos/andela/rivendell-ah/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/andela/rivendell-ah/labels{/name}","releases_url":"https://api.github.com/repos/andela/rivendell-ah/releases{/id}","deployments_url":"https://api.github.com/repos/andela/rivendell-ah/deployments","created_at":"2018-07-19T08:51:46Z","updated_at":"2018-08-07T16:17:04Z","pushed_at":"2018-08-08T05:59:17Z","git_url":"git://github.com/andela/rivendell-ah.git","ssh_url":"git@github.com:andela/rivendell-ah.git","clone_url":"https://github.com/andela/rivendell-ah.git","svn_url":"https://github.com/andela/rivendell-ah","homepage":null,"size":388,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":3,"license":null,"forks":0,"open_issues":3,"watchers":0,"default_branch":"staging"}},"base":{"label":"andela:staging","ref":"staging","sha":"b0451f21cb0e3788f3741ea7f684a161220dba2c","user":{"login":"andela","id":4100206,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQxMDAyMDY=","avatar_url":"https://avatars2.githubusercontent.com/u/4100206?v=4","gravatar_id":"","url":"https://api.github.com/users/andela","html_url":"https://github.com/andela","followers_url":"https://api.github.com/users/andela/followers","following_url":"https://api.github.com/users/andela/following{/other_user}","gists_url":"https://api.github.com/users/andela/gists{/gist_id}","starred_url":"https://api.github.com/users/andela/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andela/subscriptions","organizations_url":"https://api.github.com/users/andela/orgs","repos_url":"https://api.github.com/users/andela/repos","events_url":"https://api.github.com/users/andela/events{/privacy}","received_events_url":"https://api.github.com/users/andela/received_events","type":"Organization","site_admin":false},"repo":{"id":141551362,"node_id":"MDEwOlJlcG9zaXRvcnkxNDE1NTEzNjI=","name":"rivendell-ah","full_name":"andela/rivendell-ah","owner":{"login":"andela","id":4100206,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQxMDAyMDY=","avatar_url":"https://avatars2.githubusercontent.com/u/4100206?v=4","gravatar_id":"","url":"https://api.github.com/users/andela","html_url":"https://github.com/andela","followers_url":"https://api.github.com/users/andela/followers","following_url":"https://api.github.com/users/andela/following{/other_user}","gists_url":"https://api.github.com/users/andela/gists{/gist_id}","starred_url":"https://api.github.com/users/andela/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andela/subscriptions","organizations_url":"https://api.github.com/users/andela/orgs","repos_url":"https://api.github.com/users/andela/repos","events_url":"https://api.github.com/users/andela/events{/privacy}","received_events_url":"https://api.github.com/users/andela/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/andela/rivendell-ah","description":null,"fork":false,"url":"https://api.github.com/repos/andela/rivendell-ah","forks_url":"https://api.github.com/repos/andela/rivendell-ah/forks","keys_url":"https://api.github.com/repos/andela/rivendell-ah/keys{/key_id}","collaborators_url":"https://api.github.com/repos/andela/rivendell-ah/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/andela/rivendell-ah/teams","hooks_url":"https://api.github.com/repos/andela/rivendell-ah/hooks","issue_events_url":"https://api.github.com/repos/andela/rivendell-ah/issues/events{/number}","events_url":"https://api.github.com/repos/andela/rivendell-ah/events","assignees_url":"https://api.github.com/repos/andela/rivendell-ah/assignees{/user}","branches_url":"https://api.github.com/repos/andela/rivendell-ah/branches{/branch}","tags_url":"https://api.github.com/repos/andela/rivendell-ah/tags","blobs_url":"https://api.github.com/repos/andela/rivendell-ah/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/andela/rivendell-ah/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/andela/rivendell-ah/git/refs{/sha}","trees_url":"https://api.github.com/repos/andela/rivendell-ah/git/trees{/sha}","statuses_url":"https://api.github.com/repos/andela/rivendell-ah/statuses/{sha}","languages_url":"https://api.github.com/repos/andela/rivendell-ah/languages","stargazers_url":"https://api.github.com/repos/andela/rivendell-ah/stargazers","contributors_url":"https://api.github.com/repos/andela/rivendell-ah/contributors","subscribers_url":"https://api.github.com/repos/andela/rivendell-ah/subscribers","subscription_url":"https://api.github.com/repos/andela/rivendell-ah/subscription","commits_url":"https://api.github.com/repos/andela/rivendell-ah/commits{/sha}","git_commits_url":"https://api.github.com/repos/andela/rivendell-ah/git/commits{/sha}","comments_url":"https://api.github.com/repos/andela/rivendell-ah/comments{/number}","issue_comment_url":"https://api.github.com/repos/andela/rivendell-ah/issues/comments{/number}","contents_url":"https://api.github.com/repos/andela/rivendell-ah/contents/{+path}","compare_url":"https://api.github.com/repos/andela/rivendell-ah/compare/{base}...{head}","merges_url":"https://api.github.com/repos/andela/rivendell-ah/merges","archive_url":"https://api.github.com/repos/andela/rivendell-ah/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/andela/rivendell-ah/downloads","issues_url":"https://api.github.com/repos/andela/rivendell-ah/issues{/number}","pulls_url":"https://api.github.com/repos/andela/rivendell-ah/pulls{/number}","milestones_url":"https://api.github.com/repos/andela/rivendell-ah/milestones{/number}","notifications_url":"https://api.github.com/repos/andela/rivendell-ah/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/andela/rivendell-ah/labels{/name}","releases_url":"https://api.github.com/repos/andela/rivendell-ah/releases{/id}","deployments_url":"https://api.github.com/repos/andela/rivendell-ah/deployments","created_at":"2018-07-19T08:51:46Z","updated_at":"2018-08-07T16:17:04Z","pushed_at":"2018-08-08T05:59:17Z","git_url":"git://github.com/andela/rivendell-ah.git","ssh_url":"git@github.com:andela/rivendell-ah.git","clone_url":"https://github.com/andela/rivendell-ah.git","svn_url":"https://github.com/andela/rivendell-ah","homepage":null,"size":388,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":3,"license":null,"forks":0,"open_issues":3,"watchers":0,"default_branch":"staging"}},"_links":{"self":{"href":"https://api.github.com/repos/andela/rivendell-ah/pulls/25"},"html":{"href":"https://github.com/andela/rivendell-ah/pull/25"},"issue":{"href":"https://api.github.com/repos/andela/rivendell-ah/issues/25"},"comments":{"href":"https://api.github.com/repos/andela/rivendell-ah/issues/25/comments"},"review_comments":{"href":"https://api.github.com/repos/andela/rivendell-ah/pulls/25/comments"},"review_comment":{"href":"https://api.github.com/repos/andela/rivendell-ah/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/andela/rivendell-ah/pulls/25/commits"},"statuses":{"href":"https://api.github.com/repos/andela/rivendell-ah/statuses/a0507f945b97234c6c5e417396ba9e3c9a7ded87"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"houndci-bot"}}