busi488energy/src/actions/datacenters.ts

91 lines
2.3 KiB
TypeScript

'use server';
import {
findDatacentersInRegion,
findNearbyDatacenters,
getAllDatacentersWithLocation,
} from '@/generated/prisma/sql.js';
import { prisma } from '@/lib/db.js';
import { serialize } from '@/lib/superjson.js';
interface ActionSuccess<T> {
ok: true;
data: ReturnType<typeof serialize<T>>;
}
interface ActionError {
ok: false;
error: string;
}
type ActionResult<T> = ActionSuccess<T> | ActionError;
export async function fetchDatacenters(): Promise<
ActionResult<
Array<{
id: string;
name: string;
operator: string;
capacityMw: number;
status: string;
yearOpened: number;
regionId: string;
createdAt: Date;
}>
>
> {
try {
const rows = await prisma.datacenter.findMany({
orderBy: { capacityMw: 'desc' },
});
return { ok: true, data: serialize(rows) };
} catch (err) {
return {
ok: false,
error: `Failed to fetch datacenters: ${err instanceof Error ? err.message : String(err)}`,
};
}
}
export async function fetchDatacentersInRegion(
regionCode: string,
): Promise<ActionResult<findDatacentersInRegion.Result[]>> {
try {
const rows = await prisma.$queryRawTyped(findDatacentersInRegion(regionCode));
return { ok: true, data: serialize(rows) };
} catch (err) {
return {
ok: false,
error: `Failed to fetch datacenters in region ${regionCode}: ${err instanceof Error ? err.message : String(err)}`,
};
}
}
export async function fetchAllDatacentersWithLocation(): Promise<ActionResult<getAllDatacentersWithLocation.Result[]>> {
try {
const rows = await prisma.$queryRawTyped(getAllDatacentersWithLocation());
return { ok: true, data: serialize(rows) };
} catch (err) {
return {
ok: false,
error: `Failed to fetch datacenters with locations: ${err instanceof Error ? err.message : String(err)}`,
};
}
}
export async function fetchNearbyDatacenters(
lat: number,
lng: number,
radiusKm: number,
): Promise<ActionResult<findNearbyDatacenters.Result[]>> {
try {
const rows = await prisma.$queryRawTyped(findNearbyDatacenters(lat, lng, radiusKm));
return { ok: true, data: serialize(rows) };
} catch (err) {
return {
ok: false,
error: `Failed to fetch nearby datacenters: ${err instanceof Error ? err.message : String(err)}`,
};
}
}