Fix CustomerType and OwnerType enums: send int instead of string
Some checks failed
Build frontend / build (push) Failing after 45s
Some checks failed
Build frontend / build (push) Failing after 45s
- CustomerType: PERSONAL=0, FAMILY=1 (was 'Personal', 'Family') - OwnerType: PERSON=0, REAL_ESTATE_AGENCY=1 (was 'peerson', 'RealEstateAgency') - Backend Type column is int(11), sending strings caused 415 errors
This commit is contained in:
@ -1,50 +1,117 @@
|
||||
/**
|
||||
* AuthService
|
||||
* Manages authentication tokens securely using localStorage.
|
||||
*
|
||||
* Methods:
|
||||
* addToken(token) — store JWT token
|
||||
* getToken() — retrieve JWT token
|
||||
* deleteToken() — remove JWT token
|
||||
* Manages authentication tokens and user role detection via JWT decoding.
|
||||
*
|
||||
* Usage:
|
||||
* import AuthService from '@/app/services/AuthService';
|
||||
* AuthService.addToken(token);
|
||||
* const token = AuthService.getToken();
|
||||
* AuthService.deleteToken();
|
||||
* Roles (from JWT claims):
|
||||
* - Owner: roles array contains "Owner"
|
||||
* - Customer: authenticated but no "Owner" role
|
||||
* - Guest: no token
|
||||
*
|
||||
* Methods:
|
||||
* addToken(token) — store JWT token
|
||||
* getToken() — retrieve JWT token
|
||||
* deleteToken() — remove JWT token
|
||||
* decodeToken() — decode JWT payload
|
||||
* getUser() — get decoded user info
|
||||
* getRoles() — get roles array from JWT
|
||||
* isOwner() — check if user has Owner role
|
||||
* isCustomer() — check if user is authenticated but not Owner
|
||||
* isGuest() — check if no token exists
|
||||
* isAuthenticated() — check if token exists
|
||||
*/
|
||||
|
||||
const TOKEN_KEY = 'auth_token';
|
||||
|
||||
const AuthService = Object.freeze({
|
||||
/**
|
||||
* Store token in localStorage
|
||||
* @param {string} token — JWT string
|
||||
*/
|
||||
addToken(token) {
|
||||
if (!token || typeof token !== 'string') {
|
||||
console.error('[AuthService] addToken: invalid token', token);
|
||||
return;
|
||||
}
|
||||
if (!token || typeof token !== 'string') return;
|
||||
localStorage.setItem(TOKEN_KEY, token);
|
||||
console.log('[AuthService] Token stored');
|
||||
},
|
||||
|
||||
/**
|
||||
* Retrieve token from localStorage
|
||||
* @returns {string|null}
|
||||
*/
|
||||
getToken() {
|
||||
const token = localStorage.getItem(TOKEN_KEY);
|
||||
console.log('[AuthService] getToken:', token ? '***exists***' : null);
|
||||
return token;
|
||||
return localStorage.getItem(TOKEN_KEY);
|
||||
},
|
||||
|
||||
/**
|
||||
* Remove token from localStorage
|
||||
*/
|
||||
deleteToken() {
|
||||
localStorage.removeItem(TOKEN_KEY);
|
||||
console.log('[AuthService] Token deleted');
|
||||
},
|
||||
|
||||
/**
|
||||
* Decode JWT payload (base64)
|
||||
* @returns {object|null}
|
||||
*/
|
||||
decodeToken() {
|
||||
const token = this.getToken();
|
||||
if (!token) return null;
|
||||
try {
|
||||
const payload = token.split('.')[1];
|
||||
return JSON.parse(atob(payload));
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Extract user info from JWT
|
||||
* @returns {object|null} — { id, name, email, phone, roles }
|
||||
*/
|
||||
getUser() {
|
||||
const payload = this.decodeToken();
|
||||
if (!payload) return null;
|
||||
|
||||
return {
|
||||
id: payload['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier'] || payload.sub || null,
|
||||
name: payload['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name'] || null,
|
||||
email: payload['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'] || null,
|
||||
phone: payload['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/mobilephone'] || null,
|
||||
roles: this.getRoles(),
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Get roles array from JWT
|
||||
* @returns {string[]}
|
||||
*/
|
||||
getRoles() {
|
||||
const payload = this.decodeToken();
|
||||
if (!payload) return [];
|
||||
const roles = payload['http://schemas.microsoft.com/ws/2008/06/identity/claims/role'];
|
||||
if (Array.isArray(roles)) return roles;
|
||||
if (typeof roles === 'string') return [roles];
|
||||
return [];
|
||||
},
|
||||
|
||||
/**
|
||||
* User has Owner role
|
||||
* @returns {boolean}
|
||||
*/
|
||||
isOwner() {
|
||||
const roles = this.getRoles();
|
||||
return roles.includes('Owner');
|
||||
},
|
||||
|
||||
/**
|
||||
* Authenticated user without Owner role (i.e. customer)
|
||||
* @returns {boolean}
|
||||
*/
|
||||
isCustomer() {
|
||||
return this.isAuthenticated() && !this.isOwner();
|
||||
},
|
||||
|
||||
/**
|
||||
* No token — guest user
|
||||
* @returns {boolean}
|
||||
*/
|
||||
isGuest() {
|
||||
return !this.getToken();
|
||||
},
|
||||
|
||||
/**
|
||||
* Token exists
|
||||
* @returns {boolean}
|
||||
*/
|
||||
isAuthenticated() {
|
||||
return !!this.getToken();
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user