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

110 lines
2.5 KiB
TypeScript

/**
* Queries de bids usando Prisma
* Migrado de lib/db/queries/bids.ts
*/
import { prisma } from "../app";
export interface Bid {
bid_id: number;
listing_id: number;
bidder_id: number;
bid_amount: number;
bid_type: "pix" | "tibia_coins" | "gold_coins" | null;
created_at: Date;
is_active: boolean;
}
export interface CreateBidData {
listing_id: number;
bidder_id: number;
bid_amount: number;
bid_type?: "pix" | "tibia_coins" | "gold_coins";
}
/**
* Cria um novo lance
*/
export async function createBid(data: CreateBidData): Promise<Bid> {
const bid = await prisma.bid.create({
data: {
listing_id: data.listing_id,
bidder_id: data.bidder_id,
bid_amount: data.bid_amount,
bid_type: data.bid_type || null,
},
});
return {
...bid,
bid_amount: Number(bid.bid_amount),
bid_type: bid.bid_type as "pix" | "tibia_coins" | "gold_coins" | null,
};
}
/**
* Busca lances de um anúncio
*/
export async function getBidsByListing(
listingId: number,
activeOnly: boolean = true,
): Promise<Bid[]> {
const bids = await prisma.bid.findMany({
where: {
listing_id: listingId,
...(activeOnly ? { is_active: true } : {}),
},
orderBy: [{ bid_amount: "desc" }, { created_at: "desc" }],
});
return bids.map((bid) => ({
...bid,
bid_amount: Number(bid.bid_amount),
bid_type: bid.bid_type as "pix" | "tibia_coins" | "gold_coins" | null,
}));
}
/**
* Busca o maior lance de um anúncio
*/
export async function getHighestBid(listingId: number): Promise<Bid | null> {
const bid = await prisma.bid.findFirst({
where: {
listing_id: listingId,
is_active: true,
},
orderBy: [{ bid_amount: "desc" }, { created_at: "desc" }],
});
if (!bid) return null;
return {
...bid,
bid_amount: Number(bid.bid_amount),
bid_type: bid.bid_type as "pix" | "tibia_coins" | "gold_coins" | null,
};
}
/**
* Cancela um lance (desativa)
*/
export async function cancelBid(bidId: number): Promise<boolean> {
const result = await prisma.bid.updateMany({
where: { bid_id: bidId },
data: { is_active: false },
});
return result.count > 0;
}
/**
* Busca lance por ID
*/
export async function getBidById(bidId: number): Promise<Bid | null> {
const bid = await prisma.bid.findUnique({
where: { bid_id: bidId },
});
if (!bid) return null;
return {
...bid,
bid_amount: Number(bid.bid_amount),
bid_type: bid.bid_type as "pix" | "tibia_coins" | "gold_coins" | null,
};
}