Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/firebase/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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.64.0",
"typescript": "4.9.5",
"vite": "4.3.9",
Expand All @@ -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": {
Expand Down
4 changes: 2 additions & 2 deletions packages/multi-tenant/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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.64.0",
"typescript": "4.9.5",
"vite": "4.3.9",
Expand All @@ -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": {
Expand Down
3 changes: 2 additions & 1 deletion packages/multi-tenant/src/lib/updateContext.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion packages/multi-tenant/src/model/tenants/handlers/all.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { TENANT_ID } from "@dzangolab/fastify-user";
import UserRoles from "supertokens-node/recipe/userroles";

import { ROLE_TENANT_OWNER } from "../../../constants";
Expand All @@ -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
Expand Down
3 changes: 2 additions & 1 deletion packages/multi-tenant/src/model/tenants/handlers/tenant.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { TENANT_ID } from "@dzangolab/fastify-user";
import UserRoles from "supertokens-node/recipe/userroles";

import { ROLE_TENANT_OWNER } from "../../../constants";
Expand All @@ -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
Expand Down
3 changes: 2 additions & 1 deletion packages/multi-tenant/src/model/tenants/handlers/tenants.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { TENANT_ID } from "@dzangolab/fastify-user";
import UserRoles from "supertokens-node/recipe/userroles";

import { ROLE_TENANT_OWNER } from "../../../constants";
Expand All @@ -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
Expand Down
7 changes: 4 additions & 3 deletions packages/multi-tenant/src/model/tenants/resolver.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { TENANT_ID } from "@dzangolab/fastify-user";
import mercurius from "mercurius";
import UserRoles from "supertokens-node/recipe/userroles";

Expand Down Expand Up @@ -99,7 +100,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
Expand Down Expand Up @@ -138,7 +139,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
Expand Down Expand Up @@ -182,7 +183,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
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -82,6 +87,7 @@ const emailPasswordSignUp = (

for (const role of roles) {
const rolesResponse = await UserRoles.addRoleToUser(
TENANT_ID,
originalResponse.user.id,
role
);
Expand All @@ -100,13 +106,15 @@ const emailPasswordSignUp = (
// send email verification
const tokenResponse =
await EmailVerification.createEmailVerificationToken(
TENANT_ID,
originalResponse.user.id
);

if (tokenResponse.status === "OK") {
// [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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -26,6 +26,7 @@ const thirdPartySignInUp = (
}

const thirdPartyUser = await getUserByThirdPartyInfo(
input.tenantId,
input.thirdPartyId,
input.thirdPartyUserId,
input.userContext
Expand Down Expand Up @@ -58,6 +59,7 @@ const thirdPartySignInUp = (

for (const role of roles) {
const rolesResponse = await UserRoles.addRoleToUser(
TENANT_ID,
originalResponse.user.id,
role
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,14 +123,11 @@ const thirdPartySignInUpPOST = (
});
}
return {
status: "OK",
createdNewUser: originalResponse.createdNewUser,
...originalResponse,
user: {
...originalResponse.user,
...user,
},
session: originalResponse.session,
authCodeResponse: originalResponse.authCodeResponse,
};
}

Expand Down
4 changes: 2 additions & 2 deletions packages/user/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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.64.0",
"typescript": "4.9.5",
"vite": "4.3.9",
Expand All @@ -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",
Expand Down
4 changes: 4 additions & 0 deletions packages/user/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -53,6 +56,7 @@ export {
PERMISSIONS_USERS_DISABLE,
PERMISSIONS_USERS_ENABLE,
PERMISSIONS_USERS_LIST,
TENANT_ID,
RESET_PASSWORD_PATH,
ROLE_ADMIN,
ROLE_SUPER_ADMIN,
Expand Down
4 changes: 2 additions & 2 deletions packages/user/src/lib/hasUserPermission.ts
Original file line number Diff line number Diff line change
@@ -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";

Expand Down Expand Up @@ -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)) {
Expand Down
8 changes: 7 additions & 1 deletion packages/user/src/lib/verifyEmail.ts
Original file line number Diff line number Diff line change
@@ -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
);
}
};

Expand Down
16 changes: 11 additions & 5 deletions packages/user/src/model/invitations/handlers/acceptInvitation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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);
Expand All @@ -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,
Expand Down
22 changes: 16 additions & 6 deletions packages/user/src/model/invitations/resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import mercurius from "mercurius";
import { createNewSession } from "supertokens-node/recipe/session";
import { emailPasswordSignUp } from "supertokens-node/recipe/thirdpartyemailpassword";

import { ROLE_USER } from "../../constants";
import { ROLE_USER, TENANT_ID } from "../../constants";
import computeInvitationExpiresAt from "../../lib/computeInvitationExpiresAt";
import getInvitationService from "../../lib/getInvitationService";
import isInvitationValid from "../../lib/isInvitationValid";
Expand Down Expand Up @@ -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;
Expand All @@ -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,
Expand Down
3 changes: 2 additions & 1 deletion packages/user/src/model/roles/service.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import UserRoles from "supertokens-node/recipe/userroles";

import { TENANT_ID } from "../../constants";
import CustomApiError from "../../customApiError";

class RoleService {
Expand All @@ -15,7 +16,7 @@ class RoleService {
deleteRole = async (
role: string
): Promise<{ status: "OK"; didRoleExist: boolean }> => {
const response = await UserRoles.getUsersThatHaveRole(role);
const response = await UserRoles.getUsersThatHaveRole(TENANT_ID, role);

if (response.status === "UNKNOWN_ROLE_ERROR") {
throw new CustomApiError({
Expand Down
Loading