ceramicnetwork / ceramicnetwork/CIPs

DocID json-schema definition

Open
#82 14 comments 2 reactions 0 assignees View on GitHub
Discussion
Dominant language
HTML
Stars
84
Forks
25
PR merge metrics
No merged PRs in 30d

Description

```
cip: 82
title: DocID json-schema definition
author: Paul Le Cam (@PaulLeCam)
status: Draft
category: Standards
type: RFC
created: 2021-02-15
edited: 2021-02-22
```

## Simple Summary

Provide a static way to define a string in a JSON schema represents a Ceramic DocID, optionally with static references to the schema(s) that must be used by the referenced document.

## Abstract

This CIP defines a standard way to add a reference to an existing Ceramic document in a JSON schema and references to existing JSON schemas, so it is possible to access this information about Ceramic documents at build time rather than only at runtime on created documents.

## Motivation

It is sometimes necessary to reference Ceramic documents from other documents, such as a list containing the docIDs of individual Ceramic documents.
Currently, we are sometimes using definitions that can be referenced in a schema using `"$ref": "#/definitions/CeramicDocId"` for example, but this has not be defined as a standard.
Using local definitions to a schema also has the downside of providing no guaranty of being unique or having the definition matching any standard.

Furthermore, IDX definitions contain a `schema` property that references an existing schema, guarantying the IDX record associated to the definition matches this schema.
This CIP provides a way to implement similar logic for any schema independently of IDX.

Using this CIP, a `NotesList` schema could explicitly reference a `Note` schema with the following example:

```
{
$schema: 'http://json-schema.org/draft-07/schema#',
title: 'Notes',
type: 'object',
properties: {
notes: {
type: 'array',
title: 'list',
items: {
type: 'object',
title: 'item',
properties: {
note: { $ref: '#/definitions/NoteDocID' },
title: {
type: 'string',
maxLength: 100,
},
},
required: ['note'],
},
},
},
definitions: {
NoteDocID: {
type: 'string',
$id: 'ceramic://doc',
$ceramicSchema: '' ,
maxLength: 150,
},
},
}
```
This way, by loading the `Notes` schema, it is possible by a tool/library to discover the `Note` schema the same way loading a IDX definition allows the discovery of the record's schema.

## Specification

References to Ceramic schema should use a `string` with the [`$id`](https://json-schema.org/draft/2019-09/json-schema-core.html#rfc.section.8.2.2) field of `ceramic://doc`, and optionally with a `$ceramicSchema` property containing either a string or array of strings containing the DocID (implicit reference to latest version) or CommitID (specific version) of the supported schema(s):

```js
{
type: 'string',
$id: 'ceramic://doc',
$ceramicSchema: '' ,
maxLength: 150,
}
```

## Rationale

Using the `$id` field on the object gives a unique namespace (`ceramic://`) and identifier (`doc`) so it creates a convention that can be used in similar CIPs.

Having this static way of identifying if a document references another document allows to simplify the associated logic, rather than relying on checking all string fields for the `ceramic://` prefix, or relying on `"$ref": "#/definitions/CeramicDocId"` matching the expected constraints.

This spec also allows to either define a single schema (using a string) or multiple ones (array of strings).
The use case would be to support different schemas for a single reference, for example a "media" schema could reference an "image" schema, but also the "audio" and "video" ones as acceptable document schemas: `$ceramicSchema: ['', '', '']`.

## Backwards Compatibility

Ideally we should replace the use of the `CeramicDocId` definition in IDX schemas we provide, as well as examples and tutorials.

## Implementation

None yet.

## Security Considerations

None I'm aware of.

## Copyright

Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.