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

98 lines
2.5 KiB
TypeScript

import { IVod } from './vods'
import { strapiUrl, siteUrl, postgrestLocalUrl } 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 = qs.stringify({
pagination: {
pageSize,
page: currentPage,
},
});
try {
console.log(`Getting ${strapiUrl}/api/vtubers page=${currentPage}`);
const response = await fetch(`${strapiUrl}/api/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;
}