@cfxlabsinc/b2b-services
    Preparing search index...

    Read and write path for admin.dashboard_user_activity — the audit feed behind the /tokens and /wallets detail-panel History sections.

    Not cached: audit reads are cold and the underlying data changes on every config write, so any cache would be busy churning for no hit-rate gain.

    Index
    • Record one audit event.

      The actor arrives as an external id and is resolved here, so callers never hold the internal FK. Domain services do not call this: activity writes belong to the dashboard, which is the only layer that knows who is acting (see lib/userActivities.ts). A domain service taking an actor parameter is the shape this replaces.

      Parameters

      • input: {
            actorExternalId: string;
            data: Record<string, unknown>;
            metadata?: {
                geoLocation?: {
                    city?: string;
                    country?: string;
                    countryRegion?: string;
                    flag?: string;
                    latitude?: string;
                    longitude?: string;
                    postalCode?: string;
                    region?: string;
                };
                ipAddress?: string;
                userAgent?: {
                    browser: { name?: string; version?: string };
                    cpu: { architecture?: string };
                    device: { model?: string; type?: string; vendor?: string };
                    engine: { name?: string; version?: string };
                    isBot: boolean;
                    os: { name?: string; version?: string };
                    ua: string;
                };
            };
            objectId: string;
            type: | "backofficeWallet.created"
            | "backofficeWallet.deleted"
            | "backofficeWallet.updated"
            | "chainConfig.created"
            | "chainConfig.deleted"
            | "chainConfig.updated"
            | "changeApproval.applied"
            | "changeApproval.approved"
            | "changeApproval.rejected"
            | "changeApproval.requested"
            | "customer.recurringFee.paused"
            | "customer.recurringFee.removed"
            | "customer.recurringFee.resumed"
            | "customer.recurringFee.set"
            | "emailTemplate.activated"
            | "emailTemplate.deactivated"
            | "emailTemplate.draftDiscarded"
            | "emailTemplate.testSendRequested"
            | "emailTemplate.updated"
            | "maintenance.disabled"
            | "maintenance.enabled"
            | "maintenance.global.disabled"
            | "maintenance.global.enabled"
            | "permission.created"
            | "permission.updated"
            | "program.buffer.closed"
            | "program.deploy.completed"
            | "program.deploy.failed"
            | "program.deploy.requested"
            | "program.idl.publishRequested"
            | "role.created"
            | "role.deleted"
            | "role.updated"
            | "rolePermission.assigned"
            | "rolePermission.unassigned"
            | "tokenConfig.created"
            | "tokenConfig.deleted"
            | "tokenConfig.updated"
            | "user.created"
            | "user.roleAssigned"
            | "user.roleChanged"
            | "user.roleUnassigned"
            | "user.statusChanged";
            visibility: "ALL"
            | "INTERNAL";
        }

      Returns Promise<{ ok: true; value: { id: string } }>

    • Parameters

      • Optionalinput: {
            objectIds?: string[];
            page?: number;
            pageSize?: number;
            types?: (
                | "backofficeWallet.created"
                | "backofficeWallet.deleted"
                | "backofficeWallet.updated"
                | "chainConfig.created"
                | "chainConfig.deleted"
                | "chainConfig.updated"
                | "changeApproval.applied"
                | "changeApproval.approved"
                | "changeApproval.rejected"
                | "changeApproval.requested"
                | "customer.recurringFee.paused"
                | "customer.recurringFee.removed"
                | "customer.recurringFee.resumed"
                | "customer.recurringFee.set"
                | "emailTemplate.activated"
                | "emailTemplate.deactivated"
                | "emailTemplate.draftDiscarded"
                | "emailTemplate.testSendRequested"
                | "emailTemplate.updated"
                | "maintenance.disabled"
                | "maintenance.enabled"
                | "maintenance.global.disabled"
                | "maintenance.global.enabled"
                | "permission.created"
                | "permission.updated"
                | "program.buffer.closed"
                | "program.deploy.completed"
                | "program.deploy.failed"
                | "program.deploy.requested"
                | "program.idl.publishRequested"
                | "role.created"
                | "role.deleted"
                | "role.updated"
                | "rolePermission.assigned"
                | "rolePermission.unassigned"
                | "tokenConfig.created"
                | "tokenConfig.deleted"
                | "tokenConfig.updated"
                | "user.created"
                | "user.roleAssigned"
                | "user.roleChanged"
                | "user.roleUnassigned"
                | "user.statusChanged"
            )[];
            userIds?: string[];
            visibility?: "ALL"
            | "INTERNAL";
        }
        • OptionalobjectIds?: string[]

          object_id values to filter by (e.g. tok_… / bow_…).

        • Optionalpage?: number
        • OptionalpageSize?: number
        • Optionaltypes?: (
              | "backofficeWallet.created"
              | "backofficeWallet.deleted"
              | "backofficeWallet.updated"
              | "chainConfig.created"
              | "chainConfig.deleted"
              | "chainConfig.updated"
              | "changeApproval.applied"
              | "changeApproval.approved"
              | "changeApproval.rejected"
              | "changeApproval.requested"
              | "customer.recurringFee.paused"
              | "customer.recurringFee.removed"
              | "customer.recurringFee.resumed"
              | "customer.recurringFee.set"
              | "emailTemplate.activated"
              | "emailTemplate.deactivated"
              | "emailTemplate.draftDiscarded"
              | "emailTemplate.testSendRequested"
              | "emailTemplate.updated"
              | "maintenance.disabled"
              | "maintenance.enabled"
              | "maintenance.global.disabled"
              | "maintenance.global.enabled"
              | "permission.created"
              | "permission.updated"
              | "program.buffer.closed"
              | "program.deploy.completed"
              | "program.deploy.failed"
              | "program.deploy.requested"
              | "program.idl.publishRequested"
              | "role.created"
              | "role.deleted"
              | "role.updated"
              | "rolePermission.assigned"
              | "rolePermission.unassigned"
              | "tokenConfig.created"
              | "tokenConfig.deleted"
              | "tokenConfig.updated"
              | "user.created"
              | "user.roleAssigned"
              | "user.roleChanged"
              | "user.roleUnassigned"
              | "user.statusChanged"
          )[]
        • OptionaluserIds?: string[]

          External ids (adusr_…) of actors to filter by.

        • Optionalvisibility?: "ALL" | "INTERNAL"

      Returns Promise<
          {
              ok: true;
              value: {
                  hasNext: boolean;
                  items: AdminDashboardUserActivity[];
                  total: number;
              };
          },
      >