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
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