Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions app/api/marketplace/[id]/auction/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// GET /api/marketplace/[id]/auction - Auction Room Data
import { NextRequest } from 'next/server';
import { marketplaceService } from '@/lib/marketplace/service';
import { responses } from '@/lib/marketplace/responses';
import { logger } from '@/lib/marketplace/logger';

interface RouteParams {
params: Promise<{ id: string }>;
}

export async function GET(request: NextRequest, { params }: RouteParams) {
try {
const { id } = await params;
const auction = await marketplaceService.getAuction(id);
if (!auction) return responses.notFound('Auction not found');
return responses.success(auction);
} catch (error) {
logger.error('Auction room API error', error as Error);
return responses.serverError('Failed to fetch auction data');
}
}
34 changes: 34 additions & 0 deletions app/api/marketplace/[id]/bids/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// POST /api/marketplace/[id]/bids - Place a Bid
import { NextRequest } from 'next/server';
import { marketplaceService } from '@/lib/marketplace/service';
import { BidSchema } from '@/lib/marketplace/validation';
import { responses } from '@/lib/marketplace/responses';
import { logger } from '@/lib/marketplace/logger';

interface RouteParams {
params: Promise<{ id: string }>;
}

export async function POST(request: NextRequest, { params }: RouteParams) {
try {
const { id } = await params;
const body = await request.json();

const validation = BidSchema.safeParse(body);
if (!validation.success) {
return responses.badRequest('Invalid bid data', validation.error.issues);
}

const result = await marketplaceService.placeBid(id, validation.data);
return responses.created(result);
} catch (error) {
logger.error('Place bid API error', error as Error);
if (error instanceof Error) {
if (error.message.includes('Transaction failed')) {
return responses.conflict('Transaction failed. Please try again.');
}
return responses.badRequest(error.message);
}
return responses.serverError('Failed to place bid');
}
}
48 changes: 9 additions & 39 deletions app/api/marketplace/[id]/route.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { NextRequest } from 'next/server';
import { marketplaceService } from '@/lib/marketplace/service';
import { BidSchema } from '@/lib/marketplace/validation';
import { responses } from '@/lib/marketplace/responses';
import { logger } from '@/lib/marketplace/logger';
// GET /api/marketplace/[id] - Listing Detail
import { NextRequest } from "next/server";
import { marketplaceService } from "@/lib/marketplace/service";
import { responses } from "@/lib/marketplace/responses";
import { logger } from "@/lib/marketplace/logger";

interface RouteParams {
params: Promise<{ id: string }>;
Expand All @@ -11,42 +11,12 @@ interface RouteParams {
export async function GET(request: NextRequest, { params }: RouteParams) {
try {
const { id } = await params;
const userId = request.nextUrl.searchParams.get('userId') || undefined;
const userId = request.nextUrl.searchParams.get("userId") || undefined;
const listing = await marketplaceService.getListing(id, userId);
if (!listing) return responses.notFound('Listing not found');
if (!listing) return responses.notFound("Listing not found");
return responses.success({ listing });
} catch (error) {
logger.error('Listing detail API error', error as Error);
return responses.serverError('Failed to fetch listing details');
logger.error("Listing detail API error", error as Error);
return responses.serverError("Failed to fetch listing details");
}
}

export async function POST(request: NextRequest, { params }: RouteParams) {
try {
const { id } = await params;
const auction = await marketplaceService.getAuction(id);
if (!auction) return responses.notFound('Auction not found');
return responses.success(auction);
} catch (error) {
logger.error('Auction room API error', error as Error);
return responses.serverError('Failed to fetch auction data');
}
}

export async function PUT(request: NextRequest, { params }: RouteParams) {
try {
const { id } = await params;
const body = await request.json();
const validation = BidSchema.safeParse(body);
if (!validation.success) return responses.badRequest('Invalid bid data', validation.error.issues);
const result = await marketplaceService.placeBid(id, validation.data);
return responses.success(result);
} catch (error) {
logger.error('Place bid API error', error as Error);
if (error instanceof Error) {
if (error.message.includes('Transaction failed')) return responses.conflict('Transaction failed. Please try again.');
return responses.badRequest(error.message);
}
return responses.serverError('Failed to place bid');
}
}
2 changes: 1 addition & 1 deletion app/api/marketplace/feed/route.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// app/api/marketplace/feed/route.ts
// GET /api/marketplace/feed - Marketplace Feed
import { NextRequest } from 'next/server';
import { marketplaceService } from '@/lib/marketplace/service';
import { FeedFiltersSchema, PaginationSchema } from '@/lib/marketplace/validation';
Expand Down
36 changes: 18 additions & 18 deletions types/land.types.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
// types/land.types.ts
export interface Land {
id: string
title: string
size: number
landType: string
village: string | null
district: string | null
state: string | null
minLeaseDuration: number
maxLeaseDuration: number
expectedRentMin: number | null
expectedRentMax: number | null
allowedCropTypes: string[]
isActive: boolean
isArchived: boolean
landownerId: string
createdAt: Date
updatedAt: Date
}
id: string;
title: string;
size: number;
landType: string;
village: string | null;
district: string | null;
state: string | null;
minLeaseDuration: number;
maxLeaseDuration: number;
expectedRentMin: number | null;
expectedRentMax: number | null;
allowedCropTypes: string[];
isActive: boolean;
isArchived: boolean;
landownerId: string;
createdAt: Date;
updatedAt: Date;
}
Loading