You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wanijo/src/wanijo/tag/domain.clj

60 lines
2.0 KiB

(ns wanijo.tag.domain
(:require [clojure.spec.alpha :as spec]
[wanijo.specs :as specs]
[wanijo.framework.neo4j :as neo4j]))
(spec/def ::name
(spec/and ::specs/name
::specs/no-whitespace))
(spec/def ::tag
(spec/keys :req-un [::specs/uuid
::specs/created_at
::name]))
(neo4j/defquery tags-by-instance
"MATCH (i:instance {uuid:{uuid}})-[:tagged_with]->(t:tag)
RETURN t
ORDER BY t.name")
(defn tags-by-instance! [instance-uuid]
{:post [(spec/assert (spec/coll-of ::tag) %)]}
(map :t
(neo4j/exec-query! tags-by-instance
{:uuid instance-uuid})))
(neo4j/defquery merge-tag
"MATCH (i:instance {uuid:{instance_uuid}}),
(u:user {uuid:{user_uuid}})
MERGE (t:tag {name:{name}})-[:created_by]->(u)
ON CREATE SET t.uuid = {uuid},
t.created_at = {now}
MERGE (i)-[:tagged_with]->(t)")
(spec/def ::merge-tag-tuple
(spec/keys :req-un [::specs/instance_uuid
::name
::specs/uuid
::specs/now
::specs/user_uuid]))
(defn merge-tag-tuples [tags instance-uuid user-uuid]
{:pre [(spec/assert (spec/coll-of string?) tags)]
:post [(spec/assert (spec/coll-of (spec/tuple fn? ::merge-tag-tuple))
%)]}
(map (fn [tag-name]
[merge-tag
{:instance_uuid instance-uuid
:name tag-name
:uuid (neo4j/uuid)
:now (neo4j/now-str)
:user_uuid user-uuid}])
tags))
(comment
(merge-tag-tuples (list "a" "b")
(neo4j/uuid)
(neo4j/uuid))
(spec/explain (spec/coll-of (spec/tuple fn? ::merge-tag-tuple))
(merge-tag-tuples (list "a" "b")
(neo4j/uuid)
(neo4j/uuid))))
(defn merge-tags [tags instance-uuid user-uuid]
(apply neo4j/exec-queries!
(merge-tag-tuples tags instance-uuid user-uuid)))