diff --git a/meet-ce/backend/openapi/components/parameters/internal/secret.yaml b/meet-ce/backend/openapi/components/parameters/internal/secret.yaml deleted file mode 100644 index c5633f28..00000000 --- a/meet-ce/backend/openapi/components/parameters/internal/secret.yaml +++ /dev/null @@ -1,6 +0,0 @@ -name: secret -in: path -required: true -description: The secret value from the room URL used to access the room. -schema: - type: string diff --git a/meet-ce/backend/openapi/components/parameters/internal/userId-path.yaml b/meet-ce/backend/openapi/components/parameters/internal/userId-path.yaml new file mode 100644 index 00000000..8f4e6c05 --- /dev/null +++ b/meet-ce/backend/openapi/components/parameters/internal/userId-path.yaml @@ -0,0 +1,7 @@ +name: userId +in: path +required: true +description: The unique identifier of the user. +schema: + type: string +example: 'alice_smith' diff --git a/meet-ce/backend/openapi/components/parameters/member-id-path.yaml b/meet-ce/backend/openapi/components/parameters/member-id-path.yaml new file mode 100644 index 00000000..9a735438 --- /dev/null +++ b/meet-ce/backend/openapi/components/parameters/member-id-path.yaml @@ -0,0 +1,7 @@ +name: memberId +in: path +required: true +description: The unique identifier of the room member. +schema: + type: string +example: 'abc123' diff --git a/meet-ce/backend/openapi/components/parameters/room-member-fields.yaml b/meet-ce/backend/openapi/components/parameters/room-member-fields.yaml new file mode 100644 index 00000000..d03dd414 --- /dev/null +++ b/meet-ce/backend/openapi/components/parameters/room-member-fields.yaml @@ -0,0 +1,9 @@ +name: fields +in: query +description: > + Specifies which fields to include in the response for the room member resource. + Provide a comma-separated list of field names. +required: false +schema: + type: string +example: 'accessUrl,baseRole' diff --git a/meet-ce/backend/openapi/components/requestBodies/add-room-member-request.yaml b/meet-ce/backend/openapi/components/requestBodies/add-room-member-request.yaml new file mode 100644 index 00000000..9aed5903 --- /dev/null +++ b/meet-ce/backend/openapi/components/requestBodies/add-room-member-request.yaml @@ -0,0 +1,68 @@ +description: Room member addition options +required: true +content: + application/json: + schema: + type: object + properties: + userId: + type: string + example: 'alice_smith' + description: | + The unique identifier for an internal OpenVidu Meet user. This field should be provided when adding an internal Meet user as a member. + + If provided: + - The member will be associated with the Meet user account identified by this userId. + - The 'name' field should be left blank or an error will be fired. It will be automatically set based on the Meet user's profile name. + - The memberId will be set to this userId value. + + If omitted, the member will be treated as an external user and 'name' must be provided. + + Important: You must provide either 'userId' (for internal users) or 'name' (for external users), but NOT both. + If both are provided, a validation error will be returned. + name: + type: string + maxLength: 50 + example: 'Alice Smith' + description: | + The display name for the participant when joining the meeting with this member access. It is recommended to be unique for the members of the room to easily identify them in the meeting. + + This field is required only when adding an external user. The 'userId' field should be left blank or an error will be fired. + + Important: You must provide either 'userId' (for internal users) or 'name' (for external users), but NOT both. + If both are provided, a validation error will be returned. + baseRole: + type: string + enum: + - moderator + - speaker + example: 'speaker' + description: | + The base role that defines the default permissions for this member. Options are: + - moderator: By default, has full permissions to manage the room and meeting. + - speaker: By default, has permissions to publish audio and video streams. + + Individual permissions can be overridden through the customPermissions object. + customPermissions: + type: object + additionalProperties: + type: boolean + example: + canShareScreen: false + canRecord: true + description: | + An optional object containing custom permission overrides for the base role. + Only include the permissions you want to override from the base role defaults. + Each property should be a permission name (e.g., 'canRecord', 'canShareScreen') with a boolean value. + + For the complete list of all available permissions, see the full permissions schema: + [MeetPermissions](#/schemas/MeetPermissions) + required: + - baseRole + description: | + Request body to add a new member to a room. + + Important: You must provide either 'userId' (for internal Meet users) or 'name' (for external users), but NOT both. + - If 'userId' is provided, the member will be linked to an internal user account and 'name' will be set from that account. + - If 'name' is provided, the member will be treated as an external user without a linked account. + - If both 'userId' and 'name' are provided or neither is provided, the request will fail with a validation error. diff --git a/meet-ce/backend/openapi/components/requestBodies/internal/create-user-request.yaml b/meet-ce/backend/openapi/components/requestBodies/internal/create-user-request.yaml new file mode 100644 index 00000000..73a98700 --- /dev/null +++ b/meet-ce/backend/openapi/components/requestBodies/internal/create-user-request.yaml @@ -0,0 +1,42 @@ +description: User creation options +required: true +content: + application/json: + schema: + type: object + properties: + userId: + type: string + pattern: '^[a-z0-9_]+$' + example: 'alice_smith' + description: | + The unique identifier for the new user. This must be unique across all users. + + Validation: Must contain only lowercase letters, numbers, and underscores. + name: + type: string + maxLength: 50 + example: 'Alice Smith' + description: | + The display name (profile name) for the user. + role: + type: string + enum: ['admin', 'user', 'room_member'] + example: 'user' + description: | + The role to assign to the user. Available roles: + - admin: Has full control over the entire application (configuration, users, rooms, recordings, etc). + - user: Can create and manage their own created rooms and associated recordings. Can also access rooms they are a member of, but without management permissions. + - room_member: Can only access rooms (and recordings) they are a member of, without ability to create or manage rooms. + password: + type: string + format: password + minLength: 5 + example: 'SecureP@ssw0rd' + description: | + The password for the new user account. + required: + - userId + - name + - role + - password diff --git a/meet-ce/backend/openapi/components/requestBodies/internal/login-user.yaml b/meet-ce/backend/openapi/components/requestBodies/internal/login-user.yaml index 5147e08a..e03a825c 100644 --- a/meet-ce/backend/openapi/components/requestBodies/internal/login-user.yaml +++ b/meet-ce/backend/openapi/components/requestBodies/internal/login-user.yaml @@ -3,4 +3,16 @@ required: true content: application/json: schema: - $ref: '../../schemas/internal/user-credentials.yaml' + type: object + properties: + username: + type: string + description: The username of the user. + example: 'admin' + password: + type: string + description: The password of the user. + example: 'password123' + required: + - username + - password diff --git a/meet-ce/backend/openapi/components/requestBodies/internal/recording-token-request.yaml b/meet-ce/backend/openapi/components/requestBodies/internal/recording-token-request.yaml deleted file mode 100644 index 47d7ea5b..00000000 --- a/meet-ce/backend/openapi/components/requestBodies/internal/recording-token-request.yaml +++ /dev/null @@ -1,10 +0,0 @@ -description: Room secret -required: true -content: - application/json: - schema: - type: object - properties: - secret: - type: string - description: The secret value from the room URL used to connect to the room. diff --git a/meet-ce/backend/openapi/components/requestBodies/update-room-anonymous-request.yaml b/meet-ce/backend/openapi/components/requestBodies/update-room-anonymous-request.yaml new file mode 100644 index 00000000..86195807 --- /dev/null +++ b/meet-ce/backend/openapi/components/requestBodies/update-room-anonymous-request.yaml @@ -0,0 +1,6 @@ +description: Room anonymous access configuration update options +required: true +content: + application/json: + schema: + $ref: '../schemas/meet-room-anonymous-config.yaml' diff --git a/meet-ce/backend/openapi/components/requestBodies/update-room-config-request.yaml b/meet-ce/backend/openapi/components/requestBodies/update-room-config-request.yaml index d4119852..bd7576c3 100644 --- a/meet-ce/backend/openapi/components/requestBodies/update-room-config-request.yaml +++ b/meet-ce/backend/openapi/components/requestBodies/update-room-config-request.yaml @@ -8,9 +8,9 @@ content: $ref: '../schemas/meet-room-config.yaml#/MeetRoomConfig' example: config: - chat: - enabled: true recording: enabled: false + chat: + enabled: true virtualBackground: enabled: true diff --git a/meet-ce/backend/openapi/components/requestBodies/update-room-member-request.yaml b/meet-ce/backend/openapi/components/requestBodies/update-room-member-request.yaml new file mode 100644 index 00000000..d303d320 --- /dev/null +++ b/meet-ce/backend/openapi/components/requestBodies/update-room-member-request.yaml @@ -0,0 +1,33 @@ +description: Room member update options +required: true +content: + application/json: + schema: + type: object + properties: + baseRole: + type: string + enum: + - moderator + - speaker + example: 'speaker' + description: | + The base role that defines the default permissions for this member. Options are: + - moderator: By default, has full permissions to manage the room and meeting. + - speaker: By default, has permissions to publish audio and video streams. + + Individual permissions can be overridden through the 'customPermissions' object. + customPermissions: + type: object + additionalProperties: + type: boolean + example: + canShareScreen: false + canRecord: true + description: | + An optional object containing custom permission overrides for the base role. + Only include the permissions you want to override from the base role defaults. + Each property should be a permission name (e.g., 'canRecord', 'canShareScreen') with a boolean value. + + For the complete list of all available permissions, see the full permissions schema: + [MeetPermissions](#/schemas/MeetPermissions) diff --git a/meet-ce/backend/openapi/components/requestBodies/update-room-roles-request.yaml b/meet-ce/backend/openapi/components/requestBodies/update-room-roles-request.yaml new file mode 100644 index 00000000..0c54e154 --- /dev/null +++ b/meet-ce/backend/openapi/components/requestBodies/update-room-roles-request.yaml @@ -0,0 +1,6 @@ +description: Room roles permissions update options +required: true +content: + application/json: + schema: + $ref: '../schemas/meet-room-roles-config.yaml' diff --git a/meet-ce/backend/openapi/components/responses/error-room-member-not-found.yaml b/meet-ce/backend/openapi/components/responses/error-room-member-not-found.yaml new file mode 100644 index 00000000..75a40058 --- /dev/null +++ b/meet-ce/backend/openapi/components/responses/error-room-member-not-found.yaml @@ -0,0 +1,16 @@ +description: Room member or room not found +content: + application/json: + schema: + $ref: '../schemas/error.yaml' + examples: + member_not_found: + summary: Room member does not exist in the specified room + value: + error: 'Room Error' + message: 'Room member "abc123" does not exist in room "room_123"' + room_not_found: + summary: Room does not exist + value: + error: 'Room Error' + message: 'Room "room_123" does not exist' diff --git a/meet-ce/backend/openapi/components/responses/internal/error-user-not-found.yaml b/meet-ce/backend/openapi/components/responses/internal/error-user-not-found.yaml new file mode 100644 index 00000000..fedf37aa --- /dev/null +++ b/meet-ce/backend/openapi/components/responses/internal/error-user-not-found.yaml @@ -0,0 +1,8 @@ +description: User not found +content: + application/json: + schema: + $ref: '../../schemas/error.yaml' + example: + error: 'User Error' + message: 'User "alice_smith" not found' diff --git a/meet-ce/backend/openapi/components/responses/internal/error-userId-already-exists.yaml b/meet-ce/backend/openapi/components/responses/internal/error-userId-already-exists.yaml new file mode 100644 index 00000000..07d0e643 --- /dev/null +++ b/meet-ce/backend/openapi/components/responses/internal/error-userId-already-exists.yaml @@ -0,0 +1,8 @@ +description: UserId already exists +content: + application/json: + schema: + $ref: '../../schemas/error.yaml' + example: + error: 'User Error' + message: 'User "alice_smith" already exists' diff --git a/meet-ce/backend/openapi/components/responses/internal/success-create-user.yaml b/meet-ce/backend/openapi/components/responses/internal/success-create-user.yaml new file mode 100644 index 00000000..713bb167 --- /dev/null +++ b/meet-ce/backend/openapi/components/responses/internal/success-create-user.yaml @@ -0,0 +1,12 @@ +description: User created successfully +content: + application/json: + schema: + $ref: '../../schemas/internal/meet-user.yaml' +headers: + Location: + description: URL of the newly created user + schema: + type: string + format: uri + example: https://your-api.com/internal-api/v1/users/alice_smith diff --git a/meet-ce/backend/openapi/components/responses/internal/success-delete-user.yaml b/meet-ce/backend/openapi/components/responses/internal/success-delete-user.yaml new file mode 100644 index 00000000..e420d5fd --- /dev/null +++ b/meet-ce/backend/openapi/components/responses/internal/success-delete-user.yaml @@ -0,0 +1,10 @@ +description: User deleted successfully +content: + application/json: + schema: + type: object + properties: + message: + type: string + example: + message: User 'alice_smith' deleted successfully diff --git a/meet-ce/backend/openapi/components/responses/internal/success-get-me.yaml b/meet-ce/backend/openapi/components/responses/internal/success-get-me.yaml new file mode 100644 index 00000000..2bdfe3ee --- /dev/null +++ b/meet-ce/backend/openapi/components/responses/internal/success-get-me.yaml @@ -0,0 +1,5 @@ +description: Successfully retrieved authenticated user info +content: + application/json: + schema: + $ref: '../../schemas/internal/meet-user.yaml' diff --git a/meet-ce/backend/openapi/components/responses/internal/success-get-room-member-role.yaml b/meet-ce/backend/openapi/components/responses/internal/success-get-room-member-role.yaml deleted file mode 100644 index 19e125b9..00000000 --- a/meet-ce/backend/openapi/components/responses/internal/success-get-room-member-role.yaml +++ /dev/null @@ -1,5 +0,0 @@ -description: Successfully retrieved the room role and associated permissions -content: - application/json: - schema: - $ref: '../../schemas/internal/room-member-role-permissions.yaml' diff --git a/meet-ce/backend/openapi/components/responses/internal/success-get-room-member-roles.yaml b/meet-ce/backend/openapi/components/responses/internal/success-get-room-member-roles.yaml deleted file mode 100644 index eef4ea5e..00000000 --- a/meet-ce/backend/openapi/components/responses/internal/success-get-room-member-roles.yaml +++ /dev/null @@ -1,38 +0,0 @@ -description: Successfully retrieved all roles and associated permissions in a room -content: - application/json: - schema: - type: array - items: - $ref: '../../schemas/internal/room-member-role-permissions.yaml' - example: - - role: 'moderator' - permissions: - livekit: - roomJoin: true - room: 'room-123' - canPublish: true - canSubscribe: true - canPublishData: true - canUpdateOwnMetadata: true - openvidu: - canRecord: true - canRetrieveRecordings: true - canDeleteRecordings: true - canChat: true - canChangeVirtualBackground: true - - role: 'speaker' - permissions: - livekit: - roomJoin: true - room: 'room-123' - canPublish: true - canSubscribe: true - canPublishData: true - canUpdateOwnMetadata: true - openvidu: - canRecord: false - canRetrieveRecordings: true - canDeleteRecordings: false - canChat: true - canChangeVirtualBackground: true diff --git a/meet-ce/backend/openapi/components/responses/internal/success-get-profile.yaml b/meet-ce/backend/openapi/components/responses/internal/success-get-user.yaml similarity index 68% rename from meet-ce/backend/openapi/components/responses/internal/success-get-profile.yaml rename to meet-ce/backend/openapi/components/responses/internal/success-get-user.yaml index 1ee87ee6..62744cdf 100644 --- a/meet-ce/backend/openapi/components/responses/internal/success-get-profile.yaml +++ b/meet-ce/backend/openapi/components/responses/internal/success-get-user.yaml @@ -1,4 +1,4 @@ -description: Successfully retrieved user profile +description: User retrieved successfully content: application/json: schema: diff --git a/meet-ce/backend/openapi/components/responses/internal/success-get-users.yaml b/meet-ce/backend/openapi/components/responses/internal/success-get-users.yaml new file mode 100644 index 00000000..692023d3 --- /dev/null +++ b/meet-ce/backend/openapi/components/responses/internal/success-get-users.yaml @@ -0,0 +1,40 @@ +description: Successfully retrieved the list of users +content: + application/json: + schema: + type: object + properties: + users: + type: array + items: + $ref: '../../schemas/internal/meet-user.yaml' + pagination: + $ref: '../../schemas/meet-pagination.yaml' + examples: + multiple_users: + summary: Response with multiple users + value: + users: + - userId: 'admin' + name: 'Admin' + role: 'admin' + - userId: 'alice_smith' + name: 'Alice Smith' + role: 'user' + - userId: 'bob_jones' + name: 'Bob Jones' + role: 'room_member' + pagination: + nextPageToken: 'eyJvZmZzZXQiOjEwfQ==' + isTruncated: true + maxItems: 3 + single_page: + summary: Response with all users in a single page + value: + users: + - userId: 'admin' + name: 'Admin' + role: 'admin' + pagination: + isTruncated: false + maxItems: 10 diff --git a/meet-ce/backend/openapi/components/responses/success-add-room-member.yaml b/meet-ce/backend/openapi/components/responses/success-add-room-member.yaml new file mode 100644 index 00000000..885f251d --- /dev/null +++ b/meet-ce/backend/openapi/components/responses/success-add-room-member.yaml @@ -0,0 +1,12 @@ +description: Room member added successfully +content: + application/json: + schema: + $ref: '../schemas/meet-room-member.yaml' +headers: + Location: + description: URL of the newly added room member + schema: + type: string + format: uri + example: https://your-api.com/api/v1/rooms/room-123/members/abc123 diff --git a/meet-ce/backend/openapi/components/responses/success-delete-room-member.yaml b/meet-ce/backend/openapi/components/responses/success-delete-room-member.yaml new file mode 100644 index 00000000..bd6319fd --- /dev/null +++ b/meet-ce/backend/openapi/components/responses/success-delete-room-member.yaml @@ -0,0 +1,10 @@ +description: Successfull deletion of the room member +content: + application/json: + schema: + type: object + properties: + message: + type: string + example: + message: Member 'abc123' deleted successfully from room 'room-123' diff --git a/meet-ce/backend/openapi/components/responses/success-get-room-member.yaml b/meet-ce/backend/openapi/components/responses/success-get-room-member.yaml new file mode 100644 index 00000000..293618ef --- /dev/null +++ b/meet-ce/backend/openapi/components/responses/success-get-room-member.yaml @@ -0,0 +1,5 @@ +description: Success response for retrieving a room member info +content: + application/json: + schema: + $ref: '../schemas/meet-room-member.yaml' diff --git a/meet-ce/backend/openapi/components/responses/success-get-room-members.yaml b/meet-ce/backend/openapi/components/responses/success-get-room-members.yaml new file mode 100644 index 00000000..b6e82d1c --- /dev/null +++ b/meet-ce/backend/openapi/components/responses/success-get-room-members.yaml @@ -0,0 +1,75 @@ +description: Successfully retrieved the list of room members +content: + application/json: + schema: + type: object + properties: + members: + type: array + items: + $ref: '../schemas/meet-room-member.yaml' + pagination: + $ref: '../schemas/meet-pagination.yaml' + + examples: + complete_member_details: + summary: Full room member details response with multiple members + value: + members: + - memberId: 'alice_smith' + name: 'Alice Smith' + accessUrl: 'http://localhost:6080/room/room-123' + baseRole: 'moderator' + customPermissions: + canEndMeeting: false + effectivePermissions: + canRecord: true + canRetrieveRecordings: true + canDeleteRecordings: true + canJoinMeeting: true + canShareAccessLinks: true + canMakeModerator: true + canKickParticipants: true + canEndMeeting: false + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + - memberId: 'ext-abc123' + name: 'Bob' + accessUrl: 'http://localhost:6080/room/room-123?secret=ext-abc123' + baseRole: 'speaker' + customPermissions: + canShareScreen: false + canRecord: true + effectivePermissions: + canRecord: true + canRetrieveRecordings: true + canDeleteRecordings: false + canJoinMeeting: true + canShareAccessLinks: false + canMakeModerator: false + canKickParticipants: false + canEndMeeting: false + canPublishVideo: true + canPublishAudio: true + canShareScreen: false + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + pagination: + isTruncated: false + maxItems: 10 + fields=accessUrl,baseRole: + summary: Response with only accessUrl and baseRole for each member + value: + members: + - accessUrl: 'http://localhost:6080/room/room-123' + baseRole: 'moderator' + - accessUrl: 'http://localhost:6080/room/room-123?secret=ext-abc123' + baseRole: 'speaker' + pagination: + isTruncated: false + maxItems: 10 diff --git a/meet-ce/backend/openapi/components/responses/success-get-room.yaml b/meet-ce/backend/openapi/components/responses/success-get-room.yaml index 8cdd2eba..704a431e 100644 --- a/meet-ce/backend/openapi/components/responses/success-get-room.yaml +++ b/meet-ce/backend/openapi/components/responses/success-get-room.yaml @@ -9,30 +9,65 @@ content: value: roomId: 'room-123' roomName: 'room' + owner: 'admin' creationDate: 1620000000000 autoDeletionDate: 1900000000000 autoDeletionPolicy: withMeeting: when_meeting_ends withRecordings: close config: - chat: - enabled: true recording: enabled: false + chat: + enabled: true virtualBackground: enabled: true e2ee: enabled: false - moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456' - speakerUrl: 'http://localhost:6080/room/room-123?secret=654321' + roles: + moderator: + permissions: + canRecord: true + canRetrieveRecordings: true + canDeleteRecordings: true + canJoinMeeting: true + canShareAccessLinks: true + canMakeModerator: true + canKickParticipants: true + canEndMeeting: true + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + speaker: + permissions: + canRecord: false + canRetrieveRecordings: true + canDeleteRecordings: false + canJoinMeeting: true + canShareAccessLinks: false + canMakeModerator: false + canKickParticipants: false + canEndMeeting: false + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + anonymous: + moderator: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=123456' + speaker: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=654321' + accessUrl: 'http://localhost:6080/room/room-123' status: open meetingEndAction: none - fields=roomId: - summary: Response with only the roomId - value: - roomId: 'room-123' - fields=roomId,roomName,creationDate,autoDeletionDate,config: summary: Room details with roomId, roomName, creationDate, autoDeletionDate, and config value: @@ -41,17 +76,22 @@ content: creationDate: 1620000000000 autoDeletionDate: 1900000000000 config: - chat: - enabled: true recording: enabled: false + chat: + enabled: true virtualBackground: enabled: true e2ee: enabled: false - fields=moderatorUrl,speakerUrl: - summary: Response containing only moderator and speaker URLs + fields=anonymous: + summary: Response containing only anonymous access configuration value: - moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456' - speakerUrl: 'http://localhost:6080/room/room-123?secret=654321' + anonymous: + moderator: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=123456' + speaker: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=654321' diff --git a/meet-ce/backend/openapi/components/responses/success-get-rooms.yaml b/meet-ce/backend/openapi/components/responses/success-get-rooms.yaml index 5e9221c8..8c86e2ce 100644 --- a/meet-ce/backend/openapi/components/responses/success-get-rooms.yaml +++ b/meet-ce/backend/openapi/components/responses/success-get-rooms.yaml @@ -18,42 +18,122 @@ content: rooms: - roomId: 'room-123' roomName: 'room' + owner: 'admin' creationDate: 1620000000000 autoDeletionDate: 1900000000000 autoDeletionPolicy: withMeeting: when_meeting_ends withRecordings: close config: - chat: - enabled: true recording: enabled: false + chat: + enabled: true virtualBackground: enabled: true e2ee: enabled: false - moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456' - speakerUrl: 'http://localhost:6080/room/room-123?secret=654321' + roles: + moderator: + permissions: + canRecord: true + canRetrieveRecordings: true + canDeleteRecordings: true + canJoinMeeting: true + canShareAccessLinks: true + canMakeModerator: true + canKickParticipants: true + canEndMeeting: true + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + speaker: + permissions: + canRecord: false + canRetrieveRecordings: true + canDeleteRecordings: false + canJoinMeeting: true + canShareAccessLinks: false + canMakeModerator: false + canKickParticipants: false + canEndMeeting: false + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + anonymous: + moderator: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=123456' + speaker: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=654321' + accessUrl: 'http://localhost:6080/room/room-123' status: open meetingEndAction: none - roomId: 'room-456' roomName: 'room' + owner: 'alice_smith' creationDate: 1620001000000 autoDeletionDate: 1900000000000 autoDeletionPolicy: withMeeting: when_meeting_ends withRecordings: close config: - chat: - enabled: false recording: enabled: true + chat: + enabled: false virtualBackground: enabled: false e2ee: enabled: false - moderatorUrl: 'http://localhost:6080/room/room-456?secret=789012' - speakerUrl: 'http://localhost:6080/room/room-456?secret=210987' + roles: + moderator: + permissions: + canRecord: true + canRetrieveRecordings: true + canDeleteRecordings: false + canJoinMeeting: true + canShareAccessLinks: true + canMakeModerator: false + canKickParticipants: true + canEndMeeting: true + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + speaker: + permissions: + canRecord: true + canRetrieveRecordings: true + canDeleteRecordings: false + canJoinMeeting: true + canShareAccessLinks: false + canMakeModerator: false + canKickParticipants: false + canEndMeeting: false + canPublishVideo: true + canPublishAudio: true + canShareScreen: false + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + anonymous: + moderator: + enabled: false + accessUrl: 'http://localhost:6080/room/room-456?secret=789012' + speaker: + enabled: true + accessUrl: 'http://localhost:6080/room/room-456?secret=210987' + accessUrl: 'http://localhost:6080/room/room-456' status: open meetingEndAction: none pagination: @@ -78,10 +158,10 @@ content: creationDate: 1620000000000 autoDeletionDate: 1900000000000 config: - chat: - enabled: true recording: enabled: false + chat: + enabled: true virtualBackground: enabled: true e2ee: @@ -91,10 +171,10 @@ content: creationDate: 1620001000000 autoDeletionDate: 1900000000000 config: - chat: - enabled: false recording: enabled: true + chat: + enabled: false virtualBackground: enabled: false e2ee: @@ -103,15 +183,3 @@ content: isTruncated: true nextPageToken: 'abc123' maxItems: 10 - - fields=moderatorUrl,speakerUrl: - summary: Response containing only moderator and speaker URLs - value: - rooms: - - moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456' - speakerUrl: 'http://localhost:6080/room/room-123?secret=654321' - - moderatorUrl: 'http://localhost:6080/room/room-456?secret=789012' - speakerUrl: 'http://localhost:6080/room/room-456?secret=210987' - pagination: - isTruncated: false - maxItems: 10 diff --git a/meet-ce/backend/openapi/components/responses/success-room-process-deletion.yaml b/meet-ce/backend/openapi/components/responses/success-room-process-deletion.yaml index a1931dcc..6226987f 100644 --- a/meet-ce/backend/openapi/components/responses/success-room-process-deletion.yaml +++ b/meet-ce/backend/openapi/components/responses/success-room-process-deletion.yaml @@ -39,16 +39,58 @@ content: room: roomId: room-123 roomName: room + owner: 'admin' creationDate: 1620000000000 config: - chat: - enabled: true recording: enabled: false + chat: + enabled: true virtualBackground: enabled: true - moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456' - speakerUrl: 'http://localhost:6080/room/room-123?secret=654321' + e2ee: + enabled: false + roles: + moderator: + permissions: + canRecord: true + canRetrieveRecordings: true + canDeleteRecordings: true + canJoinMeeting: true + canShareAccessLinks: true + canMakeModerator: true + canKickParticipants: true + canEndMeeting: true + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + speaker: + permissions: + canRecord: false + canRetrieveRecordings: true + canDeleteRecordings: false + canJoinMeeting: true + canShareAccessLinks: false + canMakeModerator: false + canKickParticipants: false + canEndMeeting: false + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + anonymous: + moderator: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=123456' + speaker: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=654321' + accessUrl: 'http://localhost:6080/room/room-123' status: closed meetingEndAction: none room_with_active_meeting_and_recordings_deleted: @@ -62,15 +104,57 @@ content: room: roomId: room-123 roomName: room + owner: 'admin' creationDate: 1620000000000 config: - chat: - enabled: true recording: enabled: false + chat: + enabled: true virtualBackground: enabled: true - moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456' - speakerUrl: 'http://localhost:6080/room/room-123?secret=654321' + e2ee: + enabled: false + roles: + moderator: + permissions: + canRecord: true + canRetrieveRecordings: true + canDeleteRecordings: true + canJoinMeeting: true + canShareAccessLinks: true + canMakeModerator: true + canKickParticipants: true + canEndMeeting: true + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + speaker: + permissions: + canRecord: false + canRetrieveRecordings: true + canDeleteRecordings: false + canJoinMeeting: true + canShareAccessLinks: false + canMakeModerator: false + canKickParticipants: false + canEndMeeting: false + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + anonymous: + moderator: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=123456' + speaker: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=654321' + accessUrl: 'http://localhost:6080/room/room-123' status: active_meeting meetingEndAction: close diff --git a/meet-ce/backend/openapi/components/responses/success-room-schedule-deletion.yaml b/meet-ce/backend/openapi/components/responses/success-room-schedule-deletion.yaml index b83feebc..51d109c6 100644 --- a/meet-ce/backend/openapi/components/responses/success-room-schedule-deletion.yaml +++ b/meet-ce/backend/openapi/components/responses/success-room-schedule-deletion.yaml @@ -24,16 +24,58 @@ content: room: roomId: room-123 roomName: room + owner: 'admin' creationDate: 1620000000000 config: - chat: - enabled: true recording: enabled: false + chat: + enabled: true virtualBackground: enabled: true - moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456' - speakerUrl: 'http://localhost:6080/room/room-123?secret=654321' + e2ee: + enabled: false + roles: + moderator: + permissions: + canRecord: true + canRetrieveRecordings: true + canDeleteRecordings: true + canJoinMeeting: true + canShareAccessLinks: true + canMakeModerator: true + canKickParticipants: true + canEndMeeting: true + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + speaker: + permissions: + canRecord: false + canRetrieveRecordings: true + canDeleteRecordings: false + canJoinMeeting: true + canShareAccessLinks: false + canMakeModerator: false + canKickParticipants: false + canEndMeeting: false + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + anonymous: + moderator: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=123456' + speaker: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=654321' + accessUrl: 'http://localhost:6080/room/room-123' status: active_meeting meetingEndAction: delete room_with_active_meeting_and_recordings_scheduled_to_be_deleted: @@ -43,16 +85,58 @@ content: room: roomId: room-123 roomName: room + owner: 'admin' creationDate: 1620000000000 config: - chat: - enabled: true recording: enabled: false + chat: + enabled: true virtualBackground: enabled: true - moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456' - speakerUrl: 'http://localhost:6080/room/room-123?secret=654321' + e2ee: + enabled: false + roles: + moderator: + permissions: + canRecord: true + canRetrieveRecordings: true + canDeleteRecordings: true + canJoinMeeting: true + canShareAccessLinks: true + canMakeModerator: true + canKickParticipants: true + canEndMeeting: true + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + speaker: + permissions: + canRecord: false + canRetrieveRecordings: true + canDeleteRecordings: false + canJoinMeeting: true + canShareAccessLinks: false + canMakeModerator: false + canKickParticipants: false + canEndMeeting: false + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + anonymous: + moderator: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=123456' + speaker: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=654321' + accessUrl: 'http://localhost:6080/room/room-123' status: active_meeting meetingEndAction: delete room_with_active_meeting_scheduled_to_be_closed: @@ -62,6 +146,7 @@ content: room: roomId: room-123 roomName: room + owner: 'admin' creationDate: 1620000000000 config: chat: @@ -70,7 +155,48 @@ content: enabled: false virtualBackground: enabled: true - moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456' - speakerUrl: 'http://localhost:6080/room/room-123?secret=654321' + e2ee: + enabled: false + roles: + moderator: + permissions: + canRecord: true + canRetrieveRecordings: true + canDeleteRecordings: true + canJoinMeeting: true + canShareAccessLinks: true + canMakeModerator: true + canKickParticipants: true + canEndMeeting: true + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + speaker: + permissions: + canRecord: false + canRetrieveRecordings: true + canDeleteRecordings: false + canJoinMeeting: true + canShareAccessLinks: false + canMakeModerator: false + canKickParticipants: false + canEndMeeting: false + canPublishVideo: true + canPublishAudio: true + canShareScreen: true + canReadChat: true + canWriteChat: true + canChangeVirtualBackground: true + anonymous: + moderator: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=123456' + speaker: + enabled: true + accessUrl: 'http://localhost:6080/room/room-123?secret=654321' + accessUrl: 'http://localhost:6080/room/room-123' status: active_meeting meetingEndAction: close diff --git a/meet-ce/backend/openapi/components/responses/success-update-room-anonymous.yaml b/meet-ce/backend/openapi/components/responses/success-update-room-anonymous.yaml new file mode 100644 index 00000000..d739418f --- /dev/null +++ b/meet-ce/backend/openapi/components/responses/success-update-room-anonymous.yaml @@ -0,0 +1,10 @@ +description: Success response for updating room anonymous access configuration +content: + application/json: + schema: + type: object + properties: + message: + type: string + example: + message: Anonymous access config for room 'room-123' updated successfully diff --git a/meet-ce/backend/openapi/components/responses/success-update-room-member.yaml b/meet-ce/backend/openapi/components/responses/success-update-room-member.yaml new file mode 100644 index 00000000..0c00f0f9 --- /dev/null +++ b/meet-ce/backend/openapi/components/responses/success-update-room-member.yaml @@ -0,0 +1,5 @@ +description: Room member updated successfully +content: + application/json: + schema: + $ref: '../schemas/meet-room-member.yaml' diff --git a/meet-ce/backend/openapi/components/responses/success-update-room-roles.yaml b/meet-ce/backend/openapi/components/responses/success-update-room-roles.yaml new file mode 100644 index 00000000..23a41b64 --- /dev/null +++ b/meet-ce/backend/openapi/components/responses/success-update-room-roles.yaml @@ -0,0 +1,10 @@ +description: Success response for updating room roles configuration +content: + application/json: + schema: + type: object + properties: + message: + type: string + example: + message: Roles permissions for room 'room-123' updated successfully diff --git a/meet-ce/backend/openapi/components/schemas/internal/meet-user.yaml b/meet-ce/backend/openapi/components/schemas/internal/meet-user.yaml index 3bdae212..bce0803a 100644 --- a/meet-ce/backend/openapi/components/schemas/internal/meet-user.yaml +++ b/meet-ce/backend/openapi/components/schemas/internal/meet-user.yaml @@ -1,13 +1,21 @@ type: object properties: - username: + userId: type: string - example: 'admin' - description: The username of the authenticated user. - roles: - type: array - items: - type: string - enum: ['admin', 'user'] - example: ['admin', 'user'] - description: A list of roles assigned to the authenticated user. + example: 'alice_smith' + description: | + The unique identifier of the user. + name: + type: string + example: 'Alice Smith' + description: | + The display name (profile name) of the user. + role: + type: string + enum: ['admin', 'user', 'room_member'] + example: 'user' + description: | + The role assigned to the user. Available roles: + - admin: Has full control over the entire application (configuration, users, rooms, recordings, etc). + - user: Can create and manage their own created rooms and associated recordings. Can also access rooms they are a member of, but without management permissions. + - room_member: Can only access rooms (and recordings) they are a member of, without ability to create or manage rooms. diff --git a/meet-ce/backend/openapi/components/schemas/internal/room-member-role-permissions.yaml b/meet-ce/backend/openapi/components/schemas/internal/room-member-role-permissions.yaml deleted file mode 100644 index 68032014..00000000 --- a/meet-ce/backend/openapi/components/schemas/internal/room-member-role-permissions.yaml +++ /dev/null @@ -1,74 +0,0 @@ -type: object -properties: - role: - type: string - enum: ['moderator', 'speaker'] - description: | - A role that a user can have as a member of a room. - The role determines the permissions of the user in the room. - - `moderator`: Can manage the room resources and meeting participants. - - `speaker`: Can publish media streams to the meeting. - example: 'moderator' - permissions: - type: object - properties: - livekit: - type: object - properties: - roomJoin: - type: boolean - description: > - Indicates whether the participant can join a room. - example: true - room: - type: string - description: > - Unique identifier of the room to which the participant is assigned. - canPublish: - type: boolean - description: > - Indicates whether the participant can publish media streams to the room. - example: true - canSubscribe: - type: boolean - description: > - Indicates whether the participant can subscribe to media streams in the room. - example: true - canPublishData: - type: boolean - description: > - Indicates whether the participant can publish data messages to the room. - example: true - canUpdateOwnMetadata: - type: boolean - description: > - Indicates whether the participant can update their own metadata. - example: true - openvidu: - type: object - properties: - canRecord: - type: boolean - description: > - Indicates whether the user can record a meeting in the room. - example: true - canRetrieveRecordings: - type: boolean - description: > - Indicates whether the user can retrieve and play recordings of meetings in the room. - example: true - canDeleteRecordings: - type: boolean - description: > - Indicates whether the user can delete recordings of meetings in the room. - example: true - canChat: - type: boolean - description: > - Indicates whether the user can send and receive chat messages in the room. - example: true - canChangeVirtualBackground: - type: boolean - description: > - Indicates whether the user can change their own virtual background. - example: true diff --git a/meet-ce/backend/openapi/components/schemas/internal/user-credentials.yaml b/meet-ce/backend/openapi/components/schemas/internal/user-credentials.yaml deleted file mode 100644 index 6a12c2b9..00000000 --- a/meet-ce/backend/openapi/components/schemas/internal/user-credentials.yaml +++ /dev/null @@ -1,13 +0,0 @@ -type: object -required: - - username - - password -properties: - username: - type: string - description: The username of the user. - example: 'admin' - password: - type: string - description: The password of the user. - example: 'password123' \ No newline at end of file diff --git a/meet-ce/backend/openapi/components/schemas/meet-permissions.yaml b/meet-ce/backend/openapi/components/schemas/meet-permissions.yaml new file mode 100644 index 00000000..6b614e7c --- /dev/null +++ b/meet-ce/backend/openapi/components/schemas/meet-permissions.yaml @@ -0,0 +1,58 @@ +type: object +properties: + canRecord: + type: boolean + example: true + description: Can start/stop recording the meeting. + canRetrieveRecordings: + type: boolean + example: true + description: Can list and play recordings. + canDeleteRecordings: + type: boolean + example: false + description: Can delete recordings. + canJoinMeeting: + type: boolean + example: true + description: Can join the meeting. + canShareAccessLinks: + type: boolean + example: false + description: Can share access links to invite others. + canMakeModerator: + type: boolean + example: false + description: Can promote other participants to moderator role. + canKickParticipants: + type: boolean + example: false + description: Can remove other participants from the meeting. + canEndMeeting: + type: boolean + example: false + description: Can end the meeting for all participants. + canPublishVideo: + type: boolean + example: true + description: Can publish video in the meeting. + canPublishAudio: + type: boolean + example: true + description: Can publish audio in the meeting. + canShareScreen: + type: boolean + example: false + description: Can share screen in the meeting. + canReadChat: + type: boolean + example: true + description: Can read chat messages in the meeting. + canWriteChat: + type: boolean + example: true + description: Can send chat messages in the meeting. + canChangeVirtualBackground: + type: boolean + example: true + description: Can change the virtual background. diff --git a/meet-ce/backend/openapi/components/schemas/meet-room-anonymous-config.yaml b/meet-ce/backend/openapi/components/schemas/meet-room-anonymous-config.yaml new file mode 100644 index 00000000..e824804f --- /dev/null +++ b/meet-ce/backend/openapi/components/schemas/meet-room-anonymous-config.yaml @@ -0,0 +1,24 @@ +type: object +properties: + moderator: + type: object + properties: + enabled: + type: boolean + default: true + example: true + description: | + Enables or disables anonymous access for the moderator role. + speaker: + type: object + properties: + enabled: + type: boolean + default: true + example: true + description: | + Enables or disables anonymous access for the speaker role. +description: | + Configuration for anonymous access. + + Both moderator and speaker fields are optional. If not specified, current configuration will be maintained. diff --git a/meet-ce/backend/openapi/components/schemas/meet-room-member.yaml b/meet-ce/backend/openapi/components/schemas/meet-room-member.yaml new file mode 100644 index 00000000..e82a6841 --- /dev/null +++ b/meet-ce/backend/openapi/components/schemas/meet-room-member.yaml @@ -0,0 +1,53 @@ +type: object +properties: + memberId: + type: string + example: 'alice_smith' + description: | + The unique identifier of the room member. + + - For internal users: This is set to the userId of the linked Meet user account. + - For external users: This is an automatically generated unique identifier starting from 'ext-'. + name: + type: string + example: 'Alice Smith' + description: | + The display name for the participant when joining the meeting with this member access. + + - For OpenVidu Meet users, this is their profile name. + - For external users, this is the assigned name. + accessUrl: + type: string + format: uri + example: 'http://localhost:6080/room/room-123' + description: > + The unique URL for this member to access the room. This URL is different from the moderator and speaker URLs + and provides access with the specific permissions assigned to this member. + baseRole: + type: string + enum: + - moderator + - speaker + example: 'speaker' + description: | + The base role that defines the default permissions for this member. Options are: + - moderator: By default, has full permissions to manage the room and meeting. + - speaker: By default, has permissions to publish audio and video streams. + + Individual permissions can be overridden through the customPermissions object. + customPermissions: + type: object + additionalProperties: + type: boolean + example: + canShareScreen: false + canRecord: true + description: | + Custom permission overrides for this member. This object contains only the permissions that differ from the base role defaults. + + Each property is a permission name with a boolean value indicating whether the permission is granted or denied. + effectivePermissions: + $ref: meet-permissions.yaml + description: > + The complete set of effective permissions for this member. This object is calculated by applying the customPermissions + overrides to the base role defaults, resulting in the final permissions that will be enforced. diff --git a/meet-ce/backend/openapi/components/schemas/meet-room-options.yaml b/meet-ce/backend/openapi/components/schemas/meet-room-options.yaml index 0c0ac3e3..2b6651a5 100644 --- a/meet-ce/backend/openapi/components/schemas/meet-room-options.yaml +++ b/meet-ce/backend/openapi/components/schemas/meet-room-options.yaml @@ -58,3 +58,22 @@ properties: $ref: './meet-room-config.yaml#/MeetRoomConfig' description: > The config for the room. These config will be used to configure the room's settings. + roles: + $ref: meet-room-roles-config.yaml + description: | + Configuration for role permissions. + + By default (if not specified), default permissions will be used for both moderator and speaker roles: + - Moderator: Full permissions to manage the room and meeting. + - Speaker: Permissions to publish audio and video streams. + + You can customize this by providing partial permissions for each role (only specify the permissions you want to override). + anonymous: + $ref: meet-room-anonymous-config.yaml + description: | + Configuration for anonymous access to the room. + + By default (if not specified), anonymous access is enabled for both moderators and speakers. + You can customize this behavior by disabling anonymous access for specific roles (moderator/speaker) with per-role `enabled: false` + + Permissions for anonymous users are determined by the room's role permissions. diff --git a/meet-ce/backend/openapi/components/schemas/meet-room-roles-config.yaml b/meet-ce/backend/openapi/components/schemas/meet-room-roles-config.yaml new file mode 100644 index 00000000..19ddec05 --- /dev/null +++ b/meet-ce/backend/openapi/components/schemas/meet-room-roles-config.yaml @@ -0,0 +1,40 @@ +type: object +properties: + moderator: + type: object + properties: + permissions: + type: object + additionalProperties: + type: boolean + example: + canRecord: false + canKickParticipants: false + description: | + Partial permissions object for the moderator role. + Only specify the permissions you want to override from the default or previously configured moderator permissions. + Each property should be a permission name (e.g., 'canRecord', 'canShareScreen') with a boolean value. + + For the complete list of all available permissions, see the full permissions schema: + [MeetPermissions](#/schemas/MeetPermissions) + speaker: + type: object + properties: + permissions: + type: object + additionalProperties: + type: boolean + example: + canShareScreen: false + description: | + Partial permissions object for the speaker role. + Only specify the permissions you want to override from the default or previously configured speaker permissions. + Each property should be a permission name (e.g., 'canRecord', 'canShareScreen') with a boolean value. + + For the complete list of all available permissions, see the full permissions schema: + [MeetPermissions](#/schemas/MeetPermissions) +description: | + Configuration for role permissions. + + Both moderator and speaker fields are optional. If not specified, current permissions will be maintained. + For permissions, only specify the ones you want to change. diff --git a/meet-ce/backend/openapi/components/schemas/meet-room.yaml b/meet-ce/backend/openapi/components/schemas/meet-room.yaml index 217bf919..4bdf7581 100644 --- a/meet-ce/backend/openapi/components/schemas/meet-room.yaml +++ b/meet-ce/backend/openapi/components/schemas/meet-room.yaml @@ -6,14 +6,18 @@ properties: description: > The unique identifier of the room. This ID is generated by combining the room name with a unique identifier. roomName: - type: [string, 'null'] - maxLength: 50 + type: string example: 'room' - default: 'Room' description: | The display name of the room, used to identify it in a user-friendly way. This value does not need to be unique. + owner: + type: string + example: 'alice_smith' + description: | + The userId of the internal Meet user who owns this room. - Maximum length: 50 characters. If not provided, the default value "Room" will be used. + If the room was created by a registered Meet user, this will be their userId. + If the room was created via the REST API using an API key, this will be the userId of the global admin (root user). creationDate: type: number example: 1620000000000 @@ -31,10 +35,10 @@ properties: If not set, the room remains active until manually deleted. autoDeletionPolicy: - type: object description: > Policy for automatic deletion of the room and its contents. This includes settings for how the room should be handled when certain conditions are met. + type: object properties: withMeeting: type: string @@ -67,18 +71,68 @@ properties: # description: > # The maximum number of participants allowed in the room. If the number of participants exceeds # this limit, new participants will not be allowed to join. - moderatorUrl: - type: string - example: 'http://localhost:6080/room/room-123?secret=123456' + roles: description: > - The URL for moderator room members to access the room. The moderator role has special permissions to manage the - room resources and meeting participants. - speakerUrl: - type: string - example: 'http://localhost:6080/room/room-123?secret=654321' + Roles for the room. Defines the complete permissions for moderator and speaker roles. + type: object + properties: + moderator: + type: object + properties: + permissions: + $ref: meet-permissions.yaml + description: > + The complete set of permissions for the moderator role. These define what moderators can do in the meeting. + speaker: + type: object + properties: + permissions: + $ref: meet-permissions.yaml + description: > + The complete set of permissions for the speaker role. These define what speakers can do in the meeting. + anonymous: description: > - The URL for speaker room members to access the room. The speaker role has permissions to publish audio and - video streams to the meeting. + Configuration for anonymous access to the room. Defines which roles have anonymous access enabled and their access URLs. + type: object + properties: + moderator: + type: object + properties: + enabled: + type: boolean + example: true + description: > + Whether anonymous access with moderator role is enabled. + accessUrl: + type: string + format: uri + example: 'http://localhost:6080/room/room-123?secret=123456' + description: > + The URL for anonymous moderators to access the room. + speaker: + type: object + properties: + enabled: + type: boolean + example: true + description: > + Whether anonymous access with speaker role is enabled. + accessUrl: + type: string + format: uri + example: 'http://localhost:6080/room/room-123?secret=654321' + description: > + The URL for anonymous speakers to access the room. + accessUrl: + type: string + format: uri + example: 'http://localhost:6080/room/room-123' + description: | + The general access URL for authenticated users to join the room. + + This URL should be used by: + - The room owner (internal Meet user who created the room) + - Internal Meet users who are members of the room status: type: string enum: diff --git a/meet-ce/backend/openapi/openvidu-meet-api.yaml b/meet-ce/backend/openapi/openvidu-meet-api.yaml index 1507e9a8..4e7e73b8 100644 --- a/meet-ce/backend/openapi/openvidu-meet-api.yaml +++ b/meet-ce/backend/openapi/openvidu-meet-api.yaml @@ -15,8 +15,16 @@ paths: $ref: './paths/rooms.yaml#/~1rooms~1{roomId}' /rooms/{roomId}/config: $ref: './paths/rooms.yaml#/~1rooms~1{roomId}~1config' + /rooms/{roomId}/roles: + $ref: './paths/rooms.yaml#/~1rooms~1{roomId}~1roles' + /rooms/{roomId}/anonymous: + $ref: './paths/rooms.yaml#/~1rooms~1{roomId}~1anonymous' /rooms/{roomId}/status: $ref: './paths/rooms.yaml#/~1rooms~1{roomId}~1status' + /rooms/{roomId}/members: + $ref: './paths/rooms.yaml#/~1rooms~1{roomId}~1members' + /rooms/{roomId}/members/{memberId}: + $ref: './paths/rooms.yaml#/~1rooms~1{roomId}~1members~1{memberId}' /recordings: $ref: './paths/recordings.yaml#/~1recordings' /recordings/download: @@ -33,10 +41,12 @@ components: schemas: MeetRoom: $ref: components/schemas/meet-room.yaml - MeetRoomOptions: - $ref: components/schemas/meet-room-options.yaml MeetRoomConfig: $ref: './components/schemas/meet-room-config.yaml#/MeetRoomConfig' + MeetRoomMember: + $ref: components/schemas/meet-room-member.yaml + MeetPermissions: + $ref: components/schemas/meet-permissions.yaml MeetRecording: $ref: components/schemas/meet-recording.yaml MeetWebhookEvent: diff --git a/meet-ce/backend/openapi/openvidu-meet-internal-api.yaml b/meet-ce/backend/openapi/openvidu-meet-internal-api.yaml index bc70a08d..57756e53 100644 --- a/meet-ce/backend/openapi/openvidu-meet-internal-api.yaml +++ b/meet-ce/backend/openapi/openvidu-meet-internal-api.yaml @@ -16,10 +16,14 @@ paths: $ref: './paths/internal/auth.yaml#/~1auth~1refresh' /api-keys: $ref: './paths/internal/api-keys.yaml#/~1auth~1api-keys' - /users/profile: - $ref: './paths/internal/users.yaml#/~1users~1profile' + /users: + $ref: './paths/internal/users.yaml#/~1users' + /users/me: + $ref: './paths/internal/users.yaml#/~1users~1me' /users/change-password: $ref: './paths/internal/users.yaml#/~1users~1change-password' + /users/{userId}: + $ref: './paths/internal/users.yaml#/~1users~1{userId}' /config/webhooks: $ref: './paths/internal/meet-global-config.yaml#/~1config~1webhooks' /config/webhooks/test: @@ -30,10 +34,6 @@ paths: $ref: './paths/internal/meet-global-config.yaml#/~1config~1rooms~1appearance' /rooms/{roomId}/token: $ref: './paths/internal/rooms.yaml#/~1rooms~1{roomId}~1token' - /rooms/{roomId}/roles: - $ref: './paths/internal/rooms.yaml#/~1rooms~1{roomId}~1roles' - /rooms/{roomId}/roles/{secret}: - $ref: './paths/internal/rooms.yaml#/~1rooms~1{roomId}~1roles~1{secret}' /recordings: $ref: './paths/internal/recordings.yaml#/~1recordings' /recordings/{recordingId}/stop: @@ -59,17 +59,13 @@ components: $ref: components/schemas/internal/webhooks-config.yaml SecurityConfig: $ref: components/schemas/internal/global-security-config.yaml + RoomsAppearanceConfig: + $ref: components/schemas/internal/rooms-appearance-config.yaml MeetRoom: $ref: components/schemas/meet-room.yaml - MeetRoomOptions: - $ref: components/schemas/meet-room-options.yaml - MeetRoomConfig: - $ref: components/schemas/meet-room-config.yaml#/MeetRoomConfig - MeetRoomMemberRoleAndPermissions: - $ref: components/schemas/internal/room-member-role-permissions.yaml - MeetAnalytics: - $ref: components/schemas/internal/meet-analytics.yaml MeetRecording: $ref: components/schemas/meet-recording.yaml + MeetAnalytics: + $ref: components/schemas/internal/meet-analytics.yaml Error: $ref: components/schemas/error.yaml diff --git a/meet-ce/backend/openapi/paths/internal/rooms.yaml b/meet-ce/backend/openapi/paths/internal/rooms.yaml index 2959e1d3..8a353ae7 100644 --- a/meet-ce/backend/openapi/paths/internal/rooms.yaml +++ b/meet-ce/backend/openapi/paths/internal/rooms.yaml @@ -29,47 +29,3 @@ $ref: '../../components/responses/validation-error.yaml' '500': $ref: '../../components/responses/internal-server-error.yaml' -/rooms/{roomId}/roles: - get: - operationId: getRoomMemberRolesAndPermissions - summary: Get room member roles and permissions - description: > - Retrieves the roles and associated permissions that a user can have as a member of a specified OpenVidu Meet room. - tags: - - Internal API - Rooms - parameters: - - $ref: '../../components/parameters/room-id-path.yaml' - responses: - '200': - $ref: '../../components/responses/internal/success-get-room-member-roles.yaml' - '404': - $ref: '../../components/responses/error-room-not-found.yaml' - '422': - $ref: '../../components/responses/validation-error.yaml' - '500': - $ref: '../../components/responses/internal-server-error.yaml' -/rooms/{roomId}/roles/{secret}: - get: - operationId: getRoomRoleAndPermissions - summary: Get room role and permissions - description: | - Retrieves the role and associated permissions that a user will have as a member of a specified OpenVidu Meet room - when using the URL that contains the given secret value. - - This endpoint is useful for checking the user's role and permissions before accessing the room. - tags: - - Internal API - Rooms - parameters: - - $ref: '../../components/parameters/room-id-path.yaml' - - $ref: '../../components/parameters/internal/secret.yaml' - responses: - '200': - $ref: '../../components/responses/internal/success-get-room-member-role.yaml' - '400': - $ref: '../../components/responses/internal/error-invalid-room-secret.yaml' - '404': - $ref: '../../components/responses/error-room-not-found.yaml' - '422': - $ref: '../../components/responses/validation-error.yaml' - '500': - $ref: '../../components/responses/internal-server-error.yaml' diff --git a/meet-ce/backend/openapi/paths/internal/users.yaml b/meet-ce/backend/openapi/paths/internal/users.yaml index d94b7847..e44445b2 100644 --- a/meet-ce/backend/openapi/paths/internal/users.yaml +++ b/meet-ce/backend/openapi/paths/internal/users.yaml @@ -1,16 +1,67 @@ -/users/profile: +/users: + post: + operationId: createUser + summary: Create a new user + description: | + Creates a new user account in the system. + + The userId must be unique. If a user with the specified userId already exists, + the request will fail with a conflict error. + tags: + - Internal API - Users + security: + - accessTokenHeader: [] + requestBody: + $ref: '../../components/requestBodies/internal/create-user-request.yaml' + responses: + '201': + $ref: '../../components/responses/internal/success-create-user.yaml' + '401': + $ref: '../../components/responses/unauthorized-error.yaml' + '403': + $ref: '../../components/responses/forbidden-error.yaml' + '409': + $ref: '../../components/responses/internal/error-userId-already-exists.yaml' + '422': + $ref: '../../components/responses/validation-error.yaml' + '500': + $ref: '../../components/responses/internal-server-error.yaml' get: - operationId: getUserProfile - summary: Get user profile + operationId: getUsers + summary: Get all users description: > - Retrieves the profile information of the authenticated user. + Retrieves a paginated list of all users in the system. + tags: + - Internal API - Users + security: + - accessTokenHeader: [] + parameters: + - $ref: '../../components/parameters/max-items.yaml' + - $ref: '../../components/parameters/next-page-token.yaml' + responses: + '200': + $ref: '../../components/responses/internal/success-get-users.yaml' + '401': + $ref: '../../components/responses/unauthorized-error.yaml' + '403': + $ref: '../../components/responses/forbidden-error.yaml' + '422': + $ref: '../../components/responses/validation-error.yaml' + '500': + $ref: '../../components/responses/internal-server-error.yaml' +/users/me: + get: + operationId: getMe + summary: Get authenticated user + description: > + Retrieves the details of the authenticated user. tags: - Internal API - Users security: - accessTokenHeader: [] responses: '200': - $ref: '../../components/responses/internal/success-get-profile.yaml' + $ref: '../../components/responses/internal/success-get-me.yaml' '401': $ref: '../../components/responses/unauthorized-error.yaml' /users/change-password: @@ -36,3 +87,55 @@ $ref: '../../components/responses/validation-error.yaml' '500': $ref: '../../components/responses/internal-server-error.yaml' +/users/{userId}: + get: + operationId: getUser + summary: Get a user + description: > + Retrieves the details of a specific user by their userId. + tags: + - Internal API - Users + security: + - accessTokenHeader: [] + parameters: + - $ref: '../../components/parameters/internal/userId-path.yaml' + responses: + '200': + $ref: '../../components/responses/internal/success-get-user.yaml' + '401': + $ref: '../../components/responses/unauthorized-error.yaml' + '403': + $ref: '../../components/responses/forbidden-error.yaml' + '404': + $ref: '../../components/responses/internal/error-user-not-found.yaml' + '422': + $ref: '../../components/responses/validation-error.yaml' + '500': + $ref: '../../components/responses/internal-server-error.yaml' + delete: + operationId: deleteUser + summary: Delete a user + description: | + Deletes a user from the system. + + This operation will remove the user account and may affect rooms and resources + associated with this user. + tags: + - Internal API - Users + security: + - accessTokenHeader: [] + parameters: + - $ref: '../../components/parameters/internal/userId-path.yaml' + responses: + '200': + $ref: '../../components/responses/internal/success-delete-user.yaml' + '401': + $ref: '../../components/responses/unauthorized-error.yaml' + '403': + $ref: '../../components/responses/forbidden-error.yaml' + '404': + $ref: '../../components/responses/internal/error-user-not-found.yaml' + '422': + $ref: '../../components/responses/validation-error.yaml' + '500': + $ref: '../../components/responses/internal-server-error.yaml' diff --git a/meet-ce/backend/openapi/paths/rooms.yaml b/meet-ce/backend/openapi/paths/rooms.yaml index dc14f829..c662f7f2 100644 --- a/meet-ce/backend/openapi/paths/rooms.yaml +++ b/meet-ce/backend/openapi/paths/rooms.yaml @@ -240,3 +240,209 @@ $ref: '../components/responses/validation-error.yaml' '500': $ref: '../components/responses/internal-server-error.yaml' +/rooms/{roomId}/roles: + put: + operationId: updateRoomRoles + summary: Update roles permissions for a room + description: | + Updates the permissions by role for the specified room. + + You can customize permissions for moderator and/or speaker roles. + Only specify the permissions you want to change from the current configuration. + tags: + - OpenVidu Meet - Rooms + security: + - apiKeyHeader: [] + - accessTokenHeader: [] + parameters: + - $ref: '../components/parameters/room-id-path.yaml' + requestBody: + $ref: '../components/requestBodies/update-room-roles-request.yaml' + responses: + '200': + $ref: '../components/responses/success-update-room-roles.yaml' + '401': + $ref: '../components/responses/unauthorized-error.yaml' + '403': + $ref: '../components/responses/forbidden-error.yaml' + '404': + $ref: '../components/responses/error-room-not-found.yaml' + '422': + $ref: '../components/responses/validation-error.yaml' + '500': + $ref: '../components/responses/internal-server-error.yaml' +/rooms/{roomId}/anonymous: + put: + operationId: updateRoomAnonymous + summary: Update anonymous access config for a room + description: | + Updates the anonymous access configuration for the specified room. + + This allows you to enable or disable anonymous access for specific roles (moderator/speaker). + tags: + - OpenVidu Meet - Rooms + security: + - apiKeyHeader: [] + - accessTokenHeader: [] + parameters: + - $ref: '../components/parameters/room-id-path.yaml' + requestBody: + $ref: '../components/requestBodies/update-room-anonymous-request.yaml' + responses: + '200': + $ref: '../components/responses/success-update-room-anonymous.yaml' + '401': + $ref: '../components/responses/unauthorized-error.yaml' + '403': + $ref: '../components/responses/forbidden-error.yaml' + '404': + $ref: '../components/responses/error-room-not-found.yaml' + '422': + $ref: '../components/responses/validation-error.yaml' + '500': + $ref: '../components/responses/internal-server-error.yaml' +/rooms/{roomId}/members: + post: + operationId: addRoomMember + summary: Add a member to a room + description: | + Adds a new member to the specified room with custom permissions. + + Each member receives a unique access URL that is different from the moderator and speaker URLs. + The member's permissions are based on a base role (moderator or speaker) with optional overrides. + + This allows fine-grained control over what each specific participant can do in the meeting. + tags: + - OpenVidu Meet - Rooms + security: + - apiKeyHeader: [] + parameters: + - $ref: '../components/parameters/room-id-path.yaml' + requestBody: + $ref: '../components/requestBodies/add-room-member-request.yaml' + responses: + '201': + $ref: '../components/responses/success-add-room-member.yaml' + '401': + $ref: '../components/responses/unauthorized-error.yaml' + '403': + $ref: '../components/responses/forbidden-error.yaml' + '404': + $ref: '../components/responses/error-room-not-found.yaml' + '422': + $ref: '../components/responses/validation-error.yaml' + '500': + $ref: '../components/responses/internal-server-error.yaml' + get: + operationId: getRoomMembers + summary: Get all members of a room + description: > + Retrieves a paginated list of all members in the specified room. + Each member has custom access URLs and permissions that can differ from the default moderator and speaker roles. + tags: + - OpenVidu Meet - Rooms + security: + - apiKeyHeader: [] + parameters: + - $ref: '../components/parameters/room-id-path.yaml' + - $ref: '../components/parameters/room-member-fields.yaml' + - $ref: '../components/parameters/max-items.yaml' + - $ref: '../components/parameters/next-page-token.yaml' + responses: + '200': + $ref: '../components/responses/success-get-room-members.yaml' + '401': + $ref: '../components/responses/unauthorized-error.yaml' + '403': + $ref: '../components/responses/forbidden-error.yaml' + '404': + $ref: '../components/responses/error-room-not-found.yaml' + '422': + $ref: '../components/responses/validation-error.yaml' + '500': + $ref: '../components/responses/internal-server-error.yaml' +/rooms/{roomId}/members/{memberId}: + get: + operationId: getRoomMember + summary: Get a room member + description: > + Retrieves the details of a specific room member by their member ID. + tags: + - OpenVidu Meet - Rooms + security: + - apiKeyHeader: [] + - roomMemberTokenHeader: [] + parameters: + - $ref: '../components/parameters/room-id-path.yaml' + - $ref: '../components/parameters/member-id-path.yaml' + responses: + '200': + $ref: '../components/responses/success-get-room-member.yaml' + '401': + $ref: '../components/responses/unauthorized-error.yaml' + '403': + $ref: '../components/responses/forbidden-error.yaml' + '404': + $ref: '../components/responses/error-room-member-not-found.yaml' + '422': + $ref: '../components/responses/validation-error.yaml' + '500': + $ref: '../components/responses/internal-server-error.yaml' + put: + operationId: updateRoomMember + summary: Update a room member + description: | + Updates the permissions and/or base role of a specific room member. + + You can modify the member's base role and custom permission overrides. + The effective permissions will be recalculated based on the new base role and custom permissions. + tags: + - OpenVidu Meet - Rooms + security: + - apiKeyHeader: [] + parameters: + - $ref: '../components/parameters/room-id-path.yaml' + - $ref: '../components/parameters/member-id-path.yaml' + requestBody: + $ref: '../components/requestBodies/update-room-member-request.yaml' + responses: + '200': + $ref: '../components/responses/success-update-room-member.yaml' + '401': + $ref: '../components/responses/unauthorized-error.yaml' + '403': + $ref: '../components/responses/forbidden-error.yaml' + '404': + $ref: '../components/responses/error-room-member-not-found.yaml' + '422': + $ref: '../components/responses/validation-error.yaml' + '500': + $ref: '../components/responses/internal-server-error.yaml' + delete: + operationId: deleteRoomMember + summary: Delete a room member + description: | + Removes a member from the specified room, revoking their access. + + If the member is currently in an active meeting, they will be immediately kicked out. + The member's access URL will no longer be valid after deletion. + tags: + - OpenVidu Meet - Rooms + security: + - apiKeyHeader: [] + parameters: + - $ref: '../components/parameters/room-id-path.yaml' + - $ref: '../components/parameters/member-id-path.yaml' + responses: + '200': + $ref: '../components/responses/success-delete-room-member.yaml' + '401': + $ref: '../components/responses/unauthorized-error.yaml' + '403': + $ref: '../components/responses/forbidden-error.yaml' + '404': + $ref: '../components/responses/error-room-member-not-found.yaml' + '422': + $ref: '../components/responses/validation-error.yaml' + '500': + $ref: '../components/responses/internal-server-error.yaml'