Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Document a v2 api for setting tags on rooms #132

Merged
merged 23 commits into from
Nov 27, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion api/client-server/v1/rooms.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,11 @@ paths:
"user_id": "@alice:example.com"
}
],
"visibility": "private"
"visibility": "private",
"account_data": [{
"type": "m.tag",
"content": {"tags": {"work": {"order": "1"}}}
}]
}
schema:
title: RoomInfo
Expand Down Expand Up @@ -371,6 +375,15 @@ paths:
description: |-
Whether this room is visible to the ``/publicRooms`` API
or not."
account_data:
type: array
description: |-
The private data that this user has attached to this room.
items:
title: Event
type: object
allOf:
- "$ref": "core-event-schema/event.json"
required: ["room_id"]
403:
description: >
Expand Down
16 changes: 15 additions & 1 deletion api/client-server/v1/sync.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,11 @@ paths:
"user_id": "@alice:localhost"
}
],
"visibility": "private"
"visibility": "private",
"account_data": [{
"type": "m.tag",
"content": {"tags": {"work": {"order": "1"}}}
}]
}
]
}
Expand Down Expand Up @@ -332,6 +336,16 @@ paths:
description: |-
Whether this room is visible to the ``/publicRooms`` API
or not."
account_data:
type: array
description: |-
The private data that this user has attached to
this room.
items:
title: Event
type: object
allOf:
- "$ref": "core-event-schema/event.json"
required: ["room_id", "membership"]
required: ["end", "rooms", "presence"]
404:
Expand Down
16 changes: 16 additions & 0 deletions api/client-server/v2_alpha/sync.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,14 @@ paths:
e.g. typing.
allOf:
- $ref: "definitions/event_batch.json"
account_data:
title: Account Data
type: object
description: |-
The private data that this user has attached to
this room.
allOf:
- $ref: "definitions/event_batch.json"
invite:
title: Invited Rooms
type: object
Expand Down Expand Up @@ -252,6 +260,14 @@ paths:
"content": {"user_ids": ["@alice:example.com"]}
}
]
},
"account_data": {
"events": [
{
"type": "m.tag",
"content": {"tags": {"work": {"order": "1"}}}
}
]
}
}
},
Expand Down
147 changes: 147 additions & 0 deletions api/client-server/v2_alpha/tags.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
swagger: '2.0'
info:
title: "Matrix Client-Server tag API"
version: "1.0.0"
host: localhost:8008
schemes:
- https
- http
basePath: /_matrix/client/v2_alpha
consumes:
- application/json
produces:
- application/json
securityDefinitions:
accessToken:
type: apiKey
description: The user_id or application service access_token
name: access_token
in: query
paths:
"/user/{userId}/rooms/{roomId}/tags":
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the rationale for forcing clients to know their own userId in the path? We can completely infer this from the token.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To match the /user/user_id/filter APIs

get:
summary: List the tags for a room.
description: |-
List the tags set by a user on a room.
security:
- accessToken: []
parameters:
- in: path
type: string
name: userId
required: true
description: |-
The id of the user to get tags for. The access token must be
authorized to make requests for this user id.
x-example: "@alice:example.com"
- in: path
type: string
name: roomId
required: true
description: |-
The id of the room to get tags for.
x-example: "!726s6s6q:example.com"
responses:
200:
description:
The list of tags for the user for the room.
schema:
type: object
properties:
tags:
title: Tags
type: object
examples:
application/json: |-
{
"tags": {
"work": {"order": "1"},
"pinned": {}
}
}
"/user/{userId}/rooms/{roomId}/tags/{tag}":
put:
summary: Add a tag to a room.
description: |-
Add a tag to the room.
security:
- accessToken: []
parameters:
- in: path
type: string
name: userId
required: true
description: |-
The id of the user to add a tag for. The access token must be
authorized to make requests for this user id.
x-example: "@alice:example.com"
- in: path
type: string
name: roomId
required: true
description: |-
The id of the room to add a tag to.
x-example: "!726s6s6q:example.com"
- in: path
type: string
name: tag
required: true
description: |-
The tag to add.
x-example: "work"
- in: body
name: body
required: true
description: |-
Extra data for the tag, e.g. ordering.
schema:
type: object
example: |-
{"order": "1"}
responses:
200:
description:
The tag was successfully added.
schema:
type: object
examples:
application/json: |-
{}
delete:
summary: Remove a tag from the room.
description: |-
Remove a tag from the room.
security:
- access_token: []
parameters:
- in: path
type: string
name: userId
required: true
description: |-
The id of the user to remove a tag for. The access token must be
authorized to make requests for this user id.
x-example: "@alice:example.com"
- in: path
type: string
name: roomId
required: true
description: |-
The id of the room to remove a tag from.
x-example: "!726s6s6q:example.com"
- in: path
type: string
name: tag
required: true
description: |-
The tag to remove.
x-example: "work"
responses:
200:
description:
The tag was successfully removed
schema:
type: object
examples:
application/json: |-
{}
8 changes: 8 additions & 0 deletions event-schemas/examples/v1/m.tag
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"type": "m.tag",
"content": {
"tags": {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shouldn't this be a list of tags? Or if it's a single tag, shouldn't the key be called "tag"? Any chance we can show an example of metadata for the tag - e.g. { order: 1 } rather than {}.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done d538140

"work": {"order": 1}
}
}
}
25 changes: 25 additions & 0 deletions event-schemas/schema/v1/m.tag
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"type": "object",
"title": "Tag Event",
"description": "Informs the client of tags on a room.",
"properties": {
"type": {
"type": "string",
"enum": ["m.tag"]
},
"content": {
"type": "object",
"properties": {
"tags": {
"type": "object",
"description": "The tags on the room and their contents.",
"additionalProperties": {
"title": "Tag",
"type": "object"
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we describe what keys a Tag should have please? Like order?

}
}
}
},
"required": ["type", "content"]
}
48 changes: 48 additions & 0 deletions specification/modules/tags.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
Room Tagging
============

.. _module:tagging:

Users can add tags to rooms. Tags are short strings used to label rooms, e.g.
"work", "family". A room may have multiple tags. Tags are only visible to the
user that set them but are shared across all their devices.

Events
------

The tags on a room are received as single ``m.tag`` event in the
``account_data`` section of a room in a v2 /sync.

The ``m.tag`` can also be received in a v1 /events response or in the
``account_data`` section of a room in v1 /initialSync. ``m.tag``
events appearing in v1 /events will have a ``room_id`` with the room
the tags are for.

Each tag has an associated JSON object with information about the tag, e.g how
to order the rooms with a given tag.

Ordering information is given under the ``order`` key as a string. The string
are compared lexicographically by unicode codepoint to determine which should
displayed first. So a room with a tag with an ``order`` key of ``"apples"``
would appear before a room with a tag with an ``order`` key of ``"oranges"``.
If a room has a tag without an ``order`` key then it should appear after the
rooms with that tag that have an ``order`` key.

The name of a tag MUST not exceed 255 bytes.

The name of a tag should be human readable. When displaying tags for a room a
client should display this human readable name. When adding a tag for a room
a client may offer a list to choose from that includes all the tags that the
user has previously set on any of their rooms.

Two special names are listed in the specification:

* ``m.favourite``
* ``m.lowpriority``

{{m_tag_event}}

Client Behaviour
----------------

{{v2_tags_http_api}}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be great to have recommendations on what the tag names should be. Particularly:

  • Should we encourage spaces and special characters as tag names?
  • Max tag name length?
  • How to deal with localisation? E.g. assume English then have a client-side localisation tag name -> display mapping rather than encourage clients to have "family" (EN), "famille" (FR), "familie" (DE) which then don't inter-operate.

And as for ordering:

  • Are they mandatory? If not, what should the client do if they get a tag without an order (sort end, sort start, drop them, etc).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And as for ordering:#

  • Are they mandatory? If not, what should the client do if they get a tag without an order (sort end, sort start, drop them, etc).

Done 48f35e1

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Max tag name length?

Done e7fbe6f

1 change: 1 addition & 0 deletions specification/targets.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ groups: # reusable blobs of files when prefixed with 'group:'
- modules/third_party_invites.rst
- modules/search.rst
- modules/guest_access.rst
- modules/tags.rst


title_styles: ["=", "-", "~", "+", "^", "`"]
Expand Down