diff --git a/server/utils/db/sql.ts b/server/utils/db/sql.ts index df9a7dd..d74458a 100644 --- a/server/utils/db/sql.ts +++ b/server/utils/db/sql.ts @@ -7,6 +7,7 @@ import { modpacks, type NewDependency, type NewModpack, + type NewProjectStats, projectStats, } from "~~/server/database/schema"; import { dateToKey, keyToDate } from "~~/shared/utils/date"; @@ -38,56 +39,66 @@ export const DB = { const dateKey = dateToKey(new Date()); - // Todo: bulk insert - try { - for (let i = 0; i < data.versions.length; i++) { - const version = data.versions[i]; - - for (const loader of data.data) { - const values = loader.values[i]; - - if (values === undefined || version === undefined) { - consola.warn( - `No values for version ${version} in loader ${loader.name}`, - ); - continue; - } - - await db - .insert(projectStats) - .values({ - // Values - downloads: values.downloads, - versions: values.versions, - count: values.count, - - // Version Info - version: version, - loader: loader.name, - - // Metadata - date: dateKey, - projectType: type, - versionCategory: versionCategory, - excluded: exclusive, - }) - .onConflictDoUpdate({ - target: [ - projectStats.date, - projectStats.projectType, - projectStats.versionCategory, - projectStats.excluded, - projectStats.version, - projectStats.loader, - ], - set: { - downloads: sql`excluded.downloads`, - versions: sql`excluded.versions`, - count: sql`excluded.count`, - }, - }); + const to_insert: NewProjectStats[] = []; + for (let i = 0; i < data.versions.length; i++) { + const version = data.versions[i]; + + for (const loader of data.data) { + const values = loader.values[i]; + + if (values === undefined || version === undefined) { + consola.warn( + `No values for version ${version} in loader ${loader.name}`, + ); + continue; } + + if ( + values.count === 0 && + values.downloads === 0 && + values.versions === 0 + ) { + continue; + } + + to_insert.push({ + // Values + downloads: values.downloads, + versions: values.versions, + count: values.count, + + // Version Info + version: version, + loader: loader.name, + + // Metadata + date: dateKey, + projectType: type, + versionCategory: versionCategory, + excluded: exclusive, + }); } + } + + try { + await db + .insert(projectStats) + .values(to_insert) + .onConflictDoUpdate({ + target: [ + projectStats.date, + projectStats.projectType, + projectStats.versionCategory, + projectStats.excluded, + projectStats.version, + projectStats.loader, + ], + set: { + downloads: sql`excluded.downloads`, + versions: sql`excluded.versions`, + count: sql`excluded.count`, + }, + }); } catch (error) { return new Error(`Failed to add project stats: ${error}`); }