export const mockService = {
  '/webapi/projects/Gitlink/forgeplus/': {
    encoding: 'UTF-8',
    id: 42422,
    import_status: 'none',
    namespace: {
      avatar: { url: null },
      created_at: '2020-07-02T10:34:49+0800',
      description: '',
      id: 23159,
      name: 'ide-s',
      owner: null,
      owner_id: null,
      path: 'ide-s',
      permission: null,
      public: false,
      state: null,
      tenant: {
        created_at: null,
        id: 0,
        name: 'git',
        path: 'git',
        updated_at: null,
        while_list_ip: null,
      },
      type: 'Group',
      updated_at: '2020-07-02T10:34:49+0800',
      web_url: 'http://gitlab-test.alipay.net/groups/ide-s',
    },
    path: 'TypeScript-Node-Starter',
    path_with_namespace: 'ide-s/TypeScript-Node-Starter',
  },
  '/api/v3/user': {
    // 头像地址
    avatar_url:
      'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
    email: 'guqiankun.gqk@test.com',
    extern_uid: '354626',
    name: 'testName',
    role: 0,
    state: 'active',
    theme_id: 2,
    username: 'guqiankun.gqk',
    web_url: '/u/guqiankun.gqk/',
    website_url: '',
  },
  '/webapi/projects/42422/get_pull_request_by_iid': {
    check_suites: [],
    created_at: '2020-08-06T11:35:38+0800',
    description: '* 123\n* 456',
    diff: {
      add_line_num: 753,
      base_commit_sha: 'df72e4d1c394af6d1c21cd042116f83a792fa8c6',
      commits_count: 16,
      created_at: '2021-05-20T14:27:46+0800',
      del_line_num: 379,
      files_count: 22,
      head_commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
      id: 31918,
      overflow: false,
      start_commit_sha: '2566c6dec7756e51f7f16267d9a2a63116ac015b',
      updated_at: '2021-05-20T14:27:46+0800',
    },
    id: 13055,
    iid: 2,
    source_branch: 'feat/123123',
    source_project_id: 42422,
    state: 'opened',
    target_branch: 'master',
    target_project_id: 42422,
  },
  '/api/v3/projects/42422/pull_requests/13055/diffs': [
    {
      add_line_num: 753,
      base_commit_sha: 'df72e4d1c394af6d1c21cd042116f83a792fa8c6',
      commits_count: 16,
      created_at: '2021-05-20T14:27:46+0800',
      del_line_num: 379,
      files_count: 22,
      head_commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
      id: 31918,
      overflow: false,
      start_commit_sha: '2566c6dec7756e51f7f16267d9a2a63116ac015b',
      updated_at: '2021-05-20T14:27:46+0800',
    },
    {
      add_line_num: 741,
      base_commit_sha: 'df72e4d1c394af6d1c21cd042116f83a792fa8c6',
      commits_count: 15,
      created_at: '2020-10-27T14:22:15+0800',
      del_line_num: 379,
      files_count: 21,
      head_commit_sha: 'ac55c77aa72d49280058ed6054610f454ee694b1',
      id: 20699,
      overflow: false,
      start_commit_sha: '2566c6dec7756e51f7f16267d9a2a63116ac015b',
      updated_at: '2020-12-10T20:05:04+0800',
    },
  ],
  '/webapi/projects/42422/pull_requests/13055/comments': {
    committed_reviews: [
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'maoqiang@test.com',
          extern_uid: '30041',
          id: 13616,
          name: '毛嫱',
          state: 'active',
          username: 'maoqiang',
          web_url: 'https://test.com.com/nwpipe/u/30041',
        },
        body: null,
        created_at: '2020-09-10T10:39:41+08:00',
        id: 1650,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'maoqiang@test.com',
              extern_uid: '30041',
              id: 13616,
              name: '毛嫱',
              state: 'active',
              username: 'maoqiang',
              web_url: 'https://test.com.com/nwpipe/u/30041',
            },
            commit_id: null,
            created_at: '2020-09-14T12:09:16+0800',
            discussion_id: 69,
            id: 74,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: '试试回复哈',
            noteable_id: 1650,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-09-14T12:09:16+0800',
          },
        ],
        updated_at: '2020-09-14T12:09:20+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'liuya.zmn@test.com',
          extern_uid: '208698',
          id: 14920,
          name: '六牙',
          state: 'active',
          username: 'liuya.zmn',
          web_url: 'https://test.com.com/nwpipe/u/208698',
        },
        body: null,
        created_at: '2020-09-09T14:21:01+08:00',
        id: 1644,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'liuya.zmn@test.com',
              extern_uid: '208698',
              id: 14920,
              name: '六牙',
              state: 'active',
              username: 'liuya.zmn',
              web_url: 'https://test.com.com/nwpipe/u/208698',
            },
            commit_id: null,
            created_at: '2020-09-09T14:21:01+0800',
            discussion_id: null,
            id: 63,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -80,40 +80,40 @@ export const getSignup = (req: Request, res: Response) => {\n  * Create a new local account.\n  */\n export const postSignup = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password must be at least 4 characters long").isLength({ min: 4 }).run(req);\n-    await check("confirmPassword", "Passwords do not match").equals(req.body.password).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/signup");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password must be at least 4 characters long").isLength({ min: 4 }).run(req);\n+  await check("confirmPassword", "Passwords do not match").equals(req.body.password).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/signup");\n+  }\n+\n+  const user = new User({\n+    email: req.body.email,\n+    password: req.body.password\n+  });\n+\n+  User.findOne({ email: req.body.email }, (err, existingUser) => {\n+    if (err) { return next(err); }\n+    if (existingUser) {\n+      req.flash("errors", { msg: "Account with that email address already exists." });\n+      return res.redirect("/signup");\n     }\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_94_101',
            line_type: 'old',
            note: '111',
            noteable_id: 1644,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17641,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -80,40 +80,40 @@ export const getSignup = (req: Request, res: Response) => {\n  * Create a new local account.\n  */\n export const postSignup = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password must be at least 4 characters long").isLength({ min: 4 }).run(req);\n-    await check("confirmPassword", "Passwords do not match").equals(req.body.password).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/signup");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password must be at least 4 characters long").isLength({ min: 4 }).run(req);\n+  await check("confirmPassword", "Passwords do not match").equals(req.body.password).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/signup");\n+  }\n+\n+  const user = new User({\n+    email: req.body.email,\n+    password: req.body.password\n+  });\n+\n+  User.findOne({ email: req.body.email }, (err, existingUser) => {\n+    if (err) { return next(err); }\n+    if (existingUser) {\n+      req.flash("errors", { msg: "Account with that email address already exists." });\n+      return res.redirect("/signup");\n     }\n',
              id: 47,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-09-09T14:21:12+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'liuya.zmn@test.com',
          extern_uid: '208698',
          id: 14920,
          name: '六牙',
          state: 'active',
          username: 'liuya.zmn',
          web_url: 'https://test.com.com/nwpipe/u/208698',
        },
        body: null,
        created_at: '2020-09-09T14:21:25+08:00',
        id: 1645,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'liuya.zmn@test.com',
              extern_uid: '208698',
              id: 14920,
              name: '六牙',
              state: 'active',
              username: 'liuya.zmn',
              web_url: 'https://test.com.com/nwpipe/u/208698',
            },
            commit_id: null,
            created_at: '2020-09-09T14:21:26+0800',
            discussion_id: null,
            id: 64,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -80,40 +80,40 @@ export const getSignup = (req: Request, res: Response) => {\n  * Create a new local account.\n  */\n export const postSignup = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password must be at least 4 characters long").isLength({ min: 4 }).run(req);\n-    await check("confirmPassword", "Passwords do not match").equals(req.body.password).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/signup");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password must be at least 4 characters long").isLength({ min: 4 }).run(req);\n+  await check("confirmPassword", "Passwords do not match").equals(req.body.password).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/signup");\n+  }\n+\n+  const user = new User({\n+    email: req.body.email,\n+    password: req.body.password\n+  });\n+\n+  User.findOne({ email: req.body.email }, (err, existingUser) => {\n+    if (err) { return next(err); }\n+    if (existingUser) {\n+      req.flash("errors", { msg: "Account with that email address already exists." });\n+      return res.redirect("/signup");\n     }\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_94_92',
            line_type: 'old',
            note: '222',
            noteable_id: 1645,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17641,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -80,40 +80,40 @@ export const getSignup = (req: Request, res: Response) => {\n  * Create a new local account.\n  */\n export const postSignup = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password must be at least 4 characters long").isLength({ min: 4 }).run(req);\n-    await check("confirmPassword", "Passwords do not match").equals(req.body.password).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/signup");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password must be at least 4 characters long").isLength({ min: 4 }).run(req);\n+  await check("confirmPassword", "Passwords do not match").equals(req.body.password).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/signup");\n+  }\n+\n+  const user = new User({\n+    email: req.body.email,\n+    password: req.body.password\n+  });\n+\n+  User.findOne({ email: req.body.email }, (err, existingUser) => {\n+    if (err) { return next(err); }\n+    if (existingUser) {\n+      req.flash("errors", { msg: "Account with that email address already exists." });\n+      return res.redirect("/signup");\n     }\n',
              id: 47,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-09-09T14:21:41+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'taian.lta@test.com',
          extern_uid: '146194',
          id: 15165,
          name: '伊北',
          state: 'active',
          username: 'taian.lta',
          web_url: 'https://test.com.com/nwpipe/u/146194',
        },
        body: null,
        created_at: '2020-08-06T11:35:40+08:00',
        id: 1483,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-08-11T16:36:49+0800',
            discussion_id: null,
            id: 8,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '0',
              add_line_num: 228,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,228 @@\n+import { PullRequestChange } from \'../../../submodules/api-server/app/web/module/common/model/antcode\';\n+\n+export const mockChanges: PullRequestChange[] = [\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 3,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n+    "deleted_file": false,\n+    "id": 139517,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/locales/en-us/codeReview.ts",\n+    "old_path": "app/web/locales/en-us/codeReview.ts",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 3,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n+    "deleted_file": false,\n+    "id": 139518,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/locales/zh-cn/codeReview.ts",\n+    "old_path": "app/web/locales/zh-cn/codeReview.ts",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 2,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 6,\n+    "deleted_file": false,\n+    "id": 139519,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/module/browser/index.ts",\n+    "old_path": "app/web/module/browser/index.ts",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "0",\n+    "add_line_num": 298,\n+    "b_mode": "100644",\n+    "binary_file": false,\n',
              id: 1077,
              new_file: true,
              new_path: 'a.ts',
              old_path: 'a.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: '02699cd6ca65aa6819d7e387678d8ea5359b5e59_0_56',
            line_type: 'new',
            note: '123123123',
            noteable_id: 1483,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'a.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '0',
              add_line_num: 228,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 15929,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,228 @@\n+import { PullRequestChange } from \'../../../submodules/api-server/app/web/module/common/model/antcode\';\n+\n+export const mockChanges: PullRequestChange[] = [\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 3,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n+    "deleted_file": false,\n+    "id": 139517,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/locales/en-us/codeReview.ts",\n+    "old_path": "app/web/locales/en-us/codeReview.ts",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 3,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n+    "deleted_file": false,\n+    "id": 139518,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/locales/zh-cn/codeReview.ts",\n+    "old_path": "app/web/locales/zh-cn/codeReview.ts",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 2,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 6,\n+    "deleted_file": false,\n+    "id": 139519,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/module/browser/index.ts",\n+    "old_path": "app/web/module/browser/index.ts",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "0",\n+    "add_line_num": 298,\n+    "b_mode": "100644",\n+    "binary_file": false,\n',
              id: 43,
              new_file: true,
              new_path: 'a.ts',
              old_path: 'a.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-08-11T16:36:53+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'taian.lta@test.com',
          extern_uid: '146194',
          id: 15165,
          name: '伊北',
          state: 'active',
          username: 'taian.lta',
          web_url: 'https://test.com.com/nwpipe/u/146194',
        },
        body: null,
        created_at: '2020-08-11T16:36:54+08:00',
        id: 1530,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-08-11T20:56:08+0800',
            discussion_id: null,
            id: 9,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password cannot be blank").isLength({ min: 1 }).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/login");\n+  }\n+\n+  passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n+    if (err) { return next(err); }\n+    if (!user) {\n+      req.flash("errors", { msg: info.message });\n+      return res.redirect("/login");\n     }\n-\n-    passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n-        if (err) { return next(err); }\n-        if (!user) {\n-            req.flash("errors", {msg: info.message});\n-            return res.redirect("/login");\n-        }\n-        req.logIn(user, (err) => {\n-            if (err) { return next(err); }\n-            req.flash("success", { msg: "Success! You are logged in." });\n-            res.redirect(req.session.returnTo || "/");\n-        });\n-    })(req, res, next);\n+    req.logIn(user, (err) => {\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_49_48',
            line_type: 'old',
            note: '@taian.lta(伊北) 测试一下咔咔咔咔咔咔',
            noteable_id: 1530,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 15929,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password cannot be blank").isLength({ min: 1 }).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/login");\n+  }\n+\n+  passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n+    if (err) { return next(err); }\n+    if (!user) {\n+      req.flash("errors", { msg: info.message });\n+      return res.redirect("/login");\n     }\n-\n-    passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n-        if (err) { return next(err); }\n-        if (!user) {\n-            req.flash("errors", {msg: info.message});\n-            return res.redirect("/login");\n-        }\n-        req.logIn(user, (err) => {\n-            if (err) { return next(err); }\n-            req.flash("success", { msg: "Success! You are logged in." });\n-            res.redirect(req.session.returnTo || "/");\n-        });\n-    })(req, res, next);\n+    req.logIn(user, (err) => {\n',
              id: 45,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-08-11T20:56:31+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'taian.lta@test.com',
          extern_uid: '146194',
          id: 15165,
          name: '伊北',
          state: 'active',
          username: 'taian.lta',
          web_url: 'https://test.com.com/nwpipe/u/146194',
        },
        body: null,
        created_at: '2020-08-11T20:56:32+08:00',
        id: 1537,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-08-13T15:13:13+0800',
            discussion_id: null,
            id: 12,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '0',
              add_line_num: 228,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,228 @@\n+import { PullRequestChange } from \'../../../submodules/api-server/app/web/module/common/model/antcode\';\n+\n+export const mockChanges: PullRequestChange[] = [\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 3,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n+    "deleted_file": false,\n+    "id": 139517,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/locales/en-us/codeReview.ts",\n+    "old_path": "app/web/locales/en-us/codeReview.ts",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 3,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n+    "deleted_file": false,\n+    "id": 139518,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/locales/zh-cn/codeReview.ts",\n+    "old_path": "app/web/locales/zh-cn/codeReview.ts",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 2,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 6,\n+    "deleted_file": false,\n+    "id": 139519,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/module/browser/index.ts",\n+    "old_path": "app/web/module/browser/index.ts",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "0",\n+    "add_line_num": 298,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n+    "deleted_file": false,\n+    "id": 139520,\n+    "mark_as_read": false,\n+    "new_file": true,\n+    "new_path": "app/web/module/code-review/browser/code-fold.contribution.tsx",\n+    "old_path": "app/web/module/code-review/browser/code-fold.contribution.tsx",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 47,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n+    "deleted_file": false,\n+    "id": 139521,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/module/code-review/browser/comment-common.service.ts",\n+    "old_path": "app/web/module/code-review/browser/comment-common.service.ts",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 15,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 16,\n+    "deleted_file": false,\n+    "id": 139522,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/module/code-review/browser/comment-write.contribution.ts",\n+    "old_path": "app/web/module/code-review/browser/comment-write.contribution.ts",\n',
              id: 1077,
              new_file: true,
              new_path: 'a.ts',
              old_path: 'a.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: '02699cd6ca65aa6819d7e387678d8ea5359b5e59_0_95',
            line_type: 'new',
            note: '123',
            noteable_id: 1537,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'a.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '0',
              add_line_num: 228,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 15929,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,228 @@\n+import { PullRequestChange } from \'../../../submodules/api-server/app/web/module/common/model/antcode\';\n+\n+export const mockChanges: PullRequestChange[] = [\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 3,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n+    "deleted_file": false,\n+    "id": 139517,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/locales/en-us/codeReview.ts",\n+    "old_path": "app/web/locales/en-us/codeReview.ts",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 3,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n+    "deleted_file": false,\n+    "id": 139518,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/locales/zh-cn/codeReview.ts",\n+    "old_path": "app/web/locales/zh-cn/codeReview.ts",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 2,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 6,\n+    "deleted_file": false,\n+    "id": 139519,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/module/browser/index.ts",\n+    "old_path": "app/web/module/browser/index.ts",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "0",\n+    "add_line_num": 298,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n+    "deleted_file": false,\n+    "id": 139520,\n+    "mark_as_read": false,\n+    "new_file": true,\n+    "new_path": "app/web/module/code-review/browser/code-fold.contribution.tsx",\n+    "old_path": "app/web/module/code-review/browser/code-fold.contribution.tsx",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 47,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n+    "deleted_file": false,\n+    "id": 139521,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/module/code-review/browser/comment-common.service.ts",\n+    "old_path": "app/web/module/code-review/browser/comment-common.service.ts",\n+    "renamed_file": false,\n+    "too_large": false,\n+    "updated_after_read": false\n+  },\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 15,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 16,\n+    "deleted_file": false,\n+    "id": 139522,\n+    "mark_as_read": false,\n+    "new_file": false,\n+    "new_path": "app/web/module/code-review/browser/comment-write.contribution.ts",\n+    "old_path": "app/web/module/code-review/browser/comment-write.contribution.ts",\n',
              id: 43,
              new_file: true,
              new_path: 'a.ts',
              old_path: 'a.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-08-13T15:11:06+0800',
            discussion_id: null,
            id: 11,
            is_award: false,
            labels: ['中间件规约'],
            latest_st_diff: {
              a_mode: '0',
              add_line_num: 228,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,228 @@\n+import { PullRequestChange } from \'../../../submodules/api-server/app/web/module/common/model/antcode\';\n+\n+export const mockChanges: PullRequestChange[] = [\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 3,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n',
              id: 1077,
              new_file: true,
              new_path: 'a.ts',
              old_path: 'a.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: '02699cd6ca65aa6819d7e387678d8ea5359b5e59_0_9',
            line_type: 'new',
            note: '123123',
            noteable_id: 1537,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'a.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '0',
              add_line_num: 228,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 15929,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,228 @@\n+import { PullRequestChange } from \'../../../submodules/api-server/app/web/module/common/model/antcode\';\n+\n+export const mockChanges: PullRequestChange[] = [\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 3,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n',
              id: 43,
              new_file: true,
              new_path: 'a.ts',
              old_path: 'a.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-08-18T10:24:50+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'taian.lta@test.com',
          extern_uid: '146194',
          id: 15165,
          name: '伊北',
          state: 'active',
          username: 'taian.lta',
          web_url: 'https://test.com.com/nwpipe/u/146194',
        },
        body: null,
        created_at: '2020-09-03T22:18:43+08:00',
        id: 1629,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-09-03T22:18:43+0800',
            discussion_id: 13,
            id: 36,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: '测试一条评论看看能不能生效呢',
            noteable_id: 1629,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-09-03T22:18:43+0800',
          },
        ],
        updated_at: '2020-09-03T22:18:48+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'taian.lta@test.com',
          extern_uid: '146194',
          id: 15165,
          name: '伊北',
          state: 'active',
          username: 'taian.lta',
          web_url: 'https://test.com.com/nwpipe/u/146194',
        },
        body: null,
        created_at: '2020-09-04T10:52:12+08:00',
        id: 1630,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-09-04T16:20:22+0800',
            discussion_id: null,
            id: 38,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password cannot be blank").isLength({ min: 1 }).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/login");\n+  }\n+\n+  passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n+    if (err) { return next(err); }\n+    if (!user) {\n+      req.flash("errors", { msg: info.message });\n+      return res.redirect("/login");\n     }\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_40_37',
            line_type: 'old',
            note: '测试',
            noteable_id: 1630,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17174,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password cannot be blank").isLength({ min: 1 }).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/login");\n+  }\n+\n+  passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n+    if (err) { return next(err); }\n+    if (!user) {\n+      req.flash("errors", { msg: info.message });\n+      return res.redirect("/login");\n     }\n',
              id: 311,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-09-04T10:52:12+0800',
            discussion_id: null,
            id: 37,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_0_3',
            line_type: 'old',
            note: '哈哈哈',
            noteable_id: 1630,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17174,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n',
              id: 311,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-09-04T16:20:30+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'taian.lta@test.com',
          extern_uid: '146194',
          id: 15165,
          name: '伊北',
          state: 'active',
          username: 'taian.lta',
          web_url: 'https://test.com.com/nwpipe/u/146194',
        },
        body: null,
        created_at: '2020-09-04T16:20:38+08:00',
        id: 1633,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-09-04T16:20:39+0800',
            discussion_id: null,
            id: 40,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password cannot be blank").isLength({ min: 1 }).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/login");\n+  }\n+\n+  passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n+    if (err) { return next(err); }\n+    if (!user) {\n+      req.flash("errors", { msg: info.message });\n+      return res.redirect("/login");\n     }\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_40_35',
            line_type: 'old',
            note: '123',
            noteable_id: 1633,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17174,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password cannot be blank").isLength({ min: 1 }).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/login");\n+  }\n+\n+  passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n+    if (err) { return next(err); }\n+    if (!user) {\n+      req.flash("errors", { msg: info.message });\n+      return res.redirect("/login");\n     }\n',
              id: 311,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-09-04T16:20:43+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'taian.lta@test.com',
          extern_uid: '146194',
          id: 15165,
          name: '伊北',
          state: 'active',
          username: 'taian.lta',
          web_url: 'https://test.com.com/nwpipe/u/146194',
        },
        body: null,
        created_at: '2020-09-08T19:47:16+08:00',
        id: 1639,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-09-08T19:47:16+0800',
            discussion_id: null,
            id: 59,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'v1.16.2-snapshot-3a71cb12',
            noteable_id: 1639,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-09-08T19:47:16+0800',
          },
        ],
        updated_at: '2020-09-08T19:47:16+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'taian.lta@test.com',
          extern_uid: '146194',
          id: 15165,
          name: '伊北',
          state: 'active',
          username: 'taian.lta',
          web_url: 'https://test.com.com/nwpipe/u/146194',
        },
        body: null,
        created_at: '2020-09-10T12:04:45+08:00',
        id: 1652,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-09-10T12:04:45+0800',
            discussion_id: null,
            id: 69,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 1,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 1,
              deleted_file: false,
              diff: '@@ -16,7 +16,7 @@ const server = app.listen(app.get("port"), () => {\n         app.get("port"),\n',
              id: 1091,
              new_file: false,
              new_path: 'src/server.ts',
              old_path: 'src/server.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'bcc09dcb20cae54f483679309f0403fdcbd98121_15_0',
            line_type: 'old',
            note: '测试发布一条评论',
            noteable_id: 1652,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/server.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 1,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17921,
              del_line_num: 1,
              deleted_file: false,
              diff: '@@ -16,7 +16,7 @@ const server = app.listen(app.get("port"), () => {\n         app.get("port"),\n',
              id: 79,
              new_file: false,
              new_path: 'src/server.ts',
              old_path: 'src/server.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-09-10T12:04:49+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'taian.lta@test.com',
          extern_uid: '146194',
          id: 15165,
          name: '伊北',
          state: 'active',
          username: 'taian.lta',
          web_url: 'https://test.com.com/nwpipe/u/146194',
        },
        body: null,
        created_at: '2020-09-13T22:47:59+08:00',
        id: 1659,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-09-17T23:03:22+0800',
            discussion_id: 60,
            id: 84,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: '123123',
            noteable_id: 1659,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-09-17T23:03:22+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-09-13T22:47:59+0800',
            discussion_id: null,
            id: 73,
            is_award: false,
            labels: [
              '内存泄露',
              '日志规约',
              '中间件规约',
              '基础编码规约',
              '安全规约',
              '并发&幂等',
            ],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 7,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 7,
              deleted_file: false,
              diff: '@@ -1,18 +1,18 @@\n import winston from "winston";\n \n const options: winston.LoggerOptions = {\n-    transports: [\n-        new winston.transports.Console({\n-            level: process.env.NODE_ENV === "production" ? "error" : "debug"\n-        }),\n-        new winston.transports.File({ filename: "debug.log", level: "debug" })\n-    ]\n+  transports: [\n',
              id: 1092,
              new_file: false,
              new_path: 'src/util/logger.ts',
              old_path: 'src/util/logger.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'bd5630fadbfeb531e34aa7539e6a12a247f8b0c6_9_4',
            line_type: 'old',
            note: '123',
            noteable_id: 1659,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/util/logger.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 7,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17959,
              del_line_num: 7,
              deleted_file: false,
              diff: '@@ -1,18 +1,18 @@\n import winston from "winston";\n \n const options: winston.LoggerOptions = {\n-    transports: [\n-        new winston.transports.Console({\n-            level: process.env.NODE_ENV === "production" ? "error" : "debug"\n-        }),\n-        new winston.transports.File({ filename: "debug.log", level: "debug" })\n-    ]\n+  transports: [\n',
              id: 275,
              new_file: false,
              new_path: 'src/util/logger.ts',
              old_path: 'src/util/logger.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-09-17T23:03:28+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'taian.lta@test.com',
          extern_uid: '146194',
          id: 15165,
          name: '伊北',
          state: 'active',
          username: 'taian.lta',
          web_url: 'https://test.com.com/nwpipe/u/146194',
        },
        body: null,
        created_at: '2020-09-19T22:39:00+08:00',
        id: 1662,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-09-19T22:39:35+0800',
            discussion_id: 11,
            id: 87,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'test123',
            noteable_id: 1662,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-09-19T22:39:35+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-09-19T22:39:00+0800',
            discussion_id: 78,
            id: 86,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: '123123123',
            noteable_id: 1662,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-09-19T22:39:00+0800',
          },
        ],
        updated_at: '2020-09-19T22:40:05+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'taian.lta@test.com',
          extern_uid: '146194',
          id: 15165,
          name: '伊北',
          state: 'active',
          username: 'taian.lta',
          web_url: 'https://test.com.com/nwpipe/u/146194',
        },
        body: null,
        created_at: '2020-10-28T11:42:13+08:00',
        id: 1737,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-11-16T19:52:35+0800',
            discussion_id: 78,
            id: 180,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: '*\n*',
            noteable_id: 1737,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-11-16T19:52:35+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-11-11T13:28:08+0800',
            discussion_id: null,
            id: 170,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 49,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 49,
              deleted_file: false,
              diff: '@@ -3,73 +3,73 @@ import crypto from "crypto";\n import mongoose from "mongoose";\n \n export type UserDocument = mongoose.Document & {\n-    email: string;\n-    password: string;\n-    passwordResetToken: string;\n-    passwordResetExpires: Date;\n+  email: string;\n',
              id: 1089,
              new_file: false,
              new_path: 'src/models/User.ts',
              old_path: 'src/models/User.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'e9bf216a20e84ee797b9402193000e41dad21aa6_6_6',
            line_type: 'old',
            note: '123',
            noteable_id: 1737,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/models/User.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 49,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 49,
              deleted_file: false,
              diff: '@@ -3,73 +3,73 @@ import crypto from "crypto";\n import mongoose from "mongoose";\n \n export type UserDocument = mongoose.Document & {\n-    email: string;\n-    password: string;\n-    passwordResetToken: string;\n-    passwordResetExpires: Date;\n+  email: string;\n',
              id: 1089,
              new_file: false,
              new_path: 'src/models/User.ts',
              old_path: 'src/models/User.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-11-11T13:28:08+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-11-11T13:27:56+0800',
            discussion_id: null,
            id: 169,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 49,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 49,
              deleted_file: false,
              diff: '@@ -3,73 +3,73 @@ import crypto from "crypto";\n import mongoose from "mongoose";\n \n export type UserDocument = mongoose.Document & {\n-    email: string;\n-    password: string;\n-    passwordResetToken: string;\n-    passwordResetExpires: Date;\n+  email: string;\n+  password: string;\n+  passwordResetToken: string;\n+  passwordResetExpires: Date;\n \n',
              id: 1089,
              new_file: false,
              new_path: 'src/models/User.ts',
              old_path: 'src/models/User.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'e9bf216a20e84ee797b9402193000e41dad21aa6_10_7',
            line_type: 'old',
            note: '123',
            noteable_id: 1737,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/models/User.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 49,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 49,
              deleted_file: false,
              diff: '@@ -3,73 +3,73 @@ import crypto from "crypto";\n import mongoose from "mongoose";\n \n export type UserDocument = mongoose.Document & {\n-    email: string;\n-    password: string;\n-    passwordResetToken: string;\n-    passwordResetExpires: Date;\n+  email: string;\n+  password: string;\n+  passwordResetToken: string;\n+  passwordResetExpires: Date;\n \n',
              id: 1089,
              new_file: false,
              new_path: 'src/models/User.ts',
              old_path: 'src/models/User.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-11-11T13:27:56+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-10-28T11:42:13+0800',
            discussion_id: 52,
            id: 166,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: '123123',
            noteable_id: 1737,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-10-28T11:42:13+0800',
          },
        ],
        updated_at: '2022-01-25T15:55:52+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'xinglong.wangwxl@test.com',
          extern_uid: '80222',
          id: 15168,
          name: '蛋总',
          state: 'active',
          username: 'xinglong.wangwxl',
          web_url: 'https://test.com.com/nwpipe/u/80222',
        },
        body: null,
        created_at: '2020-08-18T10:23:46+08:00',
        id: 1563,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-08-25T20:31:20+0800',
            discussion_id: null,
            id: 27,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password cannot be blank").isLength({ min: 1 }).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/login");\n+  }\n+\n+  passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n+    if (err) { return next(err); }\n+    if (!user) {\n+      req.flash("errors", { msg: info.message });\n+      return res.redirect("/login");\n     }\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_40_31',
            line_type: 'old',
            note: '右侧',
            noteable_id: 1563,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 16382,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password cannot be blank").isLength({ min: 1 }).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/login");\n+  }\n+\n+  passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n+    if (err) { return next(err); }\n+    if (!user) {\n+      req.flash("errors", { msg: info.message });\n+      return res.redirect("/login");\n     }\n',
              id: 34,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-08-21T15:34:22+0800',
            discussion_id: 20,
            id: 26,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: '撒大声地阿斯顿撒',
            noteable_id: 1563,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-08-21T15:34:22+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-08-21T15:33:34+0800',
            discussion_id: 23,
            id: 25,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'sad',
            noteable_id: 1563,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-08-21T15:33:34+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-08-21T11:30:27+0800',
            discussion_id: 9,
            id: 16,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'asdsadsa',
            noteable_id: 1563,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-08-21T11:30:27+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-08-21T11:30:21+0800',
            discussion_id: 9,
            id: 15,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'asdasd',
            noteable_id: 1563,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-08-21T11:30:21+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-08-18T10:23:46+0800',
            discussion_id: null,
            id: 13,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '0',
              add_line_num: 228,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,228 @@\n+import { PullRequestChange } from \'../../../submodules/api-server/app/web/module/common/model/antcode\';\n+\n+export const mockChanges: PullRequestChange[] = [\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 3,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n+    "deleted_file": false,\n',
              id: 1077,
              new_file: true,
              new_path: 'a.ts',
              old_path: 'a.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: '02699cd6ca65aa6819d7e387678d8ea5359b5e59_0_10',
            line_type: 'new',
            note: '1111',
            noteable_id: 1563,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'a.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '0',
              add_line_num: 228,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 15929,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,228 @@\n+import { PullRequestChange } from \'../../../submodules/api-server/app/web/module/common/model/antcode\';\n+\n+export const mockChanges: PullRequestChange[] = [\n+  {\n+    "a_mode": "100644",\n+    "add_line_num": 3,\n+    "b_mode": "100644",\n+    "binary_file": false,\n+    "del_line_num": 0,\n+    "deleted_file": false,\n',
              id: 43,
              new_file: true,
              new_path: 'a.ts',
              old_path: 'a.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-08-25T20:31:24+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'xinglong.wangwxl@test.com',
          extern_uid: '80222',
          id: 15168,
          name: '蛋总',
          state: 'active',
          username: 'xinglong.wangwxl',
          web_url: 'https://test.com.com/nwpipe/u/80222',
        },
        body: null,
        created_at: '2020-08-28T10:27:38+08:00',
        id: 1609,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-08-28T11:29:51+0800',
            discussion_id: null,
            id: 30,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n  */\n export const getLogin = (req: Request, res: Response) => {\n-    if (req.user) {\n-        return res.redirect("/");\n-    }\n-    res.render("account/login", {\n-        title: "Login"\n-    });\n+  if (req.user) {\n+    return res.redirect("/");\n+  }\n+  res.render("account/login", {\n+    title: "Login"\n+  });\n };\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_23_17',
            line_type: 'old',
            note: '大迭代',
            noteable_id: 1609,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 16382,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n  */\n export const getLogin = (req: Request, res: Response) => {\n-    if (req.user) {\n-        return res.redirect("/");\n-    }\n-    res.render("account/login", {\n-        title: "Login"\n-    });\n+  if (req.user) {\n+    return res.redirect("/");\n+  }\n+  res.render("account/login", {\n+    title: "Login"\n+  });\n };\n',
              id: 34,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-08-28T11:29:43+0800',
            discussion_id: null,
            id: 29,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_9_0',
            line_type: 'old',
            note: '撒大声地',
            noteable_id: 1609,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 16382,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n',
              id: 34,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-08-28T10:27:39+0800',
            discussion_id: 22,
            id: 28,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'ffff',
            noteable_id: 1609,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-08-28T10:27:39+0800',
          },
        ],
        updated_at: '2020-08-28T11:30:02+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'xinglong.wangwxl@test.com',
          extern_uid: '80222',
          id: 15168,
          name: '蛋总',
          state: 'active',
          username: 'xinglong.wangwxl',
          web_url: 'https://test.com.com/nwpipe/u/80222',
        },
        body: null,
        created_at: '2020-08-28T11:30:22+08:00',
        id: 1610,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-08-28T11:30:22+0800',
            discussion_id: null,
            id: 31,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_3_0',
            line_type: 'old',
            note: '333333',
            noteable_id: 1610,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 16382,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n',
              id: 34,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-08-28T11:30:27+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'xinglong.wangwxl@test.com',
          extern_uid: '80222',
          id: 15168,
          name: '蛋总',
          state: 'active',
          username: 'xinglong.wangwxl',
          web_url: 'https://test.com.com/nwpipe/u/80222',
        },
        body: null,
        created_at: '2020-08-28T11:30:58+08:00',
        id: 1611,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-08-28T11:30:58+0800',
            discussion_id: null,
            id: 32,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_37_30',
            line_type: 'old',
            note: '啊大大',
            noteable_id: 1611,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 16382,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n',
              id: 34,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-08-28T11:31:04+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'xinglong.wangwxl@test.com',
          extern_uid: '80222',
          id: 15168,
          name: '蛋总',
          state: 'active',
          username: 'xinglong.wangwxl',
          web_url: 'https://test.com.com/nwpipe/u/80222',
        },
        body: null,
        created_at: '2020-09-07T11:12:17+08:00',
        id: 1635,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-09-07T11:12:18+0800',
            discussion_id: null,
            id: 43,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_9_0',
            line_type: 'old',
            note: 'ddd',
            noteable_id: 1635,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17598,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n',
              id: 752,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-09-07T11:19:37+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'xinglong.wangwxl@test.com',
          extern_uid: '80222',
          id: 15168,
          name: '蛋总',
          state: 'active',
          username: 'xinglong.wangwxl',
          web_url: 'https://test.com.com/nwpipe/u/80222',
        },
        body: null,
        created_at: '2020-09-07T11:58:28+08:00',
        id: 1637,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-09-07T15:44:32+0800',
            discussion_id: null,
            id: 50,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -252,61 +252,61 @@ export const getReset = (req: Request, res: Response, next: NextFunction) => {\n  * Process the reset password request.\n  */\n export const postReset = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("password", "Password must be at least 4 characters long.").isLength({ min: 4 }).run(req);\n-    await check("confirm", "Passwords must match.").equals(req.body.password).run(req);\n+  await check("password", "Password must be at least 4 characters long.").isLength({ min: 4 }).run(req);\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_255_255',
            line_type: 'old',
            note: 'asdsadas',
            noteable_id: 1637,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17605,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -252,61 +252,61 @@ export const getReset = (req: Request, res: Response, next: NextFunction) => {\n  * Process the reset password request.\n  */\n export const postReset = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("password", "Password must be at least 4 characters long.").isLength({ min: 4 }).run(req);\n-    await check("confirm", "Passwords must match.").equals(req.body.password).run(req);\n+  await check("password", "Password must be at least 4 characters long.").isLength({ min: 4 }).run(req);\n',
              id: 490,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-09-07T15:44:18+0800',
            discussion_id: null,
            id: 49,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -252,61 +252,61 @@ export const getReset = (req: Request, res: Response, next: NextFunction) => {\n  * Process the reset password request.\n  */\n export const postReset = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("password", "Password must be at least 4 characters long.").isLength({ min: 4 }).run(req);\n-    await check("confirm", "Passwords must match.").equals(req.body.password).run(req);\n+  await check("password", "Password must be at least 4 characters long.").isLength({ min: 4 }).run(req);\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_255_255',
            line_type: 'old',
            note: 'dddd',
            noteable_id: 1637,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17605,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -252,61 +252,61 @@ export const getReset = (req: Request, res: Response, next: NextFunction) => {\n  * Process the reset password request.\n  */\n export const postReset = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("password", "Password must be at least 4 characters long.").isLength({ min: 4 }).run(req);\n-    await check("confirm", "Passwords must match.").equals(req.body.password).run(req);\n+  await check("password", "Password must be at least 4 characters long.").isLength({ min: 4 }).run(req);\n',
              id: 490,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-09-07T15:43:49+0800',
            discussion_id: 29,
            id: 48,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'ddd',
            noteable_id: 1637,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-09-07T15:43:49+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-09-07T11:58:29+0800',
            discussion_id: null,
            id: 46,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_37_30',
            line_type: 'old',
            note: '十点多',
            noteable_id: 1637,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17598,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n',
              id: 752,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-09-07T15:44:42+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'xinglong.wangwxl@test.com',
          extern_uid: '80222',
          id: 15168,
          name: '蛋总',
          state: 'active',
          username: 'xinglong.wangwxl',
          web_url: 'https://test.com.com/nwpipe/u/80222',
        },
        body: null,
        created_at: '2020-09-07T15:47:40+08:00',
        id: 1638,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-09-07T16:39:19+0800',
            discussion_id: null,
            id: 53,
            is_award: false,
            labels: ['内存泄露', '中间件规约'],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 4,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 4,
              deleted_file: false,
              diff: '@@ -4,7 +4,7 @@ import passportFacebook from "passport-facebook";\n import _ from "lodash";\n \n // import { User, UserType } from \'../models/User\';\n-import { User, UserDocument } from "../models/User";\n+import { User, UserDocument } from "../models/User"\n',
              id: 1087,
              new_file: false,
              new_path: 'src/config/passport.ts',
              old_path: 'src/config/passport.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: '761e3f18c863ddeee900bf74ddd8fed56a4aa2c9_7_7',
            line_type: 'old',
            note: 'test',
            noteable_id: 1638,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/config/passport.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 4,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17605,
              del_line_num: 4,
              deleted_file: false,
              diff: '@@ -4,7 +4,7 @@ import passportFacebook from "passport-facebook";\n import _ from "lodash";\n \n // import { User, UserType } from \'../models/User\';\n-import { User, UserDocument } from "../models/User";\n+import { User, UserDocument } from "../models/User"\n',
              id: 489,
              new_file: false,
              new_path: 'src/config/passport.ts',
              old_path: 'src/config/passport.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-09-07T15:47:40+0800',
            discussion_id: null,
            id: 51,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_3_0',
            line_type: 'old',
            note: 'asdasd',
            noteable_id: 1638,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17605,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n',
              id: 490,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-09-16T15:19:24+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'xinglong.wangwxl@test.com',
          extern_uid: '80222',
          id: 15168,
          name: '蛋总',
          state: 'active',
          username: 'xinglong.wangwxl',
          web_url: 'https://test.com.com/nwpipe/u/80222',
        },
        body: null,
        created_at: '2020-09-22T10:13:52+08:00',
        id: 1663,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-10-27T11:38:24+0800',
            discussion_id: null,
            id: 159,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 0,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 1,
              deleted_file: false,
              diff: '@@ -1,4 +1,3 @@\n-# TypeScript Node Starter\n > hello world typescript\n \n The main purpose of this repository is to show a working Node.js API Server + front-end project and workflow for writing Node code in TypeScript.\n',
              id: 1075,
              new_file: false,
              new_path: 'README.md',
              old_path: 'README.md',
              renamed_file: false,
              too_large: false,
            },
            line_code: '8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d_0_24',
            line_type: 'old',
            note: '![stack.png](/ide-s/TypeScript-Node-Starter/uploads/f0320521d707466988b87cc04ec2c7a4/stack.png)',
            noteable_id: 1663,
            noteable_type: 'ReviewComment',
            outdated: true,
            path: 'README.md',
            resolved_at: '2022-01-25T15:10:39+08:00',
            resolved_by: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            st_diff: {
              a_mode: '100644',
              add_line_num: 0,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '604ed58cc40ed8ed6581d1c10e265da6f8b23496',
              compare_diff_id: 19988,
              del_line_num: 1,
              deleted_file: false,
              diff: '@@ -1,4 +1,3 @@\n-# TypeScript Node Starter\n > hello world typescript\n \n The main purpose of this repository is to show a working Node.js API Server + front-end project and workflow for writing Node code in TypeScript.\n',
              id: 144,
              new_file: false,
              new_path: 'README.md',
              old_path: 'README.md',
              renamed_file: false,
              too_large: false,
            },
            state: 'opened',
            system: false,
            type: 'Problem',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-09-22T10:13:53+0800',
            discussion_id: null,
            id: 88,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 0,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 1,
              deleted_file: false,
              diff: '@@ -24,7 +24,6 @@ footer {\n \n // Input Fields\n // -------------------------\n-\n textarea {\n   resize: vertical;\n',
              id: 1090,
              new_file: false,
              new_path: 'src/public/css/main.scss',
              old_path: 'src/public/css/main.scss',
              renamed_file: false,
              too_large: false,
            },
            line_code: '4c32a30db22da868cde702e26a724b6a2408a33c_29_27',
            line_type: 'old',
            note: '右边',
            noteable_id: 1663,
            noteable_type: 'ReviewComment',
            outdated: true,
            path: 'src/public/css/main.scss',
            resolved_at: '2022-01-20T20:10:37+08:00',
            resolved_by: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            st_diff: {
              a_mode: '100644',
              add_line_num: 0,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 18810,
              del_line_num: 1,
              deleted_file: false,
              diff: '@@ -24,7 +24,6 @@ footer {\n \n // Input Fields\n // -------------------------\n-\n textarea {\n   resize: vertical;\n',
              id: 117,
              new_file: false,
              new_path: 'src/public/css/main.scss',
              old_path: 'src/public/css/main.scss',
              renamed_file: false,
              too_large: false,
            },
            state: 'opened',
            system: false,
            type: 'Problem',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-10-27T11:38:42+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'xinglong.wangwxl@test.com',
          extern_uid: '80222',
          id: 15168,
          name: '蛋总',
          state: 'active',
          username: 'xinglong.wangwxl',
          web_url: 'https://test.com.com/nwpipe/u/80222',
        },
        body: null,
        created_at: '2020-10-27T11:39:26+08:00',
        id: 1731,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            commit_id: null,
            created_at: '2022-01-25T15:16:48+0800',
            discussion_id: 182,
            id: 500022,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'Problem status changed to opened',
            noteable_id: 1731,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: true,
            type: 'Comment',
            updated_at: '2022-01-25T15:16:48+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            commit_id: null,
            created_at: '2022-01-25T15:16:07+0800',
            discussion_id: 182,
            id: 500021,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'Problem status changed to resolved',
            noteable_id: 1731,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: true,
            type: 'Comment',
            updated_at: '2022-01-25T15:16:07+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-11-19T15:19:18+0800',
            discussion_id: null,
            id: 182,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 0,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 0,
              deleted_file: false,
              diff: '',
              id: 1096,
              new_file: false,
              new_path: 'views/partials/footer-renamed.pug',
              old_path: 'views/partials/footer.pug',
              renamed_file: true,
              too_large: false,
            },
            line_code: 'cdba7b9c4edb14d31053cfb58047d4183fe1830d_2_2',
            line_type: 'old',
            note: '2222',
            noteable_id: 1731,
            noteable_type: 'ReviewComment',
            outdated: true,
            path: 'views/partials/footer-renamed.pug',
            resolved_at: '2022-01-25T15:16:07+08:00',
            resolved_by: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            st_diff: {
              a_mode: '100644',
              add_line_num: 0,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: 'ac55c77aa72d49280058ed6054610f454ee694b1',
              compare_diff_id: 20699,
              del_line_num: 0,
              deleted_file: false,
              diff: '',
              id: 570,
              new_file: false,
              new_path: 'views/partials/footer-renamed.pug',
              old_path: 'views/partials/footer.pug',
              renamed_file: true,
              too_large: false,
            },
            state: 'opened',
            system: false,
            type: 'Problem',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-11-19T14:50:02+0800',
            discussion_id: null,
            id: 181,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: 'old',
            note: '111',
            noteable_id: 1731,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'views/partials/footer-renamed.pug',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 0,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: 'ac55c77aa72d49280058ed6054610f454ee694b1',
              compare_diff_id: 20699,
              del_line_num: 0,
              deleted_file: false,
              diff: '',
              id: 570,
              new_file: false,
              new_path: 'views/partials/footer-renamed.pug',
              old_path: 'views/partials/footer.pug',
              renamed_file: true,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-11-19T14:50:02+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-10-27T11:39:26+0800',
            discussion_id: 159,
            id: 160,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: '![](https://test.com/cloud-ide/api-server/uploads/96a89b8b059d4dd0896c5a01fe3ed68d/stack.png)',
            noteable_id: 1731,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-10-27T11:39:26+0800',
          },
        ],
        updated_at: '2020-11-19T15:19:37+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'xinglong.wangwxl@test.com',
          extern_uid: '80222',
          id: 15168,
          name: '蛋总',
          state: 'active',
          username: 'xinglong.wangwxl',
          web_url: 'https://test.com.com/nwpipe/u/80222',
        },
        body: null,
        created_at: '2020-11-19T15:20:10+08:00',
        id: 1769,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-11-19T15:20:10+0800',
            discussion_id: null,
            id: 183,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 0,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 0,
              deleted_file: false,
              diff: '',
              id: 1096,
              new_file: false,
              new_path: 'views/partials/footer-renamed.pug',
              old_path: 'views/partials/footer.pug',
              renamed_file: true,
              too_large: false,
            },
            line_code: 'cdba7b9c4edb14d31053cfb58047d4183fe1830d_5_5',
            line_type: 'old',
            note: '555',
            noteable_id: 1769,
            noteable_type: 'ReviewComment',
            outdated: true,
            path: 'views/partials/footer-renamed.pug',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 0,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: 'ac55c77aa72d49280058ed6054610f454ee694b1',
              compare_diff_id: 20699,
              del_line_num: 0,
              deleted_file: false,
              diff: '',
              id: 570,
              new_file: false,
              new_path: 'views/partials/footer-renamed.pug',
              old_path: 'views/partials/footer.pug',
              renamed_file: true,
              too_large: false,
            },
            state: 'opened',
            system: false,
            type: 'Problem',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-11-19T15:20:14+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'xinglong.wangwxl@test.com',
          extern_uid: '80222',
          id: 15168,
          name: '蛋总',
          state: 'active',
          username: 'xinglong.wangwxl',
          web_url: 'https://test.com.com/nwpipe/u/80222',
        },
        body: null,
        created_at: '2020-11-19T15:20:34+08:00',
        id: 1770,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2020-11-19T15:20:34+0800',
            discussion_id: null,
            id: 184,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 2,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 2,
              deleted_file: false,
              diff: '@@ -14,11 +14,11 @@ block content\n     .form-group.row.justify-content-md-center\n',
              id: 1094,
              new_file: false,
              new_path: 'views/contact123.pug',
              old_path: 'views/contact.pug',
              renamed_file: true,
              too_large: false,
            },
            line_code: '01c01633c13afa3e0580e14dbcd3c26e289c5281_0_4',
            line_type: 'old',
            note: '4444',
            noteable_id: 1770,
            noteable_type: 'ReviewComment',
            outdated: true,
            path: 'views/contact123.pug',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 2,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: 'ac55c77aa72d49280058ed6054610f454ee694b1',
              compare_diff_id: 20699,
              del_line_num: 2,
              deleted_file: false,
              diff: '@@ -14,11 +14,11 @@ block content\n     .form-group.row.justify-content-md-center\n',
              id: 568,
              new_file: false,
              new_path: 'views/contact123.pug',
              old_path: 'views/contact.pug',
              renamed_file: true,
              too_large: false,
            },
            state: 'opened',
            system: false,
            type: 'Problem',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-11-19T15:20:49+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'xinglong.wangwxl@test.com',
          extern_uid: '80222',
          id: 15168,
          name: '蛋总',
          state: 'active',
          username: 'xinglong.wangwxl',
          web_url: 'https://test.com.com/nwpipe/u/80222',
        },
        body: null,
        created_at: '2021-05-28T16:28:46+08:00',
        id: 2106,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            commit_id: null,
            created_at: '2022-01-25T20:10:21+0800',
            discussion_id: 205,
            id: 500027,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'Problem status changed to opened',
            noteable_id: 2106,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: true,
            type: 'Comment',
            updated_at: '2022-01-25T20:10:21+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            commit_id: null,
            created_at: '2022-01-25T20:10:07+0800',
            discussion_id: 205,
            id: 500026,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'Problem status changed to resolved',
            noteable_id: 2106,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: true,
            type: 'Comment',
            updated_at: '2022-01-25T20:10:07+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            commit_id: null,
            created_at: '2022-01-25T16:06:08+0800',
            discussion_id: 206,
            id: 500024,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'Problem status changed to resolved',
            noteable_id: 2106,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: true,
            type: 'Comment',
            updated_at: '2022-01-25T16:06:08+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2021-05-28T16:31:57+0800',
            discussion_id: null,
            id: 206,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 1,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 1,
              deleted_file: false,
              diff: '@@ -16,7 +16,7 @@ const server = app.listen(app.get("port"), () => {\n         app.get("port"),\n         app.get("env")\n',
              id: 1091,
              new_file: false,
              new_path: 'src/server.ts',
              old_path: 'src/server.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'bcc09dcb20cae54f483679309f0403fdcbd98121_17_16',
            line_type: 'old',
            note: '1111',
            noteable_id: 2106,
            noteable_type: 'ReviewComment',
            outdated: true,
            path: 'src/server.ts',
            resolved_at: '2022-01-25T16:06:08+08:00',
            resolved_by: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            st_diff: {
              a_mode: '100644',
              add_line_num: 1,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 1,
              deleted_file: false,
              diff: '@@ -16,7 +16,7 @@ const server = app.listen(app.get("port"), () => {\n         app.get("port"),\n         app.get("env")\n',
              id: 1091,
              new_file: false,
              new_path: 'src/server.ts',
              old_path: 'src/server.ts',
              renamed_file: false,
              too_large: false,
            },
            state: 'opened',
            system: false,
            type: 'Problem',
            updated_at: '2021-05-28T16:31:57+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2021-05-28T16:28:46+0800',
            discussion_id: null,
            id: 205,
            is_award: false,
            labels: ['测试'],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 4,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 4,
              deleted_file: false,
              diff: '@@ -14,7 +14,7 @@ passport.serializeUser<any, any>((user, done) => {\n     done(undefined, user.id);\n });\n \n-passport.deserializeUser((id, done) => {\n+passport.deserializeUser((id: string, done) => {\n     User.findById(id, (err, user) => {\n',
              id: 1087,
              new_file: false,
              new_path: 'src/config/passport.ts',
              old_path: 'src/config/passport.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: '761e3f18c863ddeee900bf74ddd8fed56a4aa2c9_18_17',
            line_type: 'old',
            note: '这是啥',
            noteable_id: 2106,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/config/passport.ts',
            resolved_at: '2022-01-25T20:10:07+08:00',
            resolved_by: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            st_diff: {
              a_mode: '100644',
              add_line_num: 4,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 4,
              deleted_file: false,
              diff: '@@ -14,7 +14,7 @@ passport.serializeUser<any, any>((user, done) => {\n     done(undefined, user.id);\n });\n \n-passport.deserializeUser((id, done) => {\n+passport.deserializeUser((id: string, done) => {\n     User.findById(id, (err, user) => {\n',
              id: 1087,
              new_file: false,
              new_path: 'src/config/passport.ts',
              old_path: 'src/config/passport.ts',
              renamed_file: false,
              too_large: false,
            },
            state: 'opened',
            system: false,
            type: 'Problem',
            updated_at: '2021-05-28T16:28:46+0800',
          },
        ],
        updated_at: '2021-05-28T16:32:04+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'xinglong.wangwxl@test.com',
          extern_uid: '80222',
          id: 15168,
          name: '蛋总',
          state: 'active',
          username: 'xinglong.wangwxl',
          web_url: 'https://test.com.com/nwpipe/u/80222',
        },
        body: null,
        created_at: '2021-11-04T15:07:06+08:00',
        id: 4200243,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2021-11-04T15:07:07+0800',
            discussion_id: null,
            id: 400002,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password cannot be blank").isLength({ min: 1 }).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/login");\n+  }\n+\n+  passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n+    if (err) { return next(err); }\n+    if (!user) {\n+      req.flash("errors", { msg: info.message });\n+      return res.redirect("/login");\n     }\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_40_47',
            line_type: 'old',
            note: '这是一个带图评论\n\n\n![image.png](/ide-s/TypeScript-Node-Starter/uploads/45f6e1865078460aa15f2799225d956c/image.png)\n',
            noteable_id: 4200243,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password cannot be blank").isLength({ min: 1 }).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/login");\n+  }\n+\n+  passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n+    if (err) { return next(err); }\n+    if (!user) {\n+      req.flash("errors", { msg: info.message });\n+      return res.redirect("/login");\n     }\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: 'opened',
            system: false,
            type: 'Problem',
            updated_at: '2021-11-04T15:07:07+0800',
          },
        ],
        updated_at: '2021-11-04T15:07:16+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'xinglong.wangwxl@test.com',
          extern_uid: '80222',
          id: 15168,
          name: '蛋总',
          state: 'active',
          username: 'xinglong.wangwxl',
          web_url: 'https://test.com.com/nwpipe/u/80222',
        },
        body: null,
        created_at: '2021-11-04T15:08:12+08:00',
        id: 4200244,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            commit_id: null,
            created_at: '2022-01-24T11:08:09+0800',
            discussion_id: 400003,
            id: 500014,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'Problem status changed to opened',
            noteable_id: 4200244,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: true,
            type: 'Comment',
            updated_at: '2022-01-24T11:08:09+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            commit_id: null,
            created_at: '2022-01-24T11:07:54+0800',
            discussion_id: 400003,
            id: 500013,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'Problem status changed to resolved',
            noteable_id: 4200244,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: true,
            type: 'Comment',
            updated_at: '2022-01-24T11:07:54+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'xinglong.wangwxl@test.com',
              extern_uid: '80222',
              id: 15168,
              name: '蛋总',
              state: 'active',
              username: 'xinglong.wangwxl',
              web_url: 'https://test.com.com/nwpipe/u/80222',
            },
            commit_id: null,
            created_at: '2021-11-04T15:08:12+0800',
            discussion_id: null,
            id: 400003,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -327,62 +327,62 @@ export const getForgot = (req: Request, res: Response) => {\n  * Create a random token, then the send user an email with a reset link.\n  */\n export const postForgot = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Please enter a valid email address.").isEmail().run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/forgot");\n-    }\n-\n-    async.waterfall([\n-        function createRandomToken(done: Function) {\n-            crypto.randomBytes(16, (err, buf) => {\n-                const token = buf.toString("hex");\n-                done(err, token);\n-            });\n-        },\n-        function setRandomToken(token: AuthToken, done: Function) {\n-            User.findOne({ email: req.body.email }, (err, user: any) => {\n-                if (err) { return done(err); }\n-                if (!user) {\n-                    req.flash("errors", { msg: "Account with that email address does not exist." });\n-                    return res.redirect("/forgot");\n-                }\n-                user.passwordResetToken = token;\n-                user.passwordResetExpires = Date.now() + 3600000; // 1 hour\n-                user.save((err: WriteError) => {\n-                    done(err, token, user);\n-                });\n-            });\n-        },\n-        function sendForgotPasswordEmail(token: AuthToken, user: UserDocument, done: Function) {\n-            const transporter = nodemailer.createTransport({\n-                service: "SendGrid",\n-                auth: {\n-                    user: process.env.SENDGRID_USER,\n-                    pass: process.env.SENDGRID_PASSWORD\n-                }\n-            });\n-            const mailOptions = {\n-                to: user.email,\n-                from: "hackathon@starter.com",\n-                subject: "Reset your password on Hackathon Starter",\n-                text: `You are receiving this email because you (or someone else) have requested the reset of the password for your account.\\n\\n\n+  await check("email", "Please enter a valid email address.").isEmail().run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/forgot");\n+  }\n+\n+  async.waterfall([\n+    function createRandomToken(done: Function) {\n+      crypto.randomBytes(16, (err, buf) => {\n+        const token = buf.toString("hex");\n+        done(err, token);\n+      });\n+    },\n+    function setRandomToken(token: AuthToken, done: Function) {\n+      User.findOne({ email: req.body.email }, (err, user: any) => {\n+        if (err) { return done(err); }\n+        if (!user) {\n+          req.flash("errors", { msg: "Account with that email address does not exist." });\n+          return res.redirect("/forgot");\n+        }\n+        user.passwordResetToken = token;\n+        user.passwordResetExpires = Date.now() + 3600000; // 1 hour\n+        user.save((err: WriteError) => {\n+          done(err, token, user);\n+        });\n+      });\n+    },\n+    function sendForgotPasswordEmail(token: AuthToken, user: UserDocument, done: Function) {\n+      const transporter = nodemailer.createTransport({\n+        service: "SendGrid",\n+        auth: {\n+          user: process.env.SENDGRID_USER,\n+          pass: process.env.SENDGRID_PASSWORD\n+        }\n+      });\n+      const mailOptions = {\n+        to: user.email,\n+        from: "hackathon@starter.com",\n+        subject: "Reset your password on Hackathon Starter",\n+        text: `You are receiving this email because you (or someone else) have requested the reset of the password for your account.\\n\\n\n           Please click on the following link, or paste this into your browser to complete the process:\\n\\n\n           http://${req.headers.host}/reset/${token}\\n\\n\n           If you did not request this, please ignore this email and your password will remain unchanged.\\n`\n-            };\n-            transporter.sendMail(mailOptions, (err) => {\n-                req.flash("info", { msg: `An e-mail has been sent to ${user.email} with further instructions.` });\n-                done(err);\n-            });\n-        }\n-    ], (err) => {\n-        if (err) { return next(err); }\n-        res.redirect("/forgot");\n-    });\n+      };\n+      transporter.sendMail(mailOptions, (err) => {\n+        req.flash("info", { msg: `An e-mail has been sent to ${user.email} with further instructions.` });\n+        done(err);\n+      });\n+    }\n+  ], (err) => {\n+    if (err) { return next(err); }\n+    res.redirect("/forgot");\n+  });\n };\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_388_384',
            line_type: 'old',
            note: '111 \n\n\n![image.png](/ide-s/TypeScript-Node-Starter/uploads/cd8f399b2c994d01b4afe179c26e5a4f/image.png)\n',
            noteable_id: 4200244,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: '2022-01-24T11:07:54+08:00',
            resolved_by: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -327,62 +327,62 @@ export const getForgot = (req: Request, res: Response) => {\n  * Create a random token, then the send user an email with a reset link.\n  */\n export const postForgot = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Please enter a valid email address.").isEmail().run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/forgot");\n-    }\n-\n-    async.waterfall([\n-        function createRandomToken(done: Function) {\n-            crypto.randomBytes(16, (err, buf) => {\n-                const token = buf.toString("hex");\n-                done(err, token);\n-            });\n-        },\n-        function setRandomToken(token: AuthToken, done: Function) {\n-            User.findOne({ email: req.body.email }, (err, user: any) => {\n-                if (err) { return done(err); }\n-                if (!user) {\n-                    req.flash("errors", { msg: "Account with that email address does not exist." });\n-                    return res.redirect("/forgot");\n-                }\n-                user.passwordResetToken = token;\n-                user.passwordResetExpires = Date.now() + 3600000; // 1 hour\n-                user.save((err: WriteError) => {\n-                    done(err, token, user);\n-                });\n-            });\n-        },\n-        function sendForgotPasswordEmail(token: AuthToken, user: UserDocument, done: Function) {\n-            const transporter = nodemailer.createTransport({\n-                service: "SendGrid",\n-                auth: {\n-                    user: process.env.SENDGRID_USER,\n-                    pass: process.env.SENDGRID_PASSWORD\n-                }\n-            });\n-            const mailOptions = {\n-                to: user.email,\n-                from: "hackathon@starter.com",\n-                subject: "Reset your password on Hackathon Starter",\n-                text: `You are receiving this email because you (or someone else) have requested the reset of the password for your account.\\n\\n\n+  await check("email", "Please enter a valid email address.").isEmail().run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/forgot");\n+  }\n+\n+  async.waterfall([\n+    function createRandomToken(done: Function) {\n+      crypto.randomBytes(16, (err, buf) => {\n+        const token = buf.toString("hex");\n+        done(err, token);\n+      });\n+    },\n+    function setRandomToken(token: AuthToken, done: Function) {\n+      User.findOne({ email: req.body.email }, (err, user: any) => {\n+        if (err) { return done(err); }\n+        if (!user) {\n+          req.flash("errors", { msg: "Account with that email address does not exist." });\n+          return res.redirect("/forgot");\n+        }\n+        user.passwordResetToken = token;\n+        user.passwordResetExpires = Date.now() + 3600000; // 1 hour\n+        user.save((err: WriteError) => {\n+          done(err, token, user);\n+        });\n+      });\n+    },\n+    function sendForgotPasswordEmail(token: AuthToken, user: UserDocument, done: Function) {\n+      const transporter = nodemailer.createTransport({\n+        service: "SendGrid",\n+        auth: {\n+          user: process.env.SENDGRID_USER,\n+          pass: process.env.SENDGRID_PASSWORD\n+        }\n+      });\n+      const mailOptions = {\n+        to: user.email,\n+        from: "hackathon@starter.com",\n+        subject: "Reset your password on Hackathon Starter",\n+        text: `You are receiving this email because you (or someone else) have requested the reset of the password for your account.\\n\\n\n           Please click on the following link, or paste this into your browser to complete the process:\\n\\n\n           http://${req.headers.host}/reset/${token}\\n\\n\n           If you did not request this, please ignore this email and your password will remain unchanged.\\n`\n-            };\n-            transporter.sendMail(mailOptions, (err) => {\n-                req.flash("info", { msg: `An e-mail has been sent to ${user.email} with further instructions.` });\n-                done(err);\n-            });\n-        }\n-    ], (err) => {\n-        if (err) { return next(err); }\n-        res.redirect("/forgot");\n-    });\n+      };\n+      transporter.sendMail(mailOptions, (err) => {\n+        req.flash("info", { msg: `An e-mail has been sent to ${user.email} with further instructions.` });\n+        done(err);\n+      });\n+    }\n+  ], (err) => {\n+    if (err) { return next(err); }\n+    res.redirect("/forgot");\n+  });\n };\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: 'opened',
            system: false,
            type: 'Problem',
            updated_at: '2021-11-04T15:08:12+0800',
          },
        ],
        updated_at: '2021-11-04T15:08:18+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'jiankan.hjk@test.com',
          extern_uid: '130095',
          id: 15319,
          name: '剑侃',
          state: 'active',
          username: 'jiankan.hjk',
          web_url: 'https://test.com.com/nwpipe/u/130095',
        },
        body: null,
        created_at: '2020-08-21T15:20:06+08:00',
        id: 1585,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-08-21T15:20:25+0800',
            discussion_id: null,
            id: 18,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password cannot be blank").isLength({ min: 1 }).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/login");\n+  }\n+\n+  passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n+    if (err) { return next(err); }\n+    if (!user) {\n+      req.flash("errors", { msg: info.message });\n+      return res.redirect("/login");\n     }\n-\n-    passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n-        if (err) { return next(err); }\n-        if (!user) {\n-            req.flash("errors", {msg: info.message});\n-            return res.redirect("/login");\n-        }\n-        req.logIn(user, (err) => {\n-            if (err) { return next(err); }\n-            req.flash("success", { msg: "Success! You are logged in." });\n-            res.redirect(req.session.returnTo || "/");\n-        });\n-    })(req, res, next);\n+    req.logIn(user, (err) => {\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_41_48',
            line_type: 'old',
            note: '第二次测试',
            noteable_id: 1585,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 16382,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password cannot be blank").isLength({ min: 1 }).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/login");\n+  }\n+\n+  passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n+    if (err) { return next(err); }\n+    if (!user) {\n+      req.flash("errors", { msg: info.message });\n+      return res.redirect("/login");\n     }\n-\n-    passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n-        if (err) { return next(err); }\n-        if (!user) {\n-            req.flash("errors", {msg: info.message});\n-            return res.redirect("/login");\n-        }\n-        req.logIn(user, (err) => {\n-            if (err) { return next(err); }\n-            req.flash("success", { msg: "Success! You are logged in." });\n-            res.redirect(req.session.returnTo || "/");\n-        });\n-    })(req, res, next);\n+    req.logIn(user, (err) => {\n',
              id: 34,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-08-21T15:20:06+0800',
            discussion_id: null,
            id: 17,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password cannot be blank").isLength({ min: 1 }).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/login");\n+  }\n+\n+  passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n+    if (err) { return next(err); }\n+    if (!user) {\n+      req.flash("errors", { msg: info.message });\n+      return res.redirect("/login");\n     }\n-\n-    passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n-        if (err) { return next(err); }\n-        if (!user) {\n-            req.flash("errors", {msg: info.message});\n-            return res.redirect("/login");\n-        }\n-        req.logIn(user, (err) => {\n-            if (err) { return next(err); }\n-            req.flash("success", { msg: "Success! You are logged in." });\n-            res.redirect(req.session.returnTo || "/");\n-        });\n-    })(req, res, next);\n+    req.logIn(user, (err) => {\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_43_48',
            line_type: 'old',
            note: '太好了',
            noteable_id: 1585,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 16382,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n+  await check("password", "Password cannot be blank").isLength({ min: 1 }).run(req);\n+  // eslint-disable-next-line @typescript-eslint/camelcase\n+  await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n+\n+  const errors = validationResult(req);\n+\n+  if (!errors.isEmpty()) {\n+    req.flash("errors", errors.array());\n+    return res.redirect("/login");\n+  }\n+\n+  passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n+    if (err) { return next(err); }\n+    if (!user) {\n+      req.flash("errors", { msg: info.message });\n+      return res.redirect("/login");\n     }\n-\n-    passport.authenticate("local", (err: Error, user: UserDocument, info: IVerifyOptions) => {\n-        if (err) { return next(err); }\n-        if (!user) {\n-            req.flash("errors", {msg: info.message});\n-            return res.redirect("/login");\n-        }\n-        req.logIn(user, (err) => {\n-            if (err) { return next(err); }\n-            req.flash("success", { msg: "Success! You are logged in." });\n-            res.redirect(req.session.returnTo || "/");\n-        });\n-    })(req, res, next);\n+    req.logIn(user, (err) => {\n',
              id: 34,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-08-21T15:20:32+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'jiankan.hjk@test.com',
          extern_uid: '130095',
          id: 15319,
          name: '剑侃',
          state: 'active',
          username: 'jiankan.hjk',
          web_url: 'https://test.com.com/nwpipe/u/130095',
        },
        body: null,
        created_at: '2020-08-21T15:28:36+08:00',
        id: 1586,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-08-21T15:28:36+0800',
            discussion_id: null,
            id: 19,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_30_30',
            line_type: 'old',
            note: '第三次测试',
            noteable_id: 1586,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 16382,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -27,30 +27,30 @@ export const getLogin = (req: Request, res: Response) => {\n  * Sign in using email and password.\n  */\n export const postLogin = async (req: Request, res: Response, next: NextFunction) => {\n-    await check("email", "Email is not valid").isEmail().run(req);\n-    await check("password", "Password cannot be blank").isLength({min: 1}).run(req);\n-    // eslint-disable-next-line @typescript-eslint/camelcase\n-    await sanitize("email").normalizeEmail({ gmail_remove_dots: false }).run(req);\n-\n-    const errors = validationResult(req);\n-\n-    if (!errors.isEmpty()) {\n-        req.flash("errors", errors.array());\n-        return res.redirect("/login");\n+  await check("email", "Email is not valid").isEmail().run(req);\n',
              id: 34,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-08-21T15:28:39+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'jiankan.hjk@test.com',
          extern_uid: '130095',
          id: 15319,
          name: '剑侃',
          state: 'active',
          username: 'jiankan.hjk',
          web_url: 'https://test.com.com/nwpipe/u/130095',
        },
        body: null,
        created_at: '2020-08-21T15:29:04+08:00',
        id: 1587,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-08-21T15:29:04+0800',
            discussion_id: null,
            id: 20,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n  */\n export const getLogin = (req: Request, res: Response) => {\n-    if (req.user) {\n-        return res.redirect("/");\n-    }\n-    res.render("account/login", {\n-        title: "Login"\n-    });\n+  if (req.user) {\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_21_17',
            line_type: 'old',
            note: '第四次测试',
            noteable_id: 1587,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 16382,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n  */\n export const getLogin = (req: Request, res: Response) => {\n-    if (req.user) {\n-        return res.redirect("/");\n-    }\n-    res.render("account/login", {\n-        title: "Login"\n-    });\n+  if (req.user) {\n',
              id: 34,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-08-21T15:29:07+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'jiankan.hjk@test.com',
          extern_uid: '130095',
          id: 15319,
          name: '剑侃',
          state: 'active',
          username: 'jiankan.hjk',
          web_url: 'https://test.com.com/nwpipe/u/130095',
        },
        body: null,
        created_at: '2020-08-21T15:30:06+08:00',
        id: 1588,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-08-21T15:30:07+0800',
            discussion_id: null,
            id: 21,
            is_award: false,
            labels: [
              'dadada',
              'dada',
              'dadad',
              'LackOfProfessionalField',
              'BusinessArchitectureDesignDefect',
              'DesignPatternDefect',
              'NotFamilierBasicFrame',
              'LackOfJavaBase',
              'CodeStandardsIssue',
              '并发&幂等',
              '基础编码规约',
              '中间件规约',
            ],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n  */\n export const getLogin = (req: Request, res: Response) => {\n-    if (req.user) {\n-        return res.redirect("/");\n-    }\n-    res.render("account/login", {\n-        title: "Login"\n-    });\n+  if (req.user) {\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_21_17',
            line_type: 'old',
            note: '第五次测试',
            noteable_id: 1588,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 16382,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n  */\n export const getLogin = (req: Request, res: Response) => {\n-    if (req.user) {\n-        return res.redirect("/");\n-    }\n-    res.render("account/login", {\n-        title: "Login"\n-    });\n+  if (req.user) {\n',
              id: 34,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-08-21T15:30:10+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'jiankan.hjk@test.com',
          extern_uid: '130095',
          id: 15319,
          name: '剑侃',
          state: 'active',
          username: 'jiankan.hjk',
          web_url: 'https://test.com.com/nwpipe/u/130095',
        },
        body: null,
        created_at: '2020-08-21T15:30:28+08:00',
        id: 1589,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-08-21T15:30:28+0800',
            discussion_id: null,
            id: 22,
            is_award: false,
            labels: ['内存泄露', '日志规约'],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n  */\n export const getLogin = (req: Request, res: Response) => {\n-    if (req.user) {\n-        return res.redirect("/");\n-    }\n-    res.render("account/login", {\n-        title: "Login"\n-    });\n+  if (req.user) {\n+    return res.redirect("/");\n+  }\n+  res.render("account/login", {\n+    title: "Login"\n+  });\n };\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_23_17',
            line_type: 'old',
            note: '第六次测试',
            noteable_id: 1589,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 16382,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n  */\n export const getLogin = (req: Request, res: Response) => {\n-    if (req.user) {\n-        return res.redirect("/");\n-    }\n-    res.render("account/login", {\n-        title: "Login"\n-    });\n+  if (req.user) {\n+    return res.redirect("/");\n+  }\n+  res.render("account/login", {\n+    title: "Login"\n+  });\n };\n',
              id: 34,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-08-21T15:30:32+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'jiankan.hjk@test.com',
          extern_uid: '130095',
          id: 15319,
          name: '剑侃',
          state: 'active',
          username: 'jiankan.hjk',
          web_url: 'https://test.com.com/nwpipe/u/130095',
        },
        body: null,
        created_at: '2020-08-21T15:31:09+08:00',
        id: 1590,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-08-21T15:31:09+0800',
            discussion_id: null,
            id: 23,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n  */\n export const getLogin = (req: Request, res: Response) => {\n-    if (req.user) {\n-        return res.redirect("/");\n-    }\n-    res.render("account/login", {\n-        title: "Login"\n-    });\n+  if (req.user) {\n+    return res.redirect("/");\n+  }\n+  res.render("account/login", {\n+    title: "Login"\n+  });\n };\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_23_18',
            line_type: 'old',
            note: '第七次测试',
            noteable_id: 1590,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 16382,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n  */\n export const getLogin = (req: Request, res: Response) => {\n-    if (req.user) {\n-        return res.redirect("/");\n-    }\n-    res.render("account/login", {\n-        title: "Login"\n-    });\n+  if (req.user) {\n+    return res.redirect("/");\n+  }\n+  res.render("account/login", {\n+    title: "Login"\n+  });\n };\n',
              id: 34,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-08-21T15:31:15+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'jiankan.hjk@test.com',
          extern_uid: '130095',
          id: 15319,
          name: '剑侃',
          state: 'active',
          username: 'jiankan.hjk',
          web_url: 'https://test.com.com/nwpipe/u/130095',
        },
        body: null,
        created_at: '2020-08-21T15:32:38+08:00',
        id: 1591,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-08-21T15:32:38+0800',
            discussion_id: null,
            id: 24,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n  */\n export const getLogin = (req: Request, res: Response) => {\n-    if (req.user) {\n-        return res.redirect("/");\n-    }\n-    res.render("account/login", {\n-        title: "Login"\n-    });\n+  if (req.user) {\n+    return res.redirect("/");\n+  }\n+  res.render("account/login", {\n+    title: "Login"\n+  });\n };\n',
              id: 1088,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'c17950853d6b9677e9822cf07f2616db7ca02797_23_20',
            line_type: 'old',
            note: '第八次测试',
            noteable_id: 1591,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/controllers/user.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 265,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 16382,
              del_line_num: 265,
              deleted_file: false,
              diff: '@@ -14,12 +14,12 @@ import "../config/passport";\n  * Login page.\n  */\n export const getLogin = (req: Request, res: Response) => {\n-    if (req.user) {\n-        return res.redirect("/");\n-    }\n-    res.render("account/login", {\n-        title: "Login"\n-    });\n+  if (req.user) {\n+    return res.redirect("/");\n+  }\n+  res.render("account/login", {\n+    title: "Login"\n+  });\n };\n',
              id: 34,
              new_file: false,
              new_path: 'src/controllers/user.ts',
              old_path: 'src/controllers/user.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-08-21T15:32:41+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'jiankan.hjk@test.com',
          extern_uid: '130095',
          id: 15319,
          name: '剑侃',
          state: 'active',
          username: 'jiankan.hjk',
          web_url: 'https://test.com.com/nwpipe/u/130095',
        },
        body: null,
        created_at: '2020-09-04T16:20:30+08:00',
        id: 1632,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-11-16T19:42:40+0800',
            discussion_id: 78,
            id: 179,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'Problem status changed to resolved',
            noteable_id: 1632,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: true,
            type: 'Comment',
            updated_at: '2020-11-16T19:42:40+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-11-16T19:42:37+0800',
            discussion_id: 78,
            id: 178,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'Problem status changed to invalid',
            noteable_id: 1632,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: true,
            type: 'Comment',
            updated_at: '2020-11-16T19:42:37+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-09-16T11:54:11+0800',
            discussion_id: 78,
            id: 81,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'Problem status changed to resolved',
            noteable_id: 1632,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: true,
            type: 'Comment',
            updated_at: '2020-09-16T11:54:11+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-09-16T11:52:42+0800',
            discussion_id: null,
            id: 78,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 0,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 1,
              deleted_file: false,
              diff: '@@ -1,4 +1,3 @@\n-# TypeScript Node Starter\n > hello world typescript\n \n The main purpose of this repository is to show a working Node.js API Server + front-end project and workflow for writing Node code in TypeScript.\n',
              id: 1075,
              new_file: false,
              new_path: 'README.md',
              old_path: 'README.md',
              renamed_file: false,
              too_large: false,
            },
            line_code: '8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d_8_0',
            line_type: 'old',
            note: '测试',
            noteable_id: 1632,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'README.md',
            resolved_at: '2020-11-16T19:42:40+08:00',
            resolved_by: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            st_diff: {
              a_mode: '100644',
              add_line_num: 0,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17959,
              del_line_num: 1,
              deleted_file: false,
              diff: '@@ -1,4 +1,3 @@\n-# TypeScript Node Starter\n > hello world typescript\n \n The main purpose of this repository is to show a working Node.js API Server + front-end project and workflow for writing Node code in TypeScript.\n',
              id: 267,
              new_file: false,
              new_path: 'README.md',
              old_path: 'README.md',
              renamed_file: false,
              too_large: false,
            },
            state: 'resolved',
            system: false,
            type: 'Problem',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-09-14T12:10:59+0800',
            discussion_id: 20,
            id: 76,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: '对对对\n对对对\n对对对\n对对对对对对\n\n\n\n\n\n\n对对对',
            noteable_id: 1632,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-09-14T12:10:59+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-09-14T12:10:40+0800',
            discussion_id: 20,
            id: 75,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: '@jiankan.hjk(剑侃) ',
            noteable_id: 1632,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-09-14T12:10:40+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-09-09T11:22:29+0800',
            discussion_id: null,
            id: 61,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 49,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 49,
              deleted_file: false,
              diff: '@@ -3,73 +3,73 @@ import crypto from "crypto";\n import mongoose from "mongoose";\n \n',
              id: 1089,
              new_file: false,
              new_path: 'src/models/User.ts',
              old_path: 'src/models/User.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'e9bf216a20e84ee797b9402193000e41dad21aa6_4_4',
            line_type: 'old',
            note: 'test',
            noteable_id: 1632,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/models/User.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 49,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17641,
              del_line_num: 49,
              deleted_file: false,
              diff: '@@ -3,73 +3,73 @@ import crypto from "crypto";\n import mongoose from "mongoose";\n \n',
              id: 48,
              new_file: false,
              new_path: 'src/models/User.ts',
              old_path: 'src/models/User.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-09-09T10:12:09+0800',
            discussion_id: null,
            id: 60,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '0',
              add_line_num: 12,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,12 @@\n+{\n+  "name": "aaa",\n',
              id: 1079,
              new_file: true,
              new_path: 'aaa/package.json',
              old_path: 'aaa/package.json',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'a1cd6d42683feafb8bafa3c3c68369f59d3013e6_0_2',
            line_type: 'new',
            note: '测试',
            noteable_id: 1632,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'aaa/package.json',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '0',
              add_line_num: 12,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17641,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,12 @@\n+{\n+  "name": "aaa",\n',
              id: 45,
              new_file: true,
              new_path: 'aaa/package.json',
              old_path: 'aaa/package.json',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-09-08T10:21:29+0800',
            discussion_id: null,
            id: 57,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 49,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 49,
              deleted_file: false,
              diff: '@@ -3,73 +3,73 @@ import crypto from "crypto";\n import mongoose from "mongoose";\n \n export type UserDocument = mongoose.Document & {\n-    email: string;\n-    password: string;\n-    passwordResetToken: string;\n-    passwordResetExpires: Date;\n+  email: string;\n',
              id: 1089,
              new_file: false,
              new_path: 'src/models/User.ts',
              old_path: 'src/models/User.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'e9bf216a20e84ee797b9402193000e41dad21aa6_7_6',
            line_type: 'old',
            note: '# test\n# test\n# test\n# test\n# test\n# test\n# test\n# test\n# test\n# test\n# test',
            noteable_id: 1632,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/models/User.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 49,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17605,
              del_line_num: 49,
              deleted_file: false,
              diff: '@@ -3,73 +3,73 @@ import crypto from "crypto";\n import mongoose from "mongoose";\n \n export type UserDocument = mongoose.Document & {\n-    email: string;\n-    password: string;\n-    passwordResetToken: string;\n-    passwordResetExpires: Date;\n+  email: string;\n',
              id: 491,
              new_file: false,
              new_path: 'src/models/User.ts',
              old_path: 'src/models/User.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-09-08T00:32:18+0800',
            discussion_id: null,
            id: 56,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 7,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 7,
              deleted_file: false,
              diff: '@@ -1,18 +1,18 @@\n import winston from "winston";\n \n const options: winston.LoggerOptions = {\n-    transports: [\n-        new winston.transports.Console({\n-            level: process.env.NODE_ENV === "production" ? "error" : "debug"\n-        }),\n-        new winston.transports.File({ filename: "debug.log", level: "debug" })\n-    ]\n+  transports: [\n',
              id: 1092,
              new_file: false,
              new_path: 'src/util/logger.ts',
              old_path: 'src/util/logger.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'bd5630fadbfeb531e34aa7539e6a12a247f8b0c6_9_4',
            line_type: 'old',
            note: '第二条',
            noteable_id: 1632,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/util/logger.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 7,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17605,
              del_line_num: 7,
              deleted_file: false,
              diff: '@@ -1,18 +1,18 @@\n import winston from "winston";\n \n const options: winston.LoggerOptions = {\n-    transports: [\n-        new winston.transports.Console({\n-            level: process.env.NODE_ENV === "production" ? "error" : "debug"\n-        }),\n-        new winston.transports.File({ filename: "debug.log", level: "debug" })\n-    ]\n+  transports: [\n',
              id: 494,
              new_file: false,
              new_path: 'src/util/logger.ts',
              old_path: 'src/util/logger.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-09-08T00:15:45+0800',
            discussion_id: null,
            id: 55,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 7,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 7,
              deleted_file: false,
              diff: '@@ -1,18 +1,18 @@\n import winston from "winston";\n \n const options: winston.LoggerOptions = {\n-    transports: [\n-        new winston.transports.Console({\n-            level: process.env.NODE_ENV === "production" ? "error" : "debug"\n-        }),\n-        new winston.transports.File({ filename: "debug.log", level: "debug" })\n-    ]\n+  transports: [\n',
              id: 1092,
              new_file: false,
              new_path: 'src/util/logger.ts',
              old_path: 'src/util/logger.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'bd5630fadbfeb531e34aa7539e6a12a247f8b0c6_9_4',
            line_type: 'old',
            note: '> h\n# test\n## test\n### test\n#### test\ntest\n @huaqiao.lhq(常浅) ',
            noteable_id: 1632,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/util/logger.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 7,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17605,
              del_line_num: 7,
              deleted_file: false,
              diff: '@@ -1,18 +1,18 @@\n import winston from "winston";\n \n const options: winston.LoggerOptions = {\n-    transports: [\n-        new winston.transports.Console({\n-            level: process.env.NODE_ENV === "production" ? "error" : "debug"\n-        }),\n-        new winston.transports.File({ filename: "debug.log", level: "debug" })\n-    ]\n+  transports: [\n',
              id: 494,
              new_file: false,
              new_path: 'src/util/logger.ts',
              old_path: 'src/util/logger.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-09-07T17:01:37+0800',
            discussion_id: null,
            id: 54,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 49,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 49,
              deleted_file: false,
              diff: '@@ -3,73 +3,73 @@ import crypto from "crypto";\n import mongoose from "mongoose";\n \n export type UserDocument = mongoose.Document & {\n-    email: string;\n-    password: string;\n-    passwordResetToken: string;\n-    passwordResetExpires: Date;\n+  email: string;\n+  password: string;\n+  passwordResetToken: string;\n+  passwordResetExpires: Date;\n \n-    facebook: string;\n-    tokens: AuthToken[];\n+  facebook: string;\n+  tokens: AuthToken[];\n \n-    profile: {\n-        name: string;\n-        gender: string;\n-        location: string;\n-        website: string;\n-        picture: string;\n-    };\n+  profile: {\n+    name: string;\n+    gender: string;\n+    location: string;\n+    website: string;\n+    picture: string;\n+  };\n \n-    comparePassword: comparePasswordFunction;\n-    gravatar: (size: number) => string;\n+  comparePassword: comparePasswordFunction;\n+  gravatar: (size: number) => string;\n };\n \n type comparePasswordFunction = (candidatePassword: string, cb: (err: any, isMatch: any) => {}) => void;\n \n export interface AuthToken {\n-    accessToken: string;\n-    kind: string;\n+  accessToken: string;\n+  kind: string;\n }\n \n const userSchema = new mongoose.Schema({\n-    email: { type: String, unique: true },\n-    password: String,\n-    passwordResetToken: String,\n-    passwordResetExpires: Date,\n+  email: { type: String, unique: true },\n+  password: String,\n+  passwordResetToken: String,\n+  passwordResetExpires: Date,\n \n-    facebook: String,\n-    twitter: String,\n-    google: String,\n-    tokens: Array,\n+  facebook: String,\n+  twitter: String,\n+  google: String,\n+  tokens: Array,\n \n-    profile: {\n-        name: String,\n-        gender: String,\n-        location: String,\n-        website: String,\n-        picture: String\n-    }\n+  profile: {\n+    name: String,\n+    gender: String,\n+    location: String,\n+    website: String,\n+    picture: String\n+  }\n }, { timestamps: true });\n \n /**\n  * Password hash middleware.\n  */\n userSchema.pre("save", function save(next) {\n-    const user = this as UserDocument;\n-    if (!user.isModified("password")) { return next(); }\n-    bcrypt.genSalt(10, (err, salt) => {\n-        if (err) { return next(err); }\n-        bcrypt.hash(user.password, salt, undefined, (err: mongoose.Error, hash) => {\n-            if (err) { return next(err); }\n-            user.password = hash;\n-            next();\n-        });\n+  const user = this as UserDocument;\n',
              id: 1089,
              new_file: false,
              new_path: 'src/models/User.ts',
              old_path: 'src/models/User.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'e9bf216a20e84ee797b9402193000e41dad21aa6_57_57',
            line_type: 'old',
            note: '测试一下',
            noteable_id: 1632,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/models/User.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 49,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17605,
              del_line_num: 49,
              deleted_file: false,
              diff: '@@ -3,73 +3,73 @@ import crypto from "crypto";\n import mongoose from "mongoose";\n \n export type UserDocument = mongoose.Document & {\n-    email: string;\n-    password: string;\n-    passwordResetToken: string;\n-    passwordResetExpires: Date;\n+  email: string;\n+  password: string;\n+  passwordResetToken: string;\n+  passwordResetExpires: Date;\n \n-    facebook: string;\n-    tokens: AuthToken[];\n+  facebook: string;\n+  tokens: AuthToken[];\n \n-    profile: {\n-        name: string;\n-        gender: string;\n-        location: string;\n-        website: string;\n-        picture: string;\n-    };\n+  profile: {\n+    name: string;\n+    gender: string;\n+    location: string;\n+    website: string;\n+    picture: string;\n+  };\n \n-    comparePassword: comparePasswordFunction;\n-    gravatar: (size: number) => string;\n+  comparePassword: comparePasswordFunction;\n+  gravatar: (size: number) => string;\n };\n \n type comparePasswordFunction = (candidatePassword: string, cb: (err: any, isMatch: any) => {}) => void;\n \n export interface AuthToken {\n-    accessToken: string;\n-    kind: string;\n+  accessToken: string;\n+  kind: string;\n }\n \n const userSchema = new mongoose.Schema({\n-    email: { type: String, unique: true },\n-    password: String,\n-    passwordResetToken: String,\n-    passwordResetExpires: Date,\n+  email: { type: String, unique: true },\n+  password: String,\n+  passwordResetToken: String,\n+  passwordResetExpires: Date,\n \n-    facebook: String,\n-    twitter: String,\n-    google: String,\n-    tokens: Array,\n+  facebook: String,\n+  twitter: String,\n+  google: String,\n+  tokens: Array,\n \n-    profile: {\n-        name: String,\n-        gender: String,\n-        location: String,\n-        website: String,\n-        picture: String\n-    }\n+  profile: {\n+    name: String,\n+    gender: String,\n+    location: String,\n+    website: String,\n+    picture: String\n+  }\n }, { timestamps: true });\n \n /**\n  * Password hash middleware.\n  */\n userSchema.pre("save", function save(next) {\n-    const user = this as UserDocument;\n-    if (!user.isModified("password")) { return next(); }\n-    bcrypt.genSalt(10, (err, salt) => {\n-        if (err) { return next(err); }\n-        bcrypt.hash(user.password, salt, undefined, (err: mongoose.Error, hash) => {\n-            if (err) { return next(err); }\n-            user.password = hash;\n-            next();\n-        });\n+  const user = this as UserDocument;\n',
              id: 491,
              new_file: false,
              new_path: 'src/models/User.ts',
              old_path: 'src/models/User.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-09-07T16:18:00+0800',
            discussion_id: null,
            id: 52,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 4,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 4,
              deleted_file: false,
              diff: '@@ -66,7 +66,7 @@ passport.use(new FacebookStrategy({\n     callbackURL: "/auth/facebook/callback",\n',
              id: 1087,
              new_file: false,
              new_path: 'src/config/passport.ts',
              old_path: 'src/config/passport.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: '761e3f18c863ddeee900bf74ddd8fed56a4aa2c9_0_38',
            line_type: 'old',
            note: '测试',
            noteable_id: 1632,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/config/passport.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 4,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: null,
              compare_diff_id: 17605,
              del_line_num: 4,
              deleted_file: false,
              diff: '@@ -66,7 +66,7 @@ passport.use(new FacebookStrategy({\n     callbackURL: "/auth/facebook/callback",\n',
              id: 489,
              new_file: false,
              new_path: 'src/config/passport.ts',
              old_path: 'src/config/passport.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-09-16T11:52:52+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'jiankan.hjk@test.com',
          extern_uid: '130095',
          id: 15319,
          name: '剑侃',
          state: 'active',
          username: 'jiankan.hjk',
          web_url: 'https://test.com.com/nwpipe/u/130095',
        },
        body: null,
        created_at: '2020-11-16T19:37:52+08:00',
        id: 1765,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            commit_id: null,
            created_at: '2022-01-26T11:01:53+0800',
            discussion_id: 176,
            id: 500030,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'Problem status changed to resolved',
            noteable_id: 1765,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: true,
            type: 'Comment',
            updated_at: '2022-01-26T11:01:53+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            commit_id: null,
            created_at: '2022-01-25T15:52:22+0800',
            discussion_id: 176,
            id: 500023,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'Problem status changed to opened',
            noteable_id: 1765,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: true,
            type: 'Comment',
            updated_at: '2022-01-25T15:52:22+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'taian.lta@test.com',
              extern_uid: '146194',
              id: 15165,
              name: '伊北',
              state: 'active',
              username: 'taian.lta',
              web_url: 'https://test.com.com/nwpipe/u/146194',
            },
            commit_id: null,
            created_at: '2020-11-26T11:23:06+0800',
            discussion_id: 176,
            id: 185,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: 'Problem status changed to resolved',
            noteable_id: 1765,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: true,
            type: 'Comment',
            updated_at: '2020-11-26T11:23:06+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'jiankan.hjk@test.com',
              extern_uid: '130095',
              id: 15319,
              name: '剑侃',
              state: 'active',
              username: 'jiankan.hjk',
              web_url: 'https://test.com.com/nwpipe/u/130095',
            },
            commit_id: null,
            created_at: '2020-11-16T19:37:53+0800',
            discussion_id: null,
            id: 176,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 0,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 1,
              deleted_file: false,
              diff: '@@ -1,4 +1,3 @@\n-# TypeScript Node Starter\n > hello world typescript\n \n The main purpose of this repository is to show a working Node.js API Server + front-end project and workflow for writing Node code in TypeScript.\n',
              id: 1075,
              new_file: false,
              new_path: 'README.md',
              old_path: 'README.md',
              renamed_file: false,
              too_large: false,
            },
            line_code: '8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d_5_4',
            line_type: 'old',
            note: '测试',
            noteable_id: 1765,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'README.md',
            resolved_at: '2022-01-26T11:01:53+08:00',
            resolved_by: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            st_diff: {
              a_mode: '100644',
              add_line_num: 0,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 1,
              deleted_file: false,
              diff: '@@ -1,4 +1,3 @@\n-# TypeScript Node Starter\n > hello world typescript\n \n The main purpose of this repository is to show a working Node.js API Server + front-end project and workflow for writing Node code in TypeScript.\n',
              id: 1075,
              new_file: false,
              new_path: 'README.md',
              old_path: 'README.md',
              renamed_file: false,
              too_large: false,
            },
            state: 'resolved',
            system: false,
            type: 'Problem',
            updated_at: '2021-05-20T14:27:46+0800',
          },
        ],
        updated_at: '2020-11-17T10:31:07+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'winjo.gwj@test.com',
          extern_uid: '190046',
          id: 15346,
          name: '彦熹',
          state: 'active',
          username: 'winjo.gwj',
          web_url: 'https://test.com.com/nwpipe/u/190046',
        },
        body: null,
        created_at: '2020-11-12T15:29:34+08:00',
        id: 1759,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'winjo.gwj@test.com',
              extern_uid: '190046',
              id: 15346,
              name: '彦熹',
              state: 'active',
              username: 'winjo.gwj',
              web_url: 'https://test.com.com/nwpipe/u/190046',
            },
            commit_id: null,
            created_at: '2021-07-22T17:21:21+0800',
            discussion_id: null,
            id: 200002,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '0',
              add_line_num: 12,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,12 @@\n+{\n+  "name": "aaa",\n+  "version": "1.0.0",\n+  "description": "",\n+  "main": "index.js",\n',
              id: 1079,
              new_file: true,
              new_path: 'aaa/package.json',
              old_path: 'aaa/package.json',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'a1cd6d42683feafb8bafa3c3c68369f59d3013e6_0_5',
            line_type: 'new',
            note: '测试下',
            noteable_id: 1759,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'aaa/package.json',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '0',
              add_line_num: 12,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,12 @@\n+{\n+  "name": "aaa",\n+  "version": "1.0.0",\n+  "description": "",\n+  "main": "index.js",\n',
              id: 1079,
              new_file: true,
              new_path: 'aaa/package.json',
              old_path: 'aaa/package.json',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-07-22T17:21:21+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'winjo.gwj@test.com',
              extern_uid: '190046',
              id: 15346,
              name: '彦熹',
              state: 'active',
              username: 'winjo.gwj',
              web_url: 'https://test.com.com/nwpipe/u/190046',
            },
            commit_id: null,
            created_at: '2020-11-12T15:29:34+0800',
            discussion_id: null,
            id: 171,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 0,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 1,
              deleted_file: false,
              diff: '@@ -1,4 +1,3 @@\n-# TypeScript Node Starter\n > hello world typescript\n \n The main purpose of this repository is to show a working Node.js API Server + front-end project and workflow for writing Node code in TypeScript.\n',
              id: 1075,
              new_file: false,
              new_path: 'README.md',
              old_path: 'README.md',
              renamed_file: false,
              too_large: false,
            },
            line_code: '8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d_6_4',
            line_type: 'old',
            note: 'test',
            noteable_id: 1759,
            noteable_type: 'ReviewComment',
            outdated: true,
            path: 'README.md',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 0,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: 'ac55c77aa72d49280058ed6054610f454ee694b1',
              compare_diff_id: 20699,
              del_line_num: 1,
              deleted_file: false,
              diff: '@@ -1,4 +1,3 @@\n-# TypeScript Node Starter\n > hello world typescript\n \n The main purpose of this repository is to show a working Node.js API Server + front-end project and workflow for writing Node code in TypeScript.\n',
              id: 550,
              new_file: false,
              new_path: 'README.md',
              old_path: 'README.md',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2020-11-12T15:29:34+0800',
          },
        ],
        updated_at: '2021-07-22T17:21:24+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'winjo.gwj@test.com',
          extern_uid: '190046',
          id: 15346,
          name: '彦熹',
          state: 'active',
          username: 'winjo.gwj',
          web_url: 'https://test.com.com/nwpipe/u/190046',
        },
        body: null,
        created_at: '2021-07-22T17:21:53+08:00',
        id: 2100002,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'winjo.gwj@test.com',
              extern_uid: '190046',
              id: 15346,
              name: '彦熹',
              state: 'active',
              username: 'winjo.gwj',
              web_url: 'https://test.com.com/nwpipe/u/190046',
            },
            commit_id: null,
            created_at: '2021-07-23T16:22:54+0800',
            discussion_id: null,
            id: 300003,
            is_award: false,
            labels: ['LackOfJavaBase'],
            latest_st_diff: {
              a_mode: '100644',
              add_line_num: 4,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 4,
              deleted_file: false,
              diff: '@@ -4,7 +4,7 @@ import passportFacebook from "passport-facebook";\n import _ from "lodash";\n \n // import { User, UserType } from \'../models/User\';\n-import { User, UserDocument } from "../models/User";\n+import { User, UserDocument } from "../models/User"\n import { Request, Response, NextFunction } from "express";\n \n const LocalStrategy = passportLocal.Strategy;\n',
              id: 1087,
              new_file: false,
              new_path: 'src/config/passport.ts',
              old_path: 'src/config/passport.ts',
              renamed_file: false,
              too_large: false,
            },
            line_code: '761e3f18c863ddeee900bf74ddd8fed56a4aa2c9_10_10',
            line_type: 'old',
            note: 'test',
            noteable_id: 2100002,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'src/config/passport.ts',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '100644',
              add_line_num: 4,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 4,
              deleted_file: false,
              diff: '@@ -4,7 +4,7 @@ import passportFacebook from "passport-facebook";\n import _ from "lodash";\n \n // import { User, UserType } from \'../models/User\';\n-import { User, UserDocument } from "../models/User";\n+import { User, UserDocument } from "../models/User"\n import { Request, Response, NextFunction } from "express";\n \n const LocalStrategy = passportLocal.Strategy;\n',
              id: 1087,
              new_file: false,
              new_path: 'src/config/passport.ts',
              old_path: 'src/config/passport.ts',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-07-23T16:22:54+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'winjo.gwj@test.com',
              extern_uid: '190046',
              id: 15346,
              name: '彦熹',
              state: 'active',
              username: 'winjo.gwj',
              web_url: 'https://test.com.com/nwpipe/u/190046',
            },
            commit_id: null,
            created_at: '2021-07-23T16:22:44+0800',
            discussion_id: 60,
            id: 300002,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: '666',
            noteable_id: 2100002,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2021-07-23T16:22:44+0800',
          },
        ],
        updated_at: '2021-07-23T16:23:01+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'guqiankun.gqk@test.com',
          extern_uid: '354626',
          id: 5600024,
          name: '轻游',
          state: 'active',
          username: 'guqiankun.gqk',
          web_url: 'https://test.com.com/nwpipe/u/354626',
        },
        body: null,
        created_at: '2022-01-19T15:20:27+08:00',
        id: 4700002,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            commit_id: null,
            created_at: '2022-01-19T15:21:02+0800',
            discussion_id: null,
            id: 500004,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '0',
              add_line_num: 12,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,12 @@\n+{\n+  "name": "aaa",\n+  "version": "1.0.0",\n+  "description": "",\n+  "main": "index.js",\n+  "scripts": {\n+    "test": "echo \\"Error: no test specified\\" && exit 1"\n+  },\n+  "keywords": [],\n',
              id: 1079,
              new_file: true,
              new_path: 'aaa/package.json',
              old_path: 'aaa/package.json',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'a1cd6d42683feafb8bafa3c3c68369f59d3013e6_0_9',
            line_type: 'new',
            note: '333',
            noteable_id: 4700002,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'aaa/package.json',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '0',
              add_line_num: 12,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,12 @@\n+{\n+  "name": "aaa",\n+  "version": "1.0.0",\n+  "description": "",\n+  "main": "index.js",\n+  "scripts": {\n+    "test": "echo \\"Error: no test specified\\" && exit 1"\n+  },\n+  "keywords": [],\n',
              id: 1079,
              new_file: true,
              new_path: 'aaa/package.json',
              old_path: 'aaa/package.json',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2022-01-19T15:21:02+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            commit_id: null,
            created_at: '2022-01-19T15:20:44+0800',
            discussion_id: null,
            id: 500003,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '0',
              add_line_num: 12,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,12 @@\n+{\n+  "name": "aaa",\n+  "version": "1.0.0",\n+  "description": "",\n+  "main": "index.js",\n+  "scripts": {\n+    "test": "echo \\"Error: no test specified\\" && exit 1"\n',
              id: 1079,
              new_file: true,
              new_path: 'aaa/package.json',
              old_path: 'aaa/package.json',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'a1cd6d42683feafb8bafa3c3c68369f59d3013e6_0_7',
            line_type: 'new',
            note: '222',
            noteable_id: 4700002,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'aaa/package.json',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '0',
              add_line_num: 12,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,12 @@\n+{\n+  "name": "aaa",\n+  "version": "1.0.0",\n+  "description": "",\n+  "main": "index.js",\n+  "scripts": {\n+    "test": "echo \\"Error: no test specified\\" && exit 1"\n',
              id: 1079,
              new_file: true,
              new_path: 'aaa/package.json',
              old_path: 'aaa/package.json',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2022-01-19T15:20:44+0800',
          },
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            commit_id: null,
            created_at: '2022-01-19T15:20:28+0800',
            discussion_id: null,
            id: 500002,
            is_award: false,
            labels: [],
            latest_st_diff: {
              a_mode: '0',
              add_line_num: 12,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,12 @@\n+{\n+  "name": "aaa",\n+  "version": "1.0.0",\n+  "description": "",\n+  "main": "index.js",\n',
              id: 1079,
              new_file: true,
              new_path: 'aaa/package.json',
              old_path: 'aaa/package.json',
              renamed_file: false,
              too_large: false,
            },
            line_code: 'a1cd6d42683feafb8bafa3c3c68369f59d3013e6_0_5',
            line_type: 'new',
            note: '111',
            noteable_id: 4700002,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: 'aaa/package.json',
            resolved_at: null,
            resolved_by: null,
            st_diff: {
              a_mode: '0',
              add_line_num: 12,
              b_mode: '100644',
              binary_file: false,
              charset_name: 'UTF-8',
              commit_sha: '87ed08a7245161fc9675981be01a6effe661b803',
              compare_diff_id: 31918,
              del_line_num: 0,
              deleted_file: false,
              diff: '@@ -0,0 +1,12 @@\n+{\n+  "name": "aaa",\n+  "version": "1.0.0",\n+  "description": "",\n+  "main": "index.js",\n',
              id: 1079,
              new_file: true,
              new_path: 'aaa/package.json',
              old_path: 'aaa/package.json',
              renamed_file: false,
              too_large: false,
            },
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2022-01-19T15:20:28+0800',
          },
        ],
        updated_at: '2022-01-19T15:22:55+08:00',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'guqiankun.gqk@test.com',
          extern_uid: '354626',
          id: 5600024,
          name: '轻游',
          state: 'active',
          username: 'guqiankun.gqk',
          web_url: 'https://test.com.com/nwpipe/u/354626',
        },
        body: null,
        created_at: '2022-01-26T02:16:02+08:00',
        id: 4700010,
        pending: false,
        pull_request_id: 13055,
        review_notes: [
          {
            author: {
              avatar_url:
                'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
              email: 'guqiankun.gqk@test.com',
              extern_uid: '354626',
              id: 5600024,
              name: '轻游',
              state: 'active',
              username: 'guqiankun.gqk',
              web_url: 'https://test.com.com/nwpipe/u/354626',
            },
            commit_id: null,
            created_at: '2022-01-26T11:01:34+0800',
            discussion_id: 176,
            id: 500029,
            is_award: false,
            labels: [],
            latest_st_diff: null,
            line_code: null,
            line_type: null,
            note: '> <!-- reply id="176" -->\n> 测试\n\n123',
            noteable_id: 4700010,
            noteable_type: 'ReviewComment',
            outdated: false,
            path: null,
            resolved_at: null,
            resolved_by: null,
            st_diff: null,
            state: null,
            system: false,
            type: 'Comment',
            updated_at: '2022-01-26T11:01:34+0800',
          },
        ],
        updated_at: '2022-01-26T11:01:39+08:00',
      },
    ],
    notes: [
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'taian.lta@test.com',
          extern_uid: '146194',
          id: 15165,
          name: '伊北',
          state: 'active',
          username: 'taian.lta',
          web_url: 'https://test.com.com/nwpipe/u/146194',
        },
        commit_id: null,
        created_at: '2020-10-12T18:54:04+0800',
        discussion_id: null,
        id: 121,
        is_award: false,
        labels: [],
        latest_st_diff: null,
        line_code: null,
        line_type: null,
        note: '[Force Push] To feat/123123 Of commit: daa3e131 - fix: li in pr desc',
        noteable_id: 13055,
        noteable_type: 'PullRequest',
        outdated: false,
        path: null,
        resolved_at: null,
        resolved_by: null,
        st_diff: null,
        state: null,
        system: true,
        type: 'Comment',
        updated_at: '2020-10-12T18:54:04+0800',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'taian.lta@test.com',
          extern_uid: '146194',
          id: 15165,
          name: '伊北',
          state: 'active',
          username: 'taian.lta',
          web_url: 'https://test.com.com/nwpipe/u/146194',
        },
        commit_id: null,
        created_at: '2020-10-12T18:54:04+0800',
        discussion_id: null,
        id: 120,
        is_award: false,
        labels: [],
        latest_st_diff: null,
        line_code: null,
        line_type: null,
        note: 'review tasks reopened',
        noteable_id: 13055,
        noteable_type: 'PullRequest',
        outdated: false,
        path: null,
        resolved_at: null,
        resolved_by: null,
        st_diff: null,
        state: null,
        system: true,
        type: 'Comment',
        updated_at: '2020-10-12T18:54:04+0800',
      },
      {
        author: {
          avatar_url:
            'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
          email: 'taian.lta@test.com',
          extern_uid: '146194',
          id: 15165,
          name: '伊北',
          state: 'active',
          username: 'taian.lta',
          web_url: 'https://test.com.com/nwpipe/u/146194',
        },
        commit_id: null,
        created_at: '2020-10-12T18:52:43+0800',
        discussion_id: null,
        id: 117,
        is_award: false,
        labels: [],
        latest_st_diff: null,
        line_code: null,
        line_type: null,
        note: 'Added 2 commits:\n\n* 0cee41f8 - feat: 123\n* 46e1c30f - 123',
        noteable_id: 13055,
        noteable_type: 'PullRequest',
        outdated: false,
        path: null,
        resolved_at: null,
        resolved_by: null,
        st_diff: null,
        state: null,
        system: true,
        type: 'Comment',
        updated_at: '2020-10-12T18:52:43+0800',
      },
    ],
    pending_review: null,
  },
  '/api/v3/projects/42422/pull_requests/13055/diffs/mark_files': [
    {
      file_path_sha: '8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d',
      mark_as_read: true,
      updated_after_read: false,
    },
    {
      file_path_sha: 'a1cd6d42683feafb8bafa3c3c68369f59d3013e6',
      mark_as_read: true,
      updated_after_read: false,
    },
  ],
  '/webapi/projects/42422/pull_requests/13055/diffs/31918/changes_overview': [
    {
      a_mode: '100644',
      add_line_num: 0,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 1,
      deleted_file: false,
      id: 1075,
      mark_as_read: true,
      new_file: false,
      new_path: 'README.md',
      old_path: 'README.md',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 1,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 0,
      deleted_file: false,
      id: 1076,
      mark_as_read: false,
      new_file: true,
      new_path: 'a.md',
      old_path: 'a.md',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 228,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 0,
      deleted_file: false,
      id: 1077,
      mark_as_read: false,
      new_file: true,
      new_path: 'a.ts',
      old_path: 'a.ts',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 1,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 0,
      deleted_file: false,
      id: 1078,
      mark_as_read: false,
      new_file: true,
      new_path: 'aa.md',
      old_path: 'aa.md',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 12,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 0,
      deleted_file: false,
      id: 1079,
      mark_as_read: true,
      new_file: true,
      new_path: 'aaa/package.json',
      old_path: 'aaa/package.json',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 0,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 0,
      deleted_file: false,
      id: 1080,
      mark_as_read: false,
      new_file: true,
      new_path: 'apiMeta.json',
      old_path: 'apiMeta.json',
      renamed_file: false,
      too_large: true,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 0,
      b_mode: '100644',
      binary_file: true,
      compare_diff_id: 31918,
      del_line_num: 0,
      deleted_file: false,
      id: 1081,
      mark_as_read: false,
      new_file: true,
      new_path: 'assets/logo_white.gif',
      old_path: 'assets/logo_white.gif',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 0,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 0,
      deleted_file: false,
      id: 1082,
      mark_as_read: false,
      new_file: false,
      new_path: 'assets/斋藤飞鸟1.jpg',
      old_path: 'assets/斋藤飞鸟.jpg',
      renamed_file: true,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 0,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 0,
      deleted_file: false,
      id: 1083,
      mark_as_read: false,
      new_file: true,
      new_path: 'b.md',
      old_path: 'b.md',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 3,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 0,
      deleted_file: false,
      id: 1084,
      mark_as_read: false,
      new_file: true,
      new_path: 'gbk.ts',
      old_path: 'gbk.ts',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 12,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 0,
      deleted_file: false,
      id: 1085,
      mark_as_read: false,
      new_file: true,
      new_path: 'hk-cdp_ALL_api#space#info#popUp.json',
      old_path: 'hk-cdp_ALL_api#space#info#popUp.json',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 168,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 0,
      deleted_file: false,
      id: 1086,
      mark_as_read: false,
      new_file: true,
      new_path: 'pom.xml',
      old_path: 'pom.xml',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 4,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 4,
      deleted_file: false,
      id: 1087,
      mark_as_read: false,
      new_file: false,
      new_path: 'src/config/passport.ts',
      old_path: 'src/config/passport.ts',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 265,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 265,
      deleted_file: false,
      id: 1088,
      mark_as_read: false,
      new_file: false,
      new_path: 'src/controllers/user.ts',
      old_path: 'src/controllers/user.ts',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 49,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 49,
      deleted_file: false,
      id: 1089,
      mark_as_read: false,
      new_file: false,
      new_path: 'src/models/User.ts',
      old_path: 'src/models/User.ts',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 0,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 1,
      deleted_file: false,
      id: 1090,
      mark_as_read: false,
      new_file: false,
      new_path: 'src/public/css/main.scss',
      old_path: 'src/public/css/main.scss',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 1,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 1,
      deleted_file: false,
      id: 1091,
      mark_as_read: false,
      new_file: false,
      new_path: 'src/server.ts',
      old_path: 'src/server.ts',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 7,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 7,
      deleted_file: false,
      id: 1092,
      mark_as_read: false,
      new_file: false,
      new_path: 'src/util/logger.ts',
      old_path: 'src/util/logger.ts',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 0,
      b_mode: '0',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 22,
      deleted_file: true,
      id: 1093,
      mark_as_read: false,
      new_file: false,
      new_path: 'tsconfig.json',
      old_path: 'tsconfig.json',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 2,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 2,
      deleted_file: false,
      id: 1094,
      mark_as_read: false,
      new_file: false,
      new_path: 'views/contact123.pug',
      old_path: 'views/contact.pug',
      renamed_file: true,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 0,
      b_mode: '0',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 27,
      deleted_file: true,
      id: 1095,
      mark_as_read: false,
      new_file: false,
      new_path: 'views/home.pug',
      old_path: 'views/home.pug',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 0,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 31918,
      del_line_num: 0,
      deleted_file: false,
      id: 1096,
      mark_as_read: false,
      new_file: false,
      new_path: 'views/partials/footer-renamed.pug',
      old_path: 'views/partials/footer.pug',
      renamed_file: true,
      too_large: false,
      updated_after_read: false,
    },
  ],
  '/api/v3/projects/42422/repository/blobs/df72e4d1c394af6d1c21cd042116f83a792fa8c6': `{\n\"name\": \"bbb\",\n\"version\": \"2.0.0\",\n\"description\": \"\",\n\"main\": \"test.js\",\n\"scripts\": {\n\"test\": \"echo \"Error: no test specified\" && exit 1\"\n},\n\"keywords\": [],\n\"license\": \"ISC\"\n}`,
  '/api/v3/projects/42422/repository/blobs/87ed08a7245161fc9675981be01a6effe661b803': `{\n\"name\": \"aaa\",\n\"version\": \"1.0.0\",\n\"description\": \"\",\n\"main\": \"index.js\",\n\"scripts\": {\n\"test\": \"echo \"Error: no test specified\" && exit 1\"\n},\n\"keywords\": [],\n\"author\": \"\",\n\"license\": \"ISC\"\n}`,
  '/webapi/projects/42422/pull_requests/13055/diffs/31918/changes/1079': {
    a_mode: '0',
    add_line_num: 12,
    b_mode: '100644',
    binary_file: false,
    charset_name: 'UTF-8',
    commit_sha: null,
    compare_diff_id: 31918,
    del_line_num: 0,
    deleted_file: false,
    diff: '@@ -0,0 +1,12 @@\n+{\n+  "name": "aaa",\n+  "version": "1.0.0",\n+  "description": "",\n+  "main": "index.js",\n+  "scripts": {\n+    "test": "echo \\"Error: no test specified\\" && exit 1"\n+  },\n+  "keywords": [],\n+  "author": "",\n+  "license": "ISC"\n+}\n',
    highlighted_diff: null,
    id: 1079,
    new_file: true,
    new_path: 'aaa/package.json',
    old_path: 'aaa/package.json',
    renamed_file: false,
    too_large: false,
  },
  '/api/v3/projects/42422/pull_requests/13055/reviews': {
    author: {
      avatar_url:
        'https://img.alicdn.com/imgextra/i4/O1CN01tPoJQo20M1TueWZet_!!6000000006834-0-tps-80-80.jpg',
      email: 'guqiankun.gqk@test.net',
      extern_uid: '354626',
      id: 5600024,
      name: '轻游',
      state: 'active',
      username: 'guqiankun.gqk',
      web_url: ' ',
    },
    body: null,
    created_at: '2022-07-15T16:57:34.591+08:00',
    id: 5100024,
    pending: true,
    pull_request_id: 12600136,
    updated_at: '2022-07-15T16:57:34.591+08:00',
  },
  '/webapi/projects/42422/pull_requests/13055/diffs/20699/changes_overview': [
    {
      a_mode: '100644',
      add_line_num: 0,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 1,
      deleted_file: false,
      id: 550,
      mark_as_read: true,
      new_file: false,
      new_path: 'README.md',
      old_path: 'README.md',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 1,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 0,
      deleted_file: false,
      id: 551,
      mark_as_read: false,
      new_file: true,
      new_path: 'a.md',
      old_path: 'a.md',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 228,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 0,
      deleted_file: false,
      id: 552,
      mark_as_read: false,
      new_file: true,
      new_path: 'a.ts',
      old_path: 'a.ts',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 1,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 0,
      deleted_file: false,
      id: 553,
      mark_as_read: false,
      new_file: true,
      new_path: 'aa.md',
      old_path: 'aa.md',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 12,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 0,
      deleted_file: false,
      id: 554,
      mark_as_read: true,
      new_file: true,
      new_path: 'aaa/package.json',
      old_path: 'aaa/package.json',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 0,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 0,
      deleted_file: false,
      id: 555,
      mark_as_read: false,
      new_file: true,
      new_path: 'apiMeta.json',
      old_path: 'apiMeta.json',
      renamed_file: false,
      too_large: true,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 0,
      b_mode: '100644',
      binary_file: true,
      compare_diff_id: 20699,
      del_line_num: 0,
      deleted_file: false,
      id: 556,
      mark_as_read: false,
      new_file: true,
      new_path: 'assets/logo_white.gif',
      old_path: 'assets/logo_white.gif',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 0,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 0,
      deleted_file: false,
      id: 557,
      mark_as_read: false,
      new_file: false,
      new_path: 'assets/斋藤飞鸟1.jpg',
      old_path: 'assets/斋藤飞鸟.jpg',
      renamed_file: true,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 0,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 0,
      deleted_file: false,
      id: 558,
      mark_as_read: false,
      new_file: true,
      new_path: 'b.md',
      old_path: 'b.md',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 3,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 0,
      deleted_file: false,
      id: 559,
      mark_as_read: false,
      new_file: true,
      new_path: 'gbk.ts',
      old_path: 'gbk.ts',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '0',
      add_line_num: 168,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 0,
      deleted_file: false,
      id: 560,
      mark_as_read: false,
      new_file: true,
      new_path: 'pom.xml',
      old_path: 'pom.xml',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 4,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 4,
      deleted_file: false,
      id: 561,
      mark_as_read: true,
      new_file: false,
      new_path: 'src/config/passport.ts',
      old_path: 'src/config/passport.ts',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 265,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 265,
      deleted_file: false,
      id: 562,
      mark_as_read: false,
      new_file: false,
      new_path: 'src/controllers/user.ts',
      old_path: 'src/controllers/user.ts',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 49,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 49,
      deleted_file: false,
      id: 563,
      mark_as_read: false,
      new_file: false,
      new_path: 'src/models/User.ts',
      old_path: 'src/models/User.ts',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 0,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 1,
      deleted_file: false,
      id: 564,
      mark_as_read: false,
      new_file: false,
      new_path: 'src/public/css/main.scss',
      old_path: 'src/public/css/main.scss',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 1,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 1,
      deleted_file: false,
      id: 565,
      mark_as_read: false,
      new_file: false,
      new_path: 'src/server.ts',
      old_path: 'src/server.ts',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 7,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 7,
      deleted_file: false,
      id: 566,
      mark_as_read: false,
      new_file: false,
      new_path: 'src/util/logger.ts',
      old_path: 'src/util/logger.ts',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 0,
      b_mode: '0',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 22,
      deleted_file: true,
      id: 567,
      mark_as_read: false,
      new_file: false,
      new_path: 'tsconfig.json',
      old_path: 'tsconfig.json',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 2,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 2,
      deleted_file: false,
      id: 568,
      mark_as_read: false,
      new_file: false,
      new_path: 'views/contact123.pug',
      old_path: 'views/contact.pug',
      renamed_file: true,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 0,
      b_mode: '0',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 27,
      deleted_file: true,
      id: 569,
      mark_as_read: false,
      new_file: false,
      new_path: 'views/home.pug',
      old_path: 'views/home.pug',
      renamed_file: false,
      too_large: false,
      updated_after_read: false,
    },
    {
      a_mode: '100644',
      add_line_num: 0,
      b_mode: '100644',
      binary_file: false,
      compare_diff_id: 20699,
      del_line_num: 0,
      deleted_file: false,
      id: 570,
      mark_as_read: false,
      new_file: false,
      new_path: 'views/partials/footer-renamed.pug',
      old_path: 'views/partials/footer.pug',
      renamed_file: true,
      too_large: false,
      updated_after_read: false,
    },
  ],
  // '/webapi/projects/42422/repository/diffs': {
  //   diffs: [
  //     {
  //       a_mode: '0',
  //       b_mode: '100644',
  //       binary_file: false,
  //       charset_name: 'UTF-8',
  //       deleted_file: false,
  //       diff: '@@ -0,0 +1,3 @@\n+���� �� 6 days ago ����������\n+������\n+123\n\\ No newline at end of file\n',
  //       new_file: true,
  //       new_path: 'gbk.ts',
  //       old_path: 'gbk.ts',
  //       renamed_file: false,
  //       too_large: false,
  //     },
  //     {
  //       a_mode: '0',
  //       b_mode: '100644',
  //       binary_file: false,
  //       charset_name: 'UTF-8',
  //       deleted_file: false,
  //       diff: '@@ -0,0 +1,12 @@\n+{\n+  "name": "aaa",\n+  "version": "1.0.0",\n+  "description": "",\n+  "main": "index.js",\n+  "scripts": {\n+    "test": "echo \\"Error: no test specified\\" && exit 1"\n+  },\n+  "keywords": [],\n+  "author": "",\n+  "license": "ISC"\n+}\n\\ No newline at end of file\n',
  //       new_file: true,
  //       new_path: 'hk-cdp_ALL_api#space#info#popUp.json',
  //       old_path: 'hk-cdp_ALL_api#space#info#popUp.json',
  //       renamed_file: false,
  //       too_large: false,
  //     },
  //   ],
  //   overflow: false,
  // },
  // blame 插件提供的数据
  '/api/v3/projects/42422/repository/blame': [
    {
      commit: {
        author: null,
        author_email: 'taian.lta@test.com',
        author_name: 'taian.lta',
        authored_date: '2020-08-18T12:09:32+0800',
        committed_date: '2020-08-18T12:09:32+0800',
        committer: null,
        committer_email: 'taian.lta@test.com',
        committer_name: 'taian.lta',
        created_at: '2020-08-18T12:09:32+0800',
        id: '7c501a19ae4644814782622af41b72e0f65eaacd',
        message: ' feat: 123',
        parent_ids: null,
        short_id: '7c501a19',
        title: ' feat: 123',
        tree_hash: null,
      },
      lines: [{ current_number: 1, effect_line: 12, previous_number: 1 }],
    },
    {
      commit: {
        author: null,
        author_email: 'taian.lta@test.com',
        author_name: 'taian.lta',
        authored_date: '2020-08-18T12:09:32+0800',
        committed_date: '2020-08-18T12:09:32+0800',
        committer: null,
        committer_email: 'taian.lta@test.com',
        committer_name: 'taian.lta',
        created_at: '2020-08-18T12:09:32+0800',
        id: '7c501a19ae4644814782622af41b72e0f65eaacd2',
        message: ' feat: 123',
        parent_ids: null,
        short_id: '7c501a19',
        title: ' feat: 123',
        tree_hash: null,
      },
      lines: [{ current_number: 15, effect_line: 10, previous_number: 1 }],
    },
  ],
};
