Post-cutover UAT batch #3: - #62 Spec tab renders the current berth spec PDF inline (lazy PdfViewer, toggleable, default-open) + explicit download. Interest Documents tab already previews/downloads linked deal docs inline (verified). - #57 Surface berths.status_override_mode through the interest-berths API; linked-berth rows show an amber "Pin overrides pitch" badge + corrected consequence copy when a berth is specifically-pitched but manually pinned (the soft-pin wins on the public map). - #63 New maintenance-module gate (maintenance_module_enabled, default on): registry + admin Settings toggle, maintenance-module.service, port-provider useMaintenanceModuleEnabled, layout wiring, buildBerthTabs hides the Maintenance tab when off, and both maintenance log routes assert the gate. - #66 BerthOccupancyChip: >1 competing interest opens a popover listing every deal (name + stage + in-EOI/primary + link); single stays a direct link. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
import { NextResponse } from 'next/server';
|
|
|
|
import { withAuth, withPermission } from '@/lib/api/helpers';
|
|
import { parseBody } from '@/lib/api/route-helpers';
|
|
import { updateMaintenanceLogSchema } from '@/lib/validators/berths';
|
|
import { updateMaintenanceLog, deleteMaintenanceLog } from '@/lib/services/berths.service';
|
|
import { assertMaintenanceModuleEnabled } from '@/lib/services/maintenance-module.service';
|
|
import { errorResponse } from '@/lib/errors';
|
|
|
|
// PATCH /api/v1/berths/[id]/maintenance/[logId]
|
|
export const PATCH = withAuth(
|
|
withPermission('berths', 'edit', async (req, ctx, params) => {
|
|
try {
|
|
await assertMaintenanceModuleEnabled(ctx.portId);
|
|
const body = await parseBody(req, updateMaintenanceLogSchema);
|
|
const log = await updateMaintenanceLog(params.id!, params.logId!, ctx.portId, body, {
|
|
userId: ctx.userId,
|
|
portId: ctx.portId,
|
|
ipAddress: ctx.ipAddress,
|
|
userAgent: ctx.userAgent,
|
|
});
|
|
return NextResponse.json({ data: log });
|
|
} catch (error) {
|
|
return errorResponse(error);
|
|
}
|
|
}),
|
|
);
|
|
|
|
// DELETE /api/v1/berths/[id]/maintenance/[logId]
|
|
export const DELETE = withAuth(
|
|
withPermission('berths', 'edit', async (_req, ctx, params) => {
|
|
try {
|
|
await assertMaintenanceModuleEnabled(ctx.portId);
|
|
await deleteMaintenanceLog(params.id!, params.logId!, ctx.portId, {
|
|
userId: ctx.userId,
|
|
portId: ctx.portId,
|
|
ipAddress: ctx.ipAddress,
|
|
userAgent: ctx.userAgent,
|
|
});
|
|
return new NextResponse(null, { status: 204 });
|
|
} catch (error) {
|
|
return errorResponse(error);
|
|
}
|
|
}),
|
|
);
|