All materials
export-certificates.ts
tsexport-certificates.ts
import { Router, Request, Response } from 'express'
import { prisma } from '../lib/db'
import { requireAuth, requireRole } from '../lib/auth'
const router = Router()
router.get('/', requireAuth, async (_req: Request, res: Response) => {
try {
const certificates = await prisma.exportCertificate.findMany({
include: {
shipment: { select: { destination: true, status: true, vessel_name: true } },
},
orderBy: { date_emission: 'desc' },
})
res.json(certificates)
} catch (error) {
res.status(500).json({ error: 'Failed to fetch certificates' })
}
})
router.post('/', requireAuth, requireRole('admin'), async (req: Request, res: Response) => {
try {
const { shipment_id, type_certificat } = req.body
const shipment = await prisma.shipment.findUnique({
where: { id: shipment_id },
})
if (!shipment) {
return res.status(404).json({ error: 'Shipment not found' })
}
if (shipment.status === 'pending') {
return res.status(400).json({ error: 'Cannot generate certificate for pending shipment' })
}
const certCount = await prisma.exportCertificate.count()
const prefix = type_certificat === 'certificate_of_origin' ? 'CO' : 'PHY'
const numero = `CI-${prefix}-${String(2025000 + certCount + 1).padStart(7, '0')}`
const certificate = await prisma.exportCertificate.create({
data: {
shipment_id,
type_certificat,
numero,
date_expiration: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000),
},
})
res.status(201).json(certificate)
} catch (error) {
res.status(500).json({ error: 'Failed to generate certificate' })
}
})
export default router