backend: add document-only fields and types for various schemas and repositories

This commit is contained in:
juancarmore 2026-02-26 14:10:42 +01:00
parent 09ac408f32
commit 8e5c07710b
12 changed files with 143 additions and 8 deletions

View File

@ -1,6 +1,7 @@
import { MeetApiKey } from '@openvidu-meet/typings';
import { model, Schema } from 'mongoose';
import { INTERNAL_CONFIG } from '../../config/internal-config.js';
import { DocumentOnlyField } from '../database.model.js';
import { SchemaMigratableDocument } from '../migration.model.js';
/**
@ -9,6 +10,19 @@ import { SchemaMigratableDocument } from '../migration.model.js';
*/
export interface MeetApiKeyDocument extends MeetApiKey, SchemaMigratableDocument {}
/**
* Type for fields in MeetApiKeyDocument that are not present in MeetApiKey domain model.
*/
export type MeetApiKeyDocumentOnlyField = DocumentOnlyField<MeetApiKeyDocument, MeetApiKey>;
/**
* List of fields that exist only in the MeetApiKeyDocument and not in the MeetApiKey domain model.
* IMPORTANT: Update this list if new document-only fields are added to the MeetApiKeyDocument interface
*/
export const MEET_API_KEY_DOCUMENT_ONLY_FIELDS = [
'schemaVersion'
] as const satisfies readonly MeetApiKeyDocumentOnlyField[];
/**
* Mongoose schema for MeetApiKey entity.
* Defines the structure and validation rules for API key documents in MongoDB.

View File

@ -1,8 +1,9 @@
import { GlobalConfig, OAuthProvider } from '@openvidu-meet/typings';
import { model, Schema } from 'mongoose';
import { INTERNAL_CONFIG } from '../../config/internal-config.js';
import { MeetAppearanceConfigSchema } from './room.schema.js';
import { DocumentOnlyField } from '../database.model.js';
import { SchemaMigratableDocument } from '../migration.model.js';
import { MeetAppearanceConfigSchema } from './room.schema.js';
/**
* Mongoose Document interface for global config.
@ -10,6 +11,19 @@ import { SchemaMigratableDocument } from '../migration.model.js';
*/
export interface MeetGlobalConfigDocument extends GlobalConfig, SchemaMigratableDocument {}
/**
* Type for fields in MeetGlobalConfigDocument that are not present in GlobalConfig domain model.
*/
export type MeetGlobalConfigDocumentOnlyField = DocumentOnlyField<MeetGlobalConfigDocument, GlobalConfig>;
/**
* List of fields that exist only in the MeetGlobalConfigDocument and not in the GlobalConfig domain model.
* IMPORTANT: Update this list if new document-only fields are added to the MeetGlobalConfigDocument interface
*/
export const MEET_GLOBAL_CONFIG_DOCUMENT_ONLY_FIELDS = [
'schemaVersion'
] as const satisfies readonly MeetGlobalConfigDocumentOnlyField[];
/**
* Sub-schema for OAuth provider configuration.
*/

View File

@ -1,6 +1,7 @@
import { MeetRecordingInfo, MeetRecordingLayout, MeetRecordingStatus } from '@openvidu-meet/typings';
import { model, Schema } from 'mongoose';
import { INTERNAL_CONFIG } from '../../config/internal-config.js';
import { DocumentOnlyField } from '../database.model.js';
import { SchemaMigratableDocument } from '../migration.model.js';
/**
@ -15,6 +16,20 @@ export interface MeetRecordingDocument extends MeetRecordingInfo, SchemaMigratab
};
}
/**
* Type for fields in MeetRecordingDocument that are not present in MeetRecordingInfo domain model.
*/
export type MeetRecordingDocumentOnlyField = DocumentOnlyField<MeetRecordingDocument, MeetRecordingInfo>;
/**
* List of fields that exist only in the MeetRecordingDocument and not in the MeetRecordingInfo domain model.
* IMPORTANT: Update this list if new document-only fields are added to the MeetRecordingDocument interface
*/
export const MEET_RECORDING_DOCUMENT_ONLY_FIELDS = [
'schemaVersion',
'accessSecrets'
] as const satisfies readonly MeetRecordingDocumentOnlyField[];
/**
* Mongoose schema for MeetRecordingInfo entity.
* Defines the structure and validation rules for recording documents in MongoDB.

View File

@ -1,6 +1,7 @@
import { MeetRoomMember, MeetRoomMemberRole } from '@openvidu-meet/typings';
import { Schema, model } from 'mongoose';
import { INTERNAL_CONFIG } from '../../config/internal-config.js';
import { DocumentOnlyField } from '../database.model.js';
import { SchemaMigratableDocument } from '../migration.model.js';
/**
@ -9,6 +10,19 @@ import { SchemaMigratableDocument } from '../migration.model.js';
*/
export interface MeetRoomMemberDocument extends MeetRoomMember, SchemaMigratableDocument {}
/**
* Type for fields in MeetRoomMemberDocument that are not present in MeetRoomMember domain model.
*/
export type MeetRoomMemberDocumentOnlyField = DocumentOnlyField<MeetRoomMemberDocument, MeetRoomMember>;
/**
* List of fields that exist only in the MeetRoomMemberDocument and not in the MeetRoomMember domain model.
* IMPORTANT: Update this list if new document-only fields are added to the MeetRoomMemberDocument interface
*/
export const MEET_ROOM_MEMBER_DOCUMENT_ONLY_FIELDS = [
'schemaVersion'
] as const satisfies readonly MeetRoomMemberDocumentOnlyField[];
const permissionFields = {
canRecord: { type: Boolean },
canRetrieveRecordings: { type: Boolean },

View File

@ -9,8 +9,9 @@ import {
} from '@openvidu-meet/typings';
import { Schema, model } from 'mongoose';
import { INTERNAL_CONFIG } from '../../config/internal-config.js';
import { MeetRoomMemberPermissionsSchema } from './room-member.schema.js';
import { DocumentOnlyField } from '../database.model.js';
import { SchemaMigratableDocument } from '../migration.model.js';
import { MeetRoomMemberPermissionsSchema } from './room-member.schema.js';
/**
* Mongoose Document interface for rooms.
@ -18,6 +19,17 @@ import { SchemaMigratableDocument } from '../migration.model.js';
*/
export interface MeetRoomDocument extends MeetRoom, SchemaMigratableDocument {}
/**
* Type for fields in MeetRoomDocument that are not present in MeetRoom domain model.
*/
export type MeetRoomDocumentOnlyField = DocumentOnlyField<MeetRoomDocument, MeetRoom>;
/**
* List of fields that exist only in the MeetRoomDocument and not in the MeetRoom domain model.
* IMPORTANT: Update this list if new document-only fields are added to the MeetRoomDocument interface
*/
export const MEET_ROOM_DOCUMENT_ONLY_FIELDS = ['schemaVersion'] as const satisfies readonly MeetRoomDocumentOnlyField[];
/**
* Sub-schema for auto-deletion policy.
*/

View File

@ -1,6 +1,7 @@
import { MeetUser, MeetUserRole } from '@openvidu-meet/typings';
import { model, Schema } from 'mongoose';
import { INTERNAL_CONFIG } from '../../config/internal-config.js';
import { DocumentOnlyField } from '../database.model.js';
import { SchemaMigratableDocument } from '../migration.model.js';
/**
@ -9,6 +10,17 @@ import { SchemaMigratableDocument } from '../migration.model.js';
*/
export interface MeetUserDocument extends MeetUser, SchemaMigratableDocument {}
/**
* Type for fields in MeetUserDocument that are not present in MeetUser domain model.
*/
export type MeetUserDocumentOnlyField = DocumentOnlyField<MeetUserDocument, MeetUser>;
/**
* List of fields that exist only in the MeetUserDocument and not in the MeetUser domain model.
* IMPORTANT: Update this list if new document-only fields are added to the MeetUserDocument interface
*/
export const MEET_USER_DOCUMENT_ONLY_FIELDS = ['schemaVersion'] as const satisfies readonly MeetUserDocumentOnlyField[];
/**
* Mongoose schema for MeetUser entity.
* Defines the structure and validation rules for user documents in MongoDB.

View File

@ -2,7 +2,12 @@ import { MeetApiKey } from '@openvidu-meet/typings';
import { inject, injectable } from 'inversify';
import { Require_id } from 'mongoose';
import { INTERNAL_CONFIG } from '../config/internal-config.js';
import { MeetApiKeyDocument, MeetApiKeyModel } from '../models/mongoose-schemas/api-key.schema.js';
import {
MEET_API_KEY_DOCUMENT_ONLY_FIELDS,
MeetApiKeyDocument,
MeetApiKeyDocumentOnlyField,
MeetApiKeyModel
} from '../models/mongoose-schemas/api-key.schema.js';
import { LoggerService } from '../services/logger.service.js';
import { BaseRepository } from './base.repository.js';
@ -21,6 +26,10 @@ export class ApiKeyRepository extends BaseRepository<MeetApiKey, MeetApiKeyDocum
return apiKey as MeetApiKey;
}
protected override getDocumentOnlyFields(): readonly MeetApiKeyDocumentOnlyField[] {
return MEET_API_KEY_DOCUMENT_ONLY_FIELDS;
}
/**
* Creates a new API key.
*/

View File

@ -2,7 +2,12 @@ import { GlobalConfig } from '@openvidu-meet/typings';
import { inject, injectable } from 'inversify';
import { Require_id } from 'mongoose';
import { INTERNAL_CONFIG } from '../config/internal-config.js';
import { MeetGlobalConfigDocument, MeetGlobalConfigModel } from '../models/mongoose-schemas/global-config.schema.js';
import {
MEET_GLOBAL_CONFIG_DOCUMENT_ONLY_FIELDS,
MeetGlobalConfigDocument,
MeetGlobalConfigDocumentOnlyField,
MeetGlobalConfigModel
} from '../models/mongoose-schemas/global-config.schema.js';
import { LoggerService } from '../services/logger.service.js';
import { BaseRepository } from './base.repository.js';
@ -24,6 +29,10 @@ export class GlobalConfigRepository extends BaseRepository<GlobalConfig, MeetGlo
return globalConfig as GlobalConfig;
}
protected override getDocumentOnlyFields(): readonly MeetGlobalConfigDocumentOnlyField[] {
return MEET_GLOBAL_CONFIG_DOCUMENT_ONLY_FIELDS;
}
/**
* Creates the global configuration document.
*

View File

@ -9,7 +9,12 @@ import { inject, injectable } from 'inversify';
import { QueryFilter, Require_id } from 'mongoose';
import { uid as secureUid } from 'uid/secure';
import { INTERNAL_CONFIG } from '../config/internal-config.js';
import { MeetRecordingDocument, MeetRecordingModel } from '../models/mongoose-schemas/recording.schema.js';
import {
MEET_RECORDING_DOCUMENT_ONLY_FIELDS,
MeetRecordingDocument,
MeetRecordingDocumentOnlyField,
MeetRecordingModel
} from '../models/mongoose-schemas/recording.schema.js';
import { LoggerService } from '../services/logger.service.js';
import { BaseRepository } from './base.repository.js';
@ -29,6 +34,10 @@ export class RecordingRepository extends BaseRepository<MeetRecordingInfo, MeetR
return recording as MeetRecordingInfo;
}
protected override getDocumentOnlyFields(): readonly MeetRecordingDocumentOnlyField[] {
return MEET_RECORDING_DOCUMENT_ONLY_FIELDS;
}
/**
* Creates a new recording with generated access secrets.
*

View File

@ -2,7 +2,12 @@ import { MeetRoomMember, MeetRoomMemberFilters, MeetRoomMemberPermissions, SortO
import { inject, injectable } from 'inversify';
import { QueryFilter, Require_id } from 'mongoose';
import { INTERNAL_CONFIG } from '../config/internal-config.js';
import { MeetRoomMemberDocument, MeetRoomMemberModel } from '../models/mongoose-schemas/room-member.schema.js';
import {
MEET_ROOM_MEMBER_DOCUMENT_ONLY_FIELDS,
MeetRoomMemberDocument,
MeetRoomMemberDocumentOnlyField,
MeetRoomMemberModel
} from '../models/mongoose-schemas/room-member.schema.js';
import { LoggerService } from '../services/logger.service.js';
import { BaseRepository } from './base.repository.js';
@ -22,6 +27,10 @@ export class RoomMemberRepository extends BaseRepository<MeetRoomMember, MeetRoo
return member as MeetRoomMember;
}
protected override getDocumentOnlyFields(): readonly MeetRoomMemberDocumentOnlyField[] {
return MEET_ROOM_MEMBER_DOCUMENT_ONLY_FIELDS;
}
/**
* Adds a member to a room.
*

View File

@ -2,7 +2,12 @@ import { MeetRoom, MeetRoomField, MeetRoomFilters, MeetRoomStatus, SortOrder } f
import { inject, injectable } from 'inversify';
import { QueryFilter, Require_id } from 'mongoose';
import { INTERNAL_CONFIG } from '../config/internal-config.js';
import { MeetRoomDocument, MeetRoomModel } from '../models/mongoose-schemas/room.schema.js';
import {
MEET_ROOM_DOCUMENT_ONLY_FIELDS,
MeetRoomDocument,
MeetRoomDocumentOnlyField,
MeetRoomModel
} from '../models/mongoose-schemas/room.schema.js';
import { LoggerService } from '../services/logger.service.js';
import { getBasePath } from '../utils/html-dynamic-base-path.utils.js';
import { getBaseUrl } from '../utils/url.utils.js';
@ -31,6 +36,10 @@ export class RoomRepository extends BaseRepository<MeetRoom, MeetRoomDocument> {
return this.enrichRoomWithBaseUrls(room as MeetRoom);
}
protected override getDocumentOnlyFields(): readonly MeetRoomDocumentOnlyField[] {
return MEET_ROOM_DOCUMENT_ONLY_FIELDS;
}
/**
* Creates a new room.
* URLs are stored in the database without the base URL.

View File

@ -2,7 +2,12 @@ import { MeetUser, MeetUserFilters, SortOrder } from '@openvidu-meet/typings';
import { inject, injectable } from 'inversify';
import { QueryFilter, Require_id } from 'mongoose';
import { INTERNAL_CONFIG } from '../config/internal-config.js';
import { MeetUserDocument, MeetUserModel } from '../models/mongoose-schemas/user.schema.js';
import {
MEET_USER_DOCUMENT_ONLY_FIELDS,
MeetUserDocument,
MeetUserDocumentOnlyField,
MeetUserModel
} from '../models/mongoose-schemas/user.schema.js';
import { LoggerService } from '../services/logger.service.js';
import { BaseRepository } from './base.repository.js';
@ -22,6 +27,10 @@ export class UserRepository extends BaseRepository<MeetUser, MeetUserDocument> {
return user as MeetUser;
}
protected override getDocumentOnlyFields(): readonly MeetUserDocumentOnlyField[] {
return MEET_USER_DOCUMENT_ONLY_FIELDS;
}
/**
* Creates a new user.
*