export const metadata = {
    title: 'Likes Extension',
    description:
        'The Likes extension adds support for users to like and dislike notes.',
}

# Likes Extension

The Likes extension adds support for users to like and dislike notes. {{ className: 'lead' }}

Implementations should make sure that users cannot like and dislike the same note at the same time. If a user dislikes a note they have already liked, the like should be removed, and vice versa.

## Likes

Likes are a way for users to show appreciation for a note, like Twitter's "heart" button or Reddit's "upvote".

### Entity Definition

<Row>
    <Col>
        <Properties>
            <Property name="type" type="string" required={true}>
                Must be `pub.versia:likes/Like`.
            </Property>
            <Property name="author" type="URI" required={true} typeLink="/types#uri">
                Creator of the Like.
            </Property>
            <Property name="liked" type="URI" required={true} typeLink="/types#uri">
                URI of the note being liked. Must link to a [Note](/entities/note).
            </Property>
        </Properties>
    </Col>

    <Col sticky>

    ```jsonc {{ 'title': 'Example Like' }}
    {
        "id": "3e7e4750-afd4-4d99-a256-02f0710a0520",
        "type": "pub.versia:likes/Like",
        "created_at": "2021-01-01T00:00:00.000Z",
        "author": "https://example.com/users/6e0204a2-746c-4972-8602-c4f37fc63bbe",
        "uri": "https://example.com/likes/3e7e4750-afd4-4d99-a256-02f0710a0520",
        "liked": "https://otherexample.org/notes/fmKZ763jzIU8"
    }
    ```

    </Col>
</Row>

## Dislikes

Dislikes are a way for users to show disapproval for a note, like YouTube's "dislikes" or Reddit's "downvotes".

### Entity Definition

<Row>
    <Col>
        <Properties>
            <Property name="type" type="string" required={true}>
                Must be `pub.versia:likes/Dislike`.
            </Property>
            <Property name="author" type="URI" required={true} typeLink="/types#uri">
                Creator of the Dislike.
            </Property>
            <Property name="disliked" type="URI" required={true} typeLink="/types#uri">
                URI of the note being disliked. Must link to a [Note](/entities/note).
            </Property>
        </Properties>
    </Col>

    <Col sticky>

    ```jsonc {{ 'title': 'Example Dislike' }}
    {
        "id": "3e7e4750-afd4-4d99-a256-02f0710a0520",
        "type": "pub.versia:likes/Dislike",
        "created_at": "2021-01-01T00:00:00.000Z",
        "author": "https://example.com/users/6e0204a2-746c-4972-8602-c4f37fc63bbe",
        "uri": "https://example.com/dislikes/3e7e4750-afd4-4d99-a256-02f0710a0520",
        "disliked": "https://otherexample.org/notes/fmKZ763jzIU8"
    }
    ```

    </Col>
</Row>

## Undoing Likes and Dislikes

To undo a like or dislike, a [Delete](/entities/delete) entity should be used. The `deleted` property of the Delete entity should link to the Like or Dislike entity to be removed.

## User Collections

The Likes extension adds the following collections to the [User](/entities/user) entity:

- `likes`: A [URI Collection](/structures/collection#uri-collection) of all the notes the user has liked.
- `dislikes`: A [URI Collection](/structures/collection#uri-collection) of all the notes the user has disliked.

```jsonc
{
    "type": "User",
    ...
    "collections": {
        ...
        "pub.versia:likes/Likes": "https://example.com/users/6e0204a2-746c-4972-8602-c4f37fc63bbe/likes",
        "pub.versia:likes/Dislikes": "https://example.com/users/6e0204a2-746c-4972-8602-c4f37fc63bbe/dislikes"
    }
}
```

## Note Collections

The Likes extension adds the following collections to the [Note](/entities/note) entity:

- `likes`: A [URI Collection](/structures/collection#uri-collection) of all the likes the note has received.
- `dislikes`: A [URI Collection](/structures/collection#uri-collection) of all the dislikes the note has received.

```jsonc
{
    "type": "Note",
    ...
    "collections": {
        ...
        "pub.versia:likes/Likes": "https://example.com/notes/fmKZ763jzIU8/likes",
        "pub.versia:likes/Dislikes": "https://example.com/notes/fmKZ763jzIU8/dislikes"
    }
}
```

## Interaction Types

<Note>
    This section only applies to implementors of the [Interaction Controls Extension](/extensions/interaction-controls).
</Note>

This extension registers the following interaction types:
- `pub.versia:likes#Like`, for liking a Note
- `pub.versia:likes#Dislike`, for disliking a Note