Skip to content

Commit

Permalink
Distributed computing friendly user creation
Browse files Browse the repository at this point in the history
  • Loading branch information
Rajat Saxena committed Feb 9, 2025
1 parent d496209 commit 9f5e3a6
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 73 deletions.
69 changes: 47 additions & 22 deletions apps/web/app/verify-domain/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { isDateInFuture } from "../../lib/utils";
import { createUser } from "../../graphql/users/logic";
import { headers } from "next/headers";
import connectToDatabase from "../../services/db";
import { warn } from "@/services/logger";

const { domainNameForSingleTenancy } = constants;

Expand Down Expand Up @@ -103,8 +104,13 @@ export async function GET(req: Request) {

const currentDate = new Date();
const dateAfter24Hours = new Date(currentDate.getTime() + 86400000);
domain.checkSubscriptionStatusAfter = dateAfter24Hours;
await (domain as any).save({ timestamps: true });
// domain.checkSubscriptionStatusAfter = dateAfter24Hours;
// await (domain as any).save({ timestamps: true });
await DomainModel.findOneAndUpdate(
{ _id: domain!._id },
{ $set: { checkSubscriptionStatusAfter: dateAfter24Hours } },
{ upsert: false },
);
}
} else {
domain = await DomainModel.findOne({
Expand All @@ -117,32 +123,51 @@ export async function GET(req: Request) {
process.exit(1);
}

domain = await DomainModel.create({
name: domainNameForSingleTenancy,
email: process.env.SUPER_ADMIN_EMAIL,
firstRun: true,
quota: {
mail: {
daily: 1000000,
monthly: 100000000,
dailyCount: 0,
monthlyCount: 0,
lastDailyCountUpdate: new Date(),
lastMonthlyCountUpdate: new Date(),
domain = await DomainModel.findOneAndUpdate(
{
name: domainNameForSingleTenancy,
},
{
email: process.env.SUPER_ADMIN_EMAIL,
firstRun: true,
quota: {
mail: {
daily: 1000000,
monthly: 100000000,
dailyCount: 0,
monthlyCount: 0,
lastDailyCountUpdate: new Date(),
lastMonthlyCountUpdate: new Date(),
},
},
},
});
{
upsert: true,
new: true,
},
);
}
}

if (domain!.firstRun) {
domain!.firstRun = false;
await createUser({
domain: domain!,
email: domain!.email,
superAdmin: true,
});
(domain! as any).save({ timestamps: true });
try {
await createUser({
domain: domain!,
email: domain!.email,
superAdmin: true,
});
await DomainModel.findOneAndUpdate(
{ _id: domain!._id },
{ $set: { firstRun: false } },
{ upsert: false },
);
} catch (err) {
warn(`Error in creating user: ${err.message}`, {
domain: domain?.name,
route: "verify-domain",
stack: err.stack,
});
}
}

return Response.json({
Expand Down
106 changes: 55 additions & 51 deletions apps/web/graphql/users/logic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -333,64 +333,68 @@ export async function createUser({
checkForInvalidPermissions(permissions);
}

const newUser: Partial<User> = {
domain: domain._id,
name: name,
email: email,
active: true,
purchases: [],
permissions: [],
lead: lead || constants.leadWebsite,
subscribedToUpdates,
invited,
};
if (superAdmin) {
newUser.permissions = [
constants.permissions.manageCourse,
constants.permissions.manageAnyCourse,
constants.permissions.publishCourse,
constants.permissions.manageMedia,
constants.permissions.manageSite,
constants.permissions.manageSettings,
constants.permissions.manageUsers,
constants.permissions.manageCommunity,
];
} else {
newUser.permissions = [
constants.permissions.enrollInCourse,
constants.permissions.manageMedia,
];
if (permissions.length) {
newUser.permissions = [...newUser.permissions, ...permissions];
}
}
newUser.lead = lead;
const user = await UserModel.create(newUser);
const rawResult = await UserModel.findOneAndUpdate(
{ domain: domain._id, email },
{
$setOnInsert: {
domain: domain._id,
name,
email,
active: true,
purchases: [],
permissions: superAdmin
? [
constants.permissions.manageCourse,
constants.permissions.manageAnyCourse,
constants.permissions.publishCourse,
constants.permissions.manageMedia,
constants.permissions.manageSite,
constants.permissions.manageSettings,
constants.permissions.manageUsers,
constants.permissions.manageCommunity,
]
: [
constants.permissions.enrollInCourse,
constants.permissions.manageMedia,
...permissions,
],
lead: lead || constants.leadWebsite,
subscribedToUpdates,
invited,
},
},
{ upsert: true, new: true, includeResultMetadata: true },
);

if (superAdmin) {
await initMandatoryPages(domain, user);
}
const createdUser = rawResult.value;
const isNewUser = !rawResult.lastErrorObject!.updatedExisting;

await recordActivity({
domain: domain._id,
userId: user.userId,
type: "user_created",
});

if (user.subscribedToUpdates) {
await triggerSequences({
user,
event: Constants.eventTypes[3],
});
if (isNewUser) {
if (superAdmin) {
await initMandatoryPages(domain, createdUser);
}

await recordActivity({
domain: domain!._id,
userId: user.userId,
type: "newsletter_subscribed",
domain: domain._id,
userId: createdUser.userId,
type: "user_created",
});

if (createdUser.subscribedToUpdates) {
await triggerSequences({
user: createdUser,
event: Constants.eventTypes[3],
});

await recordActivity({
domain: domain!._id,
userId: createdUser.userId,
type: "newsletter_subscribed",
});
}
}

return user;
return createdUser;
}

export async function getSegments(ctx: GQLContext): Promise<UserSegment[]> {
Expand Down

0 comments on commit 9f5e3a6

Please sign in to comment.