Files
2025-11-11 03:08:36 -03:00

239 lines
6.1 KiB
TypeScript

/**
* Queries de servidores usando Prisma
* Migrado de lib/db/queries/servers.ts
*/
import { prisma } from "../app";
export interface Server {
server_id: number;
server_name: string;
server_type: "pvp" | "no-pvp" | "retro-pvp" | "hardcore-pvp" | null;
location: "NA" | "SA" | "EU" | "OC" | "BR" | null;
is_active: boolean;
total_listings: number;
total_users: number;
total_subscribers: number;
total_transactions: number;
total_volume: number;
average_listing_price: number;
last_activity_at: Date | null;
created_at: Date;
updated_at: Date;
}
export interface ServerStats {
total_listings?: number;
total_users?: number;
total_subscribers?: number;
total_transactions?: number;
total_volume?: number;
average_listing_price?: number;
last_activity_at?: Date;
}
/**
* Lista todos os servidores
*/
export async function getAllServers(): Promise<Server[]> {
const servers = await prisma.server.findMany({
orderBy: { server_name: "asc" },
});
return servers.map((server) => ({
...server,
server_type: server.server_type as
| "pvp"
| "no-pvp"
| "retro-pvp"
| "hardcore-pvp"
| null,
location: server.location as "NA" | "SA" | "EU" | "OC" | "BR" | null,
total_volume: server.total_volume ? Number(server.total_volume) : 0,
average_listing_price: server.average_listing_price
? Number(server.average_listing_price)
: 0,
}));
}
/**
* Lista apenas servidores ativos
*/
export async function getActiveServers(): Promise<Server[]> {
const servers = await prisma.server.findMany({
where: { is_active: true },
orderBy: { server_name: "asc" },
});
return servers.map((server) => ({
...server,
server_type: server.server_type as
| "pvp"
| "no-pvp"
| "retro-pvp"
| "hardcore-pvp"
| null,
location: server.location as "NA" | "SA" | "EU" | "OC" | "BR" | null,
total_volume: server.total_volume ? Number(server.total_volume) : 0,
average_listing_price: server.average_listing_price
? Number(server.average_listing_price)
: 0,
}));
}
/**
* Busca servidor por nome
*/
export async function getServerByName(
serverName: string,
): Promise<Server | null> {
const server = await prisma.server.findUnique({
where: { server_name: serverName },
});
if (!server) return null;
return {
...server,
server_type: server.server_type as
| "pvp"
| "no-pvp"
| "retro-pvp"
| "hardcore-pvp"
| null,
location: server.location as "NA" | "SA" | "EU" | "OC" | "BR" | null,
total_volume: server.total_volume ? Number(server.total_volume) : 0,
average_listing_price: server.average_listing_price
? Number(server.average_listing_price)
: 0,
};
}
/**
* Busca servidor por ID
*/
export async function getServerById(serverId: number): Promise<Server | null> {
const server = await prisma.server.findUnique({
where: { server_id: serverId },
});
if (!server) return null;
return {
...server,
server_type: server.server_type as
| "pvp"
| "no-pvp"
| "retro-pvp"
| "hardcore-pvp"
| null,
location: server.location as "NA" | "SA" | "EU" | "OC" | "BR" | null,
total_volume: server.total_volume ? Number(server.total_volume) : 0,
average_listing_price: server.average_listing_price
? Number(server.average_listing_price)
: 0,
};
}
/**
* Verifica se servidor existe e está ativo
*/
export async function isServerActive(serverName: string): Promise<boolean> {
const count = await prisma.server.count({
where: {
server_name: serverName,
is_active: true,
},
});
return count > 0;
}
/**
* Incrementa estatísticas do servidor
*/
export async function incrementServerStats(
serverName: string,
stats: Partial<{
total_listings: number;
total_users: number;
total_subscribers: number;
total_transactions: number;
total_volume: number;
}>,
): Promise<void> {
const updateData: any = {
last_activity_at: new Date(),
};
if (stats.total_listings !== undefined) {
updateData.total_listings = { increment: stats.total_listings };
}
if (stats.total_users !== undefined) {
updateData.total_users = { increment: stats.total_users };
}
if (stats.total_subscribers !== undefined) {
updateData.total_subscribers = { increment: stats.total_subscribers };
}
if (stats.total_transactions !== undefined) {
updateData.total_transactions = { increment: stats.total_transactions };
}
if (stats.total_volume !== undefined) {
updateData.total_volume = { increment: stats.total_volume };
}
await prisma.server.update({
where: { server_name: serverName },
data: updateData,
});
}
/**
* Atualiza estatísticas completas do servidor
*/
export async function updateServerStats(
serverName: string,
stats: ServerStats,
): Promise<void> {
const updateData: any = {};
if (stats.total_listings !== undefined)
updateData.total_listings = stats.total_listings;
if (stats.total_users !== undefined)
updateData.total_users = stats.total_users;
if (stats.total_subscribers !== undefined)
updateData.total_subscribers = stats.total_subscribers;
if (stats.total_transactions !== undefined)
updateData.total_transactions = stats.total_transactions;
if (stats.total_volume !== undefined)
updateData.total_volume = stats.total_volume;
if (stats.average_listing_price !== undefined)
updateData.average_listing_price = stats.average_listing_price;
if (stats.last_activity_at !== undefined)
updateData.last_activity_at = stats.last_activity_at;
if (Object.keys(updateData).length === 0) {
return;
}
await prisma.server.update({
where: { server_name: serverName },
data: updateData,
});
}
/**
* Incrementa total_users de múltiplos servidores
*/
export async function incrementUsersForServers(
serverNames: string[],
): Promise<void> {
if (serverNames.length === 0) {
return;
}
await prisma.server.updateMany({
where: {
server_name: { in: serverNames },
},
data: {
total_users: { increment: 1 },
last_activity_at: new Date(),
},
});
}