parent
61d5714ba8
commit
923bd69754
@ -0,0 +1,56 @@
|
||||
(ns wanijo.instance.domain
|
||||
(:require [clojure.spec.alpha :as spec]
|
||||
[wanijo.framework.neo4j :as neo4j]
|
||||
[clojure.pprint :as pprint]))
|
||||
|
||||
(spec/def ::created-at ::neo4j/date-str)
|
||||
(spec/def ::updated-at ::neo4j/date-str)
|
||||
(spec/def ::name (spec/and (complement empty?) string?))
|
||||
|
||||
(neo4j/defquery
|
||||
findy-by-schema
|
||||
"MATCH (i:instance)-->(s:schema)
|
||||
WHERE s.uuid = {uuid}
|
||||
RETURN i
|
||||
ORDER BY i.updated_at DESC")
|
||||
|
||||
(defn find-by-schema! [schema-uuid]
|
||||
(->>
|
||||
(neo4j/exec-query!
|
||||
findy-by-schema
|
||||
{:uuid schema-uuid})
|
||||
(map :i)))
|
||||
|
||||
(neo4j/defquery create-instance
|
||||
"MATCH (s:schema {uuid:{schema_uuid}})
|
||||
CREATE (i:instance {uuid:{uuid}})-[:of]->(s)
|
||||
SET i.name = {name},
|
||||
i.created_at = {created_at},
|
||||
i.updated_at = {created_at}")
|
||||
|
||||
(neo4j/defquery create-property
|
||||
"MATCH (i:instance {uuid:{uuid}}),
|
||||
(a:attribute {uuid:{attr_uuid}})
|
||||
CREATE (p:property {uuid:{prop_uuid}})-[:of]->(i),
|
||||
(p)-[:of]->(a)
|
||||
SET p.value = {value},
|
||||
p.created_at = {created_at}")
|
||||
|
||||
(defn create! [schema-uuid instance]
|
||||
(let [instance-uuid (neo4j/uuid)
|
||||
now (neo4j/now-str)
|
||||
instance-tuple [create-instance
|
||||
{:schema_uuid schema-uuid
|
||||
:name (:name instance)
|
||||
:uuid instance-uuid
|
||||
:created_at now}]
|
||||
prop-tuples (for [{:keys [attribute value]} (:properties instance)]
|
||||
[create-property
|
||||
{:uuid instance-uuid
|
||||
:attr_uuid (:uuid attribute)
|
||||
:prop_uuid (neo4j/uuid)
|
||||
:value value
|
||||
:created_at now}])]
|
||||
(apply neo4j/exec-queries!
|
||||
(concat [instance-tuple]
|
||||
prop-tuples))))
|
@ -0,0 +1,66 @@
|
||||
(ns wanijo.instance.routes
|
||||
(:require [compojure.core :refer [defroutes GET POST DELETE]]
|
||||
[ring.util.response :as resp]
|
||||
[formulare.core :as form]
|
||||
[wanijo.instance.view :as view]
|
||||
[wanijo.instance.domain :as domain]
|
||||
[wanijo.framework.routing :refer [register! path]]
|
||||
[wanijo.schema.domain :as domain-schema]
|
||||
[wanijo.attribute.domain :as domain-attr]))
|
||||
|
||||
(defn attr-type->widget [type]
|
||||
(case type
|
||||
("markdown" "text") :textarea
|
||||
:input))
|
||||
|
||||
(defn attr->field-id [attr]
|
||||
(keyword (str "attr-" (:name attr))))
|
||||
|
||||
(defn attr->field [attr]
|
||||
{:label (:name attr)
|
||||
:required true
|
||||
:widget (attr-type->widget (:type attr))})
|
||||
|
||||
(defn new-form [schema-uuid]
|
||||
(update view/new-form
|
||||
:fields
|
||||
(fn [fields]
|
||||
(reduce (fn [fields attr]
|
||||
(assoc fields
|
||||
(attr->field-id attr)
|
||||
(attr->field attr)))
|
||||
fields
|
||||
(domain-attr/required! schema-uuid)))))
|
||||
|
||||
(defn list! [schema-uuid req]
|
||||
(view/list! (domain-schema/find-by-uuid! schema-uuid)
|
||||
(domain/find-by-schema! schema-uuid)
|
||||
(new-form schema-uuid)
|
||||
req))
|
||||
|
||||
(defn form-data->instance [form-data required-attrs]
|
||||
{:name (:name form-data)
|
||||
:properties (map (fn [ra]
|
||||
{:attribute ra
|
||||
:value ((attr->field-id ra) form-data)})
|
||||
required-attrs)})
|
||||
|
||||
(defn new! [req]
|
||||
(let [schema-uuid (get-in req [:params :schema-uuid])
|
||||
form-def (new-form schema-uuid)]
|
||||
(if (form/valid? form-def req)
|
||||
(let [instance (form-data->instance
|
||||
(form/form-data form-def req)
|
||||
(domain-attr/required! schema-uuid))]
|
||||
(domain/create! schema-uuid
|
||||
instance)
|
||||
(resp/redirect (path :instance-list
|
||||
(:params req))))
|
||||
(list! schema-uuid req))))
|
||||
|
||||
(defroutes routes
|
||||
(GET (register! :instance-list "/instance/list/:schema-uuid")
|
||||
[schema-uuid :as req]
|
||||
(list! schema-uuid req))
|
||||
(POST (register! :instance-new "/instance/new") []
|
||||
new!))
|
@ -0,0 +1,39 @@
|
||||
(ns wanijo.instance.view
|
||||
(:require [hiccup.form :as hform]
|
||||
[ring.util.anti-forgery :refer [anti-forgery-field]]
|
||||
[formulare.core :as form]
|
||||
[wanijo.instance.domain :as domain]
|
||||
[wanijo.framework.view :as view]
|
||||
[wanijo.framework.routing :refer [path]]
|
||||
[wanijo.framework.time :refer [prettify-dt]]))
|
||||
|
||||
(def new-form
|
||||
{:fields {:name {:label "Name"
|
||||
:required true
|
||||
:spec ::domain/name}}})
|
||||
|
||||
(defn list! [schema instances new-form req]
|
||||
(view/layout!
|
||||
:request req
|
||||
:content
|
||||
[[:h1 "All Instances of schema "
|
||||
[:span.schema-title__name (:name schema)]]
|
||||
[:table
|
||||
[:thead
|
||||
[:tr
|
||||
[:th "Name"]
|
||||
[:th "Updated"]
|
||||
[:th "Created"]]]
|
||||
[:tbody
|
||||
(for [instance instances]
|
||||
[:tr
|
||||
[:td
|
||||
[:a (:name instance)]]
|
||||
[:td (prettify-dt (:updated_at instance))]
|
||||
[:td (prettify-dt (:created_at instance))]])]]
|
||||
[:h1 "New Instance"]
|
||||
(hform/form-to [:post (path :instance-new)]
|
||||
(form/render-widgets new-form {} req)
|
||||
(hform/hidden-field "schema-uuid"
|
||||
(:uuid schema))
|
||||
(hform/submit-button "Create!"))]))
|
Loading…
Reference in new issue