From 35de1889ad5012d3ff45e089ce5fddc7ea7f1ff5 Mon Sep 17 00:00:00 2001 From: Dipendra Upreti Date: Wed, 28 Feb 2024 16:17:13 +0545 Subject: [PATCH 1/3] build(user): update supertokens-node to 15.0.4 --- packages/user/package.json | 4 +- packages/user/src/constants.ts | 4 ++ packages/user/src/lib/hasUserPermission.ts | 4 +- packages/user/src/lib/verifyEmail.ts | 8 ++- .../invitations/handlers/acceptInvitation.ts | 16 ++++-- .../user/src/model/invitations/resolver.ts | 22 ++++++--- .../src/model/users/handlers/adminSignUp.ts | 30 +++++++----- .../model/users/handlers/canAdminSignUp.ts | 7 ++- packages/user/src/model/users/resolver.ts | 40 ++++++++++----- packages/user/src/model/users/service.ts | 3 +- .../appleRedirectHandlerPost.ts | 4 +- .../emailPasswordSignUp.ts | 4 ++ .../thirdPartySignInUp.ts | 2 + .../thirdPartySignInUpPost.ts | 5 +- .../thirdPartyEmailPasswordRecipeConfig.ts | 3 +- .../recipes/config/thirdPartyProviders.ts | 49 ------------------- packages/user/src/supertokens/types/index.ts | 20 ++------ packages/user/src/userContext.ts | 3 +- pnpm-lock.yaml | 40 ++++++++++++--- 19 files changed, 146 insertions(+), 122 deletions(-) delete mode 100644 packages/user/src/supertokens/recipes/config/thirdPartyProviders.ts diff --git a/packages/user/package.json b/packages/user/package.json index 94ab7a0e7..ff051dd5b 100644 --- a/packages/user/package.json +++ b/packages/user/package.json @@ -56,7 +56,7 @@ "mercurius-auth": "4.0.0", "prettier": "2.8.8", "slonik": "37.2.0", - "supertokens-node": "14.1.3", + "supertokens-node": "15.0.4", "tsconfig": "0.62.1", "typescript": "4.9.5", "vite": "4.3.9", @@ -74,7 +74,7 @@ "mercurius": ">=12.2.0", "mercurius-auth": ">=4.0.0", "slonik": ">=37.2.0", - "supertokens-node": ">=14.1.3" + "supertokens-node": ">=15.0.4" }, "engines": { "node": ">=16", diff --git a/packages/user/src/constants.ts b/packages/user/src/constants.ts index 384a074b3..6ca74a04a 100644 --- a/packages/user/src/constants.ts +++ b/packages/user/src/constants.ts @@ -42,6 +42,9 @@ const PERMISSIONS_USERS_DISABLE = "users:disable"; const PERMISSIONS_USERS_ENABLE = "users:enable"; const PERMISSIONS_USERS_LIST = "users:enable"; +// Supertokens +const TENANT_ID = "public"; + export { EMAIL_VERIFICATION_MODE, EMAIL_VERIFICATION_PATH, @@ -53,6 +56,7 @@ export { PERMISSIONS_USERS_DISABLE, PERMISSIONS_USERS_ENABLE, PERMISSIONS_USERS_LIST, + TENANT_ID, RESET_PASSWORD_PATH, ROLE_ADMIN, ROLE_SUPER_ADMIN, diff --git a/packages/user/src/lib/hasUserPermission.ts b/packages/user/src/lib/hasUserPermission.ts index 6c1d8c19e..8bac96000 100644 --- a/packages/user/src/lib/hasUserPermission.ts +++ b/packages/user/src/lib/hasUserPermission.ts @@ -1,6 +1,6 @@ import UserRoles from "supertokens-node/recipe/userroles"; -import { ROLE_SUPER_ADMIN } from "../constants"; +import { ROLE_SUPER_ADMIN, TENANT_ID } from "../constants"; import type { FastifyInstance } from "fastify"; @@ -30,7 +30,7 @@ const hasUserPermission = async ( return true; } - const { roles } = await UserRoles.getRolesForUser(userId); + const { roles } = await UserRoles.getRolesForUser(TENANT_ID, userId); // Allow if user has super admin role if (roles && roles.includes(ROLE_SUPER_ADMIN)) { diff --git a/packages/user/src/lib/verifyEmail.ts b/packages/user/src/lib/verifyEmail.ts index c7596cc8e..cba854f92 100644 --- a/packages/user/src/lib/verifyEmail.ts +++ b/packages/user/src/lib/verifyEmail.ts @@ -1,15 +1,21 @@ import EmailVerification from "supertokens-node/recipe/emailverification"; +import { TENANT_ID } from "../constants"; + /** * Auto verify user email. */ const verifyEmail = async (userId: string) => { const tokenResponse = await EmailVerification.createEmailVerificationToken( + TENANT_ID, userId ); if (tokenResponse.status === "OK") { - await EmailVerification.verifyEmailUsingToken(tokenResponse.token); + await EmailVerification.verifyEmailUsingToken( + TENANT_ID, + tokenResponse.token + ); } }; diff --git a/packages/user/src/model/invitations/handlers/acceptInvitation.ts b/packages/user/src/model/invitations/handlers/acceptInvitation.ts index 4e5bda1cd..7c086ac32 100644 --- a/packages/user/src/model/invitations/handlers/acceptInvitation.ts +++ b/packages/user/src/model/invitations/handlers/acceptInvitation.ts @@ -2,6 +2,7 @@ import { formatDate } from "@dzangolab/fastify-slonik"; import { createNewSession } from "supertokens-node/recipe/session"; import { emailPasswordSignUp } from "supertokens-node/recipe/thirdpartyemailpassword"; +import { TENANT_ID } from "../../../constants"; import getInvitationService from "../../../lib/getInvitationService"; import isInvitationValid from "../../../lib/isInvitationValid"; import validateEmail from "../../../validator/email"; @@ -70,10 +71,15 @@ const acceptInvitation = async ( } // signup - const signUpResponse = await emailPasswordSignUp(email, password, { - roles: [invitation.role], - autoVerifyEmail: true, - }); + const signUpResponse = await emailPasswordSignUp( + TENANT_ID, + email, + password, + { + roles: [invitation.role], + autoVerifyEmail: true, + } + ); if (signUpResponse.status !== "OK") { return reply.send(signUpResponse); @@ -96,7 +102,7 @@ const acceptInvitation = async ( } // create new session so the user be logged in on signup - await createNewSession(request, reply, signUpResponse.user.id); + await createNewSession(request, reply, TENANT_ID, signUpResponse.user.id); reply.send({ ...signUpResponse, diff --git a/packages/user/src/model/invitations/resolver.ts b/packages/user/src/model/invitations/resolver.ts index 5816ed7b8..24c419798 100644 --- a/packages/user/src/model/invitations/resolver.ts +++ b/packages/user/src/model/invitations/resolver.ts @@ -3,7 +3,7 @@ import mercurius from "mercurius"; import { createNewSession } from "supertokens-node/recipe/session"; import { emailPasswordSignUp } from "supertokens-node/recipe/thirdpartyemailpassword"; -import { ROLE_ADMIN } from "../../constants"; +import { ROLE_ADMIN, TENANT_ID } from "../../constants"; import computeInvitationExpiresAt from "../../lib/computeInvitationExpiresAt"; import getInvitationService from "../../lib/getInvitationService"; import isInvitationValid from "../../lib/isInvitationValid"; @@ -80,10 +80,15 @@ const Mutation = { } // signup - const signUpResponse = await emailPasswordSignUp(email, password, { - roles: [invitation.role], - autoVerifyEmail: true, - }); + const signUpResponse = await emailPasswordSignUp( + TENANT_ID, + email, + password, + { + roles: [invitation.role], + autoVerifyEmail: true, + } + ); if (signUpResponse.status !== "OK") { return signUpResponse; @@ -106,7 +111,12 @@ const Mutation = { } // create new session so the user be logged in on signup - await createNewSession(reply.request, reply, signUpResponse.user.id); + await createNewSession( + reply.request, + reply, + TENANT_ID, + signUpResponse.user.id + ); return { ...signUpResponse, diff --git a/packages/user/src/model/users/handlers/adminSignUp.ts b/packages/user/src/model/users/handlers/adminSignUp.ts index 10d56c5bd..9ee74bcee 100644 --- a/packages/user/src/model/users/handlers/adminSignUp.ts +++ b/packages/user/src/model/users/handlers/adminSignUp.ts @@ -2,7 +2,7 @@ import { createNewSession } from "supertokens-node/recipe/session"; import { emailPasswordSignUp } from "supertokens-node/recipe/thirdpartyemailpassword"; import UserRoles from "supertokens-node/recipe/userroles"; -import { ROLE_ADMIN } from "../../../constants"; +import { ROLE_ADMIN, TENANT_ID } from "../../../constants"; import validateEmail from "../../../validator/email"; import validatePassword from "../../../validator/password"; @@ -21,7 +21,10 @@ const adminSignUp = async (request: FastifyRequest, reply: FastifyReply) => { const { email, password } = body; // check if already admin user exists - const adminUsers = await UserRoles.getUsersThatHaveRole(ROLE_ADMIN); + const adminUsers = await UserRoles.getUsersThatHaveRole( + TENANT_ID, + ROLE_ADMIN + ); if (adminUsers.status === "UNKNOWN_ROLE_ERROR") { return reply.send({ @@ -56,22 +59,27 @@ const adminSignUp = async (request: FastifyRequest, reply: FastifyReply) => { } // signup - const signUpResponse = await emailPasswordSignUp(email, password, { - autoVerifyEmail: true, - roles: [ROLE_ADMIN], - _default: { - request: { - request, + const signUpResponse = await emailPasswordSignUp( + TENANT_ID, + email, + password, + { + autoVerifyEmail: true, + roles: [ROLE_ADMIN], + _default: { + request: { + request, + }, }, - }, - }); + } + ); if (signUpResponse.status !== "OK") { return reply.send(signUpResponse); } // create new session so the user be logged in on signup - await createNewSession(request, reply, signUpResponse.user.id); + await createNewSession(request, reply, TENANT_ID, signUpResponse.user.id); reply.send({ ...signUpResponse, diff --git a/packages/user/src/model/users/handlers/canAdminSignUp.ts b/packages/user/src/model/users/handlers/canAdminSignUp.ts index 285e241ba..7f42fbc8a 100644 --- a/packages/user/src/model/users/handlers/canAdminSignUp.ts +++ b/packages/user/src/model/users/handlers/canAdminSignUp.ts @@ -1,6 +1,6 @@ import UserRoles from "supertokens-node/recipe/userroles"; -import { ROLE_ADMIN } from "../../../constants"; +import { ROLE_ADMIN, TENANT_ID } from "../../../constants"; import type { FastifyReply, FastifyRequest } from "fastify"; @@ -9,7 +9,10 @@ const canAdminSignUp = async (request: FastifyRequest, reply: FastifyReply) => { try { // check if already admin user exists - const adminUsers = await UserRoles.getUsersThatHaveRole(ROLE_ADMIN); + const adminUsers = await UserRoles.getUsersThatHaveRole( + TENANT_ID, + ROLE_ADMIN + ); if (adminUsers.status === "UNKNOWN_ROLE_ERROR") { return reply.send({ diff --git a/packages/user/src/model/users/resolver.ts b/packages/user/src/model/users/resolver.ts index 84a9bdac5..c8af084eb 100644 --- a/packages/user/src/model/users/resolver.ts +++ b/packages/user/src/model/users/resolver.ts @@ -4,7 +4,7 @@ import { emailPasswordSignUp } from "supertokens-node/recipe/thirdpartyemailpass import UserRoles from "supertokens-node/recipe/userroles"; import filterUserUpdateInput from "./filterUserUpdateInput"; -import { ROLE_ADMIN } from "../../constants"; +import { ROLE_ADMIN, TENANT_ID } from "../../constants"; import getUserService from "../../lib/getUserService"; import validateEmail from "../../validator/email"; import validatePassword from "../../validator/password"; @@ -30,7 +30,10 @@ const Mutation = { const { email, password } = arguments_.data; // check if already admin user exists - const adminUsers = await UserRoles.getUsersThatHaveRole(ROLE_ADMIN); + const adminUsers = await UserRoles.getUsersThatHaveRole( + TENANT_ID, + ROLE_ADMIN + ); let errorMessage: string | undefined; @@ -69,15 +72,20 @@ const Mutation = { } // signup - const signUpResponse = await emailPasswordSignUp(email, password, { - autoVerifyEmail: true, - roles: [ROLE_ADMIN], - _default: { - request: { - request: reply.request, + const signUpResponse = await emailPasswordSignUp( + TENANT_ID, + email, + password, + { + autoVerifyEmail: true, + roles: [ROLE_ADMIN], + _default: { + request: { + request: reply.request, + }, }, - }, - }); + } + ); if (signUpResponse.status !== "OK") { const mercuriusError = new mercurius.ErrorWithProps( @@ -88,7 +96,12 @@ const Mutation = { } // create new session so the user be logged in on signup - await createNewSession(reply.request, reply, signUpResponse.user.id); + await createNewSession( + reply.request, + reply, + TENANT_ID, + signUpResponse.user.id + ); return { ...signUpResponse, @@ -253,7 +266,10 @@ const Query = { try { // check if already admin user exists - const adminUsers = await UserRoles.getUsersThatHaveRole(ROLE_ADMIN); + const adminUsers = await UserRoles.getUsersThatHaveRole( + TENANT_ID, + ROLE_ADMIN + ); if (adminUsers.status === "UNKNOWN_ROLE_ERROR") { const mercuriusError = new mercurius.ErrorWithProps(adminUsers.status); diff --git a/packages/user/src/model/users/service.ts b/packages/user/src/model/users/service.ts index 7b8189613..f98215db6 100644 --- a/packages/user/src/model/users/service.ts +++ b/packages/user/src/model/users/service.ts @@ -3,7 +3,7 @@ import Session from "supertokens-node/recipe/session"; import ThirdPartyEmailPassword from "supertokens-node/recipe/thirdpartyemailpassword"; import UserSqlFactory from "./sqlFactory"; -import { TABLE_USERS } from "../../constants"; +import { TABLE_USERS, TENANT_ID } from "../../constants"; import validatePassword from "../../validator/password"; import type { Service } from "@dzangolab/fastify-slonik"; @@ -62,6 +62,7 @@ class UserService< if (userInfo) { const isPasswordValid = await ThirdPartyEmailPassword.emailPasswordSignIn( + TENANT_ID, userInfo.email, oldPassword, { dbSchema: this.schema } diff --git a/packages/user/src/supertokens/recipes/config/third-party-email-password/appleRedirectHandlerPost.ts b/packages/user/src/supertokens/recipes/config/third-party-email-password/appleRedirectHandlerPost.ts index 3ff45f8c6..a12c79735 100644 --- a/packages/user/src/supertokens/recipes/config/third-party-email-password/appleRedirectHandlerPost.ts +++ b/packages/user/src/supertokens/recipes/config/third-party-email-password/appleRedirectHandlerPost.ts @@ -11,14 +11,14 @@ const appleRedirectHandlerPOST = ( throw new Error("Should never come here"); } - const stateInBase64 = input.state; + const stateInBase64 = input.formPostInfoFromProvider.state; const state = JSON.parse( Buffer.from(stateInBase64, "base64").toString("ascii") ); if (state.isAndroid && state.appId) { - const queryString = `code=${input.code}&state=${input.state}`; + const queryString = `code=${input.formPostInfoFromProvider.code}&state=${input.formPostInfoFromProvider.state}`; const redirectUrl = `intent://callback?${queryString}#Intent;package=${state.appId};scheme=signinwithapple;end`; diff --git a/packages/user/src/supertokens/recipes/config/third-party-email-password/emailPasswordSignUp.ts b/packages/user/src/supertokens/recipes/config/third-party-email-password/emailPasswordSignUp.ts index 9bbb3a788..edd747319 100644 --- a/packages/user/src/supertokens/recipes/config/third-party-email-password/emailPasswordSignUp.ts +++ b/packages/user/src/supertokens/recipes/config/third-party-email-password/emailPasswordSignUp.ts @@ -2,6 +2,7 @@ import { deleteUser } from "supertokens-node"; import EmailVerification from "supertokens-node/recipe/emailverification"; import UserRoles from "supertokens-node/recipe/userroles"; +import { TENANT_ID } from "../../../../constants"; import getUserService from "../../../../lib/getUserService"; import sendEmail from "../../../../lib/sendEmail"; import verifyEmail from "../../../../lib/verifyEmail"; @@ -71,6 +72,7 @@ const emailPasswordSignUp = ( for (const role of roles) { const rolesResponse = await UserRoles.addRoleToUser( + TENANT_ID, originalResponse.user.id, role ); @@ -89,6 +91,7 @@ const emailPasswordSignUp = ( // send email verification const tokenResponse = await EmailVerification.createEmailVerificationToken( + TENANT_ID, originalResponse.user.id ); @@ -99,6 +102,7 @@ const emailPasswordSignUp = ( type: "EMAIL_VERIFICATION", user: originalResponse.user, emailVerifyLink: `${config.appOrigin[0]}/auth/verify-email?token=${tokenResponse.token}&rid=emailverification`, + tenantId: TENANT_ID, userContext: input.userContext, }); } diff --git a/packages/user/src/supertokens/recipes/config/third-party-email-password/thirdPartySignInUp.ts b/packages/user/src/supertokens/recipes/config/third-party-email-password/thirdPartySignInUp.ts index 6b3463674..31fe2f167 100644 --- a/packages/user/src/supertokens/recipes/config/third-party-email-password/thirdPartySignInUp.ts +++ b/packages/user/src/supertokens/recipes/config/third-party-email-password/thirdPartySignInUp.ts @@ -2,6 +2,7 @@ import { deleteUser } from "supertokens-node"; import { getUserByThirdPartyInfo } from "supertokens-node/recipe/thirdpartyemailpassword"; import UserRoles from "supertokens-node/recipe/userroles"; +import { TENANT_ID } from "../../../../constants"; import areRolesExist from "../../../utils/areRolesExist"; import type { FastifyInstance, FastifyError } from "fastify"; @@ -49,6 +50,7 @@ const thirdPartySignInUp = ( for (const role of roles) { const rolesResponse = await UserRoles.addRoleToUser( + TENANT_ID, originalResponse.user.id, role ); diff --git a/packages/user/src/supertokens/recipes/config/third-party-email-password/thirdPartySignInUpPost.ts b/packages/user/src/supertokens/recipes/config/third-party-email-password/thirdPartySignInUpPost.ts index c9b8995fa..b7a0b8ecd 100644 --- a/packages/user/src/supertokens/recipes/config/third-party-email-password/thirdPartySignInUpPost.ts +++ b/packages/user/src/supertokens/recipes/config/third-party-email-password/thirdPartySignInUpPost.ts @@ -84,14 +84,11 @@ const thirdPartySignInUpPOST = ( } return { - status: "OK", - createdNewUser: originalResponse.createdNewUser, + ...originalResponse, user: { ...originalResponse.user, ...user, }, - session: originalResponse.session, - authCodeResponse: originalResponse.authCodeResponse, }; } diff --git a/packages/user/src/supertokens/recipes/config/thirdPartyEmailPasswordRecipeConfig.ts b/packages/user/src/supertokens/recipes/config/thirdPartyEmailPasswordRecipeConfig.ts index 0cd209b32..a88dd49d2 100644 --- a/packages/user/src/supertokens/recipes/config/thirdPartyEmailPasswordRecipeConfig.ts +++ b/packages/user/src/supertokens/recipes/config/thirdPartyEmailPasswordRecipeConfig.ts @@ -7,7 +7,6 @@ import resetPasswordUsingToken from "./third-party-email-password/resetPasswordU import sendPasswordResetEmail from "./third-party-email-password/sendPasswordResetEmail"; import thirdPartySignInUp from "./third-party-email-password/thirdPartySignInUp"; import thirdPartySignInUpPOST from "./third-party-email-password/thirdPartySignInUpPost"; -import getThirdPartyProviders from "./thirdPartyProviders"; import type { SendEmailWrapper, @@ -136,7 +135,7 @@ const getThirdPartyEmailPasswordRecipeConfig = ( }; }, }, - providers: getThirdPartyProviders(config), + providers: config.user.supertokens.providers, }; }; diff --git a/packages/user/src/supertokens/recipes/config/thirdPartyProviders.ts b/packages/user/src/supertokens/recipes/config/thirdPartyProviders.ts deleted file mode 100644 index e8656b3b3..000000000 --- a/packages/user/src/supertokens/recipes/config/thirdPartyProviders.ts +++ /dev/null @@ -1,49 +0,0 @@ -import ThirdPartyEmailPassword from "supertokens-node/recipe/thirdpartyemailpassword"; - -import type { ApiConfig } from "@dzangolab/fastify-config"; -import type { TypeProvider } from "supertokens-node/recipe/thirdpartyemailpassword"; - -const getThirdPartyProviders = (config: ApiConfig) => { - const { Apple, Facebook, Github, Google } = ThirdPartyEmailPassword; - const providersConfig = config.user.supertokens.providers; - const providers: TypeProvider[] = []; - - const providerFunctions = [ - { name: "google", initProvider: Google }, - { name: "github", initProvider: Github }, - { name: "facebook", initProvider: Facebook }, - { name: "apple", initProvider: Apple }, - ]; - - for (const provider of providerFunctions) { - if (providersConfig?.[provider.name as never]) { - if (provider.name === "apple") { - const appleProviderConfigs = providersConfig[provider.name]; - - if (appleProviderConfigs) { - for (const appleProviderConfig of appleProviderConfigs) { - providers.push(provider.initProvider(appleProviderConfig as never)); - } - } - } else { - providers.push( - provider.initProvider( - providersConfig[provider.name as never] as never - ) - ); - } - } - } - - const customProviders = providersConfig?.custom; - - if (customProviders) { - for (const customerProvider of customProviders) { - providers.push(customerProvider); - } - } - - return providers; -}; - -export default getThirdPartyProviders; diff --git a/packages/user/src/supertokens/types/index.ts b/packages/user/src/supertokens/types/index.ts index 4eabbb2b7..f2ed6773c 100644 --- a/packages/user/src/supertokens/types/index.ts +++ b/packages/user/src/supertokens/types/index.ts @@ -1,17 +1,15 @@ -import ThirdPartyEmailPassword from "supertokens-node/recipe/thirdpartyemailpassword"; - import type { EmailVerificationRecipe } from "./emailVerificationRecipe"; import type { SessionRecipe } from "./sessionRecipe"; import type { ThirdPartyEmailPasswordRecipe } from "./thirdPartyEmailPasswordRecipe"; import type { FastifyInstance } from "fastify"; import type { TypeInput as EmailVerificationRecipeConfig } from "supertokens-node/recipe/emailverification/types"; import type { TypeInput as SessionRecipeConfig } from "supertokens-node/recipe/session/types"; -import type { TypeProvider } from "supertokens-node/recipe/thirdpartyemailpassword"; -import type { TypeInput as ThirdPartyEmailPasswordRecipeConfig } from "supertokens-node/recipe/thirdpartyemailpassword/types"; +import type { + TypeInput as ThirdPartyEmailPasswordRecipeConfig, + ThirdPartyProviderInput, +} from "supertokens-node/recipe/thirdpartyemailpassword/types"; import type { TypeInput as UserRolesRecipeConfig } from "supertokens-node/recipe/userroles/types"; -const { Apple, Facebook, Github, Google } = ThirdPartyEmailPassword; - interface SupertokensRecipes { emailVerification?: | EmailVerificationRecipe @@ -23,17 +21,9 @@ interface SupertokensRecipes { | ((fastify: FastifyInstance) => ThirdPartyEmailPasswordRecipeConfig); } -interface SupertokensThirdPartyProvider { - apple?: Parameters[0][]; - facebook?: Parameters[0]; - github?: Parameters[0]; - google?: Parameters[0]; - custom?: TypeProvider[]; -} - interface SupertokensConfig { connectionUri: string; - providers?: SupertokensThirdPartyProvider; + providers?: ThirdPartyProviderInput[]; recipes?: SupertokensRecipes; resetPasswordPath?: string; emailVerificationPath?: string; diff --git a/packages/user/src/userContext.ts b/packages/user/src/userContext.ts index 5b976ef91..99ac31b96 100644 --- a/packages/user/src/userContext.ts +++ b/packages/user/src/userContext.ts @@ -4,6 +4,7 @@ import { EmailVerificationClaim } from "supertokens-node/recipe/emailverificatio import Session from "supertokens-node/recipe/session"; import UserRoles from "supertokens-node/recipe/userroles"; +import { TENANT_ID } from "./constants"; import getUserService from "./lib/getUserService"; import type { User } from "./types"; @@ -64,7 +65,7 @@ const userContext = async ( throw new Error("Unable to find user"); } - const { roles } = await UserRoles.getRolesForUser(userId); + const { roles } = await UserRoles.getRolesForUser(TENANT_ID, userId); context.user = user; context.roles = roles; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5fbdef4bd..b3204ef71 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -585,8 +585,8 @@ importers: specifier: 37.2.0 version: 37.2.0(zod@3.22.4) supertokens-node: - specifier: 14.1.3 - version: 14.1.3 + specifier: 15.0.4 + version: 15.0.4 tsconfig: specifier: 0.62.1 version: link:../../tools/tsconfig @@ -3538,9 +3538,6 @@ packages: /ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependenciesMeta: - ajv: - optional: true dependencies: ajv: 8.12.0 dev: true @@ -4283,6 +4280,10 @@ packages: shebang-command: 2.0.0 which: 2.0.2 + /crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + dev: true + /css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} dependencies: @@ -6215,7 +6216,6 @@ packages: /jose@4.15.4: resolution: {integrity: sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==} - dev: false /js-beautify@1.14.7: resolution: {integrity: sha512-5SOX1KXPFKx+5f6ZrPsIPEY7NwKeQz47n3jm2i+XeHx9MoRsfQenlOP13FQhWvg8JRS0+XLO6XYUQ2GX+q+T9A==} @@ -7225,7 +7225,6 @@ packages: /nodemailer@6.9.8: resolution: {integrity: sha512-cfrYUk16e67Ks051i4CntM9kshRYei1/o/Gi8K1d+R34OIs21xdFnW7Pt7EucmVKA0LKtqUGNcjMZ7ehjl49mQ==} engines: {node: '>=6.0.0'} - dev: false /nopt@6.0.0: resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} @@ -7710,6 +7709,12 @@ packages: thread-stream: 2.2.0 dev: true + /pkce-challenge@3.1.0: + resolution: {integrity: sha512-bQ/0XPZZ7eX+cdAkd61uYWpfMhakH3NeteUF1R8GNa+LMqX8QFAkbCLqq+AYAns1/ueACBu/BMWhrlKGrdvGZg==} + dependencies: + crypto-js: 4.2.0 + dev: true + /pkg-types@1.0.2: resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} dependencies: @@ -8657,6 +8662,27 @@ packages: - supports-color dev: true + /supertokens-node@15.0.4: + resolution: {integrity: sha512-FZvKSKGjsGFg6eiZk3LFJsOsCf6eJSoWvniPyJ5Jumu2LGfG0nIrdxMPY+UKwl8m1ugd9vePWcPLuH4SUDvhYg==} + dependencies: + content-type: 1.0.5 + cookie: 0.4.0 + cross-fetch: 3.1.8 + debug: 4.3.4 + inflation: 2.0.0 + jose: 4.15.4 + libphonenumber-js: 1.10.19 + nodemailer: 6.9.8 + pkce-challenge: 3.1.0 + psl: 1.8.0 + raw-body: 2.5.2 + supertokens-js-override: 0.0.4 + twilio: 4.12.0(debug@4.3.4) + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} From ab94fa2caa1a0f1c34c0352f6684c4c15110c563 Mon Sep 17 00:00:00 2001 From: Dipendra Upreti Date: Wed, 28 Feb 2024 16:28:48 +0545 Subject: [PATCH 2/3] build(multi-tenant): update supertokens-node to 15.0.4 --- packages/multi-tenant/package.json | 4 ++-- packages/multi-tenant/src/lib/updateContext.ts | 3 ++- .../multi-tenant/src/model/tenants/handlers/all.ts | 3 ++- .../multi-tenant/src/model/tenants/handlers/tenant.ts | 3 ++- .../multi-tenant/src/model/tenants/handlers/tenants.ts | 3 ++- packages/multi-tenant/src/model/tenants/resolver.ts | 7 ++++--- .../third-party-email-password/emailPasswordSignUp.ts | 10 +++++++++- .../third-party-email-password/thirdPartySignInUp.ts | 3 ++- .../thirdPartySignInUpPost.ts | 5 +---- pnpm-lock.yaml | 4 ++-- 10 files changed, 28 insertions(+), 17 deletions(-) diff --git a/packages/multi-tenant/package.json b/packages/multi-tenant/package.json index ba9bcff23..cc79af870 100644 --- a/packages/multi-tenant/package.json +++ b/packages/multi-tenant/package.json @@ -55,7 +55,7 @@ "mercurius": "12.2.0", "prettier": "2.8.8", "slonik": "37.2.0", - "supertokens-node": "14.1.3", + "supertokens-node": "15.0.4", "tsconfig": "0.62.1", "typescript": "4.9.5", "vite": "4.3.9", @@ -72,7 +72,7 @@ "fastify-plugin": ">=4.3.0", "mercurius": ">=12.2.0", "slonik": ">=37.2.0", - "supertokens-node": ">=14.1.3", + "supertokens-node": ">=15.0.4", "zod": ">=3.21.4" }, "engines": { diff --git a/packages/multi-tenant/src/lib/updateContext.ts b/packages/multi-tenant/src/lib/updateContext.ts index c150c66fc..e140d480f 100644 --- a/packages/multi-tenant/src/lib/updateContext.ts +++ b/packages/multi-tenant/src/lib/updateContext.ts @@ -1,3 +1,4 @@ +import { TENANT_ID } from "@dzangolab/fastify-user"; import { wrapResponse } from "supertokens-node/framework/fastify"; import Session from "supertokens-node/recipe/session"; import UserRoles from "supertokens-node/recipe/userroles"; @@ -39,7 +40,7 @@ const updateContext = async ( throw new Error("Unable to find user"); } - const { roles } = await UserRoles.getRolesForUser(userId); + const { roles } = await UserRoles.getRolesForUser(TENANT_ID, userId); context.user = user; context.roles = roles; diff --git a/packages/multi-tenant/src/model/tenants/handlers/all.ts b/packages/multi-tenant/src/model/tenants/handlers/all.ts index 0a6ded340..c37024af5 100644 --- a/packages/multi-tenant/src/model/tenants/handlers/all.ts +++ b/packages/multi-tenant/src/model/tenants/handlers/all.ts @@ -1,3 +1,4 @@ +import { TENANT_ID } from "@dzangolab/fastify-user"; import UserRoles from "supertokens-node/recipe/userroles"; import { ROLE_TENANT_OWNER } from "../../../constants"; @@ -24,7 +25,7 @@ const all = async (request: SessionRequest, reply: FastifyReply) => { const service = new Service(request.config, request.slonik, request.dbSchema); - const { roles } = await UserRoles.getRolesForUser(userId); + const { roles } = await UserRoles.getRolesForUser(TENANT_ID, userId); // [DU 2024-JAN-15] TODO: address the scenario in which a user possesses // both roles: ADMIN and TENANT_OWNER diff --git a/packages/multi-tenant/src/model/tenants/handlers/tenant.ts b/packages/multi-tenant/src/model/tenants/handlers/tenant.ts index 59fadaa64..7196765f7 100644 --- a/packages/multi-tenant/src/model/tenants/handlers/tenant.ts +++ b/packages/multi-tenant/src/model/tenants/handlers/tenant.ts @@ -1,3 +1,4 @@ +import { TENANT_ID } from "@dzangolab/fastify-user"; import UserRoles from "supertokens-node/recipe/userroles"; import { ROLE_TENANT_OWNER } from "../../../constants"; @@ -24,7 +25,7 @@ const tenant = async (request: SessionRequest, reply: FastifyReply) => { const service = new Service(request.config, request.slonik, request.dbSchema); - const { roles } = await UserRoles.getRolesForUser(userId); + const { roles } = await UserRoles.getRolesForUser(TENANT_ID, userId); // [DU 2024-JAN-15] TODO: address the scenario in which a user possesses // both roles: ADMIN and TENANT_OWNER diff --git a/packages/multi-tenant/src/model/tenants/handlers/tenants.ts b/packages/multi-tenant/src/model/tenants/handlers/tenants.ts index 868a15738..5dc02c42e 100644 --- a/packages/multi-tenant/src/model/tenants/handlers/tenants.ts +++ b/packages/multi-tenant/src/model/tenants/handlers/tenants.ts @@ -1,3 +1,4 @@ +import { TENANT_ID } from "@dzangolab/fastify-user"; import UserRoles from "supertokens-node/recipe/userroles"; import { ROLE_TENANT_OWNER } from "../../../constants"; @@ -24,7 +25,7 @@ const tenants = async (request: SessionRequest, reply: FastifyReply) => { const service = new Service(request.config, request.slonik, request.dbSchema); - const { roles } = await UserRoles.getRolesForUser(userId); + const { roles } = await UserRoles.getRolesForUser(TENANT_ID, userId); // [DU 2024-JAN-15] TODO: address the scenario in which a user possesses // both roles: ADMIN and TENANT_OWNER diff --git a/packages/multi-tenant/src/model/tenants/resolver.ts b/packages/multi-tenant/src/model/tenants/resolver.ts index cb9f97bb8..b076c8530 100644 --- a/packages/multi-tenant/src/model/tenants/resolver.ts +++ b/packages/multi-tenant/src/model/tenants/resolver.ts @@ -1,3 +1,4 @@ +import { TENANT_ID } from "@dzangolab/fastify-user"; import mercurius from "mercurius"; import UserRoles from "supertokens-node/recipe/userroles"; @@ -95,7 +96,7 @@ const Query = { context.dbSchema ); - const { roles } = await UserRoles.getRolesForUser(userId); + const { roles } = await UserRoles.getRolesForUser(TENANT_ID, userId); // [DU 2024-JAN-15] TODO: address the scenario in which a user possesses // both roles: ADMIN and TENANT_OWNER @@ -134,7 +135,7 @@ const Query = { context.dbSchema ); - const { roles } = await UserRoles.getRolesForUser(userId); + const { roles } = await UserRoles.getRolesForUser(TENANT_ID, userId); // [DU 2024-JAN-15] TODO: address the scenario in which a user possesses // both roles: ADMIN and TENANT_OWNER @@ -178,7 +179,7 @@ const Query = { context.dbSchema ); - const { roles } = await UserRoles.getRolesForUser(userId); + const { roles } = await UserRoles.getRolesForUser(TENANT_ID, userId); // [DU 2024-JAN-15] TODO: address the scenario in which a user possesses // both roles: ADMIN and TENANT_OWNER diff --git a/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/emailPasswordSignUp.ts b/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/emailPasswordSignUp.ts index 28830e311..1d1c938f4 100644 --- a/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/emailPasswordSignUp.ts +++ b/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/emailPasswordSignUp.ts @@ -1,4 +1,9 @@ -import { areRolesExist, sendEmail, verifyEmail } from "@dzangolab/fastify-user"; +import { + TENANT_ID, + areRolesExist, + sendEmail, + verifyEmail, +} from "@dzangolab/fastify-user"; import { deleteUser } from "supertokens-node"; import EmailVerification from "supertokens-node/recipe/emailverification"; import UserRoles from "supertokens-node/recipe/userroles"; @@ -82,6 +87,7 @@ const emailPasswordSignUp = ( for (const role of roles) { const rolesResponse = await UserRoles.addRoleToUser( + TENANT_ID, originalResponse.user.id, role ); @@ -100,6 +106,7 @@ const emailPasswordSignUp = ( // send email verification const tokenResponse = await EmailVerification.createEmailVerificationToken( + TENANT_ID, originalResponse.user.id ); @@ -107,6 +114,7 @@ const emailPasswordSignUp = ( // [DU 2023-SEP-4] We need to provide all the arguments. // emailVerifyLink is same as what would supertokens create. await EmailVerification.sendEmail({ + tenantId: TENANT_ID, type: "EMAIL_VERIFICATION", user: { id: originalResponse.user.id, diff --git a/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/thirdPartySignInUp.ts b/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/thirdPartySignInUp.ts index c4a103062..8da05cf9e 100644 --- a/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/thirdPartySignInUp.ts +++ b/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/thirdPartySignInUp.ts @@ -1,4 +1,4 @@ -import { areRolesExist } from "@dzangolab/fastify-user"; +import { TENANT_ID, areRolesExist } from "@dzangolab/fastify-user"; import { deleteUser } from "supertokens-node"; import { getUserByThirdPartyInfo } from "supertokens-node/recipe/thirdpartyemailpassword"; import UserRoles from "supertokens-node/recipe/userroles"; @@ -58,6 +58,7 @@ const thirdPartySignInUp = ( for (const role of roles) { const rolesResponse = await UserRoles.addRoleToUser( + TENANT_ID, originalResponse.user.id, role ); diff --git a/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/thirdPartySignInUpPost.ts b/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/thirdPartySignInUpPost.ts index 4d3759dc1..6e4f3c550 100644 --- a/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/thirdPartySignInUpPost.ts +++ b/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/thirdPartySignInUpPost.ts @@ -123,14 +123,11 @@ const thirdPartySignInUpPOST = ( }); } return { - status: "OK", - createdNewUser: originalResponse.createdNewUser, + ...originalResponse, user: { ...originalResponse.user, ...user, }, - session: originalResponse.session, - authCodeResponse: originalResponse.authCodeResponse, }; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3204ef71..d9abfc223 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -339,8 +339,8 @@ importers: specifier: 37.2.0 version: 37.2.0(zod@3.22.4) supertokens-node: - specifier: 14.1.3 - version: 14.1.3 + specifier: 15.0.4 + version: 15.0.4 tsconfig: specifier: 0.62.1 version: link:../../tools/tsconfig From bd44653e194b6c36c6aa2eb83391ef5a7c7c5db4 Mon Sep 17 00:00:00 2001 From: Dipendra Upreti Date: Wed, 28 Feb 2024 16:38:30 +0545 Subject: [PATCH 3/3] build(firebase): update supertokens-node to 15.0.4 --- packages/firebase/package.json | 4 +-- .../thirdPartySignInUp.ts | 1 + .../thirdPartySignInUp.ts | 1 + pnpm-lock.yaml | 34 ++----------------- 4 files changed, 7 insertions(+), 33 deletions(-) diff --git a/packages/firebase/package.json b/packages/firebase/package.json index 192bd72ec..3d078ad82 100644 --- a/packages/firebase/package.json +++ b/packages/firebase/package.json @@ -49,7 +49,7 @@ "mercurius": "12.2.0", "prettier": "2.8.8", "slonik": "37.2.0", - "supertokens-node": "14.1.3", + "supertokens-node": "15.0.4", "tsconfig": "0.62.1", "typescript": "4.9.5", "vite": "4.3.9", @@ -64,7 +64,7 @@ "firebase-admin": "12.0.0", "mercurius": "12.2.0", "slonik": ">=37.2.0", - "supertokens-node": ">=14.1.3", + "supertokens-node": ">=15.0.4", "zod": ">=3.21.4" }, "engines": { diff --git a/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/thirdPartySignInUp.ts b/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/thirdPartySignInUp.ts index 8da05cf9e..fb6b10a81 100644 --- a/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/thirdPartySignInUp.ts +++ b/packages/multi-tenant/src/supertokens/recipes/third-party-email-password/thirdPartySignInUp.ts @@ -26,6 +26,7 @@ const thirdPartySignInUp = ( } const thirdPartyUser = await getUserByThirdPartyInfo( + input.tenantId, input.thirdPartyId, input.thirdPartyUserId, input.userContext diff --git a/packages/user/src/supertokens/recipes/config/third-party-email-password/thirdPartySignInUp.ts b/packages/user/src/supertokens/recipes/config/third-party-email-password/thirdPartySignInUp.ts index 31fe2f167..ee293d558 100644 --- a/packages/user/src/supertokens/recipes/config/third-party-email-password/thirdPartySignInUp.ts +++ b/packages/user/src/supertokens/recipes/config/third-party-email-password/thirdPartySignInUp.ts @@ -18,6 +18,7 @@ const thirdPartySignInUp = ( const roles = (input.userContext.roles || []) as string[]; const thirdPartyUser = await getUserByThirdPartyInfo( + input.tenantId, input.thirdPartyId, input.thirdPartyUserId, input.userContext diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d9abfc223..ca8a850c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -121,8 +121,8 @@ importers: specifier: 37.2.0 version: 37.2.0(zod@3.22.4) supertokens-node: - specifier: 14.1.3 - version: 14.1.3 + specifier: 15.0.4 + version: 15.0.4 tsconfig: specifier: 0.62.1 version: link:../../tools/tsconfig @@ -3512,6 +3512,7 @@ packages: /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + requiresBuild: true dependencies: debug: 4.3.4 transitivePeerDependencies: @@ -6210,10 +6211,6 @@ packages: minimatch: 3.1.2 dev: true - /jose@4.14.4: - resolution: {integrity: sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==} - dev: true - /jose@4.15.4: resolution: {integrity: sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==} @@ -7217,11 +7214,6 @@ packages: - encoding dev: false - /nodemailer@6.9.4: - resolution: {integrity: sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==} - engines: {node: '>=6.0.0'} - dev: true - /nodemailer@6.9.8: resolution: {integrity: sha512-cfrYUk16e67Ks051i4CntM9kshRYei1/o/Gi8K1d+R34OIs21xdFnW7Pt7EucmVKA0LKtqUGNcjMZ7ehjl49mQ==} engines: {node: '>=6.0.0'} @@ -8642,26 +8634,6 @@ packages: resolution: {integrity: sha512-r0JFBjkMIdep3Lbk3JA+MpnpuOtw4RSyrlRAbrzMcxwiYco3GFWl/daimQZ5b1forOiUODpOlXbSOljP/oyurg==} dev: true - /supertokens-node@14.1.3: - resolution: {integrity: sha512-cwnzmJMHRQvqiztdRITlkK0o2psAw2wAYP+tJVYyIk4fm/93Yb0e9QMekuCJnhZAP0KXaZi+PGjA6F5FEE123Q==} - dependencies: - content-type: 1.0.5 - cookie: 0.4.0 - cross-fetch: 3.1.8 - debug: 4.3.4 - inflation: 2.0.0 - jose: 4.14.4 - libphonenumber-js: 1.10.19 - nodemailer: 6.9.4 - psl: 1.8.0 - raw-body: 2.5.2 - supertokens-js-override: 0.0.4 - twilio: 4.12.0(debug@4.3.4) - transitivePeerDependencies: - - encoding - - supports-color - dev: true - /supertokens-node@15.0.4: resolution: {integrity: sha512-FZvKSKGjsGFg6eiZk3LFJsOsCf6eJSoWvniPyJ5Jumu2LGfG0nIrdxMPY+UKwl8m1ugd9vePWcPLuH4SUDvhYg==} dependencies: