initial commit
This commit is contained in:
200
app/api/admin/services/route.ts
Normal file
200
app/api/admin/services/route.ts
Normal file
@@ -0,0 +1,200 @@
|
||||
import { NextRequest, NextResponse } from 'next/server'
|
||||
import { withAdminAuth } from '@/lib/admin-middleware'
|
||||
import { connectDB } from '@/lib/mongodb'
|
||||
import { Billing } from '@/models/billing'
|
||||
import { DeveloperRequest } from '@/models/developer-request'
|
||||
|
||||
export async function GET(request: NextRequest) {
|
||||
return withAdminAuth(request, async (req, admin) => {
|
||||
try {
|
||||
await connectDB()
|
||||
|
||||
const { searchParams } = new URL(request.url)
|
||||
const page = parseInt(searchParams.get('page') || '1')
|
||||
const limit = parseInt(searchParams.get('limit') || '20')
|
||||
const serviceType = searchParams.get('serviceType') || ''
|
||||
const status = searchParams.get('status') || ''
|
||||
const dateFrom = searchParams.get('dateFrom')
|
||||
const dateTo = searchParams.get('dateTo')
|
||||
|
||||
const skip = (page - 1) * limit
|
||||
|
||||
// Build filter query for billing services
|
||||
const billingFilter: any = {}
|
||||
|
||||
if (serviceType && serviceType !== 'all') {
|
||||
billingFilter.service_type = serviceType
|
||||
}
|
||||
|
||||
if (status && status !== 'all') {
|
||||
billingFilter.service_status = status
|
||||
}
|
||||
|
||||
if (dateFrom || dateTo) {
|
||||
billingFilter.created_at = {}
|
||||
if (dateFrom) billingFilter.created_at.$gte = new Date(dateFrom)
|
||||
if (dateTo) billingFilter.created_at.$lte = new Date(dateTo)
|
||||
}
|
||||
|
||||
// Fetch billing services
|
||||
const [billingServices, totalBillingServices] = await Promise.all([
|
||||
Billing.find(billingFilter).sort({ created_at: -1 }).skip(skip).limit(limit),
|
||||
Billing.countDocuments(billingFilter),
|
||||
])
|
||||
|
||||
// Build filter for developer requests
|
||||
const devRequestFilter: any = {}
|
||||
|
||||
if (status && status !== 'all') {
|
||||
devRequestFilter.status = status
|
||||
}
|
||||
|
||||
if (dateFrom || dateTo) {
|
||||
devRequestFilter.createdAt = {}
|
||||
if (dateFrom) devRequestFilter.createdAt.$gte = new Date(dateFrom)
|
||||
if (dateTo) devRequestFilter.createdAt.$lte = new Date(dateTo)
|
||||
}
|
||||
|
||||
// Fetch developer requests
|
||||
const [developerRequests, totalDeveloperRequests] = await Promise.all([
|
||||
(DeveloperRequest as any)
|
||||
.find(devRequestFilter)
|
||||
.populate('userId', 'name email siliconId')
|
||||
.sort({ createdAt: -1 })
|
||||
.skip(skip)
|
||||
.limit(limit),
|
||||
(DeveloperRequest as any).countDocuments(devRequestFilter),
|
||||
])
|
||||
|
||||
// Service statistics
|
||||
const serviceStats = await Billing.aggregate([
|
||||
{
|
||||
$group: {
|
||||
_id: '$service_type',
|
||||
count: { $sum: 1 },
|
||||
revenue: { $sum: '$amount' },
|
||||
activeServices: {
|
||||
$sum: { $cond: [{ $eq: ['$service_status', 'active'] }, 1, 0] },
|
||||
},
|
||||
},
|
||||
},
|
||||
{ $sort: { count: -1 } },
|
||||
])
|
||||
|
||||
// Status breakdown
|
||||
const statusBreakdown = await Billing.aggregate([
|
||||
{
|
||||
$group: {
|
||||
_id: '$service_status',
|
||||
count: { $sum: 1 },
|
||||
},
|
||||
},
|
||||
])
|
||||
|
||||
const totalPages = Math.ceil(Math.max(totalBillingServices, totalDeveloperRequests) / limit)
|
||||
|
||||
return NextResponse.json({
|
||||
billingServices,
|
||||
developerRequests,
|
||||
serviceStats,
|
||||
statusBreakdown,
|
||||
pagination: {
|
||||
currentPage: page,
|
||||
totalPages,
|
||||
totalBillingServices,
|
||||
totalDeveloperRequests,
|
||||
hasNext: page < totalPages,
|
||||
hasPrev: page > 1,
|
||||
},
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('Admin services fetch error:', error)
|
||||
return NextResponse.json({ error: 'Failed to fetch services data' }, { status: 500 })
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export async function POST(request: NextRequest) {
|
||||
return withAdminAuth(request, async (req, admin) => {
|
||||
try {
|
||||
await connectDB()
|
||||
|
||||
const body = await request.json()
|
||||
const { action, serviceId, serviceType, data } = body
|
||||
|
||||
if (action === 'updateBilling') {
|
||||
const billing = await Billing.findByIdAndUpdate(
|
||||
serviceId,
|
||||
{
|
||||
service_status: data.service_status,
|
||||
updated_at: new Date(),
|
||||
},
|
||||
{ new: true }
|
||||
)
|
||||
|
||||
if (!billing) {
|
||||
return NextResponse.json({ error: 'Service not found' }, { status: 404 })
|
||||
}
|
||||
|
||||
return NextResponse.json({ service: billing })
|
||||
}
|
||||
|
||||
if (action === 'updateDeveloperRequest') {
|
||||
const developerRequest = await (DeveloperRequest as any)
|
||||
.findByIdAndUpdate(
|
||||
serviceId,
|
||||
{
|
||||
status: data.status,
|
||||
assignedDeveloper: data.assignedDeveloper,
|
||||
estimatedCompletionDate: data.estimatedCompletionDate,
|
||||
notes: data.notes,
|
||||
updatedAt: new Date(),
|
||||
},
|
||||
{ new: true }
|
||||
)
|
||||
.populate('userId', 'name email siliconId')
|
||||
|
||||
if (!developerRequest) {
|
||||
return NextResponse.json({ error: 'Developer request not found' }, { status: 404 })
|
||||
}
|
||||
|
||||
return NextResponse.json({ service: developerRequest })
|
||||
}
|
||||
|
||||
if (action === 'cancelService') {
|
||||
if (serviceType === 'billing') {
|
||||
const billing = await Billing.findByIdAndUpdate(
|
||||
serviceId,
|
||||
{
|
||||
service_status: 'cancelled',
|
||||
updated_at: new Date(),
|
||||
},
|
||||
{ new: true }
|
||||
)
|
||||
|
||||
return NextResponse.json({ service: billing })
|
||||
}
|
||||
|
||||
if (serviceType === 'developer') {
|
||||
const updatedDeveloperRequest = await (DeveloperRequest as any)
|
||||
.findByIdAndUpdate(
|
||||
serviceId,
|
||||
{
|
||||
status: 'cancelled',
|
||||
updatedAt: new Date(),
|
||||
},
|
||||
{ new: true }
|
||||
)
|
||||
.populate('userId', 'name email siliconId')
|
||||
|
||||
return NextResponse.json({ service: updatedDeveloperRequest })
|
||||
}
|
||||
}
|
||||
|
||||
return NextResponse.json({ error: 'Invalid action or service type' }, { status: 400 })
|
||||
} catch (error) {
|
||||
console.error('Admin service action error:', error)
|
||||
return NextResponse.json({ error: 'Failed to perform service action' }, { status: 500 })
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user