'use server'; import { revalidatePath } from 'next/cache'; import { redirect } from 'next/navigation'; import clientPromise from './mongodb'; import { ObjectId } from 'mongodb'; import { BillingLocation } from './db-types'; /** * Server-side action which adds a new month to the database * @param locationId location of the bill * @param billId ID of the bill * @param prevState previous state of the form * @param formData form data * @returns */ export async function addYearMonth(yearMonthString: string) { // update the bill in the mongodb const client = await clientPromise; const db = client.db("rezije"); const yearMonth = parseInt(yearMonthString); const prevYearMonth = (yearMonth - 1) % 100 === 0 ? yearMonth - 89 : yearMonth - 1; // find all locations for the previous month const prevMonthLocations = await db.collection("lokacije").find({ yearMonth: prevYearMonth }); const newMonthLocationsCursor = prevMonthLocations.map((prevLocation) => { return({ // copy all the properties from the previous location ...prevLocation, // assign a new ID _id: (new ObjectId()).toHexString(), yearMonth, // copy bill array, but set all bills to unpaid and remove attachments and notes bills: prevLocation.bills.map((bill) => { return { ...bill, paid: false, attachment: null, notes: null, } }) } as BillingLocation); }); const newMonthLocations = await newMonthLocationsCursor.toArray() await db.collection("lokacije").insertMany(newMonthLocations); // clear the cache for the path revalidatePath('/'); // go to the bill list redirect('/'); } export async function gotoHome() { redirect('/'); } export const fetchBillById = async (locationID:string, billID:string) => { const client = await clientPromise; const db = client.db("rezije"); // find a location with the given locationID const billLocation = await db.collection("lokacije").findOne({ _id: locationID }) if(!billLocation) { console.log(`Location ${locationID} not found`); return(null); } // find a bill with the given billID const bill = billLocation?.bills.find(({ _id }) => _id.toString() === billID); if(!bill) { console.log('Bill not found'); return(null); } return(bill); } export const deleteBillById = async (locationID:string, billID:string) => { const client = await clientPromise; const db = client.db("rezije"); // find a location with the given locationID const post = await db.collection("lokacije").updateOne( { _id: locationID // find a location with the given locationID }, { // remove the bill with the given billID $pull: { bills: { _id: billID } } }); return(post.modifiedCount); }