Add file creation time to file stat data
authorLanius Trolling <lanius@laniustrolling.dev>
Sun, 14 Apr 2024 10:24:27 +0000 (06:24 -0400)
committerLanius Trolling <lanius@laniustrolling.dev>
Sun, 14 Apr 2024 10:24:27 +0000 (06:24 -0400)
src/jvmMain/kotlin/info/mechyrdia/data/DataFiles.kt
src/jvmMain/kotlin/info/mechyrdia/data/ViewsFiles.kt

index 7e4c5e0a3a767644795e2fc16e0e7cf65300556e..b1127d996e8f64b3a4f4a87f3e20633d307b5773 100644 (file)
@@ -23,6 +23,10 @@ import java.io.ByteArrayOutputStream
 import java.io.File
 import java.nio.ByteBuffer
 import java.nio.file.FileAlreadyExistsException
+import java.nio.file.Files
+import java.nio.file.LinkOption
+import java.nio.file.attribute.BasicFileAttributeView
+import java.nio.file.attribute.BasicFileAttributes
 import java.time.Instant
 import kotlin.String
 import kotlin.time.Duration.Companion.hours
@@ -82,6 +86,7 @@ enum class StoredFileType {
 }
 
 data class StoredFileStats(
+       val created: Instant,
        val updated: Instant,
        val size: Long,
 )
@@ -209,8 +214,14 @@ private class FlatFileStorage(val root: File) : FileStorage {
        override suspend fun statFile(path: StoragePath): StoredFileStats? {
                val file = resolveFile(path)
                if (!file.isFile) return null
-               
-               return StoredFileStats(Instant.ofEpochMilli(file.lastModified()), file.length())
+               return withContext(Dispatchers.IO) {
+                       val basicAttributes = Files.readAttributes(file.toPath(), BasicFileAttributes::class.java)
+                       StoredFileStats(
+                               basicAttributes.creationTime().toInstant(),
+                               basicAttributes.lastModifiedTime().toInstant(),
+                               basicAttributes.size()
+                       )
+               }
        }
        
        override suspend fun writeFile(path: StoragePath, content: ByteArray): Boolean {
@@ -385,7 +396,7 @@ private class GridFsStorage(val table: DocumentTable<GridFsEntry>, val bucket: G
                if (path.isRoot) return null
                val file = getExact(path) ?: return null
                val gridFsFile = bucket.find(Filters.eq(MONGODB_ID_KEY, file.file)).awaitFirst()
-               return StoredFileStats(file.updated, gridFsFile.length)
+               return StoredFileStats(file.created, file.updated, gridFsFile.length)
        }
        
        override suspend fun writeFile(path: StoragePath, content: ByteArray): Boolean {
index 6f52079363ae6f404043eea2b6afa1592016f919..6d2b5418248ddd430f3f35d0c49fd893bcfd8e7b 100644 (file)
@@ -139,7 +139,11 @@ suspend fun ApplicationCall.adminViewVfs(path: StoragePath): HTML.() -> Unit {
                                                }
                                        }
                                        tr {
-                                               th { +"Last updated" }
+                                               th { +"Created at" }
+                                               td { dateTime(tree.stats.created) }
+                                       }
+                                       tr {
+                                               th { +"Last updated at" }
                                                td { dateTime(tree.stats.updated) }
                                        }
                                        tr {