fp/services/next/app/lib/vtubers.ts

95 lines
2.5 KiB
TypeScript

import { IVod } from './vods'
import { postgrestLocalUrl, siteUrl } from './constants';
import qs from 'qs';
import { IMeta, IVtuber } from '@futureporn/types';
const fetchVtubersOptions = {
next: {
tags: ['vtubers']
}
}
export function getUrl(slug: string): string {
return `${siteUrl}/vt/${slug}`
}
export async function getVtuberBySlug(slug: string): Promise<IVtuber|null> {
const res = await fetch(`${postgrestLocalUrl}/vtubers?slug=eq.${slug}`);
if (!res.ok) {
console.error(`error inside getVtuberBySlug-- ${res.statusText}`);
return null;
}
const vtubers = await res.json();
return vtubers[0];
}
export async function getVtuberById(id: number): Promise<IVtuber|null> {
const res = await fetch(`${postgrestLocalUrl}/vtubers?id=eq.${id}`);
if (!res.ok) {
console.error(`error inside getVtuberById-- ${res.statusText}`);
return null;
}
const vtuber = await res.json();
return vtuber
}
export async function getVtubers(): Promise<IVtuber[]|null> {
const res = await fetch(`${postgrestLocalUrl}/vtubers`);
if (!res.ok) {
console.error(`error inside getVtubers-- ${res.statusText}`);
return null;
}
const vtubers = await res.json();
return vtubers;
}
export async function getAllVtubers(): Promise<IVtuber[] | null> {
const pageSize = 100;
const allVtubers: IVtuber[] = [];
let currentPage = 1;
while (true) {
const query = new URLSearchParams({
offset: ''+currentPage,
limit: ''+pageSize
}).toString()
try {
console.log(`Getting ${postgrestLocalUrl}/vtubers page=${currentPage}`);
const response = await fetch(`${postgrestLocalUrl}/vtubers?${query}`, fetchVtubersOptions);
if (!response.ok) {
// Handle non-successful response (e.g., HTTP error)
throw new Error(`HTTP error! Status: ${response.status}`);
}
const responseData = await response.json();
if (!responseData.data || responseData.data.length === 0) {
// No more data to fetch
break;
}
allVtubers.push(...responseData.data);
currentPage++;
} catch (error) {
// Handle fetch error
if (error instanceof Error) {
console.error('Error fetching data:', error.message);
}
return null;
}
}
return allVtubers;
}