diff --git a/meet-ce/backend/src/models/mongoose-schemas/room-member.schema.ts b/meet-ce/backend/src/models/mongoose-schemas/room-member.schema.ts index e1fc4486..590ba20c 100644 --- a/meet-ce/backend/src/models/mongoose-schemas/room-member.schema.ts +++ b/meet-ce/backend/src/models/mongoose-schemas/room-member.schema.ts @@ -71,6 +71,10 @@ const MeetRoomMemberSchema = new Schema( type: String, required: true }, + membershipDate: { + type: Number, + required: true + }, baseRole: { type: String, enum: Object.values(MeetRoomMemberRole), @@ -95,6 +99,8 @@ const MeetRoomMemberSchema = new Schema( // Create indexes for efficient querying MeetRoomMemberSchema.index({ roomId: 1, memberId: 1 }, { unique: true }); +MeetRoomMemberSchema.index({ roomId: 1, membershipDate: -1, _id: -1 }); +MeetRoomMemberSchema.index({ roomId: 1, name: 1, membershipDate: -1, _id: -1 }); MeetRoomMemberSchema.index({ roomId: 1, name: 1, _id: 1 }); MeetRoomMemberSchema.index({ memberId: 1 }); diff --git a/meet-ce/backend/src/models/mongoose-schemas/room.schema.ts b/meet-ce/backend/src/models/mongoose-schemas/room.schema.ts index c32809f6..d753f8cb 100644 --- a/meet-ce/backend/src/models/mongoose-schemas/room.schema.ts +++ b/meet-ce/backend/src/models/mongoose-schemas/room.schema.ts @@ -303,7 +303,8 @@ MeetRoomSchema.index({ roomId: 1 }, { unique: true }); MeetRoomSchema.index({ creationDate: -1, _id: -1 }); MeetRoomSchema.index({ roomName: 1, creationDate: -1, _id: -1 }); MeetRoomSchema.index({ status: 1, creationDate: -1, _id: -1 }); -MeetRoomSchema.index({ autoDeletionDate: 1 }); +MeetRoomSchema.index({ owner: 1, creationDate: -1, _id: -1 }); +MeetRoomSchema.index({ autoDeletionDate: 1, _id: 1 }); export const meetRoomCollectionName = 'MeetRoom'; diff --git a/meet-ce/backend/src/models/mongoose-schemas/user.schema.ts b/meet-ce/backend/src/models/mongoose-schemas/user.schema.ts index cd17255b..e8003d81 100644 --- a/meet-ce/backend/src/models/mongoose-schemas/user.schema.ts +++ b/meet-ce/backend/src/models/mongoose-schemas/user.schema.ts @@ -30,6 +30,10 @@ const MeetUserSchema = new Schema( type: String, required: true }, + registrationDate: { + type: Number, + required: true + }, role: { type: String, enum: Object.values(MeetUserRole), @@ -54,7 +58,10 @@ const MeetUserSchema = new Schema( // Create indexes for efficient querying MeetUserSchema.index({ userId: 1 }, { unique: true }); -MeetUserSchema.index({ name: 1, _id: 1 }); +MeetUserSchema.index({ registrationDate: -1, _id: -1 }); +MeetUserSchema.index({ name: 1, registrationDate: -1, _id: -1 }); +MeetUserSchema.index({ role: 1, registrationDate: -1, _id: -1 }); +MeetUserSchema.index({ name: 1, role: 1, _id: 1 }); export const meetUserCollectionName = 'MeetUser'; diff --git a/meet-ce/backend/src/repositories/room-member.repository.ts b/meet-ce/backend/src/repositories/room-member.repository.ts index 4dc73934..8148786c 100644 --- a/meet-ce/backend/src/repositories/room-member.repository.ts +++ b/meet-ce/backend/src/repositories/room-member.repository.ts @@ -129,8 +129,8 @@ export class RoomMemberRepository extends BaseRepository = { roomId }; diff --git a/meet-ce/backend/src/repositories/user.repository.ts b/meet-ce/backend/src/repositories/user.repository.ts index ee05927a..9bb84fbe 100644 --- a/meet-ce/backend/src/repositories/user.repository.ts +++ b/meet-ce/backend/src/repositories/user.repository.ts @@ -79,8 +79,8 @@ export class UserRepository extends BaseRepos * @param options.role - Optional role to filter by * @param options.maxItems - Maximum number of results to return (default: 100) * @param options.nextPageToken - Token for pagination - * @param options.sortField - Field to sort by (default: 'name') - * @param options.sortOrder - Sort order: 'asc' or 'desc' (default: 'asc') + * @param options.sortField - Field to sort by (default: 'registrationDate') + * @param options.sortOrder - Sort order: 'asc' or 'desc' (default: 'desc') * @returns Object containing users array, pagination info, and optional next page token */ async find(options: MeetUserFilters = {}): Promise<{ @@ -88,7 +88,15 @@ export class UserRepository extends BaseRepos isTruncated: boolean; nextPageToken?: string; }> { - const { userId, name, role, maxItems = 100, nextPageToken, sortField = 'name', sortOrder = 'asc' } = options; + const { + userId, + name, + role, + maxItems = 100, + nextPageToken, + sortField = 'registrationDate', + sortOrder = 'desc' + } = options; // Build base filter const filter: Record = {}; diff --git a/meet-ce/backend/src/services/room-member.service.ts b/meet-ce/backend/src/services/room-member.service.ts index ef788fb8..b31e6c18 100644 --- a/meet-ce/backend/src/services/room-member.service.ts +++ b/meet-ce/backend/src/services/room-member.service.ts @@ -90,6 +90,7 @@ export class RoomMemberService { memberId, roomId, name: memberName, + membershipDate: Date.now(), baseRole, customPermissions } as MeetRoomMember; diff --git a/meet-ce/backend/src/services/user.service.ts b/meet-ce/backend/src/services/user.service.ts index 57cfb54e..07f2f389 100644 --- a/meet-ce/backend/src/services/user.service.ts +++ b/meet-ce/backend/src/services/user.service.ts @@ -28,6 +28,7 @@ export class UserService { const admin: MeetUser = { userId: MEET_ENV.INITIAL_ADMIN_USER, name: 'Admin', + registrationDate: Date.now(), role: MeetUserRole.ADMIN, passwordHash: await PasswordHelper.hashPassword(MEET_ENV.INITIAL_ADMIN_PASSWORD) }; @@ -47,6 +48,7 @@ export class UserService { const user: MeetUser = { userId: userOptions.userId, name: userOptions.name, + registrationDate: Date.now(), role: userOptions.role, passwordHash }; diff --git a/meet-ce/typings/src/room-member.ts b/meet-ce/typings/src/room-member.ts index 2fe16c4f..eee3a0e0 100644 --- a/meet-ce/typings/src/room-member.ts +++ b/meet-ce/typings/src/room-member.ts @@ -19,6 +19,7 @@ export interface MeetRoomMember { memberId: string; // Unique identifier for the member (equals userId for internal users, or generated for external users) roomId: string; // ID of the room the member belongs to name: string; // Name of the member (either internal or external user name) + membershipDate: number; // Timestamp when the member was added to the room baseRole: MeetRoomMemberRole; // The base role of the member in the room customPermissions?: Partial; // Custom permissions for the member (if any) effectivePermissions: MeetRoomMemberPermissions; // Effective permissions for the member (base role + custom permissions) diff --git a/meet-ce/typings/src/user.ts b/meet-ce/typings/src/user.ts index d387a480..c8b2c122 100644 --- a/meet-ce/typings/src/user.ts +++ b/meet-ce/typings/src/user.ts @@ -13,6 +13,7 @@ export interface MeetUserOptions { export interface MeetUser { userId: string; name: string; + registrationDate: number; role: MeetUserRole; passwordHash: string; }