mirror of
https://github.com/catdevnull/preciazo.git
synced 2024-11-25 19:16:19 +00:00
sitio: adaptar homepage para usar api
This commit is contained in:
parent
f01213aaf8
commit
a1fa2796ef
3 changed files with 24 additions and 68 deletions
|
@ -39,9 +39,6 @@ importers:
|
||||||
dayjs:
|
dayjs:
|
||||||
specifier: ^1.11.10
|
specifier: ^1.11.10
|
||||||
version: 1.11.10
|
version: 1.11.10
|
||||||
drizzle-kit:
|
|
||||||
specifier: ^0.23.0
|
|
||||||
version: 0.23.0
|
|
||||||
drizzle-orm:
|
drizzle-orm:
|
||||||
specifier: ^0.32.0
|
specifier: ^0.32.0
|
||||||
version: 0.32.0(@types/better-sqlite3@7.6.9)(better-sqlite3@11.1.2)
|
version: 0.32.0(@types/better-sqlite3@7.6.9)(better-sqlite3@11.1.2)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script lang="ts" context="module">
|
<script lang="ts" context="module">
|
||||||
export type Product = { ean: string; name: string; imageUrl: string | null };
|
export type Product = { ean: string; name: string; image_url: string | null };
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
@ -7,9 +7,9 @@
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<a href={`/ean/${product.ean}`} class="flex gap-2">
|
<a href={`/ean/${product.ean}`} class="flex gap-2">
|
||||||
{#if product.imageUrl}
|
{#if product.image_url}
|
||||||
<img
|
<img
|
||||||
src={product.imageUrl}
|
src={product.image_url}
|
||||||
alt={product.name}
|
alt={product.name}
|
||||||
class="max-h-48"
|
class="max-h-48"
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
|
|
|
@ -1,68 +1,27 @@
|
||||||
import type { PageServerLoad } from "./$types";
|
import type { PageServerLoad } from "./$types";
|
||||||
import { getDb, schema } from "$lib/server/db";
|
|
||||||
const { precios, bestSelling } = schema;
|
|
||||||
import { max, sql } from "drizzle-orm";
|
|
||||||
import z from "zod";
|
import z from "zod";
|
||||||
import type { Product } from "$lib/ProductPreview.svelte";
|
|
||||||
|
|
||||||
type Data = {
|
async function getBestSelling() {
|
||||||
category: string;
|
const res = await fetch("http://localhost:8000/api/0/best-selling-products");
|
||||||
products: Product[];
|
const json = await res.json();
|
||||||
}[];
|
return z
|
||||||
|
.array(
|
||||||
let cache: Promise<{ key: Date; data: Data }> = doQuery();
|
z.object({
|
||||||
|
category: z.string(),
|
||||||
async function doQuery() {
|
products: z.array(
|
||||||
const db = await getDb();
|
z.object({
|
||||||
|
ean: z.string(),
|
||||||
const categories = await db
|
name: z.string().nullable(),
|
||||||
.select({
|
image_url: z.string().nullable(),
|
||||||
fetchedAt: bestSelling.fetchedAt,
|
}),
|
||||||
category: bestSelling.category,
|
),
|
||||||
eansJson: bestSelling.eansJson,
|
}),
|
||||||
})
|
)
|
||||||
.from(bestSelling)
|
.parse(json);
|
||||||
.groupBy(bestSelling.category)
|
|
||||||
.having(max(bestSelling.fetchedAt));
|
|
||||||
|
|
||||||
const categoriesWithProducts = await Promise.all(
|
|
||||||
categories.map(async (category) => {
|
|
||||||
const eans = z.array(z.string()).parse(JSON.parse(category.eansJson));
|
|
||||||
|
|
||||||
const products = await db
|
|
||||||
.select({
|
|
||||||
ean: precios.ean,
|
|
||||||
name: precios.name,
|
|
||||||
imageUrl: precios.imageUrl,
|
|
||||||
})
|
|
||||||
.from(precios)
|
|
||||||
.where(sql`${precios.ean} in ${eans}`)
|
|
||||||
.groupBy(precios.ean)
|
|
||||||
.having(max(precios.fetchedAt));
|
|
||||||
|
|
||||||
return {
|
|
||||||
category: category.category,
|
|
||||||
products: eans
|
|
||||||
.map((ean) => products.find((p) => p.ean === ean))
|
|
||||||
.filter((x): x is Product => !!x && !!x.name),
|
|
||||||
};
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
return { key: new Date(), data: categoriesWithProducts };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log("setting up interval");
|
export const load: PageServerLoad = async ({ params }) => {
|
||||||
setInterval(
|
return {
|
||||||
async () => {
|
data: await getBestSelling(),
|
||||||
const c = await doQuery();
|
};
|
||||||
cache = Promise.resolve(c);
|
|
||||||
},
|
|
||||||
4 * 60 * 60 * 1000,
|
|
||||||
);
|
|
||||||
|
|
||||||
export const load: PageServerLoad = async ({
|
|
||||||
params,
|
|
||||||
}): Promise<{ data: Data }> => {
|
|
||||||
return { data: (await cache).data };
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue