summaryrefslogtreecommitdiff
path: root/android-app
diff options
context:
space:
mode:
Diffstat (limited to 'android-app')
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/data/storage/GribFileManager.kt42
1 files changed, 42 insertions, 0 deletions
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<GribFile>
+ /** 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<GribFile>()
+
+ override fun saveMetadata(file: GribFile) { files.add(file) }
+
+ override fun listFiles(region: GribRegion): List<GribFile> =
+ 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 }
+}