> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sageprotocol.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Likes

> Stores, manages, and verifies user likes on posts or content.

```rust theme={null}
use sui::table;
```

<Tip>
  Explore this module further in the Mover Registry: @sage/shared
</Tip>

## Structs

### `Likes`

All of the relationships that exist between `User`s and the content they have liked.

```rust theme={null}
public struct Likes has store
```

<Expandable title="Fields">
  ```rust theme={null}
    likes: sui::table::Table<address, u8>
  ```
</Expandable>

## Constants

Value used to store whether content has been liked or not.

```rust theme={null}
const LIKE: u8 = 1;
```

Error code used when attempting to like content that has already been liked.

```rust theme={null}
const EAlreadyLiked: u64 = 370;
```

## Functions

### `add`

Like the content.

```rust theme={null}
public fun add(likes: &mut Likes, key: address)
```

<Expandable title="Implementation">
  ```rust theme={null}
    public fun add(
        likes: &mut Likes,
        key: address
    ) {
        likes.likes.add(key, LIKE);
    }
  ```
</Expandable>

### `assert_has_not_liked`

Aborts with `EAlreadyLiked` if the content has already been liked.

```rust theme={null}
public fun assert_has_not_liked(likes: &Likes, key: address)
```

<Expandable title="Implementation">
  ```rust theme={null}
    public fun assert_has_not_liked(
        likes: &Likes,
        key: address
    ) {
        let has_liked = has_liked(
            likes,
            key
        );

        assert!(!has_liked, EAlreadyLiked);
    }
  ```
</Expandable>

### `create`

Creates a new instance of `Likes`.

```rust theme={null}
public fun create(ctx: &mut TxContext): Likes
```

<Expandable title="Implementation">
  ```rust theme={null}
    public fun create(
        ctx: &mut TxContext
    ): Likes {
        let likes = Likes {
            likes: table::new(ctx)
        };

        likes
    }
  ```
</Expandable>

### `get_length`

Gets the number of times the content has been liked.

```rust theme={null}
public fun get_length(likes: &Likes): u64
```

<Expandable title="Implementation">
  ```rust theme={null}
    public fun get_length(
        likes: &Likes
    ): u64 {
        likes.likes.length()
    }
  ```
</Expandable>

### `has_liked`

Returns true or false based on whether the content has been liked.

```rust theme={null}
public fun has_liked(likes: &Likes, key: address): bool
```

<Expandable title="Implementation">
  ```rust theme={null}
    public fun has_liked(
        likes: &Likes,
        key: address
    ): bool {
        likes.likes.contains(key)
    }
  ```
</Expandable>
