backend: integrate schema versioning into create methods across repositories

This commit is contained in:
juancarmore 2026-02-24 20:17:14 +01:00
parent cdbfd8c968
commit cae5a58568
6 changed files with 43 additions and 17 deletions

View File

@ -1,6 +1,7 @@
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 { LoggerService } from '../services/logger.service.js';
import { BaseRepository } from './base.repository.js';
@ -24,7 +25,11 @@ export class ApiKeyRepository extends BaseRepository<MeetApiKey, MeetApiKeyDocum
* Creates a new API key.
*/
async create(apiKey: MeetApiKey): Promise<MeetApiKey> {
return this.createDocument(apiKey);
const document: MeetApiKeyDocument = {
...apiKey,
schemaVersion: INTERNAL_CONFIG.API_KEY_SCHEMA_VERSION
};
return this.createDocument(document);
}
/**

View File

@ -1,6 +1,7 @@
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 { LoggerService } from '../services/logger.service.js';
import { BaseRepository } from './base.repository.js';
@ -33,7 +34,11 @@ export class GlobalConfigRepository extends BaseRepository<GlobalConfig, MeetGlo
* @returns The created global configuration
*/
async create(config: GlobalConfig): Promise<GlobalConfig> {
return this.createDocument(config);
const document: MeetGlobalConfigDocument = {
...config,
schemaVersion: INTERNAL_CONFIG.GLOBAL_CONFIG_SCHEMA_VERSION
};
return this.createDocument(document);
}
/**

View File

@ -6,8 +6,9 @@ import {
SortOrder
} from '@openvidu-meet/typings';
import { inject, injectable } from 'inversify';
import { FilterQuery, Require_id } from 'mongoose';
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 { LoggerService } from '../services/logger.service.js';
import { BaseRepository } from './base.repository.js';
@ -35,15 +36,15 @@ export class RecordingRepository extends BaseRepository<MeetRecordingInfo, MeetR
* @returns The created recording (without access secrets)
*/
async create(recording: MeetRecordingInfo): Promise<MeetRecordingInfo> {
// Generate access secrets
const recordingDoc: Omit<MeetRecordingDocument, 'schemaVersion'> = {
const document: MeetRecordingDocument = {
...recording,
accessSecrets: {
public: secureUid(10),
private: secureUid(10)
}
},
schemaVersion: INTERNAL_CONFIG.RECORDING_SCHEMA_VERSION
};
return this.createDocument(recordingDoc);
return this.createDocument(document);
}
/**
@ -105,7 +106,7 @@ export class RecordingRepository extends BaseRepository<MeetRecordingInfo, MeetR
} = options;
// Build base filter
const filter: FilterQuery<MeetRecordingDocument> = {};
const filter: QueryFilter<MeetRecordingDocument> = {};
if (roomIds) {
// Filter by multiple room IDs

View File

@ -1,6 +1,7 @@
import { MeetRoomMember, MeetRoomMemberFilters, MeetRoomMemberPermissions, SortOrder } from '@openvidu-meet/typings';
import { inject, injectable } from 'inversify';
import { FilterQuery, Require_id } from 'mongoose';
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 { LoggerService } from '../services/logger.service.js';
import { BaseRepository } from './base.repository.js';
@ -28,7 +29,11 @@ export class RoomMemberRepository extends BaseRepository<MeetRoomMember, MeetRoo
* @returns The created room member
*/
async create(member: MeetRoomMember): Promise<MeetRoomMember> {
return this.createDocument(member);
const document: MeetRoomMemberDocument = {
...member,
schemaVersion: INTERNAL_CONFIG.ROOM_MEMBER_SCHEMA_VERSION
};
return this.createDocument(document);
}
/**
@ -128,7 +133,7 @@ export class RoomMemberRepository extends BaseRepository<MeetRoomMember, MeetRoo
} = options;
// Build base filter
const filter: FilterQuery<MeetRoomMemberDocument> = { roomId };
const filter: QueryFilter<MeetRoomMemberDocument> = { roomId };
if (name) {
filter.name = new RegExp(name, 'i');

View File

@ -1,6 +1,7 @@
import { MeetRoom, MeetRoomField, MeetRoomFilters, MeetRoomStatus, SortOrder } from '@openvidu-meet/typings';
import { inject, injectable } from 'inversify';
import { FilterQuery, Require_id } from 'mongoose';
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 { LoggerService } from '../services/logger.service.js';
import { getBasePath } from '../utils/html-dynamic-base-path.utils.js';
@ -39,7 +40,11 @@ export class RoomRepository extends BaseRepository<MeetRoom, MeetRoomDocument> {
*/
async create(room: MeetRoom): Promise<MeetRoom> {
const normalizedRoom = this.normalizeRoomForStorage(room);
return this.createDocument(normalizedRoom);
const document: MeetRoomDocument = {
...normalizedRoom,
schemaVersion: INTERNAL_CONFIG.ROOM_SCHEMA_VERSION
};
return this.createDocument(document);
}
/**
@ -128,7 +133,7 @@ export class RoomRepository extends BaseRepository<MeetRoom, MeetRoomDocument> {
} = options;
// Build base filter
const filter: FilterQuery<MeetRoomDocument> = {};
const filter: QueryFilter<MeetRoomDocument> = {};
// Handle owner and roomIds with $or when both are present
if (owner && roomIds) {

View File

@ -1,6 +1,7 @@
import { MeetUser, MeetUserFilters, SortOrder } from '@openvidu-meet/typings';
import { inject, injectable } from 'inversify';
import { FilterQuery, Require_id } from 'mongoose';
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 { LoggerService } from '../services/logger.service.js';
import { BaseRepository } from './base.repository.js';
@ -28,7 +29,11 @@ export class UserRepository extends BaseRepository<MeetUser, MeetUserDocument> {
* @returns The created user
*/
async create(user: MeetUser): Promise<MeetUser> {
return this.createDocument(user);
const document: MeetUserDocument = {
...user,
schemaVersion: INTERNAL_CONFIG.USER_SCHEMA_VERSION
};
return this.createDocument(document);
}
/**
@ -91,7 +96,7 @@ export class UserRepository extends BaseRepository<MeetUser, MeetUserDocument> {
} = options;
// Build base filter
const filter: FilterQuery<MeetUserDocument> = {};
const filter: QueryFilter<MeetUserDocument> = {};
if (userId && name) {
// Both defined: OR filter with regex userId match and regex name match