Add schedule sync and schedule-aware playback
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include "network/proclamation_sync.h"
|
||||
#include "db/db_keys.h"
|
||||
#include "network/api_client.h"
|
||||
#include "network/json.h"
|
||||
|
||||
@@ -161,9 +162,41 @@ bool syncProclamationsFromApi(radiantwave::db::DatabaseManager& db,
|
||||
if (!db.syncProclamations(proclamations, defaultProclamationId)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Best-effort: a schedule fetch/store failure must never fail the
|
||||
// proclamation sync or roll back the data just written.
|
||||
syncScheduleFromApi(db);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool syncScheduleFromApi(radiantwave::db::DatabaseManager& db) {
|
||||
const std::string email = db.getKV(radiantwave::db::KV_EMAIL_ADDRESS);
|
||||
const std::string license_key = db.getKV(radiantwave::db::KV_LICENSE_KEY);
|
||||
if (email.empty() || license_key.empty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
api::ScheduleResponse schedule;
|
||||
if (!api::fetchSchedule(email, license_key, schedule)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<radiantwave::db::ScheduleBlockRecord> records;
|
||||
records.reserve(schedule.blocks.size());
|
||||
for (const auto& block : schedule.blocks) {
|
||||
radiantwave::db::ScheduleBlockRecord rec;
|
||||
rec.id = block.id;
|
||||
rec.start_minutes = block.start_minutes;
|
||||
rec.end_minutes = block.end_minutes;
|
||||
rec.overnight = block.overnight;
|
||||
rec.duration_minutes = block.duration_minutes;
|
||||
rec.dynamic_audio = block.dynamic_audio;
|
||||
rec.proclamation_ids = block.proclamation_ids;
|
||||
records.push_back(std::move(rec));
|
||||
}
|
||||
return db.replaceScheduleBlocks(records);
|
||||
}
|
||||
|
||||
// ─── Color palettes (readiness code; not wired into the app flow) ─────
|
||||
|
||||
bool parseProclamationPalettesJson(const std::string& body,
|
||||
|
||||
Reference in New Issue
Block a user