Compare commits

...

3 commits

Author SHA1 Message Date
eb2b68fab0 sitio: precachear query index 2024-01-23 00:06:13 -03:00
fe63599e0e sitio: siempre migrar 2024-01-23 00:05:59 -03:00
de49cc8688 readme: ratoneando 2024-01-22 22:10:12 -03:00
3 changed files with 30 additions and 15 deletions

View file

@ -2,6 +2,10 @@
scrapeo "masivo" de precios y datos en supermercados argentinos scrapeo "masivo" de precios y datos en supermercados argentinos
## proyectos similares
- [ratoneando](https://ratoneando.ar/)
## componentes ## componentes
### scraper-rs ### scraper-rs
@ -19,6 +23,7 @@ el [sitio](./sitio/) renderiza páginas a partir de la base de datos y hace grá
para el schema de la base de datos y el sitio, es necesario [Node.js](https://nodejs.org/) y [pnpm](https://pnpm.io/). para el scraper, es necesario [Rust](https://www.rust-lang.org/) estable. para el schema de la base de datos y el sitio, es necesario [Node.js](https://nodejs.org/) y [pnpm](https://pnpm.io/). para el scraper, es necesario [Rust](https://www.rust-lang.org/) estable.
crea la base de datos: crea la base de datos:
``` ```
cd db-datos/ cd db-datos/
pnpm install pnpm install

View file

@ -1,2 +1,4 @@
export { db } from "db-datos/db.js"; export { db } from "db-datos/db.js";
export * as schema from "db-datos/schema.js"; export * as schema from "db-datos/schema.js";
import { migrateDb } from "db-datos/migrate.js";
migrateDb();

View file

@ -3,20 +3,9 @@ import { db, schema } from "$lib/server/db";
const { precios } = schema; const { precios } = schema;
import { sql } from "drizzle-orm"; import { sql } from "drizzle-orm";
let cache: null | { key: Date; data: { precios: Precios } } = null; let cache: Promise<{ key: Date; data: { precios: Precios } }> = doQuery();
type Precios = { async function doQuery() {
ean: string;
name: string | null;
imageUrl: string | null;
}[];
export const load: PageServerLoad = async ({
params,
}): Promise<{ precios: Precios }> => {
if (cache && +new Date() < +cache.key + 1000 * 60 * 10) {
return cache.data;
}
const q = db const q = db
.select({ .select({
ean: precios.ean, ean: precios.ean,
@ -30,6 +19,25 @@ export const load: PageServerLoad = async ({
.limit(150); .limit(150);
const res = await q; const res = await q;
const data = { precios: res }; const data = { precios: res };
cache = { key: new Date(), data }; return { key: new Date(), data };
return data; }
setInterval(
async () => {
const c = await doQuery();
cache = Promise.resolve(c);
},
4 * 60 * 60 * 1000,
);
type Precios = {
ean: string;
name: string | null;
imageUrl: string | null;
}[];
export const load: PageServerLoad = async ({
params,
}): Promise<{ precios: Precios }> => {
return (await cache).data;
}; };