diff --git a/db/compose.yml b/db/compose.yml index 38c32c2..497e1af 100644 --- a/db/compose.yml +++ b/db/compose.yml @@ -10,7 +10,7 @@ services: MARIADB_USER: tam3 MARIADB_PASSWORD: tam3 volumes: - - "tam3-db:/var/lib/mysql" + - "tam3-db:/var/lib/mysql:rw,z" ports: - 127.0.0.1:3306:3306 adminer: diff --git a/webapp/src/lib/server/chunkArray.js b/webapp/src/lib/server/chunkArray.js new file mode 100644 index 0000000..1d7de2a --- /dev/null +++ b/webapp/src/lib/server/chunkArray.js @@ -0,0 +1,7 @@ +export function chunkArray(arr, chunkSize) { + const chunks = []; + for (let i = 0; i < arr.length; i += chunkSize) { + chunks.push(arr.slice(i, i + chunkSize)); + } + return chunks; +} \ No newline at end of file diff --git a/webapp/src/routes/api/backuprestore/+server.js b/webapp/src/routes/api/backuprestore/+server.js index bf7b9da..80563b8 100644 --- a/webapp/src/routes/api/backuprestore/+server.js +++ b/webapp/src/routes/api/backuprestore/+server.js @@ -2,14 +2,7 @@ import { env } from "$env/dynamic/private"; import { db } from "$lib/server/db"; import { prefixes, tickets, baskets } from "$lib/server/db/schema"; import { sql } from "drizzle-orm"; - -function chunkArray(arr, chunkSize) { - const chunks = []; - for (let i = 0; i < arr.length; i += chunkSize) { - chunks.push(arr.slice(i, i + chunkSize)); - } - return chunks; -} +import { chunkArray } from "$lib/server/chunkArray"; export async function GET() { if (env.TAM3_REMOTE) { diff --git a/webapp/src/routes/api/baskets/+server.js b/webapp/src/routes/api/baskets/+server.js index a1c77b4..4c2af80 100644 --- a/webapp/src/routes/api/baskets/+server.js +++ b/webapp/src/routes/api/baskets/+server.js @@ -1,6 +1,8 @@ import { env } from "$env/dynamic/private"; import { db } from "$lib/server/db"; +import { sql } from "drizzle-orm"; import { baskets } from "$lib/server/db/schema"; +import { chunkArray } from "$lib/server/chunkArray"; export async function GET() { if (env.TAM3_REMOTE) { @@ -26,9 +28,9 @@ export async function GET() { export async function POST({ request }) { const i_baskets = await request.json(); - for (let basket of i_baskets) { - await db.insert(baskets).values({prefix: basket.prefix, b_id: basket.b_id, description: basket.description, donors: basket.donors, winning_ticket: basket.winning_ticket}) - .onConflictDoUpdate({target: [baskets.prefix, baskets.b_id], set: {description: basket.description, donors: basket.donors, winning_ticket: basket.winning_ticket}}) + for (let basketChunk of chunkArray(i_baskets, 300)) { + await db.insert(baskets).values(basketChunk) + .onConflictDoUpdate({target: [baskets.prefix, baskets.b_id], set: {description: sql`excluded.description`, donors: sql`excluded.donors`, winning_ticket: sql`excluded.winning_ticket`}}) }; if (env.TAM3_REMOTE) { const res = await fetch(`${env.TAM3_REMOTE}/api/baskets/?api_key=${env.TAM3_REMOTE_KEY}`, { diff --git a/webapp/src/routes/api/combined/+server.js b/webapp/src/routes/api/combined/+server.js index 05f722d..fd9f1fc 100644 --- a/webapp/src/routes/api/combined/+server.js +++ b/webapp/src/routes/api/combined/+server.js @@ -1,6 +1,8 @@ import { env } from "$env/dynamic/private"; import { db } from "$lib/server/db"; +import { sql } from "drizzle-orm"; import { baskets, combined } from "$lib/server/db/schema"; +import { chunkArray } from "$lib/server/chunkArray"; export async function GET() { if (env.TAM3_REMOTE) { @@ -21,9 +23,9 @@ export async function GET() { export async function POST({ request }) { const r_data = await request.json() - for (let winner of r_data) { - await db.insert(baskets).values({prefix: winner.prefix, b_id: winner.b_id, winning_ticket: winner.winning_ticket}) - .onConflictDoUpdate({target: [baskets.prefix, baskets.b_id], set: {winning_ticket: winner.winning_ticket}}) + for (let winnerChunk of chunkArray(r_data, 300)) { + await db.insert(baskets).values(winnerChunk) + .onConflictDoUpdate({target: [baskets.prefix, baskets.b_id], set: {winning_ticket: sql`excluded.winning_ticket`}}) } if (env.TAM3_REMOTE) { const res = await fetch(`${env.TAM3_REMOTE}/api/combined/?api_key=${env.TAM3_REMOTE_KEY}`, { diff --git a/webapp/src/routes/api/tickets/+server.js b/webapp/src/routes/api/tickets/+server.js index 2950946..5f93c6a 100644 --- a/webapp/src/routes/api/tickets/+server.js +++ b/webapp/src/routes/api/tickets/+server.js @@ -1,6 +1,8 @@ import { db } from "$lib/server/db"; +import { sql } from "drizzle-orm"; import { tickets } from "$lib/server/db/schema"; import { env } from "$env/dynamic/private"; +import { chunkArray } from "$lib/server/chunkArray"; export async function GET() { if (env.TAM3_REMOTE) { @@ -30,9 +32,9 @@ export async function GET() { export async function POST({ request }) { const i_tickets = await request.json(); - for (let ticket of i_tickets) { - await db.insert(tickets).values({prefix: ticket.prefix, t_id: ticket.t_id, first_name: ticket.first_name, last_name: ticket.last_name, phone_number: ticket.phone_number, preference: ticket.preference}) - .onConflictDoUpdate({target: [tickets.prefix, tickets.t_id], set: {first_name: ticket.first_name, last_name: ticket.last_name, phone_number: ticket.phone_number, preference: ticket.preference}}); + for (let ticketChunk of chunkArray(i_tickets, 300)) { + await db.insert(tickets).values(ticketChunk) + .onConflictDoUpdate({target: [tickets.prefix, tickets.t_id], set: {first_name: sql`excluded.first_name`, last_name: sql`excluded.last_name`, phone_number: sql`excluded.phone_number`, preference: sql`excluded.preference`}}); }; if (env.TAM3_REMOTE) { const res = await fetch(`${env.TAM3_REMOTE}/api/tickets/?api_key=${env.TAM3_REMOTE_KEY}`, { diff --git a/webapp/src/routes/baskets/[prefix]/+page.svelte b/webapp/src/routes/baskets/[prefix]/+page.svelte index c64133f..ac91dd4 100644 --- a/webapp/src/routes/baskets/[prefix]/+page.svelte +++ b/webapp/src/routes/baskets/[prefix]/+page.svelte @@ -20,7 +20,7 @@ const functions = { refreshPage: async () => { - if (current_baskets.length > 0) { + if (current_baskets.filter(basket => basket.changed === true).length > 0) { functions.saveAll() } const res = await fetch(`/api/baskets/${prefix.name}/${pagerForm.id_from}/${pagerForm.id_to}`); diff --git a/webapp/src/routes/drawing/[prefix]/+page.svelte b/webapp/src/routes/drawing/[prefix]/+page.svelte index fdbaee1..d264b94 100644 --- a/webapp/src/routes/drawing/[prefix]/+page.svelte +++ b/webapp/src/routes/drawing/[prefix]/+page.svelte @@ -19,7 +19,7 @@ const functions = { refreshPage: async () => { - if (current_drawings.length > 0) { + if (current_drawings.filter(drawing => drawing.changed === true).length > 0) { functions.saveAll() } const res = await fetch(`/api/combined/${prefix.name}/${pagerForm.id_from}/${pagerForm.id_to}`); diff --git a/webapp/src/routes/tickets/[prefix]/+page.svelte b/webapp/src/routes/tickets/[prefix]/+page.svelte index e136b43..bb68c15 100644 --- a/webapp/src/routes/tickets/[prefix]/+page.svelte +++ b/webapp/src/routes/tickets/[prefix]/+page.svelte @@ -19,7 +19,7 @@ const functions = { refreshPage: async () => { - if (current_tickets.length > 0) { + if (current_tickets.filter(ticket => ticket.changed === true).length > 0) { functions.saveAll(); }; const res = await fetch(`/api/tickets/${prefix.name}/${pagerForm.id_from}/${pagerForm.id_to}`);