Skip to content

Commit

Permalink
Merge pull request #616 from Swirrl/multi-user-read-only-drafts
Browse files Browse the repository at this point in the history
Multi user read only drafts
  • Loading branch information
callum-oakley authored Sep 7, 2022
2 parents 5f33a8a + 111a2bc commit bf51782
Show file tree
Hide file tree
Showing 20 changed files with 608 additions and 98 deletions.
10 changes: 10 additions & 0 deletions drafter-client/src/drafter_client/client.clj
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,16 @@
(i/request client i/submit-draftset-to access-token id
:role (name role)))

(defn share-with-user [client access-token id user]
(i/request client i/share-draftset-with access-token id :user user))

(defn share-with-permission [client access-token id permission]
(i/request client i/share-draftset-with access-token id
:permission (name permission)))

(defn unshare [client access-token id]
(i/request client i/unshare-draftset access-token id))

(defn claim [client access-token id]
(i/request client i/claim-draftset access-token id))

Expand Down
16 changes: 16 additions & 0 deletions drafter-client/src/drafter_client/client/impl.clj
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,22 @@
:submit-draftset-to
(merge {:id id} opts)))

(defn share-draftset-with
"Share a Draftset with a user or permission"
[client id & {:keys [user permission] :as opts}]
(martian/response-for
client
:share-draftset-with
(merge {:id id} opts)))

(defn unshare-draftset
"Share a Draftset with a user or permission"
[client id]
(martian/response-for
client
:unshare-draftset
{:id id}))

(defn- assert-client [client]
(when-not client
(throw (ex-info "Trying to make request to drafter with `nil` client."
Expand Down
22 changes: 13 additions & 9 deletions drafter-client/test/drafter_client/client_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -217,24 +217,28 @@

(t/deftest draftsets-include-test
(let [client (drafter-client)
token (auth-util/publisher-token)
ds-1 (sut/new-draftset client token "first" "description")
ds-2 (sut/new-draftset client token "second" "description")]
(sut/submit-to-permission client token (draftset/id ds-2) :drafter:draft:claim)
publisher-token (auth-util/publisher-token)
editor-token (auth-util/editor-token)
ds-1 (sut/new-draftset client publisher-token "first" "description")
ds-2 (sut/new-draftset client publisher-token "second" "description")
ds-3 (sut/new-draftset client editor-token "third" "description")]
(sut/submit-to-permission client publisher-token (draftset/id ds-2) :drafter:draft:claim)
(sut/share-with-permission client editor-token (draftset/id ds-3) :drafter:draft:view)
(t/testing "default"
(let [draftsets (sut/draftsets client token)]
(t/is (= #{(draftset/id ds-1) (draftset/id ds-2)}
(let [draftsets (sut/draftsets client publisher-token)]
(t/is (= #{(draftset/id ds-1) (draftset/id ds-2) (draftset/id ds-3)}
(set (map draftset/id draftsets))))))
(sut/unshare client editor-token (draftset/id ds-3))
(t/testing "all"
(let [draftsets (sut/draftsets client token {:include :all})]
(let [draftsets (sut/draftsets client publisher-token {:include :all})]
(t/is (= #{(draftset/id ds-1) (draftset/id ds-2)}
(set (map draftset/id draftsets))))))
(t/testing "owned"
(let [owned (sut/draftsets client token {:include :owned})]
(let [owned (sut/draftsets client publisher-token {:include :owned})]
(is (= #{(draftset/id ds-1)}
(set (map draftset/id owned))))))
(t/testing "claimable"
(let [claimable (sut/draftsets client token {:include :claimable})]
(let [claimable (sut/draftsets client publisher-token {:include :claimable})]
(is (= #{(draftset/id ds-2)}
(set (map draftset/id claimable))))))))

Expand Down
7 changes: 7 additions & 0 deletions drafter-client/test/drafter_client/test_util/auth.clj
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,10 @@
"[email protected]"
"drafter:publisher"
(role->permissions :publisher)))

(defn editor-token []
(token (env :auth0-domain)
(env :auth0-aud)
"[email protected]"
"drafter:editor"
(role->permissions :editor)))
51 changes: 51 additions & 0 deletions drafter/doc/drafter.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@ info:
depending on their permissions then choose to make further ammendments,
`/publish` or submit the draftset to a new owner.
- `/share` to allow other users read only access to this draft without
relinquishing ownership of it -- either by specifying specific users,
or permissions that users must have.
- `/publish` which can be used by clients with the
`drafter:draft:publish` permission to publish a reviewed draftset to
the live site.
Expand Down Expand Up @@ -512,6 +516,47 @@ paths:
$ref: '#/definitions/Draftset'
'422':
description: The submit request could not be processed.
/draftset/{id}/share:
post:
operationId: share-draftset-with
summary: Share a Draftset with a user or permission holder
description: |
Shares this draftset for read only access by another user. Draftsets
are shared directly with a user, or with a pool of users with a given
permission.
security:
- jws-auth: []
parameters:
- $ref: '#/parameters/id'
- $ref: '#/parameters/permission'
- $ref: '#/parameters/share-user'
tags:
- Draftsets
responses:
'200':
description: The Draftset was successfully shared.
schema:
$ref: '#/definitions/Draftset'
'422':
description: The share request could not be processed.
delete:
operationId: unshare-draftset
summary: Unshare a Draftset
description: |
Unshares this draftset so that only its owner can view it.
security:
- jws-auth: []
parameters:
- $ref: '#/parameters/id'
tags:
- Draftsets
responses:
'200':
description: The Draftset was successfully unshared.
schema:
$ref: '#/definitions/Draftset'
'422':
description: The unshare request could not be processed.
/draftset/{id}/claim:
put:
operationId: claim-draftset
Expand Down Expand Up @@ -875,6 +920,12 @@ parameters:
in: query
required: false
type: string
share-user:
name: user
description: The username of the user to share the draftset with.
in: query
required: false
type: string

include:
name: include
Expand Down
76 changes: 47 additions & 29 deletions drafter/resources/drafter-base-config.edn
Original file line number Diff line number Diff line change
Expand Up @@ -82,16 +82,21 @@
{:drafter/backend #ig/ref :drafter/backend
:wrap-authenticate #ig/ref :drafter.middleware/wrap-authenticate}

:drafter.feature.middleware/wrap-as-draftset-viewer
{:drafter/backend #ig/ref :drafter/backend
:wrap-authenticate #ig/ref :drafter.middleware/wrap-authenticate}

:drafter.feature.draftset.delete/handler {:drafter/backend #ig/ref :drafter/backend
:wrap-as-draftset-owner #ig/ref :drafter.feature.middleware/wrap-as-draftset-owner}

:drafter.feature.draftset.options/handler
{:drafter/backend #ig/ref :drafter/backend
:wrap-authenticate #ig/ref :drafter.middleware/wrap-authenticate}

:drafter.feature.draftset-data.show/handler {:drafter/backend #ig/ref :drafter/backend
:wrap-as-draftset-owner #ig/ref :drafter.feature.middleware/wrap-as-draftset-owner
:timeout-fn #ig/ref [:drafter.timeouts/timeout-query :drafter/draftset-timeout]}
:drafter.feature.draftset-data.show/handler
{:drafter/backend #ig/ref :drafter/backend
:wrap-as-draftset-viewer #ig/ref :drafter.feature.middleware/wrap-as-draftset-viewer
:timeout-fn #ig/ref [:drafter.timeouts/timeout-query :drafter/draftset-timeout]}

:drafter.feature.draftset-data.delete/delete-data-handler {:drafter/manager #ig/ref :drafter/manager
:wrap-as-draftset-owner #ig/ref :drafter.feature.middleware/wrap-as-draftset-owner}
Expand All @@ -117,9 +122,10 @@
:drafter.feature.draftset-data.append-by-graph/handler {:drafter/manager #ig/ref :drafter/manager
:wrap-as-draftset-owner #ig/ref :drafter.feature.middleware/wrap-as-draftset-owner}

:drafter.feature.draftset.query/handler {:drafter/backend #ig/ref :drafter/backend
:wrap-as-draftset-owner #ig/ref :drafter.feature.middleware/wrap-as-draftset-owner
:timeout-fn #ig/ref [:drafter.timeouts/timeout-query :drafter/draftset-timeout]}
:drafter.feature.draftset.query/handler
{:drafter/backend #ig/ref :drafter/backend
:wrap-as-draftset-viewer #ig/ref :drafter.feature.middleware/wrap-as-draftset-viewer
:timeout-fn #ig/ref [:drafter.timeouts/timeout-query :drafter/draftset-timeout]}

:drafter.feature.draftset.update/handler {:drafter/manager #ig/ref :drafter/manager
:wrap-as-draftset-owner #ig/ref :drafter.feature.middleware/wrap-as-draftset-owner
Expand All @@ -135,6 +141,16 @@
:drafter.user/repo #ig/ref :drafter.user/repo
:wrap-as-draftset-owner #ig/ref :drafter.feature.middleware/wrap-as-draftset-owner}

:drafter.feature.draftset.share/post
{:drafter/manager #ig/ref :drafter/manager
:drafter.user/repo #ig/ref :drafter.user/repo
:wrap-as-draftset-owner #ig/ref :drafter.feature.middleware/wrap-as-draftset-owner}

:drafter.feature.draftset.share/delete
{:drafter/manager #ig/ref :drafter/manager
:drafter.user/repo #ig/ref :drafter.user/repo
:wrap-as-draftset-owner #ig/ref :drafter.feature.middleware/wrap-as-draftset-owner}

:drafter.feature.draftset.claim/handler
{:drafter/manager #ig/ref :drafter/manager
:wrap-authenticate #ig/ref :drafter.middleware/wrap-authenticate}
Expand All @@ -151,37 +167,39 @@

:drafter.middleware/wrap-authenticate {:auth-methods #ig/refset :drafter.auth/auth-method}

[:drafter/routes :draftset/api] {:context "/v1"
:routes [[:get "/users" #ig/ref :drafter.feature.users.list/get-users-handler]
[:drafter/routes :draftset/api]
{:context "/v1"
:routes
[[:get "/users" #ig/ref :drafter.feature.users.list/get-users-handler]

[:get "/draftsets" #ig/ref :drafter.feature.draftset.list/get-draftsets-handler]
[:post "/draftsets" #ig/ref :drafter.feature.draftset.create/handler]
[:get "/draftsets" #ig/ref :drafter.feature.draftset.list/get-draftsets-handler]
[:post "/draftsets" #ig/ref :drafter.feature.draftset.create/handler]

[:get "/draftset/:id" #ig/ref :drafter.feature.draftset.show/handler]
[:delete "/draftset/:id" #ig/ref :drafter.feature.draftset.delete/handler]
[:options "/draftset/:id" #ig/ref :drafter.feature.draftset.options/handler]
[:get "/draftset/:id" #ig/ref :drafter.feature.draftset.show/handler]
[:delete "/draftset/:id" #ig/ref :drafter.feature.draftset.delete/handler]
[:options "/draftset/:id" #ig/ref :drafter.feature.draftset.options/handler]

[:get "/draftset/:id/data" #ig/ref :drafter.feature.draftset-data.show/handler]
[:delete "/draftset/:id/data" #ig/ref :drafter.feature.draftset-data.delete/delete-data-handler]
[:get "/draftset/:id/data" #ig/ref :drafter.feature.draftset-data.show/handler]
[:delete "/draftset/:id/data" #ig/ref :drafter.feature.draftset-data.delete/delete-data-handler]

[:delete "/draftset/:id/graph" #ig/ref :drafter.feature.draftset-data.delete-by-graph/remove-graph-handler]
[:delete "/draftset/:id/changes" #ig/ref :drafter.feature.draftset.changes/delete-changes-handler]
[:delete "/draftset/:id/graph" #ig/ref :drafter.feature.draftset-data.delete-by-graph/remove-graph-handler]
[:delete "/draftset/:id/changes" #ig/ref :drafter.feature.draftset.changes/delete-changes-handler]

[:put "/draftset/:id/data" #ig/ref :drafter.feature.draftset-data.append/data-handler]
[:put "/draftset/:id/graph" #ig/ref :drafter.feature.draftset-data.append-by-graph/handler]
[nil "/draftset/:id/query" #ig/ref :drafter.feature.draftset.query/handler]
[:post "/draftset/:id/update" #ig/ref :drafter.feature.draftset.update/handler]

[:put "/draftset/:id/data" #ig/ref :drafter.feature.draftset-data.append/data-handler]
[:put "/draftset/:id/graph" #ig/ref :drafter.feature.draftset-data.append-by-graph/handler]
[nil "/draftset/:id/query" #ig/ref :drafter.feature.draftset.query/handler]
[:post "/draftset/:id/update" #ig/ref :drafter.feature.draftset.update/handler]
[:post "/draftset/:id/publish" #ig/ref :drafter.feature.draftset.publish/handler]
[:put "/draftset/:id" #ig/ref :drafter.feature.draftset.set-metadata/handler]
[:post "/draftset/:id/submit-to" #ig/ref :drafter.feature.draftset.submit/handler]
[:put "/draftset/:id/claim" #ig/ref :drafter.feature.draftset.claim/handler]
[:post "/draftset/:id/share" #ig/ref :drafter.feature.draftset.share/post]
[:delete "/draftset/:id/share" #ig/ref :drafter.feature.draftset.share/delete]

[:post "/draftset/:id/publish" #ig/ref :drafter.feature.draftset.publish/handler]
[:put "/draftset/:id" #ig/ref :drafter.feature.draftset.set-metadata/handler]
[:post "/draftset/:id/submit-to" #ig/ref :drafter.feature.draftset.submit/handler]
[:put "/draftset/:id/claim" #ig/ref :drafter.feature.draftset.claim/handler]
[:get "/endpoint/public" #ig/ref :drafter.feature.endpoint.show/handler]
[:get "/endpoints" #ig/ref :drafter.feature.endpoint.list/handler]]}

[:get "/endpoint/public" #ig/ref :drafter.feature.endpoint.show/handler]
[:get "/endpoints" #ig/ref :drafter.feature.endpoint.list/handler]
]
}
:drafter.swagger/swagger-routes {:auth-methods #ig/refset :drafter.auth/auth-method
:global-auth? #ig/ref :drafter/global-auth?}

Expand Down
Loading

0 comments on commit bf51782

Please sign in to comment.