This is an automated email from the ASF dual-hosted git repository.

lizhimins pushed a commit to branch rocketmq-studio
in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git

commit 702f0f6600569c36e84f064aee6470f1a0149f1f
Author: wizcraft_kris <[email protected]>
AuthorDate: Fri Jul 24 13:41:40 2026 +0800

    fix: align login response contract (#492)
    
    Align frontend LoginResponse type with backend LoginVO contract: change 
flat username/role to nested user.username/admin structure.
---
 web/src/api/auth.test.ts      | 12 ++++++++----
 web/src/api/auth.ts           |  7 +++++--
 web/src/pages/login/index.tsx |  3 +--
 3 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/web/src/api/auth.test.ts b/web/src/api/auth.test.ts
index 6db27b12..c0fcc8fd 100644
--- a/web/src/api/auth.test.ts
+++ b/web/src/api/auth.test.ts
@@ -40,8 +40,11 @@ describe('Auth API', () => {
   it('login should post credentials and return token data', async () => {
     const mockResponse = {
       token: 'jwt-token-123',
-      username: 'admin',
-      role: 'ADMIN',
+      expiresIn: 86400,
+      user: {
+        username: 'admin',
+        admin: true,
+      },
     };
     mock.onPost('/auth/login', { username: 'admin', password: 'secret' 
}).reply(200, {
       data: mockResponse,
@@ -50,8 +53,9 @@ describe('Auth API', () => {
     const result = await login('admin', 'secret');
     expect(result).toEqual(mockResponse);
     expect(result.token).toBe('jwt-token-123');
-    expect(result.username).toBe('admin');
-    expect(result.role).toBe('ADMIN');
+    expect(result.expiresIn).toBe(86400);
+    expect(result.user.username).toBe('admin');
+    expect(result.user.admin).toBe(true);
   });
 
   it('login should handle error response', async () => {
diff --git a/web/src/api/auth.ts b/web/src/api/auth.ts
index 5d1530d6..5abeb807 100644
--- a/web/src/api/auth.ts
+++ b/web/src/api/auth.ts
@@ -25,8 +25,11 @@ export interface LoginRequest {
 
 export interface LoginResponse {
   token: string;
-  username: string;
-  role: string;
+  expiresIn: number;
+  user: {
+    username: string;
+    admin: boolean;
+  };
 }
 
 // ─── Auth ───────────────────────────────────────────────────────
diff --git a/web/src/pages/login/index.tsx b/web/src/pages/login/index.tsx
index 715201c1..37ceca17 100644
--- a/web/src/pages/login/index.tsx
+++ b/web/src/pages/login/index.tsx
@@ -41,8 +41,7 @@ const LoginPage = () => {
     setLoading(true);
     try {
       const data = await loginApi(values.username, values.password);
-      authLogin(data.token, data.username);
-      localStorage.setItem('userrole', data.role);
+      authLogin(data.token, data.user.username);
       message.success(t('login.success'));
       navigate('/', { replace: true });
     } catch (err: unknown) {

Reply via email to