style: clean up code formatting and remove trailing whitespace

refactor: reorganize imports and fix type imports
This commit is contained in:
Evandro Fonseca Junior committed 2025-11-11 03:08:36 -03:00
1 parent d3704602fd
commit 47c04de6fe
232 files changed
+7140 -4798

No files matched your search

+188 -68
View File
@@ -3,15 +3,20 @@
* Migrado de lib/db/queries/listings.ts
*/
import type { Prisma } from "@prisma/client";
import { prisma } from "../app";
import { Prisma } from "@prisma/client";
import {
getHighestCustomOfferForListing,
getHighestCustomOffersForListings,
} from "./purchase-intentions";
// Re-exportar tipos para compatibilidade
export type ListingStatus = "active" | "sold" | "cancelled" | "in_escrow" | "expired";
export type ListingStatus =
| "active"
| "sold"
| "cancelled"
| "in_escrow"
| "expired";
export interface Listing {
listing_id: number;
@@ -88,16 +93,19 @@ export interface ListingFilters {
search?: string;
page?: number;
pageSize?: number;
sortBy?: "created_at" | "price_pix" | "price_tibia_coins" | "price_gold_coins" | "views_count";
sortBy?:
| "created_at"
| "price_pix"
| "price_tibia_coins"
| "price_gold_coins"
| "views_count";
sortOrder?: "ASC" | "DESC";
}
/**
* Cria um novo anúncio
*/
export async function createListing(
data: CreateListingData
): Promise<Listing> {
export async function createListing(data: CreateListingData): Promise<Listing> {
// Calcular incremento mínimo se for leilão e não foi fornecido
let minBidIncrement = data.min_bid_increment;
if (data.is_auction && !minBidIncrement) {
@@ -114,7 +122,9 @@ export async function createListing(
server_name: data.server_name,
price_pix: data.price_pix || null,
price_tibia_coins: data.price_tibia_coins || null,
price_gold_coins: data.price_gold_coins ? BigInt(data.price_gold_coins) : null,
price_gold_coins: data.price_gold_coins
? BigInt(data.price_gold_coins)
: null,
is_auction: data.is_auction || false,
auction_ends_at: data.auction_ends_at || null,
description: data.description || null,
@@ -122,9 +132,14 @@ export async function createListing(
trade_item_name: data.trade_item_name || null,
trade_item_quantity: data.trade_item_quantity || null,
min_bid_increment: minBidIncrement || null,
initial_price_pix: data.is_auction ? (data.price_pix || null) : null,
initial_price_tibia_coins: data.is_auction ? (data.price_tibia_coins || null) : null,
initial_price_gold_coins: data.is_auction && data.price_gold_coins ? BigInt(data.price_gold_coins) : null,
initial_price_pix: data.is_auction ? data.price_pix || null : null,
initial_price_tibia_coins: data.is_auction
? data.price_tibia_coins || null
: null,
initial_price_gold_coins:
data.is_auction && data.price_gold_coins
? BigInt(data.price_gold_coins)
: null,
},
});
@@ -141,11 +156,21 @@ export async function createListing(
return {
...listing,
price_pix: listing.price_pix ? Number(listing.price_pix) : null,
current_bid_amount: listing.current_bid_amount ? Number(listing.current_bid_amount) : null,
min_bid_increment: listing.min_bid_increment ? Number(listing.min_bid_increment) : null,
initial_price_pix: listing.initial_price_pix ? Number(listing.initial_price_pix) : null,
price_gold_coins: listing.price_gold_coins ? Number(listing.price_gold_coins) : null,
initial_price_gold_coins: listing.initial_price_gold_coins ? Number(listing.initial_price_gold_coins) : null,
current_bid_amount: listing.current_bid_amount
? Number(listing.current_bid_amount)
: null,
min_bid_increment: listing.min_bid_increment
? Number(listing.min_bid_increment)
: null,
initial_price_pix: listing.initial_price_pix
? Number(listing.initial_price_pix)
: null,
price_gold_coins: listing.price_gold_coins
? Number(listing.price_gold_coins)
: null,
initial_price_gold_coins: listing.initial_price_gold_coins
? Number(listing.initial_price_gold_coins)
: null,
seller_character_name: character?.character_name || null,
highest_custom_offer_amount: null,
highest_custom_offer_currency: null,
@@ -155,7 +180,9 @@ export async function createListing(
/**
* Busca anúncio por ID
*/
export async function getListingById(listingId: number): Promise<Listing | null> {
export async function getListingById(
listingId: number,
): Promise<Listing | null> {
const listing = await prisma.listing.findUnique({
where: { listing_id: listingId },
});
@@ -179,11 +206,21 @@ export async function getListingById(listingId: number): Promise<Listing | null>
return {
...listing,
price_pix: listing.price_pix ? Number(listing.price_pix) : null,
current_bid_amount: listing.current_bid_amount ? Number(listing.current_bid_amount) : null,
min_bid_increment: listing.min_bid_increment ? Number(listing.min_bid_increment) : null,
initial_price_pix: listing.initial_price_pix ? Number(listing.initial_price_pix) : null,
price_gold_coins: listing.price_gold_coins ? Number(listing.price_gold_coins) : null,
initial_price_gold_coins: listing.initial_price_gold_coins ? Number(listing.initial_price_gold_coins) : null,
current_bid_amount: listing.current_bid_amount
? Number(listing.current_bid_amount)
: null,
min_bid_increment: listing.min_bid_increment
? Number(listing.min_bid_increment)
: null,
initial_price_pix: listing.initial_price_pix
? Number(listing.initial_price_pix)
: null,
price_gold_coins: listing.price_gold_coins
? Number(listing.price_gold_coins)
: null,
initial_price_gold_coins: listing.initial_price_gold_coins
? Number(listing.initial_price_gold_coins)
: null,
seller_character_name: character?.character_name || null,
highest_custom_offer_amount: highestOffer?.amount ?? null,
highest_custom_offer_currency: highestOffer?.currency ?? null,
@@ -194,7 +231,7 @@ export async function getListingById(listingId: number): Promise<Listing | null>
* Lista anúncios com filtros e paginação
*/
export async function getListings(
filters: ListingFilters = {}
filters: ListingFilters = {},
): Promise<{ listings: Listing[]; total: number }> {
const {
status,
@@ -239,7 +276,13 @@ export async function getListings(
}
// Validar sortBy
const validSortColumns = ["created_at", "price_pix", "price_tibia_coins", "price_gold_coins", "views_count"];
const validSortColumns = [
"created_at",
"price_pix",
"price_tibia_coins",
"price_gold_coins",
"views_count",
];
const sortColumn = validSortColumns.includes(sortBy) ? sortBy : "created_at";
const orderBy: Prisma.ListingOrderByWithRelationInput = {
[sortColumn]: sortOrder.toLowerCase() as "asc" | "desc",
@@ -258,7 +301,7 @@ export async function getListings(
// Buscar character names para cada listing (otimizado com uma query por seller_id + server_name)
const sellerServerPairs = new Set(
listings.map((l) => `${l.seller_id}:${l.server_name}`)
listings.map((l) => `${l.seller_id}:${l.server_name}`),
);
const charactersMap = new Map<string, string>();
@@ -277,7 +320,7 @@ export async function getListings(
}
const highestOffers = await getHighestCustomOffersForListings(
listings.map((listing) => listing.listing_id)
listings.map((listing) => listing.listing_id),
);
// Converter todos os campos Decimal e BigInt para números JavaScript
@@ -287,11 +330,21 @@ export async function getListings(
return {
...listing,
price_pix: listing.price_pix ? Number(listing.price_pix) : null,
current_bid_amount: listing.current_bid_amount ? Number(listing.current_bid_amount) : null,
min_bid_increment: listing.min_bid_increment ? Number(listing.min_bid_increment) : null,
initial_price_pix: listing.initial_price_pix ? Number(listing.initial_price_pix) : null,
price_gold_coins: listing.price_gold_coins ? Number(listing.price_gold_coins) : null,
initial_price_gold_coins: listing.initial_price_gold_coins ? Number(listing.initial_price_gold_coins) : null,
current_bid_amount: listing.current_bid_amount
? Number(listing.current_bid_amount)
: null,
min_bid_increment: listing.min_bid_increment
? Number(listing.min_bid_increment)
: null,
initial_price_pix: listing.initial_price_pix
? Number(listing.initial_price_pix)
: null,
price_gold_coins: listing.price_gold_coins
? Number(listing.price_gold_coins)
: null,
initial_price_gold_coins: listing.initial_price_gold_coins
? Number(listing.initial_price_gold_coins)
: null,
seller_character_name: charactersMap.get(key) || null,
highest_custom_offer_amount: highestOffer?.amount ?? null,
highest_custom_offer_currency: highestOffer?.currency ?? null,
@@ -309,17 +362,21 @@ export async function getListings(
*/
export async function updateListing(
listingId: number,
data: UpdateListingData
data: UpdateListingData,
): Promise<Listing | null> {
const updateData: Prisma.ListingUpdateInput = {};
if (data.quantity !== undefined) updateData.quantity = data.quantity;
if (data.price_pix !== undefined) updateData.price_pix = data.price_pix;
if (data.price_tibia_coins !== undefined) updateData.price_tibia_coins = data.price_tibia_coins;
if (data.price_gold_coins !== undefined) updateData.price_gold_coins = BigInt(data.price_gold_coins);
if (data.price_tibia_coins !== undefined)
updateData.price_tibia_coins = data.price_tibia_coins;
if (data.price_gold_coins !== undefined)
updateData.price_gold_coins = BigInt(data.price_gold_coins);
if (data.description !== undefined) updateData.description = data.description;
if (data.listing_status !== undefined) updateData.listing_status = data.listing_status;
if (data.current_bid_amount !== undefined) updateData.current_bid_amount = data.current_bid_amount;
if (data.listing_status !== undefined)
updateData.listing_status = data.listing_status;
if (data.current_bid_amount !== undefined)
updateData.current_bid_amount = data.current_bid_amount;
if (data.current_bidder_id !== undefined) {
updateData.current_bidder_id = data.current_bidder_id;
}
@@ -338,17 +395,29 @@ export async function updateListing(
},
});
const highestOffer = await getHighestCustomOfferForListing(listing.listing_id);
const highestOffer = await getHighestCustomOfferForListing(
listing.listing_id,
);
// Converter todos os campos Decimal e BigInt para números JavaScript
return {
...listing,
price_pix: listing.price_pix ? Number(listing.price_pix) : null,
current_bid_amount: listing.current_bid_amount ? Number(listing.current_bid_amount) : null,
min_bid_increment: listing.min_bid_increment ? Number(listing.min_bid_increment) : null,
initial_price_pix: listing.initial_price_pix ? Number(listing.initial_price_pix) : null,
price_gold_coins: listing.price_gold_coins ? Number(listing.price_gold_coins) : null,
initial_price_gold_coins: listing.initial_price_gold_coins ? Number(listing.initial_price_gold_coins) : null,
current_bid_amount: listing.current_bid_amount
? Number(listing.current_bid_amount)
: null,
min_bid_increment: listing.min_bid_increment
? Number(listing.min_bid_increment)
: null,
initial_price_pix: listing.initial_price_pix
? Number(listing.initial_price_pix)
: null,
price_gold_coins: listing.price_gold_coins
? Number(listing.price_gold_coins)
: null,
initial_price_gold_coins: listing.initial_price_gold_coins
? Number(listing.initial_price_gold_coins)
: null,
seller_character_name: character?.character_name || null,
highest_custom_offer_amount: highestOffer?.amount ?? null,
highest_custom_offer_currency: highestOffer?.currency ?? null,
@@ -364,7 +433,7 @@ export async function deleteListing(listingId: number): Promise<boolean> {
where: { listing_id: listingId },
});
return true;
} catch (error) {
} catch (_error) {
return false;
}
}
@@ -388,7 +457,7 @@ export async function incrementViews(listingId: number): Promise<void> {
*/
export async function getListingsBySeller(
sellerId: number,
filters: { status?: ListingStatus; page?: number; pageSize?: number } = {}
filters: { status?: ListingStatus; page?: number; pageSize?: number } = {},
): Promise<{ listings: Listing[]; total: number }> {
return getListings({
seller_id: sellerId,
@@ -402,7 +471,7 @@ export async function getListingsBySeller(
* Lista apenas anúncios ativos (incluindo vendidos nas últimas 1 hora)
*/
export async function getActiveListings(
filters: Omit<ListingFilters, "status"> = {}
filters: Omit<ListingFilters, "status"> = {},
): Promise<{ listings: Listing[]; total: number }> {
const {
server_name,
@@ -449,8 +518,18 @@ export async function getActiveListings(
if (search) {
const searchCondition = {
OR: [
{ item_name: { contains: search, mode: "insensitive" as Prisma.QueryMode } },
{ description: { contains: search, mode: "insensitive" as Prisma.QueryMode } },
{
item_name: {
contains: search,
mode: "insensitive" as Prisma.QueryMode,
},
},
{
description: {
contains: search,
mode: "insensitive" as Prisma.QueryMode,
},
},
],
};
// Combinar com a condição OR existente
@@ -472,7 +551,13 @@ export async function getActiveListings(
}
// Validar sortBy
const validSortColumns = ["created_at", "price_pix", "price_tibia_coins", "price_gold_coins", "views_count"];
const validSortColumns = [
"created_at",
"price_pix",
"price_tibia_coins",
"price_gold_coins",
"views_count",
];
const sortColumn = validSortColumns.includes(sortBy) ? sortBy : "created_at";
const orderBy: Prisma.ListingOrderByWithRelationInput = {
[sortColumn]: sortOrder.toLowerCase() as "asc" | "desc",
@@ -491,7 +576,7 @@ export async function getActiveListings(
// Buscar character names para cada listing
const sellerServerPairs = new Set(
listings.map((l) => `${l.seller_id}:${l.server_name}`)
listings.map((l) => `${l.seller_id}:${l.server_name}`),
);
const charactersMap = new Map<string, string>();
@@ -510,7 +595,7 @@ export async function getActiveListings(
}
const highestOffers = await getHighestCustomOffersForListings(
listings.map((listing) => listing.listing_id)
listings.map((listing) => listing.listing_id),
);
// Converter todos os campos Decimal e BigInt para números JavaScript
@@ -520,11 +605,21 @@ export async function getActiveListings(
return {
...listing,
price_pix: listing.price_pix ? Number(listing.price_pix) : null,
current_bid_amount: listing.current_bid_amount ? Number(listing.current_bid_amount) : null,
min_bid_increment: listing.min_bid_increment ? Number(listing.min_bid_increment) : null,
initial_price_pix: listing.initial_price_pix ? Number(listing.initial_price_pix) : null,
price_gold_coins: listing.price_gold_coins ? Number(listing.price_gold_coins) : null,
initial_price_gold_coins: listing.initial_price_gold_coins ? Number(listing.initial_price_gold_coins) : null,
current_bid_amount: listing.current_bid_amount
? Number(listing.current_bid_amount)
: null,
min_bid_increment: listing.min_bid_increment
? Number(listing.min_bid_increment)
: null,
initial_price_pix: listing.initial_price_pix
? Number(listing.initial_price_pix)
: null,
price_gold_coins: listing.price_gold_coins
? Number(listing.price_gold_coins)
: null,
initial_price_gold_coins: listing.initial_price_gold_coins
? Number(listing.initial_price_gold_coins)
: null,
seller_character_name: charactersMap.get(key) || null,
highest_custom_offer_amount: highestOffer?.amount ?? null,
highest_custom_offer_currency: highestOffer?.currency ?? null,
@@ -544,8 +639,13 @@ export async function placeBid(
listingId: number,
bidderId: number,
amount: number,
paymentMethod: "pix" | "tc" | "gp"
): Promise<{ success: boolean; listing?: Listing; error?: string; previousBidderId?: number }> {
_paymentMethod: "pix" | "tc" | "gp",
): Promise<{
success: boolean;
listing?: Listing;
error?: string;
previousBidderId?: number;
}> {
// Usar transação para garantir atomicidade
return await prisma.$transaction(async (tx) => {
// Buscar listing atual
@@ -566,16 +666,26 @@ export async function placeBid(
}
if (listing.seller_id === bidderId) {
return { success: false, error: "Você não pode dar lance no seu próprio anúncio" };
return {
success: false,
error: "Você não pode dar lance no seu próprio anúncio",
};
}
// Validar valor mínimo
const minIncrement = listing.min_bid_increment ? Number(listing.min_bid_increment) : 10;
const currentBid = listing.current_bid_amount ? Number(listing.current_bid_amount) : 0;
const minIncrement = listing.min_bid_increment
? Number(listing.min_bid_increment)
: 10;
const currentBid = listing.current_bid_amount
? Number(listing.current_bid_amount)
: 0;
const minBid = currentBid + minIncrement;
if (amount < minBid) {
return { success: false, error: `O lance deve ser de pelo menos ${minBid.toFixed(2)}` };
return {
success: false,
error: `O lance deve ser de pelo menos ${minBid.toFixed(2)}`,
};
}
const previousBidderId = listing.current_bidder_id;
@@ -603,12 +713,24 @@ export async function placeBid(
success: true,
listing: {
...updatedListing,
price_pix: updatedListing.price_pix ? Number(updatedListing.price_pix) : null,
current_bid_amount: updatedListing.current_bid_amount ? Number(updatedListing.current_bid_amount) : null,
min_bid_increment: updatedListing.min_bid_increment ? Number(updatedListing.min_bid_increment) : null,
initial_price_pix: updatedListing.initial_price_pix ? Number(updatedListing.initial_price_pix) : null,
price_gold_coins: updatedListing.price_gold_coins ? Number(updatedListing.price_gold_coins) : null,
initial_price_gold_coins: updatedListing.initial_price_gold_coins ? Number(updatedListing.initial_price_gold_coins) : null,
price_pix: updatedListing.price_pix
? Number(updatedListing.price_pix)
: null,
current_bid_amount: updatedListing.current_bid_amount
? Number(updatedListing.current_bid_amount)
: null,
min_bid_increment: updatedListing.min_bid_increment
? Number(updatedListing.min_bid_increment)
: null,
initial_price_pix: updatedListing.initial_price_pix
? Number(updatedListing.initial_price_pix)
: null,
price_gold_coins: updatedListing.price_gold_coins
? Number(updatedListing.price_gold_coins)
: null,
initial_price_gold_coins: updatedListing.initial_price_gold_coins
? Number(updatedListing.initial_price_gold_coins)
: null,
seller_character_name: character?.character_name || null,
highest_custom_offer_amount: null,
highest_custom_offer_currency: null,
@@ -617,5 +739,3 @@ export async function placeBid(
};
});
}