Deploy to production - ensure all endpoints operational

This commit is contained in:
defiQUG
2025-11-12 08:17:28 -08:00
parent b421d2964c
commit f1c61c8339
171 changed files with 50830 additions and 42363 deletions

View File

@@ -0,0 +1,2 @@
import { HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions';
export declare function createDonation(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit>;

View File

@@ -0,0 +1,128 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createDonation = createDonation;
const functions_1 = require("@azure/functions");
const DIContainer_1 = __importDefault(require("../DIContainer"));
const uuid_1 = require("uuid");
const stripe_1 = __importDefault(require("stripe"));
async function createDonation(request, context) {
try {
await DIContainer_1.default.getInstance().initializeServices();
const { donationsContainer, secretClient } = DIContainer_1.default.getInstance().getServices();
// Get request body
const donationRequest = await request.json();
// Validate required fields
if (!donationRequest.amount || !donationRequest.donorEmail || !donationRequest.donorName) {
const response = {
success: false,
error: 'Missing required fields: amount, donorEmail, donorName',
timestamp: new Date().toISOString()
};
return {
status: 400,
jsonBody: response,
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
}
};
}
// Initialize Stripe if payment method is stripe
let stripePaymentIntentId;
if (donationRequest.paymentMethod === 'stripe') {
try {
const stripeSecretKey = await secretClient.getSecret('stripe-secret-key');
const stripe = new stripe_1.default(stripeSecretKey.value, {
apiVersion: '2025-02-24.acacia'
});
const paymentIntent = await stripe.paymentIntents.create({
amount: Math.round(donationRequest.amount * 100), // Convert to cents
currency: donationRequest.currency.toLowerCase(),
metadata: {
donorEmail: donationRequest.donorEmail,
donorName: donationRequest.donorName,
program: donationRequest.program || 'general'
}
});
stripePaymentIntentId = paymentIntent.id;
}
catch (stripeError) {
context.error('Stripe payment intent creation failed:', stripeError);
const response = {
success: false,
error: 'Payment processing failed',
timestamp: new Date().toISOString()
};
return {
status: 500,
jsonBody: response,
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
}
};
}
}
// Create donation record
const donation = {
id: (0, uuid_1.v4)(),
amount: donationRequest.amount,
currency: donationRequest.currency,
donorName: donationRequest.donorName,
donorEmail: donationRequest.donorEmail,
donorPhone: donationRequest.donorPhone,
program: donationRequest.program,
isRecurring: donationRequest.isRecurring,
frequency: donationRequest.frequency,
paymentMethod: donationRequest.paymentMethod,
stripePaymentIntentId,
status: 'pending',
message: donationRequest.message,
isAnonymous: donationRequest.isAnonymous,
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString()
};
// Save to Cosmos DB
await donationsContainer.items.create(donation);
const response = {
success: true,
data: donation,
message: 'Donation created successfully',
timestamp: new Date().toISOString()
};
return {
status: 201,
jsonBody: response,
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
}
};
}
catch (error) {
context.error('Error creating donation:', error);
const response = {
success: false,
error: 'Failed to create donation',
timestamp: new Date().toISOString()
};
return {
status: 500,
jsonBody: response,
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
}
};
}
}
functions_1.app.http('createDonation', {
methods: ['POST'],
authLevel: 'anonymous',
route: 'donations',
handler: createDonation
});
//# sourceMappingURL=createDonation.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"createDonation.js","sourceRoot":"","sources":["../../src/donations/createDonation.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,2 @@
import { HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions';
export declare function getDonations(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit>;

View File

@@ -0,0 +1,83 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getDonations = getDonations;
const functions_1 = require("@azure/functions");
const DIContainer_1 = __importDefault(require("../DIContainer"));
async function getDonations(request, context) {
try {
await DIContainer_1.default.getInstance().initializeServices();
const { donationsContainer } = DIContainer_1.default.getInstance().getServices();
const page = parseInt(request.query.get('page') || '1');
const limit = parseInt(request.query.get('limit') || '10');
const status = request.query.get('status');
const program = request.query.get('program');
let query = 'SELECT * FROM c WHERE 1=1';
const parameters = [];
if (status) {
query += ' AND c.status = @status';
parameters.push({ name: '@status', value: status });
}
if (program) {
query += ' AND c.program = @program';
parameters.push({ name: '@program', value: program });
}
query += ' ORDER BY c.createdAt DESC';
const { resources: donations } = await donationsContainer.items
.query({
query,
parameters
})
.fetchAll();
// Simple pagination
const total = donations.length;
const pages = Math.ceil(total / limit);
const startIndex = (page - 1) * limit;
const endIndex = startIndex + limit;
const paginatedDonations = donations.slice(startIndex, endIndex);
const response = {
success: true,
data: paginatedDonations,
pagination: {
page,
limit,
total,
pages
},
timestamp: new Date().toISOString()
};
return {
status: 200,
jsonBody: response,
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
}
};
}
catch (error) {
context.error('Error fetching donations:', error);
const response = {
success: false,
error: 'Failed to fetch donations',
timestamp: new Date().toISOString()
};
return {
status: 500,
jsonBody: response,
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
}
};
}
}
functions_1.app.http('getDonations', {
methods: ['GET'],
authLevel: 'anonymous',
route: 'donations',
handler: getDonations
});
//# sourceMappingURL=getDonations.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"getDonations.js","sourceRoot":"","sources":["../../src/donations/getDonations.ts"],"names":[],"mappings":"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"}