From 81f3505935bf480c0cfddb068cc097cb3ea628e1 Mon Sep 17 00:00:00 2001 From: SP-ya-dev Date: Mon, 24 Aug 2026 13:36:55 +0600 Subject: [PATCH] CCS-114118 feature: add requestAdminServiceAuth method --- src/lib/proxy/index.spec.ts | 50 ++++++++++++++++++++++++++++++++++++- src/lib/proxy/index.ts | 24 +++++++++++++++++- src/types/bridge.ts | 1 + src/types/proxy.ts | 14 +++++++++++ 4 files changed, 87 insertions(+), 2 deletions(-) diff --git a/src/lib/proxy/index.spec.ts b/src/lib/proxy/index.spec.ts index 069dd88..ce1ce58 100644 --- a/src/lib/proxy/index.spec.ts +++ b/src/lib/proxy/index.spec.ts @@ -1,6 +1,6 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { ERROR_CODES, METHODS, STATUS } from '../../types' -import { WebCommandOpenUrl, WebCommandSearchElement } from '../../types/proxy' +import { ADMIN_SERVICE_AUTH_ERROR_CODES, WebCommandOpenUrl, WebCommandSearchElement } from '../../types/proxy' describe('proxy', () => { beforeEach(() => { @@ -202,6 +202,54 @@ describe('proxy', () => { await expect(runWebCommandsPipeline([])).rejects.toBe(ERROR_CODES.NO_BRIDGE) }) }) + + describe('requestAdminServiceAuth', () => { + it('success response', async () => { + const response = { ref: 'proxy-admin-service-auth', payload: { status: STATUS.SUCCESS } } + const sendClientEventMock = vi.fn().mockResolvedValue(response) + + vi.doMock('@expressms/smartapp-bridge', () => ({ + default: { sendClientEvent: sendClientEventMock }, + })) + + const { requestAdminServiceAuth } = await import('./index') + + const result = await requestAdminServiceAuth() + + expect(sendClientEventMock).toHaveBeenCalledTimes(1) + expect(sendClientEventMock).toHaveBeenCalledWith({ + method: METHODS.REQUEST_ADMIN_SERVICE_AUTH, + params: {}, + timeout: 10_000, + hide_recv_event_data: true, + }) + expect(result).toBe(response) + }) + + it('error response', async () => { + const response = { + ref: 'proxy-admin-service-auth-error', + payload: { status: STATUS.ERROR, errorCode: ADMIN_SERVICE_AUTH_ERROR_CODES.UNAUTHORIZED }, + } + const sendClientEventMock = vi.fn().mockResolvedValue(response) + + vi.doMock('@expressms/smartapp-bridge', () => ({ + default: { sendClientEvent: sendClientEventMock }, + })) + + const { requestAdminServiceAuth } = await import('./index') + + const result = await requestAdminServiceAuth() + + expect(result.payload.errorCode).toBe(ADMIN_SERVICE_AUTH_ERROR_CODES.UNAUTHORIZED) + }) + + it('no bridge', async () => { + vi.doMock('@expressms/smartapp-bridge', () => ({ default: undefined })) + const { requestAdminServiceAuth } = await import('./index') + await expect(requestAdminServiceAuth()).rejects.toBe(ERROR_CODES.NO_BRIDGE) + }) + }) }) diff --git a/src/lib/proxy/index.ts b/src/lib/proxy/index.ts index 39bb84f..4943f07 100644 --- a/src/lib/proxy/index.ts +++ b/src/lib/proxy/index.ts @@ -1,6 +1,11 @@ import bridge from '@expressms/smartapp-bridge' import { CookieItem, ERROR_CODES, METHODS, StatusResponse } from '../../types' -import { CredentialsType, GetCredentialsResponse, WebCommandsPipeline } from '../../types/proxy' +import { + CredentialsType, + GetCredentialsResponse, + RequestAdminServiceAuthResponse, + WebCommandsPipeline, +} from '../../types/proxy' /** * Set cookies for web resouce. It's needed for SSO auth cases. @@ -104,6 +109,23 @@ export const deleteCredentials = (): Promise => { .then(event => event as StatusResponse) } +/** + * Request admin service auth for web resource + * @returns Promise that'll be fullfilled with `payload.status` on success, otherwise rejected with reason + */ +export const requestAdminServiceAuth = (): Promise => { + if (!bridge) return Promise.reject(ERROR_CODES.NO_BRIDGE) + + return bridge + .sendClientEvent({ + method: METHODS.REQUEST_ADMIN_SERVICE_AUTH, + params: {}, + timeout: 10_000, + hide_recv_event_data: true, + }) + .then(event => event as RequestAdminServiceAuthResponse) +} + /** * Run pipeline for manipulating web resource * @param pipeline Pipeline with jobs & command diff --git a/src/types/bridge.ts b/src/types/bridge.ts index 51d98bd..9dc739c 100644 --- a/src/types/bridge.ts +++ b/src/types/bridge.ts @@ -59,6 +59,7 @@ export enum METHODS { GET_NFC_STATUS = 'get_nfc_status', OPEN_CLIENT_CONTACTS = 'open_client_contacts', ALLOW_IOS_PINCH_TO_ZOOM = 'allow_ios_pinch_to_zoom', + REQUEST_ADMIN_SERVICE_AUTH = 'request_admin_service_auth', } export enum STATUS { diff --git a/src/types/proxy.ts b/src/types/proxy.ts index 2ec2124..5be0382 100644 --- a/src/types/proxy.ts +++ b/src/types/proxy.ts @@ -47,3 +47,17 @@ export interface WebCommandsJob { } export type WebCommandsPipeline = Array + +export enum ADMIN_SERVICE_AUTH_ERROR_CODES { + UNAUTHORIZED = 'admin_service_unauthorized', + UNAVAILABLE = 'admin_service_unavailable', + NETWORK_ERROR = 'network_error', + TIMEOUT = 'timeout', +} + +export interface RequestAdminServiceAuthResponse extends Omit { + payload: { + status: STATUS + errorCode?: ADMIN_SERVICE_AUTH_ERROR_CODES | null + } +}