From a11ab3f3d5320d03473e197633ca1a38519dd9af Mon Sep 17 00:00:00 2001 From: Travis Shears Date: Sat, 12 Jul 2025 14:37:15 +0200 Subject: [PATCH] get image url gen working --- .../clj/image-service-cli.main.transit.json | 2 +- .gitignore | 1 + bb.edn | 1 + config.edn | 2 - config.edn.sample | 5 +++ db.db | Bin 0 -> 49152 bytes src/image_service_cli/index.clj | 32 ++++++++++------ src/image_service_cli/main.clj | 35 ++++++++++++------ 8 files changed, 52 insertions(+), 26 deletions(-) delete mode 100644 config.edn create mode 100644 config.edn.sample create mode 100644 db.db diff --git a/.clj-kondo/.cache/v1/clj/image-service-cli.main.transit.json b/.clj-kondo/.cache/v1/clj/image-service-cli.main.transit.json index 9b033c0..b3f869c 100644 --- a/.clj-kondo/.cache/v1/clj/image-service-cli.main.transit.json +++ b/.clj-kondo/.cache/v1/clj/image-service-cli.main.transit.json @@ -1 +1 @@ -["^ ","~$s3-list",["^ ","~:row",6,"~:col",1,"~:fixed-arities",["~#set",[1]],"~:name","^0","~:ns","~$image-service-cli.main","~:top-ns","^7","~:type","~:fn"],"~$prompt-for",["^ ","^1",9,"^2",1,"~:varargs-min-arity",1,"^5","^;","^6","^7","^8","^7","^9","^:"],"~$-main",["^ ","^1",15,"^2",1,"^<",0,"^5","^=","^6","^7","^8","^7","^9","^:"],"~:filename","/Users/she0001t/personal_projects/image-service-cli/src/image_service_cli/main.clj"] \ No newline at end of file +["^ ","~$base64-encode",["^ ","~:row",12,"~:col",1,"~:fixed-arities",["~#set",[1]],"~:name","^0","~:ns","~$image-service-cli.main","~:top-ns","^7","~:type","~:fn"],"~$get-image-url",["^ ","^1",17,"^2",1,"~:varargs-min-arity",1,"^5","^;","^6","^7","^8","^7","~:arities",["^ ","~:varargs",["^ ","~:ret","~:string","~:min-arity",1,"~:arglist-str","[s3-path & [max-dimension]]"]],"^9","^:"],"~$-main",["^ ","^1",27,"^2",1,"^<",0,"^5","^C","^6","^7","^8","^7","^9","^:"],"~:filename","/Users/she0001t/personal_projects/image_service_cli/src/image_service_cli/main.clj"] \ No newline at end of file diff --git a/.gitignore b/.gitignore index 7b5c564..cdf8cde 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .clj-kondo .lsp +config.edn diff --git a/bb.edn b/bb.edn index 7a6ffd1..2787f50 100644 --- a/bb.edn +++ b/bb.edn @@ -1,4 +1,5 @@ {:paths ["src"] + :pods {org.babashka/go-sqlite3 {:version "0.2.7"}} :deps {com.travisshears/gum-utils {:git/url "https://git.travisshears.com/travisshears/gum-utils" :git/tag "39K" :git/sha "748b21d358b62db0476bc3577cb5398acc533ba1"}}} diff --git a/config.edn b/config.edn deleted file mode 100644 index 2cd9100..0000000 --- a/config.edn +++ /dev/null @@ -1,2 +0,0 @@ -{:aws-profile "personal" - :s3-root "s3://travisshears.images/image-service/images/"} diff --git a/config.edn.sample b/config.edn.sample new file mode 100644 index 0000000..94ae556 --- /dev/null +++ b/config.edn.sample @@ -0,0 +1,5 @@ +{:aws-profile "xxxxxx" + :s3-bucket "xxxxxxxxxxxxxxxxxxx" + :s3-root "xxxxxxxxxxxxxxxxxxxxx" + :db-path "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + :final-host "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"} diff --git a/db.db b/db.db new file mode 100644 index 0000000000000000000000000000000000000000..cce80bceb6e13dd4f7a85aedddbcd33b70c8682e GIT binary patch literal 49152 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 YVerb)RbW~!gd{FwFeeGZ_EXeUH||9 literal 0 HcmV?d00001 diff --git a/src/image_service_cli/index.clj b/src/image_service_cli/index.clj index 0a62c01..915bcea 100644 --- a/src/image_service_cli/index.clj +++ b/src/image_service_cli/index.clj @@ -4,6 +4,8 @@ (:import (java.time LocalDateTime) (java.time.format DateTimeFormatter)) (:require + [pod.babashka.go-sqlite3 :as sqlite] + [babashka.fs :as fs] [image-service-cli.config :refer [config]] [babashka.process :refer [shell]] [clojure.string :as str] @@ -16,7 +18,7 @@ (when match (second match)))) s3-output (-> - (shell {:out :string :extra-env {"AWS_PROFILE" (:aws-profile config)}} "aws s3 ls" (:s3-root config)) + (shell {:out :string :extra-env {"AWS_PROFILE" (:aws-profile config)}} "aws s3 ls" (str "s3://" (:s3-bucket config) "/" (:s3-root config))) :out)] (->> (str/split s3-output #"\n") @@ -27,7 +29,7 @@ (defn s3-list-dir [dir] "List the contents of a directory in S3. Skipping nested directories" (as-> - (shell {:out :string :extra-env {"AWS_PROFILE" (:aws-profile config)}} "aws s3 ls" (str (:s3-root config) dir "/")) x + (shell {:out :string :extra-env {"AWS_PROFILE" (:aws-profile config)}} "aws s3 ls" (str "s3://" (:s3-bucket config) "/" (:s3-root config) dir "/")) x (:out x) (str/split x #"\n") ;; split on newline (map #(re-find #"(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\s+\d+\s+(.+$)" %) x) ;; convert line into date and file name @@ -36,16 +38,22 @@ (map #(list (LocalDateTime/parse (first %) s3-date-formatter) (second %)) x) (map #(hash-map :date (first %) :file-name (second %)) x))) -;; (defn fetch-snippets [] -;; (let [res (http/get (str (:backend-host config) "/api/snippets?limit=25"))] -;; (json/parse-string (:body res) true))) +(defn init-db [path] + (sqlite/execute! path + ["create table if not exists images (title TEXT, created TEXT);"]) + (sqlite/execute! path + ["delete from images;"])) -;; (defn send-patch [id patch] -;; (http/patch (str (:backend-host config) "/api/snippet") -;; {:query-params {:id id} -;; :headers {:content-type "application/json"} -;; :body (json/encode patch)})) +(defn save-to-db [db-path record] + (let [fmt DateTimeFormatter/ISO_LOCAL_DATE_TIME + formatted-date (-> record :date (.format fmt)) + file-name (record :file-name)] + (sqlite/execute! db-path + ["insert into images (title, created) values (?, ?);" file-name formatted-date]))) (defn run [] - ;; get file names and created dates from s3 - (flatten (map image-service-cli.index/s3-list-dir (image-service-cli.index/s3-root-dirs)))) + (let [db-path (:db-path config)] + (init-db db-path) + (->> + (flatten (map image-service-cli.index/s3-list-dir (image-service-cli.index/s3-root-dirs))) + (map #(save-to-db db-path %))))) diff --git a/src/image_service_cli/main.clj b/src/image_service_cli/main.clj index ae9a4b7..21abf8b 100644 --- a/src/image_service_cli/main.clj +++ b/src/image_service_cli/main.clj @@ -1,19 +1,32 @@ (ns image-service-cli.main + (:import [java.util Base64]) (:require - [babashka.process :refer [shell]] + [image-service-cli.index :as index] + [image-service-cli.config :refer [config]] + [cheshire.core :as json] + [com.travisshears.gum-utils :as utils])) - (shell (format "gum format \"%s\"" text))) +;; user=> (pprint (sql/query (image-service-cli.config/config :db-path) "select * from images i order by i.created desc limit 10;")) -(defn prompt-for [placeholder & {:keys [prefill]}] -(defn s3-list [dir] - (let [cmd (if prefill - (format "gum input --placeholder='%s' --value='%s'" placeholder prefill) - (format "gum input --placeholder='%s'" placeholder))] - (str/trim (-> (shell {:out :string} cmd) :out)))) +(defn base64-encode [data] + (let [bytes (.getBytes data) + encoder (Base64/getEncoder)] + (.encodeToString encoder bytes))) + +(defn get-image-url [s3-path & [max-dimension]] + (let [img-config (cond-> {:bucket (:s3-bucket config) + :key (str (:s3-root config) s3-path)} + max-dimension + (assoc :edits {:resize {:width max-dimension + :height max-dimension + :fit "inside"}})) + encoded-config (base64-encode (json/encode img-config))] + (str (:final-host config) encoded-config))) (defn -main [& args] (case (first args) - "upload" (create/run) - "ls" (delete/run) - (println "Missing command. Try upload or ls."))) + ;; "upload" (create/run) + ;; "ls" (delete/run) + "index" (index/run) + (println "Missing command. Try upload, ls, or index.")))