@ivrtikshoret אני לא מבין למה הטרנזציה איטית, אבל אתה יכול לבצע את כל הלוגיקה דרך mongodb באמצעות מה שנקרא aggregation pipeline, ואז זה אטומי בלי טרנזציה, משהו כזה (גילוי נאות, השאילתה נכתבה ע"י claude.ai) :
const setKey = async (key: string, newValue: string): Promise<void> => {
const currentDate = new Date();
const newExp = new Date(Date.now() + 24 * 60 * 60 * 1000); // 24 שעות מעכשיו
const result = await Data.findOneAndUpdate(
{ key: key },
[
{
$set: {
isExpired: { $gt: [currentDate, '$exp'] }
}
},
{
$set: {
value: {
$cond: {
if: { $not: ['$isExpired'] },
then: { $add: [{ $toInt: '$value' }, { $toInt: newValue }] },
else: {
$cond: {
if: { $ne: ['$valueAfterExp', null] },
then: '$valueAfterExp',
else: '$value'
}
}
}
},
exp: {
$cond: {
if: { $not: ['$isExpired'] },
then: '$exp',
else: newExp
}
},
valueAfterExp: {
$cond: {
if: { $not: ['$isExpired'] },
then: '$valueAfterExp',
else: null
}
}
}
},
{
$unset: 'isExpired'
}
],
{ returnDocument: 'after' }
);
if (!result.value) {
throw new Error('Key not found');
}
// מחיקת האובייקט אם אין valueAfterExp ופג תוקפו
if (checkIfExpIsOver(result.value.exp as Date) && !result.value.valueAfterExp) {
await Data.deleteOne({ _id: result.value._id });
}
};