Store extension, derive path by convention from config
Drop path column; store extension instead. File location is derived
as storage_path/files/<id><ext> — no stored path needed.

https://claude.ai/code/session_018Ym45siELMvsBQj4w9QAXf
change
commit 9a464a0a367a090d9b85ee59c3f463f0a49f202a
author Alpha Chen <alpha@kejadlen.dev>
date
parent a05016b8
diff --git a/db/migrate/001_create_files.rb b/db/migrate/001_create_files.rb
index d571a55..3b32f88 100644
--- a/db/migrate/001_create_files.rb
+++ b/db/migrate/001_create_files.rb
@@ -4,8 +4,7 @@ Sequel.migration do
   change do
     create_table(:files) do
       primary_key :id
-      String :path, null: false
-      String :kind, null: false
+      String :extension, null: false
       DateTime :received_at, null: false
       DateTime :created_at, null: false
     end
diff --git a/lib/models.rb b/lib/models.rb
index 00acb70..fe04c82 100644
--- a/lib/models.rb
+++ b/lib/models.rb
@@ -2,5 +2,6 @@
 
 module Domus
   class FileRecord < Sequel::Model(:files)
+    def storage_path(config) = ::File.join(config.storage_path, "files", "#{id}#{extension}")
   end
 end
diff --git a/lib/web.rb b/lib/web.rb
index e5b9abc..68f0d43 100644
--- a/lib/web.rb
+++ b/lib/web.rb
@@ -42,19 +42,16 @@ module Domus
       raise ArgumentError, "missing file upload" unless upload.is_a?(Hash) && upload[:tempfile]
 
       ext = ::File.extname(upload[:filename].to_s)
-      filename = "#{Time.now.strftime("%Y%m%d%H%M%S%L")}#{ext}"
-      dest_dir = ::File.join(storage_path, "files")
-      FileUtils.mkdir_p(dest_dir)
-      dest = ::File.join(dest_dir, filename)
-      FileUtils.cp(upload[:tempfile].path, dest)
-
       now = Time.now
-      db[:files].insert(
-        path: ::File.join("files", filename),
-        kind: upload[:type].to_s,
+      id = db[:files].insert(
+        extension: ext,
         received_at: now,
         created_at: now
       )
+
+      dest_dir = ::File.join(storage_path, "files")
+      FileUtils.mkdir_p(dest_dir)
+      FileUtils.cp(upload[:tempfile].path, ::File.join(dest_dir, "#{id}#{ext}"))
     end
   end
 end