From 3bde1379bf94fc5875d808b267e138b6e44adf47 Mon Sep 17 00:00:00 2001 From: Bhaumik Joshi Date: Tue, 31 Aug 2021 00:30:16 +0530 Subject: [PATCH 1/7] upgraded pg version, for connecting to db --- server/package.json | 2 +- server/yarn.lock | 92 ++++++++++++++++++++++++++------------------- 2 files changed, 55 insertions(+), 39 deletions(-) diff --git a/server/package.json b/server/package.json index afab03f..4dcbb0e 100644 --- a/server/package.json +++ b/server/package.json @@ -23,7 +23,7 @@ "express": "^4.17.1", "graphql": "^14.5.6", "jsonwebtoken": "^8.5.1", - "pg": "^7.3.0", + "pg": "^8.7.1", "reflect-metadata": "^0.1.10", "type-graphql": "^0.17.5", "typeorm": "0.2.19" diff --git a/server/yarn.lock b/server/yarn.lock index 4f2db39..a5a233d 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -2447,20 +2447,25 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -pg-connection-string@0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7" - integrity sha1-2hhHsglA5C7hSSvq9l1J2RskXfc= +pg-connection-string@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34" + integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== pg-int8@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-pool@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-2.0.7.tgz#f14ecab83507941062c313df23f6adcd9fd0ce54" - integrity sha512-UiJyO5B9zZpu32GSlP0tXy8J2NsJ9EFGFfz5v6PSbdz/1hBLX1rNiiy5+mAm5iJJYwfCv4A0EBcQLGWwjbpzZw== +pg-pool@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.4.1.tgz#0e71ce2c67b442a5e862a9c182172c37eda71e9c" + integrity sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ== + +pg-protocol@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.5.0.tgz#b5dd452257314565e2d54ab3c132adc46565a6a0" + integrity sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ== pg-types@^2.1.0: version "2.2.0" @@ -2473,25 +2478,25 @@ pg-types@^2.1.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@^7.3.0: - version "7.12.1" - resolved "https://registry.yarnpkg.com/pg/-/pg-7.12.1.tgz#880636d46d2efbe0968e64e9fe0eeece8ef72a7e" - integrity sha512-l1UuyfEvoswYfcUe6k+JaxiN+5vkOgYcVSbSuw3FvdLqDbaoa2RJo1zfJKfPsSYPFVERd4GHvX3s2PjG1asSDA== +pg@^8.7.1: + version "8.7.1" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.7.1.tgz#9ea9d1ec225980c36f94e181d009ab9f4ce4c471" + integrity sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA== dependencies: buffer-writer "2.0.0" packet-reader "1.0.0" - pg-connection-string "0.1.3" - pg-pool "^2.0.4" + pg-connection-string "^2.5.0" + pg-pool "^3.4.1" + pg-protocol "^1.5.0" pg-types "^2.1.0" pgpass "1.x" - semver "4.3.2" pgpass@1.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306" - integrity sha1-Knu0G2BltnkH6R2hsHwYR8h3swY= + version "1.0.4" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.4.tgz#85eb93a83800b20f8057a2b029bf05abaf94ea9c" + integrity sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w== dependencies: - split "^1.0.0" + split2 "^3.1.1" pify@^3.0.0: version "3.0.0" @@ -2514,9 +2519,9 @@ postgres-bytea@~1.0.0: integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= postgres-date@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.4.tgz#1c2728d62ef1bff49abdd35c1f86d4bdf118a728" - integrity sha512-bESRvKVuTrjoBluEcpv2346+6kgB7UlnqWZsnbnCccTNq/pqfj1j6oBaN5+b/NrDXepYUT/HKadqv3iS9lJuVA== + version "1.0.7" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== postgres-interval@^1.1.0: version "1.2.0" @@ -2615,6 +2620,15 @@ readable-stream@^2.0.2, readable-stream@^2.0.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.0.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -2709,6 +2723,11 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -2733,11 +2752,6 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -semver@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" - integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= - semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -2893,12 +2907,12 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== +split2@^3.1.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== dependencies: - through "2" + readable-stream "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" @@ -2965,6 +2979,13 @@ string.prototype.trimright@^2.0.0: define-properties "^1.1.3" function-bind "^1.1.1" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -3065,11 +3086,6 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -through@2: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" @@ -3263,7 +3279,7 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= From 176b62a8c367cccb31040b8d829364a73ba0f9ca Mon Sep 17 00:00:00 2001 From: Bhaumik Joshi Date: Tue, 31 Aug 2021 00:35:26 +0530 Subject: [PATCH 2/7] removed refresh_token route --- server/src/index.ts | 39 ++++----------------------------------- 1 file changed, 4 insertions(+), 35 deletions(-) diff --git a/server/src/index.ts b/server/src/index.ts index 3c09362..5e98294 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -6,52 +6,21 @@ import { buildSchema } from "type-graphql"; import { UserResolver } from "./UserResolver"; import { createConnection } from "typeorm"; import cookieParser from "cookie-parser"; -import { verify } from "jsonwebtoken"; import cors from "cors"; -import { User } from "./entity/User"; -import { sendRefreshToken } from "./sendRefreshToken"; -import { createAccessToken, createRefreshToken } from "./auth"; (async () => { const app = express(); app.use( cors({ origin: "http://localhost:3000", - credentials: true + credentials: true, + exposedHeaders: [ + "access-token" + ] }) ); app.use(cookieParser()); app.get("/", (_req, res) => res.send("hello")); - app.post("/refresh_token", async (req, res) => { - const token = req.cookies.jid; - if (!token) { - return res.send({ ok: false, accessToken: "" }); - } - - let payload: any = null; - try { - payload = verify(token, process.env.REFRESH_TOKEN_SECRET!); - } catch (err) { - console.log(err); - return res.send({ ok: false, accessToken: "" }); - } - - // token is valid and - // we can send back an access token - const user = await User.findOne({ id: payload.userId }); - - if (!user) { - return res.send({ ok: false, accessToken: "" }); - } - - if (user.tokenVersion !== payload.tokenVersion) { - return res.send({ ok: false, accessToken: "" }); - } - - sendRefreshToken(res, createRefreshToken(user)); - - return res.send({ ok: true, accessToken: createAccessToken(user) }); - }); await createConnection(); From 5ff0a88f27d207aa744a8400c613d7eae970038a Mon Sep 17 00:00:00 2001 From: Bhaumik Joshi Date: Tue, 31 Aug 2021 00:36:39 +0530 Subject: [PATCH 3/7] added cookies options --- server/src/sendRefreshToken.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/src/sendRefreshToken.ts b/server/src/sendRefreshToken.ts index 535774f..e31b610 100644 --- a/server/src/sendRefreshToken.ts +++ b/server/src/sendRefreshToken.ts @@ -3,6 +3,7 @@ import { Response } from "express"; export const sendRefreshToken = (res: Response, token: string) => { res.cookie("jid", token, { httpOnly: true, - path: "/refresh_token" + secure: true, + maxAge: 1000 * 60 * 60 * 24 * 7 // 7 days token expiration time }); }; From df45892c93209cec6d8547a1a7c33b1ab1f39666 Mon Sep 17 00:00:00 2001 From: Bhaumik Joshi Date: Tue, 31 Aug 2021 00:37:49 +0530 Subject: [PATCH 4/7] added auth middleware for accessToken and refreshToken --- server/src/MyContext.ts | 3 ++- server/src/UserResolver.ts | 50 ++++++++++------------------------- server/src/isAuth.ts | 53 ++++++++++++++++++++++++++------------ 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/server/src/MyContext.ts b/server/src/MyContext.ts index 8c56227..b6c224c 100644 --- a/server/src/MyContext.ts +++ b/server/src/MyContext.ts @@ -1,7 +1,8 @@ import { Request, Response } from "express"; +import { User } from "./entity/User"; export interface MyContext { req: Request; res: Response; - payload?: { userId: string }; + payload?: User; } diff --git a/server/src/UserResolver.ts b/server/src/UserResolver.ts index f9a9117..b47aea0 100644 --- a/server/src/UserResolver.ts +++ b/server/src/UserResolver.ts @@ -3,8 +3,6 @@ import { Query, Mutation, Arg, - ObjectType, - Field, Ctx, UseMiddleware, Int @@ -16,15 +14,6 @@ import { createRefreshToken, createAccessToken } from "./auth"; import { isAuth } from "./isAuth"; import { sendRefreshToken } from "./sendRefreshToken"; import { getConnection } from "typeorm"; -import { verify } from "jsonwebtoken"; - -@ObjectType() -class LoginResponse { - @Field() - accessToken: string; - @Field(() => User) - user: User; -} @Resolver() export class UserResolver { @@ -37,7 +26,7 @@ export class UserResolver { @UseMiddleware(isAuth) bye(@Ctx() { payload }: MyContext) { console.log(payload); - return `your user id is: ${payload!.userId}`; + return `your user id is: ${payload!.id}`; } @Query(() => [User]) @@ -46,26 +35,18 @@ export class UserResolver { } @Query(() => User, { nullable: true }) + @UseMiddleware(isAuth) me(@Ctx() context: MyContext) { - const authorization = context.req.headers["authorization"]; - - if (!authorization) { - return null; - } - - try { - const token = authorization.split(" ")[1]; - const payload: any = verify(token, process.env.ACCESS_TOKEN_SECRET!); - return User.findOne(payload.userId); - } catch (err) { - console.log(err); - return null; - } + return context.payload!; } @Mutation(() => Boolean) - async logout(@Ctx() { res }: MyContext) { - sendRefreshToken(res, ""); + @UseMiddleware(isAuth) + async logout(@Ctx() { res, payload }: MyContext) { + res.clearCookie("jid"); + await getConnection() + .getRepository(User) + .increment({ id: payload!.id }, "tokenVersion", 1); return true; } @@ -79,12 +60,13 @@ export class UserResolver { return true; } - @Mutation(() => LoginResponse) + @Mutation(() => User) async login( @Arg("email") email: string, @Arg("password") password: string, @Ctx() { res }: MyContext - ): Promise { + ): Promise { + console.log(email); const user = await User.findOne({ where: { email } }); if (!user) { @@ -100,11 +82,8 @@ export class UserResolver { // login successful sendRefreshToken(res, createRefreshToken(user)); - - return { - accessToken: createAccessToken(user), - user - }; + res.setHeader("access-token", createAccessToken(user)); + return user; } @Mutation(() => Boolean) @@ -123,7 +102,6 @@ export class UserResolver { console.log(err); return false; } - return true; } } diff --git a/server/src/isAuth.ts b/server/src/isAuth.ts index 5d5e343..19fd095 100644 --- a/server/src/isAuth.ts +++ b/server/src/isAuth.ts @@ -1,24 +1,45 @@ import { MiddlewareFn } from "type-graphql"; import { verify } from "jsonwebtoken"; import { MyContext } from "./MyContext"; +import { createAccessToken } from "./auth"; +import { User } from "./entity/User"; // bearer 102930ajslkdaoq01 -export const isAuth: MiddlewareFn = ({ context }, next) => { - const authorization = context.req.headers["authorization"]; +export const isAuth: MiddlewareFn = async ({ context }, next) => { + if (context.req.cookies.jid) { + const authorization = context.req.headers["authorization"]; + if (!authorization) { + context.res.clearCookie("jid"); + throw new Error("not authenticated"); + } - if (!authorization) { - throw new Error("not authenticated"); - } - - try { - const token = authorization.split(" ")[1]; - const payload = verify(token, process.env.ACCESS_TOKEN_SECRET!); - context.payload = payload as any; - } catch (err) { - console.log(err); - throw new Error("not authenticated"); - } - - return next(); + try { + const token = authorization.split(" ")[1]; + const { userId } = verify(token, process.env.ACCESS_TOKEN_SECRET!) as { userId: number }; + const user = await User.findOne({ where: { id: userId } }); + if (!user) { + context.res.clearCookie("jid"); + throw new Error("not authenticated"); + } + context.payload = user; + } catch (err) { + try { + const { userId, tokenVersion } = verify(context.req.cookies.jid, process.env.REFRESH_TOKEN_SECRET!) as { userId: number; tokenVersion: number; }; + const user = await User.findOne({ where: { id: userId } }); + if (!user || user.tokenVersion !== tokenVersion) { + context.res.clearCookie("jid"); + throw new Error("not authenticated"); + } + context.res.setHeader("access-token", createAccessToken(user)); + context.payload = user; + } catch (error) { + console.log(error); + context.res.clearCookie("jid"); + throw new Error("not authenticated"); + } + } + return next(); + }; + throw new Error("not authenticated"); }; From 0e30da17139bd8d7d4588aee1325fbb433ddbdbf Mon Sep 17 00:00:00 2001 From: Bhaumik Joshi Date: Tue, 31 Aug 2021 00:39:49 +0530 Subject: [PATCH 5/7] replaced all apollo packages with @apollo/client --- web/package.json | 7 +- web/yarn.lock | 234 +++++++++++++++++++++-------------------------- 2 files changed, 104 insertions(+), 137 deletions(-) diff --git a/web/package.json b/web/package.json index 17b9d8e..52e657b 100644 --- a/web/package.json +++ b/web/package.json @@ -3,20 +3,17 @@ "version": "0.1.0", "private": true, "dependencies": { - "@apollo/react-hooks": "^3.1.1", + "@apollo/client": "^3.4.10", "@types/jest": "24.0.18", "@types/node": "12.7.5", "@types/react": "16.9.2", "@types/react-dom": "16.9.0", - "apollo-boost": "^0.4.4", - "apollo-link-token-refresh": "^0.2.6", "graphql": "^14.5.6", - "jwt-decode": "^2.2.0", "react": "^16.9.0", "react-dom": "^16.9.0", "react-router-dom": "^5.0.1", "react-scripts": "3.1.1", - "typescript": "3.6.3" + "typescript": "^4.4.2" }, "scripts": { "start": "react-scripts start", diff --git a/web/yarn.lock b/web/yarn.lock index e325fc7..58fe800 100755 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -2,23 +2,23 @@ # yarn lockfile v1 -"@apollo/react-common@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@apollo/react-common/-/react-common-3.1.1.tgz#540619d8276d750ce4f381c9cf8f51a6f657f75d" - integrity sha512-lMiczOm4sD16eI9Ai+AUY+Jl3C/FNm4IpoZiAbe35TqMuD7HpZ4OJmXAbT3CzfrAqsKK8+rHgRvTiPI2kQjIWg== - dependencies: - ts-invariant "^0.4.4" - tslib "^1.10.0" - -"@apollo/react-hooks@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@apollo/react-hooks/-/react-hooks-3.1.1.tgz#8e5a0f281a9778aaf17496ad38a178d23375077c" - integrity sha512-LwE4olNlKwqh1hl6iHr/igSDGRVs7c6Ik5MYZm9TzGj01f+ebhM1+Pn+UBNLsb3uRuytZsUOsEDBEXMABzC9Tw== - dependencies: - "@apollo/react-common" "^3.1.1" - "@wry/equality" "^0.1.9" - ts-invariant "^0.4.4" - tslib "^1.10.0" +"@apollo/client@^3.4.10": + version "3.4.10" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.4.10.tgz#cee9ed75b1bb7f391c55d79300ecf87096e59792" + integrity sha512-b+8TT3jBM2BtEJi+V2FuLpvoYDZCY3baNYrgAgEyw4fjnuBCSRPY7qVjqriZAwMaGiTLtyVifGhmdeICQs4Eow== + dependencies: + "@graphql-typed-document-node/core" "^3.0.0" + "@wry/context" "^0.6.0" + "@wry/equality" "^0.5.0" + "@wry/trie" "^0.3.0" + graphql-tag "^2.12.3" + hoist-non-react-statics "^3.3.2" + optimism "^0.16.1" + prop-types "^15.7.2" + symbol-observable "^4.0.0" + ts-invariant "^0.9.0" + tslib "^2.3.0" + zen-observable-ts "^1.1.0" "@babel/code-frame@7.5.5", "@babel/code-frame@^7.5.5": version "7.5.5" @@ -1111,6 +1111,11 @@ graphql-tag "2.10.1" tslib "1.10.0" +"@graphql-typed-document-node/core@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.0.tgz#0eee6373e11418bfe0b5638f654df7a4ca6a3950" + integrity sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg== + "@hapi/address@2.x.x": version "2.1.1" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.1.tgz#61395b5ed94c4cb19c2dc4c85969cff3d40d583f" @@ -1574,7 +1579,7 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@12.7.5", "@types/node@>=6": +"@types/node@*", "@types/node@12.7.5": version "12.7.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.5.tgz#e19436e7f8e9b4601005d73673b6dc4784ffcc2f" integrity sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w== @@ -1643,11 +1648,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/zen-observable@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" - integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg== - "@typescript-eslint/eslint-plugin@1.13.0": version "1.13.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz#22fed9b16ddfeb402fd7bcde56307820f6ebc49f" @@ -1832,21 +1832,34 @@ "@webassemblyjs/wast-parser" "1.8.5" "@xtuc/long" "4.2.2" -"@wry/context@^0.4.0": - version "0.4.4" - resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.4.4.tgz#e50f5fa1d6cfaabf2977d1fda5ae91717f8815f8" - integrity sha512-LrKVLove/zw6h2Md/KZyWxIkFM6AoyKp71OqpH9Hiip1csjPVoD3tPxlbQUNxEnHENks3UGgNpSBCAfq9KWuag== +"@wry/context@^0.6.0": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.1.tgz#c3c29c0ad622adb00f6a53303c4f965ee06ebeb2" + integrity sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw== dependencies: - "@types/node" ">=6" - tslib "^1.9.3" + tslib "^2.3.0" -"@wry/equality@^0.1.2", "@wry/equality@^0.1.9": +"@wry/equality@^0.1.2": version "0.1.9" resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.9.tgz#b13e18b7a8053c6858aa6c85b54911fb31e3a909" integrity sha512-mB6ceGjpMGz1ZTza8HYnrPGos2mC6So4NhS1PtZ8s4Qt0K7fBiIGhpSxUbQmhwcSWE3no+bYxmI2OL6KuXYmoQ== dependencies: tslib "^1.9.3" +"@wry/equality@^0.5.0": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.2.tgz#72c8a7a7d884dff30b612f4f8464eba26c080e73" + integrity sha512-oVMxbUXL48EV/C0/M7gLVsoK6qRHPS85x8zECofEZOVvxGmIPLA9o5Z27cc2PoAyZz1S2VoM2A7FLAnpfGlneA== + dependencies: + tslib "^2.3.0" + +"@wry/trie@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.1.tgz#2279b790f15032f8bcea7fc944d27988e5b3b139" + integrity sha512-WwB53ikYudh9pIorgxrkHKrQZcCqNM/Q/bDzZBffEaGUKGuHrRb3zZUT9Sh2qw9yogC7SsdRmQ1ER0pqvd3bfw== + dependencies: + tslib "^2.3.0" + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -2065,89 +2078,7 @@ anymatch@^3.0.1: normalize-path "^3.0.0" picomatch "^2.0.4" -apollo-boost@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/apollo-boost/-/apollo-boost-0.4.4.tgz#7c278dac6cb6fa3f2f710c56baddc6e3ae730651" - integrity sha512-ASngBvazmp9xNxXfJ2InAzfDwz65o4lswlEPrWoN35scXmCz8Nz4k3CboUXbrcN/G0IExkRf/W7o9Rg0cjEBqg== - dependencies: - apollo-cache "^1.3.2" - apollo-cache-inmemory "^1.6.3" - apollo-client "^2.6.4" - apollo-link "^1.0.6" - apollo-link-error "^1.0.3" - apollo-link-http "^1.3.1" - graphql-tag "^2.4.2" - ts-invariant "^0.4.0" - tslib "^1.9.3" - -apollo-cache-inmemory@^1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.3.tgz#826861d20baca4abc45f7ca7a874105905b8525d" - integrity sha512-S4B/zQNSuYc0M/1Wq8dJDTIO9yRgU0ZwDGnmlqxGGmFombOZb9mLjylewSfQKmjNpciZ7iUIBbJ0mHlPJTzdXg== - dependencies: - apollo-cache "^1.3.2" - apollo-utilities "^1.3.2" - optimism "^0.10.0" - ts-invariant "^0.4.0" - tslib "^1.9.3" - -apollo-cache@1.3.2, apollo-cache@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.3.2.tgz#df4dce56240d6c95c613510d7e409f7214e6d26a" - integrity sha512-+KA685AV5ETEJfjZuviRTEImGA11uNBp/MJGnaCvkgr+BYRrGLruVKBv6WvyFod27WEB2sp7SsG8cNBKANhGLg== - dependencies: - apollo-utilities "^1.3.2" - tslib "^1.9.3" - -apollo-client@^2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.6.4.tgz#872c32927263a0d34655c5ef8a8949fbb20b6140" - integrity sha512-oWOwEOxQ9neHHVZrQhHDbI6bIibp9SHgxaLRVPoGvOFy7OH5XUykZE7hBQAVxq99tQjBzgytaZffQkeWo1B4VQ== - dependencies: - "@types/zen-observable" "^0.8.0" - apollo-cache "1.3.2" - apollo-link "^1.0.0" - apollo-utilities "1.3.2" - symbol-observable "^1.0.2" - ts-invariant "^0.4.0" - tslib "^1.9.3" - zen-observable "^0.8.0" - -apollo-link-error@^1.0.3: - version "1.1.12" - resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.12.tgz#e24487bb3c30af0654047611cda87038afbacbf9" - integrity sha512-psNmHyuy3valGikt/XHJfe0pKJnRX19tLLs6P6EHRxg+6q6JMXNVLYPaQBkL0FkwdTCB0cbFJAGRYCBviG8TDA== - dependencies: - apollo-link "^1.2.13" - apollo-link-http-common "^0.2.15" - tslib "^1.9.3" - -apollo-link-http-common@^0.2.15: - version "0.2.15" - resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.15.tgz#304e67705122bf69a9abaded4351b10bc5efd6d9" - integrity sha512-+Heey4S2IPsPyTf8Ag3PugUupASJMW894iVps6hXbvwtg1aHSNMXUYO5VG7iRHkPzqpuzT4HMBanCTXPjtGzxg== - dependencies: - apollo-link "^1.2.13" - ts-invariant "^0.4.0" - tslib "^1.9.3" - -apollo-link-http@^1.3.1: - version "1.5.16" - resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.16.tgz#44fe760bcc2803b8a7f57fc9269173afb00f3814" - integrity sha512-IA3xA/OcrOzINRZEECI6IdhRp/Twom5X5L9jMehfzEo2AXdeRwAMlH5LuvTZHgKD8V1MBnXdM6YXawXkTDSmJw== - dependencies: - apollo-link "^1.2.13" - apollo-link-http-common "^0.2.15" - tslib "^1.9.3" - -apollo-link-token-refresh@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/apollo-link-token-refresh/-/apollo-link-token-refresh-0.2.6.tgz#61eeb28dd721f400f578da61c2ccfcb32dc4cede" - integrity sha512-UbXrXK5eKg3m7dUShKEVFK1S2cjwluzRayAnQKhdnnYgVZzgikLayAgs8A3NLxjgfRv8BdGmFt7DkvvwpNE/+g== - dependencies: - apollo-link "^1.2.3" - -apollo-link@^1.0.0, apollo-link@^1.0.6, apollo-link@^1.2.13, apollo-link@^1.2.3: +apollo-link@^1.2.3: version "1.2.13" resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.13.tgz#dff00fbf19dfcd90fddbc14b6a3f9a771acac6c4" integrity sha512-+iBMcYeevMm1JpYgwDEIDt/y0BB7VWyvlm/7x+TIPNLHCTCMgcEgDuW5kH86iQZWo0I7mNwQiTOz+/3ShPFmBw== @@ -2157,7 +2088,7 @@ apollo-link@^1.0.0, apollo-link@^1.0.6, apollo-link@^1.2.13, apollo-link@^1.2.3: tslib "^1.9.3" zen-observable-ts "^0.8.20" -apollo-utilities@1.3.2, apollo-utilities@^1.0.1, apollo-utilities@^1.3.0, apollo-utilities@^1.3.2: +apollo-utilities@^1.0.1, apollo-utilities@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.2.tgz#8cbdcf8b012f664cd6cb5767f6130f5aed9115c9" integrity sha512-JWNHj8XChz7S4OZghV6yc9FNnzEXj285QYp/nLNh943iObycI5GTDO3NGR9Dth12LRrSFMeDOConPfPln+WGfg== @@ -5286,11 +5217,18 @@ graphql-tag-pluck@0.8.4: "@babel/types" "^7.4.4" source-map-support "^0.5.12" -graphql-tag@2.10.1, graphql-tag@^2.4.2: +graphql-tag@2.10.1: version "2.10.1" resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.1.tgz#10aa41f1cd8fae5373eaf11f1f67260a3cad5e02" integrity sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg== +graphql-tag@^2.12.3: + version "2.12.5" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.5.tgz#5cff974a67b417747d05c8d9f5f3cb4495d0db8f" + integrity sha512-5xNhP4063d16Pz3HBtKprutsPrmHZi5IdUGOWRxA2B6VF7BIRGOHZ5WQvDmJXZuPcBg7rYwaFxvQYjqkSdR3TQ== + dependencies: + tslib "^2.1.0" + graphql-toolkit@0.5.11: version "0.5.11" resolved "https://registry.yarnpkg.com/graphql-toolkit/-/graphql-toolkit-0.5.11.tgz#f9adf1ecc4df455802d0cc223acbd35556f7d78e" @@ -5502,6 +5440,13 @@ hoist-non-react-statics@^3.1.0: dependencies: react-is "^16.7.0" +hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + hosted-git-info@^2.1.4: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" @@ -6884,11 +6829,6 @@ jsx-ast-utils@^2.1.0, jsx-ast-utils@^2.2.1: array-includes "^3.0.3" object.assign "^4.1.0" -jwt-decode@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-2.2.0.tgz#7d86bd56679f58ce6a84704a657dd392bba81a79" - integrity sha1-fYa9VmefWM5qhHBKZX3TkruoGnk= - killable@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -7938,12 +7878,13 @@ opn@^5.1.0: dependencies: is-wsl "^1.1.0" -optimism@^0.10.0: - version "0.10.2" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.10.2.tgz#626b6fd28b0923de98ecb36a3fd2d3d4e5632dd9" - integrity sha512-zPfBIxFFWMmQboM9+Z4MSJqc1PXp82v1PFq/GfQaufI69mHKlup7ykGNnfuGIGssXJQkmhSodQ/k9EWwjd8O8A== +optimism@^0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d" + integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== dependencies: - "@wry/context" "^0.4.0" + "@wry/context" "^0.6.0" + "@wry/trie" "^0.3.0" optimist@^0.6.1: version "0.6.1" @@ -10650,11 +10591,16 @@ swap-case@^1.1.0: lower-case "^1.1.1" upper-case "^1.1.1" -symbol-observable@^1.0.2, symbol-observable@^1.1.0: +symbol-observable@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== +symbol-observable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -10876,13 +10822,20 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -ts-invariant@^0.4.0, ts-invariant@^0.4.4: +ts-invariant@^0.4.0: version "0.4.4" resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA== dependencies: tslib "^1.9.3" +ts-invariant@^0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.9.1.tgz#87dfde9894a4ce3c7711b02b1b449e7fd7384b13" + integrity sha512-hSeYibh29ULlHkuEfukcoiyTct+s2RzczMLTv4x3NWC/YrBy7x7ps5eYq/b4Y3Sb9/uAlf54+/5CAEMVxPhuQw== + dependencies: + tslib "^2.1.0" + ts-log@2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/ts-log/-/ts-log-2.1.4.tgz#063c5ad1cbab5d49d258d18015963489fb6fb59a" @@ -10898,7 +10851,7 @@ ts-pnp@^1.1.2: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.4.tgz#ae27126960ebaefb874c6d7fa4729729ab200d90" integrity sha512-1J/vefLC+BWSo+qe8OnJQfWTYRS6ingxjwqmHMqaMxXMj7kFtKLgAaYW3JeX3mktjgUL+etlU8/B4VUAUI9QGw== -tslib@1.10.0, tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.3: +tslib@1.10.0, tslib@^1.8.1, tslib@^1.9.3: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== @@ -10908,6 +10861,11 @@ tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== +tslib@^2.1.0, tslib@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + tsutils@^3.7.0: version "3.17.1" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" @@ -10962,10 +10920,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.3.tgz#fea942fabb20f7e1ca7164ff626f1a9f3f70b4da" - integrity sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw== +typescript@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.2.tgz#6d618640d430e3569a1dfb44f7d7e600ced3ee86" + integrity sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ== uglify-js@3.4.x, uglify-js@^3.1.4: version "3.4.9" @@ -11739,6 +11697,18 @@ zen-observable-ts@^0.8.20: tslib "^1.9.3" zen-observable "^0.8.0" +zen-observable-ts@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.0.tgz#6925f60e9a5e8f3af72151b9d37e5789ccf70139" + integrity sha512-3IklmJSChXaqAD2gPz6yKHThAnZL46D51x5EPpN/MHuPjrepVdSg3qI7f5fh1RT8Y+K46Owo9fpVuJiuJXLMMA== + dependencies: + zen-observable "0.8.15" + +zen-observable@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== + zen-observable@^0.8.0: version "0.8.14" resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.14.tgz#d33058359d335bc0db1f0af66158b32872af3bf7" From 14fb6fc2aabf30925cd10aff11ec3cdc50971fe1 Mon Sep 17 00:00:00 2001 From: Bhaumik Joshi Date: Tue, 31 Aug 2021 00:43:39 +0530 Subject: [PATCH 6/7] accepting access token through headers & added @apollo/client --- web/src/App.tsx | 20 +- web/src/Header.tsx | 26 ++- web/src/Routes.tsx | 2 +- web/src/generated/graphql.tsx | 358 ++++++++++++++++++---------------- web/src/index.tsx | 123 ++++-------- web/src/pages/Home.tsx | 2 +- web/src/pages/Login.tsx | 7 +- web/src/pages/Register.tsx | 10 +- 8 files changed, 255 insertions(+), 293 deletions(-) diff --git a/web/src/App.tsx b/web/src/App.tsx index 7b5d7b4..f0571c4 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1,26 +1,8 @@ -import React, { useState, useEffect } from "react"; +import React from "react"; import { Routes } from "./Routes"; -import { setAccessToken } from "./accessToken"; interface Props {} export const App: React.FC = () => { - const [loading, setLoading] = useState(true); - - useEffect(() => { - fetch("http://localhost:4000/refresh_token", { - method: "POST", - credentials: "include" - }).then(async x => { - const { accessToken } = await x.json(); - setAccessToken(accessToken); - setLoading(false); - }); - }, []); - - if (loading) { - return
loading...
; - } - return ; }; diff --git a/web/src/Header.tsx b/web/src/Header.tsx index 0727329..97a8aa8 100644 --- a/web/src/Header.tsx +++ b/web/src/Header.tsx @@ -1,5 +1,6 @@ -import React from "react"; +import React, { useEffect, useState } from "react"; import { Link } from "react-router-dom"; +import { useApolloClient } from "@apollo/client"; import { useMeQuery, useLogoutMutation } from "./generated/graphql"; import { setAccessToken } from "./accessToken"; @@ -7,17 +8,13 @@ interface Props {} export const Header: React.FC = () => { const { data, loading } = useMeQuery(); - const [logout, { client }] = useLogoutMutation(); + const client = useApolloClient(); + const [logout] = useLogoutMutation(); + const [isLoggedIn, setIsLoggedIn] = useState(false); - let body: any = null; - - if (loading) { - body = null; - } else if (data && data.me) { - body =
you are logged in as: {data.me.email}
; - } else { - body =
not logged in
; - } + useEffect(() => { + if (data && data.me) setIsLoggedIn(true); + }, [data]); return (
@@ -34,19 +31,20 @@ export const Header: React.FC = () => { bye
- {!loading && data && data.me ? ( + {!loading && isLoggedIn ? ( ) : null}
- {body} + {loading ? null : (isLoggedIn ?
you are logged in as: {data!.me!.email}
:
not logged in
)}
); }; diff --git a/web/src/Routes.tsx b/web/src/Routes.tsx index 254ffc5..e6b08fc 100644 --- a/web/src/Routes.tsx +++ b/web/src/Routes.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { BrowserRouter, Switch, Route, Link } from "react-router-dom"; +import { BrowserRouter, Switch, Route } from "react-router-dom"; import { Home } from "./pages/Home"; import { Login } from "./pages/Login"; import { Register } from "./pages/Register"; diff --git a/web/src/generated/graphql.tsx b/web/src/generated/graphql.tsx index d16395b..987263f 100644 --- a/web/src/generated/graphql.tsx +++ b/web/src/generated/graphql.tsx @@ -1,243 +1,267 @@ -import gql from 'graphql-tag'; -import * as ApolloReactCommon from '@apollo/react-common'; -import * as ApolloReactHooks from '@apollo/react-hooks'; +import { + gql, + QueryResult, + MutationFunction, + BaseMutationOptions, + MutationResult, + QueryHookOptions, + LazyQueryHookOptions, + useQuery, + useLazyQuery, + useMutation, + MutationHookOptions, +} from "@apollo/client"; export type Maybe = T | null; /** All built-in and custom scalars, mapped to their actual values */ export type Scalars = { - ID: string, - String: string, - Boolean: boolean, - Int: number, - Float: number, -}; - -export type LoginResponse = { - __typename?: 'LoginResponse', - accessToken: Scalars['String'], - user: User, + ID: string; + String: string; + Boolean: boolean; + Int: number; + Float: number; }; export type Mutation = { - __typename?: 'Mutation', - logout: Scalars['Boolean'], - revokeRefreshTokensForUser: Scalars['Boolean'], - login: LoginResponse, - register: Scalars['Boolean'], + __typename?: "Mutation"; + logout: Scalars["Boolean"]; + revokeRefreshTokensForUser: Scalars["Boolean"]; + login: User; + register: Scalars["Boolean"]; }; - export type MutationRevokeRefreshTokensForUserArgs = { - userId: Scalars['Int'] + userId: Scalars["Int"]; }; - export type MutationLoginArgs = { - password: Scalars['String'], - email: Scalars['String'] + password: Scalars["String"]; + email: Scalars["String"]; }; - export type MutationRegisterArgs = { - password: Scalars['String'], - email: Scalars['String'] + password: Scalars["String"]; + email: Scalars["String"]; }; export type Query = { - __typename?: 'Query', - hello: Scalars['String'], - bye: Scalars['String'], - users: Array, - me?: Maybe, + __typename?: "Query"; + hello: Scalars["String"]; + bye: Scalars["String"]; + users: Array; + me?: Maybe; }; export type User = { - __typename?: 'User', - id: Scalars['Int'], - email: Scalars['String'], + __typename?: "User"; + id: Scalars["Int"]; + email: Scalars["String"]; }; export type ByeQueryVariables = {}; - -export type ByeQuery = ( - { __typename?: 'Query' } - & Pick -); +export type ByeQuery = { __typename?: "Query" } & Pick; export type HelloQueryVariables = {}; - -export type HelloQuery = ( - { __typename?: 'Query' } - & Pick -); +export type HelloQuery = { __typename?: "Query" } & Pick; export type LoginMutationVariables = { - email: Scalars['String'], - password: Scalars['String'] + email: Scalars["String"]; + password: Scalars["String"]; }; - -export type LoginMutation = ( - { __typename?: 'Mutation' } - & { login: ( - { __typename?: 'LoginResponse' } - & Pick - & { user: ( - { __typename?: 'User' } - & Pick - ) } - ) } -); +export type LoginMutation = { __typename?: "Mutation" } & { + login: { __typename?: "User" } & Pick; +}; export type LogoutMutationVariables = {}; - -export type LogoutMutation = ( - { __typename?: 'Mutation' } - & Pick -); +export type LogoutMutation = { __typename?: "Mutation" } & Pick< + Mutation, + "logout" +>; export type MeQueryVariables = {}; - -export type MeQuery = ( - { __typename?: 'Query' } - & { me: Maybe<( - { __typename?: 'User' } - & Pick - )> } -); +export type MeQuery = { __typename?: "Query" } & { + me: Maybe<{ __typename?: "User" } & Pick>; +}; export type RegisterMutationVariables = { - email: Scalars['String'], - password: Scalars['String'] + email: Scalars["String"]; + password: Scalars["String"]; }; - -export type RegisterMutation = ( - { __typename?: 'Mutation' } - & Pick -); +export type RegisterMutation = { __typename?: "Mutation" } & Pick< + Mutation, + "register" +>; export type UsersQueryVariables = {}; - -export type UsersQuery = ( - { __typename?: 'Query' } - & { users: Array<( - { __typename?: 'User' } - & Pick - )> } -); +export type UsersQuery = { __typename?: "Query" } & { + users: Array<{ __typename?: "User" } & Pick>; +}; export const ByeDocument = gql` - query Bye { - bye + query Bye { + bye + } +`; + +export function useByeQuery( + baseOptions?: QueryHookOptions +) { + return useQuery(ByeDocument, baseOptions); +} +export function useByeLazyQuery( + baseOptions?: LazyQueryHookOptions +) { + return useLazyQuery(ByeDocument, baseOptions); } - `; - export function useByeQuery(baseOptions?: ApolloReactHooks.QueryHookOptions) { - return ApolloReactHooks.useQuery(ByeDocument, baseOptions); - } - export function useByeLazyQuery(baseOptions?: ApolloReactHooks.LazyQueryHookOptions) { - return ApolloReactHooks.useLazyQuery(ByeDocument, baseOptions); - } - export type ByeQueryHookResult = ReturnType; -export type ByeQueryResult = ApolloReactCommon.QueryResult; +export type ByeQueryResult = QueryResult; export const HelloDocument = gql` - query Hello { - hello + query Hello { + hello + } +`; + +export function useHelloQuery( + baseOptions?: QueryHookOptions +) { + return useQuery(HelloDocument, baseOptions); +} +export function useHelloLazyQuery( + baseOptions?: LazyQueryHookOptions +) { + return useLazyQuery( + HelloDocument, + baseOptions + ); } - `; - export function useHelloQuery(baseOptions?: ApolloReactHooks.QueryHookOptions) { - return ApolloReactHooks.useQuery(HelloDocument, baseOptions); - } - export function useHelloLazyQuery(baseOptions?: ApolloReactHooks.LazyQueryHookOptions) { - return ApolloReactHooks.useLazyQuery(HelloDocument, baseOptions); - } - export type HelloQueryHookResult = ReturnType; -export type HelloQueryResult = ApolloReactCommon.QueryResult; +export type HelloQueryResult = QueryResult; export const LoginDocument = gql` - mutation Login($email: String!, $password: String!) { - login(email: $email, password: $password) { - accessToken - user { + mutation Login($email: String!, $password: String!) { + login(email: $email, password: $password) { id email } } +`; +export type LoginMutationFn = MutationFunction< + LoginMutation, + LoginMutationVariables +>; + +export function useLoginMutation( + baseOptions?: MutationHookOptions +) { + return useMutation( + LoginDocument, + baseOptions + ); } - `; -export type LoginMutationFn = ApolloReactCommon.MutationFunction; - - export function useLoginMutation(baseOptions?: ApolloReactHooks.MutationHookOptions) { - return ApolloReactHooks.useMutation(LoginDocument, baseOptions); - } export type LoginMutationHookResult = ReturnType; -export type LoginMutationResult = ApolloReactCommon.MutationResult; -export type LoginMutationOptions = ApolloReactCommon.BaseMutationOptions; +export type LoginMutationResult = MutationResult; +export type LoginMutationOptions = BaseMutationOptions< + LoginMutation, + LoginMutationVariables +>; export const LogoutDocument = gql` - mutation Logout { - logout + mutation Logout { + logout + } +`; +export type LogoutMutationFn = MutationFunction< + LogoutMutation, + LogoutMutationVariables +>; + +export function useLogoutMutation( + baseOptions?: MutationHookOptions +) { + return useMutation( + LogoutDocument, + baseOptions + ); } - `; -export type LogoutMutationFn = ApolloReactCommon.MutationFunction; - - export function useLogoutMutation(baseOptions?: ApolloReactHooks.MutationHookOptions) { - return ApolloReactHooks.useMutation(LogoutDocument, baseOptions); - } export type LogoutMutationHookResult = ReturnType; -export type LogoutMutationResult = ApolloReactCommon.MutationResult; -export type LogoutMutationOptions = ApolloReactCommon.BaseMutationOptions; +export type LogoutMutationResult = MutationResult; +export type LogoutMutationOptions = BaseMutationOptions< + LogoutMutation, + LogoutMutationVariables +>; export const MeDocument = gql` - query Me { - me { - id - email + query Me { + me { + id + email + } } +`; + +export function useMeQuery( + baseOptions?: QueryHookOptions +) { + return useQuery(MeDocument, baseOptions); +} +export function useMeLazyQuery( + baseOptions?: LazyQueryHookOptions +) { + return useLazyQuery(MeDocument, baseOptions); } - `; - export function useMeQuery(baseOptions?: ApolloReactHooks.QueryHookOptions) { - return ApolloReactHooks.useQuery(MeDocument, baseOptions); - } - export function useMeLazyQuery(baseOptions?: ApolloReactHooks.LazyQueryHookOptions) { - return ApolloReactHooks.useLazyQuery(MeDocument, baseOptions); - } - export type MeQueryHookResult = ReturnType; -export type MeQueryResult = ApolloReactCommon.QueryResult; +export type MeQueryResult = QueryResult; export const RegisterDocument = gql` - mutation Register($email: String!, $password: String!) { - register(email: $email, password: $password) + mutation Register($email: String!, $password: String!) { + register(email: $email, password: $password) + } +`; +export type RegisterMutationFn = MutationFunction< + RegisterMutation, + RegisterMutationVariables +>; + +export function useRegisterMutation( + baseOptions?: MutationHookOptions +) { + return useMutation( + RegisterDocument, + baseOptions + ); } - `; -export type RegisterMutationFn = ApolloReactCommon.MutationFunction; - - export function useRegisterMutation(baseOptions?: ApolloReactHooks.MutationHookOptions) { - return ApolloReactHooks.useMutation(RegisterDocument, baseOptions); - } export type RegisterMutationHookResult = ReturnType; -export type RegisterMutationResult = ApolloReactCommon.MutationResult; -export type RegisterMutationOptions = ApolloReactCommon.BaseMutationOptions; +export type RegisterMutationResult = MutationResult; +export type RegisterMutationOptions = BaseMutationOptions< + RegisterMutation, + RegisterMutationVariables +>; export const UsersDocument = gql` - query Users { - users { - id - email + query Users { + users { + id + email + } } +`; + +export function useUsersQuery( + baseOptions?: QueryHookOptions +) { + return useQuery(UsersDocument, baseOptions); +} +export function useUsersLazyQuery( + baseOptions?: LazyQueryHookOptions +) { + return useLazyQuery( + UsersDocument, + baseOptions + ); } - `; - export function useUsersQuery(baseOptions?: ApolloReactHooks.QueryHookOptions) { - return ApolloReactHooks.useQuery(UsersDocument, baseOptions); - } - export function useUsersLazyQuery(baseOptions?: ApolloReactHooks.LazyQueryHookOptions) { - return ApolloReactHooks.useLazyQuery(UsersDocument, baseOptions); - } - export type UsersQueryHookResult = ReturnType; -export type UsersQueryResult = ApolloReactCommon.QueryResult; \ No newline at end of file +export type UsersQueryResult = QueryResult; diff --git a/web/src/index.tsx b/web/src/index.tsx index 25f788f..10d05fe 100644 --- a/web/src/index.tsx +++ b/web/src/index.tsx @@ -1,95 +1,54 @@ import React from "react"; import ReactDOM from "react-dom"; -import { ApolloProvider } from "@apollo/react-hooks"; +import { + HttpLink, + ApolloLink, + ApolloClient, + InMemoryCache, + from, + ApolloProvider +} from "@apollo/client"; import { getAccessToken, setAccessToken } from "./accessToken"; import { App } from "./App"; -import { ApolloClient } from "apollo-client"; -import { InMemoryCache } from "apollo-cache-inmemory"; -import { HttpLink } from "apollo-link-http"; -import { onError } from "apollo-link-error"; -import { ApolloLink, Observable } from "apollo-link"; -import { TokenRefreshLink } from "apollo-link-token-refresh"; -import jwtDecode from "jwt-decode"; -const cache = new InMemoryCache({}); - -const requestLink = new ApolloLink( - (operation, forward) => - new Observable(observer => { - let handle: any; - Promise.resolve(operation) - .then(operation => { - const accessToken = getAccessToken(); - if (accessToken) { - operation.setContext({ - headers: { - authorization: `bearer ${accessToken}` - } - }); - } - }) - .then(() => { - handle = forward(operation).subscribe({ - next: observer.next.bind(observer), - error: observer.error.bind(observer), - complete: observer.complete.bind(observer) - }); - }) - .catch(observer.error.bind(observer)); - - return () => { - if (handle) handle.unsubscribe(); - }; - }) -); +const httpLink = new HttpLink({ + uri: "http://localhost:4000/graphql", + credentials: "include", +}); -const client = new ApolloClient({ - link: ApolloLink.from([ - new TokenRefreshLink({ - accessTokenField: "accessToken", - isTokenValidOrUndefined: () => { - const token = getAccessToken(); +// Setup the header for the request +const middlewareAuthLink = new ApolloLink((operation, forward) => { + const token = localStorage.getItem("AUTH_TOKEN"); - if (!token) { - return true; - } + const authorizationHeader = token ? `Bearer ${getAccessToken()}` : ``; + operation.setContext({ + headers: { + authorization: authorizationHeader, + }, + }); + return forward(operation); +}); - try { - const { exp } = jwtDecode(token); - if (Date.now() >= exp * 1000) { - return false; - } else { - return true; - } - } catch { - return false; - } - }, - fetchAccessToken: () => { - return fetch("http://localhost:4000/refresh_token", { - method: "POST", - credentials: "include" - }); - }, - handleFetch: accessToken => { +//After the backend responds, we take the accessToken from headers if it exists, and save it in the memory. +const afterwareLink = new ApolloLink((operation, forward) => { + return forward(operation).map((response) => { + const context = operation.getContext(); + const { + response: { headers }, + } = context; + if (headers) { + const accessToken = headers.get("access-token"); + if (accessToken) { setAccessToken(accessToken); - }, - handleError: err => { - console.warn("Your refresh token is invalid. Try to relogin"); - console.error(err); } - }), - onError(({ graphQLErrors, networkError }) => { - console.log(graphQLErrors); - console.log(networkError); - }), - requestLink, - new HttpLink({ - uri: "http://localhost:4000/graphql", - credentials: "include" - }) - ]), - cache + } + return response; + }); +}); + +const client = new ApolloClient({ + link: from([middlewareAuthLink, afterwareLink, httpLink]), + cache: new InMemoryCache(), }); ReactDOM.render( diff --git a/web/src/pages/Home.tsx b/web/src/pages/Home.tsx index 0bd13c8..d2912c7 100644 --- a/web/src/pages/Home.tsx +++ b/web/src/pages/Home.tsx @@ -14,7 +14,7 @@ export const Home: React.FC = () => {
users:
    - {data.users.map(x => { + {data.users.map((x) => { return (
  • {x.email}, {x.id} diff --git a/web/src/pages/Login.tsx b/web/src/pages/Login.tsx index 9179c98..fea40f9 100644 --- a/web/src/pages/Login.tsx +++ b/web/src/pages/Login.tsx @@ -1,7 +1,6 @@ import React, { useState } from "react"; import { RouteComponentProps } from "react-router"; import { useLoginMutation, MeDocument, MeQuery } from "../generated/graphql"; -import { setAccessToken } from "../accessToken"; interface Props {} @@ -28,7 +27,7 @@ export const Login: React.FC = ({ history }) => { store.writeQuery({ query: MeDocument, data: { - me: data.login.user + me: data.login } }); } @@ -36,10 +35,6 @@ export const Login: React.FC = ({ history }) => { console.log(response); - if (response && response.data) { - setAccessToken(response.data.login.accessToken); - } - history.push("/"); }} > diff --git a/web/src/pages/Register.tsx b/web/src/pages/Register.tsx index be33863..6c4b355 100644 --- a/web/src/pages/Register.tsx +++ b/web/src/pages/Register.tsx @@ -5,7 +5,7 @@ import { RouteComponentProps } from "react-router-dom"; export const Register: React.FC = ({ history }) => { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); - const [register] = useRegisterMutation(); + const [register, { error }] = useRegisterMutation(); return (
    = ({ history }) => { }); console.log(response); - - history.push("/"); + if(response.data && response.data.register) + history.push("/"); + else { + console.log(error); + window.alert("Error occured while registering a user"); + } }} >
    From 6f75eef3a202f3dd7d2b0c30695507260f7174c1 Mon Sep 17 00:00:00 2001 From: Bhaumik Joshi Date: Tue, 31 Aug 2021 00:44:43 +0530 Subject: [PATCH 7/7] removed accessToken field from login response --- web/src/graphql/login.graphql | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/web/src/graphql/login.graphql b/web/src/graphql/login.graphql index e328977..75ad687 100644 --- a/web/src/graphql/login.graphql +++ b/web/src/graphql/login.graphql @@ -1,9 +1,6 @@ mutation Login($email: String!, $password: String!) { login(email: $email, password: $password) { - accessToken - user { - id - email - } + id + email } }