From 020f2122813711e60639b8b4921669b1f36cff43 Mon Sep 17 00:00:00 2001 From: kimjaehyeon0101 <47347352-kimjaehyeon0101@users.noreply.replit.com> Date: Mon, 29 Sep 2025 18:59:03 +0000 Subject: [PATCH] Enhance the media auction system with improved bid validation and data handling Update the MediaOutletAuction component to correctly parse currency values for bid placement and display, and modify the DatabaseStorage to include a new method for fetching active auctions by media outlet ID. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 069d4324-6c40-4355-955e-c714a50de1ea Replit-Commit-Checkpoint-Type: intermediate_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/3df548ff-50ae-432f-9be4-25d34eccc983/069d4324-6c40-4355-955e-c714a50de1ea/jvFIdY3 --- client/src/pages/MediaOutletAuction.tsx | 19 ++++++++----------- server/storage.ts | 8 ++++++++ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/client/src/pages/MediaOutletAuction.tsx b/client/src/pages/MediaOutletAuction.tsx index f1e0c72..f9249b4 100644 --- a/client/src/pages/MediaOutletAuction.tsx +++ b/client/src/pages/MediaOutletAuction.tsx @@ -32,10 +32,7 @@ export default function MediaOutletAuction() { const placeBidMutation = useMutation({ mutationFn: async (bidData: { amount: number; qualityScore?: number }) => { - return apiRequest(`/api/media-outlets/${params?.slug}/auction/bids`, { - method: "POST", - body: JSON.stringify(bidData), - }); + return apiRequest("POST", `/api/media-outlets/${params?.slug}/auction/bids`, bidData); }, onSuccess: () => { toast({ @@ -75,7 +72,7 @@ export default function MediaOutletAuction() { return; } - if (auction && amount <= auction.currentBid) { + if (auction && auction.currentBid && amount <= parseFloat(auction.currentBid)) { toast({ title: "입찰 금액 부족", description: `현재 최고 입찰가(${auction.currentBid}원)보다 높은 금액을 입력해주세요.`, @@ -102,7 +99,7 @@ export default function MediaOutletAuction() { }).format(amount); }; - const formatTimeRemaining = (endDate: string) => { + const formatTimeRemaining = (endDate: Date | string) => { const end = new Date(endDate); const now = new Date(); const diff = end.getTime() - now.getTime(); @@ -264,7 +261,7 @@ export default function MediaOutletAuction() { 현재 최고가 - {formatCurrency(auction.currentBid)} + {formatCurrency(parseFloat(auction.currentBid || "0"))} @@ -278,14 +275,14 @@ export default function MediaOutletAuction() { - {auction.highestBidder && ( + {auction.highestBidderId && (
최고 입찰자
- {auction.highestBidder.slice(0, 3)}*** + {auction.highestBidderId.slice(0, 3)}***
)} @@ -328,8 +325,8 @@ export default function MediaOutletAuction() { type="number" value={bidAmount} onChange={(e) => setBidAmount(e.target.value)} - placeholder={`${auction.currentBid + 1000} 이상`} - min={auction.currentBid + 1} + placeholder={`${parseFloat(auction.currentBid || "0") + 1000} 이상`} + min={parseFloat(auction.currentBid || "0") + 1} data-testid="input-bid-amount" /> diff --git a/server/storage.ts b/server/storage.ts index e0c4ecb..89d6445 100644 --- a/server/storage.ts +++ b/server/storage.ts @@ -53,6 +53,7 @@ export interface IStorage { // Auction operations getActiveAuctions(): Promise; getAuctionById(id: string): Promise; + getAuctionByMediaOutlet(mediaOutletId: string): Promise; createAuction(auction: InsertAuction): Promise; placeBid(bid: InsertBid): Promise; @@ -191,6 +192,13 @@ export class DatabaseStorage implements IStorage { return auction; } + async getAuctionByMediaOutlet(mediaOutletId: string): Promise { + const [auction] = await db.select().from(auctions).where( + and(eq(auctions.mediaOutletId, mediaOutletId), eq(auctions.isActive, true)) + ); + return auction; + } + async createAuction(auction: InsertAuction): Promise { const [newAuction] = await db.insert(auctions).values(auction).returning(); return newAuction;