/** * Tipos dos endpoints de diagnóstico de acesso — `/api/v1/security/diagnostics/*`. * *
Espelham os records do `archbase-security` 3.1.0 campo a campo. Onde o nome aqui * diverge do backend, é bug: a tela existe para responder "por que esta pessoa não passou?", * e ela só responde isso se o que chega for exatamente o que o avaliador decidiu. */ /** * Os cinco portões do core de autorização, na ordem em que são avaliados. * *
A regra que organiza o modelo: IDENTITY a LEVEL só sabem NEGAR; só GRANT CONCEDE. * É por isso que a tela de simulação mostra a cadeia inteira em vez de um sim/não — saber * em qual portão parou é o que diz o que precisa ser mudado. */ export type ArchbaseAccessGate = 'IDENTITY' | 'SCOPE' | 'RESTRICTION' | 'LEVEL' | 'GRANT'; /** Escala de nível de acesso. `NONE` é sentinela de anotação, não valor de perfil. */ export type ArchbaseAccessLevel = 'NONE' | 'READER' | 'OPERATOR' | 'SUPERVISOR' | 'TENANT_ADMIN'; /** * Situação de uma capacidade concedida. * * - `EFFECTIVE` — concedida e valendo. * - `INERT` — concedida, mas a ação ou o recurso está inativo. É o acesso que o operador * acredita ter dado e que não decide nada. * - `DENIED` — bloqueada por negação explícita ou por nível insuficiente. */ export type ArchbaseCapabilitySituation = 'EFFECTIVE' | 'INERT' | 'DENIED'; /** Quem recebeu a permissão. */ export type ArchbaseSecurityTypeName = 'USER' | 'GROUP' | 'PROFILE'; /** * Estado das proteções configuráveis. * *
Vem antes dos números na tela de propósito: contagem alta de permissões não significa
* nada se o portão correspondente está inerte.
*/
export interface ArchbaseAccessFlags {
/** `false` = permissão apontando para ação inativa ainda decide. */
requireActive: boolean;
/** `false` = o catálogo não se alimenta do código; nada de `@HasPermission` foi varrido. */
scanConfigured: boolean;
/** `permit` = qualquer autenticado administra segurança. */
adminEndpointsPolicy: string;
requireRoleNoResolverPolicy: string;
/** `false` = `@RequireRole` não restringe nada. */
roleResolverRegistered: boolean;
}
/** Retrato do tenant — `GET /diagnostics/overview`. */
export interface ArchbaseAccessOverview {
users: number;
administrators: number;
groups: number;
profiles: number;
resources: number;
apiResources: number;
apiResourcesInactive: number;
resourcesWithoutAction: number;
actions: number;
actionsInactive: number;
actionsWithoutPermission: number;
permissions: number;
permissionsPointingToInactive: number;
permissionsBySecurityType: Record Identifica a pessoa por `userId` ou `email`. O escopo aceito é o que o avaliador
* conhece — tenant, empresa e projeto. Dimensão de negócio (departamento, filial) só chega
* aqui se a aplicação a mapear para um destes.
*/
export interface ArchbaseSimulationRequest {
userId?: string;
email?: string;
resource: string;
action: string;
tenantId?: string;
companyId?: string;
projectId?: string;
}
/**
* As métricas do panorama que têm detalhe navegável.
*
* Espelha o enum do backend. Um número sozinho diz que há um problema; não diz qual — é o
* detalhe que permite agir.
*/
export type ArchbaseOverviewMetric = 'PERMISSIONS_POINTING_TO_INACTIVE' | 'ADMINISTRATORS' | 'ACTIONS_INACTIVE' | 'API_RESOURCES_INACTIVE' | 'RESOURCES_WITHOUT_ACTION' | 'ACTIONS_WITHOUT_PERMISSION';
/**
* Um item por trás de um número do panorama.
*
* A forma é a mesma para todas as métricas — permissões, usuários, ações, recursos — de propósito:
* uma forma só significa uma tela só, em vez de seis listas que divergem com o tempo.
*/
export interface ArchbaseOverviewItem {
id: string;
/** O nome pelo qual a pessoa reconhece o item. */
label: string;
/** Onde ele vive: o recurso da ação, o e-mail do usuário, o destinatário da concessão. */
detail: string;
/** Por que está nesta lista. É o que transforma número em explicação. */
reason: string;
}
/** Página do detalhe. Reflete a Page do Spring, só com o que a tela usa. */
export interface ArchbaseOverviewItemPage {
content: ArchbaseOverviewItem[];
totalElements: number;
totalPages: number;
number: number;
size: number;
}
/** Os ramos que a árvore sabe abrir. Espelha o enum do backend. */
export type ArchbaseTreeBranch = 'USERS' | 'GROUPS' | 'PROFILES' | 'RESOURCES' | 'ACTIONS_OF_RESOURCE';
/** A classe de objeto de um nó — decide o ícone e o painel que abre. */
export type ArchbaseTreeNodeKind = 'USER' | 'GROUP' | 'PROFILE' | 'RESOURCE' | 'ACTION';
/**
* Um nó da árvore.
*
* Forma uniforme para as cinco classes de objeto, de propósito: uma forma só significa um
* componente de árvore só, em vez de cinco listas que divergem com o tempo.
*/
export interface ArchbaseTreeNode {
id: string;
kind: ArchbaseTreeNodeKind;
/**
* O identificador. Para recurso e ação é o nome técnico — e continua sendo, porque é ele que a
* simulação envia ao servidor.
*/
label: string;
/**
* O texto secundário — o que distingue quando o rótulo não basta.
*
* Descrição, para recurso e ação: a árvore mostrava só `label` e quem administra lia
* `ArchbaseAdvancedSidebar` onde deveria ler "Navegação". E-mail, para pessoa: numa base com
* homônimos, escolher entre dois "Marcos" pelo nome é chute. Ausente para grupo e perfil, e em
* backends anteriores a 3.4.
*/
description?: string | null;
/** O número à direita — membros do grupo, ações do recurso. Ausente quando não ajuda. */
badge?: string | null;
/** Se pode ser aberto. Vem do servidor: só ele sabe, e sem isso a árvore põe seta em folha. */
hasChildren: boolean;
/** `warning` ou `critical` — o marcador que leva o olho até o problema sem abrir ramo a ramo. */
severity?: string | null;
}
export interface ArchbaseTreeNodePage {
content: ArchbaseTreeNode[];
totalElements: number;
totalPages: number;
number: number;
size: number;
}
/** Uma capacidade concedida por um grupo ou perfil. */
export interface ArchbaseGrantLine {
resource: string;
action: string;
situation: string;
}
/**
* Um membro, com o que ele acumula de TODAS as origens.
*
* O total não é o do grupo: a pessoa soma o perfil, os outros grupos e as concessões diretas.
*/
export interface ArchbaseGroupMember {
userId: string;
name: string;
email: string;
profileName?: string | null;
administrator: boolean;
enabled: boolean;
total: number;
effective: number;
inert: number;
denied: number;
}
/** Relatório de um grupo ou perfil — a mesma forma para os dois, de propósito. */
export interface ArchbaseGroupReport {
groupId: string;
groupName: string;
description?: string | null;
grants: ArchbaseGrantLine[];
members: ArchbaseGroupMember[];
}
/** Quem alcança uma capacidade, e por qual via. A consulta reversa. */
export interface ArchbaseReachEntry {
userId: string;
userName: string;
email: string;
/** O nome do grupo, do perfil, "concessão direta" ou "administrador". */
via: string;
kind: string;
situation: string;
}
/**
* O que a trilha registra além das alterações.
*
* Entrar, errar a senha e ter acesso negado não mudam tabela nenhuma — a trilha de alterações,
* por construção, não os vê. São eles que respondem "quem tentou o quê", enquanto a outra metade
* responde "quem mudou o quê".
*/
export type ArchbaseSecurityEventType = 'LOGIN' | 'LOGIN_FALHOU' | 'LOGOUT' | 'ACESSO_NEGADO' | 'SIMULACAO';
export interface ArchbaseSecurityEvent {
id: string;
tipo: ArchbaseSecurityEventType;
dataHora: string;
/** Pode não corresponder a ninguém: numa tentativa com e-mail inexistente é esse o dado útil. */
usuario?: string | null;
tenantId?: string | null;
origem?: string | null;
recurso?: string | null;
acao?: string | null;
/** O porquê: o portão que recusou, ou o tipo da falha de autenticação. */
detalhe?: string | null;
sucesso: boolean;
}
export interface ArchbaseSecurityEventPage {
content: ArchbaseSecurityEvent[];
totalElements: number;
totalPages: number;
number: number;
size: number;
}