Files
carmanagement/apps/api/src/modules/complaints/complaint.service.ts
T
2026-05-25 18:29:05 -04:00

76 lines
2.1 KiB
TypeScript

import { NotFoundError } from '../../http/errors'
import * as repo from './complaint.repo'
export async function listComplaints(
companyId: string,
query: { status?: string; severity?: string; category?: string; page: number; pageSize: number },
) {
const { status, severity, category, page, pageSize } = query
const where: Record<string, unknown> = {}
if (status) where.status = status
if (severity) where.severity = severity
if (category) where.category = category
const [complaints, total] = await repo.findMany(companyId, where, (page - 1) * pageSize, pageSize)
return {
data: complaints,
meta: { total, page, pageSize, totalPages: Math.ceil(total / pageSize) },
}
}
export async function getComplaint(id: string, companyId: string) {
const complaint = await repo.findById(id, companyId)
if (!complaint) throw new NotFoundError('Complaint not found')
return complaint
}
export async function createComplaint(
companyId: string,
data: {
reservationId?: string
reviewId?: string
customerId?: string
severity: string
category: string
subject: string
description?: string
assignedTo?: string
},
) {
return repo.create({ companyId, ...data })
}
export async function updateComplaint(
id: string,
companyId: string,
data: {
status?: string
severity?: string
category?: string
subject?: string
description?: string
notes?: string
resolution?: string
assignedTo?: string
},
) {
const existing = await repo.findById(id, companyId)
if (!existing) throw new NotFoundError('Complaint not found')
const updateData: Record<string, unknown> = { ...data }
// When status changes to RESOLVED, set resolvedAt
if (data.status === 'RESOLVED' && existing.status !== 'RESOLVED') {
updateData.resolvedAt = new Date()
}
return repo.updateById(id, updateData)
}
export async function deleteComplaint(id: string, companyId: string) {
const existing = await repo.findById(id, companyId)
if (!existing) throw new NotFoundError('Complaint not found')
await repo.deleteById(id)
return { success: true }
}