91 lines
2.3 KiB
TypeScript
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)}`,
|
|
};
|
|
}
|
|
}
|