backend: add membershipDate and registrationDate fields to room member and user schemas

This commit is contained in:
juancarmore 2026-01-07 13:46:11 +01:00
parent b017334976
commit df2d58c3bb
9 changed files with 35 additions and 8 deletions

View File

@ -71,6 +71,10 @@ const MeetRoomMemberSchema = new Schema<MeetRoomMemberDocument>(
type: String,
required: true
},
membershipDate: {
type: Number,
required: true
},
baseRole: {
type: String,
enum: Object.values(MeetRoomMemberRole),
@ -95,6 +99,8 @@ const MeetRoomMemberSchema = new Schema<MeetRoomMemberDocument>(
// 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 });

View File

@ -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';

View File

@ -30,6 +30,10 @@ const MeetUserSchema = new Schema<MeetUserDocument>(
type: String,
required: true
},
registrationDate: {
type: Number,
required: true
},
role: {
type: String,
enum: Object.values(MeetUserRole),
@ -54,7 +58,10 @@ const MeetUserSchema = new Schema<MeetUserDocument>(
// 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';

View File

@ -129,8 +129,8 @@ export class RoomMemberRepository extends BaseRepository<MeetRoomMember, MeetRoo
* @param options.fields - Comma-separated list of fields to include in the result
* @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: 'membershipDate')
* @param options.sortOrder - Sort order: 'asc' or 'desc' (default: 'desc')
* @returns Object containing members array, pagination info, and optional next page token
*/
async findByRoomId(
@ -149,7 +149,7 @@ export class RoomMemberRepository extends BaseRepository<MeetRoomMember, MeetRoo
this.currentRoomRoles = room.roles;
const { name, fields, maxItems = 100, nextPageToken, sortField = 'name', sortOrder = 'asc' } = options;
const { name, fields, maxItems = 100, nextPageToken, sortField = 'membershipDate', sortOrder = 'desc' } = options;
// Build base filter
const filter: Record<string, unknown> = { roomId };

View File

@ -79,8 +79,8 @@ export class UserRepository<TUser extends MeetUser = MeetUser> 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<TUser extends MeetUser = MeetUser> 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<string, unknown> = {};

View File

@ -90,6 +90,7 @@ export class RoomMemberService {
memberId,
roomId,
name: memberName,
membershipDate: Date.now(),
baseRole,
customPermissions
} as MeetRoomMember;

View File

@ -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
};

View File

@ -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<MeetRoomMemberPermissions>; // Custom permissions for the member (if any)
effectivePermissions: MeetRoomMemberPermissions; // Effective permissions for the member (base role + custom permissions)

View File

@ -13,6 +13,7 @@ export interface MeetUserOptions {
export interface MeetUser {
userId: string;
name: string;
registrationDate: number;
role: MeetUserRole;
passwordHash: string;
}