cleanup old api files
This commit is contained in:
parent
c1eb2109ed
commit
fe02668117
@ -1,563 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
withBookmark:
|
|
||||||
parameters:
|
|
||||||
- name: id
|
|
||||||
in: path
|
|
||||||
required: true
|
|
||||||
description: Bookmark ID
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
|
|
||||||
withLabel:
|
|
||||||
parameters:
|
|
||||||
- name: name
|
|
||||||
in: path
|
|
||||||
required: true
|
|
||||||
description: Label
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
withAnnotation:
|
|
||||||
parameters:
|
|
||||||
- name: annotation_id
|
|
||||||
in: path
|
|
||||||
required: true
|
|
||||||
description: Highlight ID
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
|
|
||||||
withCollection:
|
|
||||||
parameters:
|
|
||||||
- name: id
|
|
||||||
in: path
|
|
||||||
required: true
|
|
||||||
description: Collection ID
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
|
|
||||||
# GET /bookmarks
|
|
||||||
list:
|
|
||||||
summary: Bookmark List
|
|
||||||
description: |
|
|
||||||
This route returns a paginated bookmark list.
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
- name: search
|
|
||||||
in: query
|
|
||||||
description: A full text search string
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: title
|
|
||||||
in: query
|
|
||||||
description: Bookmark title
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: author
|
|
||||||
in: query
|
|
||||||
description: Author's name
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: site
|
|
||||||
in: query
|
|
||||||
description: Bookmark site name or domain
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: type
|
|
||||||
in: query
|
|
||||||
description: Bookmark type
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
enum: [article, photo, video]
|
|
||||||
- name: labels
|
|
||||||
in: query
|
|
||||||
description: One or several labels
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: is_loaded
|
|
||||||
in: query
|
|
||||||
description: Filter by loaded state
|
|
||||||
schema:
|
|
||||||
type: boolean
|
|
||||||
- name: has_errors
|
|
||||||
in: query
|
|
||||||
description: Filter bookmarks with or without errors
|
|
||||||
schema:
|
|
||||||
type: boolean
|
|
||||||
- name: has_labels
|
|
||||||
in: query
|
|
||||||
description: Filter bookmarks with or without labels
|
|
||||||
schema:
|
|
||||||
type: boolean
|
|
||||||
- name: is_marked
|
|
||||||
in: query
|
|
||||||
description: Filter by marked (favorite) status
|
|
||||||
schema:
|
|
||||||
type: boolean
|
|
||||||
- name: is_archived
|
|
||||||
in: query
|
|
||||||
description: Filter by archived status
|
|
||||||
schema:
|
|
||||||
type: boolean
|
|
||||||
- name: range_start
|
|
||||||
in: query
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: range_end
|
|
||||||
in: query
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: read_status
|
|
||||||
in: query
|
|
||||||
description: Read progress status
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
enum: [unread, reading, read]
|
|
||||||
- name: updated_since
|
|
||||||
in: query
|
|
||||||
description: Retrieve bookmarks created after this date
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
- name: id
|
|
||||||
in: query
|
|
||||||
description: One or more bookmark ID
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: collection
|
|
||||||
in: query
|
|
||||||
description: A collection ID
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
description: List of bookmark items
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
$ref: "#/components/schemas/bookmarkSummary"
|
|
||||||
|
|
||||||
# POST /bookmarks
|
|
||||||
create:
|
|
||||||
summary: Bookmark Create
|
|
||||||
description: Creates a new bookmark
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/bookmarkCreate"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"202":
|
|
||||||
headers:
|
|
||||||
Bookmark-Id:
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
description: ID of the created bookmark
|
|
||||||
|
|
||||||
# GET /bookmarks/{id}
|
|
||||||
retrieve:
|
|
||||||
summary: Bookmark Details
|
|
||||||
description: Retrieves a saved bookmark
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Bookmark details
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/bookmarkInfo"
|
|
||||||
|
|
||||||
# PATCH /bookmarks/{id}
|
|
||||||
update:
|
|
||||||
summary: Bookmark Update
|
|
||||||
description: |
|
|
||||||
This route updates some bookmark's properties. Every input value is optional.
|
|
||||||
Upon success, it returns a mapping of changed values.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/bookmarkUpdate"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Bookmark updated
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/bookmarkUpdated"
|
|
||||||
|
|
||||||
# DELETE /bookmarks/{id}
|
|
||||||
delete:
|
|
||||||
summary: Bookmark Delete
|
|
||||||
description: Deletes a saved bookmark
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"204":
|
|
||||||
description: The bookmark was successfuly deleted.
|
|
||||||
|
|
||||||
# GET /bookmarks/{id}/article
|
|
||||||
article:
|
|
||||||
summary: Bookmark Article
|
|
||||||
description: |
|
|
||||||
This route returns the bookmark's article if it exists.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: |
|
|
||||||
A `text/html` response, containing the article body.
|
|
||||||
Please note that it's only the fragment and not a full HTML document.
|
|
||||||
content:
|
|
||||||
text/html:
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
# GET /bookmarks/{id}/article.{format}
|
|
||||||
export:
|
|
||||||
summary: Bookmark Export
|
|
||||||
description: This route exports a bookmark to another format.
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
- name: format
|
|
||||||
in: path
|
|
||||||
required: true
|
|
||||||
description: Export format
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
enum: [epub, md]
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
content:
|
|
||||||
application/epub+zip:
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: binary
|
|
||||||
text/markdown:
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
# GET /bookmarks/{id}/share/link
|
|
||||||
shareLink:
|
|
||||||
summary: Share by link
|
|
||||||
description: This route produces a publicly accessible link to share a bookmark.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Public link information
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/bookmarkShareLink"
|
|
||||||
|
|
||||||
# POST /bookmarks/{id}/share/email
|
|
||||||
shareEmail:
|
|
||||||
summary: Share by email
|
|
||||||
description: This route sends a bookmark to an email address.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/bookmarkShareEmail"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Message sent
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/message"
|
|
||||||
|
|
||||||
# GET /bookmarks/labels
|
|
||||||
labels:
|
|
||||||
summary: Label List
|
|
||||||
description: |
|
|
||||||
This route returns all the labels associated to a bookmark for the current user.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Label list
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
$ref: "#/components/schemas/labelInfo"
|
|
||||||
|
|
||||||
# GET /bookmarks/labels/{name}
|
|
||||||
labelInfo:
|
|
||||||
summary: Label Info
|
|
||||||
description:
|
|
||||||
This route returns information about a given bookmark label.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Label information
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
$ref: "#/components/schemas/labelInfo"
|
|
||||||
|
|
||||||
# PATCH /bookmarks/labels/{name}
|
|
||||||
labelUpdate:
|
|
||||||
summary: Label Update
|
|
||||||
description: |
|
|
||||||
This route renames a label.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/labelUpdate"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Label renamed
|
|
||||||
|
|
||||||
# DELETE /bookmarks/labels/{name}
|
|
||||||
labelDelete:
|
|
||||||
summary: Label Delete
|
|
||||||
description: |
|
|
||||||
This route remove a label from all associated bookmarks.
|
|
||||||
|
|
||||||
Please note that it does not remove the bookmarks themselves.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"204":
|
|
||||||
description: Label removed
|
|
||||||
|
|
||||||
# GET /bookmarks/annotations
|
|
||||||
annotationList:
|
|
||||||
summary: Highlight List
|
|
||||||
description: |
|
|
||||||
This route returns all the highlights created by the current user.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Highlight list
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
$ref: "#/components/schemas/annotationSummary"
|
|
||||||
|
|
||||||
# GET /bookmarks/{id}annotations
|
|
||||||
bookmarkAnnotationList:
|
|
||||||
summary: Bookmark Highlights
|
|
||||||
description: |
|
|
||||||
This route returns a given bookmark's highlights.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Highlight list
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
$ref: "#/components/schemas/annotationInfo"
|
|
||||||
|
|
||||||
# POST /bookmarks/{id}annotations
|
|
||||||
bookmarkAnnotationCreate:
|
|
||||||
summary: Highlight Create
|
|
||||||
description: |
|
|
||||||
This route creates a new highlight on a given bookmarks.
|
|
||||||
|
|
||||||
The highlight format is similar to the [Range API](https://developer.mozilla.org/en-US/docs/Web/API/Range)
|
|
||||||
with some differences:
|
|
||||||
|
|
||||||
- A range's start and end selectors are XPath selectors and must target an element.
|
|
||||||
- The offset is the text length from the begining of the selector, regardless of the traversed
|
|
||||||
potential children.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/annotationCreate"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"201":
|
|
||||||
description: Highlight created
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/annotationInfo"
|
|
||||||
|
|
||||||
# PATCH /bookmarks/{id}annotations/{annotation_id}
|
|
||||||
bookmarkAnnotationUpdate:
|
|
||||||
summary: Highlight Update
|
|
||||||
description: |
|
|
||||||
This route updates then given highlight in the given bookmark.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/annotationUpdate"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Update result
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
properties:
|
|
||||||
updated:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
annotations:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
$ref: "#/components/schemas/annotationInfo"
|
|
||||||
|
|
||||||
|
|
||||||
# DELETE /bookmarks/{id}annotations/{annotation_id}
|
|
||||||
bookmarkAnnotationDelete:
|
|
||||||
summary: Highlight Delete
|
|
||||||
description: |
|
|
||||||
This route removes the given highlight in the given bookmark.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"204":
|
|
||||||
description: Highlight removed
|
|
||||||
|
|
||||||
# GET /bookmarks/collections
|
|
||||||
collectionList:
|
|
||||||
summary: Collection List
|
|
||||||
description: |
|
|
||||||
This route returns all the current user's collections.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Collection list
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
$ref: "#/components/schemas/collectionInfo"
|
|
||||||
|
|
||||||
# POST /bookmarks/collections
|
|
||||||
collectionCreate:
|
|
||||||
summary: Collection Create
|
|
||||||
description: |
|
|
||||||
This route creates a new collection.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/collectionCreate"
|
|
||||||
|
|
||||||
# GET /bookmarks/collections/{id}
|
|
||||||
collectionInfo:
|
|
||||||
summary: Collection Details
|
|
||||||
description: |
|
|
||||||
This route returns a given collection information.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Collection information
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/collectionInfo"
|
|
||||||
|
|
||||||
# PATH /bookmarks/collections/{id}
|
|
||||||
collectionUpdate:
|
|
||||||
summary: Collection Update
|
|
||||||
description: |
|
|
||||||
This route updates a given collection. It returns a mapping of updated fields.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/collectionUpdate"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Updated fields
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/collectionSummary"
|
|
||||||
|
|
||||||
# DELETE /bookmarks/collections/{id}
|
|
||||||
collectionDelete:
|
|
||||||
summary: Collection Delete
|
|
||||||
description: |
|
|
||||||
This route deletes a given collection.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"204":
|
|
||||||
description: Collection deleted
|
|
||||||
|
|
||||||
# POST /bookmarks/import/text
|
|
||||||
importMultipartGeneric:
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
text/plain:
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
description: File content
|
|
||||||
multipart/form-data:
|
|
||||||
schema:
|
|
||||||
properties:
|
|
||||||
data:
|
|
||||||
type: string
|
|
||||||
format: binary
|
|
||||||
|
|
||||||
importTextFile:
|
|
||||||
summary: Import a Text File
|
|
||||||
description: |
|
|
||||||
This route creates bookmarks from a text file that contains one URL
|
|
||||||
per line.
|
|
||||||
|
|
||||||
importBrowserBookmarks:
|
|
||||||
summary: Import Browser Bookmarks
|
|
||||||
description: |
|
|
||||||
This route creates bookmarks from an HTML file generated by an export of a browser's
|
|
||||||
bookmarks.
|
|
||||||
|
|
||||||
importPocket:
|
|
||||||
summary: Import Pocket Saves
|
|
||||||
description: |
|
|
||||||
This route creates bookmarks from an HTML file generated by Pocket export tool.
|
|
||||||
Go to [https://getpocket.com/export](https://getpocket.com/export) to generate
|
|
||||||
such a file.
|
|
||||||
|
|
||||||
importWallabag:
|
|
||||||
summary: Import Wallabag Articles
|
|
||||||
description: |
|
|
||||||
This route imports articles from Wallabag using its API.
|
|
||||||
|
|
||||||
You must create an API client in Wallabag and use its "Client ID" and "Client Secret"
|
|
||||||
in this route's payload.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/wallabagImport"
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2024 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
sortable:
|
|
||||||
parameters:
|
|
||||||
- name: sort
|
|
||||||
in: query
|
|
||||||
description: Sorting parameters
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
enum:
|
|
||||||
- created
|
|
||||||
- -created
|
|
||||||
- domain
|
|
||||||
- -domain
|
|
||||||
- duration
|
|
||||||
- -duration
|
|
||||||
- published
|
|
||||||
- -published
|
|
||||||
- site
|
|
||||||
- -site
|
|
||||||
- title
|
|
||||||
- -title
|
|
||||||
@ -1,580 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
schemas:
|
|
||||||
bookmarkSummary:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
description: Bookmark's ID
|
|
||||||
href:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Link to the bookmark info
|
|
||||||
created:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Creation date
|
|
||||||
updated:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Last update
|
|
||||||
state:
|
|
||||||
type: integer
|
|
||||||
enum: [0, 1, 2]
|
|
||||||
description: |
|
|
||||||
Indicates the state of the bookmark.
|
|
||||||
- `0`: loaded
|
|
||||||
- `1`: error
|
|
||||||
- `2`: loading
|
|
||||||
loaded:
|
|
||||||
type: boolean
|
|
||||||
description: Becomes true when the bookmark is ready (regardless of its error state)
|
|
||||||
url:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Bookmark's original URL
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Bookmark's title
|
|
||||||
site_name:
|
|
||||||
type: string
|
|
||||||
description: Bookmark's site name
|
|
||||||
site:
|
|
||||||
type: string
|
|
||||||
format: hostname
|
|
||||||
description: Bookmark's site host name
|
|
||||||
published:
|
|
||||||
type: [string]
|
|
||||||
format: date-time
|
|
||||||
nullable: true
|
|
||||||
description: Publication date. Can be `null` when unknown.
|
|
||||||
authors:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Author list
|
|
||||||
lang:
|
|
||||||
type: string
|
|
||||||
description: Language Code
|
|
||||||
text_direction:
|
|
||||||
type: string
|
|
||||||
enum: [rtl, ltr]
|
|
||||||
description: |
|
|
||||||
Direction of the article's text. It can be empty when it's unknown.
|
|
||||||
document_type:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
The bookmark document type. This is usualy the same value as `type` but it can differ
|
|
||||||
depending on the extraction process.
|
|
||||||
type:
|
|
||||||
type: string
|
|
||||||
enum: [article, photo, video]
|
|
||||||
description: |
|
|
||||||
The bookmark type. Unlike `document_type`, this can only be one of the 3 values.
|
|
||||||
has_article:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
Indicates whether the bookmarks contains an article. Please not that
|
|
||||||
there can be an article on any type.
|
|
||||||
description:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
Bookmark's short description, when it exists. It's always an unformatted text.
|
|
||||||
is_deleted:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` when the bookmark is scheduled for deletion.
|
|
||||||
is_marked:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` when the bookmark is in the favorites.
|
|
||||||
is_archived:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` when the bookmark is in the archives.
|
|
||||||
read_progress:
|
|
||||||
type: integer
|
|
||||||
minimum: 0
|
|
||||||
maximum: 100
|
|
||||||
description: Reading progress percentage.
|
|
||||||
labels:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Bookmark's labels
|
|
||||||
word_count:
|
|
||||||
type: integer
|
|
||||||
minimum: 0
|
|
||||||
description: Number of words in the article, used to compute the reading time.
|
|
||||||
reading_time:
|
|
||||||
type: integer
|
|
||||||
minimum: 0
|
|
||||||
description: |
|
|
||||||
Duration of the article, in minutes. Either the actual duration for a
|
|
||||||
video or a reading time based on the word count.
|
|
||||||
resources:
|
|
||||||
type: object
|
|
||||||
description: |
|
|
||||||
This contains a list of resources associated with the bookmark.
|
|
||||||
The only fields that are always present are `log` and `props`.
|
|
||||||
The `article` field is only present when a bookmark provides a
|
|
||||||
text content. Other image fields depend on what was found during
|
|
||||||
extraction.
|
|
||||||
properties:
|
|
||||||
article:
|
|
||||||
$ref: "#/components/schemas/bookmarkResource"
|
|
||||||
description: Link to the article, when there is one.
|
|
||||||
icon:
|
|
||||||
$ref: "#/components/schemas/bookmarkResourceImage"
|
|
||||||
description: Link and information for the site icon.
|
|
||||||
image:
|
|
||||||
$ref: "#/components/schemas/bookmarkResourceImage"
|
|
||||||
description: Link and information for the article image.
|
|
||||||
thumbnail:
|
|
||||||
$ref: "#/components/schemas/bookmarkResourceImage"
|
|
||||||
description: Link and information for the article thumbnail.
|
|
||||||
log:
|
|
||||||
$ref: "#/components/schemas/bookmarkResource"
|
|
||||||
description: Link to the extraction log.
|
|
||||||
props:
|
|
||||||
$ref: "#/components/schemas/bookmarkResource"
|
|
||||||
description: Link to the bookmark's extra properties.
|
|
||||||
|
|
||||||
bookmarkResource:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
src:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: URL of the resource
|
|
||||||
|
|
||||||
bookmarkResourceImage:
|
|
||||||
allOf:
|
|
||||||
- $ref: "#/components/schemas/bookmarkResource"
|
|
||||||
- type: object
|
|
||||||
properties:
|
|
||||||
height:
|
|
||||||
type: integer
|
|
||||||
description: Image height
|
|
||||||
width:
|
|
||||||
type: integer
|
|
||||||
description: Image width
|
|
||||||
|
|
||||||
bookmarkInfo:
|
|
||||||
allOf:
|
|
||||||
- $ref: "#/components/schemas/bookmarkSummary"
|
|
||||||
- type: object
|
|
||||||
properties:
|
|
||||||
read_anchor:
|
|
||||||
type: string
|
|
||||||
description: CSS selector of the last seen element.
|
|
||||||
links:
|
|
||||||
description: |
|
|
||||||
This contains the list of all the links collected in the
|
|
||||||
retrieved article.
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
properties:
|
|
||||||
url:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Link URI
|
|
||||||
domain:
|
|
||||||
type: string
|
|
||||||
format: hostname
|
|
||||||
description: Link's domain
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Link's title
|
|
||||||
is_page:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` when the destination is a web page
|
|
||||||
content_type:
|
|
||||||
type: string
|
|
||||||
description: MIME type of the destination
|
|
||||||
|
|
||||||
bookmarkCreate:
|
|
||||||
required: [url]
|
|
||||||
properties:
|
|
||||||
url:
|
|
||||||
type: string
|
|
||||||
description: URL to fetch
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Title of the bookmark
|
|
||||||
labels:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: List of labels to set to the bookmark
|
|
||||||
|
|
||||||
bookmarkUpdate:
|
|
||||||
properties:
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: New bookmark's title
|
|
||||||
is_marked:
|
|
||||||
type: boolean
|
|
||||||
description: Favortie state
|
|
||||||
is_archived:
|
|
||||||
type: boolean
|
|
||||||
description: Archive state
|
|
||||||
is_deleted:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
If `true`, schedules the bookmark for deletion, otherwise, cancels any scheduled deletion
|
|
||||||
read_progress:
|
|
||||||
type: integer
|
|
||||||
minimum: 0
|
|
||||||
maximum: 100
|
|
||||||
description: Reading progress percentage
|
|
||||||
read_anchor:
|
|
||||||
type: string
|
|
||||||
description: CSS selector of the last seen element
|
|
||||||
labels:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Replaces the bookmark's labels
|
|
||||||
add_labels:
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Add the given labels to the bookmark
|
|
||||||
remove_labels:
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Remove the given labels from the bookmark
|
|
||||||
|
|
||||||
bookmarkUpdated:
|
|
||||||
required: [href, id, updated]
|
|
||||||
properties:
|
|
||||||
href:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Bookmark URI
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
description: Bookmark's ID
|
|
||||||
updated:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Last update
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Bookmark Title
|
|
||||||
is_marked:
|
|
||||||
type: string
|
|
||||||
description: Favorite status
|
|
||||||
is_archived:
|
|
||||||
type: string
|
|
||||||
description: Archive status
|
|
||||||
is_deleted:
|
|
||||||
type: string
|
|
||||||
description: Scheduled deletion status
|
|
||||||
read_progress:
|
|
||||||
type: integer
|
|
||||||
minimum: 0
|
|
||||||
maximum: 100
|
|
||||||
description: Reading progress percentage
|
|
||||||
read_anchor:
|
|
||||||
type: string
|
|
||||||
description: CSS selector of the last seen element
|
|
||||||
labels:
|
|
||||||
type: string
|
|
||||||
description: New label list
|
|
||||||
|
|
||||||
bookmarkShareLink:
|
|
||||||
properties:
|
|
||||||
url:
|
|
||||||
type: string
|
|
||||||
description: Public URL
|
|
||||||
expires:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Expiration date
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Bookmark title
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
description: Bookmark ID
|
|
||||||
|
|
||||||
bookmarkShareEmail:
|
|
||||||
properties:
|
|
||||||
email:
|
|
||||||
type: string
|
|
||||||
format: email
|
|
||||||
format:
|
|
||||||
type: string
|
|
||||||
enum: ["html", "epub"]
|
|
||||||
example:
|
|
||||||
email: alice@localhost
|
|
||||||
format: html
|
|
||||||
|
|
||||||
labelInfo:
|
|
||||||
properties:
|
|
||||||
name:
|
|
||||||
type: string
|
|
||||||
description: Label's name
|
|
||||||
count:
|
|
||||||
type: integer
|
|
||||||
description: Number of bookmarks with this label
|
|
||||||
href:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Link to the label info
|
|
||||||
href_bookmarks:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Link to the bookmarks with this label
|
|
||||||
|
|
||||||
labelUpdate:
|
|
||||||
properties:
|
|
||||||
name:
|
|
||||||
type: string
|
|
||||||
description: New label
|
|
||||||
|
|
||||||
annotationSummary:
|
|
||||||
properties:
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
description: Highlight ID
|
|
||||||
href:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Link to the highlight
|
|
||||||
text:
|
|
||||||
type: string
|
|
||||||
description: Highlighted text
|
|
||||||
created:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Highlight creation date
|
|
||||||
bookmark_id:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
description: Bookmark ID
|
|
||||||
bookmark_href:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Link to the bookmark information
|
|
||||||
bookmark_url:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Original bookmark's URL
|
|
||||||
bookmark_title:
|
|
||||||
type: string
|
|
||||||
description: Title of the bookmark
|
|
||||||
bookmark_site_name:
|
|
||||||
type: string
|
|
||||||
description: Bookmark's site name
|
|
||||||
|
|
||||||
annotationInfo:
|
|
||||||
properties:
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
description: Highlight ID
|
|
||||||
start_selector:
|
|
||||||
type: string
|
|
||||||
description: Start element's XPath selector
|
|
||||||
start_offset:
|
|
||||||
type: integer
|
|
||||||
description: Start element's text offset
|
|
||||||
end_selector:
|
|
||||||
type: string
|
|
||||||
description: End element's XPath selector
|
|
||||||
end_offset:
|
|
||||||
type: integer
|
|
||||||
description: End element's text offset
|
|
||||||
created:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Highlight creation date
|
|
||||||
text:
|
|
||||||
type: string
|
|
||||||
description: Highlighted text
|
|
||||||
|
|
||||||
annotationCreate:
|
|
||||||
required: [start_selector, start_offset, end_selector, end_offset, color]
|
|
||||||
properties:
|
|
||||||
start_selector:
|
|
||||||
type: string
|
|
||||||
description: Start element's XPath selector
|
|
||||||
start_offset:
|
|
||||||
type: integer
|
|
||||||
description: Start element's text offset
|
|
||||||
end_selector:
|
|
||||||
type: string
|
|
||||||
description: End element's XPath selector
|
|
||||||
end_offset:
|
|
||||||
type: integer
|
|
||||||
description: End element's text offset
|
|
||||||
color:
|
|
||||||
type: color
|
|
||||||
description: Annotation color
|
|
||||||
|
|
||||||
annotationUpdate:
|
|
||||||
required: [color]
|
|
||||||
properties:
|
|
||||||
color:
|
|
||||||
type: color
|
|
||||||
description: Annotation color
|
|
||||||
|
|
||||||
collectionSummary:
|
|
||||||
properties:
|
|
||||||
updated:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Last update date
|
|
||||||
name:
|
|
||||||
type: string
|
|
||||||
description: Collection's name
|
|
||||||
is_pinned:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` when the collection is pinned
|
|
||||||
is_deleted:
|
|
||||||
type: boolean
|
|
||||||
description: Collection is scheduled for deletion
|
|
||||||
search:
|
|
||||||
type: string
|
|
||||||
description: Search string
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Title filter
|
|
||||||
author:
|
|
||||||
type: string
|
|
||||||
description: Author filter
|
|
||||||
site:
|
|
||||||
type: string
|
|
||||||
description: Site (name, host or domain) filter
|
|
||||||
type:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
enum: [article, photo, video]
|
|
||||||
description: Type filter
|
|
||||||
labels:
|
|
||||||
type: string
|
|
||||||
description: Label filter
|
|
||||||
read_status:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
enum: [unread, reading, read]
|
|
||||||
description: Read progress status
|
|
||||||
is_marked:
|
|
||||||
type: boolean
|
|
||||||
description: Favorite filter
|
|
||||||
is_archived:
|
|
||||||
type: boolean
|
|
||||||
description: Archive filter
|
|
||||||
range_start:
|
|
||||||
type: string
|
|
||||||
description: From date filter
|
|
||||||
range_end:
|
|
||||||
type: string
|
|
||||||
description: To date filter
|
|
||||||
|
|
||||||
collectionInfo:
|
|
||||||
allOf:
|
|
||||||
- type: object
|
|
||||||
properties:
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
description: Collection ID
|
|
||||||
href:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Collection URL
|
|
||||||
created:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Creation date
|
|
||||||
- $ref: "#/components/schemas/collectionSummary"
|
|
||||||
|
|
||||||
|
|
||||||
collectionCreate:
|
|
||||||
properties:
|
|
||||||
name:
|
|
||||||
type: string
|
|
||||||
description: Collection's name
|
|
||||||
is_pinned:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` when the collection is pinned
|
|
||||||
is_deleted:
|
|
||||||
type: boolean
|
|
||||||
description: Collection is scheduled for deletion
|
|
||||||
search:
|
|
||||||
type: string
|
|
||||||
description: Search string
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Title filter
|
|
||||||
author:
|
|
||||||
type: string
|
|
||||||
description: Author filter
|
|
||||||
site:
|
|
||||||
type: string
|
|
||||||
description: Site (name, host or domain) filter
|
|
||||||
type:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
enum: [article, photo, video]
|
|
||||||
description: Type filter
|
|
||||||
labels:
|
|
||||||
type: string
|
|
||||||
description: Label filter
|
|
||||||
read_status:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
enum: [unread, reading, read]
|
|
||||||
description: Read progress status
|
|
||||||
is_marked:
|
|
||||||
type: boolean
|
|
||||||
description: Favorite filter
|
|
||||||
is_archived:
|
|
||||||
type: boolean
|
|
||||||
description: Archive filter
|
|
||||||
range_start:
|
|
||||||
type: string
|
|
||||||
description: From date filter
|
|
||||||
range_end:
|
|
||||||
type: string
|
|
||||||
description: To date filter
|
|
||||||
|
|
||||||
collectionUpdate:
|
|
||||||
allOf:
|
|
||||||
- $ref: "#/components/schemas/collectionCreate"
|
|
||||||
|
|
||||||
wallabagImport:
|
|
||||||
properties:
|
|
||||||
url:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Your Wallabag instance's URL
|
|
||||||
username:
|
|
||||||
type: string
|
|
||||||
description: Your Wallabag username
|
|
||||||
password:
|
|
||||||
type: string
|
|
||||||
description: Your Wallabag password
|
|
||||||
client_id:
|
|
||||||
type: string
|
|
||||||
description: API Client ID
|
|
||||||
client_secret:
|
|
||||||
type: string
|
|
||||||
description: API Client Secret
|
|
||||||
@ -1,145 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
# GET /cookbook/extrack
|
|
||||||
extract:
|
|
||||||
summary: Extract Link
|
|
||||||
description: |
|
|
||||||
**NOTE: Only available for user in the admin group.**
|
|
||||||
|
|
||||||
This route extracts a link and returns the extraction result.
|
|
||||||
|
|
||||||
You can pass an `Accept` header to the request, with one of the following values:
|
|
||||||
|
|
||||||
- `application/json` (default) returns a JSON response
|
|
||||||
- `text/html` returns an HTML response with all the media included as base64 encoded
|
|
||||||
URLs.
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
- name: url
|
|
||||||
in: query
|
|
||||||
required: true
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: URL to extract
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: |
|
|
||||||
Extraction result.
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
properties:
|
|
||||||
url:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: The extracted URL
|
|
||||||
logs:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Extraction log
|
|
||||||
errors:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Extraction errors, if any
|
|
||||||
meta:
|
|
||||||
type: object
|
|
||||||
additionalProperties:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
Contains the meta tags extracted from the page.
|
|
||||||
properties:
|
|
||||||
properties:
|
|
||||||
json-ld:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: object
|
|
||||||
description: A list of JSON-LD documents retrieved during the extraction
|
|
||||||
link:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: object
|
|
||||||
patternProperties:
|
|
||||||
"^@.+":
|
|
||||||
type: string
|
|
||||||
description: Link attribute, always starting with `@`
|
|
||||||
description: A list of all `link` tags retrieved during the extraction
|
|
||||||
meta:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: object
|
|
||||||
patternProperties:
|
|
||||||
"^@.+":
|
|
||||||
type: string
|
|
||||||
description: Meta attribute, always starting with `@`
|
|
||||||
description: A list of all `meta` tags retrieved during the extraction
|
|
||||||
domain:
|
|
||||||
type: string
|
|
||||||
format: hostname
|
|
||||||
description: Page's domain name
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Page's title
|
|
||||||
authors:
|
|
||||||
type: "[string]"
|
|
||||||
description: Page's author list
|
|
||||||
site:
|
|
||||||
type: string
|
|
||||||
format: hostname
|
|
||||||
description: Page's site
|
|
||||||
site_name:
|
|
||||||
type: string
|
|
||||||
description: Page's site name
|
|
||||||
lang:
|
|
||||||
type: string
|
|
||||||
description: Language Code
|
|
||||||
text_direction:
|
|
||||||
type: string
|
|
||||||
enum: [rtl, ltr]
|
|
||||||
description: |
|
|
||||||
Direction of the article's text. It can be empty when it's unknown.
|
|
||||||
date:
|
|
||||||
type: [string]
|
|
||||||
format: date-time
|
|
||||||
nullable: true
|
|
||||||
description: Publication date. Can be `null` when unknown.
|
|
||||||
document_type:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
The detected document type. The value is usualy `article`, `photo` or `video`
|
|
||||||
but can vary, based on the extraction process.
|
|
||||||
description:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
Page's short description, when it exists. It's always an unformatted text.
|
|
||||||
html:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
The HTML content after processing.
|
|
||||||
embed:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
The oembed HTML fragment, when it exists. It usualy contains an iframe when
|
|
||||||
extracting videos.
|
|
||||||
images:
|
|
||||||
properties:
|
|
||||||
additionalProperties:
|
|
||||||
properties:
|
|
||||||
size:
|
|
||||||
type: "[integer]"
|
|
||||||
description: The image size in pixels
|
|
||||||
encoded:
|
|
||||||
type: string
|
|
||||||
description: The base64 URI encoded image
|
|
||||||
|
|
||||||
text/html:
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
@ -1,339 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
openapi: 3.0.0
|
|
||||||
info:
|
|
||||||
version: 1.0.0
|
|
||||||
title: Readeck API
|
|
||||||
description: |
|
|
||||||
# Introduction
|
|
||||||
|
|
||||||
The Readeck API provides REST endpoints that can be used for any purpose, should it be a
|
|
||||||
mobile application, a script, you name it.
|
|
||||||
|
|
||||||
## API Endpoint
|
|
||||||
|
|
||||||
You can access this API on `__BASE_URI__`.
|
|
||||||
|
|
||||||
Most of your requests and responses are using JSON as the exchange format.
|
|
||||||
|
|
||||||
## Authentication
|
|
||||||
|
|
||||||
To use the API, you first need to [create an authentication token](../profile/tokens). You can
|
|
||||||
then use your new token using the `Bearer` HTTP authorization scheme.
|
|
||||||
|
|
||||||
For example, you first request will look like:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
curl -H "Authorization: Bearer <TOKEN>" __BASE_URI__/bookmarks
|
|
||||||
```
|
|
||||||
|
|
||||||
Or, in NodeJS:
|
|
||||||
|
|
||||||
```js
|
|
||||||
fetch("__BASE_URI__/bookmarks", {
|
|
||||||
headers: {
|
|
||||||
"Authorization": "Bearer <TOKEN>",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
## First time authentication
|
|
||||||
|
|
||||||
While you can create an authentication token from Readeck, you can also get one directly from
|
|
||||||
the API. This provides a mechanism to ask for user credentials and obtain a token for your app
|
|
||||||
only.
|
|
||||||
|
|
||||||
Please refer to [POST /auth](#post-/auth) for more information.
|
|
||||||
|
|
||||||
## Test the API
|
|
||||||
|
|
||||||
On this documentation, you can test every route.
|
|
||||||
|
|
||||||
If you don't provide an API token in [Authentication](#auth), you can still test all the routes
|
|
||||||
but note that the given curl examples only work with an API token.
|
|
||||||
|
|
||||||
|
|
||||||
servers:
|
|
||||||
- url: __BASE_URI__
|
|
||||||
|
|
||||||
components:
|
|
||||||
securitySchemes:
|
|
||||||
bearer:
|
|
||||||
type: http
|
|
||||||
scheme: Bearer
|
|
||||||
|
|
||||||
schemas:
|
|
||||||
$merge:
|
|
||||||
- "types.yaml#.schemas"
|
|
||||||
- "bookmarks/types.yaml#.schemas"
|
|
||||||
- "profile/types.yaml#.schemas"
|
|
||||||
|
|
||||||
security:
|
|
||||||
- bearer: []
|
|
||||||
|
|
||||||
tags:
|
|
||||||
- name: user profile
|
|
||||||
- name: bookmarks
|
|
||||||
- name: bookmark export
|
|
||||||
- name: bookmark sharing
|
|
||||||
- name: bookmark labels
|
|
||||||
- name: bookmark highlights
|
|
||||||
- name: bookmark collections
|
|
||||||
- name: bookmarks import
|
|
||||||
- name: dev tools
|
|
||||||
|
|
||||||
paths:
|
|
||||||
/auth:
|
|
||||||
post:
|
|
||||||
tags: [user profile]
|
|
||||||
$merge:
|
|
||||||
- "profile/routes.yaml#.auth"
|
|
||||||
|
|
||||||
/profile:
|
|
||||||
get:
|
|
||||||
tags: [user profile]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "profile/routes.yaml#.profile"
|
|
||||||
|
|
||||||
/bookmarks:
|
|
||||||
get:
|
|
||||||
tags: [bookmarks]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.paginated"
|
|
||||||
- "bookmarks/traits.yaml#.sortable"
|
|
||||||
- "bookmarks/routes.yaml#.list"
|
|
||||||
|
|
||||||
post:
|
|
||||||
tags: [bookmarks]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.deferred"
|
|
||||||
- "bookmarks/routes.yaml#.create"
|
|
||||||
|
|
||||||
/bookmarks/{id}:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmarks]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.retrieve"
|
|
||||||
|
|
||||||
patch:
|
|
||||||
tags: [bookmarks]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "bookmarks/routes.yaml#.update"
|
|
||||||
|
|
||||||
delete:
|
|
||||||
tags: [bookmarks]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.delete"
|
|
||||||
|
|
||||||
/bookmarks/{id}/article:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark export]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.article"
|
|
||||||
|
|
||||||
/bookmarks/{id}/article.{format}:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark export]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.export"
|
|
||||||
|
|
||||||
/bookmarks/{id}/share/link:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark sharing]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.shareLink"
|
|
||||||
|
|
||||||
/bookmarks/{id}/share/email:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
post:
|
|
||||||
tags: [bookmark sharing]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.shareEmail"
|
|
||||||
|
|
||||||
/bookmarks/labels:
|
|
||||||
get:
|
|
||||||
tags: [bookmark labels]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.labels"
|
|
||||||
|
|
||||||
/bookmarks/labels/{name}:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withLabel"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark labels]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.labelInfo"
|
|
||||||
|
|
||||||
patch:
|
|
||||||
tags: [bookmark labels]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "bookmarks/routes.yaml#.labelUpdate"
|
|
||||||
|
|
||||||
delete:
|
|
||||||
tags: [bookmark labels]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.labelDelete"
|
|
||||||
|
|
||||||
/bookmarks/annotations:
|
|
||||||
get:
|
|
||||||
tags: [bookmark highlights]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.paginated"
|
|
||||||
- "bookmarks/routes.yaml#.annotationList"
|
|
||||||
|
|
||||||
/bookmarks/{id}/annotations:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark highlights]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.bookmarkAnnotationList"
|
|
||||||
|
|
||||||
post:
|
|
||||||
tags: [bookmark highlights]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.created"
|
|
||||||
- "bookmarks/routes.yaml#.bookmarkAnnotationCreate"
|
|
||||||
|
|
||||||
/bookmarks/{id}/annotations/{annotation_id}:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
patch:
|
|
||||||
tags: [bookmark highlights]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "bookmarks/routes.yaml#.withAnnotation"
|
|
||||||
- "bookmarks/routes.yaml#.bookmarkAnnotationUpdate"
|
|
||||||
|
|
||||||
delete:
|
|
||||||
tags: [bookmark highlights]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.withAnnotation"
|
|
||||||
- "bookmarks/routes.yaml#.bookmarkAnnotationDelete"
|
|
||||||
|
|
||||||
/bookmarks/collections:
|
|
||||||
get:
|
|
||||||
tags: [bookmark collections]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.paginated"
|
|
||||||
- "bookmarks/routes.yaml#.collectionList"
|
|
||||||
|
|
||||||
post:
|
|
||||||
tags: [bookmark collections]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.created"
|
|
||||||
- "bookmarks/routes.yaml#.collectionCreate"
|
|
||||||
|
|
||||||
/bookmarks/collections/{id}:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withCollection"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark collections]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.collectionInfo"
|
|
||||||
|
|
||||||
patch:
|
|
||||||
tags: [bookmark collections]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.collectionUpdate"
|
|
||||||
|
|
||||||
delete:
|
|
||||||
tags: [bookmark collections]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.collectionDelete"
|
|
||||||
|
|
||||||
/bookmarks/import/text:
|
|
||||||
post:
|
|
||||||
tags: [bookmarks import]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.deferred"
|
|
||||||
- "bookmarks/routes.yaml#.importMultipartGeneric"
|
|
||||||
- "bookmarks/routes.yaml#.importTextFile"
|
|
||||||
|
|
||||||
/bookmarks/import/browser:
|
|
||||||
post:
|
|
||||||
tags: [bookmarks import]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.deferred"
|
|
||||||
- "bookmarks/routes.yaml#.importMultipartGeneric"
|
|
||||||
- "bookmarks/routes.yaml#.importBrowserBookmarks"
|
|
||||||
|
|
||||||
/bookmarks/import/pocket-file:
|
|
||||||
post:
|
|
||||||
tags: [bookmarks import]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.deferred"
|
|
||||||
- "bookmarks/routes.yaml#.importMultipartGeneric"
|
|
||||||
- "bookmarks/routes.yaml#.importPocket"
|
|
||||||
|
|
||||||
/bookmarks/import/wallabag:
|
|
||||||
post:
|
|
||||||
tags: [bookmarks import]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.deferred"
|
|
||||||
- "bookmarks/routes.yaml#.importWallabag"
|
|
||||||
|
|
||||||
|
|
||||||
/cookbook/extract:
|
|
||||||
get:
|
|
||||||
tags: [dev tools]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "cookbook/routes.yaml#.extract"
|
|
||||||
@ -1,55 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
auth:
|
|
||||||
summary: Authenticate
|
|
||||||
description: |
|
|
||||||
This route performs the authentication with a username and a password and returns a token
|
|
||||||
that you can use for all API requests.
|
|
||||||
|
|
||||||
You don't need to perform a request to this route each time you're using the API, only do it
|
|
||||||
once and keep the token somehow. You can use this route to provide a first time authentication
|
|
||||||
in a mobile application or any API client you may build and only store the resulting token.
|
|
||||||
|
|
||||||
You MUST provide an application name.
|
|
||||||
|
|
||||||
Alternatively, you can [create an authentication token](../profile/tokens) directly from
|
|
||||||
Readeck.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/authenticationForm"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"201":
|
|
||||||
description: Authentication success
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/authenticationResult"
|
|
||||||
|
|
||||||
"403":
|
|
||||||
description: Authentication failed
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/message"
|
|
||||||
|
|
||||||
# GET /profile
|
|
||||||
profile:
|
|
||||||
summary: User Profile
|
|
||||||
description: |
|
|
||||||
This route returns the current user's profile information. This includes the user information
|
|
||||||
and preferences, and the authentication provider with its permissions.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Profile information
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/userProfile"
|
|
||||||
@ -1,143 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
schemas:
|
|
||||||
authenticationForm:
|
|
||||||
type: object
|
|
||||||
required: [username, password, application]
|
|
||||||
properties:
|
|
||||||
username:
|
|
||||||
type: string
|
|
||||||
description: Username
|
|
||||||
password:
|
|
||||||
type: string
|
|
||||||
description: Password
|
|
||||||
application:
|
|
||||||
type: string
|
|
||||||
description: Application name. This can be anything.
|
|
||||||
roles:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: A list of roles to restrict the new token access.
|
|
||||||
example:
|
|
||||||
username: alice
|
|
||||||
password: "1234"
|
|
||||||
application: api doc
|
|
||||||
|
|
||||||
authenticationResult:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
description: Token ID
|
|
||||||
token:
|
|
||||||
type: string
|
|
||||||
description: Authentication token. This is the value you must store in your application.
|
|
||||||
example:
|
|
||||||
{
|
|
||||||
"id": "RFutYEAVM95DUDLUDnhbQm",
|
|
||||||
"token": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJqdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
||||||
}
|
|
||||||
|
|
||||||
userProfile:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
provider:
|
|
||||||
description: Authentication provider information
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
description: Authentication provider ID (ie. the token ID)
|
|
||||||
name:
|
|
||||||
type: string
|
|
||||||
description: Provider name
|
|
||||||
application:
|
|
||||||
type: string
|
|
||||||
description: The registered application name
|
|
||||||
roles:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Roles granted for this session
|
|
||||||
permissions:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Permissions granted for this session
|
|
||||||
user:
|
|
||||||
description: User information
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
username:
|
|
||||||
type: string
|
|
||||||
description: Username
|
|
||||||
email:
|
|
||||||
type: string
|
|
||||||
format: email
|
|
||||||
description: User email
|
|
||||||
created:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Creation date
|
|
||||||
updated:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Last update date
|
|
||||||
settings:
|
|
||||||
description: User settings
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
debug_info:
|
|
||||||
type: boolean
|
|
||||||
description: Enable debug information
|
|
||||||
reader_settings:
|
|
||||||
description: Reader settings
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
font:
|
|
||||||
type: string
|
|
||||||
font_size:
|
|
||||||
type: integer
|
|
||||||
line_height:
|
|
||||||
type: integer
|
|
||||||
example:
|
|
||||||
{
|
|
||||||
"provider": {
|
|
||||||
"name": "bearer token",
|
|
||||||
"id": "X4bmnMRcnDhQtu5y33qzTp",
|
|
||||||
"application": "internal",
|
|
||||||
"roles": [
|
|
||||||
"scoped_bookmarks_r",
|
|
||||||
"scoped_bookmarks_w"
|
|
||||||
],
|
|
||||||
"permissions": [
|
|
||||||
"api:bookmarks:collections:read",
|
|
||||||
"api:bookmarks:collections:write",
|
|
||||||
"api:bookmarks:export",
|
|
||||||
"api:bookmarks:read",
|
|
||||||
"api:bookmarks:write",
|
|
||||||
"api:opds:read",
|
|
||||||
"api:profile:read",
|
|
||||||
"api:profile:tokens:delete"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"user": {
|
|
||||||
"username": "alice",
|
|
||||||
"email": "alice@localhost",
|
|
||||||
"created": "2023-08-27T13:32:11.704606963Z",
|
|
||||||
"updated": "2023-12-17T09:08:31.909723372Z",
|
|
||||||
"settings": {
|
|
||||||
"debug_info": false,
|
|
||||||
"reader_settings": {
|
|
||||||
"font": "serif",
|
|
||||||
"font_size": 3,
|
|
||||||
"line_height": 3
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,125 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
authenticated:
|
|
||||||
responses:
|
|
||||||
"401":
|
|
||||||
description: |
|
|
||||||
Unauthorized. The request token found in the Authorization header is not valid.
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/message"
|
|
||||||
"403":
|
|
||||||
description: |
|
|
||||||
Forbidden. The user doesn't have permission to fetch users for the specified,
|
|
||||||
but has other account permissions
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/message"
|
|
||||||
|
|
||||||
paginated:
|
|
||||||
parameters:
|
|
||||||
- name: limit
|
|
||||||
in: query
|
|
||||||
description: Number of items per page
|
|
||||||
schema:
|
|
||||||
type: integer
|
|
||||||
- name: offset
|
|
||||||
in: query
|
|
||||||
description: Pagination offset
|
|
||||||
schema:
|
|
||||||
type: integer
|
|
||||||
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
headers:
|
|
||||||
Link:
|
|
||||||
description: Link to other pages in paginated results
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
Current-Page:
|
|
||||||
description: Current page number
|
|
||||||
schema:
|
|
||||||
type: integer
|
|
||||||
Total-Count:
|
|
||||||
description: Total number of items
|
|
||||||
schema:
|
|
||||||
type: integer
|
|
||||||
Total-Pages:
|
|
||||||
description: Total number of pages
|
|
||||||
schema:
|
|
||||||
type: integer
|
|
||||||
|
|
||||||
created:
|
|
||||||
responses:
|
|
||||||
"201":
|
|
||||||
headers:
|
|
||||||
Location:
|
|
||||||
description: URL of the created resource
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/message"
|
|
||||||
|
|
||||||
deferred:
|
|
||||||
responses:
|
|
||||||
"202":
|
|
||||||
headers:
|
|
||||||
Location:
|
|
||||||
description: URL of the created resource
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/message"
|
|
||||||
|
|
||||||
validator:
|
|
||||||
responses:
|
|
||||||
"422":
|
|
||||||
description: |
|
|
||||||
This HTTP response is sent when the input data is not valid. It contains an object
|
|
||||||
with all the detected errors.
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
properties:
|
|
||||||
is_valid:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` if the input is valid
|
|
||||||
errors:
|
|
||||||
type: "[string]"
|
|
||||||
nullable: true
|
|
||||||
description: List of global input errors
|
|
||||||
fields:
|
|
||||||
type: object
|
|
||||||
description: |
|
|
||||||
All the fields, with and without errors
|
|
||||||
additionalProperties:
|
|
||||||
properties:
|
|
||||||
is_null:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` if the input value is null
|
|
||||||
is_bound:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` when the value is bound to the form
|
|
||||||
value:
|
|
||||||
type: any
|
|
||||||
description: Item's value; can be any type
|
|
||||||
errors:
|
|
||||||
type: "[string]"
|
|
||||||
nullable: true
|
|
||||||
description: List of errors for this field
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
schemas:
|
|
||||||
message:
|
|
||||||
properties:
|
|
||||||
status:
|
|
||||||
type: integer
|
|
||||||
description: HTTP Status Code
|
|
||||||
message:
|
|
||||||
type: string
|
|
||||||
description: Information or error message
|
|
||||||
339
readeck-api.yaml
339
readeck-api.yaml
@ -1,339 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
openapi: 3.0.0
|
|
||||||
info:
|
|
||||||
version: 1.0.0
|
|
||||||
title: Readeck API
|
|
||||||
description: |
|
|
||||||
# Introduction
|
|
||||||
|
|
||||||
The Readeck API provides REST endpoints that can be used for any purpose, should it be a
|
|
||||||
mobile application, a script, you name it.
|
|
||||||
|
|
||||||
## API Endpoint
|
|
||||||
|
|
||||||
You can access this API on `__BASE_URI__`.
|
|
||||||
|
|
||||||
Most of your requests and responses are using JSON as the exchange format.
|
|
||||||
|
|
||||||
## Authentication
|
|
||||||
|
|
||||||
To use the API, you first need to [create an authentication token](../profile/tokens). You can
|
|
||||||
then use your new token using the `Bearer` HTTP authorization scheme.
|
|
||||||
|
|
||||||
For example, you first request will look like:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
curl -H "Authorization: Bearer <TOKEN>" __BASE_URI__/bookmarks
|
|
||||||
```
|
|
||||||
|
|
||||||
Or, in NodeJS:
|
|
||||||
|
|
||||||
```js
|
|
||||||
fetch("__BASE_URI__/bookmarks", {
|
|
||||||
headers: {
|
|
||||||
"Authorization": "Bearer <TOKEN>",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
## First time authentication
|
|
||||||
|
|
||||||
While you can create an authentication token from Readeck, you can also get one directly from
|
|
||||||
the API. This provides a mechanism to ask for user credentials and obtain a token for your app
|
|
||||||
only.
|
|
||||||
|
|
||||||
Please refer to [POST /auth](#post-/auth) for more information.
|
|
||||||
|
|
||||||
## Test the API
|
|
||||||
|
|
||||||
On this documentation, you can test every route.
|
|
||||||
|
|
||||||
If you don't provide an API token in [Authentication](#auth), you can still test all the routes
|
|
||||||
but note that the given curl examples only work with an API token.
|
|
||||||
|
|
||||||
|
|
||||||
servers:
|
|
||||||
- url: __BASE_URI__
|
|
||||||
|
|
||||||
components:
|
|
||||||
securitySchemes:
|
|
||||||
bearer:
|
|
||||||
type: http
|
|
||||||
scheme: Bearer
|
|
||||||
|
|
||||||
schemas:
|
|
||||||
$merge:
|
|
||||||
- "types.yaml#.schemas"
|
|
||||||
- "bookmarks/types.yaml#.schemas"
|
|
||||||
- "profile/types.yaml#.schemas"
|
|
||||||
|
|
||||||
security:
|
|
||||||
- bearer: []
|
|
||||||
|
|
||||||
tags:
|
|
||||||
- name: user profile
|
|
||||||
- name: bookmarks
|
|
||||||
- name: bookmark export
|
|
||||||
- name: bookmark sharing
|
|
||||||
- name: bookmark labels
|
|
||||||
- name: bookmark highlights
|
|
||||||
- name: bookmark collections
|
|
||||||
- name: bookmarks import
|
|
||||||
- name: dev tools
|
|
||||||
|
|
||||||
paths:
|
|
||||||
/auth:
|
|
||||||
post:
|
|
||||||
tags: [user profile]
|
|
||||||
$merge:
|
|
||||||
- "profile/routes.yaml#.auth"
|
|
||||||
|
|
||||||
/profile:
|
|
||||||
get:
|
|
||||||
tags: [user profile]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "profile/routes.yaml#.profile"
|
|
||||||
|
|
||||||
/bookmarks:
|
|
||||||
get:
|
|
||||||
tags: [bookmarks]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.paginated"
|
|
||||||
- "bookmarks/traits.yaml#.sortable"
|
|
||||||
- "bookmarks/routes.yaml#.list"
|
|
||||||
|
|
||||||
post:
|
|
||||||
tags: [bookmarks]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.deferred"
|
|
||||||
- "bookmarks/routes.yaml#.create"
|
|
||||||
|
|
||||||
/bookmarks/{id}:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmarks]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.retrieve"
|
|
||||||
|
|
||||||
patch:
|
|
||||||
tags: [bookmarks]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "bookmarks/routes.yaml#.update"
|
|
||||||
|
|
||||||
delete:
|
|
||||||
tags: [bookmarks]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.delete"
|
|
||||||
|
|
||||||
/bookmarks/{id}/article:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark export]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.article"
|
|
||||||
|
|
||||||
/bookmarks/{id}/article.{format}:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark export]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.export"
|
|
||||||
|
|
||||||
/bookmarks/{id}/share/link:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark sharing]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.shareLink"
|
|
||||||
|
|
||||||
/bookmarks/{id}/share/email:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
post:
|
|
||||||
tags: [bookmark sharing]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.shareEmail"
|
|
||||||
|
|
||||||
/bookmarks/labels:
|
|
||||||
get:
|
|
||||||
tags: [bookmark labels]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.labels"
|
|
||||||
|
|
||||||
/bookmarks/labels/{name}:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withLabel"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark labels]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.labelInfo"
|
|
||||||
|
|
||||||
patch:
|
|
||||||
tags: [bookmark labels]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "bookmarks/routes.yaml#.labelUpdate"
|
|
||||||
|
|
||||||
delete:
|
|
||||||
tags: [bookmark labels]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.labelDelete"
|
|
||||||
|
|
||||||
/bookmarks/annotations:
|
|
||||||
get:
|
|
||||||
tags: [bookmark highlights]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.paginated"
|
|
||||||
- "bookmarks/routes.yaml#.annotationList"
|
|
||||||
|
|
||||||
/bookmarks/{id}/annotations:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark highlights]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.bookmarkAnnotationList"
|
|
||||||
|
|
||||||
post:
|
|
||||||
tags: [bookmark highlights]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.created"
|
|
||||||
- "bookmarks/routes.yaml#.bookmarkAnnotationCreate"
|
|
||||||
|
|
||||||
/bookmarks/{id}/annotations/{annotation_id}:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
patch:
|
|
||||||
tags: [bookmark highlights]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "bookmarks/routes.yaml#.withAnnotation"
|
|
||||||
- "bookmarks/routes.yaml#.bookmarkAnnotationUpdate"
|
|
||||||
|
|
||||||
delete:
|
|
||||||
tags: [bookmark highlights]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.withAnnotation"
|
|
||||||
- "bookmarks/routes.yaml#.bookmarkAnnotationDelete"
|
|
||||||
|
|
||||||
/bookmarks/collections:
|
|
||||||
get:
|
|
||||||
tags: [bookmark collections]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.paginated"
|
|
||||||
- "bookmarks/routes.yaml#.collectionList"
|
|
||||||
|
|
||||||
post:
|
|
||||||
tags: [bookmark collections]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.created"
|
|
||||||
- "bookmarks/routes.yaml#.collectionCreate"
|
|
||||||
|
|
||||||
/bookmarks/collections/{id}:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withCollection"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark collections]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.collectionInfo"
|
|
||||||
|
|
||||||
patch:
|
|
||||||
tags: [bookmark collections]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.collectionUpdate"
|
|
||||||
|
|
||||||
delete:
|
|
||||||
tags: [bookmark collections]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.collectionDelete"
|
|
||||||
|
|
||||||
/bookmarks/import/text:
|
|
||||||
post:
|
|
||||||
tags: [bookmarks import]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.deferred"
|
|
||||||
- "bookmarks/routes.yaml#.importMultipartGeneric"
|
|
||||||
- "bookmarks/routes.yaml#.importTextFile"
|
|
||||||
|
|
||||||
/bookmarks/import/browser:
|
|
||||||
post:
|
|
||||||
tags: [bookmarks import]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.deferred"
|
|
||||||
- "bookmarks/routes.yaml#.importMultipartGeneric"
|
|
||||||
- "bookmarks/routes.yaml#.importBrowserBookmarks"
|
|
||||||
|
|
||||||
/bookmarks/import/pocket-file:
|
|
||||||
post:
|
|
||||||
tags: [bookmarks import]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.deferred"
|
|
||||||
- "bookmarks/routes.yaml#.importMultipartGeneric"
|
|
||||||
- "bookmarks/routes.yaml#.importPocket"
|
|
||||||
|
|
||||||
/bookmarks/import/wallabag:
|
|
||||||
post:
|
|
||||||
tags: [bookmarks import]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.deferred"
|
|
||||||
- "bookmarks/routes.yaml#.importWallabag"
|
|
||||||
|
|
||||||
|
|
||||||
/cookbook/extract:
|
|
||||||
get:
|
|
||||||
tags: [dev tools]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "cookbook/routes.yaml#.extract"
|
|
||||||
@ -1,339 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
openapi: 3.0.0
|
|
||||||
info:
|
|
||||||
version: 1.0.0
|
|
||||||
title: Readeck API
|
|
||||||
description: |
|
|
||||||
# Introduction
|
|
||||||
|
|
||||||
The Readeck API provides REST endpoints that can be used for any purpose, should it be a
|
|
||||||
mobile application, a script, you name it.
|
|
||||||
|
|
||||||
## API Endpoint
|
|
||||||
|
|
||||||
You can access this API on `__BASE_URI__`.
|
|
||||||
|
|
||||||
Most of your requests and responses are using JSON as the exchange format.
|
|
||||||
|
|
||||||
## Authentication
|
|
||||||
|
|
||||||
To use the API, you first need to [create an authentication token](../profile/tokens). You can
|
|
||||||
then use your new token using the `Bearer` HTTP authorization scheme.
|
|
||||||
|
|
||||||
For example, you first request will look like:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
curl -H "Authorization: Bearer <TOKEN>" __BASE_URI__/bookmarks
|
|
||||||
```
|
|
||||||
|
|
||||||
Or, in NodeJS:
|
|
||||||
|
|
||||||
```js
|
|
||||||
fetch("__BASE_URI__/bookmarks", {
|
|
||||||
headers: {
|
|
||||||
"Authorization": "Bearer <TOKEN>",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
## First time authentication
|
|
||||||
|
|
||||||
While you can create an authentication token from Readeck, you can also get one directly from
|
|
||||||
the API. This provides a mechanism to ask for user credentials and obtain a token for your app
|
|
||||||
only.
|
|
||||||
|
|
||||||
Please refer to [POST /auth](#post-/auth) for more information.
|
|
||||||
|
|
||||||
## Test the API
|
|
||||||
|
|
||||||
On this documentation, you can test every route.
|
|
||||||
|
|
||||||
If you don't provide an API token in [Authentication](#auth), you can still test all the routes
|
|
||||||
but note that the given curl examples only work with an API token.
|
|
||||||
|
|
||||||
|
|
||||||
servers:
|
|
||||||
- url: __BASE_URI__
|
|
||||||
|
|
||||||
components:
|
|
||||||
securitySchemes:
|
|
||||||
bearer:
|
|
||||||
type: http
|
|
||||||
scheme: Bearer
|
|
||||||
|
|
||||||
schemas:
|
|
||||||
$merge:
|
|
||||||
- "types.yaml#.schemas"
|
|
||||||
- "bookmarks/types.yaml#.schemas"
|
|
||||||
- "profile/types.yaml#.schemas"
|
|
||||||
|
|
||||||
security:
|
|
||||||
- bearer: []
|
|
||||||
|
|
||||||
tags:
|
|
||||||
- name: user profile
|
|
||||||
- name: bookmarks
|
|
||||||
- name: bookmark export
|
|
||||||
- name: bookmark sharing
|
|
||||||
- name: bookmark labels
|
|
||||||
- name: bookmark highlights
|
|
||||||
- name: bookmark collections
|
|
||||||
- name: bookmarks import
|
|
||||||
- name: dev tools
|
|
||||||
|
|
||||||
paths:
|
|
||||||
/auth:
|
|
||||||
post:
|
|
||||||
tags: [user profile]
|
|
||||||
$merge:
|
|
||||||
- "profile/routes.yaml#.auth"
|
|
||||||
|
|
||||||
/profile:
|
|
||||||
get:
|
|
||||||
tags: [user profile]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "profile/routes.yaml#.profile"
|
|
||||||
|
|
||||||
/bookmarks:
|
|
||||||
get:
|
|
||||||
tags: [bookmarks]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.paginated"
|
|
||||||
- "bookmarks/traits.yaml#.sortable"
|
|
||||||
- "bookmarks/routes.yaml#.list"
|
|
||||||
|
|
||||||
post:
|
|
||||||
tags: [bookmarks]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.deferred"
|
|
||||||
- "bookmarks/routes.yaml#.create"
|
|
||||||
|
|
||||||
/bookmarks/{id}:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmarks]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.retrieve"
|
|
||||||
|
|
||||||
patch:
|
|
||||||
tags: [bookmarks]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "bookmarks/routes.yaml#.update"
|
|
||||||
|
|
||||||
delete:
|
|
||||||
tags: [bookmarks]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.delete"
|
|
||||||
|
|
||||||
/bookmarks/{id}/article:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark export]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.article"
|
|
||||||
|
|
||||||
/bookmarks/{id}/article.{format}:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark export]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.export"
|
|
||||||
|
|
||||||
/bookmarks/{id}/share/link:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark sharing]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.shareLink"
|
|
||||||
|
|
||||||
/bookmarks/{id}/share/email:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
post:
|
|
||||||
tags: [bookmark sharing]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.shareEmail"
|
|
||||||
|
|
||||||
/bookmarks/labels:
|
|
||||||
get:
|
|
||||||
tags: [bookmark labels]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.labels"
|
|
||||||
|
|
||||||
/bookmarks/labels/{name}:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withLabel"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark labels]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.labelInfo"
|
|
||||||
|
|
||||||
patch:
|
|
||||||
tags: [bookmark labels]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "bookmarks/routes.yaml#.labelUpdate"
|
|
||||||
|
|
||||||
delete:
|
|
||||||
tags: [bookmark labels]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.labelDelete"
|
|
||||||
|
|
||||||
/bookmarks/annotations:
|
|
||||||
get:
|
|
||||||
tags: [bookmark highlights]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.paginated"
|
|
||||||
- "bookmarks/routes.yaml#.annotationList"
|
|
||||||
|
|
||||||
/bookmarks/{id}/annotations:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark highlights]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.bookmarkAnnotationList"
|
|
||||||
|
|
||||||
post:
|
|
||||||
tags: [bookmark highlights]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.created"
|
|
||||||
- "bookmarks/routes.yaml#.bookmarkAnnotationCreate"
|
|
||||||
|
|
||||||
/bookmarks/{id}/annotations/{annotation_id}:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withBookmark"
|
|
||||||
|
|
||||||
patch:
|
|
||||||
tags: [bookmark highlights]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "bookmarks/routes.yaml#.withAnnotation"
|
|
||||||
- "bookmarks/routes.yaml#.bookmarkAnnotationUpdate"
|
|
||||||
|
|
||||||
delete:
|
|
||||||
tags: [bookmark highlights]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.withAnnotation"
|
|
||||||
- "bookmarks/routes.yaml#.bookmarkAnnotationDelete"
|
|
||||||
|
|
||||||
/bookmarks/collections:
|
|
||||||
get:
|
|
||||||
tags: [bookmark collections]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.paginated"
|
|
||||||
- "bookmarks/routes.yaml#.collectionList"
|
|
||||||
|
|
||||||
post:
|
|
||||||
tags: [bookmark collections]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.created"
|
|
||||||
- "bookmarks/routes.yaml#.collectionCreate"
|
|
||||||
|
|
||||||
/bookmarks/collections/{id}:
|
|
||||||
$merge:
|
|
||||||
- "bookmarks/routes.yaml#.withCollection"
|
|
||||||
|
|
||||||
get:
|
|
||||||
tags: [bookmark collections]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.collectionInfo"
|
|
||||||
|
|
||||||
patch:
|
|
||||||
tags: [bookmark collections]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.collectionUpdate"
|
|
||||||
|
|
||||||
delete:
|
|
||||||
tags: [bookmark collections]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "bookmarks/routes.yaml#.collectionDelete"
|
|
||||||
|
|
||||||
/bookmarks/import/text:
|
|
||||||
post:
|
|
||||||
tags: [bookmarks import]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.deferred"
|
|
||||||
- "bookmarks/routes.yaml#.importMultipartGeneric"
|
|
||||||
- "bookmarks/routes.yaml#.importTextFile"
|
|
||||||
|
|
||||||
/bookmarks/import/browser:
|
|
||||||
post:
|
|
||||||
tags: [bookmarks import]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.deferred"
|
|
||||||
- "bookmarks/routes.yaml#.importMultipartGeneric"
|
|
||||||
- "bookmarks/routes.yaml#.importBrowserBookmarks"
|
|
||||||
|
|
||||||
/bookmarks/import/pocket-file:
|
|
||||||
post:
|
|
||||||
tags: [bookmarks import]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.deferred"
|
|
||||||
- "bookmarks/routes.yaml#.importMultipartGeneric"
|
|
||||||
- "bookmarks/routes.yaml#.importPocket"
|
|
||||||
|
|
||||||
/bookmarks/import/wallabag:
|
|
||||||
post:
|
|
||||||
tags: [bookmarks import]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "traits.yaml#.validator"
|
|
||||||
- "traits.yaml#.deferred"
|
|
||||||
- "bookmarks/routes.yaml#.importWallabag"
|
|
||||||
|
|
||||||
|
|
||||||
/cookbook/extract:
|
|
||||||
get:
|
|
||||||
tags: [dev tools]
|
|
||||||
$merge:
|
|
||||||
- "traits.yaml#.authenticated"
|
|
||||||
- "cookbook/routes.yaml#.extract"
|
|
||||||
@ -1,563 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
withBookmark:
|
|
||||||
parameters:
|
|
||||||
- name: id
|
|
||||||
in: path
|
|
||||||
required: true
|
|
||||||
description: Bookmark ID
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
|
|
||||||
withLabel:
|
|
||||||
parameters:
|
|
||||||
- name: name
|
|
||||||
in: path
|
|
||||||
required: true
|
|
||||||
description: Label
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
withAnnotation:
|
|
||||||
parameters:
|
|
||||||
- name: annotation_id
|
|
||||||
in: path
|
|
||||||
required: true
|
|
||||||
description: Highlight ID
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
|
|
||||||
withCollection:
|
|
||||||
parameters:
|
|
||||||
- name: id
|
|
||||||
in: path
|
|
||||||
required: true
|
|
||||||
description: Collection ID
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
|
|
||||||
# GET /bookmarks
|
|
||||||
list:
|
|
||||||
summary: Bookmark List
|
|
||||||
description: |
|
|
||||||
This route returns a paginated bookmark list.
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
- name: search
|
|
||||||
in: query
|
|
||||||
description: A full text search string
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: title
|
|
||||||
in: query
|
|
||||||
description: Bookmark title
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: author
|
|
||||||
in: query
|
|
||||||
description: Author's name
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: site
|
|
||||||
in: query
|
|
||||||
description: Bookmark site name or domain
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: type
|
|
||||||
in: query
|
|
||||||
description: Bookmark type
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
enum: [article, photo, video]
|
|
||||||
- name: labels
|
|
||||||
in: query
|
|
||||||
description: One or several labels
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: is_loaded
|
|
||||||
in: query
|
|
||||||
description: Filter by loaded state
|
|
||||||
schema:
|
|
||||||
type: boolean
|
|
||||||
- name: has_errors
|
|
||||||
in: query
|
|
||||||
description: Filter bookmarks with or without errors
|
|
||||||
schema:
|
|
||||||
type: boolean
|
|
||||||
- name: has_labels
|
|
||||||
in: query
|
|
||||||
description: Filter bookmarks with or without labels
|
|
||||||
schema:
|
|
||||||
type: boolean
|
|
||||||
- name: is_marked
|
|
||||||
in: query
|
|
||||||
description: Filter by marked (favorite) status
|
|
||||||
schema:
|
|
||||||
type: boolean
|
|
||||||
- name: is_archived
|
|
||||||
in: query
|
|
||||||
description: Filter by archived status
|
|
||||||
schema:
|
|
||||||
type: boolean
|
|
||||||
- name: range_start
|
|
||||||
in: query
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: range_end
|
|
||||||
in: query
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: read_status
|
|
||||||
in: query
|
|
||||||
description: Read progress status
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
enum: [unread, reading, read]
|
|
||||||
- name: updated_since
|
|
||||||
in: query
|
|
||||||
description: Retrieve bookmarks created after this date
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
- name: id
|
|
||||||
in: query
|
|
||||||
description: One or more bookmark ID
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
- name: collection
|
|
||||||
in: query
|
|
||||||
description: A collection ID
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
description: List of bookmark items
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
$ref: "#/components/schemas/bookmarkSummary"
|
|
||||||
|
|
||||||
# POST /bookmarks
|
|
||||||
create:
|
|
||||||
summary: Bookmark Create
|
|
||||||
description: Creates a new bookmark
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/bookmarkCreate"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"202":
|
|
||||||
headers:
|
|
||||||
Bookmark-Id:
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
description: ID of the created bookmark
|
|
||||||
|
|
||||||
# GET /bookmarks/{id}
|
|
||||||
retrieve:
|
|
||||||
summary: Bookmark Details
|
|
||||||
description: Retrieves a saved bookmark
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Bookmark details
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/bookmarkInfo"
|
|
||||||
|
|
||||||
# PATCH /bookmarks/{id}
|
|
||||||
update:
|
|
||||||
summary: Bookmark Update
|
|
||||||
description: |
|
|
||||||
This route updates some bookmark's properties. Every input value is optional.
|
|
||||||
Upon success, it returns a mapping of changed values.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/bookmarkUpdate"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Bookmark updated
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/bookmarkUpdated"
|
|
||||||
|
|
||||||
# DELETE /bookmarks/{id}
|
|
||||||
delete:
|
|
||||||
summary: Bookmark Delete
|
|
||||||
description: Deletes a saved bookmark
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"204":
|
|
||||||
description: The bookmark was successfuly deleted.
|
|
||||||
|
|
||||||
# GET /bookmarks/{id}/article
|
|
||||||
article:
|
|
||||||
summary: Bookmark Article
|
|
||||||
description: |
|
|
||||||
This route returns the bookmark's article if it exists.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: |
|
|
||||||
A `text/html` response, containing the article body.
|
|
||||||
Please note that it's only the fragment and not a full HTML document.
|
|
||||||
content:
|
|
||||||
text/html:
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
# GET /bookmarks/{id}/article.{format}
|
|
||||||
export:
|
|
||||||
summary: Bookmark Export
|
|
||||||
description: This route exports a bookmark to another format.
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
- name: format
|
|
||||||
in: path
|
|
||||||
required: true
|
|
||||||
description: Export format
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
enum: [epub, md]
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
content:
|
|
||||||
application/epub+zip:
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: binary
|
|
||||||
text/markdown:
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
# GET /bookmarks/{id}/share/link
|
|
||||||
shareLink:
|
|
||||||
summary: Share by link
|
|
||||||
description: This route produces a publicly accessible link to share a bookmark.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Public link information
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/bookmarkShareLink"
|
|
||||||
|
|
||||||
# POST /bookmarks/{id}/share/email
|
|
||||||
shareEmail:
|
|
||||||
summary: Share by email
|
|
||||||
description: This route sends a bookmark to an email address.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/bookmarkShareEmail"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Message sent
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/message"
|
|
||||||
|
|
||||||
# GET /bookmarks/labels
|
|
||||||
labels:
|
|
||||||
summary: Label List
|
|
||||||
description: |
|
|
||||||
This route returns all the labels associated to a bookmark for the current user.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Label list
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
$ref: "#/components/schemas/labelInfo"
|
|
||||||
|
|
||||||
# GET /bookmarks/labels/{name}
|
|
||||||
labelInfo:
|
|
||||||
summary: Label Info
|
|
||||||
description:
|
|
||||||
This route returns information about a given bookmark label.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Label information
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
$ref: "#/components/schemas/labelInfo"
|
|
||||||
|
|
||||||
# PATCH /bookmarks/labels/{name}
|
|
||||||
labelUpdate:
|
|
||||||
summary: Label Update
|
|
||||||
description: |
|
|
||||||
This route renames a label.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/labelUpdate"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Label renamed
|
|
||||||
|
|
||||||
# DELETE /bookmarks/labels/{name}
|
|
||||||
labelDelete:
|
|
||||||
summary: Label Delete
|
|
||||||
description: |
|
|
||||||
This route remove a label from all associated bookmarks.
|
|
||||||
|
|
||||||
Please note that it does not remove the bookmarks themselves.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"204":
|
|
||||||
description: Label removed
|
|
||||||
|
|
||||||
# GET /bookmarks/annotations
|
|
||||||
annotationList:
|
|
||||||
summary: Highlight List
|
|
||||||
description: |
|
|
||||||
This route returns all the highlights created by the current user.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Highlight list
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
$ref: "#/components/schemas/annotationSummary"
|
|
||||||
|
|
||||||
# GET /bookmarks/{id}annotations
|
|
||||||
bookmarkAnnotationList:
|
|
||||||
summary: Bookmark Highlights
|
|
||||||
description: |
|
|
||||||
This route returns a given bookmark's highlights.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Highlight list
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
$ref: "#/components/schemas/annotationInfo"
|
|
||||||
|
|
||||||
# POST /bookmarks/{id}annotations
|
|
||||||
bookmarkAnnotationCreate:
|
|
||||||
summary: Highlight Create
|
|
||||||
description: |
|
|
||||||
This route creates a new highlight on a given bookmarks.
|
|
||||||
|
|
||||||
The highlight format is similar to the [Range API](https://developer.mozilla.org/en-US/docs/Web/API/Range)
|
|
||||||
with some differences:
|
|
||||||
|
|
||||||
- A range's start and end selectors are XPath selectors and must target an element.
|
|
||||||
- The offset is the text length from the begining of the selector, regardless of the traversed
|
|
||||||
potential children.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/annotationCreate"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"201":
|
|
||||||
description: Highlight created
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/annotationInfo"
|
|
||||||
|
|
||||||
# PATCH /bookmarks/{id}annotations/{annotation_id}
|
|
||||||
bookmarkAnnotationUpdate:
|
|
||||||
summary: Highlight Update
|
|
||||||
description: |
|
|
||||||
This route updates then given highlight in the given bookmark.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/annotationUpdate"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Update result
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
properties:
|
|
||||||
updated:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
annotations:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
$ref: "#/components/schemas/annotationInfo"
|
|
||||||
|
|
||||||
|
|
||||||
# DELETE /bookmarks/{id}annotations/{annotation_id}
|
|
||||||
bookmarkAnnotationDelete:
|
|
||||||
summary: Highlight Delete
|
|
||||||
description: |
|
|
||||||
This route removes the given highlight in the given bookmark.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"204":
|
|
||||||
description: Highlight removed
|
|
||||||
|
|
||||||
# GET /bookmarks/collections
|
|
||||||
collectionList:
|
|
||||||
summary: Collection List
|
|
||||||
description: |
|
|
||||||
This route returns all the current user's collections.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Collection list
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
$ref: "#/components/schemas/collectionInfo"
|
|
||||||
|
|
||||||
# POST /bookmarks/collections
|
|
||||||
collectionCreate:
|
|
||||||
summary: Collection Create
|
|
||||||
description: |
|
|
||||||
This route creates a new collection.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/collectionCreate"
|
|
||||||
|
|
||||||
# GET /bookmarks/collections/{id}
|
|
||||||
collectionInfo:
|
|
||||||
summary: Collection Details
|
|
||||||
description: |
|
|
||||||
This route returns a given collection information.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Collection information
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/collectionInfo"
|
|
||||||
|
|
||||||
# PATH /bookmarks/collections/{id}
|
|
||||||
collectionUpdate:
|
|
||||||
summary: Collection Update
|
|
||||||
description: |
|
|
||||||
This route updates a given collection. It returns a mapping of updated fields.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/collectionUpdate"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Updated fields
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/collectionSummary"
|
|
||||||
|
|
||||||
# DELETE /bookmarks/collections/{id}
|
|
||||||
collectionDelete:
|
|
||||||
summary: Collection Delete
|
|
||||||
description: |
|
|
||||||
This route deletes a given collection.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"204":
|
|
||||||
description: Collection deleted
|
|
||||||
|
|
||||||
# POST /bookmarks/import/text
|
|
||||||
importMultipartGeneric:
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
text/plain:
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
description: File content
|
|
||||||
multipart/form-data:
|
|
||||||
schema:
|
|
||||||
properties:
|
|
||||||
data:
|
|
||||||
type: string
|
|
||||||
format: binary
|
|
||||||
|
|
||||||
importTextFile:
|
|
||||||
summary: Import a Text File
|
|
||||||
description: |
|
|
||||||
This route creates bookmarks from a text file that contains one URL
|
|
||||||
per line.
|
|
||||||
|
|
||||||
importBrowserBookmarks:
|
|
||||||
summary: Import Browser Bookmarks
|
|
||||||
description: |
|
|
||||||
This route creates bookmarks from an HTML file generated by an export of a browser's
|
|
||||||
bookmarks.
|
|
||||||
|
|
||||||
importPocket:
|
|
||||||
summary: Import Pocket Saves
|
|
||||||
description: |
|
|
||||||
This route creates bookmarks from an HTML file generated by Pocket export tool.
|
|
||||||
Go to [https://getpocket.com/export](https://getpocket.com/export) to generate
|
|
||||||
such a file.
|
|
||||||
|
|
||||||
importWallabag:
|
|
||||||
summary: Import Wallabag Articles
|
|
||||||
description: |
|
|
||||||
This route imports articles from Wallabag using its API.
|
|
||||||
|
|
||||||
You must create an API client in Wallabag and use its "Client ID" and "Client Secret"
|
|
||||||
in this route's payload.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/wallabagImport"
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2024 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
sortable:
|
|
||||||
parameters:
|
|
||||||
- name: sort
|
|
||||||
in: query
|
|
||||||
description: Sorting parameters
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
enum:
|
|
||||||
- created
|
|
||||||
- -created
|
|
||||||
- domain
|
|
||||||
- -domain
|
|
||||||
- duration
|
|
||||||
- -duration
|
|
||||||
- published
|
|
||||||
- -published
|
|
||||||
- site
|
|
||||||
- -site
|
|
||||||
- title
|
|
||||||
- -title
|
|
||||||
@ -1,580 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
schemas:
|
|
||||||
bookmarkSummary:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
description: Bookmark's ID
|
|
||||||
href:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Link to the bookmark info
|
|
||||||
created:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Creation date
|
|
||||||
updated:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Last update
|
|
||||||
state:
|
|
||||||
type: integer
|
|
||||||
enum: [0, 1, 2]
|
|
||||||
description: |
|
|
||||||
Indicates the state of the bookmark.
|
|
||||||
- `0`: loaded
|
|
||||||
- `1`: error
|
|
||||||
- `2`: loading
|
|
||||||
loaded:
|
|
||||||
type: boolean
|
|
||||||
description: Becomes true when the bookmark is ready (regardless of its error state)
|
|
||||||
url:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Bookmark's original URL
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Bookmark's title
|
|
||||||
site_name:
|
|
||||||
type: string
|
|
||||||
description: Bookmark's site name
|
|
||||||
site:
|
|
||||||
type: string
|
|
||||||
format: hostname
|
|
||||||
description: Bookmark's site host name
|
|
||||||
published:
|
|
||||||
type: [string]
|
|
||||||
format: date-time
|
|
||||||
nullable: true
|
|
||||||
description: Publication date. Can be `null` when unknown.
|
|
||||||
authors:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Author list
|
|
||||||
lang:
|
|
||||||
type: string
|
|
||||||
description: Language Code
|
|
||||||
text_direction:
|
|
||||||
type: string
|
|
||||||
enum: [rtl, ltr]
|
|
||||||
description: |
|
|
||||||
Direction of the article's text. It can be empty when it's unknown.
|
|
||||||
document_type:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
The bookmark document type. This is usualy the same value as `type` but it can differ
|
|
||||||
depending on the extraction process.
|
|
||||||
type:
|
|
||||||
type: string
|
|
||||||
enum: [article, photo, video]
|
|
||||||
description: |
|
|
||||||
The bookmark type. Unlike `document_type`, this can only be one of the 3 values.
|
|
||||||
has_article:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
Indicates whether the bookmarks contains an article. Please not that
|
|
||||||
there can be an article on any type.
|
|
||||||
description:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
Bookmark's short description, when it exists. It's always an unformatted text.
|
|
||||||
is_deleted:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` when the bookmark is scheduled for deletion.
|
|
||||||
is_marked:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` when the bookmark is in the favorites.
|
|
||||||
is_archived:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` when the bookmark is in the archives.
|
|
||||||
read_progress:
|
|
||||||
type: integer
|
|
||||||
minimum: 0
|
|
||||||
maximum: 100
|
|
||||||
description: Reading progress percentage.
|
|
||||||
labels:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Bookmark's labels
|
|
||||||
word_count:
|
|
||||||
type: integer
|
|
||||||
minimum: 0
|
|
||||||
description: Number of words in the article, used to compute the reading time.
|
|
||||||
reading_time:
|
|
||||||
type: integer
|
|
||||||
minimum: 0
|
|
||||||
description: |
|
|
||||||
Duration of the article, in minutes. Either the actual duration for a
|
|
||||||
video or a reading time based on the word count.
|
|
||||||
resources:
|
|
||||||
type: object
|
|
||||||
description: |
|
|
||||||
This contains a list of resources associated with the bookmark.
|
|
||||||
The only fields that are always present are `log` and `props`.
|
|
||||||
The `article` field is only present when a bookmark provides a
|
|
||||||
text content. Other image fields depend on what was found during
|
|
||||||
extraction.
|
|
||||||
properties:
|
|
||||||
article:
|
|
||||||
$ref: "#/components/schemas/bookmarkResource"
|
|
||||||
description: Link to the article, when there is one.
|
|
||||||
icon:
|
|
||||||
$ref: "#/components/schemas/bookmarkResourceImage"
|
|
||||||
description: Link and information for the site icon.
|
|
||||||
image:
|
|
||||||
$ref: "#/components/schemas/bookmarkResourceImage"
|
|
||||||
description: Link and information for the article image.
|
|
||||||
thumbnail:
|
|
||||||
$ref: "#/components/schemas/bookmarkResourceImage"
|
|
||||||
description: Link and information for the article thumbnail.
|
|
||||||
log:
|
|
||||||
$ref: "#/components/schemas/bookmarkResource"
|
|
||||||
description: Link to the extraction log.
|
|
||||||
props:
|
|
||||||
$ref: "#/components/schemas/bookmarkResource"
|
|
||||||
description: Link to the bookmark's extra properties.
|
|
||||||
|
|
||||||
bookmarkResource:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
src:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: URL of the resource
|
|
||||||
|
|
||||||
bookmarkResourceImage:
|
|
||||||
allOf:
|
|
||||||
- $ref: "#/components/schemas/bookmarkResource"
|
|
||||||
- type: object
|
|
||||||
properties:
|
|
||||||
height:
|
|
||||||
type: integer
|
|
||||||
description: Image height
|
|
||||||
width:
|
|
||||||
type: integer
|
|
||||||
description: Image width
|
|
||||||
|
|
||||||
bookmarkInfo:
|
|
||||||
allOf:
|
|
||||||
- $ref: "#/components/schemas/bookmarkSummary"
|
|
||||||
- type: object
|
|
||||||
properties:
|
|
||||||
read_anchor:
|
|
||||||
type: string
|
|
||||||
description: CSS selector of the last seen element.
|
|
||||||
links:
|
|
||||||
description: |
|
|
||||||
This contains the list of all the links collected in the
|
|
||||||
retrieved article.
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
properties:
|
|
||||||
url:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Link URI
|
|
||||||
domain:
|
|
||||||
type: string
|
|
||||||
format: hostname
|
|
||||||
description: Link's domain
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Link's title
|
|
||||||
is_page:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` when the destination is a web page
|
|
||||||
content_type:
|
|
||||||
type: string
|
|
||||||
description: MIME type of the destination
|
|
||||||
|
|
||||||
bookmarkCreate:
|
|
||||||
required: [url]
|
|
||||||
properties:
|
|
||||||
url:
|
|
||||||
type: string
|
|
||||||
description: URL to fetch
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Title of the bookmark
|
|
||||||
labels:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: List of labels to set to the bookmark
|
|
||||||
|
|
||||||
bookmarkUpdate:
|
|
||||||
properties:
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: New bookmark's title
|
|
||||||
is_marked:
|
|
||||||
type: boolean
|
|
||||||
description: Favortie state
|
|
||||||
is_archived:
|
|
||||||
type: boolean
|
|
||||||
description: Archive state
|
|
||||||
is_deleted:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
If `true`, schedules the bookmark for deletion, otherwise, cancels any scheduled deletion
|
|
||||||
read_progress:
|
|
||||||
type: integer
|
|
||||||
minimum: 0
|
|
||||||
maximum: 100
|
|
||||||
description: Reading progress percentage
|
|
||||||
read_anchor:
|
|
||||||
type: string
|
|
||||||
description: CSS selector of the last seen element
|
|
||||||
labels:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Replaces the bookmark's labels
|
|
||||||
add_labels:
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Add the given labels to the bookmark
|
|
||||||
remove_labels:
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Remove the given labels from the bookmark
|
|
||||||
|
|
||||||
bookmarkUpdated:
|
|
||||||
required: [href, id, updated]
|
|
||||||
properties:
|
|
||||||
href:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Bookmark URI
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
description: Bookmark's ID
|
|
||||||
updated:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Last update
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Bookmark Title
|
|
||||||
is_marked:
|
|
||||||
type: string
|
|
||||||
description: Favorite status
|
|
||||||
is_archived:
|
|
||||||
type: string
|
|
||||||
description: Archive status
|
|
||||||
is_deleted:
|
|
||||||
type: string
|
|
||||||
description: Scheduled deletion status
|
|
||||||
read_progress:
|
|
||||||
type: integer
|
|
||||||
minimum: 0
|
|
||||||
maximum: 100
|
|
||||||
description: Reading progress percentage
|
|
||||||
read_anchor:
|
|
||||||
type: string
|
|
||||||
description: CSS selector of the last seen element
|
|
||||||
labels:
|
|
||||||
type: string
|
|
||||||
description: New label list
|
|
||||||
|
|
||||||
bookmarkShareLink:
|
|
||||||
properties:
|
|
||||||
url:
|
|
||||||
type: string
|
|
||||||
description: Public URL
|
|
||||||
expires:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Expiration date
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Bookmark title
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
description: Bookmark ID
|
|
||||||
|
|
||||||
bookmarkShareEmail:
|
|
||||||
properties:
|
|
||||||
email:
|
|
||||||
type: string
|
|
||||||
format: email
|
|
||||||
format:
|
|
||||||
type: string
|
|
||||||
enum: ["html", "epub"]
|
|
||||||
example:
|
|
||||||
email: alice@localhost
|
|
||||||
format: html
|
|
||||||
|
|
||||||
labelInfo:
|
|
||||||
properties:
|
|
||||||
name:
|
|
||||||
type: string
|
|
||||||
description: Label's name
|
|
||||||
count:
|
|
||||||
type: integer
|
|
||||||
description: Number of bookmarks with this label
|
|
||||||
href:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Link to the label info
|
|
||||||
href_bookmarks:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Link to the bookmarks with this label
|
|
||||||
|
|
||||||
labelUpdate:
|
|
||||||
properties:
|
|
||||||
name:
|
|
||||||
type: string
|
|
||||||
description: New label
|
|
||||||
|
|
||||||
annotationSummary:
|
|
||||||
properties:
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
description: Highlight ID
|
|
||||||
href:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Link to the highlight
|
|
||||||
text:
|
|
||||||
type: string
|
|
||||||
description: Highlighted text
|
|
||||||
created:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Highlight creation date
|
|
||||||
bookmark_id:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
description: Bookmark ID
|
|
||||||
bookmark_href:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Link to the bookmark information
|
|
||||||
bookmark_url:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Original bookmark's URL
|
|
||||||
bookmark_title:
|
|
||||||
type: string
|
|
||||||
description: Title of the bookmark
|
|
||||||
bookmark_site_name:
|
|
||||||
type: string
|
|
||||||
description: Bookmark's site name
|
|
||||||
|
|
||||||
annotationInfo:
|
|
||||||
properties:
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
description: Highlight ID
|
|
||||||
start_selector:
|
|
||||||
type: string
|
|
||||||
description: Start element's XPath selector
|
|
||||||
start_offset:
|
|
||||||
type: integer
|
|
||||||
description: Start element's text offset
|
|
||||||
end_selector:
|
|
||||||
type: string
|
|
||||||
description: End element's XPath selector
|
|
||||||
end_offset:
|
|
||||||
type: integer
|
|
||||||
description: End element's text offset
|
|
||||||
created:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Highlight creation date
|
|
||||||
text:
|
|
||||||
type: string
|
|
||||||
description: Highlighted text
|
|
||||||
|
|
||||||
annotationCreate:
|
|
||||||
required: [start_selector, start_offset, end_selector, end_offset, color]
|
|
||||||
properties:
|
|
||||||
start_selector:
|
|
||||||
type: string
|
|
||||||
description: Start element's XPath selector
|
|
||||||
start_offset:
|
|
||||||
type: integer
|
|
||||||
description: Start element's text offset
|
|
||||||
end_selector:
|
|
||||||
type: string
|
|
||||||
description: End element's XPath selector
|
|
||||||
end_offset:
|
|
||||||
type: integer
|
|
||||||
description: End element's text offset
|
|
||||||
color:
|
|
||||||
type: color
|
|
||||||
description: Annotation color
|
|
||||||
|
|
||||||
annotationUpdate:
|
|
||||||
required: [color]
|
|
||||||
properties:
|
|
||||||
color:
|
|
||||||
type: color
|
|
||||||
description: Annotation color
|
|
||||||
|
|
||||||
collectionSummary:
|
|
||||||
properties:
|
|
||||||
updated:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Last update date
|
|
||||||
name:
|
|
||||||
type: string
|
|
||||||
description: Collection's name
|
|
||||||
is_pinned:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` when the collection is pinned
|
|
||||||
is_deleted:
|
|
||||||
type: boolean
|
|
||||||
description: Collection is scheduled for deletion
|
|
||||||
search:
|
|
||||||
type: string
|
|
||||||
description: Search string
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Title filter
|
|
||||||
author:
|
|
||||||
type: string
|
|
||||||
description: Author filter
|
|
||||||
site:
|
|
||||||
type: string
|
|
||||||
description: Site (name, host or domain) filter
|
|
||||||
type:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
enum: [article, photo, video]
|
|
||||||
description: Type filter
|
|
||||||
labels:
|
|
||||||
type: string
|
|
||||||
description: Label filter
|
|
||||||
read_status:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
enum: [unread, reading, read]
|
|
||||||
description: Read progress status
|
|
||||||
is_marked:
|
|
||||||
type: boolean
|
|
||||||
description: Favorite filter
|
|
||||||
is_archived:
|
|
||||||
type: boolean
|
|
||||||
description: Archive filter
|
|
||||||
range_start:
|
|
||||||
type: string
|
|
||||||
description: From date filter
|
|
||||||
range_end:
|
|
||||||
type: string
|
|
||||||
description: To date filter
|
|
||||||
|
|
||||||
collectionInfo:
|
|
||||||
allOf:
|
|
||||||
- type: object
|
|
||||||
properties:
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
description: Collection ID
|
|
||||||
href:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Collection URL
|
|
||||||
created:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Creation date
|
|
||||||
- $ref: "#/components/schemas/collectionSummary"
|
|
||||||
|
|
||||||
|
|
||||||
collectionCreate:
|
|
||||||
properties:
|
|
||||||
name:
|
|
||||||
type: string
|
|
||||||
description: Collection's name
|
|
||||||
is_pinned:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` when the collection is pinned
|
|
||||||
is_deleted:
|
|
||||||
type: boolean
|
|
||||||
description: Collection is scheduled for deletion
|
|
||||||
search:
|
|
||||||
type: string
|
|
||||||
description: Search string
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Title filter
|
|
||||||
author:
|
|
||||||
type: string
|
|
||||||
description: Author filter
|
|
||||||
site:
|
|
||||||
type: string
|
|
||||||
description: Site (name, host or domain) filter
|
|
||||||
type:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
enum: [article, photo, video]
|
|
||||||
description: Type filter
|
|
||||||
labels:
|
|
||||||
type: string
|
|
||||||
description: Label filter
|
|
||||||
read_status:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
enum: [unread, reading, read]
|
|
||||||
description: Read progress status
|
|
||||||
is_marked:
|
|
||||||
type: boolean
|
|
||||||
description: Favorite filter
|
|
||||||
is_archived:
|
|
||||||
type: boolean
|
|
||||||
description: Archive filter
|
|
||||||
range_start:
|
|
||||||
type: string
|
|
||||||
description: From date filter
|
|
||||||
range_end:
|
|
||||||
type: string
|
|
||||||
description: To date filter
|
|
||||||
|
|
||||||
collectionUpdate:
|
|
||||||
allOf:
|
|
||||||
- $ref: "#/components/schemas/collectionCreate"
|
|
||||||
|
|
||||||
wallabagImport:
|
|
||||||
properties:
|
|
||||||
url:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: Your Wallabag instance's URL
|
|
||||||
username:
|
|
||||||
type: string
|
|
||||||
description: Your Wallabag username
|
|
||||||
password:
|
|
||||||
type: string
|
|
||||||
description: Your Wallabag password
|
|
||||||
client_id:
|
|
||||||
type: string
|
|
||||||
description: API Client ID
|
|
||||||
client_secret:
|
|
||||||
type: string
|
|
||||||
description: API Client Secret
|
|
||||||
@ -1,145 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
# GET /cookbook/extrack
|
|
||||||
extract:
|
|
||||||
summary: Extract Link
|
|
||||||
description: |
|
|
||||||
**NOTE: Only available for user in the admin group.**
|
|
||||||
|
|
||||||
This route extracts a link and returns the extraction result.
|
|
||||||
|
|
||||||
You can pass an `Accept` header to the request, with one of the following values:
|
|
||||||
|
|
||||||
- `application/json` (default) returns a JSON response
|
|
||||||
- `text/html` returns an HTML response with all the media included as base64 encoded
|
|
||||||
URLs.
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
- name: url
|
|
||||||
in: query
|
|
||||||
required: true
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: URL to extract
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: |
|
|
||||||
Extraction result.
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
properties:
|
|
||||||
url:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
description: The extracted URL
|
|
||||||
logs:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Extraction log
|
|
||||||
errors:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Extraction errors, if any
|
|
||||||
meta:
|
|
||||||
type: object
|
|
||||||
additionalProperties:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
Contains the meta tags extracted from the page.
|
|
||||||
properties:
|
|
||||||
properties:
|
|
||||||
json-ld:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: object
|
|
||||||
description: A list of JSON-LD documents retrieved during the extraction
|
|
||||||
link:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: object
|
|
||||||
patternProperties:
|
|
||||||
"^@.+":
|
|
||||||
type: string
|
|
||||||
description: Link attribute, always starting with `@`
|
|
||||||
description: A list of all `link` tags retrieved during the extraction
|
|
||||||
meta:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: object
|
|
||||||
patternProperties:
|
|
||||||
"^@.+":
|
|
||||||
type: string
|
|
||||||
description: Meta attribute, always starting with `@`
|
|
||||||
description: A list of all `meta` tags retrieved during the extraction
|
|
||||||
domain:
|
|
||||||
type: string
|
|
||||||
format: hostname
|
|
||||||
description: Page's domain name
|
|
||||||
title:
|
|
||||||
type: string
|
|
||||||
description: Page's title
|
|
||||||
authors:
|
|
||||||
type: "[string]"
|
|
||||||
description: Page's author list
|
|
||||||
site:
|
|
||||||
type: string
|
|
||||||
format: hostname
|
|
||||||
description: Page's site
|
|
||||||
site_name:
|
|
||||||
type: string
|
|
||||||
description: Page's site name
|
|
||||||
lang:
|
|
||||||
type: string
|
|
||||||
description: Language Code
|
|
||||||
text_direction:
|
|
||||||
type: string
|
|
||||||
enum: [rtl, ltr]
|
|
||||||
description: |
|
|
||||||
Direction of the article's text. It can be empty when it's unknown.
|
|
||||||
date:
|
|
||||||
type: [string]
|
|
||||||
format: date-time
|
|
||||||
nullable: true
|
|
||||||
description: Publication date. Can be `null` when unknown.
|
|
||||||
document_type:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
The detected document type. The value is usualy `article`, `photo` or `video`
|
|
||||||
but can vary, based on the extraction process.
|
|
||||||
description:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
Page's short description, when it exists. It's always an unformatted text.
|
|
||||||
html:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
The HTML content after processing.
|
|
||||||
embed:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
The oembed HTML fragment, when it exists. It usualy contains an iframe when
|
|
||||||
extracting videos.
|
|
||||||
images:
|
|
||||||
properties:
|
|
||||||
additionalProperties:
|
|
||||||
properties:
|
|
||||||
size:
|
|
||||||
type: "[integer]"
|
|
||||||
description: The image size in pixels
|
|
||||||
encoded:
|
|
||||||
type: string
|
|
||||||
description: The base64 URI encoded image
|
|
||||||
|
|
||||||
text/html:
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
@ -1,55 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
auth:
|
|
||||||
summary: Authenticate
|
|
||||||
description: |
|
|
||||||
This route performs the authentication with a username and a password and returns a token
|
|
||||||
that you can use for all API requests.
|
|
||||||
|
|
||||||
You don't need to perform a request to this route each time you're using the API, only do it
|
|
||||||
once and keep the token somehow. You can use this route to provide a first time authentication
|
|
||||||
in a mobile application or any API client you may build and only store the resulting token.
|
|
||||||
|
|
||||||
You MUST provide an application name.
|
|
||||||
|
|
||||||
Alternatively, you can [create an authentication token](../profile/tokens) directly from
|
|
||||||
Readeck.
|
|
||||||
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/authenticationForm"
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"201":
|
|
||||||
description: Authentication success
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/authenticationResult"
|
|
||||||
|
|
||||||
"403":
|
|
||||||
description: Authentication failed
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/message"
|
|
||||||
|
|
||||||
# GET /profile
|
|
||||||
profile:
|
|
||||||
summary: User Profile
|
|
||||||
description: |
|
|
||||||
This route returns the current user's profile information. This includes the user information
|
|
||||||
and preferences, and the authentication provider with its permissions.
|
|
||||||
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: Profile information
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/userProfile"
|
|
||||||
@ -1,143 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
schemas:
|
|
||||||
authenticationForm:
|
|
||||||
type: object
|
|
||||||
required: [username, password, application]
|
|
||||||
properties:
|
|
||||||
username:
|
|
||||||
type: string
|
|
||||||
description: Username
|
|
||||||
password:
|
|
||||||
type: string
|
|
||||||
description: Password
|
|
||||||
application:
|
|
||||||
type: string
|
|
||||||
description: Application name. This can be anything.
|
|
||||||
roles:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: A list of roles to restrict the new token access.
|
|
||||||
example:
|
|
||||||
username: alice
|
|
||||||
password: "1234"
|
|
||||||
application: api doc
|
|
||||||
|
|
||||||
authenticationResult:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
description: Token ID
|
|
||||||
token:
|
|
||||||
type: string
|
|
||||||
description: Authentication token. This is the value you must store in your application.
|
|
||||||
example:
|
|
||||||
{
|
|
||||||
"id": "RFutYEAVM95DUDLUDnhbQm",
|
|
||||||
"token": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJqdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
||||||
}
|
|
||||||
|
|
||||||
userProfile:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
provider:
|
|
||||||
description: Authentication provider information
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
format: short-uid
|
|
||||||
description: Authentication provider ID (ie. the token ID)
|
|
||||||
name:
|
|
||||||
type: string
|
|
||||||
description: Provider name
|
|
||||||
application:
|
|
||||||
type: string
|
|
||||||
description: The registered application name
|
|
||||||
roles:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Roles granted for this session
|
|
||||||
permissions:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
description: Permissions granted for this session
|
|
||||||
user:
|
|
||||||
description: User information
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
username:
|
|
||||||
type: string
|
|
||||||
description: Username
|
|
||||||
email:
|
|
||||||
type: string
|
|
||||||
format: email
|
|
||||||
description: User email
|
|
||||||
created:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Creation date
|
|
||||||
updated:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
description: Last update date
|
|
||||||
settings:
|
|
||||||
description: User settings
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
debug_info:
|
|
||||||
type: boolean
|
|
||||||
description: Enable debug information
|
|
||||||
reader_settings:
|
|
||||||
description: Reader settings
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
font:
|
|
||||||
type: string
|
|
||||||
font_size:
|
|
||||||
type: integer
|
|
||||||
line_height:
|
|
||||||
type: integer
|
|
||||||
example:
|
|
||||||
{
|
|
||||||
"provider": {
|
|
||||||
"name": "bearer token",
|
|
||||||
"id": "X4bmnMRcnDhQtu5y33qzTp",
|
|
||||||
"application": "internal",
|
|
||||||
"roles": [
|
|
||||||
"scoped_bookmarks_r",
|
|
||||||
"scoped_bookmarks_w"
|
|
||||||
],
|
|
||||||
"permissions": [
|
|
||||||
"api:bookmarks:collections:read",
|
|
||||||
"api:bookmarks:collections:write",
|
|
||||||
"api:bookmarks:export",
|
|
||||||
"api:bookmarks:read",
|
|
||||||
"api:bookmarks:write",
|
|
||||||
"api:opds:read",
|
|
||||||
"api:profile:read",
|
|
||||||
"api:profile:tokens:delete"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"user": {
|
|
||||||
"username": "alice",
|
|
||||||
"email": "alice@localhost",
|
|
||||||
"created": "2023-08-27T13:32:11.704606963Z",
|
|
||||||
"updated": "2023-12-17T09:08:31.909723372Z",
|
|
||||||
"settings": {
|
|
||||||
"debug_info": false,
|
|
||||||
"reader_settings": {
|
|
||||||
"font": "serif",
|
|
||||||
"font_size": 3,
|
|
||||||
"line_height": 3
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,125 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
authenticated:
|
|
||||||
responses:
|
|
||||||
"401":
|
|
||||||
description: |
|
|
||||||
Unauthorized. The request token found in the Authorization header is not valid.
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/message"
|
|
||||||
"403":
|
|
||||||
description: |
|
|
||||||
Forbidden. The user doesn't have permission to fetch users for the specified,
|
|
||||||
but has other account permissions
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/message"
|
|
||||||
|
|
||||||
paginated:
|
|
||||||
parameters:
|
|
||||||
- name: limit
|
|
||||||
in: query
|
|
||||||
description: Number of items per page
|
|
||||||
schema:
|
|
||||||
type: integer
|
|
||||||
- name: offset
|
|
||||||
in: query
|
|
||||||
description: Pagination offset
|
|
||||||
schema:
|
|
||||||
type: integer
|
|
||||||
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
headers:
|
|
||||||
Link:
|
|
||||||
description: Link to other pages in paginated results
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
Current-Page:
|
|
||||||
description: Current page number
|
|
||||||
schema:
|
|
||||||
type: integer
|
|
||||||
Total-Count:
|
|
||||||
description: Total number of items
|
|
||||||
schema:
|
|
||||||
type: integer
|
|
||||||
Total-Pages:
|
|
||||||
description: Total number of pages
|
|
||||||
schema:
|
|
||||||
type: integer
|
|
||||||
|
|
||||||
created:
|
|
||||||
responses:
|
|
||||||
"201":
|
|
||||||
headers:
|
|
||||||
Location:
|
|
||||||
description: URL of the created resource
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/message"
|
|
||||||
|
|
||||||
deferred:
|
|
||||||
responses:
|
|
||||||
"202":
|
|
||||||
headers:
|
|
||||||
Location:
|
|
||||||
description: URL of the created resource
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: "#/components/schemas/message"
|
|
||||||
|
|
||||||
validator:
|
|
||||||
responses:
|
|
||||||
"422":
|
|
||||||
description: |
|
|
||||||
This HTTP response is sent when the input data is not valid. It contains an object
|
|
||||||
with all the detected errors.
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
properties:
|
|
||||||
is_valid:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` if the input is valid
|
|
||||||
errors:
|
|
||||||
type: "[string]"
|
|
||||||
nullable: true
|
|
||||||
description: List of global input errors
|
|
||||||
fields:
|
|
||||||
type: object
|
|
||||||
description: |
|
|
||||||
All the fields, with and without errors
|
|
||||||
additionalProperties:
|
|
||||||
properties:
|
|
||||||
is_null:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` if the input value is null
|
|
||||||
is_bound:
|
|
||||||
type: boolean
|
|
||||||
description: |
|
|
||||||
`true` when the value is bound to the form
|
|
||||||
value:
|
|
||||||
type: any
|
|
||||||
description: Item's value; can be any type
|
|
||||||
errors:
|
|
||||||
type: "[string]"
|
|
||||||
nullable: true
|
|
||||||
description: List of errors for this field
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
---
|
|
||||||
# SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
schemas:
|
|
||||||
message:
|
|
||||||
properties:
|
|
||||||
status:
|
|
||||||
type: integer
|
|
||||||
description: HTTP Status Code
|
|
||||||
message:
|
|
||||||
type: string
|
|
||||||
description: Information or error message
|
|
||||||
Loading…
x
Reference in New Issue
Block a user