continue subscriptions and coins
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
const { onDocumentCreated } = require("firebase-functions/v2/firestore");
|
||||
const admin = require("firebase-admin");
|
||||
const { FieldValue } = require("firebase-admin/firestore");
|
||||
const logger = require("firebase-functions/logger");
|
||||
const { generateImageV2 } = require("../helpers/gemini");
|
||||
const { generatePicturePrompt } = require("../helpers/prompts");
|
||||
@@ -129,7 +130,7 @@ async function performCoverGeneration(project) {
|
||||
options,
|
||||
},
|
||||
coverStatus: "GENERATED",
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
},
|
||||
{ merge: true }
|
||||
);
|
||||
@@ -178,14 +179,14 @@ exports.onTaskCreateGenerateCover = onDocumentCreated(
|
||||
status: "CANCELLED",
|
||||
error:
|
||||
"La personnalisation de la pochette avec une photo n'est plus disponible.",
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
await refList.projects.doc(projectId).update({
|
||||
coverStatus: "GENERATING",
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
});
|
||||
|
||||
project = (await refList.projects.doc(projectId).get())?.data() || null;
|
||||
@@ -212,12 +213,12 @@ exports.onTaskCreateGenerateCover = onDocumentCreated(
|
||||
});
|
||||
await refList.projects.doc(projectId).update({
|
||||
coverStatus: "GENERATED",
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
});
|
||||
await event.data.ref.update({
|
||||
status: "CANCELLED",
|
||||
error: "Cover already generated",
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
});
|
||||
return;
|
||||
}
|
||||
@@ -231,7 +232,7 @@ exports.onTaskCreateGenerateCover = onDocumentCreated(
|
||||
await event.data.ref.update({
|
||||
status: "DONE",
|
||||
coverUrl,
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
});
|
||||
logger.info("📦 [Task] Marked DONE", {
|
||||
taskId: event?.params?.taskId,
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
const admin = require("firebase-admin");
|
||||
const { FieldValue } = require("firebase-admin/firestore");
|
||||
|
||||
const ORDER_TYPES = {
|
||||
GIFT: "GIFT",
|
||||
SONG: "SONG",
|
||||
COINS: "COINS",
|
||||
SUBSCRIPTION: "SUBSCRIPTION",
|
||||
};
|
||||
|
||||
const ORDER_STATUS = {
|
||||
@@ -60,7 +62,7 @@ const createOrderDocument = async ({
|
||||
type,
|
||||
amount: normalizedAmount,
|
||||
songId: type === ORDER_TYPES.SONG ? songId || null : null,
|
||||
createdAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
createdAt: FieldValue.serverTimestamp(),
|
||||
createdBy: createdBy || "system",
|
||||
status: ORDER_STATUS.PENDING,
|
||||
metadata: metadata || {},
|
||||
|
||||
@@ -8,6 +8,7 @@ const {
|
||||
const { SUNO_API_KEY } = require("../config/keys");
|
||||
const axios = require("axios");
|
||||
const admin = require("firebase-admin");
|
||||
const { FieldValue } = require("firebase-admin/firestore");
|
||||
const { refList } = require("../index");
|
||||
|
||||
const STRUCTURE_PROMPT_LABELS = {
|
||||
@@ -453,7 +454,7 @@ async function getSunoTimestamps(projectId) {
|
||||
musicTimestamps: {
|
||||
[songIndex]: dataToReturn,
|
||||
},
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
},
|
||||
{ merge: true },
|
||||
);
|
||||
|
||||
@@ -5,6 +5,7 @@ const {
|
||||
} = require("firebase-functions/v2/https");
|
||||
const axios = require("axios");
|
||||
const admin = require("firebase-admin");
|
||||
const { FieldValue } = require("firebase-admin/firestore");
|
||||
const { logger } = require("firebase-functions/logger");
|
||||
const { ALERT_TYPE, refList } = require("../index");
|
||||
const { sendNotification } = require("./notifications");
|
||||
@@ -44,10 +45,10 @@ async function markProjectMusicFailure(projectId, error) {
|
||||
await docRef.set(
|
||||
{
|
||||
musicStatus: "FAILED",
|
||||
sunoTaskId: admin.firestore.FieldValue.delete(),
|
||||
generationStartAt: admin.firestore.FieldValue.delete(),
|
||||
sunoTaskId: FieldValue.delete(),
|
||||
generationStartAt: FieldValue.delete(),
|
||||
musicError: errorPayload,
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
},
|
||||
{ merge: true },
|
||||
);
|
||||
@@ -677,8 +678,8 @@ exports.sunoCallback = onRequest({ methods: ["POST"] }, async (req, res) => {
|
||||
{
|
||||
musicStatus: "GENERATED",
|
||||
musicUrls,
|
||||
musicError: admin.firestore.FieldValue.delete(),
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
musicError: FieldValue.delete(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
},
|
||||
{ merge: true },
|
||||
);
|
||||
|
||||
@@ -3,6 +3,7 @@ const {
|
||||
onDocumentWritten,
|
||||
} = require("firebase-functions/v2/firestore");
|
||||
const admin = require("firebase-admin");
|
||||
const { FieldValue } = require("firebase-admin/firestore");
|
||||
const { refList, ALERT_TYPE } = require("../index");
|
||||
const { Expo } = require("expo-server-sdk");
|
||||
const { Resend } = require("resend");
|
||||
@@ -209,11 +210,11 @@ async function removeInvalidTokens({
|
||||
const userData = userSnap?.data() || {};
|
||||
|
||||
const updates = {
|
||||
pushTokens: admin.firestore.FieldValue.arrayRemove(...uniqueTokens),
|
||||
pushTokens: FieldValue.arrayRemove(...uniqueTokens),
|
||||
};
|
||||
|
||||
if (uniqueTokens.includes(userData?.pushToken)) {
|
||||
updates.pushToken = admin.firestore.FieldValue.delete();
|
||||
updates.pushToken = FieldValue.delete();
|
||||
}
|
||||
|
||||
await docRef.set(updates, { merge: true });
|
||||
@@ -246,7 +247,7 @@ const sendNotification = async ({
|
||||
receiverCollection,
|
||||
title,
|
||||
message,
|
||||
time: admin.firestore.FieldValue.serverTimestamp(),
|
||||
time: FieldValue.serverTimestamp(),
|
||||
read: false,
|
||||
readAt: null,
|
||||
mailOnly,
|
||||
|
||||
+21
-13
@@ -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 };
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
const admin = require("firebase-admin");
|
||||
const { FieldValue } = require("firebase-admin/firestore");
|
||||
const { onSchedule } = require("firebase-functions/v2/scheduler");
|
||||
const _ = require("lodash");
|
||||
const { refList, db, ALERT_TYPE } = require("../index");
|
||||
@@ -123,7 +124,7 @@ exports.distributeMonthlyPayouts = onSchedule(
|
||||
totalStreams: userData.totalStreams,
|
||||
projects: userData.projects,
|
||||
computedAt: now,
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
},
|
||||
};
|
||||
});
|
||||
@@ -195,7 +196,7 @@ exports.distributeMonthlyPayouts = onSchedule(
|
||||
totalAllocated: _.round(_.sumBy(payouts, "amount"), 2),
|
||||
payouts,
|
||||
status: payouts.length ? "computed" : "no-data",
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
computedAt: now,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
const admin = require("firebase-admin");
|
||||
const { FieldValue } = require("firebase-admin/firestore");
|
||||
const { onDocumentWritten } = require("firebase-functions/firestore");
|
||||
const _ = require("lodash");
|
||||
const { refList, db } = require("../index");
|
||||
@@ -76,7 +77,7 @@ exports.onProjectWritten = onDocumentWritten(
|
||||
updatedAt: now,
|
||||
lastStreamAt: now,
|
||||
lastDelta: delta,
|
||||
streams: admin.firestore.FieldValue.increment(delta),
|
||||
streams: FieldValue.increment(delta),
|
||||
};
|
||||
|
||||
const hasFirstStream =
|
||||
@@ -92,7 +93,7 @@ exports.onProjectWritten = onDocumentWritten(
|
||||
updatedAt: now,
|
||||
lastStreamAt: now,
|
||||
lastDelta: delta,
|
||||
totalStreams: admin.firestore.FieldValue.increment(delta),
|
||||
totalStreams: FieldValue.increment(delta),
|
||||
};
|
||||
const totalsHasFirstStream =
|
||||
totalsSnapshot.exists && totalsSnapshot.data()?.firstStreamAt;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
const admin = require("firebase-admin");
|
||||
const { FieldValue } = require("firebase-admin/firestore");
|
||||
const { onSchedule } = require("firebase-functions/v2/scheduler");
|
||||
const { refList } = require("../index");
|
||||
const firestore = refList.projects.firestore;
|
||||
@@ -71,11 +72,11 @@ exports.snapshotMonthlyTopSongs = onSchedule(
|
||||
},
|
||||
topProjects,
|
||||
totalProjects: topProjects.length,
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
};
|
||||
|
||||
if (!existingSnapshot.exists) {
|
||||
payload.createdAt = admin.firestore.FieldValue.serverTimestamp();
|
||||
payload.createdAt = FieldValue.serverTimestamp();
|
||||
}
|
||||
|
||||
await docRef.set(payload, { merge: true });
|
||||
|
||||
@@ -27,8 +27,9 @@ const getServerTimestamp = () => {
|
||||
if (FieldValue?.serverTimestamp) {
|
||||
return FieldValue.serverTimestamp();
|
||||
}
|
||||
if (admin.firestore?.FieldValue?.serverTimestamp) {
|
||||
return admin.firestore.FieldValue.serverTimestamp();
|
||||
const fallback = admin.firestore?.FieldValue;
|
||||
if (fallback?.serverTimestamp) {
|
||||
return fallback.serverTimestamp();
|
||||
}
|
||||
throw new HttpsError(
|
||||
"failed-precondition",
|
||||
|
||||
+1128
-44
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,7 @@
|
||||
const { onObjectFinalized } = require("firebase-functions/v2/storage");
|
||||
const logger = require("firebase-functions/logger");
|
||||
const admin = require("firebase-admin");
|
||||
const { FieldValue } = require("firebase-admin/firestore");
|
||||
const ffmpeg = require("fluent-ffmpeg");
|
||||
const ffmpegInstaller = require("@ffmpeg-installer/ffmpeg");
|
||||
const fs = require("node:fs/promises");
|
||||
@@ -150,7 +151,7 @@ exports.generateVideoThumbnail = onObjectFinalized(
|
||||
await refList.projects.doc(projectId).set(
|
||||
{
|
||||
thumbnailUrl,
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
},
|
||||
{ merge: true }
|
||||
);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
const admin = require("firebase-admin");
|
||||
const { FieldValue } = require("firebase-admin/firestore");
|
||||
const {
|
||||
onDocumentDeleted,
|
||||
onDocumentCreated,
|
||||
@@ -126,7 +127,7 @@ async function clearAllUserData(userID) {
|
||||
const snapshot = await ref.where(arrayName, "array-contains", userID).get();
|
||||
snapshot.forEach((item) =>
|
||||
item.ref.update({
|
||||
[arrayName]: admin.firestore.FieldValue.arrayRemove(userID),
|
||||
[arrayName]: FieldValue.arrayRemove(userID),
|
||||
}),
|
||||
);
|
||||
};
|
||||
|
||||
@@ -3,6 +3,7 @@ const { defineSecret } = require("firebase-functions/params");
|
||||
const logger = require("firebase-functions/logger");
|
||||
const functions = require("firebase-functions");
|
||||
const admin = require("firebase-admin");
|
||||
const { FieldValue } = require("firebase-admin/firestore");
|
||||
const axios = require("axios");
|
||||
const fs = require("node:fs");
|
||||
const fsp = require("node:fs/promises");
|
||||
@@ -240,7 +241,7 @@ exports.publishPlaybackToYoutube = onCall(
|
||||
youtubeStatus: "PUBLISHING",
|
||||
youtubePublished: false,
|
||||
youtubeError: null,
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
},
|
||||
{ merge: true }
|
||||
);
|
||||
@@ -270,9 +271,9 @@ exports.publishPlaybackToYoutube = onCall(
|
||||
youtubePublished: true,
|
||||
youtubeUrl: youtubeLink,
|
||||
youtubeVideoId: videoId,
|
||||
youtubePublishedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
youtubePublishedAt: FieldValue.serverTimestamp(),
|
||||
youtubeError: null,
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
},
|
||||
{ merge: true }
|
||||
);
|
||||
@@ -302,7 +303,7 @@ exports.publishPlaybackToYoutube = onCall(
|
||||
youtubeStatus: "FAILED",
|
||||
youtubePublished: false,
|
||||
youtubeError: errorMessage,
|
||||
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
||||
updatedAt: FieldValue.serverTimestamp(),
|
||||
},
|
||||
{ merge: true }
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user