From 06f1c2fba2d7c332b405b2d0c8d2baf00a7d0716 Mon Sep 17 00:00:00 2001 From: Balu Babu Date: Thu, 12 Jan 2023 21:31:25 +0530 Subject: [PATCH] refactor: refactored a few types around users and passwordless tokens in auth module --- .../migration.sql | 0 .../src/auth/auth.service.ts | 47 +++-- .../hoppscotch-backend/src/types/AuthUser.ts | 12 +- .../src/types/Passwordless.ts | 10 - .../src/types/ProviderAccount.ts | 13 -- .../src/user/user.service.ts | 13 +- packages/hoppscotch-backend/typescript | 172 ++++++++++++++++++ 7 files changed, 201 insertions(+), 66 deletions(-) rename packages/hoppscotch-backend/prisma/migrations/{20230109064650_auth => 20230112140525_auth}/migration.sql (100%) delete mode 100644 packages/hoppscotch-backend/src/types/ProviderAccount.ts create mode 100644 packages/hoppscotch-backend/typescript diff --git a/packages/hoppscotch-backend/prisma/migrations/20230109064650_auth/migration.sql b/packages/hoppscotch-backend/prisma/migrations/20230112140525_auth/migration.sql similarity index 100% rename from packages/hoppscotch-backend/prisma/migrations/20230109064650_auth/migration.sql rename to packages/hoppscotch-backend/prisma/migrations/20230112140525_auth/migration.sql diff --git a/packages/hoppscotch-backend/src/auth/auth.service.ts b/packages/hoppscotch-backend/src/auth/auth.service.ts index 954bb88ce..42c8b33b5 100644 --- a/packages/hoppscotch-backend/src/auth/auth.service.ts +++ b/packages/hoppscotch-backend/src/auth/auth.service.ts @@ -10,10 +10,7 @@ import * as bcrypt from 'bcrypt'; import * as O from 'fp-ts/Option'; import * as E from 'fp-ts/Either'; import * as TE from 'fp-ts/TaskEither'; -import { - DeviceIdentifierToken, - PasswordlessToken, -} from 'src/types/Passwordless'; +import { DeviceIdentifierToken } from 'src/types/Passwordless'; import { INVALID_EMAIL, INVALID_MAGIC_LINK_DATA, @@ -28,11 +25,11 @@ import { AuthTokens, RefreshTokenPayload, } from 'src/types/AuthTokens'; -import { ProviderAccount } from 'src/types/ProviderAccount'; import { JwtService } from '@nestjs/jwt'; import { AuthErrorHandler } from 'src/types/AuthErrorHandler'; import { AuthUser } from 'src/types/AuthUser'; import { isLeafType } from 'graphql'; +import { PasswordlessVerification } from '@prisma/client'; @Injectable() export class AuthService { @@ -44,25 +41,24 @@ export class AuthService { ) {} // generate Id and token for email magiclink - private async generatePasswordlessTokens(user: User) { + private async generatePasswordlessTokens(user: AuthUser) { const salt = await bcrypt.genSalt(10); const expiresOn = DateTime.now().plus({ hours: 3 }).toISO().toString(); - const idToken: PasswordlessToken = - await this.prismaService.passwordlessVerification.create({ - data: { - deviceIdentifier: salt, - userUid: user.id, - expiresOn: expiresOn, - }, - }); + const idToken = await this.prismaService.passwordlessVerification.create({ + data: { + deviceIdentifier: salt, + userUid: user.id, + expiresOn: expiresOn, + }, + }); return idToken; } private async validatePasswordlessTokens(data: verifyMagicDto) { try { - const tokens: PasswordlessToken = + const tokens = await this.prismaService.passwordlessVerification.findUniqueOrThrow({ where: { passwordless_deviceIdentifier_tokens: { @@ -79,7 +75,7 @@ export class AuthService { private async UpdateUserRefreshToken(tokenHash: string, userUid: string) { try { - const user: User = await this.prismaService.user.update({ + const user = await this.prismaService.user.update({ where: { id: userUid, }, @@ -143,7 +139,7 @@ export class AuthService { } private async deletePasswordlessVerificationToken( - passwordlessTokens: PasswordlessToken, + passwordlessTokens: PasswordlessVerification, ) { try { const deletedPasswordlessToken = @@ -162,15 +158,14 @@ export class AuthService { } async checkIfProviderAccountExists(user: User, profile) { - const provider: ProviderAccount = - await this.prismaService.account.findUnique({ - where: { - verifyProviderAccount: { - provider: profile.provider, - providerAccountId: profile.id, - }, + const provider = await this.prismaService.account.findUnique({ + where: { + verifyProviderAccount: { + provider: profile.provider, + providerAccountId: profile.id, }, - }); + }, + }); if (!provider) return O.none; @@ -186,7 +181,7 @@ export class AuthService { statusCode: HttpStatus.BAD_REQUEST, }); - let user: User; + let user: AuthUser; const queriedUser = await this.usersService.findUserByEmail(email); if (O.isNone(queriedUser)) { diff --git a/packages/hoppscotch-backend/src/types/AuthUser.ts b/packages/hoppscotch-backend/src/types/AuthUser.ts index 4626d8bdf..18e450a5b 100644 --- a/packages/hoppscotch-backend/src/types/AuthUser.ts +++ b/packages/hoppscotch-backend/src/types/AuthUser.ts @@ -1,9 +1,3 @@ -export interface AuthUser { - id: string; - name: string; - email: string; - image: string; - isAdmin: boolean; - refreshToken: string; - createdOn: Date; -} +import { User } from '@prisma/client'; + +export type AuthUser = User; diff --git a/packages/hoppscotch-backend/src/types/Passwordless.ts b/packages/hoppscotch-backend/src/types/Passwordless.ts index 9a8247daf..4b7d4ccae 100644 --- a/packages/hoppscotch-backend/src/types/Passwordless.ts +++ b/packages/hoppscotch-backend/src/types/Passwordless.ts @@ -1,13 +1,3 @@ -import { User } from 'src/user/user.model'; - -export interface PasswordlessToken { - deviceIdentifier: string; - token: string; - userUid: string; - user?: User; - expiresOn: Date; -} - export interface DeviceIdentifierToken { deviceIdentifier: string; } diff --git a/packages/hoppscotch-backend/src/types/ProviderAccount.ts b/packages/hoppscotch-backend/src/types/ProviderAccount.ts deleted file mode 100644 index 212cabbd7..000000000 --- a/packages/hoppscotch-backend/src/types/ProviderAccount.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { User } from 'src/user/user.model'; - -export interface ProviderAccount { - id: string; - userId: string; - user?: User; - provider: string; - providerAccountId: string; - providerRefreshToken?: string; - providerAccessToken?: string; - providerScope?: string; - loggedIn: Date; -} diff --git a/packages/hoppscotch-backend/src/user/user.service.ts b/packages/hoppscotch-backend/src/user/user.service.ts index d81376510..c502629d2 100644 --- a/packages/hoppscotch-backend/src/user/user.service.ts +++ b/packages/hoppscotch-backend/src/user/user.service.ts @@ -1,9 +1,6 @@ import { Injectable } from '@nestjs/common'; import { PrismaService } from 'src/prisma/prisma.service'; import * as O from 'fp-ts/Option'; -import { User } from './user.model'; -import { ProviderAccount } from '../types/ProviderAccount'; -import { AuthUser } from 'src/types/AuthUser'; @Injectable() export class UserService { @@ -11,7 +8,7 @@ export class UserService { async findUserByEmail(email: string) { try { - const user: AuthUser = await this.prisma.user.findUniqueOrThrow({ + const user = await this.prisma.user.findUniqueOrThrow({ where: { email: email, }, @@ -24,7 +21,7 @@ export class UserService { async findUserById(userUid: string) { try { - const user: AuthUser = await this.prisma.user.findUniqueOrThrow({ + const user = await this.prisma.user.findUniqueOrThrow({ where: { id: userUid, }, @@ -36,7 +33,7 @@ export class UserService { } async createUserMagic(email: string) { - const createdUser: AuthUser = await this.prisma.user.create({ + const createdUser = await this.prisma.user.create({ data: { email: email, accounts: { @@ -52,7 +49,7 @@ export class UserService { } async createUserSSO(accessToken, refreshToken, profile) { - const createdUser: AuthUser = await this.prisma.user.create({ + const createdUser = await this.prisma.user.create({ data: { name: profile.displayName, email: profile.emails[0].value, @@ -72,7 +69,7 @@ export class UserService { } async createProviderAccount(user, accessToken, refreshToken, profile) { - const createdProvider: ProviderAccount = await this.prisma.account.create({ + const createdProvider = await this.prisma.account.create({ data: { userId: user.id, provider: profile.provider, diff --git a/packages/hoppscotch-backend/typescript b/packages/hoppscotch-backend/typescript new file mode 100644 index 000000000..efc0c9475 --- /dev/null +++ b/packages/hoppscotch-backend/typescript @@ -0,0 +1,172 @@ +Script started on 2023-01-12 21:07:39+05:30 [TERM="xterm-256color" TTY="/dev/pts/3" COLUMNS="120" LINES="30"] +[oh-my-zsh] Insecure completion-dependent directories detected: +drwxrwxrwx 12 balubabu balubabu 4096 Jan 2 12:38 /home/balubabu/.oh-my-zsh +drwxrwxrwx 3 balubabu balubabu 4096 Jan 2 12:38 /home/balubabu/.oh-my-zsh/cache +drwxrwxrwx 2 balubabu balubabu 4096 Jan 2 12:38 /home/balubabu/.oh-my-zsh/cache/completions +drwxrwxrwx 316 balubabu balubabu 12288 Jan 2 12:38 /home/balubabu/.oh-my-zsh/plugins +drwxrwxrwx 2 balubabu balubabu 4096 Jan 2 12:38 /home/balubabu/.oh-my-zsh/plugins/git + +[oh-my-zsh] For safety, we will not load completions from these directories until +[oh-my-zsh] you fix their permissions and ownership and restart zsh. +[oh-my-zsh] See the above list for directories with group or other writability. + +[oh-my-zsh] To fix your permissions you can do so by disabling +[oh-my-zsh] the write permission of "group" and "others" and making sure that the +[oh-my-zsh] owner of these directories is either root or your current user. +[oh-my-zsh] The following command may help: +[oh-my-zsh] compaudit | xargs chmod g-w,o-w + +[oh-my-zsh] If the above didn't help or you want to skip the verification of +[oh-my-zsh] insecure directories you can set the variable ZSH_DISABLE_COMPFIX to +[oh-my-zsh] "true" before oh-my-zsh is sourced in your zshrc file. + +% ]2;balubabu@LAPTOP-ME2SCHA9:~/work/self-hosted/packages/hoppscotch-backend]1;..cotch-backend ➜ hoppscotch-backend git:(feat/user-authentication) ✗ [?1h=[?2004hccls[?1l>[?2004l +]2;clear]1;cls% ]2;balubabu@LAPTOP-ME2SCHA9:~/work/self-hosted/packages/hoppscotch-backend]1;..cotch-backend ➜ hoppscotch-backend git:(feat/user-authentication) ✗ [?1h=[?2004hmmigrate cd[?1l>[?2004l +]2;migrate cd]1;migratezsh: command not found: migrate +% ]2;balubabu@LAPTOP-ME2SCHA9:~/work/self-hosted/packages/hoppscotch-backend]1;..cotch-backend ➜ hoppscotch-backend git:(feat/user-authentication) ✗ [?1h=[?2004hbbash migrate[?1l>[?2004l +]2;bash migrate]1;bashbash: migrate: No such file or directory +% ]2;balubabu@LAPTOP-ME2SCHA9:~/work/self-hosted/packages/hoppscotch-backend]1;..cotch-backend ➜ hoppscotch-backend git:(feat/user-authentication) ✗ [?1h=[?2004hbash migrate.sh[?1l>[?2004l +]2;bash migrate.sh]1;bashbash: migrate.sh: No such file or directory +% ]2;balubabu@LAPTOP-ME2SCHA9:~/work/self-hosted/packages/hoppscotch-backend]1;..cotch-backend ➜ hoppscotch-backend git:(feat/user-authentication) ✗ [?1h=[?2004hccls[?1l>[?2004l +]2;clear]1;cls% ]2;balubabu@LAPTOP-ME2SCHA9:~/work/self-hosted/packages/hoppscotch-backend]1;..cotch-backend ➜ hoppscotch-backend git:(feat/user-authentication) ✗ [?1h=[?2004hccd ~[?1l>[?2004l +]2;cd ~]1;cd% ]2;balubabu@LAPTOP-ME2SCHA9:~]1;~ ➜ ~ [?1h=[?2004hchmod +x site-check.shchmod +x site-check.sh.sh .sh .sh .sh .sh .sh .sh .sh .sh .sh m.shi.shg.shr.sha.sht.she.sh[?1l>[?2004l +]2;chmod +x migrate.sh]1;chmod% ]2;balubabu@LAPTOP-ME2SCHA9:~]1;~ ➜ ~ [?1h=[?2004hmmirM +MiracastInputMgr.dll MiracastReceiver.dll MiracastReceiverExt.dll MirrorDrvCompat.dll  Mirir r  mmigrate gdfchs[?1l>[?2004l +]2;migrate gdfchs]1;migratezsh: command not found: migrate +% ]2;balubabu@LAPTOP-ME2SCHA9:~]1;~ ➜ ~ [?1h=[?2004hsudo cp site-check.sh /usr/bin/site-checksudo cp site-check.sh /usr/bin/site-check          migrate          m.sh /usr/bin/migratei.sh /usr/bin/migrateg.sh /usr/bin/migrater.sh /usr/bin/migratea.sh /usr/bin/migratet.sh /usr/bin/migratee.sh /usr/bin/migrate[?1l>[?2004l +]2;sudo cp migrate.sh /usr/bin/migrate]1;cp[sudo] password for balubabu: +% ]2;balubabu@LAPTOP-ME2SCHA9:~]1;~ ➜ ~ [?1h=[?2004hmmir grate[?1l>[?2004l +]2;migrate]1;migrate"docker exec" requires at least 2 arguments. +See 'docker exec --help'. + +Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] + +Run a command in a running container +% ]2;balubabu@LAPTOP-ME2SCHA9:~]1;~ ➜ ~ [?1h=[?2004hccls[?1l>[?2004l +]2;clear]1;cls% ]2;balubabu@LAPTOP-ME2SCHA9:~]1;~ ➜ ~ [?1h=[?2004hccd work//self-hosted//h packages//hoppscotch-backend/ [?1l>[?2004l +]2;cd work/self-hosted/packages/hoppscotch-backend]1;cd% ]2;balubabu@LAPTOP-ME2SCHA9:~/work/self-hosted/packages/hoppscotch-backend]1;..cotch-backend ➜ hoppscotch-backend git:(feat/user-authentication) ✗ [?1h=[?2004hcc;s[?1l>[?2004l +]2;c; s]1;c;szsh: command not found: c +zsh: command not found: s +% ]2;balubabu@LAPTOP-ME2SCHA9:~/work/self-hosted/packages/hoppscotch-backend]1;..cotch-backend ➜ hoppscotch-backend git:(feat/user-authentication) ✗ [?1h=[?2004hccls[?1l>[?2004l +]2;clear]1;cls% ]2;balubabu@LAPTOP-ME2SCHA9:~/work/self-hosted/packages/hoppscotch-backend]1;..cotch-backend ➜ hoppscotch-backend git:(feat/user-authentication) ✗ [?1h=[?2004hddocker ps[?1l>[?2004l +]2;docker ps]1;dockerCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +f48d44a76ccc hoppscotch-backend-local "docker-entrypoint.s…" 50 minutes ago Up 50 minutes 3170/tcp, 0.0.0.0:9229->9229/tcp, 0.0.0.0:3170->3000/tcp hoppscotch-backend-local-1 +ca1f2c39cdb5 postgres "docker-entrypoint.s…" 50 minutes ago Up 50 minutes 0.0.0.0:5432->5432/tcp hoppscotch-backend-dev-db-1 +% ]2;balubabu@LAPTOP-ME2SCHA9:~/work/self-hosted/packages/hoppscotch-backend]1;..cotch-backend ➜ hoppscotch-backend git:(feat/user-authentication) ✗ [?1h=[?2004hmmigrater  f48d44a76cccf48d44a76ccc\[?1l>[?2004l + > [?1h=[?2004h[?2004l +% ]2;balubabu@LAPTOP-ME2SCHA9:~/work/self-hosted/packages/hoppscotch-backend]1;..cotch-backend ➜ hoppscotch-backend git:(feat/user-authentication) ✗ [?1h=[?2004hmigrate f48d44a76ccc\ [?1l>[?2004l +]2;migrate f48d44a76ccc]1;migrate[?2004hroot@f48d44a76ccc:/usr/src/app# cd prisma/ +[?2004l [?2004hroot@f48d44a76ccc:/usr/src/app/prisma# pnpx prisma migrate dev +[?2004l .pnpm-store/v3/tmp/dlx-2319 | Progress: resolved 1, reused 0, downloaded 0, added 0 +.pnpm-store/v3/tmp/dlx-2319 | +2 + +.pnpm-store/v3/tmp/dlx-2319 | Progress: resolved 1, reused 0, downloaded 0, added 0 +.pnpm-store/v3/tmp/dlx-2319 | Progress: resolved 2, reused 2, downloaded 0, added 2, done +Environment variables loaded from ../.env +Prisma schema loaded from schema.prisma +Datasource "db": PostgreSQL database "hoppscotch", schema "public" at "dev-db:5432" + +Applying migration `20230112140525_auth` + +The following migration(s) have been applied: + +migrations/ + └─ 20230112140525_auth/ + └─ migration.sql + +Your database is now in sync with your schema. + +[?25lRunning generate... (Use --skip-generate to skip the generators) +[?25lRunning generate... - Prisma Client +[?25l✔ Generated Prisma Client (4.8.1 | library) to ./../node_modules/.pnpm/@prisma+client@4.8.1_prisma@4.8.1/node_modules/@p +risma/client in 121ms + + +[?25h[?2004hroot@f48d44a76ccc:/usr/src/app/prisma# exit +[?2004l exit +% ]2;balubabu@LAPTOP-ME2SCHA9:~/work/self-hosted/packages/hoppscotch-backend]1;..cotch-backend ➜ hoppscotch-backend git:(feat/user-authentication) ✗ [?1h=[?2004hccls[?1l>[?2004l +]2;clear]1;cls% ]2;balubabu@LAPTOP-ME2SCHA9:~/work/self-hosted/packages/hoppscotch-backend]1;..cotch-backend ➜ hoppscotch-backend git:(feat/user-authentication) ✗ [?1h=[?2004hnpm install passport-google-oauth20npm install passport-google-oauth20pnpm install passport-google-oauth20-passport-google-oauth20-passport-google-oauth20spassport-google-oauth20apassport-google-oauth20vpassport-google-oauth20epassport-google-oauth20 passport-google-oauth20[?1l>[?2004l +]2;pnpm install --save passport-google-oauth20]1;pnpm../.. | Progress: resolved 0, reused 1, downloaded 0, added 0 + + ╭──────────────────────────────────────────────────────────────────╮ + │ │ + │ Update available! 7.21.0 → 7.24.3. │ + │ Changelog: https://github.com/pnpm/pnpm/releases/tag/v7.24.3 │ + │ Run "pnpm add -g pnpm" to update. │ + │ │ + │ Follow @pnpmjs for updates: https://twitter.com/pnpmjs │ + │ │ + ╰──────────────────────────────────────────────────────────────────╯ + +../.. | Progress: resolved 0, reused 1, downloaded 0, added 0 + WARN  deprecated apollo-server-plugin-base@3.7.1: The `apollo-server-plugin-base` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. +../.. | Progress: resolved 0, reused 1, downloaded 0, added 0 + WARN  deprecated apollo-server-express@3.11.1: The `apollo-server-express` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. +../.. | Progress: resolved 0, reused 1, downloaded 0, added 0 +../.. | Progress: resolved 54, reused 54, downloaded 0, added 0 +../.. | Progress: resolved 55, reused 55, downloaded 0, added 0 +../.. | Progress: resolved 56, reused 55, downloaded 0, added 0 +../.. | Progress: resolved 80, reused 79, downloaded 0, added 0 +../.. | Progress: resolved 146, reused 143, downloaded 1, added 0 + WARN  deprecated subscriptions-transport-ws@0.11.0: The `subscriptions-transport-ws` package is no longer maintained. We recommend you use `graphql-ws` instead. For help migrating Apollo software to `graphql-ws`, see https://www.apollographql.com/docs/apollo-server/data/subscriptions/#switching-from-subscriptions-transport-ws For general help using `graphql-ws`, see https://github.com/enisdenjo/graphql-ws/blob/master/README.md +../.. | Progress: resolved 146, reused 143, downloaded 1, added 0 + WARN  deprecated apollo-server-types@3.7.1: The `apollo-server-types` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. +../.. | Progress: resolved 146, reused 143, downloaded 1, added 0 +../.. | Progress: resolved 238, reused 233, downloaded 3, added 0 + WARN  deprecated apollo-server-core@3.11.1: The `apollo-server-core` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. +../.. | Progress: resolved 238, reused 233, downloaded 3, added 0 +../.. | Progress: resolved 274, reused 269, downloaded 3, added 0 +../.. | Progress: resolved 378, reused 374, downloaded 3, added 0 + WARN  deprecated apollo-datasource@3.3.2: The `apollo-datasource` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. +../.. | Progress: resolved 378, reused 374, downloaded 3, added 0 + WARN  deprecated apollo-reporting-protobuf@3.3.3: The `apollo-reporting-protobuf` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/usage-reporting-protobuf` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. +../.. | Progress: resolved 378, reused 374, downloaded 3, added 0 + WARN  deprecated apollo-server-env@4.2.1: The `apollo-server-env` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/utils.fetcher` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. +../.. | Progress: resolved 378, reused 374, downloaded 3, added 0 + WARN  deprecated apollo-server-errors@3.3.1: The `apollo-server-errors` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. +../.. | Progress: resolved 378, reused 374, downloaded 3, added 0 +../.. | Progress: resolved 459, reused 455, downloaded 3, added 0 +../.. | Progress: resolved 540, reused 536, downloaded 3, added 0 +../.. | Progress: resolved 676, reused 672, downloaded 3, added 0 +../.. | Progress: resolved 792, reused 786, downloaded 3, added 0 +../.. | +5 + +../.. | Progress: resolved 792, reused 786, downloaded 3, added 0 +../.. | Progress: resolved 792, reused 786, downloaded 5, added 5, done + +dependencies: ++ passport-google-oauth20 2.0.0 + + WARN  Issues with peer dependencies found +packages/hoppscotch-backend +└─┬ ts-loader 9.4.2 + └── ✕ missing peer webpack@^5.0.0 +Peer dependencies that should be installed: + webpack@^5.0.0 + +Done in 9s +% ]2;balubabu@LAPTOP-ME2SCHA9:~/work/self-hosted/packages/hoppscotch-backend]1;..cotch-backend ➜ hoppscotch-backend git:(feat/user-authentication) ✗ [?1h=[?2004hpnpm install --save passport-google-oauth20     D passport-google-oauth20@passport-google-oauth20tpassport-google-oauth20ypassport-google-oauth20passport-google-oauth20epassport-google-oauth20spassport-google-oauth20/passport-google-oauth20[?1l>[?2004l +]2;pnpm install -D @types/passport-google-oauth20]1;pnpm../.. | Progress: resolved 0, reused 1, downloaded 0, added 0 + WARN  deprecated apollo-server-express@3.11.1: The `apollo-server-express` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. +../.. | Progress: resolved 0, reused 1, downloaded 0, added 0 + WARN  deprecated apollo-server-plugin-base@3.7.1: The `apollo-server-plugin-base` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. +../.. | Progress: resolved 0, reused 1, downloaded 0, added 0 +../.. | Progress: resolved 55, reused 55, downloaded 0, added 0 +../.. | Progress: resolved 56, reused 56, downloaded 0, added 0 +../.. | Progress: resolved 57, reused 56, downloaded 0, added 0 +../.. | Progress: resolved 74, reused 73, downloaded 0, added 0 +../.. | Progress: resolved 144, reused 141, downloaded 0, added 0 + WARN  deprecated subscriptions-transport-ws@0.11.0: The `subscriptions-transport-ws` package is no longer maintained. We recommend you use `graphql-ws` instead. For help migrating Apollo software to `graphql-ws`, see https://www.apollographql.com/docs/apollo-server/data/subscriptions/#switching-from-subscriptions-transport-ws For general help using `graphql-ws`, see https://github.com/enisdenjo/graphql-ws/blob/master/README.md +../.. | Progress: resolved 144, reused 141, downloaded 0, added 0 + WARN  deprecated apollo-server-core@3.11.1: The `apollo-server-core` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. +../.. | Progress: resolved 144, reused 141, downloaded 0, added 0 + WARN  deprecated apollo-server-types@3.7.1: The `apollo-server-types` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. +../.. | Progress: resolved 144, reused 141, downloaded 0, added 0 +../.. | Progress: resolved 240, reused 237, downloaded 0, added 0 +../.. | Progress: resolved 314, reused 311, downloaded 0, added 0 +../.. | Progress: resolved 410, reused 408, downloaded 0, added 0 + WARN  deprecated apollo-datasource@3.3.2: The `apollo-datasource` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. +../.. | Progress: resolved 410, reused 408, downloaded 0, added 0 + WARN  deprecated apollo-reporting-protobuf@3.3.3: The `apollo-reporting-protobuf` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/usage-reporting-protobuf` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. +../.. | Progress: resolved 410, reused 408, downloaded 0, added 0 + WARN  deprecated apollo-server-env@4.2.1: The `apollo-server-env` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/utils.fetcher` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. +../.. | Progress: resolved 410, reused 408, downloaded 0, added 0 + WARN  deprecated apollo-server-errors@3.3.1: The `apollo-server-errors` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo \ No newline at end of file