Files
adopt-a-street/backend/models/PointTransaction.js
William Valentin 5efee88655 feat: complete MongoDB to CouchDB migration and deployment
- Remove all mongoose dependencies from backend
- Convert Badge and PointTransaction models to CouchDB
- Fix gamificationService for CouchDB architecture
- Update Docker registry URLs to use HTTPS (port 443)
- Fix ingress configuration for HAProxy
- Successfully deploy multi-architecture images
- Application fully running on Kubernetes with CouchDB

🤖 Generated with [AI Assistant]

Co-Authored-By: AI Assistant <noreply@ai-assistant.com>
2025-11-02 14:39:49 -08:00

165 lines
4.4 KiB
JavaScript

const couchdbService = require("../services/couchdbService");
class PointTransaction {
static async create(transactionData) {
try {
const transaction = {
_id: `point_transaction_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
type: 'point_transaction',
user: transactionData.user,
amount: transactionData.amount,
transactionType: transactionData.transactionType,
description: transactionData.description,
relatedEntity: transactionData.relatedEntity || null,
balanceAfter: transactionData.balanceAfter,
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString()
};
const result = await couchdbService.insert(transaction);
return { ...transaction, _rev: result.rev };
} catch (error) {
console.error('Error creating point transaction:', error);
throw error;
}
}
static async findByUser(userId, limit = 50, skip = 0) {
try {
const result = await couchdbService.find({
selector: {
type: 'point_transaction',
user: userId
},
sort: [{ createdAt: 'desc' }],
limit: limit,
skip: skip
});
return result.docs;
} catch (error) {
console.error('Error finding point transactions by user:', error);
throw error;
}
}
static async findByType(transactionType, limit = 50, skip = 0) {
try {
const result = await couchdbService.find({
selector: {
type: 'point_transaction',
transactionType: transactionType
},
sort: [{ createdAt: 'desc' }],
limit: limit,
skip: skip
});
return result.docs;
} catch (error) {
console.error('Error finding point transactions by type:', error);
throw error;
}
}
static async findById(id) {
try {
const transaction = await couchdbService.get(id);
if (transaction.type !== 'point_transaction') {
return null;
}
return transaction;
} catch (error) {
if (error.statusCode === 404) {
return null;
}
console.error('Error finding point transaction by ID:', error);
throw error;
}
}
static async getUserBalance(userId) {
try {
// Get the most recent transaction for the user to find current balance
const result = await couchdbService.find({
selector: {
type: 'point_transaction',
user: userId
},
sort: [{ createdAt: 'desc' }],
limit: 1
});
if (result.docs.length === 0) {
return 0;
}
return result.docs[0].balanceAfter;
} catch (error) {
console.error('Error getting user balance:', error);
throw error;
}
}
static async getUserTransactionHistory(userId, startDate, endDate) {
try {
const selector = {
type: 'point_transaction',
user: userId
};
if (startDate || endDate) {
selector.createdAt = {};
if (startDate) {
selector.createdAt.$gte = startDate;
}
if (endDate) {
selector.createdAt.$lte = endDate;
}
}
const result = await couchdbService.find({
selector: selector,
sort: [{ createdAt: 'desc' }]
});
return result.docs;
} catch (error) {
console.error('Error getting user transaction history:', error);
throw error;
}
}
static async getTransactionStats(userId, startDate, endDate) {
try {
const transactions = await this.getUserTransactionHistory(userId, startDate, endDate);
const stats = {
totalEarned: 0,
totalSpent: 0,
transactionCount: transactions.length,
transactionBreakdown: {}
};
transactions.forEach(transaction => {
if (transaction.amount > 0) {
stats.totalEarned += transaction.amount;
} else {
stats.totalSpent += Math.abs(transaction.amount);
}
const type = transaction.transactionType;
if (!stats.transactionBreakdown[type]) {
stats.transactionBreakdown[type] = { count: 0, total: 0 };
}
stats.transactionBreakdown[type].count++;
stats.transactionBreakdown[type].total += transaction.amount;
});
return stats;
} catch (error) {
console.error('Error getting transaction stats:', error);
throw error;
}
}
}
module.exports = PointTransaction;