feat: local caching for dev

This commit is contained in:
Cory Dransfeldt 2024-11-16 17:02:32 -08:00
parent c70fc72952
commit 522d8ca48a
No known key found for this signature in database
21 changed files with 375 additions and 326 deletions

View file

@ -7,6 +7,12 @@ export default defineConfig({
adapter: cloudflare(), adapter: cloudflare(),
integrations: [react()], integrations: [react()],
vite: { vite: {
build: {
sourcemap: false,
},
optimizeDeps: {
include: ["@tabler/icons-react"],
},
resolve: { resolve: {
alias: { alias: {
"@cdransf": "node_modules/@cdransf", "@cdransf": "node_modules/@cdransf",

View file

@ -49,7 +49,7 @@ const pagination = {
</time> </time>
</div> </div>
<h3> <h3>
<a href={post.slug}>{post.title}</a> <a href={post.url}>{post.title}</a>
</h3> </h3>
<p set:html={md(post.description)}></p> <p set:html={md(post.description)}></p>
</article> </article>

View file

@ -1,24 +1,24 @@
import { createClient } from '@supabase/supabase-js'; import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = import.meta.env.SUPABASE_URL; const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY; const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
let cachedActivity = null;
export async function fetchActivity() { export async function fetchActivity() {
try { if (import.meta.env.MODE === "development" && cachedActivity)
const { data, error } = await supabase return cachedActivity;
.from('optimized_all_activity')
.select('feed');
if (error) { const { data, error } = await supabase
console.error('Error fetching activity data:', error); .from("optimized_all_activity")
return []; .select("feed");
}
const [{ feed } = {}] = data || []; if (error) return [];
return feed?.filter((item) => item.feed !== null) || []; const [{ feed } = {}] = data || [];
} catch (error) { const filteredFeed = feed?.filter((item) => item.feed !== null) || [];
console.error('Unexpected error fetching activity data:', error);
return []; if (import.meta.env.MODE === "development") cachedActivity = filteredFeed;
}
} return filteredFeed;
};

View file

@ -5,39 +5,34 @@ const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY; const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
let cachedAlbumReleases = null;
export async function fetchAlbumReleases() { export async function fetchAlbumReleases() {
try { if (import.meta.env.MODE === 'development' && cachedAlbumReleases) return cachedAlbumReleases;
const today = DateTime.utc().startOf('day').toSeconds();
const { data, error } = await supabase const today = DateTime.utc().startOf('day').toSeconds();
.from('optimized_album_releases')
.select('*');
if (error) { const { data, error } = await supabase
console.error('Error fetching album releases:', error); .from('optimized_album_releases')
return { all: [], upcoming: [] }; .select('*');
}
const all = data if (error) return { all: [], upcoming: [] };
.map((album) => {
const releaseDate = DateTime.fromSeconds(album.release_timestamp)
.toUTC()
.startOf('day');
return { const all = data
...album, .map((album) => {
description: album.artist.description, const releaseDate = DateTime.fromSeconds(album.release_timestamp).toUTC().startOf('day');
date: releaseDate.toLocaleString(DateTime.DATE_FULL), return {
timestamp: releaseDate.toSeconds(), ...album,
}; description: album.artist.description,
}) date: releaseDate.toLocaleString(DateTime.DATE_FULL),
.sort((a, b) => a.timestamp - b.timestamp); timestamp: releaseDate.toSeconds(),
};
})
.sort((a, b) => a.timestamp - b.timestamp);
const upcoming = all.filter((album) => album.release_timestamp > today); const upcoming = all.filter((album) => album.release_timestamp > today);
return { all, upcoming }; if (import.meta.env.MODE === 'development') cachedAlbumReleases = { all, upcoming };
} catch (error) {
console.error('Unexpected error processing album releases:', error); return { all, upcoming };
return { all: [], upcoming: [] }; };
}
}

View file

@ -1,38 +1,40 @@
import { createClient } from '@supabase/supabase-js'; import { createClient } from "@supabase/supabase-js";
import { parseCountryField } from '@utils/helpers.js'; import { parseCountryField } from "@utils/helpers.js";
const SUPABASE_URL = import.meta.env.SUPABASE_URL; const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY; const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
const PAGE_SIZE = 1000;
export async function fetchArtists(){ let cachedArtists = null;
export async function fetchArtists() {
if (import.meta.env.MODE === "development" && cachedArtists)
return cachedArtists;
const PAGE_SIZE = 1000;
let artists = []; let artists = [];
let rangeStart = 0; let rangeStart = 0;
while (true) { while (true) {
const { data, error } = await supabase const { data, error } = await supabase
.from('optimized_artists') .from("optimized_artists")
.select('*') .select("*")
.range(rangeStart, rangeStart + PAGE_SIZE - 1); .range(rangeStart, rangeStart + PAGE_SIZE - 1);
if (error) { if (error) break;
console.error('Error fetching artists:', error);
break;
}
// Process and concatenate artists data
artists = artists.concat( artists = artists.concat(
data.map((artist) => ({ data.map((artist) => ({
...artist, ...artist,
country: parseCountryField(artist['country']), country: parseCountryField(artist["country"]),
})) }))
); );
// Break if no more data
if (data.length < PAGE_SIZE) break; if (data.length < PAGE_SIZE) break;
rangeStart += PAGE_SIZE; rangeStart += PAGE_SIZE;
} }
if (import.meta.env.MODE === "development") cachedArtists = artists;
return artists; return artists;
}; };

View file

@ -1,22 +1,28 @@
import { createClient } from '@supabase/supabase-js'; import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = import.meta.env.SUPABASE_URL; const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY; const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
let cachedBlogroll = null;
export async function fetchBlogroll() { export async function fetchBlogroll() {
if (import.meta.env.MODE === "development" && cachedBlogroll)
return cachedBlogroll;
const { data, error } = await supabase const { data, error } = await supabase
.from('authors') .from("authors")
.select('*') .select("*")
.eq('blogroll', true) .eq("blogroll", true)
.order('name', { ascending: true }); .order("name", { ascending: true });
if (error) { if (error) return [];
console.error('Error fetching authors for the blogroll:', error);
return [];
}
return data.sort((a, b) => const sortedData = data.sort((a, b) =>
a.name.toLowerCase().localeCompare(b.name.toLowerCase()) a.name.toLowerCase().localeCompare(b.name.toLowerCase())
); );
};
if (import.meta.env.MODE === "development") cachedBlogroll = sortedData;
return sortedData;
};

View file

@ -1,25 +1,26 @@
import { createClient } from '@supabase/supabase-js'; import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = import.meta.env.SUPABASE_URL; const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY; const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
const PAGE_SIZE = 1000;
let cachedBooks = null;
export async function fetchBooks() { export async function fetchBooks() {
if (import.meta.env.MODE === "development" && cachedBooks) return cachedBooks;
const PAGE_SIZE = 1000;
let books = []; let books = [];
let rangeStart = 0; let rangeStart = 0;
while (true) { while (true) {
const { data, error } = await supabase const { data, error } = await supabase
.from('optimized_books') .from("optimized_books")
.select('*') .select("*")
.order('date_finished', { ascending: false }) .order("date_finished", { ascending: false })
.range(rangeStart, rangeStart + PAGE_SIZE - 1); .range(rangeStart, rangeStart + PAGE_SIZE - 1);
if (error) { if (error) break;
console.error('Error fetching books:', error);
break;
}
books = books.concat(data); books = books.concat(data);
if (data.length < PAGE_SIZE) break; if (data.length < PAGE_SIZE) break;
@ -39,12 +40,17 @@ export async function fetchBooks() {
const sortedByYear = Object.values(years).filter((year) => year.value > 2017); const sortedByYear = Object.values(years).filter((year) => year.value > 2017);
const currentYear = new Date().getFullYear(); const currentYear = new Date().getFullYear();
const booksForCurrentYear = const booksForCurrentYear =
sortedByYear.find((yearGroup) => yearGroup.value === currentYear)?.data || []; sortedByYear.find((yearGroup) => yearGroup.value === currentYear)?.data ||
[];
return { const result = {
all: books, all: books,
years: sortedByYear, years: sortedByYear,
currentYear: booksForCurrentYear, currentYear: booksForCurrentYear,
feed: books.filter((book) => book.feed), feed: books.filter((book) => book.feed),
}; };
};
if (import.meta.env.MODE === "development") cachedBooks = result;
return result;
};

View file

@ -1,32 +1,38 @@
import { createClient } from '@supabase/supabase-js'; import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = import.meta.env.SUPABASE_URL; const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY; const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
const PAGE_SIZE = 1000;
let cachedConcerts = null;
export async function fetchConcertsData() { export async function fetchConcertsData() {
if (import.meta.env.MODE === "development" && cachedConcerts)
return cachedConcerts;
const PAGE_SIZE = 1000;
let concerts = []; let concerts = [];
let rangeStart = 0; let rangeStart = 0;
while (true) { while (true) {
const { data, error } = await supabase const { data, error } = await supabase
.from('optimized_concerts') .from("optimized_concerts")
.select('*') .select("*")
.range(rangeStart, rangeStart + PAGE_SIZE - 1); .range(rangeStart, rangeStart + PAGE_SIZE - 1);
if (error) { if (error) break;
console.error('Error fetching concerts:', error);
break;
}
concerts = concerts.concat(data); concerts = concerts.concat(data);
if (data.length < PAGE_SIZE) break; if (data.length < PAGE_SIZE) break;
rangeStart += PAGE_SIZE; rangeStart += PAGE_SIZE;
} }
return concerts.map((concert) => ({ const result = concerts.map((concert) => ({
...concert, ...concert,
artist: concert.artist || { name: concert.artist_name_string, url: null }, artist: concert.artist || { name: concert.artist_name_string, url: null },
})); }));
};
if (import.meta.env.MODE === "development") cachedConcerts = result;
return result;
};

View file

@ -1,18 +1,19 @@
import { createClient } from '@supabase/supabase-js'; import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = import.meta.env.SUPABASE_URL; const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY; const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
export async function fetchGenres() { let cachedGenres = null;
const { data, error } = await supabase
.from('optimized_genres')
.select('*');
if (error) { export async function fetchGenres() {
console.error('Error fetching genres with artists:', error); if (import.meta.env.MODE === "development" && cachedGenres)
return []; return cachedGenres;
}
const { data, error } = await supabase.from("optimized_genres").select("*");
if (error) return [];
if (import.meta.env.MODE === "development") cachedGenres = data;
return data; return data;
}; };

View file

@ -1,19 +1,23 @@
import { createClient } from '@supabase/supabase-js'; import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = import.meta.env.SUPABASE_URL; const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY; const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
let cachedGlobals = null;
export async function fetchGlobals() { export async function fetchGlobals() {
const isDev = import.meta.env.MODE === "development";
if (isDev && cachedGlobals) return cachedGlobals;
const { data, error } = await supabase const { data, error } = await supabase
.from('optimized_globals') .from("optimized_globals")
.select('*') .select("*")
.single(); .single();
if (error) { if (error) return {};
console.error('Error fetching globals:', error); if (isDev) cachedGlobals = data;
return {};
}
return data; return data;
} };

View file

@ -1,31 +1,33 @@
import { createClient } from '@supabase/supabase-js'; import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = import.meta.env.SUPABASE_URL; const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY; const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
const PAGE_SIZE = 1000;
let cachedLinks = null;
export async function fetchLinks() { export async function fetchLinks() {
if (import.meta.env.MODE === "development" && cachedLinks) return cachedLinks;
const PAGE_SIZE = 1000;
let links = []; let links = [];
let page = 0; let page = 0;
let fetchMore = true; let fetchMore = true;
while (fetchMore) { while (fetchMore) {
const { data, error } = await supabase const { data, error } = await supabase
.from('optimized_links') .from("optimized_links")
.select('*') .select("*")
.range(page * PAGE_SIZE, (page + 1) * PAGE_SIZE - 1); .range(page * PAGE_SIZE, (page + 1) * PAGE_SIZE - 1);
if (error) { if (error) return links;
console.error('Error fetching links:', error);
return links;
}
if (data.length < PAGE_SIZE) fetchMore = false; if (data.length < PAGE_SIZE) fetchMore = false;
links = links.concat(data); links = links.concat(data);
page++; page++;
} }
if (import.meta.env.MODE === "development") cachedLinks = links;
return links; return links;
}; };

View file

@ -1,25 +1,27 @@
import { createClient } from '@supabase/supabase-js'; import { createClient } from "@supabase/supabase-js";
import { DateTime } from 'luxon'; import { DateTime } from "luxon";
const SUPABASE_URL = import.meta.env.SUPABASE_URL; const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY; const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
const PAGE_SIZE = 1000;
let cachedMovies = null;
export async function fetchMovies() { export async function fetchMovies() {
if (import.meta.env.MODE === "development" && cachedMovies)
return cachedMovies;
const PAGE_SIZE = 1000;
let movies = []; let movies = [];
let rangeStart = 0; let rangeStart = 0;
while (true) { while (true) {
const { data, error } = await supabase const { data, error } = await supabase
.from('optimized_movies') .from("optimized_movies")
.select('*') .select("*")
.range(rangeStart, rangeStart + PAGE_SIZE - 1); .range(rangeStart, rangeStart + PAGE_SIZE - 1);
if (error) { if (error) break;
console.error('Error fetching movies:', error);
break;
}
movies = movies.concat(data); movies = movies.concat(data);
if (data.length < PAGE_SIZE) break; if (data.length < PAGE_SIZE) break;
@ -27,16 +29,22 @@ export async function fetchMovies() {
} }
const year = DateTime.now().year; const year = DateTime.now().year;
const favoriteMovies = movies.filter(movie => movie.favorite); const favoriteMovies = movies.filter((movie) => movie.favorite);
const recentlyWatchedMovies = movies.filter( const recentlyWatchedMovies = movies.filter(
movie => movie.last_watched && year - DateTime.fromISO(movie.last_watched).year <= 3 (movie) =>
movie.last_watched &&
year - DateTime.fromISO(movie.last_watched).year <= 3
); );
return { const result = {
movies, movies,
watchHistory: movies.filter(movie => movie.last_watched), watchHistory: movies.filter((movie) => movie.last_watched),
recentlyWatched: recentlyWatchedMovies, recentlyWatched: recentlyWatchedMovies,
favorites: favoriteMovies.sort((a, b) => a.title.localeCompare(b.title)), favorites: favoriteMovies.sort((a, b) => a.title.localeCompare(b.title)),
feed: movies.filter(movie => movie.feed), feed: movies.filter((movie) => movie.feed),
}; };
};
if (import.meta.env.MODE === "development") cachedMovies = result;
return result;
};

View file

@ -1,11 +1,17 @@
import { createClient } from '@supabase/supabase-js'; import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = import.meta.env.SUPABASE_URL; const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY; const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
const PAGE_SIZE = 1000;
let cachedMusicData = null;
export async function fetchMusicData() { export async function fetchMusicData() {
if (import.meta.env.MODE === "development" && cachedMusicData)
return cachedMusicData;
const PAGE_SIZE = 1000;
const fetchDataFromView = async (viewName) => { const fetchDataFromView = async (viewName) => {
let rows = []; let rows = [];
let rangeStart = 0; let rangeStart = 0;
@ -13,18 +19,12 @@ export async function fetchMusicData() {
while (true) { while (true) {
const { data, error } = await supabase const { data, error } = await supabase
.from(viewName) .from(viewName)
.select('*') .select("*")
.range(rangeStart, rangeStart + PAGE_SIZE - 1); .range(rangeStart, rangeStart + PAGE_SIZE - 1);
if (error) { if (error || data.length === 0) break;
console.error(`Error fetching data from view ${viewName}:`, error);
break;
}
if (data.length === 0) break;
rows = [...rows, ...data]; rows = [...rows, ...data];
if (data.length < PAGE_SIZE) break; if (data.length < PAGE_SIZE) break;
rangeStart += PAGE_SIZE; rangeStart += PAGE_SIZE;
} }
@ -32,48 +32,51 @@ export async function fetchMusicData() {
return rows; return rows;
}; };
try { const [
const [ recentTracks,
recentTracks, weekTracks,
weekTracks, weekArtists,
weekArtists, weekAlbums,
weekAlbums, weekGenres,
weekGenres, monthTracks,
monthTracks, monthArtists,
monthArtists, monthAlbums,
monthAlbums, monthGenres,
monthGenres, ] = await Promise.all([
] = await Promise.all([ fetchDataFromView("recent_tracks"),
fetchDataFromView('recent_tracks'), fetchDataFromView("week_tracks"),
fetchDataFromView('week_tracks'), fetchDataFromView("week_artists"),
fetchDataFromView('week_artists'), fetchDataFromView("week_albums"),
fetchDataFromView('week_albums'), fetchDataFromView("week_genres"),
fetchDataFromView('week_genres'), fetchDataFromView("month_tracks"),
fetchDataFromView('month_tracks'), fetchDataFromView("month_artists"),
fetchDataFromView('month_artists'), fetchDataFromView("month_albums"),
fetchDataFromView('month_albums'), fetchDataFromView("month_genres"),
fetchDataFromView('month_genres'), ]);
]);
return { const result = {
recent: recentTracks, recent: recentTracks,
week: { week: {
tracks: weekTracks, tracks: weekTracks,
artists: weekArtists, artists: weekArtists,
albums: weekAlbums, albums: weekAlbums,
genres: weekGenres, genres: weekGenres,
totalTracks: weekTracks.reduce((acc, track) => acc + track.plays, 0).toLocaleString('en-US'), totalTracks: weekTracks
}, .reduce((acc, track) => acc + track.plays, 0)
month: { .toLocaleString("en-US"),
tracks: monthTracks, },
artists: monthArtists, month: {
albums: monthAlbums, tracks: monthTracks,
genres: monthGenres, artists: monthArtists,
totalTracks: monthTracks.reduce((acc, track) => acc + track.plays, 0).toLocaleString('en-US'), albums: monthAlbums,
}, genres: monthGenres,
}; totalTracks: monthTracks
} catch (error) { .reduce((acc, track) => acc + track.plays, 0)
console.error('Error fetching and processing music data:', error); .toLocaleString("en-US"),
return {}; },
} };
};
if (import.meta.env.MODE === "development") cachedMusicData = result;
return result;
};

View file

@ -1,39 +1,39 @@
import { createClient } from '@supabase/supabase-js' import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = import.meta.env.SUPABASE_URL const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY) const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
let cachedNavigation = null;
export async function fetchNavigation() { export async function fetchNavigation() {
const { data, error } = await supabase if (import.meta.env.MODE === "development" && cachedNavigation)
.from('optimized_navigation') return cachedNavigation;
.select('*')
if (error) { const { data, error } = await supabase
console.error('Error fetching navigation data:', error) .from("optimized_navigation")
return {} .select("*");
} if (error) return {};
const menu = data.reduce((acc, item) => { const menu = data.reduce((acc, item) => {
const menuItem = { const menuItem = {
title: item['title'] || item['page_title'], title: item["title"] || item["page_title"],
permalink: item['permalink'] || item ['page_permalink'], permalink: item["permalink"] || item["page_permalink"],
icon: item['icon'], icon: item["icon"],
sort: item['sort'] sort: item["sort"],
} };
if (!acc[item['menu_location']]) { if (!acc[item["menu_location"]]) acc[item["menu_location"]] = [menuItem];
acc[item['menu_location']] = [menuItem] else acc[item["menu_location"]].push(menuItem);
} else {
acc[item['menu_location']].push(menuItem)
}
return acc return acc;
}, {}) }, {});
Object.keys(menu).forEach(location => { Object.keys(menu).forEach((location) => {
menu[location].sort((a, b) => a['sort'] - b['sort']) menu[location].sort((a, b) => a["sort"] - b["sort"]);
}) });
return menu if (import.meta.env.MODE === "development") cachedNavigation = menu;
}
return menu;
};

View file

@ -1,24 +1,31 @@
import { createClient } from '@supabase/supabase-js' import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = import.meta.env.SUPABASE_URL const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY) const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
let cachedNowPlaying = null;
export async function fetchNowPlaying() { export async function fetchNowPlaying() {
if (import.meta.env.MODE === "development" && cachedNowPlaying)
return cachedNowPlaying;
const { data, error } = await supabase const { data, error } = await supabase
.from('optimized_latest_listen') .from("optimized_latest_listen")
.select('*') .select("*")
.single() .single();
if (error) return {};
if (error) { const genreEmoji = data.genre_emoji;
console.error('Error fetching the latest track:', error) const emoji = data.artist_emoji || genreEmoji;
return {}
}
const genreEmoji = data.genre_emoji const result = {
const emoji = data.artist_emoji || genreEmoji content: `${emoji || "🎧"} ${
data.track_name
} by <a href="https://coryd.dev${data.url}">${data.artist_name}</a>`,
};
return { if (import.meta.env.MODE === "development") cachedNowPlaying = result;
content: `${emoji || '🎧'} ${data.track_name} by <a href="https://coryd.dev${data.url}">${data.artist_name}</a>`,
} return result;
} };

View file

@ -1,16 +1,18 @@
import { createClient } from '@supabase/supabase-js'; import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = import.meta.env.SUPABASE_URL; const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY; const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
export async function fetchPages() { let cachedPages = null;
const { data, error } = await supabase.from('optimized_pages').select('*');
if (error) { export async function fetchPages() {
console.error('Error fetching pages:', error); if (import.meta.env.MODE === "development" && cachedPages) return cachedPages;
return [];
} const { data, error } = await supabase.from("optimized_pages").select("*");
if (error) return [];
if (import.meta.env.MODE === "development") cachedPages = data;
return data; return data;
} };

View file

@ -1,32 +1,35 @@
import { createClient } from '@supabase/supabase-js' import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = import.meta.env['SUPABASE_URL'] const SUPABASE_URL = import.meta.env["SUPABASE_URL"];
const SUPABASE_KEY = import.meta.env['SUPABASE_KEY'] const SUPABASE_KEY = import.meta.env["SUPABASE_KEY"];
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY) const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
const PAGE_SIZE = 1000
let cachedPosts = null;
export async function fetchAllPosts() { export async function fetchAllPosts() {
let posts = [] if (import.meta.env.MODE === "development" && cachedPosts) return cachedPosts;
let page = 0
let fetchMore = true const PAGE_SIZE = 1000;
let posts = [];
let page = 0;
let fetchMore = true;
while (fetchMore) { while (fetchMore) {
const { data, error } = await supabase const { data, error } = await supabase
.from('optimized_posts') .from("optimized_posts")
.select('*') .select("*")
.order('date', { ascending: false }) .order("date", { ascending: false })
.range(page * PAGE_SIZE, (page + 1) * PAGE_SIZE - 1) .range(page * PAGE_SIZE, (page + 1) * PAGE_SIZE - 1);
if (error) { if (error) return posts;
console.error('Error fetching posts:', error)
return posts
}
if (data.length < PAGE_SIZE) fetchMore = false if (data.length < PAGE_SIZE) fetchMore = false;
posts = posts.concat(data) posts = posts.concat(data);
page++ page++;
} }
return posts if (import.meta.env.MODE === "development") cachedPosts = posts;
}
return posts;
};

View file

@ -1,29 +1,35 @@
import { createClient } from '@supabase/supabase-js'; import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = import.meta.env.SUPABASE_URL; const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY; const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
const PAGE_SIZE = 500;
let cachedRobots = null;
export async function fetchAllRobots() { export async function fetchAllRobots() {
if (import.meta.env.MODE === "development" && cachedRobots)
return cachedRobots;
const PAGE_SIZE = 500;
let robots = []; let robots = [];
let from = 0; let from = 0;
while (true) { while (true) {
const { data, error } = await supabase const { data, error } = await supabase
.from('robots') .from("robots")
.select('user_agent') .select("user_agent")
.range(from, from + PAGE_SIZE - 1); .range(from, from + PAGE_SIZE - 1);
if (error) { if (error) return [];
console.error('Error fetching robot data:', error);
return [];
}
robots = robots.concat(data); robots = robots.concat(data);
if (data.length < PAGE_SIZE) break; if (data.length < PAGE_SIZE) break;
from += PAGE_SIZE; from += PAGE_SIZE;
} }
return robots.map((robot) => robot['user_agent']).sort(); const result = robots.map((robot) => robot["user_agent"]).sort();
};
if (import.meta.env.MODE === "development") cachedRobots = result;
return result;
};

View file

@ -1,19 +0,0 @@
import { createClient } from '@supabase/supabase-js'
const SUPABASE_URL = import.meta.env.SUPABASE_URL
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY)
export async function fetchSearchIndex() {
const { data, error } = await supabase
.from('optimized_search_index')
.select('search_index')
if (error) {
console.error('Error fetching search index data:', error)
return []
}
const [{ search_index } = {}] = data
return search_index || []
}

View file

@ -1,20 +1,24 @@
import { createClient } from '@supabase/supabase-js'; import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = import.meta.env.SUPABASE_URL; const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY; const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
export default async function fetchSyndication() { let cachedSyndication = null;
const { data, error } = await supabase
.from('optimized_syndication')
.select('syndication');
if (error) { export default async function fetchSyndication() {
console.error('Error fetching syndication data:', error); if (import.meta.env.MODE === "development" && cachedSyndication)
return []; return cachedSyndication;
}
const { data, error } = await supabase
.from("optimized_syndication")
.select("syndication");
if (error) return [];
const [{ syndication } = {}] = data; const [{ syndication } = {}] = data;
const result = syndication?.filter((item) => item.syndication !== null) || [];
return syndication?.filter((item) => item.syndication !== null) || []; if (import.meta.env.MODE === "development") cachedSyndication = result;
}
return result;
};

View file

@ -1,46 +1,53 @@
import { createClient } from '@supabase/supabase-js'; import { createClient } from "@supabase/supabase-js";
const SUPABASE_URL = import.meta.env.SUPABASE_URL; const SUPABASE_URL = import.meta.env.SUPABASE_URL;
const SUPABASE_KEY = import.meta.env.SUPABASE_KEY; const SUPABASE_KEY = import.meta.env.SUPABASE_KEY;
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
const PAGE_SIZE = 1000;
let cachedShows = null;
export const fetchShows = async () => { export const fetchShows = async () => {
if (import.meta.env.MODE === "development" && cachedShows) return cachedShows;
const PAGE_SIZE = 1000;
let shows = []; let shows = [];
let rangeStart = 0; let rangeStart = 0;
while (true) { while (true) {
const { data, error } = await supabase const { data, error } = await supabase
.from('optimized_shows') .from("optimized_shows")
.select('*') .select("*")
.range(rangeStart, rangeStart + PAGE_SIZE - 1); .range(rangeStart, rangeStart + PAGE_SIZE - 1);
if (error) { if (error) break;
console.error('Error fetching shows:', error);
break;
}
shows = shows.concat(data); shows = shows.concat(data);
if (data.length < PAGE_SIZE) break; if (data.length < PAGE_SIZE) break;
rangeStart += PAGE_SIZE; rangeStart += PAGE_SIZE;
} }
const watchedShows = shows.filter(show => show['last_watched_at'] !== null); const watchedShows = shows.filter((show) => show["last_watched_at"] !== null);
const episodes = watchedShows.map(show => ({ const episodes = watchedShows.map((show) => ({
title: show['episode']['title'], title: show["episode"]["title"],
year: show['year'], year: show["year"],
formatted_episode: show['episode']['formatted_episode'], formatted_episode: show["episode"]["formatted_episode"],
url: show['episode']['url'], url: show["episode"]["url"],
image: show['episode']['image'], image: show["episode"]["image"],
backdrop: show['episode']['backdrop'], backdrop: show["episode"]["backdrop"],
last_watched_at: show['episode']['last_watched_at'], last_watched_at: show["episode"]["last_watched_at"],
grid: show['grid'], grid: show["grid"],
type: 'tv' type: "tv",
})); }));
return { const result = {
shows, shows,
recentlyWatched: episodes.slice(0, 225), recentlyWatched: episodes.slice(0, 225),
favorites: shows.filter(show => show.favorite).sort((a, b) => a.title.localeCompare(b.title)), favorites: shows
.filter((show) => show.favorite)
.sort((a, b) => a.title.localeCompare(b.title)),
}; };
};
if (import.meta.env.MODE === "development") cachedShows = result;
return result;
};