# ink.resenha.defs

> Views shared by the calls Resenha's server answers.

- Kind: defs
- Authority: resenha.ink
- Lexicon: 1
- Published by [resenha.ink](https://lexicon.garden/identity/did:plc:v7itjf4h3sb5zuegiiskctqb), the NSID's authority

## Links

- [Documentation](https://lexicon.garden/lexicon/did:plc:v7itjf4h3sb5zuegiiskctqb/ink.resenha.defs)
- [Schema JSON](https://lexicon.garden/lexicon/did:plc:v7itjf4h3sb5zuegiiskctqb/ink.resenha.defs/schema.json)
- [Analytics](https://lexicon.garden/lexicon/did:plc:v7itjf4h3sb5zuegiiskctqb/ink.resenha.defs/analytics)

## #bookIdentifiers (`ink.resenha.defs#bookIdentifiers`)

Type: object

A book's numbers in every catalogue that has it. Any one of them finds the book; together they tie the catalogues to each other.

### Properties

- `asin` (string): Amazon's, as Popfeed keeps it.
  - Constraints: maxLength: 16
- `goodreadsId` (string)
  - Constraints: maxLength: 32
- `hiveId` (string): BookHive's ID for the edition.
  - Constraints: maxLength: 64
- `isbn10` (string)
  - Constraints: maxLength: 10
- `isbn13` (string)
  - Constraints: maxLength: 13
- `openLibraryEdition` (string): Open Library's edition key, such as /books/OL62590811M.
  - Constraints: maxLength: 32
- `openLibraryWork` (string): Open Library's work key, such as /works/OL45908582W: the book across its editions.
  - Constraints: maxLength: 32

## #bookRef (`ink.resenha.defs#bookRef`)

Type: object

Which book a record is about, in every key anyone uses, so an app finds it with the one it has: by BookHive ID, ISBN, Open Library work, or the reader's own record in another app. Resenha's records carry it beside their own keys. Nothing is required but the title, so a book no catalogue knows can still be named.

### Properties

- `authors` (string): Tab-separated, as BookHive stores them.
  - Constraints: maxLength: 1024
- `cover` (string · uri): A cover the writer's app showed for the book, downloaded and found to be a real cover rather than a catalogue's stand-in picture. Resenha's server keeps it as a fallback for the book's cover, after the catalogue's and Open Library's.
  - Constraints: maxLength: 1000
- `identifiers` (ref)
  - Reference: `#bookIdentifiers`
- `records` (array): The reader's own records for the book in any app: their buzz.bookhive.book, their social.popfeed.feed.listItem records, a record in an app to come.
  - Constraints: maxLength: 20
  - `items` (string · at-uri)
- `title` (string, required)
  - Constraints: maxLength: 512

## #bookView (`ink.resenha.defs#bookView`)

Type: object

Enough of a book to show a row. Cover and details come from BookHive's catalogue when the server has them; otherwise the app asks BookHive itself.

### Properties

- `authors` (string): Authors as BookHive stores them, tab-separated.
  - Constraints: maxLength: 1024
- `cover` (string · uri): For a Popfeed book, Popfeed's own cover, its surest address.
- `covers` (array): For a Popfeed book, every address of its cover, surest first, when there is more than one: the poster blob's address on Bluesky's CDN, isbndb's, then the item's posterUrl. A reader tries the next when one fails.
  - Constraints: maxLength: 8
  - `items` (string · uri)
- `genres` (array)
  - Constraints: maxLength: 32
  - `items` (string)
    - Constraints: maxLength: 64
- `hiveId` (string, required): The book's BookHive ID, or, for a Popfeed book BookHive's catalogue doesn't know, a stand-in beginning with popfeed- that no BookHive call takes.
  - Constraints: maxLength: 64
- `isbn13` (string): The edition the reader's record names, when it names one. For a book BookHive's catalogue doesn't know, the key of the page its readers share (ink.resenha.book.getBook).
  - Constraints: maxLength: 13
- `pages` (integer)
  - Constraints: minimum: 1
- `title` (string)
  - Constraints: maxLength: 512
- `year` (integer): Year of publication, from BookHive's catalogue.

## #commentView (`ink.resenha.defs#commentView`)

Type: object

A comment in the thread about a reader reading a book.

### Properties

- `author` (string · did, required)
- `cid` (string · cid)
- `createdAt` (string · datetime, required)
- `parent` (string · at-uri): The comment this one answers; absent at the top.
- `removed` (boolean): Removed by Resenha's maintainer but kept in place because replies hang from it: no words, no author.
- `root` (string · at-uri)
- `source` (string, required): A Resenha comment, or a BookHive buzz, which is read here but answered on BookHive.
  - Constraints: knownValues: resenha | bookhive
- `text` (string, required)
  - Constraints: maxLength: 10000, maxGraphemes: 1000
- `uri` (string · at-uri, required)

## #event (`ink.resenha.defs#event`)

Type: object

Something a reader did with a book.

### Properties

- `actor` (string · did, required)
- `book` (ref, required)
  - Reference: `#bookView`
- `cid` (string · cid): The record's version as the server last saw it, for a like or comment to name.
- `commentCount` (integer): Comments in the event's home: the thread about the reader reading this book (Resenha comments and BookHive buzzes) for a reading or a review kept on BookHive, Popfeed's comments and replies on a Popfeed review, replies to the post of a review published from Resenha.
  - Constraints: minimum: 0
- `date` (string · datetime, required)
- `excerpt` (string): The start of the review, plain text.
  - Constraints: maxLength: 3000, maxGraphemes: 300
- `kind` (string, required): What they did. wantsToRead and abandoned are dated by when the server saw the status change, else by when the book was added; progress by the record.
  - Constraints: knownValues: started | finished | reviewed | wantsToRead | abandoned | progress
- `likeCount` (integer): Likes in the event's home: Resenha likes on the reader's book record for a reading or a review kept on BookHive, Popfeed likes on a Popfeed review, Bluesky likes on the post that announced a review published from Resenha.
  - Constraints: minimum: 0
- `popfeedReview` (string · at-uri): For a reviewed event from Popfeed: the social.popfeed.feed.review record, whose comments and likes are Popfeed's.
- `post` (ref): For a reviewed event with source resenha: the Bluesky post that announced the review, whose likes and replies are the review's.
  - Reference: `com.atproto.repo.strongRef`
- `progress` (ref)
  - Reference: `#progressView`
- `review` (string): The whole review, plain markdown, on reviewed events and on finished ones that carry the review.
  - Constraints: maxLength: 1000000, maxGraphemes: 100000
- `source` (string, required)
  - Constraints: knownValues: bookhive | popfeed | resenha
- `stars` (integer): In half stars, 1 to 10, as BookHive keeps them.
  - Constraints: minimum: 1, maximum: 10
- `uri` (string · at-uri, required): The record it comes from: the reader's BookHive book record, or their Popfeed list item (or review, for a book reviewed but on no list).
- `viewer` (ref)
  - Reference: `#viewerState`

## #followerView (`ink.resenha.defs#followerView`)

Type: object

Someone who follows the caller.

### Properties

- `books` (integer): How many books they keep in the index; 0 for someone who isn't a reader.
  - Constraints: minimum: 0
- `did` (string · did, required)
- `followedAt` (string · datetime): When they followed, when the server heard the follow itself; absent for follows older than its listening.
- `follows` (boolean): Whether the caller follows them back.
- `readingNow` (array)
  - Constraints: maxLength: 3
  - `items` (ref)
    - Reference: `#bookView`

## #knownFollowers (`ink.resenha.defs#knownFollowers`)

Type: object

Among the caller's follows, who follows a reader: social proof within Resenha's community, from the follows and followers the server keeps.

### Properties

- `count` (integer, required)
  - Constraints: minimum: 0
- `followers` (array): Up to three of them, to name.
  - Constraints: maxLength: 3
  - `items` (string · did)

## #profileView (`ink.resenha.defs#profileView`)

Type: object

Someone's name and picture, as Bluesky's AppView last gave them to the server; absent for a reader it hasn't fetched yet, whose name the app then finds itself.

### Properties

- `avatar` (string · uri)
- `did` (string · did, required)
- `displayName` (string)
  - Constraints: maxLength: 640, maxGraphemes: 64
- `handle` (string · handle)

## #progressView (`ink.resenha.defs#progressView`)

Type: object

How far through the book the reader is, as the record says.

### Properties

- `currentPage` (integer)
  - Constraints: minimum: 1
- `percent` (integer, required)
  - Constraints: minimum: 0, maximum: 100
- `totalPages` (integer)
  - Constraints: minimum: 1
- `updatedAt` (string · datetime, required)

## #readerView (`ink.resenha.defs#readerView`)

Type: object

### Properties

- `books` (integer): How many books they keep on BookHive.
  - Constraints: minimum: 0
- `booksInCommon` (integer): With the caller, when sorted by similar.
  - Constraints: minimum: 0
- `did` (string · did, required)
- `followedAt` (string · datetime): When the caller followed them, for the caller's own list.
- `followsYou` (boolean): Whether they follow the caller, as the server knows it.
- `joinedAt` (string · datetime): When they started using Resenha.
- `lastActivity` (string · datetime): When they last started, finished, changed or progressed in a book.
- `readingNow` (array)
  - Constraints: maxLength: 3
  - `items` (ref)
    - Reference: `#bookView`

## #reportView (`ink.resenha.defs#reportView`)

Type: object

A reported, or removed, Resenha comment as the maintainers see it.

### Properties

- `author` (string · did)
- `note` (string)
- `reason` (string)
- `removed` (boolean)
- `removedAt` (string · datetime)
- `reportedAt` (string · datetime)
- `reporter` (string · did)
- `resolution` (string)
  - Constraints: knownValues: remove | keep | removeAndHide | restore
- `resolvedAt` (string · datetime)
- `subject` (string · at-uri): The book record the thread is on.
- `subjectOwner` (string · did)
- `subjectTitle` (string): That book's title, when the index has it.
- `text` (string): The comment's words, as the index keeps them.
- `uri` (string · at-uri, required): The comment.

## #reviewView (`ink.resenha.defs#reviewView`)

Type: object

### Properties

- `author` (string · did, required)
- `book` (ref, required)
  - Reference: `#bookView`
- `createdAt` (string · datetime, required)
- `excerpt` (string)
  - Constraints: maxLength: 3000, maxGraphemes: 300
- `hasSpoilers` (boolean)
- `languages` (array)
  - Constraints: maxLength: 8
  - `items` (string · language)
- `source` (string, required)
  - Constraints: knownValues: bookhive | popfeed | resenha
- `stars` (integer)
  - Constraints: minimum: 1, maximum: 10
- `text` (string): The whole review, when asked for with full.
  - Constraints: maxLength: 1000000, maxGraphemes: 100000
- `title` (string)
  - Constraints: maxLength: 3000, maxGraphemes: 300
- `uri` (string · at-uri, required): The review: a Standard.site document, a Popfeed review, or a BookHive book record with a review.

## #starterPackView (`ink.resenha.defs#starterPackView`)

Type: object

A starter pack the server keeps in the official account.

### Properties

- `description` (string)
- `list` (string · at-uri): The reference list the pack is built on.
- `members` (array, required)
  - Constraints: maxLength: 150
  - `items` (string · did)
- `name` (string, required)
- `updatedAt` (string · datetime)
- `uri` (string · at-uri, required)

## #suggestionView (`ink.resenha.defs#suggestionView`)

Type: object

A reader worth following, for an empty Parlor.

### Properties

- `activeDays` (integer): Days over the last six months on which they started, finished, changed, progressed in or reviewed a book, on any source.
  - Constraints: minimum: 0
- `books` (integer)
  - Constraints: minimum: 0
- `did` (string · did, required)
- `followsYou` (boolean): They follow the caller already.
- `knownFollowers` (ref)
  - Reference: `#knownFollowers`
- `languages` (array): The languages they said their reviews are in.
  - `items` (string · language)
- `latestReview` (object)
- `reviews` (integer)
  - Constraints: minimum: 0
- `source` (string, required): Where they read: Resenha's readers come first, then BookHive's and Popfeed's.
  - Constraints: knownValues: resenha | bookhive | popfeed
- `tier` (integer)
  - Constraints: minimum: 0, maximum: 2

## #viewerState (`ink.resenha.defs#viewerState`)

Type: object

The caller's own reactions to a book record.

### Properties

- `like` (string · at-uri): The caller's like, to take it back.

## Schema

```json
{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "bookIdentifiers": {
      "description": "A book's numbers in every catalogue that has it. Any one of them finds the book; together they tie the catalogues to each other.",
      "properties": {
        "asin": {
          "description": "Amazon's, as Popfeed keeps it.",
          "maxLength": 16,
          "type": "string"
        },
        "goodreadsId": {
          "maxLength": 32,
          "type": "string"
        },
        "hiveId": {
          "description": "BookHive's ID for the edition.",
          "maxLength": 64,
          "type": "string"
        },
        "isbn10": {
          "maxLength": 10,
          "type": "string"
        },
        "isbn13": {
          "maxLength": 13,
          "type": "string"
        },
        "openLibraryEdition": {
          "description": "Open Library's edition key, such as /books/OL62590811M.",
          "maxLength": 32,
          "type": "string"
        },
        "openLibraryWork": {
          "description": "Open Library's work key, such as /works/OL45908582W: the book across its editions.",
          "maxLength": 32,
          "type": "string"
        }
      },
      "type": "object"
    },
    "bookRef": {
      "description": "Which book a record is about, in every key anyone uses, so an app finds it with the one it has: by BookHive ID, ISBN, Open Library work, or the reader's own record in another app. Resenha's records carry it beside their own keys. Nothing is required but the title, so a book no catalogue knows can still be named.",
      "properties": {
        "authors": {
          "description": "Tab-separated, as BookHive stores them.",
          "maxLength": 1024,
          "type": "string"
        },
        "cover": {
          "description": "A cover the writer's app showed for the book, downloaded and found to be a real cover rather than a catalogue's stand-in picture. Resenha's server keeps it as a fallback for the book's cover, after the catalogue's and Open Library's.",
          "format": "uri",
          "maxLength": 1000,
          "type": "string"
        },
        "identifiers": {
          "ref": "#bookIdentifiers",
          "type": "ref"
        },
        "records": {
          "description": "The reader's own records for the book in any app: their buzz.bookhive.book, their social.popfeed.feed.listItem records, a record in an app to come.",
          "items": {
            "format": "at-uri",
            "type": "string"
          },
          "maxLength": 20,
          "type": "array"
        },
        "title": {
          "maxLength": 512,
          "type": "string"
        }
      },
      "required": [
        "title"
      ],
      "type": "object"
    },
    "bookView": {
      "description": "Enough of a book to show a row. Cover and details come from BookHive's catalogue when the server has them; otherwise the app asks BookHive itself.",
      "properties": {
        "authors": {
          "description": "Authors as BookHive stores them, tab-separated.",
          "maxLength": 1024,
          "type": "string"
        },
        "cover": {
          "description": "For a Popfeed book, Popfeed's own cover, its surest address.",
          "format": "uri",
          "type": "string"
        },
        "covers": {
          "description": "For a Popfeed book, every address of its cover, surest first, when there is more than one: the poster blob's address on Bluesky's CDN, isbndb's, then the item's posterUrl. A reader tries the next when one fails.",
          "items": {
            "format": "uri",
            "type": "string"
          },
          "maxLength": 8,
          "type": "array"
        },
        "genres": {
          "items": {
            "maxLength": 64,
            "type": "string"
          },
          "maxLength": 32,
          "type": "array"
        },
        "hiveId": {
          "description": "The book's BookHive ID, or, for a Popfeed book BookHive's catalogue doesn't know, a stand-in beginning with popfeed- that no BookHive call takes.",
          "maxLength": 64,
          "type": "string"
        },
        "isbn13": {
          "description": "The edition the reader's record names, when it names one. For a book BookHive's catalogue doesn't know, the key of the page its readers share (ink.resenha.book.getBook).",
          "maxLength": 13,
          "type": "string"
        },
        "pages": {
          "minimum": 1,
          "type": "integer"
        },
        "title": {
          "maxLength": 512,
          "type": "string"
        },
        "year": {
          "description": "Year of publication, from BookHive's catalogue.",
          "type": "integer"
        }
      },
      "required": [
        "hiveId"
      ],
      "type": "object"
    },
    "commentView": {
      "description": "A comment in the thread about a reader reading a book.",
      "properties": {
        "author": {
          "format": "did",
          "type": "string"
        },
        "cid": {
          "format": "cid",
          "type": "string"
        },
        "createdAt": {
          "format": "datetime",
          "type": "string"
        },
        "parent": {
          "description": "The comment this one answers; absent at the top.",
          "format": "at-uri",
          "type": "string"
        },
        "removed": {
          "description": "Removed by Resenha's maintainer but kept in place because replies hang from it: no words, no author.",
          "type": "boolean"
        },
        "root": {
          "format": "at-uri",
          "type": "string"
        },
        "source": {
          "description": "A Resenha comment, or a BookHive buzz, which is read here but answered on BookHive.",
          "knownValues": [
            "resenha",
            "bookhive"
          ],
          "type": "string"
        },
        "text": {
          "maxGraphemes": 1000,
          "maxLength": 10000,
          "type": "string"
        },
        "uri": {
          "format": "at-uri",
          "type": "string"
        }
      },
      "required": [
        "uri",
        "author",
        "text",
        "createdAt",
        "source"
      ],
      "type": "object"
    },
    "event": {
      "description": "Something a reader did with a book.",
      "properties": {
        "actor": {
          "format": "did",
          "type": "string"
        },
        "book": {
          "ref": "#bookView",
          "type": "ref"
        },
        "cid": {
          "description": "The record's version as the server last saw it, for a like or comment to name.",
          "format": "cid",
          "type": "string"
        },
        "commentCount": {
          "description": "Comments in the event's home: the thread about the reader reading this book (Resenha comments and BookHive buzzes) for a reading or a review kept on BookHive, Popfeed's comments and replies on a Popfeed review, replies to the post of a review published from Resenha.",
          "minimum": 0,
          "type": "integer"
        },
        "date": {
          "format": "datetime",
          "type": "string"
        },
        "excerpt": {
          "description": "The start of the review, plain text.",
          "maxGraphemes": 300,
          "maxLength": 3000,
          "type": "string"
        },
        "kind": {
          "description": "What they did. wantsToRead and abandoned are dated by when the server saw the status change, else by when the book was added; progress by the record.",
          "knownValues": [
            "started",
            "finished",
            "reviewed",
            "wantsToRead",
            "abandoned",
            "progress"
          ],
          "type": "string"
        },
        "likeCount": {
          "description": "Likes in the event's home: Resenha likes on the reader's book record for a reading or a review kept on BookHive, Popfeed likes on a Popfeed review, Bluesky likes on the post that announced a review published from Resenha.",
          "minimum": 0,
          "type": "integer"
        },
        "popfeedReview": {
          "description": "For a reviewed event from Popfeed: the social.popfeed.feed.review record, whose comments and likes are Popfeed's.",
          "format": "at-uri",
          "type": "string"
        },
        "post": {
          "description": "For a reviewed event with source resenha: the Bluesky post that announced the review, whose likes and replies are the review's.",
          "ref": "com.atproto.repo.strongRef",
          "type": "ref"
        },
        "progress": {
          "ref": "#progressView",
          "type": "ref"
        },
        "review": {
          "description": "The whole review, plain markdown, on reviewed events and on finished ones that carry the review.",
          "maxGraphemes": 100000,
          "maxLength": 1000000,
          "type": "string"
        },
        "source": {
          "knownValues": [
            "bookhive",
            "popfeed",
            "resenha"
          ],
          "type": "string"
        },
        "stars": {
          "description": "In half stars, 1 to 10, as BookHive keeps them.",
          "maximum": 10,
          "minimum": 1,
          "type": "integer"
        },
        "uri": {
          "description": "The record it comes from: the reader's BookHive book record, or their Popfeed list item (or review, for a book reviewed but on no list).",
          "format": "at-uri",
          "type": "string"
        },
        "viewer": {
          "ref": "#viewerState",
          "type": "ref"
        }
      },
      "required": [
        "uri",
        "kind",
        "actor",
        "book",
        "date",
        "source"
      ],
      "type": "object"
    },
    "followerView": {
      "description": "Someone who follows the caller.",
      "properties": {
        "books": {
          "description": "How many books they keep in the index; 0 for someone who isn't a reader.",
          "minimum": 0,
          "type": "integer"
        },
        "did": {
          "format": "did",
          "type": "string"
        },
        "followedAt": {
          "description": "When they followed, when the server heard the follow itself; absent for follows older than its listening.",
          "format": "datetime",
          "type": "string"
        },
        "follows": {
          "description": "Whether the caller follows them back.",
          "type": "boolean"
        },
        "readingNow": {
          "items": {
            "ref": "#bookView",
            "type": "ref"
          },
          "maxLength": 3,
          "type": "array"
        }
      },
      "required": [
        "did"
      ],
      "type": "object"
    },
    "knownFollowers": {
      "description": "Among the caller's follows, who follows a reader: social proof within Resenha's community, from the follows and followers the server keeps.",
      "properties": {
        "count": {
          "minimum": 0,
          "type": "integer"
        },
        "followers": {
          "description": "Up to three of them, to name.",
          "items": {
            "format": "did",
            "type": "string"
          },
          "maxLength": 3,
          "type": "array"
        }
      },
      "required": [
        "count"
      ],
      "type": "object"
    },
    "profileView": {
      "description": "Someone's name and picture, as Bluesky's AppView last gave them to the server; absent for a reader it hasn't fetched yet, whose name the app then finds itself.",
      "properties": {
        "avatar": {
          "format": "uri",
          "type": "string"
        },
        "did": {
          "format": "did",
          "type": "string"
        },
        "displayName": {
          "maxGraphemes": 64,
          "maxLength": 640,
          "type": "string"
        },
        "handle": {
          "format": "handle",
          "type": "string"
        }
      },
      "required": [
        "did"
      ],
      "type": "object"
    },
    "progressView": {
      "description": "How far through the book the reader is, as the record says.",
      "properties": {
        "currentPage": {
          "minimum": 1,
          "type": "integer"
        },
        "percent": {
          "maximum": 100,
          "minimum": 0,
          "type": "integer"
        },
        "totalPages": {
          "minimum": 1,
          "type": "integer"
        },
        "updatedAt": {
          "format": "datetime",
          "type": "string"
        }
      },
      "required": [
        "percent",
        "updatedAt"
      ],
      "type": "object"
    },
    "readerView": {
      "properties": {
        "books": {
          "description": "How many books they keep on BookHive.",
          "minimum": 0,
          "type": "integer"
        },
        "booksInCommon": {
          "description": "With the caller, when sorted by similar.",
          "minimum": 0,
          "type": "integer"
        },
        "did": {
          "format": "did",
          "type": "string"
        },
        "followedAt": {
          "description": "When the caller followed them, for the caller's own list.",
          "format": "datetime",
          "type": "string"
        },
        "followsYou": {
          "description": "Whether they follow the caller, as the server knows it.",
          "type": "boolean"
        },
        "joinedAt": {
          "description": "When they started using Resenha.",
          "format": "datetime",
          "type": "string"
        },
        "lastActivity": {
          "description": "When they last started, finished, changed or progressed in a book.",
          "format": "datetime",
          "type": "string"
        },
        "readingNow": {
          "items": {
            "ref": "#bookView",
            "type": "ref"
          },
          "maxLength": 3,
          "type": "array"
        }
      },
      "required": [
        "did"
      ],
      "type": "object"
    },
    "reportView": {
      "description": "A reported, or removed, Resenha comment as the maintainers see it.",
      "properties": {
        "author": {
          "format": "did",
          "type": "string"
        },
        "note": {
          "type": "string"
        },
        "reason": {
          "type": "string"
        },
        "removed": {
          "type": "boolean"
        },
        "removedAt": {
          "format": "datetime",
          "type": "string"
        },
        "reportedAt": {
          "format": "datetime",
          "type": "string"
        },
        "reporter": {
          "format": "did",
          "type": "string"
        },
        "resolution": {
          "knownValues": [
            "remove",
            "keep",
            "removeAndHide",
            "restore"
          ],
          "type": "string"
        },
        "resolvedAt": {
          "format": "datetime",
          "type": "string"
        },
        "subject": {
          "description": "The book record the thread is on.",
          "format": "at-uri",
          "type": "string"
        },
        "subjectOwner": {
          "format": "did",
          "type": "string"
        },
        "subjectTitle": {
          "description": "That book's title, when the index has it.",
          "type": "string"
        },
        "text": {
          "description": "The comment's words, as the index keeps them.",
          "type": "string"
        },
        "uri": {
          "description": "The comment.",
          "format": "at-uri",
          "type": "string"
        }
      },
      "required": [
        "uri"
      ],
      "type": "object"
    },
    "reviewView": {
      "properties": {
        "author": {
          "format": "did",
          "type": "string"
        },
        "book": {
          "ref": "#bookView",
          "type": "ref"
        },
        "createdAt": {
          "format": "datetime",
          "type": "string"
        },
        "excerpt": {
          "maxGraphemes": 300,
          "maxLength": 3000,
          "type": "string"
        },
        "hasSpoilers": {
          "type": "boolean"
        },
        "languages": {
          "items": {
            "format": "language",
            "type": "string"
          },
          "maxLength": 8,
          "type": "array"
        },
        "source": {
          "knownValues": [
            "bookhive",
            "popfeed",
            "resenha"
          ],
          "type": "string"
        },
        "stars": {
          "maximum": 10,
          "minimum": 1,
          "type": "integer"
        },
        "text": {
          "description": "The whole review, when asked for with full.",
          "maxGraphemes": 100000,
          "maxLength": 1000000,
          "type": "string"
        },
        "title": {
          "maxGraphemes": 300,
          "maxLength": 3000,
          "type": "string"
        },
        "uri": {
          "description": "The review: a Standard.site document, a Popfeed review, or a BookHive book record with a review.",
          "format": "at-uri",
          "type": "string"
        }
      },
      "required": [
        "uri",
        "author",
        "book",
        "createdAt",
        "source"
      ],
      "type": "object"
    },
    "starterPackView": {
      "description": "A starter pack the server keeps in the official account.",
      "properties": {
        "description": {
          "type": "string"
        },
        "list": {
          "description": "The reference list the pack is built on.",
          "format": "at-uri",
          "type": "string"
        },
        "members": {
          "items": {
            "format": "did",
            "type": "string"
          },
          "maxLength": 150,
          "type": "array"
        },
        "name": {
          "type": "string"
        },
        "updatedAt": {
          "format": "datetime",
          "type": "string"
        },
        "uri": {
          "format": "at-uri",
          "type": "string"
        }
      },
      "required": [
        "uri",
        "name",
        "members"
      ],
      "type": "object"
    },
    "suggestionView": {
      "description": "A reader worth following, for an empty Parlor.",
      "properties": {
        "activeDays": {
          "description": "Days over the last six months on which they started, finished, changed, progressed in or reviewed a book, on any source.",
          "minimum": 0,
          "type": "integer"
        },
        "books": {
          "minimum": 0,
          "type": "integer"
        },
        "did": {
          "format": "did",
          "type": "string"
        },
        "followsYou": {
          "description": "They follow the caller already.",
          "type": "boolean"
        },
        "knownFollowers": {
          "ref": "#knownFollowers",
          "type": "ref"
        },
        "languages": {
          "description": "The languages they said their reviews are in.",
          "items": {
            "format": "language",
            "type": "string"
          },
          "type": "array"
        },
        "latestReview": {
          "properties": {
            "date": {
              "format": "datetime",
              "type": "string"
            },
            "excerpt": {
              "maxGraphemes": 200,
              "type": "string"
            },
            "title": {
              "type": "string"
            }
          },
          "type": "object"
        },
        "reviews": {
          "minimum": 0,
          "type": "integer"
        },
        "source": {
          "description": "Where they read: Resenha's readers come first, then BookHive's and Popfeed's.",
          "knownValues": [
            "resenha",
            "bookhive",
            "popfeed"
          ],
          "type": "string"
        },
        "tier": {
          "maximum": 2,
          "minimum": 0,
          "type": "integer"
        }
      },
      "required": [
        "did",
        "source"
      ],
      "type": "object"
    },
    "viewerState": {
      "description": "The caller's own reactions to a book record.",
      "properties": {
        "like": {
          "description": "The caller's like, to take it back.",
          "format": "at-uri",
          "type": "string"
        }
      },
      "type": "object"
    }
  },
  "description": "Views shared by the calls Resenha's server answers.",
  "id": "ink.resenha.defs",
  "lexicon": 1
}
```
