convert to ts

This commit is contained in:
Alex Holliday committed 2026-01-18 05:38:50 +00:00
1 parent 288ac08cd6
commit 3e8d4cb49b
4 files changed
+81 -2

No files matched your search

+1 -2
View File
@@ -260,10 +260,9 @@ export const initializeServices = async ({
const diagnosticService = new DiagnosticService();
const inviteService = new InviteService({
db,
invitesRepository,
settingsService,
emailService,
stringService,
errorService,
});
const maintenanceWindowService = new MaintenanceWindowService({
@@ -2,7 +2,9 @@ import type { Invite } from "@/types/index.js";
export interface IInvitesRepository {
// create
create(invite: Partial<Invite>): Promise<Invite>;
// fetch
findByToken(token: string): Promise<Invite>;
findByTokenAndDelete(token: string): Promise<Invite>;
// update
@@ -3,6 +3,7 @@ import type { Invite } from "@/types/index.js";
import { type InviteDocument, InviteModel } from "@/db/models/index.js";
import { AppError } from "@/utils/AppError.js";
import mongoose from "mongoose";
import crypto from "crypto";
class MongoInvitesRepository implements IInvitesRepository {
private toStringId = (value?: mongoose.Types.ObjectId | string | null): string => {
@@ -32,6 +33,23 @@ class MongoInvitesRepository implements IInvitesRepository {
};
};
create = async (invite: Partial<Invite>) => {
await InviteModel.deleteMany({ email: invite.email });
invite.token = crypto.randomBytes(32).toString("hex");
let inviteToken = await InviteModel.create(invite);
return this.toEntity(inviteToken);
};
findByToken = async (token: string) => {
const invite = await InviteModel.findOne({
token,
});
if (invite === null) {
throw new AppError({ message: "Invite not found", status: 404 });
}
return this.toEntity(invite);
};
findByTokenAndDelete = async (token: string) => {
const invite = await InviteModel.findOneAndDelete({
token,
@@ -0,0 +1,60 @@
import type { Invite } from "@/types/index.js";
import type { IInvitesRepository } from "@/repositories/index.js";
const SERVICE_NAME = "inviteService";
class InviteService {
static SERVICE_NAME = SERVICE_NAME;
private settingsService: any;
private emailService: any;
private errorService: any;
private invitesRepository: IInvitesRepository;
constructor({
invitesRepository,
settingsService,
emailService,
errorService,
}: {
invitesRepository: IInvitesRepository;
settingsService: any;
emailService: any;
errorService: any;
}) {
this.invitesRepository = invitesRepository;
this.settingsService = settingsService;
this.emailService = emailService;
this.errorService = errorService;
}
get serviceName() {
return InviteService.SERVICE_NAME;
}
getInviteToken = async ({ invite, teamId }: { invite: Partial<Invite>; teamId: string }) => {
invite.teamId = teamId;
const inviteToken = await this.invitesRepository.create(invite);
return inviteToken;
};
sendInviteEmail = async ({ invite, firstName }: { invite: Partial<Invite>; firstName: any }) => {
const inviteToken = await this.invitesRepository.create(invite);
const { clientHost } = this.settingsService.getSettings();
const html = await this.emailService.buildEmail("employeeActivationTemplate", {
name: firstName,
link: `${clientHost}/register/${inviteToken.token}`,
});
const result = await this.emailService.sendEmail(invite.email, "Welcome to Uptime Monitor", html);
if (!result) {
throw this.errorService.createServerError("Failed to send invite e-mail... Please verify your settings.");
}
};
verifyInviteToken = async ({ inviteToken }: { inviteToken: string }) => {
return await this.invitesRepository.findByToken(inviteToken);
};
}
export default InviteService;