Major changes: - Upgraded Svelte from v4 to v5.38.6 (latest stable) - Upgraded SvelteKit from v2.0.0 to v2.37.0 (latest) - Upgraded Vite from v5 to v7.1.3 for better performance - Updated all related packages to latest compatible versions - Added pnpm as package manager with packageManager field - Fixed Card.svelte nested anchor tags issue by converting inner links to buttons - Updated component styling to maintain visual consistency - Removed incompatible svelte-preprocess-import-assets package Dependencies updated: - @sveltejs/kit: ^2.0.0 → ^2.37.0 - @sveltejs/vite-plugin-svelte: ^3.0.0 → ^6.1.3 - svelte: ^4.0.0 → ^5.38.6 - vite: ^5.0.0 → ^7.1.3 - @sveltejs/adapter-auto: ^3.0.0 → ^6.1.0 - @sveltejs/adapter-node: ^2.0.0 → ^5.0.0 - svelte-check: ^3.4.6 → ^4.0.0 - mongoose: ^7.4.0 → ^8.0.0 - sharp: ^0.32.3 → ^0.33.0 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
120 lines
4.2 KiB
TypeScript
120 lines
4.2 KiB
TypeScript
import type { RequestHandler } from '@sveltejs/kit';
|
|
import fs from 'fs';
|
|
import path from 'path';
|
|
import { mkdir } from 'fs/promises';
|
|
import { Payment } from '$lib/models/Payment'; // adjust path as needed
|
|
import { dbConnect, dbDisconnect } from '$lib/db/db';
|
|
import { error } from '@sveltejs/kit';
|
|
|
|
const UPLOAD_DIR = './static/cospend';
|
|
const BASE_CURRENCY = 'CHF'; // Default currency
|
|
|
|
export const POST: RequestHandler = async ({ request, locals }) => {
|
|
let auth = await locals.auth();
|
|
if(!auth){
|
|
throw error(401, "Not logged in")
|
|
}
|
|
|
|
const formData = await request.formData();
|
|
|
|
try {
|
|
const name = formData.get('name') as string;
|
|
const category = formData.get('category') as string;
|
|
const transaction_date= new Date(formData.get('transaction_date') as string);
|
|
const description = formData.get('description') as string;
|
|
const note = formData.get('note') as string;
|
|
const tags = JSON.parse(formData.get('tags') as string) as string[];
|
|
const paid_by = formData.get('paid_by') as string
|
|
const type = formData.get('type') as string
|
|
|
|
let currency = formData.get('currency') as string;
|
|
let original_amount = parseFloat(formData.get('original_amount') as string);
|
|
let total_amount = NaN;
|
|
|
|
let for_self = parseFloat(formData.get('for_self') as string);
|
|
let for_other = parseFloat(formData.get('for_other') as string);
|
|
let conversion_rate = 1.0; // Default conversion rate
|
|
|
|
// if currency is not BASE_CURRENCY, fetch current conversion rate using frankfurter API and date in YYYY-MM-DD format
|
|
if (!currency || currency === BASE_CURRENCY) {
|
|
currency = BASE_CURRENCY;
|
|
total_amount = original_amount;
|
|
} else {
|
|
console.log(transaction_date);
|
|
const date_fmt = transaction_date.toISOString().split('T')[0]; // Convert date to YYYY-MM-DD format
|
|
// Fetch conversion rate logic here (not implemented in this example)
|
|
console.log(`Fetching conversion rate for ${currency} to ${BASE_CURRENCY} on ${date_fmt}`);
|
|
const res = await fetch(`https://api.frankfurter.app/${date_fmt}?from=${currency}&to=${BASE_CURRENCY}`)
|
|
console.log(res);
|
|
const result = await res.json();
|
|
console.log(result);
|
|
if (!result || !result.rates[BASE_CURRENCY]) {
|
|
return new Response(JSON.stringify({ message: 'Currency conversion failed.' }), { status: 400 });
|
|
}
|
|
// Assuming you want to convert the total amount to BASE_CURRENCY
|
|
conversion_rate = parseFloat(result.rates[BASE_CURRENCY]);
|
|
console.log(`Conversion rate from ${currency} to ${BASE_CURRENCY} on ${date_fmt}: ${conversion_rate}`);
|
|
total_amount = original_amount * conversion_rate;
|
|
for_self = for_self * conversion_rate;
|
|
for_other = for_other * conversion_rate;
|
|
}
|
|
|
|
//const personal_amounts = JSON.parse(formData.get('personal_amounts') as string) as { user: string, amount: number }[];
|
|
|
|
if (!name || isNaN(total_amount)) {
|
|
return new Response(JSON.stringify({ message: 'Invalid required fields.' }), { status: 400 });
|
|
}
|
|
|
|
await mkdir(UPLOAD_DIR, { recursive: true });
|
|
|
|
const images: { mediapath: string }[] = [];
|
|
const imageFiles = formData.getAll('images') as File[];
|
|
|
|
for (const file of imageFiles) {
|
|
const arrayBuffer = await file.arrayBuffer();
|
|
const buffer = Buffer.from(arrayBuffer);
|
|
const safeName = `${Date.now()}_${file.name.replace(/[^a-zA-Z0-9_.-]/g, '_')}`;
|
|
const fullPath = path.join(UPLOAD_DIR, safeName);
|
|
fs.writeFileSync(fullPath, buffer);
|
|
images.push({ mediapath: `/static/test/${safeName}` });
|
|
}
|
|
|
|
await dbConnect();
|
|
const payment = new Payment({
|
|
type,
|
|
name,
|
|
category,
|
|
transaction_date,
|
|
images,
|
|
description,
|
|
note,
|
|
tags,
|
|
original_amount,
|
|
total_amount,
|
|
paid_by,
|
|
for_self,
|
|
for_other,
|
|
conversion_rate,
|
|
currency,
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try{
|
|
await Payment.create(payment);
|
|
} catch(e){
|
|
|
|
return new Response(JSON.stringify({ message: `Error creating payment event. ${e}` }), { status: 500 });
|
|
}
|
|
await dbDisconnect();
|
|
return new Response(JSON.stringify({ message: 'Payment event created successfully.' }), { status: 201 });
|
|
} catch (err) {
|
|
console.error(err);
|
|
return new Response(JSON.stringify({ message: 'Error processing request.' }), { status: 500 });
|
|
}
|
|
};
|