Files
musicland/functions/src/users.js
T
2025-11-05 15:39:15 +01:00

138 lines
4.2 KiB
JavaScript

const admin = require("firebase-admin");
const { FieldValue } = require("firebase-admin/firestore");
const {
onDocumentDeleted,
onDocumentCreated,
} = require("firebase-functions/firestore");
const { refList } = require("../index");
const { ORDER_TYPES, createOrderDocument } = require("./helpers/orders");
const { deleteFolder } = require("../helpers/firebase");
const { Resend } = require("resend");
const { welcomeTemplate } = require("../helpers/email");
const { RESEND_API_KEY } = require("../config/keys");
const { onRequest } = require("firebase-functions/https");
const resendClient = new Resend(RESEND_API_KEY);
const WELCOME_EMAIL_FROM =
process.env.RESEND_FROM_EMAIL || "MusicLand <musicland@minuit.app>";
const WELCOME_EMAIL_SUBJECT = "Bienvenue sur MusicLand";
exports.testWelcomMail = onRequest(async (req, res) => {
if (req.method !== "GET") {
res.set("Allow", "GET");
return res
.status(405)
.json({ success: false, error: "Method not allowed" });
}
try {
const targetEmail = req.query.email || "tdtomthomas@gmail.com";
const firstName = req.query.firstName || "Toto";
const lastName = req.query.lastName || "Test";
const { data, error } = await resendClient.emails.send({
from: WELCOME_EMAIL_FROM,
to: [targetEmail],
subject: WELCOME_EMAIL_SUBJECT,
html: welcomeTemplate({ firstName, lastName }),
});
if (error) {
console.log("Failed to send welcome email:", error);
return res
.status(500)
.json({ success: false, error: error.message || error.toString() });
}
console.log("Welcome email sent:", data);
return res.status(200).json({ success: true, data });
} catch (e) {
console.log(e);
return res
.status(500)
.json({ success: false, error: e.message || e.toString() });
}
});
exports.onUserCreated = onDocumentCreated("users/{userID}", async (event) => {
try {
const {
email = "",
firstName = "",
lastName = "",
} = event?.data?.data() || {};
const userId = event?.params?.userID;
try {
await createOrderDocument({
userId,
type: ORDER_TYPES.GIFT,
amount: 10,
metadata: { reason: "WELCOME_BONUS" },
orderId: `welcome_${userId}`,
});
} catch (coinError) {
console.warn(
"[users-onUserCreated] Unable to grant welcome coins",
event?.params?.userID,
coinError?.message || coinError,
);
}
if (email) {
if (!resendClient) {
console.warn("Resend API key not configured; skipping welcome email.");
return;
}
try {
console.log(`Sending welcome email to ${email}`);
const { data, error } = await resendClient.emails.send({
from: WELCOME_EMAIL_FROM,
to: [email],
subject: WELCOME_EMAIL_SUBJECT,
html: welcomeTemplate({ firstName, lastName }),
});
if (error) {
console.log("Failed to send welcome email:", error);
return;
}
console.log("Welcome email sent:", data);
} catch (error) {
console.log("Failed to send welcome email:", error);
}
} else {
throw new Error("User created with empty email");
}
} catch (e) {
console.log(e);
}
});
exports.onUserDelete = onDocumentDeleted("users/{userID}", async (event) => {
try {
const userID = event?.params?.userID;
await clearAllUserData(userID);
await deleteFolder(`users/${userID}/`);
await admin.auth().deleteUser(userID);
console.log(`User ${userID} deleted successfully`);
} catch (e) {
console.log(e);
}
});
async function clearAllUserData(userID) {
const deleteAll = async (ref, key, operator = "==") => {
const snapshot = await ref.where(key, operator, userID).get();
snapshot.forEach((item) => item.ref.delete());
};
const removeFromArray = async (ref, arrayName) => {
const snapshot = await ref.where(arrayName, "array-contains", userID).get();
snapshot.forEach((item) =>
item.ref.update({
[arrayName]: FieldValue.arrayRemove(userID),
}),
);
};
await deleteAll(refList.projects, "userId");
await deleteAll(refList.playlists, "createdBy");
}