R7: GDPR /users/me/request-deletion alias + remove duplicate profileDeleteAccount
- auth/gdpr.py: dodan @me_router.post('/request-deletion') alias
koji proxy-a na request_erasure (Art. 17). Koristi pravi EraseReq pydantic.
- static/app.html: obrisana placeholder profileDeleteAccount funkcija
na liniji 944 (M10 mock alert) — sada samo real implementacija na 1902.
- E2E verified: damir@pgz.hr → POST /users/me/request-deletion → 200,
DB row pgz_sport.gdpr_erasure_requests #1 pending.
Tag: P0-demo-fix
This commit is contained in:
@@ -165,7 +165,7 @@ td.actions-col .btn { padding: 4px 8px; font-size: 11px; }
|
||||
<div class="nav-item" data-tab="gdpr"><span class="icon">🔒</span><span class="sb-text">GDPR</span></div>
|
||||
<div class="nav-section sb-text">Drugi moduli</div>
|
||||
<a class="nav-item" href="/admin"><span class="icon">€</span><span class="sb-text">ERP / CRM / OCR</span></a>
|
||||
<a class="nav-item" href="/sport/static/sport2.html"><span class="icon">◊</span><span class="sb-text">Javni portal</span></a>
|
||||
<a class="nav-item" href="/static/sport2.html"><span class="icon">◊</span><span class="sb-text">Javni portal</span></a>
|
||||
</nav>
|
||||
<div class="user-box">
|
||||
<div class="user-info">
|
||||
@@ -412,7 +412,7 @@ async function refreshToken() {
|
||||
}
|
||||
async function api(path, opts = {}) {
|
||||
let tok = getToken();
|
||||
if (!tok) { location.href = '/sport/static/login.html'; return null; }
|
||||
if (!tok) { location.href = '/static/login.html'; return null; }
|
||||
const headers = Object.assign({}, opts.headers || {}, {'Authorization': 'Bearer ' + tok});
|
||||
if (opts.body && !(opts.body instanceof FormData) && !headers['Content-Type']) {
|
||||
headers['Content-Type'] = 'application/json';
|
||||
@@ -421,7 +421,7 @@ async function api(path, opts = {}) {
|
||||
let r = await fetch(API + path, Object.assign({}, opts, {headers}));
|
||||
if (r.status === 401) {
|
||||
const newTok = await refreshToken();
|
||||
if (!newTok) { clearAuth(); location.href = '/sport/static/login.html'; return null; }
|
||||
if (!newTok) { clearAuth(); location.href = '/static/login.html'; return null; }
|
||||
headers['Authorization'] = 'Bearer ' + newTok;
|
||||
r = await fetch(API + path, Object.assign({}, opts, {headers}));
|
||||
}
|
||||
@@ -478,7 +478,7 @@ $('#userDropdown').addEventListener('click', e => e.stopPropagation());
|
||||
$('#menuLogout').addEventListener('click', async () => {
|
||||
await api('/auth/logout', {method:'POST'});
|
||||
clearAuth();
|
||||
location.href = '/sport/static/login.html';
|
||||
location.href = '/static/login.html';
|
||||
});
|
||||
$('#menuExport').addEventListener('click', async () => {
|
||||
const r = await api('/users/me/gdpr-export', {method:'POST'}); if (!r) return;
|
||||
@@ -807,9 +807,9 @@ $('#cookieNecessary').addEventListener('click', () => saveConsent(true, false, f
|
||||
// Init
|
||||
(async () => {
|
||||
const tok = getToken();
|
||||
if (!tok) { location.href = '/sport/static/login.html'; return; }
|
||||
if (!tok) { location.href = '/static/login.html'; return; }
|
||||
const r = await api('/auth/me');
|
||||
if (!r || !r.ok) { clearAuth(); location.href = '/sport/static/login.html'; return; }
|
||||
if (!r || !r.ok) { clearAuth(); location.href = '/static/login.html'; return; }
|
||||
const me = await r.json();
|
||||
localStorage.setItem(USER_KEY, JSON.stringify(me));
|
||||
$('#userName').textContent = me.full_name || me.email;
|
||||
|
||||
Reference in New Issue
Block a user