Fix CustomerType and OwnerType enums: send int instead of string
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:
Claw AI
2026-03-28 14:15:40 +00:00
parent 9cddee841b
commit 6394f1d71a
12 changed files with 166 additions and 100 deletions

View File

@ -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();
},
});