4.6 KiB
4.6 KiB
Upgrade: REST API sync i.p.v. WebDAV
Vervang WebDAV-sync door een eigen REST API op weegschaal.eddydevink.nl,
met MariaDB-backend en Bearer token-authenticatie. Incrementele sync i.p.v. volledig bestand.
Fase 1 — Server-side: PHP API
Subdomein & nginx
- DNS:
weegschaal.eddydevink.nl→ zelfde server alsgit.eddydevink.nl - nginx server block in
/etc/nginx/conf.d/weegschaal-api.conf - SSL via Let's Encrypt (
sudo certbot) - Document root:
/usr/share/nginx/html/weegschaal-api/
MariaDB
CREATE DATABASE weegschaal;
CREATE USER 'weegschaal'@'localhost' IDENTIFIED BY '<random>';
GRANT ALL ON weegschaal.* TO 'weegschaal'@'localhost';
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE auth_tokens (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL REFERENCES users(id),
token VARCHAR(64) NOT NULL UNIQUE,
description VARCHAR(255),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE measurements (
id VARCHAR(36) NOT NULL,
user_id INT NOT NULL,
weight DECIMAL(5,2) NOT NULL,
bmi DECIMAL(4,1) NOT NULL,
body_fat_percentage DECIMAL(4,1) NOT NULL,
fat_mass DECIMAL(5,2) NOT NULL,
muscle_percentage DECIMAL(4,1) NOT NULL,
muscle_mass DECIMAL(5,2) NOT NULL,
visceral_fat TINYINT NOT NULL,
bmr DECIMAL(6,1) NOT NULL,
measured_at DATE NOT NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
PRIMARY KEY (user_id, id),
INDEX idx_updated_at (user_id, updated_at)
);
PHP API endpoints (Slim Framework via Composer)
| Methode | Pad | Beschrijving |
|---|---|---|
POST |
/api/v1/auth/register |
(later) Nieuwe gebruiker |
POST |
/api/v1/auth/tokens |
(later) Nieuwe token aanmaken |
GET |
/api/v1/measurements |
Alle metingen (of ?since=ISO voor delta) |
POST |
/api/v1/measurements |
Nieuwe meting aanmaken |
PUT |
/api/v1/measurements/:id |
Meting bijwerken |
DELETE |
/api/v1/measurements/:id |
Meting verwijderen |
Authenticatie: Authorization: Bearer <token>, gevalideerd tegen auth_tokens-tabel.
Sync-logica server:
GET /api/v1/measurements?since=2025-01-01T12:00:00Z→ alleen metingen metupdated_at > since- Bij PUT/DELETE: controleer
updated_atclient, bij conflict → HTTP 409 met server-versie
Bestandsstructuur API
/usr/share/nginx/html/weegschaal-api/
├── composer.json
├── public/
│ └── index.php ← Entry point, routing
├── src/
│ ├── Database.php ← PDO singleton
│ ├── Auth.php ← Token validation middleware
│ ├── Measurements.php ← CRUD + sync queries
│ └── helpers.php
└── config.php ← DB credentials (uit .env of env vars)
Fase 2 — Client-side: App aanpassen
Types (src/types.ts)
- Vervang
WebDAVConfigdoorApiConfig { url: string; token: string } - Verwijder
SyncStatus(niet meer nodig — sync status volgt uitupdatedAt)
SettingsScreen (src/screens/SettingsScreen.tsx)
- Vervang URL/username/password door API-URL + token (met oogje)
- Opslaan → SecureStore
- Wissen → SecureStore verwijderen
- 'Nu synchroniseren' knop blijft
Nieuwe module src/sync/api.ts
const api = (config: ApiConfig) => ({
getMeasurements: (since?: string) => GET /api/v1/measurements?since=...
createMeasurement: (m: Measurement) => POST /api/v1/measurements
updateMeasurement: (m: Measurement) => PUT /api/v1/measurements/:id
deleteMeasurement: (id: string) => DELETE /api/v1/measurements/:id
})
syncService.ts — volledig herschreven
Nieuwe sync-flow:
| Stap | Actie |
|---|---|
| 1 | Lees lokale lastSyncAt (uit SecureStore) |
| 2 | GET ?since=lastSyncAt → alleen wijzigingen ophalen |
| 3 | Upsert remote wijzigingen lokaal (last-writer-wins) |
| 4 | Voor elke lokale meting met updatedAt > lastSyncAt: push naar API |
| 5 | Update lastSyncAt naar server-tijd |
Bij opslaan in NewMeasurementScreen:
- Direct naar lokale SQLite (offline-first)
- Direct erna: push naar API (async, niet-blokkerend via
Promise.allSettled)
Fase 3 — Migratie
Eerste keer na API-setup:
- App stuurt alle lokale metingen naar de API (1-voor-1 via POST)
- Alle metingen nu in MariaDB
- Vanaf dan: alleen delta-sync
Benodigde server-toegang
- SSH naar nextcloud (
aiaiaiaiagent@nextcloud) — key werkte niet sudo -A mysqlvoor DB + user aanmaken- nginx config aanpassen (
/etc/nginx/conf.d/) - DNS controleren voor subdomein