Download Game! Currently 62 players and visitors. Last logged in:ZhouyuKlarenceQumniDesert

Blitzer's Blog >> 71956

Back to blogs index
Posted: 03 Sep 2026 14:52 [ permalink ]
### 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.