mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-29 17:38:12 +00:00
New Transit Agents admin table (name, valid-from/to, active/suspended, validity badge) — DJ assign step now picks from it, active+valid only.
This commit is contained in:
@@ -65,4 +65,29 @@ export class FileRecord extends BaseEntity {
|
||||
/** Why the file was replaced — shown on the document's version history. */
|
||||
@Column({ name: "replace_reason", type: "text", nullable: true })
|
||||
replaceReason!: string | null;
|
||||
|
||||
/**
|
||||
* Free-text label chosen by the uploader, when the document has no fixed slot
|
||||
* (`code`) to name it — the GL Ethiopia ↔ GL Djibouti exchange. Null for every
|
||||
* catalog-driven upload, whose label comes from its code.
|
||||
*/
|
||||
@Column({ name: "title", type: "varchar", length: 300, nullable: true })
|
||||
title!: string | null;
|
||||
|
||||
/** Uploader's choice to share the document with the customer's portal. */
|
||||
@Column({ name: "visible_to_customer", type: "boolean", default: false })
|
||||
visibleToCustomer!: boolean;
|
||||
|
||||
/** Who uploaded it — the only user allowed to edit or remove it afterwards. */
|
||||
@Column({ name: "uploaded_by_user_id", type: "uuid", nullable: true })
|
||||
uploadedByUserId!: string | null;
|
||||
|
||||
/** Uploader's display name, resolved once so lists need no IAM lookup. */
|
||||
@Column({
|
||||
name: "uploaded_by_name",
|
||||
type: "varchar",
|
||||
length: 200,
|
||||
nullable: true,
|
||||
})
|
||||
uploadedByName!: string | null;
|
||||
}
|
||||
|
||||
@@ -15,6 +15,11 @@ export interface CreateFileInput {
|
||||
resource: string;
|
||||
code: string;
|
||||
file: Express.Multer.File;
|
||||
/** Optional metadata for free-form uploads (GL exchange) — see FileRecord. */
|
||||
title?: string | null;
|
||||
visibleToCustomer?: boolean;
|
||||
uploadedByUserId?: string | null;
|
||||
uploadedByName?: string | null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -101,9 +106,27 @@ export class FilesService {
|
||||
url,
|
||||
size: file.size,
|
||||
mimeType: file.mimetype,
|
||||
title: input.title ?? null,
|
||||
visibleToCustomer: input.visibleToCustomer ?? false,
|
||||
uploadedByUserId: input.uploadedByUserId ?? null,
|
||||
uploadedByName: input.uploadedByName ?? null,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit the uploader-authored metadata of a stored file (title, customer
|
||||
* visibility). Bytes are untouched — callers replacing content upload a new
|
||||
* record instead.
|
||||
*/
|
||||
async updateMeta(
|
||||
id: string,
|
||||
patch: { title?: string; visibleToCustomer?: boolean },
|
||||
): Promise<FileRecord> {
|
||||
const updated = await this.filesRepository.update(id, patch);
|
||||
if (!updated) throw new NotFoundException(`File ${id} not found`);
|
||||
return updated;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace the file stored under a resource + code (e.g. contract PDF). The
|
||||
* previous version is retired, not destroyed — pass `replacedBy` to record who
|
||||
|
||||
Reference in New Issue
Block a user