==[ Chromium ]==
** RELOAD **
SyC6tC$ AST-MD Data
Synkronoi RAM & IndexedDB
RAM-tila (JS Objektina)
{}
** CLICK: Synkronoi **
RAM-tila (JS Objektina)
{
"crm_101": {
"nimi": "Tech Oy",
"status": "aktiivinen",
"roolit": [
"admin",
"user"
],
"yhteyshenkilo": {
"nimi": "Matti",
"email": "matti@tech.fi"
}
}
}
** RELOAD **
SyC6tC$ AST-MD Data
Synkronoi RAM & IndexedDB
RAM-tila (JS Objektina)
{
"crm_101": {
"nimi": "Tech Oy",
"status": "aktiivinen",
"roolit": [
"admin",
"user"
],
"yhteyshenkilo": {
"nimi": "Matti",
"email": "matti@tech.fi"
}
}
}
==
Mahtavaa! TC$mC$ loki vahvistaa sen: **isomorfinen WAL (Write-Ahead Log) ja
re-hydration toimivat tC$ydellisesti.** RAM-muistin tila palautuu
salamannopeasti asynkronisesta taustavarastosta heti sivun latauduttua.
Koska perusrakenne (`PUT` ja lokin toisto) on nyt todistettu, voimme siirtyC$
hienojakoisempiin operaatioihin: osittaiseen pC$ivitykseen (**PATCH**) ja
poistoon (**DELETE**).
TC$mC$n arkkitehtuurin (Event Sourcing) hienous piilee siinC$, ettC$ `DELETE`
ei fyysisesti pyyhi aiempia rivejC$ tietokannasta, vaan se vain lisC$C$ lokiin
uuden tapahtuman: `op: 'DELETE'`. Kun loki toistetaan (re-hydration),
poistotapahtuma kumoaa aiemman lisC$yksen RAM-muistissa. TC$mC$ mahdollistaa
tulevaisuudessa asioita kuten *"undo"* tai tC$ydellisen audit-lokin (kuka
muutti, mitC$ ja milloin).
PC$ivitetC$C$n `obase.js` ja `index.html` tukemaan nC$itC$. (TaustasC$iettC$
`worker.js` ei tarvitse muuttaa lainkaan, sillC$ se tallentaa sokeasti kaikki
sille lC$hetetyt mutaatiot!)
### 1. PC$ivitetC$C$n Ydin (`obase.js`)
LisC$tC$C$n `OBaseBrowser`-luokkaan uudet metodit `patch` ja `delete`, ja
opetetaan `applyWAL` ymmC$rtC$mC$C$n `PATCH`-tapahtuma.
```
### 2. PC$ivitetC$C$n KC$yttC6liittymC$ (`index.html`)
LisC$tC$C$n pari nappia, joilla voimme suorittaa nC$itC$ REST-tyyppisiC$
API-kutsuja suoraan selaimesta ja nC$hdC$, miten RAM (ja sitC$ kautta loki)
reagoi.
Muokkaa `index.html` kC$yttC6liittymC$osaa ja skriptiC$ nC$in:
```html
<!-- HTML-muutokset div(class="col") sisC$lle -->
<div class="col">
<h3>SyC6tC$ AST-MD Data</h3>
<textarea id="astInput">
# Collection: asiakkaat
> Metadata: {"schema": "free"}
## Object: crm_101
- nimi: Tech Oy
- status: aktiivinen
- roolit: [ "admin", "user" ]
</textarea>
<button id="syncBtn">1. Synkronoi AST-MD (PUT)</button>
<hr>
<!-- UUDET NAPIT -->
<button id="patchBtn" style="background: #e68a00;">2. PC$ivitC$ status
(PATCH)</button>
<button id="deleteBtn" style="background: #cc0000;">3. Poista crm_101
(DELETE)</button>
</div>
```
```javascript
// --- LISCC NCMC startApp() funktion sisC$lle index.html:ssC$ ---
// API: PATCH-testi
document.getElementById('patchBtn').addEventListener('click', () => {
db.patch('asiakkaat', 'crm_101', {
status: "passiivinen",
viimeksi_muokattu: new Date().toISOString()
});
renderRAM();
});
// API: DELETE-testi
document.getElementById('deleteBtn').addEventListener('click', () => {
db.delete('asiakkaat', 'crm_101');
renderRAM();
});
```
### Testausprotokolla:
1. **Lataa sivu (F5)** ja paina "1. Synkronoi". Objekti ilmestyy.
2. Paina **"2. PC$ivitC$ status"**. Huomaat, ettC$ RAM-ikkunassa `status`
muuttuu passiiviseksi ja uusi kenttC$ `viimeksi_muokattu` ilmestyy (ilman,
ettC$ muita tietoja ylikirjoitettiin).
3. Lataa sivu **F5**. Tiedot palautuvat pC$ivitetyssC$ muodossaan (koska
lokissa toistetaan ensin `PUT` ja sen pC$C$lle `PATCH`).
4. Paina **"3. Poista crm_101"**. RAM tyhjenee kohteesta.
5. Lataa sivu **F5**. RAM pysyy tyhjC$nC$, koska re-hydration suoritti lokin
lopussa poiston.
TC$mC$ todistaa sen, miten tehokas tC$mC$ arkkitehtuuri on. Se ei vaadi
monimutkaisia SQL-tauluja, vaan kaikki on yksinkertaista objektien
mutaatiovirtaa.