mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 17:00:15 +01:00
* WIP: basic route for file downloads and file strategy for generating readablestream to pipe as res * chore(DALLE3): add typing for OpenAI client * chore: add `CONSOLE_JSON` notes to dotenv.md * WIP: first pass OpenAI Assistants File Output handling * feat: first pass assistants output file download from openai * chore: yml vs. yaml variation to .gitignore for `librechat.yml` * refactor(retrieveAndProcessFile): remove redundancies * fix(syncMessages): explicit sort of apiMessages to fix message order on abort * chore: add logs for warnings and errors, show toast on frontend * chore: add logger where console was still being used
73 lines
2.4 KiB
JavaScript
73 lines
2.4 KiB
JavaScript
const mongoose = require('mongoose');
|
|
const { isEnabled } = require('../server/utils/handleText');
|
|
const transactionSchema = require('./schema/transaction');
|
|
const { getMultiplier } = require('./tx');
|
|
const { logger } = require('~/config');
|
|
const Balance = require('./Balance');
|
|
const cancelRate = 1.15;
|
|
|
|
// Method to calculate and set the tokenValue for a transaction
|
|
transactionSchema.methods.calculateTokenValue = function () {
|
|
if (!this.valueKey || !this.tokenType) {
|
|
this.tokenValue = this.rawAmount;
|
|
}
|
|
const { valueKey, tokenType, model, endpointTokenConfig } = this;
|
|
const multiplier = getMultiplier({ valueKey, tokenType, model, endpointTokenConfig });
|
|
this.rate = multiplier;
|
|
this.tokenValue = this.rawAmount * multiplier;
|
|
if (this.context && this.tokenType === 'completion' && this.context === 'incomplete') {
|
|
this.tokenValue = Math.ceil(this.tokenValue * cancelRate);
|
|
this.rate *= cancelRate;
|
|
}
|
|
};
|
|
|
|
// Static method to create a transaction and update the balance
|
|
transactionSchema.statics.create = async function (transactionData) {
|
|
const Transaction = this;
|
|
|
|
const transaction = new Transaction(transactionData);
|
|
transaction.endpointTokenConfig = transactionData.endpointTokenConfig;
|
|
transaction.calculateTokenValue();
|
|
|
|
// Save the transaction
|
|
await transaction.save();
|
|
|
|
if (!isEnabled(process.env.CHECK_BALANCE)) {
|
|
return;
|
|
}
|
|
|
|
// Adjust the user's balance
|
|
const updatedBalance = await Balance.findOneAndUpdate(
|
|
{ user: transaction.user },
|
|
{ $inc: { tokenCredits: transaction.tokenValue } },
|
|
{ upsert: true, new: true },
|
|
).lean();
|
|
|
|
return {
|
|
rate: transaction.rate,
|
|
user: transaction.user.toString(),
|
|
balance: updatedBalance.tokenCredits,
|
|
[transaction.tokenType]: transaction.tokenValue,
|
|
};
|
|
};
|
|
|
|
const Transaction = mongoose.model('Transaction', transactionSchema);
|
|
|
|
/**
|
|
* Queries and retrieves transactions based on a given filter.
|
|
* @async
|
|
* @function getTransactions
|
|
* @param {Object} filter - MongoDB filter object to apply when querying transactions.
|
|
* @returns {Promise<Array>} A promise that resolves to an array of matched transactions.
|
|
* @throws {Error} Throws an error if querying the database fails.
|
|
*/
|
|
async function getTransactions(filter) {
|
|
try {
|
|
return await Transaction.find(filter).lean();
|
|
} catch (error) {
|
|
logger.error('Error querying transactions:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
module.exports = { Transaction, getTransactions };
|