diff --git a/src/wanijo/schema/domain.clj b/src/wanijo/schema/domain.clj index e5208dc..e11a375 100644 --- a/src/wanijo/schema/domain.clj +++ b/src/wanijo/schema/domain.clj @@ -117,40 +117,75 @@ schema)) (neo4j/defquery - assigned-users - "MATCH (s:schema)-[:assigned_to]-(u:user) + assigned-read-users + "MATCH (s:schema)-[:read]-(u:user) WHERE s.uuid = {uuid} RETURN u ORDER BY u.ident") -(defn assigned-users! [uuid] +(defn assigned-read-users! [uuid] (map :u (neo4j/exec-query! - assigned-users + assigned-read-users + {:uuid uuid}))) + +(neo4j/defquery + assigned-write-users + "MATCH (s:schema)-[:write]-(u:user) + WHERE s.uuid = {uuid} + RETURN u + ORDER BY u.ident") + +(defn assigned-write-users! [uuid] + (map :u + (neo4j/exec-query! + assigned-write-users {:uuid uuid}))) (defn find-with-assigned-users! [uuid] (assoc (find-by-uuid! uuid) - :assigned (map :uuid (assigned-users! uuid)))) + :assigned-read-users (map :uuid (assigned-read-users! uuid)) + :assigned-write-users (map :uuid (assigned-write-users! uuid)))) (neo4j/defquery - remove-assignments - "MATCH (s:schema)-[c:assigned_to]-(:user) + remove-read-assignments + "MATCH (s:schema)-[c:read]-(:user) WHERE s.uuid = {uuid} DELETE c") (neo4j/defquery - create-assignment + create-read-assignments "MATCH (s:schema), (u:user) WHERE s.uuid = {uuid} AND u.uuid IN {users} - CREATE (s)-[:assigned_to]->(u)") + CREATE (s)<-[:read]-(u)") -(defn assign-users! [uuid users] - (neo4j/exec-query! - remove-assignments - {:uuid uuid}) - (neo4j/exec-query! - create-assignment - {:uuid uuid - :users users})) +(neo4j/defquery + remove-write-assignments + "MATCH (s:schema)-[c:write]-(:user) + WHERE s.uuid = {uuid} + DELETE c") + +(neo4j/defquery + create-write-assignments + "MATCH (s:schema), (u:user) + WHERE s.uuid = {uuid} + AND u.uuid IN {users} + CREATE (s)<-[:write]-(u)") + +(defn assign-users! [uuid users permission] + (if (= permission "write") + (do (neo4j/exec-query! + remove-write-assignments + {:uuid uuid}) + (neo4j/exec-query! + create-write-assignments + {:uuid uuid + :users users})) + (do (neo4j/exec-query! + remove-read-assignments + {:uuid uuid}) + (neo4j/exec-query! + create-read-assignments + {:uuid uuid + :users users})))) diff --git a/src/wanijo/schema/routes.clj b/src/wanijo/schema/routes.clj index c50d30f..f273dfb 100644 --- a/src/wanijo/schema/routes.clj +++ b/src/wanijo/schema/routes.clj @@ -44,15 +44,11 @@ (view! uuid req)))) (defn assign! [req] - (let [uuid (get-in req [:params :uuid]) - users (get-in req [:params :assigned])] - (println (:params req)) + (let [{:keys [uuid assigned]} (form/form-data view-schema/assign-form req) + permission (get-in req [:params :permission])] (if (form/valid? view-schema/assign-form req) (do - (domain/assign-users! uuid - (if (vector? users) - users - [users])) + (domain/assign-users! uuid assigned permission) (resp/redirect (path :schema-show (:params req)))) (view! uuid req)))) diff --git a/src/wanijo/schema/view.clj b/src/wanijo/schema/view.clj index cddceb9..8ccfe74 100644 --- a/src/wanijo/schema/view.clj +++ b/src/wanijo/schema/view.clj @@ -35,7 +35,8 @@ {:fields {:assigned {:label "Users" :required false :spec ::domain/assigned-to - :widget :mselect} + :widget :mselect + :from-req #(if (vector? %) % [%])} :uuid {:widget :hidden}}}) (defn overview! [req] @@ -74,10 +75,6 @@ (hform/form-to [:post (path :schema-edit)] (form/render-widgets form schema req) (hform/submit-button "Edit")) - [:h3 "Assign to users"] - (hform/form-to [:post (path :schema-assign)] - (form/render-widgets assign-form schema req) - (hform/submit-button "Assign")) [:h2 "Attributes"] [:ul.schema-attributes (for [attr attrs] @@ -96,6 +93,23 @@ (form/render-widgets attr-form {} req) (hform/hidden-field "schema" (:uuid schema)) (hform/submit-button "Create")) + [:h2 "Permissions"] + [:h3 "Read permissions"] + (hform/form-to [:post (path :schema-assign)] + (form/render-widgets assign-form + (assoc schema :assigned + (:assigned-read-users schema)) + req) + (hform/hidden-field "permission" "read") + (hform/submit-button "Assign")) + [:h3 "Write permissions"] + (hform/form-to [:post (path :schema-assign)] + (form/render-widgets assign-form + (assoc schema :assigned + (:assigned-write-users schema)) + req) + (hform/hidden-field "permission" "write") + (hform/submit-button "Assign")) [:h2 "Actions"] (hform/form-to {:class "inline"} [:delete (path :schema-delete schema)]