Added Documents Feature
This commit is contained in:
55
backend/src/features/documents/domain/documents.service.ts
Normal file
55
backend/src/features/documents/domain/documents.service.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
import { randomUUID } from 'crypto';
|
||||
import type { CreateDocumentBody, DocumentRecord, DocumentType, UpdateDocumentBody } from './documents.types';
|
||||
import { DocumentsRepository } from '../data/documents.repository';
|
||||
import pool from '../../../core/config/database';
|
||||
|
||||
export class DocumentsService {
|
||||
private readonly repo = new DocumentsRepository(pool);
|
||||
|
||||
async createDocument(userId: string, body: CreateDocumentBody): Promise<DocumentRecord> {
|
||||
await this.assertVehicleOwnership(userId, body.vehicle_id);
|
||||
const id = randomUUID();
|
||||
return this.repo.insert({
|
||||
id,
|
||||
user_id: userId,
|
||||
vehicle_id: body.vehicle_id,
|
||||
document_type: body.document_type as DocumentType,
|
||||
title: body.title,
|
||||
notes: body.notes ?? null,
|
||||
details: body.details ?? null,
|
||||
issued_date: body.issued_date ?? null,
|
||||
expiration_date: body.expiration_date ?? null,
|
||||
});
|
||||
}
|
||||
|
||||
async getDocument(userId: string, id: string): Promise<DocumentRecord | null> {
|
||||
return this.repo.findById(id, userId);
|
||||
}
|
||||
|
||||
async listDocuments(userId: string, filters?: { vehicleId?: string; type?: DocumentType; expiresBefore?: string }) {
|
||||
return this.repo.listByUser(userId, filters);
|
||||
}
|
||||
|
||||
async updateDocument(userId: string, id: string, patch: UpdateDocumentBody) {
|
||||
const existing = await this.repo.findById(id, userId);
|
||||
if (!existing) return null;
|
||||
if (patch && typeof patch === 'object') {
|
||||
return this.repo.updateMetadata(id, userId, patch as any);
|
||||
}
|
||||
return existing;
|
||||
}
|
||||
|
||||
async deleteDocument(userId: string, id: string): Promise<void> {
|
||||
await this.repo.softDelete(id, userId);
|
||||
}
|
||||
|
||||
private async assertVehicleOwnership(userId: string, vehicleId: string) {
|
||||
const res = await pool.query('SELECT id FROM vehicles WHERE id = $1 AND user_id = $2', [vehicleId, userId]);
|
||||
if (!res.rows[0]) {
|
||||
const err: any = new Error('Vehicle not found or not owned by user');
|
||||
err.statusCode = 403;
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user