### Fastify API Gateway - Toteutusmalli
TC$ssC$ on minimaalinen ja C$C$rimmC$isen nopea Fastify-palvelin, joka tarjoaa
JSON-rajapinnan ihmisille/kC$yttC6liittymille ja AST-MD -rajapinnan
tekoC$lyboteille.
```javascript
/ server.js
import Fastify from 'fastify';
import { OBaseNode } from './obase-node.js'; // Sama ydin, eri WAL-adapteri
import { ASTMDParser } from './obase.js';
const fastify = Fastify({ logger: true });
const db = new OBaseNode('./data/crm_wal.jsonl');
/ Sallitaan raw text/markdown -rungon lukeminen AST-MD syC6tteitC$ varten
fastify.addContentTypeParser('text/markdown', { parseAs: 'string' }, (req,
body, done) => {
done(null, body);
});
/ 1. GET: Hae kokoelma (Esim. kaikki asiakkaat)
fastify.get('/api/:collection', async (request, reply) => {
const { collection } = request.params;
const data = db.getCollection(collection);
// Tuki tekoC$lylle: Jos botti pyytC$C$ dataa markdownina
if (request.headers.accept === 'text/markdown') {
// TC$ssC$ kutsuttaisiin funktiota, joka kC$C$ntC$C$ JS-objektit takaisin
AST-MD:ksi
// return ASTMDGenerator.generate(collection, data);
}
return data; // Palauttaa oletuksena JSON:ina
});
/ 2. GET: Hae yksittC$inen objekti
fastify.get('/api/:collection/:id', async (request, reply) => {
const { collection, id } = request.params;
const obj = db.getCollection(collection)[id];
if (!obj) return reply.code(404).send({ error: 'Not found' });
return obj;
});
/ 3. PUT: Korvaa tai luo tietue
fastify.put('/api/:collection/:id', async (request, reply) => {
const { collection, id } = request.params;
db.put(collection, id, request.body);
return { success: true, id };
});
/ 4. PATCH: Osittainen pC$ivitys
fastify.patch('/api/:collection/:id', async (request, reply) => {
const { collection, id } = request.params;
db.patch(collection, id, request.body);
return { success: true, id };
});
/ 5. DELETE: Poista tietue
fastify.delete('/api/:collection/:id', async (request, reply) => {
const { collection, id } = request.params;
db.delete(collection, id);
return { success: true, id };
});
/ 6. SYNC: TekoC$lyn AST-MD Ingestion -reitti
fastify.post('/api/sync', async (request, reply) => {
if (request.headers['content-type'] !== 'text/markdown') {
return reply.code(400).send({ error: 'Odotettiin text/markdown AST-MD
muotoa' });
}
// Parsitaan tekoC$lyn lC$hettC$mC$ AST-MD
const parsedData = ASTMDParser.parse(request.body);
// SyC6tetC$C$n parserin tulos tietokantaan (triggerC6i PUT-mutaatiot
WAL-lokiin)
for (const [collectionName, collectionData] of Object.entries(parsedData)) {
for (const [id, obj] of Object.entries(collectionData.objects)) {
db.put(collectionName, id, obj);
}
}
return { success: true, message: 'AST-MD synkronoitu onnistuneesti' };
});
/ KC$ynnistysrutiini
const start = async () => {
try {
await db.init(); // Re-hydrate levyltC$ RAM-muistiin (JSONL luku)
await fastify.listen({ port: 3000, host: '0.0.0.0' });
console.log('O-Base API Gateway is running on http://localhost:3000');
} catch (err) {
fastify.log.error(err);
process.exit(1);
}
};
start();
```
### TekoC$lyn (LLM) Interaktio Palvelimen Kanssa
TC$mC$ arkkitehtuuri tekee botin elC$mC$stC$ uskomattoman helppoa. Jos AI
haluaa lisC$tC$ CRM:C$C$n uuden asiakkaan ja sille uuden laskun, sen ei
tarvitse vC$littC$C$ relaatioista tai monimutkaisista JSON-skeemoista.
Botti lC$hettC$C$ yksinkertaisen HTTP-pyynnC6n:
```http
POST /api/sync HTTP/1.1
Content-Type: text/markdown
# Collection: asiakkaat
## Object: crm_999
- nimi: Robotti Oy
- status: liidi
# Collection: laskut
## Object: inv_555
- asiakas_id: crm_999
- summa: 1500
- erapiva: 2026-09-17
```
Palvelin vastaa salamannopeasti, tieto on RAM-muistissa kC$ytettC$vissC$
nanosekunneissa ja taustalla Fastify valuttaa datan asynkronisesti levyn
lokitiedostoon.