From debd559f7cfff790bdb91f883f3d2cd6ee7dddca Mon Sep 17 00:00:00 2001 From: Claudomator Agent Date: Mon, 16 Mar 2026 00:45:04 +0000 Subject: feat: add GribFileManager interface and InMemoryGribFileManager --- .../org/terst/nav/data/storage/GribFileManager.kt | 42 ++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 android-app/app/src/main/kotlin/org/terst/nav/data/storage/GribFileManager.kt (limited to 'android-app/app/src') diff --git a/android-app/app/src/main/kotlin/org/terst/nav/data/storage/GribFileManager.kt b/android-app/app/src/main/kotlin/org/terst/nav/data/storage/GribFileManager.kt new file mode 100644 index 0000000..e17e5ca --- /dev/null +++ b/android-app/app/src/main/kotlin/org/terst/nav/data/storage/GribFileManager.kt @@ -0,0 +1,42 @@ +package org.terst.nav.data.storage + +import org.terst.nav.data.model.GribFile +import org.terst.nav.data.model.GribRegion +import java.time.Instant + +interface GribFileManager { + /** Save metadata for a newly-downloaded GRIB file. */ + fun saveMetadata(file: GribFile) + /** Return all stored GRIB files for [region], newest first. */ + fun listFiles(region: GribRegion): List + /** Return the most-recently-downloaded GRIB file for [region], or null if none. */ + fun latestFile(region: GribRegion): GribFile? + /** Delete a specific GRIB file's metadata and from disk. Returns true if deleted. */ + fun delete(file: GribFile): Boolean + /** Delete all GRIB files older than [before]. Returns count of deleted files. */ + fun purgeOlderThan(before: Instant): Int + /** Total size in bytes of all stored GRIB files. */ + fun totalSizeBytes(): Long +} + +class InMemoryGribFileManager : GribFileManager { + private val files = mutableListOf() + + override fun saveMetadata(file: GribFile) { files.add(file) } + + override fun listFiles(region: GribRegion): List = + files.filter { it.region.name == region.name } + .sortedByDescending { it.downloadedAt } + + override fun latestFile(region: GribRegion): GribFile? = listFiles(region).firstOrNull() + + override fun delete(file: GribFile): Boolean = files.remove(file) + + override fun purgeOlderThan(before: Instant): Int { + val toRemove = files.filter { it.downloadedAt.isBefore(before) } + files.removeAll(toRemove) + return toRemove.size + } + + override fun totalSizeBytes(): Long = files.sumOf { it.sizeBytes } +} -- cgit v1.2.3