import { Prop, Schema, SchemaFactory } from "@nestjs/mongoose"; export type ClientDocument = ClientModel & Document; /** * Per-media (video/image/voice) byte bounds. Either bound is optional so a * tenant can configure only one side (e.g. raise `maxBytes` without setting * a floor). When a bound is missing the system-wide default is used (see * {@link ClientService.getMediaLimits} for the defaults table). */ export class ClientMediaLimits { @Prop({ type: Number, required: false }) minBytes?: number; @Prop({ type: Number, required: false }) maxBytes?: number; } /** * Bag of per-media-kind limits. Each kind is optional and any unset values * fall back to the system default (see `ClientService.getMediaLimits`). * * Note: the system also keeps an absolute multer ceiling per upload route * (e.g. 50MB for car-capture videos, 20MB for blame videos, 10MB for * voice/signature/image). A client-configured `maxBytes` cannot exceed the * route's multer ceiling because multer rejects oversize requests before * the request reaches the policy check. */ export class ClientMediaSettings { @Prop({ type: ClientMediaLimits, required: false }) video?: ClientMediaLimits; @Prop({ type: ClientMediaLimits, required: false }) image?: ClientMediaLimits; @Prop({ type: ClientMediaLimits, required: false }) voice?: ClientMediaLimits; } /** * Per-tenant tunables. Add new policy fields here; consumers read them via * `ClientService` with documented defaults so older client documents keep * working when a field is missing. */ export class ClientSettings { /** * Max number of days between the accident and the moment a CAR_BODY blame * file is allowed to be submitted. When unset, consumers fall back to the * system default (see {@link ClientService.getCarBodyAccidentMaxAgeDays}). */ @Prop({ type: Number, required: false }) carBodyAccidentMaxAgeDays?: number; /** * Per-kind media upload bounds (V2 upload endpoints). Unset kinds / * bounds fall back to the defaults in `ClientService.getMediaLimits`. */ @Prop({ type: ClientMediaSettings, required: false }) media?: ClientMediaSettings; } @Schema({ collection: "clients", versionKey: false }) export class ClientModel { @Prop({ required: true, unique: true, type: Object }) clientName: { persian: string; english: string; }; @Prop({ required: false, unique: true, type: Object }) property: { smsApiKey: string; }; @Prop({ required: true, unique: false }) useExpertMode: "legal" | "genuine"; @Prop({ required: true, unique: false }) clientCode: number; @Prop({ type: ClientSettings, required: false, default: {} }) settings?: ClientSettings; } export const ClientDbSchema = SchemaFactory.createForClass(ClientModel);