Módulo de CRM
O Módulo de CRM fornece funcionalidade para gerenciar notificações push da web, notificações in-app e Rich Inbox no Gamanza Engage Web Client SDK. Ele permite que os desenvolvedores registrem jogadores para notificações push da web, gerenciem solicitações de permissão de notificação, manipulem notificações push in-app do OneSignal e gerenciem mensagens de caixa de entrada (listar, contar, alternar leitura/favorito, excluir).
Acessando o Módulo
O CrmModule é inicializado internamente pelo SDK e não deve ser instanciado diretamente. Ele é acessível através da instância principal do SDK.
// Exemplo de acesso ao CrmModule através do SDK
const { Crm } = GamanzaEngageWebClientSDK.getInstance();
Métodos
playerRegisterWebPushSubscription
Registra o jogador autenticado atual para Notificações Push da Web alimentadas pelo Gamanza Engage CRM. Esta função registra o service worker, valida se o agente de usuário do jogador suporta push e também valida se as permissões para Notificações foram concedidas ou negadas.
Assinatura:
playerRegisterWebPushSubscription(): Promise<{
status: WebPushSubscriptionRequestStatus;
}>
Retorna:
| Tipo | Descrição |
|---|---|
Promise<{ status: WebPushSubscriptionRequestStatus }> | Uma promessa que é resolvida em um objeto contendo o status da solicitação de assinatura de push da web. |
Exemplo:
// Registrar-se para notificações push da web
const handleRequestPermissionsClick = async (evt) => {
evt.preventDefault();
// Esta chamada exibe a solicitação de permissões de notificação do agente de usuário nativo
const result = await Crm.playerRegisterWebPushSubscription();
if (result.status === WebPushSubscriptionRequestStatus.SUCCESS) {
alert('Parabéns, você está inscrito para receber Notificações Push');
} else if (result.status === WebPushSubscriptionRequestStatus.WEB_PUSH_NOT_SUPPORTED) {
alert('Notificações Push da Web não são suportadas neste navegador');
} else if (result.status === WebPushSubscriptionRequestStatus.WEB_PUSH_PERMISSION_DENIED) {
alert('A permissão para receber notificações foi negada');
}
};
// Anexar a um evento de clique de botão
document.getElementById('notification-permission-btn').addEventListener('click', handleRequestPermissionsClick);
Observações:
- Para o Safari, a solicitação precisa estar atrás de uma interação do usuário. Quando o usuário concluir o gesto, chame o método de assinatura push imediatamente do código do manipulador de eventos do gesto.
- Para requisitos, verifique a documentação de Configuração de Push da Web.
shouldShowNotificationRequestPermissionsBanner
Função de helper para permitir que você decida quando mostrar o banner de solicitação de permissões para Notificações Push da Web. Isso é particularmente útil para o Safari, onde o método de assinatura push deve ser chamado imediatamente do código do manipulador de eventos do gesto do usuário.
Assinatura:
shouldShowNotificationRequestPermissionsBanner(days: number = 30, override: boolean = true): Promise<boolean>
Parâmetros:
| Nome | Tipo | Padrão | Descrição |
|---|---|---|---|
days | Tipo number | 30 | Número de dias para esperar antes de mostrar o banner novamente. O sistema armazena este valor no armazenamento persistente. |
override | Tipo boolean | verdadeiro | Define se você deseja gravar no armazenamento de persistência na próxima vez em que a função deve retornar true para o jogador atual. |
Retorna:
| Tipo | Descrição |
|---|---|
Promise<boolean> | Uma promessa que é resolvida em um booleano indicando se o banner de solicitação de permissões de notificação deve ser exibido. |
Exemplo:
Verificação automática e substituição da próxima verificação:
// Verifique se devemos exibir o banner de permissões de notificação
if (await Crm.shouldShowNotificationRequestPermissionsBanner(5)) {
// Exibir o banner na interface do usuário
showNotificationBanner();
}
Substituição do controle na persistência:
// Verifique se devemos exibir o banner sem atualizar a persistência
if (await Crm.shouldShowNotificationRequestPermissionsBanner(5, false)) {
// Exibir o banner na interface do usuário
showNotificationBanner();
}
// Manipulador para o jogador fechar o banner
const onCloseBannerClick = async (evt) => {
evt.preventDefault();
hideNotificationBanner();
// Atualize quando o banner deve ser exibido da próxima vez para 5 dias
await Crm.shouldShowNotificationRequestPermissionsBanner(5, true);
};
playerOneSignalInAppPushNotificationsSubscription
Registra o jogador autenticado atual para notificações push in-app do OneSignal. Este método permite registrar um jogador para receber notificações push através do OneSignal dentro do aplicativo.
Assinatura:
playerOneSignalInAppPushNotificationsSubscription(subs: OneSignalInAppNotificationSubscription): Promise<SimpleResponse<null>>
Parâmetros:
| Nome | Tipo | Descrição |
|---|---|---|
subs | OneSignalInAppNotificationSubscription | Os detalhes da assinatura do OneSignal. |
Retorna:
| Tipo | Descrição |
|---|---|
Promise<SimpleResponse<null>> | Uma promessa que é resolvida em um objeto SimpleResponse indicando o sucesso ou falha do registro. |
Exemplo:
const subscription = {
appId: "your-onesignal-app-id",
subscriptionId: "subscription-id",
playerId: "player-id",
deviceType: "web",
oneSignalId: "onesignal-id"
};
const result = await Crm.playerOneSignalInAppPushNotificationsSubscription(subscription);
if (result.ok) {
console.log("Registrado com sucesso para notificações do OneSignal");
} else {
console.error("Falha ao se registrar para notificações do OneSignal:", result.error);
}
Rich Inbox
A API do Rich Inbox permite listar, contar e gerenciar mensagens da caixa de entrada (status de leitura/favorito, excluir). Todos os métodos usam o caminho base /api/rich-inbox/v1 e retornam SimpleResponse<T>.
richInboxDeleteMessages
Exclui mensagens por seus IDs.
Assinatura:
richInboxDeleteMessages(body: RichInboxIdsBody): Promise<SimpleResponse<null>>
Parâmetros:
| Nome | Tipo | Descrição |
|---|---|---|
corpo | RichInboxIdsBody | Objeto com ids: matriz de IDs de mensagem (ObjectIds do MongoDB). Deve conter pelo menos 1 ID. |
Retorna:
| Tipo | Descrição |
|---|---|
Promise<SimpleResponse<null>> | ok: true em 204 No Content; ok: false com error em 400 ou 500. |
Respostas (API):
| Status | Descrição |
|---|---|
| 204 No Content | Mensagens excluídas com sucesso. |
| 400 Bad Request | Corpo da solicitação ou IDs de mensagem inválidos. Esquema do corpo da resposta: any. |
| 500 Erro interno do servidor | Problemas de conexão com o banco de dados ou erro de exclusão. Esquema do corpo da resposta: any. |
Exemplo:
const result = await Crm.richInboxDeleteMessages({ ids: ['msgId1', 'msgId2'] });
if (result.ok) {
console.log('Mensagens excluídas');
} else {
console.error('Exclusão falhou:', result.error);
}
richInboxGetAllCounts
Retorna todas as contagens de mensagens para o jogador atual (lidas, não lidas, favoritas, não favoritas, todas).
Assinatura:
richInboxGetAllCounts(): Promise<SimpleResponse<RichInboxAllCountsResponse>>
Retorna:
| Tipo | Descrição |
|---|---|
Promise<SimpleResponse<RichInboxAllCountsResponse>> | Em caso de sucesso, data contém playerId, read, unread, favorite, unfavorite, all. |
Respostas (API):
| Status | Descrição |
|---|---|
| 200 OK | Contagens de mensagens recuperadas com sucesso. Esquema: playerId (string, obrigatório), read (integer, obrigatório), unread (integer, obrigatório), favorite (integer, obrigatório), unfavorite (integer, obrigatório), all (integer, obrigatório). |
| 500 Erro interno do servidor | Problemas de conexão com o banco de dados ou erro de consulta. Esquema do corpo da resposta: any. |
Esquema 200 OK:
| Propriedade | Tipo | Obrigatório | Descrição |
|---|---|---|---|
playerId | string | Sim | Jogador. |
read | integer | Sim | Contagem de mensagens lidas. |
unread | integer | Sim | Contagem de mensagens não lidas. |
favorite | integer | Sim | Contagem de mensagens favoritas. |
unfavorite | integer | Sim | Contagem de mensagens não favoritas. |
all | integer | Sim | Contagem total de todas as mensagens. |
Exemplo:
const result = await Crm.richInboxGetAllCounts();
if (result.ok) {
console.log('Não lidas:', result.data.unread, 'Total:', result.data.all);
}
richInboxGetList
Recupera uma lista paginada de mensagens da caixa de entrada do jogador autenticado.
Assinatura:
richInboxGetList(params?: RichInboxListParams): Promise<SimpleResponse<PaginationResponse<Record<string, unknown>[]>>>
Parâmetros de Consulta:
| Nome | Tipo | Padrão | Descrição |
|---|---|---|---|
isRead | boolean | — | Filtrar por status de leitura (true/false). |
isFavorite | boolean | — | Filtrar por status de favoritos (true/false). |
page | integer | 1 | Número da página para paginação. Valores possíveis: ≥ 1. |
limit | integer | 30 | Número de itens por página. Valores possíveis: ≥ 1. |
search | string | — | Termo de pesquisa para filtrar mensagens pelo título ou conteúdo da mensagem. |
Retorna:
| Tipo | Descrição |
|---|---|
Promise<SimpleResponse<PaginationResponse<...>>> | Em caso de sucesso, data é um resultado paginado (veja o esquema de 200 OK abaixo). |
Respostas (API):
| Status | Descrição |
|---|---|
| 200 OK | Lista da caixa de entrada recuperada com sucesso. Esquema abaixo. |
| 400 Requisição Inválida | Parâmetros de consulta inválidos. Esquema do corpo da resposta: any. |
| 500 Erro Interno do Servidor | Problemas de conexão com o banco de dados ou erro de consulta. Esquema do corpo da resposta: any. |
Esquema 200 OK:
| Propriedade | Tipo | Descrição |
|---|---|---|
docs | object[] | Array de objetos de mensagem da caixa de entrada. |
totalDocs | integer | Número total de documentos. |
limit | integer | Limite por página. |
page | integer | Número da página atual. |
totalPages | integer | Número total de páginas. |
hasPrevPage | boolean | Se há uma página anterior. |
hasNextPage | boolean | Se há uma próxima página. |
prevPage | integer | null | Previous page number. |
nextPage | integer | null | Next page number. |
Exemplo:
// Primeira página, 30 por página, apenas não lidos
const result = await Crm.richInboxGetList({ isRead: false, page: 1, limit: 30 });
if (result.ok) {
const { docs, totalDocs, page, totalPages } = result.data;
console.log('Mensagens:', docs, 'Total:', totalDocs);
}
richInboxGetCount
Obtenha a contagem de mensagens para o jogador autenticado filtrado por tipo.
Assinatura:
richInboxGetCount(type: RichInboxMessageCountType): Promise<SimpleResponse<RichInboxCountResponse>>
Parâmetros de Consulta:
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
type | string | Sim | Tipo de mensagens para contagem. Possíveis valores: read, unread, favorite, unfavorite, all. |
Retorna:
| Tipo | Descrição |
|---|---|
Promise<SimpleResponse<RichInboxCountResponse>> | Em caso de sucesso, data contém playerId e total (consulte o esquema 200 OK). |
Respostas (API):
| Status | Descrição |
|---|---|
| 200 OK | Contagem de mensagens recuperada com sucesso. Esquema abaixo. |
| 400 Bad Request | Parâmetro inválido. Esquema do corpo da resposta: any. |
| 500: Erro interno do servidor | Problemas na conexão do banco de dados ou erro de consulta. Esquema do corpo da resposta: any. |
Esquema 200 OK:
| Propriedade | Tipo | Obrigatório | Descrição |
|---|---|---|---|
playerId | string | Sim | ID do jogador. |
total | inteiro | Sim | Contagem total de mensagens correspondentes ao tipo. |
Exemplo:
const result = await Crm.richInboxGetCount('unread');
if (result.ok) {
console.log('Contagem não lida:', result.data.total);
}
richInboxToggleFavorite
Atualiza o status de favorito de uma ou mais mensagens.
Assinatura:
richInboxToggleFavorite(body: RichInboxToggleFavoriteBody): Promise<SimpleResponse<null>>
Corpo da solicitação (obrigatório):
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
ids | mongoid[] | Sim | Matriz de IDs de mensagens a serem atualizadas. Valores possíveis: ≥ 1. |
isFavorite | booleano | Sim | Status de favorito a ser definido para as mensagens. |
Retorna:
| Tipo | Descrição |
|---|---|
Promise<SimpleResponse<null>> | ok: true em 204 Sem Conteúdo; ok: false com error em 400/500. |
Respostas (API):
| Status | Descrição |
|---|---|
| 204 Sem Conteúdo | Status de favorito atualizado com êxito. |
| 400 Solicitação Inválida | Corpo da solicitação ou IDs de mensagem inválidos. Esquema do corpo da resposta: any. |
| 500 Erro Interno do Servidor | Problemas de conexão com o banco de dados ou erro de atualização. Esquema do corpo da resposta: any. |
Exemplo:
const result = await Crm.richInboxToggleFavorite({
ids: ['msgId1'],
isFavorite: true,
});
if (result.ok) console.log('Status de favorito atualizado');
richInboxToggleRead
Atualiza o status de leitura de uma ou mais mensagens.
Assinatura:
richInboxToggleRead(body: RichInboxToggleReadBody): Promise<SimpleResponse<null>>
Corpo da solicitação (obrigatório):
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
ids | mongoid[] | Sim | Matriz de IDs de mensagens a serem atualizadas. Valores possíveis: ≥ 1. |
isRead | booleano | Sim | Status de leitura a ser definido para as mensagens. |
Retorna:
| Tipo | Descrição |
|---|---|
Promise<SimpleResponse<null>> | ok: true em 204 Sem Conteúdo; ok: false com error em 400/500. |
Respostas (API):
| Status | Descrição |
|---|---|
| 204 Sem Conteúdo | Status de leitura atualizado com sucesso. |
| 400 Solicitação Inválida | Corpo da solicitação ou IDs de mensagem inválidos. Esquema do corpo da resposta: any. |
| 500 Erro Interno do Servidor | Problemas na conexão com o banco de dados ou erro na atualização. Esquema do corpo da resposta: any. |
Exemplo:
const result = await Crm.richInboxToggleRead({
ids: ['msgId1', 'msgId2'],
isRead: true,
});
if (result.ok) console.log('Status de leitura atualizado');
Interfaces Relacionadas
OneSignalInAppNotificationSubscription
Interface que representa os detalhes da assinatura para notificações push dentro do aplicativo do OneSignal.
type OneSignalInAppNotificationSubscription = {
appId: string;
subscriptionId: string;
playerId: string;
deviceType: string;
oneSignalId: string;
};
| Propriedade | Tipo | Descrição |
|---|---|---|
appId | Tipo string | O ID do aplicativo OneSignal |
subscriptionId | Tipo string | O identificador de assinatura do OneSignal |
playerId | Tipo string | O identificador único do jogador |
deviceType | Tipo string | O tipo de dispositivo sendo registrado |
oneSignalId | Tipo string | O identificador único do OneSignal |
Interfaces da Caixa de Entrada Enriquecida
Tipo RichInboxMessageCountType
Tipo para o endpoint de contagem: 'read' | 'unread' | 'favorite' | 'unfavorite' | 'all'.
Resposta RichInboxAllCountsResponse
Formato da resposta para richInboxGetAllCounts().
interface RichInboxAllCountsResponse {
playerId: string;
read: number;
unread: number;
favorite: number;
unfavorite: number;
all: number;
}
| Propriedade | Tipo | Descrição |
|---|---|---|
playerId | Tipo string | ID do jogador |
read | Tipo number | Contagem de mensagens lidas |
unread | Tipo number | Contagem de mensagens não lidas |
favorite | Tipo number | Contagem de mensagens marcadas como favoritas |
unfavorite | Tipo number | Contagem de mensagens não marcadas como favoritas |
all | Tipo number | Contagem total de todas as mensagens |
Resposta RichInboxCountResponse
Formato da resposta para richInboxGetCount(type).
interface RichInboxCountResponse {
playerId: string;
total: number;
}
| Propriedade | Tipo | Descrição |
|---|---|---|
playerId | Tipo string | ID do jogador |
total | Tipo number | Contagem total para o tipo solicitado |
Parâmetros RichInboxListParams
Parâmetros de consulta para richInboxGetList().
interface RichInboxListParams {
isRead?: boolean;
isFavorite?: boolean;
page?: number;
limit?: number;
search?: string;
}
| Propriedade | Tipo | Descrição |
|---|---|---|
isRead | boolean (opcional) | Filtrar por status de leitura |
isFavorite | boolean (opcional) | Filtrar por status de favorito |
page | number (opcional) | Número da página (≥ 1, padrão 1) |
limit | number (opcional) | Itens por página (≥ 1, padrão 30) |
search | string (opcional) | Termo de pesquisa (título ou conteúdo da mensagem) |
RichInboxIdsBody
Corpo para excluir e para a matriz de ids nos métodos de alternância.
interface RichInboxIdsBody {
ids: string[];
}
| Propriedade | Tipo | Descrição |
|---|---|---|
ids | string[] | Matriz de IDs de mensagens (ObjectIds do MongoDB). Pelo menos 1 obrigatório. |
RichInboxToggleFavoriteBody
Corpo para richInboxToggleFavorite().
interface RichInboxToggleFavoriteBody extends RichInboxIdsBody {
isFavorite: boolean;
}
| Propriedade | Tipo | Descrição |
|---|---|---|
ids | string[] | Matriz de IDs de mensagens a serem atualizadas |
isFavorite | Tipo boolean | Status de favorito a ser definido |
RichInboxToggleReadBody
Corpo para richInboxToggleRead().
interface RichInboxToggleReadBody extends RichInboxIdsBody {
isRead: boolean;
}
| Propriedade | Tipo | Descrição |
|---|---|---|
ids | string[] | Array of message IDs to update |
isRead | boolean | Read status to set |
SimpleResponse
Generic interface representing a simple response from the API.
interface SimpleResponse<T> {
ok: boolean;
error?: ErrorResponse;
data: T | null;
}
| Property | Type | Descrição |
|---|---|---|
ok | boolean | Indicates if the operation was successful |
erro | ErrorResponse (opcional) | Error details if the operation failed |
data | T | null | The response data (null in this case of OneSignal registration) |
ErrorResponse
Interface representing an error response from the API.
interface ErrorResponse {
message: string;
details: {
faultCode: number;
fields: {
field: string;
error: string;
}[];
};
request: {
xRequestId: string;
method: string;
headers: Record<string, string>[];
};
timestamp: string;
}
| Property | Type | Descrição |
|---|---|---|
message | Tipo string | Error message |
details.faultCode | Tipo number | Numeric code identifying the error |
details.fields | Array | List of field-specific errors |
details.fields[].field | Tipo string | Name of the field with an error |
details.fields[].error | Tipo string | Error message for the field |
request.xRequestId | Tipo string | Identificador da solicitação |
request.method | Tipo string | Método HTTP usado para a solicitação |
request.headers | Array | Cabeçalhos da Solicitação |
timestamp | Tipo string | Carimbo de data/hora quando o erro ocorreu |
WebPushSubscriptionRequestStatus
Enum que representa os possíveis valores de status retornados pelo método playerRegisterWebPushSubscription.
enum WebPushSubscriptionRequestStatus {
SUCCESS = 'SUCCESS',
ALREADY_GRANTED = 'ALREADY_GRANTED',
MISSING_SERVICE_WORKER = 'MISSING_SERVICE_WORKER',
WEB_PUSH_NOT_SUPPORTED = 'WEB_PUSH_NOT_SUPPORTED',
WEB_PUSH_PERMISSION_DENIED = 'WEB_PUSH_PERMISSION_DENIED',
WEB_PUSH_PERMISSION_CANCELLED = 'WEB_PUSH_PERMISSION_CANCELLED',
ERROR = 'ERROR',
}
| Valor | Descrição |
|---|---|
SUCCESS | O jogador registrou-se com sucesso para notificações push da web. |
ALREADY_GRANTED | O jogador já concedeu permissão para notificações push da web. |
MISSING_SERVICE_WORKER | O serviço worker necessário para as notificações push da web está ausente. |
WEB_PUSH_NOT_SUPPORTED | As notificações push da web não são suportadas no navegador atual. |
WEB_PUSH_PERMISSION_DENIED | O jogador negou permissão para notificações push da web. |
WEB_PUSH_PERMISSION_CANCELLED | O jogador cancelou a solicitação de permissão para notificações push da web. |
ERROR | Ocorreu um erro durante o processo de assinatura de notificações push da web. |
OnsiteVariantEnum
Enum que representa as diferentes variantes de exibição para notificações no local.
enum OnsiteVariantEnum {
DEFAULT = 'DEFAULT',
TITLE = 'TITLE',
IMAGE_TOP = 'IMAGE_TOP',
IMAGE_RIGHT = 'IMAGE_RIGHT',
IMAGE_LEFT = 'IMAGE_LEFT',
}
| Valor | Descrição |
|---|---|
DEFAULT | Variante de exibição padrão para notificações no local. |
TITLE | Variante de exibição somente com título para notificações no local. |
IMAGE_TOP | Variante de exibição com imagem no topo para notificações no local. |
IMAGE_RIGHT | Variante de exibição com imagem à direita para notificações no local. |
IMAGE_LEFT | Variante de exibição com imagem à esquerda para notificações no local. |
AnalyticsTrackingType
Enum que representa os diferentes tipos de rastreamento de análises.
enum AnalyticsTrackingType {
DELIVERED = 'DELIVERED',
OPENED = 'OPENED',
CLICKED = 'CLICKED',
ERROR = 'ERROR',
}
| Valor | Descrição |
|---|---|
DELIVERED | Rastreamento para quando uma notificação é entregue. |
OPENED | Rastreamento para quando uma notificação é aberta. |
CLICKED | Rastreamento para quando uma notificação é clicada. |
ERROR | Rastreamento para quando ocorre um erro com uma notificação. |
AnalyticsTrackingChannel
Enum que representa os diferentes canais para rastreamento de análises.
enum AnalyticsTrackingChannel {
ON_SITE = 'ON_SITE',
WEB_PUSH = 'WEB_PUSH',
}
| Valor | Descrição |
|---|---|
ON_SITE | Rastreamento de análises para notificações no local. |
WEB_PUSH | Rastreamento de análises para notificações push da web. |
OnSiteNotificationEventData
Interface para dados de evento de notificação no local.
interface OnSiteNotificationEventData extends BaseEventData {
msg: {
type: OnsiteVariantEnum;
contentHtml: string;
language: string;
};
playerId: string;
}
| Propriedade | Tipo | Obrigatório | Descrição |
|---|---|---|---|
msg | { type: OnsiteVariantEnum; contentHtml: string; language: string; } | Sim | Conteúdo da mensagem para a notificação no local. |
msg.type | OnsiteVariantEnum | Sim | Variante de exibição para a notifica ção no local. |
msg.contentHtml | Tipo string | Sim | Conteúdo HTML para a notificação no local. |
msg.language | Tipo string | Sim | Idioma do conteúdo da notificação no local. |
playerId | Tipo string | Sim | ID do jogador que recebe a notificação. |
AnalyticsTrackingEventEmitter
Interface para emissores de eventos de rastreamento de análise.
interface AnalyticsTrackingEventEmitter {
message: InternalRawEvent<'messageGateway:on:sendOnSiteNotification'>;
trackingType: AnalyticsTrackingType;
channel: AnalyticsTrackingChannel;
errorDetail?: {
code: string;
description?: string;
metadata: Record<string, unknown>;
};
}
| Propriedade | Tipo | Obrigatório | Descrição |
|---|---|---|---|
message | InternalRawEvent<'messageGateway:on:sendOnSiteNotification'> | Sim | O evento de mensagem sendo rastreado. |
trackingType | AnalyticsTrackingType | Sim | O tipo de rastreamento (ENTREGUE, ABERTO, CLICADO, ERRO). |
channel | AnalyticsTrackingChannel | Sim | O canal sendo rastreado (NO_SITE, WEB_PUSH). |
errorDetail | { code: string; description?: string; metadata: Record<string, unknown>; } | Não | Detalhes sobre qualquer erro que tenha ocorrido. |
errorDetail.code | Tipo string | Sim | Um código de erro único para identificar o problema (por exemplo, PUSH_001). |
errorDetail.description | Tipo string | Não | Uma descrição legível para humanos do erro a ser exibida na interface do Analytics. |
errorDetail.metadata | Record<string, unknown> | Sim | Informações de erro gerais de uma maneira mais técnica para auditoria interna. |