summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfr33domlover <fr33domlover@riseup.net>2020-01-21 17:13:36 +0200
committerfr33domlover <fr33domlover@riseup.net>2020-01-21 17:13:36 +0200
commite5680215bee374c5726ebbcfd56d2969014df9ba (patch)
treea3da01bbe8f8e2780e28f9dcd083ddd36ab8a751
parentfaa456bfef024f557613e60affb2c7070f0aad11 (diff)
Define how to determine the ticket tracker for a given object
-rw-r--r--spec/behavior.md28
-rw-r--r--spec/modeling.md29
-rw-r--r--spec/vocabulary.md66
3 files changed, 108 insertions, 15 deletions
diff --git a/spec/behavior.md b/spec/behavior.md
index bc21fb7..0a0c528 100644
--- a/spec/behavior.md
+++ b/spec/behavior.md
@@ -198,8 +198,28 @@ See [example in the modeling specification][model-push].
## Opening a Ticket
-There are two mechanisms for opening a [Ticket][type-ticket] under a ticket
-tracking object:
+The first step for opening a ticket is to determine to which actor to send the
+ticket. We'll refer to this actor as the *ticket tracker*. Given an object
+*obj* against which you'd like to open a ticket (e.g. some application's source
+code repository), look at the [ticketsTrackedBy][prop-ticketstrackedby]
+property of *obj*.
+
+- If `ticketsTrackedBy` isn't specified, then *obj* does't declare a way to
+ open tickets via ForgeFed.
+- If `ticketsTrackedBy` is specified and is set to the [id][] of *obj* itself,
+ that means *obj* manages its own tickets, i.e. it is the *ticket tracker* to
+ which you'll send the ticket.
+- If `ticketsTrackedBy` is specified and is set to some other object, look at
+ the [tracksTicketsFor][prop-tracksticketsfor] property of that other object.
+ If the [id][] of *obj* is listed there under `tracksTicketsFor`, then that
+ other object is the *ticket tracker* to which you'll send the ticket.
+ Implementations SHOULD verify this bidirectional reference between the object
+ and the tracker, and SHOULD NOT send a ticket if the bidirectional reference
+ isn't found.
+
+Now that we've determined the *ticket tracker*, i.e. the actor to whom we'll
+send the [Ticket][type-ticket], there are two mechanisms for opening a new
+[Ticket][type-ticket] under the *ticket tracker*:
1. The *creation* flow: The ticket author will be hosting the ticket. They
provide the ticket tracker with the ticket's [id][] URI, and the ticket
@@ -473,7 +493,9 @@ he submitted earlier against her Game Of Life simulation app repository:
[type-repository]: /vocabulary.html#type-repository
[type-ticket]: /vocabulary.html#type-ticket
-[prop-team]: /vocabulary.html#prop-team
+[prop-team]: /vocabulary.html#prop-team
+[prop-ticketstrackedby]: /vocabulary.html#prop-ticketstrackedby
+[prop-tracksticketsfor]: /vocabulary.html#prop-tracksticketsfor
[model-comment]: /modeling.html#comment
[model-push]: /modeling.html#push
diff --git a/spec/modeling.md b/spec/modeling.md
index e100864..6cbce2d 100644
--- a/spec/modeling.md
+++ b/spec/modeling.md
@@ -135,6 +135,9 @@ Properties:
* [team][prop-team]: [Collection][] of actors who have management/push access
to the repository, or the subset of them who is available and wants to be
contacted/notified/responsible on repo access related activities/requests
+* [ticketsTrackedBy][prop-ticketstrackedby]: The ticket tracker that tracks
+ tickets for this repository, this can be the repository itself if it manages
+ its own tickets
Example:
@@ -156,6 +159,7 @@ Example:
"outbox": "https://dev.example/aviva/treesim/outbox",
"followers": "https://dev.example/aviva/treesim/followers",
"team": "https://dev.example/aviva/treesim/team",
+ "ticketsTrackedBy": "https://dev.example/aviva/treesim",
"name": "Tree Growth 3D Simulation",
"summary": "<p>Tree growth 3D simulator for my nature exploration game</p>"
}
@@ -350,18 +354,19 @@ Example:
[type-repository]: /vocabulary.html#type-repository
[type-ticket]: /vocabulary.html#type-ticket
-[prop-committed]: /vocabulary.html#prop-committed
-[prop-committedby]: /vocabulary.html#prop-committedby
-[prop-description]: /vocabulary.html#prop-description
-[prop-dependants]: /vocabulary.html#prop-dependants
-[prop-dependencies]: /vocabulary.html#prop-dependencies
-[prop-earlyitems]: /vocabulary.html#prop-earlyitems
-[prop-hash]: /vocabulary.html#prop-hash
-[prop-hashafter]: /vocabulary.html#prop-hashafter
-[prop-hashbefore]: /vocabulary.html#prop-hashbefore
-[prop-isresolved]: /vocabulary.html#prop-isresolved
-[prop-ref]: /vocabulary.html#prop-ref
-[prop-team]: /vocabulary.html#prop-team
+[prop-committed]: /vocabulary.html#prop-committed
+[prop-committedby]: /vocabulary.html#prop-committedby
+[prop-description]: /vocabulary.html#prop-description
+[prop-dependants]: /vocabulary.html#prop-dependants
+[prop-dependencies]: /vocabulary.html#prop-dependencies
+[prop-earlyitems]: /vocabulary.html#prop-earlyitems
+[prop-hash]: /vocabulary.html#prop-hash
+[prop-hashafter]: /vocabulary.html#prop-hashafter
+[prop-hashbefore]: /vocabulary.html#prop-hashbefore
+[prop-isresolved]: /vocabulary.html#prop-isresolved
+[prop-ref]: /vocabulary.html#prop-ref
+[prop-team]: /vocabulary.html#prop-team
+[prop-ticketstrackedby]: /vocabulary.html#prop-ticketstrackedby
[prop-created]: http://purl.org/dc/terms/created
diff --git a/spec/vocabulary.md b/spec/vocabulary.md
index a0dacb8..1413ad0 100644
--- a/spec/vocabulary.md
+++ b/spec/vocabulary.md
@@ -681,6 +681,72 @@ The repository's team *https://dev.example/aviva/treesim/team*:
}
```
+## ticketsTrackedBy {#prop-ticketstrackedby}
+
+**URI:** `https://forgefed.peers.community/ns#ticketsTrackedBy`
+
+**Notes:** Identifies the actor which tracks tickets related to the given
+object. This is the actor to whom you send tickets you'd like to open against
+the object.
+
+**Domain:** [Object][]
+
+**Range:** [Object][] that is an actor
+
+**Functional:** Yes
+
+**Inverse of:** [tracksTicketsFor](#prop-tracksticketsfor)
+
+**Example:**
+
+```json
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://forgefed.peers.community/ns"
+ ],
+ "id": "https://dev.example/aviva/treesim",
+ "type": "Repository",
+ "name": "Tree Growth 3D Simulation",
+ "summary": "<p>Tree growth 3D simulator for my nature exploration game</p>",
+ "ticketsTrackedBy": "https://bugs.example/projects/treesim"
+}
+```
+
+## tracksTicketsFor {#prop-tracksticketsfor}
+
+**URI:** `https://forgefed.peers.community/ns#tracksTicketsFor`
+
+**Notes:** Identifies objects for which which this ticket tracker tracks
+tickets. When you'd like to open a ticket against those objects, you can send
+them to this tracker.
+
+**Domain:** [Object][] that is an actor
+
+**Range:** [Object][]
+
+**Functional:** No
+
+**Inverse of:** [ticketsTrackedBy](#prop-ticketstrackedby)
+
+**Example:**
+
+```json
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://forgefed.peers.community/ns"
+ ],
+ "id": "https://bugs.example/treesim",
+ "type": "Project",
+ "tracksTicketsFor": [
+ "https://dev.example/aviva/liblsystem",
+ "https://dev.example/aviva/3d-tree-models",
+ "https://dev.example/aviva/treesim"
+ ]
+}
+```
+
[Activity]: https://www.w3.org/TR/activitystreams-vocabulary/#dfn-activity
[Collection]: https://www.w3.org/TR/activitystreams-vocabulary/#dfn-collection
[Link]: https://www.w3.org/TR/activitystreams-vocabulary/#dfn-link