fix token update

This commit is contained in:
Andrés Moya 2024-09-03 14:20:55 +02:00
parent d147d844fb
commit 0dca047339
6 changed files with 104 additions and 30 deletions

View file

@ -564,6 +564,41 @@
new-elems new-elems
(remove p? after)))) (remove p? after))))
(defn addm-at-index
"Insert an element in an ordered map at an arbitrary index"
[coll index key element]
(assert (ordered-map? coll))
(-> (ordered-map)
(into (take index coll))
(assoc key element)
(into (drop index coll))))
(defn insertm-at-index
"Insert a map {k v} of elements in an ordered map at an arbitrary index"
[coll index new-elems]
(assert (ordered-map? coll))
(-> (ordered-map)
(into (take index coll))
(into new-elems)
(into (drop index coll))))
(defn adds-at-index
"Insert an element in an ordered set at an arbitrary index"
[coll index element]
(assert (ordered-set? coll))
(-> (ordered-set)
(into (take index coll))
(conj element)
(into (drop index coll))))
(defn inserts-at-index
"Insert a list of elements in an ordered set at an arbitrary index"
[coll index new-elems]
(assert (ordered-set? coll))
(-> (ordered-set)
(into (take index coll))
(into new-elems)
(into (drop index coll))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Data Parsing / Conversion ;; Data Parsing / Conversion

View file

@ -312,6 +312,7 @@
[:set-id ::sm/uuid] [:set-id ::sm/uuid]
[:set-name :string] [:set-name :string]
[:id ::sm/uuid] [:id ::sm/uuid]
[:name :string]
[:token ::cto/token]]] [:token ::cto/token]]]
[:del-token [:del-token
@ -798,15 +799,15 @@
(ctob/add-token-in-set set-name (ctob/make-token token)))))) (ctob/add-token-in-set set-name (ctob/make-token token))))))
(defmethod process-change :mod-token (defmethod process-change :mod-token
[data {:keys [set-id set-name id token]}] [data {:keys [set-name id name token]}]
(-> data (-> data
(ctol/update-token data set-id id merge token) (ctol/update-token id merge token)
(update :tokens-lib (update :tokens-lib
#(-> % #(-> %
(ctob/ensure-tokens-lib) (ctob/ensure-tokens-lib)
(ctob/update-token-in-set (ctob/update-token-in-set
set-name set-name
(:name token) name
(fn [old-token] (fn [old-token]
(ctob/make-token (merge old-token token)))))))) (ctob/make-token (merge old-token token))))))))

View file

@ -765,10 +765,10 @@
(apply-changes-local))) (apply-changes-local)))
(defn update-token (defn update-token
[changes set-id set-name {:keys [id] :as token} prev-token] [changes set-id set-name {:keys [id name] :as token} {prev-name :name :as prev-token}]
(-> changes (-> changes
(update :redo-changes conj {:type :mod-token :set-id set-id :set-name set-name :id id :token token}) (update :redo-changes conj {:type :mod-token :set-id set-id :set-name set-name :id id :name prev-name :token token})
(update :undo-changes conj {:type :mod-token :set-id set-id :set-name set-name :id id :token (or prev-token token)}) (update :undo-changes conj {:type :mod-token :set-id set-id :set-name set-name :id id :name name :token (or prev-token token)})
(apply-changes-local))) (apply-changes-local)))
(defn delete-token (defn delete-token

View file

@ -75,13 +75,13 @@
(TokenSet. name (TokenSet. name
description description
(dt/now) (dt/now)
(cond-> tokens (if (= (:name token) (:name token'))
(not= (:name token) (:name token')) (assoc tokens (:name token') token')
(dissoc (:name token)) (let [index (d/index-of (keys tokens) (:name token))]
(-> tokens
:always ; TODO: if token is renamed, (dissoc (:name token))
(assoc (:name token') token')))) ; it sould remain in (d/addm-at-index index (:name token') token'))))))
this)) ; the same position this))
(delete-token [_ token-name] (delete-token [_ token-name]
(TokenSet. name (TokenSet. name
@ -180,13 +180,13 @@
(let [set' (-> (make-token-set (f set)) (let [set' (-> (make-token-set (f set))
(assoc :modified-at (dt/now)))] (assoc :modified-at (dt/now)))]
(check-token-set! set') (check-token-set! set')
(TokensLib. (cond-> sets (TokensLib. (if (= (:name set) (:name set'))
(not= (:name set) (:name set')) (assoc sets (:name set') set')
(dissoc (:name set)) (let [index (d/index-of (keys sets) (:name set))]
(-> sets
:always ; TODO: if set is renamed, (dissoc (:name set))
(assoc (:name set') set')) ; it sould remain in (d/addm-at-index index (:name set') set'))))
themes)) ; the same position themes))
this)) this))
(delete-set [_ set-name] (delete-set [_ set-name]
@ -220,7 +220,7 @@
#(update-token % token-name f)) #(update-token % token-name f))
themes) themes)
this)) this))
(delete-token-from-set [this set-name token-name] (delete-token-from-set [this set-name token-name]
(if (contains? sets set-name) (if (contains? sets set-name)
(TokensLib. (update sets set-name (TokensLib. (update sets set-name

View file

@ -6,6 +6,7 @@
(ns common-tests.types.tokens-lib-test (ns common-tests.types.tokens-lib-test
(:require (:require
[app.common.data :as d]
[app.common.fressian :as fres] [app.common.fressian :as fres]
[app.common.time :as dt] [app.common.time :as dt]
[app.common.transit :as tr] [app.common.transit :as tr]
@ -143,18 +144,21 @@
(let [tokens-lib (-> (ctob/make-tokens-lib) (let [tokens-lib (-> (ctob/make-tokens-lib)
(ctob/add-set (ctob/make-token-set :name "test-token-set")) (ctob/add-set (ctob/make-token-set :name "test-token-set"))
(ctob/add-token-in-set "test-token-set" (ctob/add-token-in-set "test-token-set"
(ctob/make-token :name "test-token" (ctob/make-token :name "test-token-1"
:type :boolean
:value true))
(ctob/add-token-in-set "test-token-set"
(ctob/make-token :name "test-token-2"
:type :boolean :type :boolean
:value true))) :value true)))
tokens-lib' (-> tokens-lib tokens-lib' (-> tokens-lib
(ctob/update-token-in-set "test-token-set" "test-token" (ctob/update-token-in-set "test-token-set" "test-token-1"
(fn [token] (fn [token]
(assoc token (assoc token
:name "updated-name"
:description "some description" :description "some description"
:value false))) :value false)))
(ctob/update-token-in-set "not-existing-set" "test-token" (ctob/update-token-in-set "not-existing-set" "test-token-1"
(fn [token] (fn [token]
(assoc token (assoc token
:name "no-effect"))) :name "no-effect")))
@ -165,14 +169,47 @@
token-set (ctob/get-set tokens-lib "test-token-set") token-set (ctob/get-set tokens-lib "test-token-set")
token-set' (ctob/get-set tokens-lib' "test-token-set") token-set' (ctob/get-set tokens-lib' "test-token-set")
token (get-in token-set [:tokens "test-token"]) token (get-in token-set [:tokens "test-token-1"])
token' (get-in token-set' [:tokens "test-token-1"])]
(t/is (= (ctob/set-count tokens-lib') 1))
(t/is (= (count (:tokens token-set')) 2))
(t/is (= (d/index-of (keys (:tokens token-set')) "test-token-1") 0))
(t/is (= (:name token') "test-token-1"))
(t/is (= (:description token') "some description"))
(t/is (= (:value token') false))
(t/is (dt/is-after? (:modified-at token-set') (:modified-at token-set)))
(t/is (dt/is-after? (:modified-at token') (:modified-at token)))))
(t/deftest rename-token
(let [tokens-lib (-> (ctob/make-tokens-lib)
(ctob/add-set (ctob/make-token-set :name "test-token-set"))
(ctob/add-token-in-set "test-token-set"
(ctob/make-token :name "test-token-1"
:type :boolean
:value true))
(ctob/add-token-in-set "test-token-set"
(ctob/make-token :name "test-token-2"
:type :boolean
:value true)))
tokens-lib' (-> tokens-lib
(ctob/update-token-in-set "test-token-set" "test-token-1"
(fn [token]
(assoc token
:name "updated-name"))))
token-set (ctob/get-set tokens-lib "test-token-set")
token-set' (ctob/get-set tokens-lib' "test-token-set")
token (get-in token-set [:tokens "test-token-1"])
token' (get-in token-set' [:tokens "updated-name"])] token' (get-in token-set' [:tokens "updated-name"])]
(t/is (= (ctob/set-count tokens-lib') 1)) (t/is (= (ctob/set-count tokens-lib') 1))
(t/is (= (count (:tokens token-set')) 1)) (t/is (= (count (:tokens token-set')) 2))
(t/is (= (d/index-of (keys (:tokens token-set')) "updated-name") 0))
(t/is (= (:name token') "updated-name")) (t/is (= (:name token') "updated-name"))
(t/is (= (:description token') "some description")) (t/is (= (:description token') nil))
(t/is (= (:value token') false)) (t/is (= (:value token') true))
(t/is (dt/is-after? (:modified-at token-set') (:modified-at token-set))) (t/is (dt/is-after? (:modified-at token-set') (:modified-at token-set)))
(t/is (dt/is-after? (:modified-at token') (:modified-at token))))) (t/is (dt/is-after? (:modified-at token') (:modified-at token)))))

View file

@ -234,7 +234,8 @@
create-set? create-set?
(pcb/add-token-set token-set)) (pcb/add-token-set token-set))
prev-token (d/seek #(= (:id %) (:id token)) (:tokens token-set)) ; TODO prev-token-id (d/seek #(= % (:id token)) (:tokens token-set))
prev-token (get-token-data-from-token-id prev-token-id)
create-token? (not prev-token) create-token? (not prev-token)
changes (if create-token? changes (if create-token?