studiocms
Version:
Astro Native CMS for AstroDB. Built from the ground up by the Astro community.
84 lines (83 loc) • 3.17 kB
JavaScript
import { logger as _logger, isVerbose } from "studiocms:logger";
import { SDKCoreJs as sdk } from "studiocms:sdk";
import { Effect, genLogger, Layer, pipeLogger } from "../../effect.js";
import { SMTPMailer } from "../../utils/effects/smtp.js";
const forked = _logger.fork("studiocms:runtime/mailer");
const makeLogger = Effect.succeed(forked);
class Logger extends Effect.Tag("studiocms/lib/mailer/Logger")() {
static Live = makeLogger;
static Layer = Layer.scoped(this, this.Live);
}
class Mailer extends Effect.Service()("studiocms/lib/mailer/Mailer", {
effect: genLogger("studiocms/lib/mailer/Mailer.effect")(function* () {
const logger = yield* Logger;
const SMTP = yield* SMTPMailer;
const mailerResponse = (data) => {
if ("error" in data) {
logger.error(data.error);
return data;
}
isVerbose && logger.info(data.message);
return data;
};
const getMailerConfigTable = pipeLogger("studiocms/lib/mailer/Mailer.getMailerConfigTable")(
sdk.CONFIG.mailerConfig.get()
);
const updateMailerConfigTable = (config) => genLogger("studiocms/lib/mailer/Mailer.updateMailerConfigTable")(function* () {
yield* sdk.CONFIG.mailerConfig.update(config).pipe(
Effect.catchAll(
(e) => Effect.succeed(
mailerResponse({ error: `Error updating mailer configuration: ${String(e)}` })
)
)
);
return mailerResponse({ message: "Mailer configuration updated successfully" });
});
const createMailerConfigTable = (config) => pipeLogger("studiocms/lib/mailer/Mailer.createMailerConfigTable")(
sdk.CONFIG.mailerConfig.init(config)
);
const sendMail = ({ subject, ...message }) => genLogger("studiocms/lib/mailer/Mailer.sendMail")(function* () {
const toSend = { subject };
toSend.to = Array.isArray(message.to) ? message.to.join(", ") : message.to;
if (message.text && !message.html) {
toSend.text = message.text;
}
if (message.html) {
toSend.html = message.html;
}
const result = yield* SMTP.sendMail(toSend);
return mailerResponse({ message: `Message sent: ${result.messageId}` });
});
const verifyMailConnection = genLogger("studiocms/lib/mailer/Mailer.verifyMailConnection")(
function* () {
const result = yield* SMTP.verifyTransport();
if (result !== true) {
return mailerResponse({ error: "Mail connection verification failed" });
}
return mailerResponse({ message: "Mail connection verified successfully" });
}
);
const isEnabled = genLogger("studiocms/lib/mailer/Mailer.isEnabled")(function* () {
const config = yield* sdk.GET.siteConfig();
const status = config?.data?.enableMailer || false;
return status;
});
return {
getMailerConfigTable,
updateMailerConfigTable,
createMailerConfigTable,
sendMail,
verifyMailConnection,
isEnabled
};
}),
dependencies: [Logger.Layer, SMTPMailer.Default],
accessors: true
}) {
static Provide = Effect.provide(this.Default);
}
export {
Logger,
Mailer,
makeLogger
};