Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: updating send email verification interface #625

Merged
merged 4 commits into from
Jul 6, 2023
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.userEmailVerifyTokenPost = void 0;
const error_1 = __importDefault(require("../../../../error"));
const emailverification_1 = __importDefault(require("../../../emailverification"));
const recipe_1 = __importDefault(require("../../../emailverification/recipe"));
const utils_1 = require("../../../emailverification/utils");
const userEmailVerifyTokenPost = (_, tenantId, options, userContext) =>
__awaiter(void 0, void 0, void 0, function* () {
const requestBody = yield options.req.getJSONBody();
Expand All @@ -51,37 +49,6 @@ const userEmailVerifyTokenPost = (_, tenantId, options, userContext) =>
type: error_1.default.BAD_INPUT_ERROR,
});
}
let emailResponse = yield recipe_1.default.getInstanceOrThrowError().getEmailForUserId(userId, userContext);
if (emailResponse.status !== "OK") {
throw new Error("Should never come here");
}
let emailVerificationToken = yield emailverification_1.default.createEmailVerificationToken(
userId,
undefined,
tenantId,
userContext
);
if (emailVerificationToken.status === "EMAIL_ALREADY_VERIFIED_ERROR") {
return {
status: "EMAIL_ALREADY_VERIFIED_ERROR",
};
}
let emailVerifyLink = utils_1.getEmailVerifyLink({
appInfo: options.appInfo,
token: emailVerificationToken.token,
recipeId: recipe_1.default.RECIPE_ID,
tenantId,
});
yield emailverification_1.default.sendEmail({
type: "EMAIL_VERIFICATION",
user: {
id: userId,
email: emailResponse.email,
},
emailVerifyLink,
});
return {
status: "OK",
};
return yield emailverification_1.default.sendEmailVerificationEmail(userId, undefined, tenantId, userContext);
});
exports.userEmailVerifyTokenPost = userEmailVerifyTokenPost;
29 changes: 29 additions & 0 deletions lib/build/recipe/emailverification/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,33 @@ export default class Wrapper {
status: "EMAIL_ALREADY_VERIFIED_ERROR";
}
>;
static createEmailVerificationLink(
userId: string,
email?: string,
tenantId?: string,
userContext?: any
): Promise<
| {
status: "OK";
link: string;
}
| {
status: "EMAIL_ALREADY_VERIFIED_ERROR";
}
>;
static sendEmailVerificationEmail(
userId: string,
email?: string,
tenantId?: string,
userContext?: any
): Promise<
| {
status: "OK";
}
| {
status: "EMAIL_ALREADY_VERIFIED_ERROR";
}
>;
static verifyEmailUsingToken(
token: string,
tenantId?: string,
Expand Down Expand Up @@ -58,6 +85,8 @@ export default class Wrapper {
export declare let init: typeof Recipe.init;
export declare let Error: typeof SuperTokensError;
export declare let createEmailVerificationToken: typeof Wrapper.createEmailVerificationToken;
export declare let createEmailVerificationLink: typeof Wrapper.createEmailVerificationLink;
export declare let sendEmailVerificationEmail: typeof Wrapper.sendEmailVerificationEmail;
export declare let verifyEmailUsingToken: typeof Wrapper.verifyEmailUsingToken;
export declare let isEmailVerified: typeof Wrapper.isEmailVerified;
export declare let revokeEmailVerificationTokens: typeof Wrapper.revokeEmailVerificationTokens;
Expand Down
66 changes: 65 additions & 1 deletion lib/build/recipe/emailverification/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,12 @@ var __importDefault =
return mod && mod.__esModule ? mod : { default: mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.EmailVerificationClaim = exports.sendEmail = exports.unverifyEmail = exports.revokeEmailVerificationTokens = exports.isEmailVerified = exports.verifyEmailUsingToken = exports.createEmailVerificationToken = exports.Error = exports.init = void 0;
exports.EmailVerificationClaim = exports.sendEmail = exports.unverifyEmail = exports.revokeEmailVerificationTokens = exports.isEmailVerified = exports.verifyEmailUsingToken = exports.sendEmailVerificationEmail = exports.createEmailVerificationLink = exports.createEmailVerificationToken = exports.Error = exports.init = void 0;
const recipe_1 = __importDefault(require("./recipe"));
const error_1 = __importDefault(require("./error"));
const emailVerificationClaim_1 = require("./emailVerificationClaim");
const constants_1 = require("../multitenancy/constants");
const utils_1 = require("./utils");
class Wrapper {
static createEmailVerificationToken(userId, email, tenantId, userContext) {
return __awaiter(this, void 0, void 0, function* () {
Expand All @@ -79,6 +80,67 @@ class Wrapper {
});
});
}
static createEmailVerificationLink(userId, email, tenantId, userContext) {
return __awaiter(this, void 0, void 0, function* () {
const recipeInstance = recipe_1.default.getInstanceOrThrowError();
const appInfo = recipeInstance.getAppInfo();
let emailVerificationToken = yield exports.createEmailVerificationToken(
userId,
email,
tenantId,
userContext
);
if (emailVerificationToken.status === "EMAIL_ALREADY_VERIFIED_ERROR") {
return {
status: "EMAIL_ALREADY_VERIFIED_ERROR",
};
}
return {
status: "OK",
link: utils_1.getEmailVerifyLink({
appInfo,
token: emailVerificationToken.token,
recipeId: recipeInstance.getRecipeId(),
tenantId: tenantId === undefined ? constants_1.DEFAULT_TENANT_ID : tenantId,
}),
};
});
}
static sendEmailVerificationEmail(userId, email, tenantId, userContext) {
return __awaiter(this, void 0, void 0, function* () {
if (email === undefined) {
const recipeInstance = recipe_1.default.getInstanceOrThrowError();
const emailInfo = yield recipeInstance.getEmailForUserId(userId, userContext);
if (emailInfo.status === "OK") {
email = emailInfo.email;
} else if (emailInfo.status === "EMAIL_DOES_NOT_EXIST_ERROR") {
return {
status: "EMAIL_ALREADY_VERIFIED_ERROR",
};
} else {
throw new global.Error("Unknown User ID provided without email");
}
}
let emailVerificationLink = yield this.createEmailVerificationLink(userId, email, tenantId, userContext);
if (emailVerificationLink.status === "EMAIL_ALREADY_VERIFIED_ERROR") {
return {
status: "EMAIL_ALREADY_VERIFIED_ERROR",
};
}
yield exports.sendEmail({
type: "EMAIL_VERIFICATION",
user: {
id: userId,
email: email,
},
emailVerifyLink: emailVerificationLink.link,
tenantId,
});
return {
status: "OK",
};
});
}
static verifyEmailUsingToken(token, tenantId, userContext) {
return __awaiter(this, void 0, void 0, function* () {
return yield recipe_1.default.getInstanceOrThrowError().recipeInterfaceImpl.verifyEmailUsingToken({
Expand Down Expand Up @@ -178,6 +240,8 @@ Wrapper.EmailVerificationClaim = emailVerificationClaim_1.EmailVerificationClaim
exports.init = Wrapper.init;
exports.Error = Wrapper.Error;
exports.createEmailVerificationToken = Wrapper.createEmailVerificationToken;
exports.createEmailVerificationLink = Wrapper.createEmailVerificationLink;
exports.sendEmailVerificationEmail = Wrapper.sendEmailVerificationEmail;
exports.verifyEmailUsingToken = Wrapper.verifyEmailUsingToken;
exports.isEmailVerified = Wrapper.isEmailVerified;
exports.revokeEmailVerificationTokens = Wrapper.revokeEmailVerificationTokens;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import { APIInterface, APIOptions } from "../../types";
import STError from "../../../../error";
import EmailVerification from "../../../emailverification";
import EmailVerificationRecipe from "../../../emailverification/recipe";
import { getEmailVerifyLink } from "../../../emailverification/utils";

type Response = {
status: "OK" | "EMAIL_ALREADY_VERIFIED_ERROR";
Expand All @@ -24,42 +22,5 @@ export const userEmailVerifyTokenPost = async (
});
}

let emailResponse = await EmailVerificationRecipe.getInstanceOrThrowError().getEmailForUserId(userId, userContext);

if (emailResponse.status !== "OK") {
throw new Error("Should never come here");
}

let emailVerificationToken = await EmailVerification.createEmailVerificationToken(
userId,
undefined,
tenantId,
userContext
);

if (emailVerificationToken.status === "EMAIL_ALREADY_VERIFIED_ERROR") {
return {
status: "EMAIL_ALREADY_VERIFIED_ERROR",
};
}

let emailVerifyLink = getEmailVerifyLink({
appInfo: options.appInfo,
token: emailVerificationToken.token,
recipeId: EmailVerificationRecipe.RECIPE_ID,
tenantId,
});

await EmailVerification.sendEmail({
type: "EMAIL_VERIFICATION",
user: {
id: userId,
email: emailResponse.email,
},
emailVerifyLink,
});

return {
status: "OK",
};
return await EmailVerification.sendEmailVerificationEmail(userId, undefined, tenantId, userContext);
};
87 changes: 87 additions & 0 deletions lib/ts/recipe/emailverification/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import SuperTokensError from "./error";
import { RecipeInterface, APIOptions, APIInterface, User, TypeEmailVerificationEmailDeliveryInput } from "./types";
import { EmailVerificationClaim } from "./emailVerificationClaim";
import { DEFAULT_TENANT_ID } from "../multitenancy/constants";
import { getEmailVerifyLink } from "./utils";

export default class Wrapper {
static init = Recipe.init;
Expand Down Expand Up @@ -61,6 +62,88 @@ export default class Wrapper {
});
}

static async createEmailVerificationLink(
userId: string,
email?: string,
tenantId?: string,
userContext?: any
): Promise<
| {
status: "OK";
link: string;
}
| { status: "EMAIL_ALREADY_VERIFIED_ERROR" }
> {
const recipeInstance = Recipe.getInstanceOrThrowError();
const appInfo = recipeInstance.getAppInfo();

let emailVerificationToken = await createEmailVerificationToken(userId, email, tenantId, userContext);
if (emailVerificationToken.status === "EMAIL_ALREADY_VERIFIED_ERROR") {
return {
status: "EMAIL_ALREADY_VERIFIED_ERROR",
};
}

return {
status: "OK",
link: getEmailVerifyLink({
appInfo,
token: emailVerificationToken.token,
recipeId: recipeInstance.getRecipeId(),
tenantId: tenantId === undefined ? DEFAULT_TENANT_ID : tenantId,
}),
};
}

static async sendEmailVerificationEmail(
userId: string,
email?: string,
tenantId?: string,
userContext?: any
): Promise<
| {
status: "OK";
}
| { status: "EMAIL_ALREADY_VERIFIED_ERROR" }
> {
if (email === undefined) {
const recipeInstance = Recipe.getInstanceOrThrowError();

const emailInfo = await recipeInstance.getEmailForUserId(userId, userContext);
if (emailInfo.status === "OK") {
email = emailInfo.email;
} else if (emailInfo.status === "EMAIL_DOES_NOT_EXIST_ERROR") {
return {
status: "EMAIL_ALREADY_VERIFIED_ERROR",
};
} else {
throw new global.Error("Unknown User ID provided without email");
}
}

let emailVerificationLink = await this.createEmailVerificationLink(userId, email, tenantId, userContext);

if (emailVerificationLink.status === "EMAIL_ALREADY_VERIFIED_ERROR") {
return {
status: "EMAIL_ALREADY_VERIFIED_ERROR",
};
}

await sendEmail({
rishabhpoddar marked this conversation as resolved.
Show resolved Hide resolved
type: "EMAIL_VERIFICATION",
user: {
id: userId,
email: email!,
},
emailVerifyLink: emailVerificationLink.link,
tenantId,
});

return {
status: "OK",
};
}

rishabhpoddar marked this conversation as resolved.
Show resolved Hide resolved
static async verifyEmailUsingToken(token: string, tenantId?: string, userContext?: any) {
return await Recipe.getInstanceOrThrowError().recipeInterfaceImpl.verifyEmailUsingToken({
token,
Expand Down Expand Up @@ -158,6 +241,10 @@ export let Error = Wrapper.Error;

export let createEmailVerificationToken = Wrapper.createEmailVerificationToken;

export let createEmailVerificationLink = Wrapper.createEmailVerificationLink;

export let sendEmailVerificationEmail = Wrapper.sendEmailVerificationEmail;

export let verifyEmailUsingToken = Wrapper.verifyEmailUsingToken;

export let isEmailVerified = Wrapper.isEmailVerified;
Expand Down