List and revoke portal members under Admin → Users

GET /cloud/members asks the portal who it admits to this instance and
marks those with a local user. DELETE /cloud/members/{portal_sub} takes a
membership back. Admin → Users lists the members who have not arrived
yet, with Revoke, which also surfaces a membership left standing when a
local user was deleted while the portal could not be told.
This commit is contained in:
2026-10-15 10:31:25 +02:00
parent 8b47b32d3f
commit 1d66b30d0c
8 changed files with 369 additions and 2 deletions
+28
View File
@@ -3038,6 +3038,34 @@ export const PlacementSchema = {
description: "Where a widget sits in its section's grid, in grid units."
} as const;
export const PortalMemberSchema = {
properties: {
user_id: {
type: 'string',
title: 'User Id'
},
email: {
type: 'string',
title: 'Email'
},
local_user_id: {
anyOf: [
{
type: 'string',
format: 'uuid'
},
{
type: 'null'
}
],
title: 'Local User Id'
}
},
type: 'object',
required: ['user_id', 'email'],
title: 'PortalMember'
} as const;
export const PrivateUserCreateSchema = {
properties: {
email: {
File diff suppressed because one or more lines are too long
+14
View File
@@ -1045,6 +1045,12 @@ export type Placement = {
h?: number;
};
export type PortalMember = {
user_id: string;
email: string;
local_user_id?: (string | null);
};
export type PrivateUserCreate = {
email: string;
password: string;
@@ -1630,6 +1636,14 @@ export type CloudAddRemoteUserData = {
export type CloudAddRemoteUserResponse = (UserPublic);
export type CloudReadMembersResponse = (Array<PortalMember>);
export type CloudRevokeMemberData = {
portalSub: string;
};
export type CloudRevokeMemberResponse = (Message);
export type CloudDisconnectResponse = (Message);
export type ConnectorsReadConnectorStateData = {