* More email share vars + unfinished placeolders config
{desc} {expires} vars
(unfinished) config placeholder vals
* done
* migrate
* edit seed
* removed comments
* refactor: replace dependecy `luxon` with `moment`
* update shareRecipientsMessage message
* chore: remove `luxon`
* fix: grammatically incorrect `shareRecipientsMessage` message
* changed to defaultValue and value instead
* fix: don't expose defaultValue to non admin user
* fix: update default value if default value changes
* refactor: set config value to null instead of a empty string
* refactor: merge two migrations into one
* fix value check empty
---------
Co-authored-by: Elias Schneider <login@eliasschneider.com>
134 lines
3.8 KiB
TypeScript
134 lines
3.8 KiB
TypeScript
import {
|
|
Injectable,
|
|
InternalServerErrorException,
|
|
Logger,
|
|
} from "@nestjs/common";
|
|
import { User } from "@prisma/client";
|
|
import * as moment from "moment";
|
|
import * as nodemailer from "nodemailer";
|
|
import { ConfigService } from "src/config/config.service";
|
|
|
|
@Injectable()
|
|
export class EmailService {
|
|
constructor(private config: ConfigService) {}
|
|
private readonly logger = new Logger(EmailService.name);
|
|
|
|
getTransporter() {
|
|
if (!this.config.get("smtp.enabled"))
|
|
throw new InternalServerErrorException("SMTP is disabled");
|
|
|
|
return nodemailer.createTransport({
|
|
host: this.config.get("smtp.host"),
|
|
port: this.config.get("smtp.port"),
|
|
secure: this.config.get("smtp.port") == 465,
|
|
auth: {
|
|
user: this.config.get("smtp.username"),
|
|
pass: this.config.get("smtp.password"),
|
|
},
|
|
});
|
|
}
|
|
|
|
private async sendMail(email: string, subject: string, text: string) {
|
|
await this.getTransporter()
|
|
.sendMail({
|
|
from: `"${this.config.get("general.appName")}" <${this.config.get(
|
|
"smtp.email"
|
|
)}>`,
|
|
to: email,
|
|
subject,
|
|
text,
|
|
})
|
|
.catch((e) => {
|
|
this.logger.error(e);
|
|
throw new InternalServerErrorException("Failed to send email");
|
|
});
|
|
}
|
|
|
|
async sendMailToShareRecipients(
|
|
recipientEmail: string,
|
|
shareId: string,
|
|
creator?: User,
|
|
description?: string,
|
|
expiration?: Date
|
|
) {
|
|
if (!this.config.get("email.enableShareEmailRecipients"))
|
|
throw new InternalServerErrorException("Email service disabled");
|
|
|
|
const shareUrl = `${this.config.get("general.appUrl")}/share/${shareId}`;
|
|
|
|
await this.sendMail(
|
|
recipientEmail,
|
|
this.config.get("email.shareRecipientsSubject"),
|
|
this.config
|
|
.get("email.shareRecipientsMessage")
|
|
.replaceAll("\\n", "\n")
|
|
.replaceAll("{creator}", creator?.username ?? "Someone")
|
|
.replaceAll("{shareUrl}", shareUrl)
|
|
.replaceAll("{desc}", description ?? "No description")
|
|
.replaceAll(
|
|
"{expires}",
|
|
moment(expiration).unix() != 0
|
|
? moment(expiration).fromNow()
|
|
: "in: never"
|
|
)
|
|
);
|
|
}
|
|
|
|
async sendMailToReverseShareCreator(recipientEmail: string, shareId: string) {
|
|
const shareUrl = `${this.config.get("general.appUrl")}/share/${shareId}`;
|
|
|
|
await this.sendMail(
|
|
recipientEmail,
|
|
this.config.get("email.reverseShareSubject"),
|
|
this.config
|
|
.get("email.reverseShareMessage")
|
|
.replaceAll("\\n", "\n")
|
|
.replaceAll("{shareUrl}", shareUrl)
|
|
);
|
|
}
|
|
|
|
async sendResetPasswordEmail(recipientEmail: string, token: string) {
|
|
const resetPasswordUrl = `${this.config.get(
|
|
"general.appUrl"
|
|
)}/auth/resetPassword/${token}`;
|
|
|
|
await this.sendMail(
|
|
recipientEmail,
|
|
this.config.get("email.resetPasswordSubject"),
|
|
this.config
|
|
.get("email.resetPasswordMessage")
|
|
.replaceAll("\\n", "\n")
|
|
.replaceAll("{url}", resetPasswordUrl)
|
|
);
|
|
}
|
|
|
|
async sendInviteEmail(recipientEmail: string, password: string) {
|
|
const loginUrl = `${this.config.get("general.appUrl")}/auth/signIn`;
|
|
|
|
await this.sendMail(
|
|
recipientEmail,
|
|
this.config.get("email.inviteSubject"),
|
|
this.config
|
|
.get("email.inviteMessage")
|
|
.replaceAll("{url}", loginUrl)
|
|
.replaceAll("{password}", password)
|
|
);
|
|
}
|
|
|
|
async sendTestMail(recipientEmail: string) {
|
|
await this.getTransporter()
|
|
.sendMail({
|
|
from: `"${this.config.get("general.appName")}" <${this.config.get(
|
|
"smtp.email"
|
|
)}>`,
|
|
to: recipientEmail,
|
|
subject: "Test email",
|
|
text: "This is a test email",
|
|
})
|
|
.catch((e) => {
|
|
this.logger.error(e);
|
|
throw new InternalServerErrorException(e.message);
|
|
});
|
|
}
|
|
}
|