LumenSpark - dokumentacija
Interna razvojna dokumentacija

Kako je složen LumenSpark

Vodič kroz arhitekturu aplikacije pisan tako da ga može pratiti i developer koji tek počinje. Svaka tema ide redom: što je to → kako radi baš ovdje → primjer iz koda.

01

Uvod - što je LumenSpark

LumenSpark je interni alat za vođenje projekata u agenciji (LumenHope PM). Zamjenjuje Jira/ClickUp i objedinjuje: projekte, zadatke (Kanban ploča), evidenciju radnog vremena, odsustva, troškove, izvještaje i analitiku - te povlači podatke iz Clockifyja i Jire.

Koriste ga četiri tipa korisnika: superadmin, admin, voditelj projekta (PM) i zaposlenik. Svaki vidi i smije različite stvari (vidi poglavlje o ulogama).

Najnoviji sloj je AI pomoć (Anthropic Claude): od ⌘K trake za pitanja do izvršnog sažetka. Pravilo je strogo - brojke uvijek računa kod, AI ih samo opisuje ljudskim jezikom (vidi poglavlje o AI-u).

💡
Za početnike: aplikacija ima dva dijela koja razgovaraju jedan s drugim - frontend (ono što vidiš u pregledniku) i backend (server koji čuva i vraća podatke). Cijela ova dokumentacija objašnjava kako ta dva dijela surađuju.
02

Tehnologije (stack)

Namjerno je biran jednostavan, klasičan stack bez velikih frameworka - lakše ga je hostati na običnom cPanel serveru i lakše ga je razumjeti.

SlojTehnologijaČemu služi
BackendPHP 8.2Logika na serveru, obrada zahtjeva
BazaMySQL + PDOPohrana podataka (sigurni upiti)
FrontendČisti JavaScript (Vanilla)Sučelje, bez Reacta/Vuea
GrafoviChart.jsDijagrami u analitici
Drag & dropSortableJSPovlačenje kartica na Kanbanu
PDFpdfmake (+ html2canvas)Izvoz izvještaja u PDF
AIAnthropic Claude APISažetci, narativi i ⌘K asistent
HostingcPanel (lumenspark.eu)Klasičan shared server
ℹ️
Bez frameworka znači da nema „skrivene magije" - sve što se događa, događa se u datotekama koje vidiš. To je sjajno za učenje.
03

Velika slika arhitekture

LumenSpark ima tri jasna sloja: preglednik (ono što korisnik vidi), server (PHP) i baza. Kad korisnik nešto klikne, frontend pošalje zahtjev na jedan ulaz na serveru - api/index.php - koji prepozna što se traži, proslijedi pravom kontroleru, a ovaj razgovara s bazom i vrati odgovor.

Arhitektura u tri sloja PREGLEDNIK · frontend index.html - jedina stranica (SPA) JS moduli: state · boot · render · events · … CSS: app.css (tokeni + komponente) + moduli SERVER · PHP api/index.php - ROUTER provjera prijave + CSRF + mapa od 180 ruta 37 kontrolera svi nasljeđuju BaseController (respond · validate · requireAuth) Clockify / Jira sync MySQL baza - ls_* (40+ tablica) ① zahtjev - fetch POST ?action + CSRF ② PDO - pripremljeni upit ③ JSON odgovor → render()
Tri sloja i tijek jednog zahtjeva: ① zahtjev → ② upit u bazu → ③ JSON natrag.
  • ① Zahtjev - frontend šalje fetch POST s poljem action (npr. get_projects) i sigurnosnim CSRF tokenom.
  • ② Upit - router u mapi ruta nađe kontroler; on provjeri prijavu i izvrši pripremljeni SQL upit (PDO).
  • ③ Odgovor - baza vrati podatke, kontroler ih pošalje kao JSON, frontend osvježi ekran (render()).
💡
Za početnike - zašto jedan ulaz? Umjesto desetak PHP datoteka, sve ide kroz api/index.php. Tako se na jednom mjestu provjeri prijava i sigurnost te odluči kamo zahtjev ide. To je router.
04

Struktura mapa + pregled koda

Cijela aplikacija živi u mapi app/. Prvo gdje je što, a zatim klikabilni pregled svih kontrolera, JS modula i CSS datoteka.

  • app/
    • index.html - jedina HTML stranica (SPA)
    • config.php - pristup bazi (ne dira se)
    • api/ - backend (PHP): router + 37 kontrolera
    • js/ - frontend: 79 modula
    • css/ - 73 CSS (71 učitanih)
    • language/ - prijevodi hr / en / de
    • install/ - instalacija + migracije baze
    • tests/ - automatski testovi
    • assets/ - slike, logo, fontovi
    • uploads/ - avatari, logotipi (učitano)
💡
Za početnike: svaka značajka ima svoj ime.js i ime.css s istim prefiksom (npr. kanban-). Niže klikni bilo koju datoteku da vidiš njezine metode/funkcije, varijable i objašnjenje.

Klikabilni pregled koda

Odaberi skupinu, klikni stavku - desno se otvori popis metoda/funkcija, varijabli i kratko objašnjenje.

05

Backend - router, kontroleri, sigurnost

Router (api/index.php)

Frontend uvijek šalje POST zahtjev s poljem action (npr. "get_projects"). Router ima mapu ruta koja svaku akciju spaja s kontrolerom i metodom (ukupno 180 ruta):

api/index.php - mapa ruta
$routes = [
  'get_projects'  => [Projects::class, 'getAll'],
  'save_project'  => [Projects::class, 'save'],
  'move_task'     => [Kanban::class,   'moveTask'],
  // ... još 177 ruta
];

Router također vraća uvijek JSON i ima globalni „hvatač grešaka" - ako nešto pukne, korisnik dobije uredan JSON, a ne ružnu PHP grešku.

BaseController - zajednička osnova

Svaki kontroler nasljeđuje BaseController, koji nudi alate koje svi koriste:

  • respond($data) - vrati uspješan JSON odgovor
  • respondError(code, msg, status) - vrati grešku
  • validate($rules) - provjeri ulazna polja (required|min|max|email|numeric|date)
  • requireAuth() - zahtijeva prijavu (inače 401)
  • requireAdmin() - zahtijeva admin/superadmin ulogu (inače 403)
primjer kontrolera - Projects::getAll()
public function getAll(): void {
    $this->requireAuth();                       // 1. mora biti prijavljen
    $rows = $this->pdo
        ->query("SELECT * FROM ls_projects ORDER BY name ASC")
        ->fetchAll();                            // 2. dohvati iz baze
    $this->respond($rows);                       // 3. vrati JSON
}

Sigurnost

MehanizamKako radi
SesijaNakon prijave server pamti korisnika u $_SESSION['ls_user']
CSRF token (default-deny)Svaki zahtjev nosi tajni token (X-CSRF-Token). Model je obrnut: token se traži za sve akcije osim malog popisa izuzetaka - tako je svaka nova ruta sigurna po defaultu
Javne vs zaštićene akcijeSamo login, logout, check_auth i nekoliko test-akcija su javne; sve ostalo traži prijavu
UlogerequireAdmin() + provjera vlasništva (zaposlenik dira samo svoje)
EnkripcijaTokeni konektora (Clockify/Jira/Slack/Anthropic) šifrirani (AES-256-CBC) u bazi
Lozinkebcrypt hash + ograničavanje pokušaja prijave (rate-limit/lockout) i obnova sesije
CORSServer prima zahtjeve samo s domene lumenspark.eu
06

Baza podataka

Sve tablice imaju prefiks ls_. Glavne:

TablicaČemu služi
ls_usersKorisnički računi i lozinke za prijavu
ls_membersČlanovi tima (i njihova satnica/trošak)
ls_projectsProjekti (status, budžet, klijent, izvor)
ls_tasksZadaci / Kanban kartice (kolona, sprint, epic)
ls_time_entriesEvidencija radnog vremena
ls_absences / ls_absence_typesOdsustva (godišnji, bolovanje…) i njihovi tipovi
ls_expenses / ls_expense_categoriesTroškovi i kategorije troškova
ls_milestonesPrekretnice na projektima
ls_partnersPoslovni partneri / klijenti
ls_settings / ls_company_settingsPostavke aplikacije i tvrtke
ls_active_timersTimeri koji trenutno teku
⚠️
Važno za juniore: id u ls_projects i ls_members je VARCHAR (jer dolazi kao tekstualni ID iz Clockifyja/Jire), a ne broj. ls_tasks.id jest broj. Lako se zaboravi.
ℹ️
Novije značajke dodaju još ls_ tablica (ukupno ~40) kroz SQL migracije - npr. ls_roles + ls_role_modules (matrica prava), ls_board_columns + ls_sprints (Kanban), ls_ai_usage (potrošnja AI-a), ls_audit_log (revizijski trag), ls_billing_phases (faze naplate), ls_allocations (alokacije).

Kako se mijenja shema

Ne dira se baza „ručno napamet". Promjene idu kroz datoteke install/migrate_*.php ili kroz SQL koji se zalijepi u phpMyAdmin (server nema pristup information_schema, pa se koriste samo SHOW + izmjene po tablici).

07

Frontend - kako radi sučelje

Frontend je SPA (Single Page Application) - postoji samo index.html, a JavaScript mijenja sadržaj bez ponovnog učitavanja stranice. index.html učitava ~89 skripti određenim redom (redoslijed je bitan).

Memorija - state.js (objekt S)

Sve što aplikacija „pamti" dok radi živi u jednom globalnom objektu S: koji je ekran otvoren (S.activeTab), tko je prijavljen (S.currentUser, S.currentUserRole), učitani projekti i članovi (S.projectsDB, S.membersDB) itd.

Pokretanje - boot.js

Prikazuje preloader, vodi prijavu (doLogin), postavlja korisnika (setCurrentUser) i slaže izbornik prema ulozi (_applyRoleSidebar - skriva/pokazuje stavke).

Crtanje ekrana - render.js

Funkcija renderTab() gleda S.activeTab i poziva pravu funkciju za taj ekran:

js/render.js - pojednostavljeno
function renderTab(){
  if (S.activeTab === 'dashboard') { renderDashboard(); return; }
  if (S.activeTab === 'kanban')    { renderKanban();    return; }
  if (S.activeTab === 'projects_db'){ renderProjectsDB(); return; }
  // … itd.
}

Klikovi - events.js

Umjesto da svaki gumb ima svoj onclick, koristi se delegacija: jedan slušač na cijelom dokumentu hvata klik i gleda atribut data-action.

js/events.js - delegacija
document.addEventListener('click', function(e){
  var t = e.target.closest('[data-action]');
  if (!t) return;
  var act = t.getAttribute('data-action');   // npr. "edit-proj"
  // … pozovi odgovarajuću funkciju
});

Prijevodi - language/

Tekstovi se ne pišu „tvrdo" nego kroz funkciju t('kljuc'), koja vrati prijevod za trenutni jezik (hr/en/de). Ako prijevod ne postoji, vrati se sam ključ.

08

Dizajn sustav i CSS

Da sve izgleda jednako, postoji jedan izvor istine za stil u app.css: tokeni (boje, razmaci, zaobljenja) i kanonske komponente koje se koriste posvuda.

Tokeni (varijable boja)

Boje se nikad ne pišu kao „goli" hex, nego preko varijabli - promjena na jednom mjestu mijenja cijelu aplikaciju.

--brand:#1c4532;  --green:#0a7c4e;  --blue:#0066cc;
--bg:#f4f4f0;     --bg2:#ffffff;    --border:#ddddd8;

Kanonske komponente

KomponentaZa što
.th / .tr / .col-hTablice (sve tablice izgledaju isto)
.s-btn (+.primary/.sec)Gumbi u zaglavljima i modalima
.icon-btn (+.danger)Mali gumbi u redovima tablice
.badge (+.b-green…)Statusne „pilule" (Aktivan, Završen…)
.modal / .empty-s / .ttSkočni prozori, prazna stanja, tooltipovi

Modul table-enhance automatski daje svim tablicama sortiranje (klik na zaglavlje) i nježni zeleni rollover reda pod mišem.

Kako je CSS posložen (slojevi)

CSS se gradi u slojevima - od temelja prema gore. Svaki viši sloj smije koristiti i nadograditi ono ispod sebe, ali temelj (app.css) ne ovisi ni o čemu.

Slojevi CSS-a Pet slojeva CSS-a: temelj app.css, zatim table-enhance, okvir, moduli i KPI trake. Viši sloj nadograđuje niži. ▲ svaki viši sloj nadograđuje onaj ispod 5 · KPI trake: *-kpi · kpi-strip 4 · moduli (~65): kanban · projects · reporting · gantt … 3 · okvir: sidebar · subpage · slideover · render · boot · load 2 · table-enhance - sort + row-hover (sve tablice) 1 · app.css - TEMELJ: tokeni + kanonske komponente
Slojevi: app.css je temelj; sve iznad ga koristi i nadograđuje.

Redoslijed učitavanja - „koji se vuku"

index.html učitava 71 CSS datoteke točnim redom. Najvažnije pravilo: app.css ide PRVI, jer definira tokene i komponente o kojima ovise svi ostali.

SlojDatoteke (redom)Uloga
1 · Temeljapp.cssTokeni + sve kanonske komponente (svi ovise o njemu)
2 · Ponašanjetable-enhance.cssSort + row-hover za sve tablice
3 · Okvirsidebar-brand · sidebar · sidebar-nav · subpage · slideover · render · boot · load · preloaderIzbornik, podstranice, paneli, učitavanje
4 · Modulireporting · settings · projects · kanban · gantt · analytics · partners … (~40)Stil pojedine značajke - prefiks ime-
5 · KPI trakedashboard-kpi · employee-kpi · expenses-kpi · vacation-kpi · kpi-strip …Kartice s pokazateljima
💡
Za početnike: app.css se ne dira napamet - promijeniš li token tamo, mijenja se cijela aplikacija. Stil pojedine značajke ide u njezin ime.css (s prefiksom). Cijeli klikabilni popis svih CSS datoteka je u poglavlju 04.
ℹ️
Na disku je 73 CSS datoteke, a 71 ih je u glavnom učitavanju. landing.css se učita na login ekranu, a app-legacy.css je stari (postupno se uklanja).
09

Uloge i prava

Vidljivost u izborniku i dozvole na serveru ovise o ulozi:

UlogaŠto vidi / smije
superadminSve, uključujući tehničke postavke i sistemske alate
adminSvi projekti, financije, tim, postavke, Kanban
PMSvoji projekti, tim & analitika, Kanban - bez punih financija
zaposlenikDashboard, svoji projekti, moja statistika, radno vrijeme, Kanban (vuče samo svoje kartice)

Matrica prava (RBAC) - can()

Prava se ne provjeravaju usporedbom imena uloge razbacanom po kodu, nego kroz jednu matricu: tablice ls_roles (uloge) × ls_role_modules (koji modul i na kojoj razini smije uloga). Postoji jedan središnji „rješavač":

  • Backend: Permissions.php napuni prava u sesiju jednom pri loginu; svaka akcija pita can(modul, razina).
  • Frontend: perms.js nudi lsCan() / canModule() - sučelje sakrije ono što korisnik ne smije.

Na frontendu izbornik slaže _applyRoleSidebar() (liste empHidden/empVisible u boot.js). Sigurnosno pravilo ostaje: prava zaštita je na serveru.

ℹ️
Zašto matrica? Ranije su prava bila „tvrdo" upisana usporedbom uloge (npr. if role === 'admin') na stotinama mjesta - teško za održavanje i lako za grešku. Sada je sve na jednom mjestu: dodaš redak u matricu i prava odmah vrijede.
⚠️
Sigurnosno pravilo: skrivanje stavke u izborniku nije sigurnost. Prava zaštita je uvijek na serveru (kontroler). Frontend samo „uljepšava".
10

Integracije - Clockify i Jira

Aplikacija povlači podatke iz vanjskih alata. Postavljaju se u Postavke → Konektori (API ključ se šifrira prije spremanja).

  • Clockify - sinkronizira projekte, članove i evidenciju vremena.
  • Jira - uvozi zadatke (issues) u ls_tasks kao Kanban kartice (REST v3 proxy).
  • Slack - šalje obavijesti o događajima (npr. novi zadatak, odobreno odsustvo) na kanal.
  • Anthropic Claude - AI pozivi za sažetke i narative (vidi poglavlje o AI-u).

Uvoz je jednosmjeran i ponovljiv (pull/upsert): povuče i ažurira, ali ne piše natrag u Clockify/Jiru. Pokreće se ručno i siguran je za ponavljanje (idempotentan).

ℹ️
Napomena: za Jira uvoz potreban je klasičan API token; „scoped" token se autentificira ali ne vraća projekte.
11

AI značajke

LumenSpark ima ugrađen AI sloj koji koristi Anthropic Claude. On ne zamjenjuje aplikaciju - on je pomoćnik koji čita gotove podatke i objašnjava ih ljudskim jezikom.

⚠️
Zlatno pravilo (grounding): sve brojke računa PHP, deterministički (prihod, trošak, marža, sati, kapacitet). AI nikad sam ne računa financije - on samo opisuje i tumači već izračunate, provjerljive brojke. Time se sprječava „halucinacija" (izmišljanje brojki).

Šest živih AI značajki

ZnačajkaAkcija (ruta)Što radi
⌘K Spark trakaai_askBrza traka (tipka ⌘K / Ctrl+K) za pitanja o tvrtki; pamti tijek razgovora (multi-turn)
AI sažetak projektaai_project_summaryKratak narativ o stanju projekta
AI prijedlog timaai_team_suggestPrijedlog tko bi mogao raditi na projektu
AI prijedlog backlogaai_backlog_suggestPrijedlog zadataka za Kanban backlog
AI tumačenje ekranaai_narrateGumb „AI tumačenje" na Novčanom tijeku i Utilizaciji
Izvršni narativexec_narrativeSažetak / Financije / Rizici / Preporuke za upravu (vidi Exec360)

Kako radi (jednostavno)

  • api/Ai.php je tanki shim - jedna ulazna točka koja zove Anthropic API i vraća tekst.
  • API ključ je šifriran (AES-256-CBC) u ls_settings; postavlja se u Konektorima.
  • Svaki poziv se zabilježi u ls_ai_usage (model, tokeni, procijenjeni trošak) - da se vidi potrošnja.
  • api/AiAssist.php i api/AiNarrate.php prvo sastave snapshot (gotove brojke iz PHP-a), pa to pošalju AI-ju da napiše tekst.
ℹ️
AI akcije nisu javne - sve traže prijavu (requireAuth) i CSRF token, jednako kao i ostale osjetljive rute.
12

Kanban i vođenje projekata

Kanban je vizualna ploča sa zadacima koji putuju kroz kolone (npr. Za napraviti → U tijeku → Gotovo). Cilj mu je zamijeniti Jiru za svakodnevni rad.

DioTablica / tehnologijaObjašnjenje
Kartice (zadaci)ls_tasksTip (epic/story/task/bug), prioritet, story points, izvršitelj, kolona
Kolonels_board_columnsPo projektu; svaki projekt ima svoju ploču (1 projekt : 1 ploča)
Sprintovils_sprintsSamo za projekte tipa scrum; kanban projekti ih ignoriraju
Povlačenje karticaSortableJSDrag & drop kartice iz kolone u kolonu

Polje board_type na projektu određuje radi li se o čistom Kanbanu ili Scrumu (sa sprintovima). Zadaci se mogu uvesti iz Jire (jednosmjerno, ponovljivo), a na svaki zadatak može se klokati vrijeme (timer veže sat uz karticu).

💡
Za početnike: „epic" je velika tema koja se dijeli na manje zadatke; „story points" su gruba procjena težine zadatka. Sve to su samo stupci u tablici ls_tasks.
13

Sigurnost - detaljno

Sigurnost je posložena u više slojeva. Junioru je najvažnije zapamtiti: provjera je uvijek na serveru, a podaci se nikad ne lijepe „goli" u SQL.

SlojKako štiti
PrijavaLozinke su bcrypt hash; previše pogrešnih pokušaja privremeno zaključa; sesija se obnovi (regenerate) pri prijavi
CSRF (default-deny)Token se traži za sve akcije osim malog popisa javnih - svaka nova ruta je sigurna po defaultu
SQL injectionPripremljeni upiti (PDO) posvuda - vrijednosti idu odvojeno od SQL teksta
XSSSav tekst koji dolazi od korisnika prolazi kroz esc() / escJs() prije ispisa
TajneTokeni konektora šifrirani (AES-256-CBC); nikad u čistom tekstu
Server (.htaccess)Sigurnosni headeri + CSP; blokiran pristup config.php, logovima i instalaciji
Prava (RBAC)Središnja matrica can(modul, razina) - vidi poglavlje o ulogama
⚠️
Pravilo broj jedan: skrivanje gumba na frontendu nije zaštita. Napadač može pozvati rutu izravno - zato svaka osjetljiva ruta mora sama provjeriti prijavu i pravo.
14

Izvršni izvještaj (Exec360)

Exec360 je jedan ekran za upravu - „cockpit" koji na jednom mjestu pokaže novac i smjer tvrtke: KPI kartice (prihod, trošak, dobit, marža), grafove i kratak AI sažetak.

  • exec_snapshot - jedan endpoint koji agregira sve ključne brojke (PHP ih izračuna).
  • exec_narrative - AI iz tog snapshota napiše Sažetak → Financije → Rizici → Preporuke.
  • Izvještaj se može izvesti u PDF (pdfmake, dizajn iz reporting-pdf.css).
ℹ️
I ovdje vrijedi zlatno pravilo: PHP računa sve brojke, AI samo piše narativ. Na ekranu stoji oznaka da je tekst AI-generiran i da ga treba provjeriti prije slanja.
15

Chrome ekstenzija (Spark)

Uz aplikaciju postoji i mala Chrome ekstenzija (MV3, verzija 1.1.3) za brzo klokanje vremena. Zaposlenik iz alatne trake preglednika odabere projekt i zadatak te pokrene/zaustavi mjerenje - bez otvaranja cijele aplikacije.

SvojstvoDetalj
Što mijenja na serveruNišta - koristi postojeće rute (login, check_auth, timer_start/stop/status)
Gdje živi timerNa serveru (ls_active_timers) - broji i kad je preglednik ugašen
DozvoleMinimalne: samo storage + alarms; pristup samo domeni lumenspark.eu
💡
Za početnike - zašto poseban auth ritam: u MV3 se pozadinski „service worker" gasi nakon ~30s, pa se pri svakom ciklusu (svakih 30s) prvo osvježi prijava (check_auth) da se dobije svjež CSRF token, a tek onda javi status timera.
16

Životni ciklus zahtjeva - korak po korak

Pratimo što se dogodi kad korisnik klikne npr. „Spremi projekt":

  1. Klik u pregledniku - gumb ima data-action="save-project".
  2. events.js uhvati klik i pozove pravu JS funkciju.
  3. Funkcija pozove apiCall('save_project', podaci) - to je fetch POST na /api/ s X-CSRF-Token u zaglavlju.
  4. api/index.php pročita action i u mapi ruta nađe [Projects, 'save'].
  5. Kontroler napravi requireAuth(), provjeri podatke i izvrši pripremljeni SQL upit.
  6. Vrati JSON: { "ok": true, … } ili grešku { "ok": false, "error": … }.
  7. JS osvježi S (memoriju) i ponovno nacrta ekran (renderTab()).
💡
Za početnike: „pripremljeni upit" (prepared statement) znači da se vrijednosti ne lijepe izravno u SQL tekst, nego se šalju odvojeno. To sprječava SQL injection (napad ubacivanjem koda).
17

Testiranje

Postoje tri sloja provjere - cilj je da se promjena ne „provuče" i pokvari nešto drugo:

SlojŠto provjeravaKako se pokreće
1 · Browser asserti~2800 provjera ponašanja u tests.jsU aplikaciji (gumb „Debug")
2 · Node guardoviProvjere na razini koda (svaki tests/*.test.js)node tests/ime.test.js
3 · Lint pravilaBez golog hexa, bez sirovih <table> u modulima…node tests/lint-rules.js
18

Deploy (objava na server)

Objava ide ručno preko cPanel File Managera (nema terminala ni lokalnog servera):

  1. Uploadaj promijenjene datoteke u odgovarajuće mape (js/, css/, api/…).
  2. Promijeni ?v= broj uz CSS/JS u index.html - inače preglednik servira staru verziju iz keša.
  3. Promjene baze: zalijepi SQL u phpMyAdmin.
  4. Otvori aplikaciju uz Ctrl + Shift + R (tvrdi refresh).
⚠️
Najčešća zamka: zaboravljen ?v= bump → preglednik pokaže staru datoteku i čini se da „promjena ne radi". Uvijek povećaj broj.
19

Rječnik pojmova

PojamObjašnjenje
SPASingle Page App - jedna HTML stranica, JS mijenja sadržaj
RouterDio koji odlučuje koji kod obrađuje koji zahtjev
Endpoint / akcijaImenovana operacija na serveru (npr. get_projects)
KontrolerPHP klasa koja obrađuje skup povezanih akcija
SesijaServer pamti prijavljenog korisnika između zahtjeva
CSRF tokenTajni ključ koji dokazuje da zahtjev dolazi iz naše aplikacije
PDOPHP-ov siguran način razgovora s bazom
Prepared statementUpit gdje su vrijednosti odvojene od SQL teksta (sigurnost)
Token (tokeni boja)CSS varijabla, npr. var(--brand)
i18nVišejezičnost (hr/en/de)
Slide-overPanel koji „uđe" sa strane (detalj kartice)
SSOTSingle Source Of Truth - jedna službena verzija koda (zadnji ZIP)
RBACRole-Based Access Control - prava se dodjeljuju ulogama kroz matricu (uloge × moduli)
can() / lsCan()Središnja provjera „smije li ova uloga ovo" (backend i frontend)
GroundingAI koristi isključivo gotove, izračunate brojke - ne izmišlja
SnapshotPaket gotovih brojki koji PHP složi i pošalje AI-ju da napiše tekst
ShimTanki posrednički sloj prema vanjskom servisu (npr. Ai.php prema Anthropicu)
MV3Manifest V3 - moderni format Chrome ekstenzija (pozadinski worker se gasi)
Default-denySigurnosni model: sve je zabranjeno osim izričito dopuštenog (npr. CSRF izuzeci)
RAGStatus: zeleno / žuto / crveno
20

Recept: kako dodati novu funkcionalnost

Kratki podsjetnik - koraci kad dodaješ npr. novi popis na ekranu:

  1. Backend: dodaj metodu u kontroler + upiši rutu u mapu $routes (s requireAuth() i pripremljenim upitom).
  2. Frontend: napravi ime.js + ime.css (isti prefiks) i registriraj ih u index.html.
  3. Komponente: koristi kanonske (.th/.tr, .s-btn, .badge…) i tokene - bez golog hexa.
  4. Jezici: dodaj tekstove u sva tri (hr/en/de).
  5. Uloge: provjeri tko smije vidjeti/raditi (gate na serveru!).
  6. Testovi: dodaj guard u tests/ i provjeri lint.
  7. Deploy: bumpaj ?v= i Ctrl+Shift+R.
ℹ️
Detaljniji protokol postoji u internim pravilima (02-nova-funkcionalnost.md) - ovaj recept je sažetak.
LumenSpark - interna dokumentacija arhitekture · v1.0 · SSOT Zadnji254 · Lumen Spei d.o.o., Osijek.