continue subscriptions and coins

This commit is contained in:
Thomas Demirdjian
2025-11-05 15:39:15 +01:00
parent a58eeac079
commit 5f777f3b6d
25 changed files with 1994 additions and 222 deletions
+21 -13
View File
@@ -1,4 +1,5 @@
const admin = require("firebase-admin");
const { FieldValue } = require("firebase-admin/firestore");
const { onDocumentCreated } = require("firebase-functions/firestore");
const { HttpsError, onCall } = require("firebase-functions/https");
@@ -35,7 +36,7 @@ const onOrderCreated = onDocumentCreated(
await orderRef.set(
{
status: ORDER_STATUS.REJECTED,
processedAt: admin.firestore.FieldValue.serverTimestamp(),
processedAt: FieldValue.serverTimestamp(),
failureReason: "USER_NOT_FOUND",
},
{ merge: true },
@@ -47,7 +48,7 @@ const onOrderCreated = onDocumentCreated(
await orderRef.set(
{
status: ORDER_STATUS.REJECTED,
processedAt: admin.firestore.FieldValue.serverTimestamp(),
processedAt: FieldValue.serverTimestamp(),
failureReason: "INVALID_AMOUNT",
},
{ merge: true },
@@ -76,7 +77,7 @@ const onOrderCreated = onDocumentCreated(
orderRef,
{
status: ORDER_STATUS.REJECTED,
processedAt: admin.firestore.FieldValue.serverTimestamp(),
processedAt: FieldValue.serverTimestamp(),
failureReason: "INSUFFICIENT_FUNDS",
balanceBefore: currentBalance,
balanceAfter: currentBalance,
@@ -89,15 +90,15 @@ const onOrderCreated = onDocumentCreated(
if (userSnapshot?.exists) {
transaction.update(userRef, {
coins: nextBalance,
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
updatedAt: FieldValue.serverTimestamp(),
});
} else {
transaction.set(
userRef,
{
coins: nextBalance,
createdAt: admin.firestore.FieldValue.serverTimestamp(),
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
createdAt: FieldValue.serverTimestamp(),
updatedAt: FieldValue.serverTimestamp(),
},
{ merge: true },
);
@@ -107,7 +108,7 @@ const onOrderCreated = onDocumentCreated(
orderRef,
{
status: ORDER_STATUS.APPLIED,
processedAt: admin.firestore.FieldValue.serverTimestamp(),
processedAt: FieldValue.serverTimestamp(),
balanceBefore: currentBalance,
balanceAfter: nextBalance,
},
@@ -124,7 +125,7 @@ const onOrderCreated = onDocumentCreated(
await orderRef.set(
{
status: ORDER_STATUS.REJECTED,
processedAt: admin.firestore.FieldValue.serverTimestamp(),
processedAt: FieldValue.serverTimestamp(),
failureReason: "PROCESSING_ERROR",
errorMessage: error?.message || String(error),
},
@@ -168,17 +169,24 @@ const createSongOrder = onCall({ region: REGION }, async (request) => {
);
}
const metadata = {
source:
typeof data?.source === "string" && data.source.trim()
? data.source.trim()
: "music_generation",
};
if (typeof data?.requestId === "string" && data.requestId.trim()) {
metadata.requestId = data.requestId.trim();
}
const { orderId } = await createOrderDocument({
userId: auth.uid,
type: ORDER_TYPES.SONG,
amount,
songId,
createdBy: auth.uid,
metadata: {
source: data?.source || "music_generation",
requestId:
typeof data?.requestId === "string" ? data.requestId : undefined,
},
metadata,
});
return { orderId };