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.
60 lines
2.0 KiB
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)))
|