omnivore/packages/api/src/generated/schema.graphql

3509 lines
61 KiB
GraphQL
Raw Normal View History

schema {
query: Query
mutation: Mutation
2024-05-25 03:47:45 +00:00
subscription: SubscriptionRootType
}
directive @sanitize(allowedTags: [String], maxLength: Int, minLength: Int, pattern: String) on INPUT_FIELD_DEFINITION
2022-02-11 17:24:33 +00:00
2024-01-09 10:22:32 +00:00
type AddDiscoverFeedError {
errorCodes: [AddDiscoverFeedErrorCode!]!
}
enum AddDiscoverFeedErrorCode {
BAD_REQUEST
CONFLICT
NOT_FOUND
UNAUTHORIZED
}
input AddDiscoverFeedInput {
url: String!
}
union AddDiscoverFeedResult = AddDiscoverFeedError | AddDiscoverFeedSuccess
type AddDiscoverFeedSuccess {
feed: DiscoverFeed!
}
type AddPopularReadError {
errorCodes: [AddPopularReadErrorCode!]!
}
enum AddPopularReadErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
union AddPopularReadResult = AddPopularReadError | AddPopularReadSuccess
type AddPopularReadSuccess {
pageId: String!
}
2024-04-09 03:16:20 +00:00
enum AllowedReply {
CONFIRM
OKAY
SUBSCRIBE
YES
}
2022-05-27 04:44:41 +00:00
type ApiKey {
createdAt: Date!
expiresAt: Date!
id: ID!
2022-05-27 10:07:54 +00:00
key: String
2022-05-27 04:44:41 +00:00
name: String!
scopes: [String!]
usedAt: Date
}
type ApiKeysError {
errorCodes: [ApiKeysErrorCode!]!
}
enum ApiKeysErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union ApiKeysResult = ApiKeysError | ApiKeysSuccess
type ApiKeysSuccess {
apiKeys: [ApiKey!]!
}
2022-02-15 18:42:05 +00:00
type ArchiveLinkError {
errorCodes: [ArchiveLinkErrorCode!]!
message: String!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum ArchiveLinkErrorCode {
BAD_REQUEST
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input ArchiveLinkInput {
archived: Boolean!
linkId: ID!
2022-02-11 17:24:33 +00:00
}
union ArchiveLinkResult = ArchiveLinkError | ArchiveLinkSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type ArchiveLinkSuccess {
linkId: String!
message: String!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type Article {
author: String
2022-02-15 18:42:05 +00:00
content: String!
contentReader: ContentReader!
createdAt: Date!
description: String
directionality: DirectionalityType
feedContent: String
folder: String!
2022-02-15 18:42:05 +00:00
hasContent: Boolean
hash: String!
highlights(input: ArticleHighlightsInput): [Highlight!]!
id: ID!
2022-02-15 18:42:05 +00:00
image: String
isArchived: Boolean!
2022-02-24 03:46:51 +00:00
labels: [Label!]
2022-05-23 07:31:11 +00:00
language: String
2022-02-24 03:46:51 +00:00
linkId: ID
originalArticleUrl: String
2022-02-15 18:42:05 +00:00
originalHtml: String
pageType: PageType
postedByViewer: Boolean
2022-02-15 18:42:05 +00:00
publishedAt: Date
2022-06-15 01:32:10 +00:00
readAt: Date
2022-02-15 18:42:05 +00:00
readingProgressAnchorIndex: Int!
readingProgressPercent: Float!
readingProgressTopPercent: Float
recommendations: [Recommendation!]
savedAt: Date!
2022-02-15 18:42:05 +00:00
savedByViewer: Boolean
shareInfo: LinkShareInfo
sharedComment: String
siteIcon: String
siteName: String
slug: String!
Remove article saving request (#493) * Add state and taskName in elastic page mappings * Add state and taskName in elastic page interface * Create page with PROCESSING state before scrapping * Update createArticleRequest API * Fix tests * Add default state for pages * Update createArticle API * Update save page * Update save file * Update saving item description * Show unable to parse content for failed page * Fix date parsing * Search for not failed pages * Fix tests * Add test for saveUrl * Update get article saving request api * Update get article test * Add test for articleSavingRequest API * Add test for failure * Return new page id if clientRequestId empty * Update clientRequestId in savePage * Update clientRequestId in saveFile * Replace article with slug in articleSavingRequest * Add slug in articleSavingRequest response * Depreciate article * Use slug in web * Remove article and highlight fragments * Query article.slug on Prod * Show unable to parse description for failed page * Fix a bug having duplicate pages when saving the same url multiple times * Add state in response * Rename variables in removeArticle API * Rename state * Add state in response in web * Make state an enum * Open temporary page by link id * Use an empty reader view as the background for loading pages * Progressively load the article page as content is loaded * Add includePending flag in getArticles API * Set includePending = true in web * Add elastic update mappings in migration script * Add elastic mappings in docker image * Move index_settings.json to migrate package * Remove elastic index creation in api * Move elastic migrations to a separate directory * Remove index_settings from api docker image Co-authored-by: Jackson Harper <jacksonh@gmail.com>
2022-04-29 05:41:06 +00:00
state: ArticleSavingRequestStatus
subscription: String
title: String!
unsubHttpUrl: String
unsubMailTo: String
2023-09-05 09:23:58 +00:00
updatedAt: Date
Rebased version of the elastic PR (#225) * Add elastic to our docker compose * add AND/OR/NOT search operations * add elastic and create article in elastic * change error code when elastic throws error * add search pages in elastic * add search by labels * Add elastic to GitHub Action * Update elastic version * Fix port for elastic * add url in search query * Set elastic features when running tests * add debug logs * Use localhost instead of service hostname * refresh elastic after create/update * update search labels query * add typescript support * search pages in elastic * fix search queries * use elastic for saving page * fix test failure * update getArticle api to use elastic * use generic get page function * add elastic migration python script * fix bulk helper param * save elastic page id in article_saving_request instead of postgres article_id * fix page archiving and deleting * add tests for deleteArticle * remove custom date type in elastic mappings which not exist in older version of elastic * fix timestamp format issue * add tests for save reading progress * add tests for save file * optimize search results * add alias to index * update migration script to receive env var as params * Add failing test to validate we don't decrease reading progress This test is failing with Elastic because we aren't fetching the reading progress from elastic here, and are fetching it from postgres. * Rename readingProgress to readingProgressPercent This is the name stored in elastic, so fixes issues pulling the value out. * Linting * Add failing test for creating highlights w/elastic This test fails because the highlight can't be looked up. Is there a different ID we should be passing in to query for highlights, or do we need to update the query to look for elastic_id? * add tests code coverage threshold * update nyc config * include more files in test coverage * change alias name * update updateContent to update pages in elastic * remove debug log * fix createhighlight test * search pages by alias in elastic * update set labels and delete labels in elastic * migration script enumeration * make BULK_SIZE an env var * fix pdf search indexing * debug github action exit issue * call pubsub when create/update/delete page in elastic * fix json parsing bug and reduce reading data from file * replace a depreciated pubsub api call * debug github action exit issue * debug github action exit issue * add handler to upload elastic page data to GCS * fix tests * Use http_auth instead of basic_auth * add index creation and existing postgres tables update in migration script * fix a typo to connect to elastic * rename readingProgress to readingProgressPercent * migrate elastic_page_id in highlights and article_saving_request tables * update migration script to include number of updated rows * update db migration query * read index mappings from file * fix upload pages to gcs * fix tests failure due to pageContext * fix upload file id not exist error * Handle savedAt & isArchived attributes w/out quering elastic * Fix prettier issues * fix content-type mismatching * revert pageId to linkId because frontend was not deployed yet * fix newsletters and attachment not saved in elastic * put linkId in article for setting labels * exclude orginalHtml in the result of searching to improve performace * exclude content in the result of searching to improve performace * remove score sorting * do not refresh immediately to reduce searching and indexing time * do not replace the backup data in gcs * fix no article id defined in articleSavingRequest * add logging of elastic api running time * reduce home feed pagination size to 15 * reduce home feed pagination size to 10 * stop revalidating first page * do not use a separate api to fetch reading progress * Remove unused comment * get reading progress if not exists * replace ngram tokenizer with standard tokenizer * fix tests * remove .env.local * add sort keyword in searching to sort by score Co-authored-by: Hongbo Wu <hongbo@omnivore.app>
2022-03-16 04:08:59 +00:00
uploadFileId: ID
url: String!
2023-01-02 08:49:11 +00:00
wordsCount: Int
2022-02-11 17:24:33 +00:00
}
type ArticleEdge {
cursor: String!
node: Article!
}
2022-02-15 18:42:05 +00:00
type ArticleError {
errorCodes: [ArticleErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum ArticleErrorCode {
BAD_DATA
NOT_FOUND
2022-02-15 18:42:05 +00:00
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input ArticleHighlightsInput {
includeFriends: Boolean
2022-02-11 17:24:33 +00:00
}
union ArticleResult = ArticleError | ArticleSuccess
2022-02-15 18:42:05 +00:00
type ArticleSavingRequest {
Remove article saving request (#493) * Add state and taskName in elastic page mappings * Add state and taskName in elastic page interface * Create page with PROCESSING state before scrapping * Update createArticleRequest API * Fix tests * Add default state for pages * Update createArticle API * Update save page * Update save file * Update saving item description * Show unable to parse content for failed page * Fix date parsing * Search for not failed pages * Fix tests * Add test for saveUrl * Update get article saving request api * Update get article test * Add test for articleSavingRequest API * Add test for failure * Return new page id if clientRequestId empty * Update clientRequestId in savePage * Update clientRequestId in saveFile * Replace article with slug in articleSavingRequest * Add slug in articleSavingRequest response * Depreciate article * Use slug in web * Remove article and highlight fragments * Query article.slug on Prod * Show unable to parse description for failed page * Fix a bug having duplicate pages when saving the same url multiple times * Add state in response * Rename variables in removeArticle API * Rename state * Add state in response in web * Make state an enum * Open temporary page by link id * Use an empty reader view as the background for loading pages * Progressively load the article page as content is loaded * Add includePending flag in getArticles API * Set includePending = true in web * Add elastic update mappings in migration script * Add elastic mappings in docker image * Move index_settings.json to migrate package * Remove elastic index creation in api * Move elastic migrations to a separate directory * Remove index_settings from api docker image Co-authored-by: Jackson Harper <jacksonh@gmail.com>
2022-04-29 05:41:06 +00:00
article: Article @deprecated(reason: "article has been replaced with slug")
2022-02-15 18:42:05 +00:00
createdAt: Date!
errorCode: CreateArticleErrorCode
id: ID!
Remove article saving request (#493) * Add state and taskName in elastic page mappings * Add state and taskName in elastic page interface * Create page with PROCESSING state before scrapping * Update createArticleRequest API * Fix tests * Add default state for pages * Update createArticle API * Update save page * Update save file * Update saving item description * Show unable to parse content for failed page * Fix date parsing * Search for not failed pages * Fix tests * Add test for saveUrl * Update get article saving request api * Update get article test * Add test for articleSavingRequest API * Add test for failure * Return new page id if clientRequestId empty * Update clientRequestId in savePage * Update clientRequestId in saveFile * Replace article with slug in articleSavingRequest * Add slug in articleSavingRequest response * Depreciate article * Use slug in web * Remove article and highlight fragments * Query article.slug on Prod * Show unable to parse description for failed page * Fix a bug having duplicate pages when saving the same url multiple times * Add state in response * Rename variables in removeArticle API * Rename state * Add state in response in web * Make state an enum * Open temporary page by link id * Use an empty reader view as the background for loading pages * Progressively load the article page as content is loaded * Add includePending flag in getArticles API * Set includePending = true in web * Add elastic update mappings in migration script * Add elastic mappings in docker image * Move index_settings.json to migrate package * Remove elastic index creation in api * Move elastic migrations to a separate directory * Remove index_settings from api docker image Co-authored-by: Jackson Harper <jacksonh@gmail.com>
2022-04-29 05:41:06 +00:00
slug: String!
status: ArticleSavingRequestStatus!
2023-09-05 09:23:58 +00:00
updatedAt: Date
2023-03-17 03:23:10 +00:00
url: String!
user: User!
userId: ID! @deprecated(reason: "userId has been replaced with user")
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type ArticleSavingRequestError {
errorCodes: [ArticleSavingRequestErrorCode!]!
}
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
enum ArticleSavingRequestErrorCode {
BAD_DATA
2022-02-15 18:42:05 +00:00
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
union ArticleSavingRequestResult = ArticleSavingRequestError | ArticleSavingRequestSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
enum ArticleSavingRequestStatus {
2023-03-03 01:27:38 +00:00
ARCHIVED
CONTENT_NOT_FETCHED
2022-07-29 06:08:35 +00:00
DELETED
FAILED
2022-02-15 18:42:05 +00:00
PROCESSING
SUCCEEDED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type ArticleSavingRequestSuccess {
articleSavingRequest: ArticleSavingRequest!
}
2022-02-11 17:24:33 +00:00
type ArticleSuccess {
article: Article!
}
2022-02-15 18:42:05 +00:00
type ArticlesError {
errorCodes: [ArticlesErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum ArticlesErrorCode {
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
union ArticlesResult = ArticlesError | ArticlesSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type ArticlesSuccess {
edges: [ArticleEdge!]!
pageInfo: PageInfo!
2022-02-11 17:24:33 +00:00
}
type BulkActionError {
errorCodes: [BulkActionErrorCode!]!
}
enum BulkActionErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union BulkActionResult = BulkActionError | BulkActionSuccess
type BulkActionSuccess {
success: Boolean!
}
enum BulkActionType {
2023-06-07 13:50:43 +00:00
ADD_LABELS
ARCHIVE
DELETE
2023-06-07 13:50:43 +00:00
MARK_AS_READ
2024-05-29 09:07:19 +00:00
MARK_AS_SEEN
MOVE_TO_FOLDER
}
2022-02-15 18:42:05 +00:00
enum ContentReader {
2023-04-15 00:22:54 +00:00
EPUB
2022-02-15 18:42:05 +00:00
PDF
WEB
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type CreateArticleError {
errorCodes: [CreateArticleErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum CreateArticleErrorCode {
Rebased version of the elastic PR (#225) * Add elastic to our docker compose * add AND/OR/NOT search operations * add elastic and create article in elastic * change error code when elastic throws error * add search pages in elastic * add search by labels * Add elastic to GitHub Action * Update elastic version * Fix port for elastic * add url in search query * Set elastic features when running tests * add debug logs * Use localhost instead of service hostname * refresh elastic after create/update * update search labels query * add typescript support * search pages in elastic * fix search queries * use elastic for saving page * fix test failure * update getArticle api to use elastic * use generic get page function * add elastic migration python script * fix bulk helper param * save elastic page id in article_saving_request instead of postgres article_id * fix page archiving and deleting * add tests for deleteArticle * remove custom date type in elastic mappings which not exist in older version of elastic * fix timestamp format issue * add tests for save reading progress * add tests for save file * optimize search results * add alias to index * update migration script to receive env var as params * Add failing test to validate we don't decrease reading progress This test is failing with Elastic because we aren't fetching the reading progress from elastic here, and are fetching it from postgres. * Rename readingProgress to readingProgressPercent This is the name stored in elastic, so fixes issues pulling the value out. * Linting * Add failing test for creating highlights w/elastic This test fails because the highlight can't be looked up. Is there a different ID we should be passing in to query for highlights, or do we need to update the query to look for elastic_id? * add tests code coverage threshold * update nyc config * include more files in test coverage * change alias name * update updateContent to update pages in elastic * remove debug log * fix createhighlight test * search pages by alias in elastic * update set labels and delete labels in elastic * migration script enumeration * make BULK_SIZE an env var * fix pdf search indexing * debug github action exit issue * call pubsub when create/update/delete page in elastic * fix json parsing bug and reduce reading data from file * replace a depreciated pubsub api call * debug github action exit issue * debug github action exit issue * add handler to upload elastic page data to GCS * fix tests * Use http_auth instead of basic_auth * add index creation and existing postgres tables update in migration script * fix a typo to connect to elastic * rename readingProgress to readingProgressPercent * migrate elastic_page_id in highlights and article_saving_request tables * update migration script to include number of updated rows * update db migration query * read index mappings from file * fix upload pages to gcs * fix tests failure due to pageContext * fix upload file id not exist error * Handle savedAt & isArchived attributes w/out quering elastic * Fix prettier issues * fix content-type mismatching * revert pageId to linkId because frontend was not deployed yet * fix newsletters and attachment not saved in elastic * put linkId in article for setting labels * exclude orginalHtml in the result of searching to improve performace * exclude content in the result of searching to improve performace * remove score sorting * do not refresh immediately to reduce searching and indexing time * do not replace the backup data in gcs * fix no article id defined in articleSavingRequest * add logging of elastic api running time * reduce home feed pagination size to 15 * reduce home feed pagination size to 10 * stop revalidating first page * do not use a separate api to fetch reading progress * Remove unused comment * get reading progress if not exists * replace ngram tokenizer with standard tokenizer * fix tests * remove .env.local * add sort keyword in searching to sort by score Co-authored-by: Hongbo Wu <hongbo@omnivore.app>
2022-03-16 04:08:59 +00:00
ELASTIC_ERROR
NOT_ALLOWED_TO_PARSE
PAYLOAD_TOO_LARGE
2022-02-15 18:42:05 +00:00
UNABLE_TO_FETCH
UNABLE_TO_PARSE
UNAUTHORIZED
UPLOAD_FILE_MISSING
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input CreateArticleInput {
articleSavingRequestId: ID
folder: String
labels: [CreateLabelInput!]
preparedDocument: PreparedDocumentInput
2023-11-28 09:44:28 +00:00
publishedAt: Date
rssFeedUrl: String
savedAt: Date
2022-02-15 18:42:05 +00:00
skipParsing: Boolean
source: String
state: ArticleSavingRequestStatus
uploadFileId: ID
url: String!
2022-02-11 17:24:33 +00:00
}
union CreateArticleResult = CreateArticleError | CreateArticleSuccess
2022-02-15 18:42:05 +00:00
type CreateArticleSavingRequestError {
errorCodes: [CreateArticleSavingRequestErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum CreateArticleSavingRequestErrorCode {
BAD_DATA
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input CreateArticleSavingRequestInput {
url: String!
2022-02-11 17:24:33 +00:00
}
union CreateArticleSavingRequestResult = CreateArticleSavingRequestError | CreateArticleSavingRequestSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type CreateArticleSavingRequestSuccess {
articleSavingRequest: ArticleSavingRequest!
}
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type CreateArticleSuccess {
created: Boolean!
2022-02-15 18:42:05 +00:00
createdArticle: Article!
user: User!
2022-02-11 17:24:33 +00:00
}
2024-06-10 11:25:58 +00:00
type CreateFolderPolicyError {
errorCodes: [CreateFolderPolicyErrorCode!]!
}
enum CreateFolderPolicyErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
input CreateFolderPolicyInput {
action: FolderPolicyAction!
afterDays: Int!
folder: String!
}
union CreateFolderPolicyResult = CreateFolderPolicyError | CreateFolderPolicySuccess
type CreateFolderPolicySuccess {
policy: FolderPolicy!
}
2022-12-01 10:41:00 +00:00
type CreateGroupError {
errorCodes: [CreateGroupErrorCode!]!
}
enum CreateGroupErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
input CreateGroupInput {
description: String
2022-12-01 10:41:00 +00:00
expiresInDays: Int
maxMembers: Int
name: String!
onlyAdminCanPost: Boolean
onlyAdminCanSeeMembers: Boolean
topics: [String!]
2022-12-01 10:41:00 +00:00
}
union CreateGroupResult = CreateGroupError | CreateGroupSuccess
type CreateGroupSuccess {
group: RecommendationGroup!
}
2022-02-15 18:42:05 +00:00
type CreateHighlightError {
errorCodes: [CreateHighlightErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum CreateHighlightErrorCode {
ALREADY_EXISTS
2022-02-15 18:42:05 +00:00
BAD_DATA
FORBIDDEN
2022-02-15 18:42:05 +00:00
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input CreateHighlightInput {
annotation: String
2022-02-15 18:42:05 +00:00
articleId: ID!
color: String
highlightPositionAnchorIndex: Int
highlightPositionPercent: Float
html: String
id: ID!
2023-03-13 09:14:36 +00:00
patch: String
2022-02-15 18:42:05 +00:00
prefix: String
2023-03-13 09:14:36 +00:00
quote: String
representation: RepresentationType
2022-02-15 18:42:05 +00:00
sharedAt: Date
shortId: String!
suffix: String
2023-03-13 09:14:36 +00:00
type: HighlightType
2022-02-15 18:42:05 +00:00
}
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type CreateHighlightReplyError {
errorCodes: [CreateHighlightReplyErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum CreateHighlightReplyErrorCode {
EMPTY_ANNOTATION
2022-02-15 18:42:05 +00:00
FORBIDDEN
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input CreateHighlightReplyInput {
highlightId: ID!
text: String!
2022-02-11 17:24:33 +00:00
}
union CreateHighlightReplyResult = CreateHighlightReplyError | CreateHighlightReplySuccess
2022-02-15 18:42:05 +00:00
type CreateHighlightReplySuccess {
highlightReply: HighlightReply!
2022-02-11 17:24:33 +00:00
}
union CreateHighlightResult = CreateHighlightError | CreateHighlightSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type CreateHighlightSuccess {
highlight: Highlight!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type CreateLabelError {
errorCodes: [CreateLabelErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum CreateLabelErrorCode {
BAD_REQUEST
2022-02-21 08:53:04 +00:00
LABEL_ALREADY_EXISTS
2022-02-15 18:42:05 +00:00
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input CreateLabelInput {
2023-03-05 14:53:27 +00:00
color: String
2022-02-21 08:53:04 +00:00
description: String
2022-02-15 18:42:05 +00:00
name: String!
2022-02-11 17:24:33 +00:00
}
union CreateLabelResult = CreateLabelError | CreateLabelSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type CreateLabelSuccess {
label: Label!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type CreateNewsletterEmailError {
errorCodes: [CreateNewsletterEmailErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum CreateNewsletterEmailErrorCode {
BAD_REQUEST
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
input CreateNewsletterEmailInput {
description: String
folder: String
name: String
}
union CreateNewsletterEmailResult = CreateNewsletterEmailError | CreateNewsletterEmailSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type CreateNewsletterEmailSuccess {
newsletterEmail: NewsletterEmail!
2022-02-11 17:24:33 +00:00
}
2024-06-15 14:07:32 +00:00
type CreatePostError {
errorCodes: [CreatePostErrorCode!]!
}
enum CreatePostErrorCode {
2024-06-18 08:59:22 +00:00
BAD_REQUEST
2024-06-15 14:07:32 +00:00
UNAUTHORIZED
}
input CreatePostInput {
content: String!
highlightIds: [ID!]
2024-06-18 08:41:58 +00:00
libraryItemIds: [ID!]!
2024-06-15 14:07:32 +00:00
thought: String
thumbnail: String
title: String!
}
union CreatePostResult = CreatePostError | CreatePostSuccess
type CreatePostSuccess {
post: Post!
}
2022-02-15 18:42:05 +00:00
type CreateReactionError {
errorCodes: [CreateReactionErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum CreateReactionErrorCode {
BAD_CODE
BAD_TARGET
FORBIDDEN
2022-02-15 18:42:05 +00:00
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input CreateReactionInput {
code: ReactionType!
2022-02-15 18:42:05 +00:00
highlightId: ID
userArticleId: ID
2022-02-11 17:24:33 +00:00
}
union CreateReactionResult = CreateReactionError | CreateReactionSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type CreateReactionSuccess {
reaction: Reaction!
}
type CreateReminderError {
errorCodes: [CreateReminderErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum CreateReminderErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input CreateReminderInput {
archiveUntil: Boolean!
clientRequestId: ID
linkId: ID
2022-02-15 18:42:05 +00:00
remindAt: Date!
sendNotification: Boolean!
2022-02-11 17:24:33 +00:00
}
union CreateReminderResult = CreateReminderError | CreateReminderSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type CreateReminderSuccess {
reminder: Reminder!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
scalar Date
2022-06-23 00:46:04 +00:00
type DeleteAccountError {
errorCodes: [DeleteAccountErrorCode!]!
}
enum DeleteAccountErrorCode {
FORBIDDEN
UNAUTHORIZED
USER_NOT_FOUND
}
union DeleteAccountResult = DeleteAccountError | DeleteAccountSuccess
type DeleteAccountSuccess {
userID: ID!
}
2024-01-09 10:22:32 +00:00
type DeleteDiscoverArticleError {
errorCodes: [DeleteDiscoverArticleErrorCode!]!
}
enum DeleteDiscoverArticleErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
input DeleteDiscoverArticleInput {
discoverArticleId: ID!
}
union DeleteDiscoverArticleResult = DeleteDiscoverArticleError | DeleteDiscoverArticleSuccess
type DeleteDiscoverArticleSuccess {
id: ID!
}
type DeleteDiscoverFeedError {
errorCodes: [DeleteDiscoverFeedErrorCode!]!
}
enum DeleteDiscoverFeedErrorCode {
BAD_REQUEST
CONFLICT
NOT_FOUND
UNAUTHORIZED
}
input DeleteDiscoverFeedInput {
feedId: ID!
}
union DeleteDiscoverFeedResult = DeleteDiscoverFeedError | DeleteDiscoverFeedSuccess
type DeleteDiscoverFeedSuccess {
id: String!
}
2022-11-30 13:41:59 +00:00
type DeleteFilterError {
errorCodes: [DeleteFilterErrorCode!]!
}
enum DeleteFilterErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
union DeleteFilterResult = DeleteFilterError | DeleteFilterSuccess
type DeleteFilterSuccess {
filter: Filter!
}
2024-06-10 11:25:58 +00:00
type DeleteFolderPolicyError {
errorCodes: [DeleteFolderPolicyErrorCode!]!
}
enum DeleteFolderPolicyErrorCode {
UNAUTHORIZED
}
union DeleteFolderPolicyResult = DeleteFolderPolicyError | DeleteFolderPolicySuccess
type DeleteFolderPolicySuccess {
success: Boolean!
}
2022-02-15 18:42:05 +00:00
type DeleteHighlightError {
errorCodes: [DeleteHighlightErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum DeleteHighlightErrorCode {
FORBIDDEN
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type DeleteHighlightReplyError {
errorCodes: [DeleteHighlightReplyErrorCode!]!
}
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
enum DeleteHighlightReplyErrorCode {
FORBIDDEN
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
union DeleteHighlightReplyResult = DeleteHighlightReplyError | DeleteHighlightReplySuccess
2022-02-15 18:42:05 +00:00
type DeleteHighlightReplySuccess {
highlightReply: HighlightReply!
2022-02-11 17:24:33 +00:00
}
union DeleteHighlightResult = DeleteHighlightError | DeleteHighlightSuccess
2022-02-15 18:42:05 +00:00
type DeleteHighlightSuccess {
highlight: Highlight!
2022-02-11 17:24:33 +00:00
}
type DeleteIntegrationError {
errorCodes: [DeleteIntegrationErrorCode!]!
}
enum DeleteIntegrationErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
union DeleteIntegrationResult = DeleteIntegrationError | DeleteIntegrationSuccess
type DeleteIntegrationSuccess {
integration: Integration!
}
2022-02-15 18:42:05 +00:00
type DeleteLabelError {
errorCodes: [DeleteLabelErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum DeleteLabelErrorCode {
BAD_REQUEST
FORBIDDEN
2022-02-15 18:42:05 +00:00
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
union DeleteLabelResult = DeleteLabelError | DeleteLabelSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type DeleteLabelSuccess {
label: Label!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type DeleteNewsletterEmailError {
errorCodes: [DeleteNewsletterEmailErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum DeleteNewsletterEmailErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
union DeleteNewsletterEmailResult = DeleteNewsletterEmailError | DeleteNewsletterEmailSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type DeleteNewsletterEmailSuccess {
newsletterEmail: NewsletterEmail!
}
2022-02-11 17:24:33 +00:00
2024-06-15 14:07:32 +00:00
type DeletePostError {
errorCodes: [DeletePostErrorCode!]!
}
enum DeletePostErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union DeletePostResult = DeletePostError | DeletePostSuccess
type DeletePostSuccess {
success: Boolean!
}
2022-02-15 18:42:05 +00:00
type DeleteReactionError {
errorCodes: [DeleteReactionErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum DeleteReactionErrorCode {
FORBIDDEN
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
union DeleteReactionResult = DeleteReactionError | DeleteReactionSuccess
2022-02-15 18:42:05 +00:00
type DeleteReactionSuccess {
reaction: Reaction!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type DeleteReminderError {
errorCodes: [DeleteReminderErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum DeleteReminderErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
union DeleteReminderResult = DeleteReminderError | DeleteReminderSuccess
2022-02-15 18:42:05 +00:00
type DeleteReminderSuccess {
reminder: Reminder!
2022-02-11 17:24:33 +00:00
}
2022-10-28 02:43:25 +00:00
type DeleteRuleError {
errorCodes: [DeleteRuleErrorCode!]!
}
enum DeleteRuleErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
union DeleteRuleResult = DeleteRuleError | DeleteRuleSuccess
type DeleteRuleSuccess {
rule: Rule!
}
2022-05-26 03:05:12 +00:00
type DeleteWebhookError {
errorCodes: [DeleteWebhookErrorCode!]!
}
enum DeleteWebhookErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
union DeleteWebhookResult = DeleteWebhookError | DeleteWebhookSuccess
type DeleteWebhookSuccess {
webhook: Webhook!
}
2022-02-15 18:42:05 +00:00
type DeviceToken {
createdAt: Date!
2022-02-15 18:42:05 +00:00
id: ID!
token: String!
2022-02-11 17:24:33 +00:00
}
2022-11-21 09:03:12 +00:00
type DeviceTokensError {
errorCodes: [DeviceTokensErrorCode!]!
}
enum DeviceTokensErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union DeviceTokensResult = DeviceTokensError | DeviceTokensSuccess
type DeviceTokensSuccess {
deviceTokens: [DeviceToken!]!
}
type DigestConfig {
channels: [String]
}
2024-05-14 10:01:18 +00:00
input DigestConfigInput {
channels: [String]
}
enum DirectionalityType {
LTR
RTL
}
2024-01-09 10:22:32 +00:00
type DiscoverFeed {
description: String
id: ID!
image: String
link: String!
title: String!
type: String!
visibleName: String
}
type DiscoverFeedArticle {
author: String
description: String!
feed: String!
id: ID!
image: String
publishedDate: Date
savedId: String
savedLinkUrl: String
siteName: String
slug: String!
title: String!
url: String!
}
type DiscoverFeedError {
errorCodes: [DiscoverFeedErrorCode!]!
}
enum DiscoverFeedErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union DiscoverFeedResult = DiscoverFeedError | DiscoverFeedSuccess
type DiscoverFeedSuccess {
feeds: [DiscoverFeed]!
}
type DiscoverTopic {
description: String!
name: String!
}
type EditDiscoverFeedError {
errorCodes: [EditDiscoverFeedErrorCode!]!
}
enum EditDiscoverFeedErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
input EditDiscoverFeedInput {
feedId: ID!
name: String!
}
union EditDiscoverFeedResult = EditDiscoverFeedError | EditDiscoverFeedSuccess
type EditDiscoverFeedSuccess {
id: ID!
}
type EmptyTrashError {
errorCodes: [EmptyTrashErrorCode!]!
}
enum EmptyTrashErrorCode {
UNAUTHORIZED
}
union EmptyTrashResult = EmptyTrashError | EmptyTrashSuccess
type EmptyTrashSuccess {
success: Boolean
}
enum ErrorCode {
BAD_REQUEST
FORBIDDEN
NOT_FOUND
UNAUTHORIZED
}
type ExportToIntegrationError {
errorCodes: [ExportToIntegrationErrorCode!]!
}
enum ExportToIntegrationErrorCode {
FAILED_TO_CREATE_TASK
UNAUTHORIZED
}
union ExportToIntegrationResult = ExportToIntegrationError | ExportToIntegrationSuccess
type ExportToIntegrationSuccess {
task: Task!
}
2022-11-09 09:35:54 +00:00
type Feature {
createdAt: Date!
expiresAt: Date
grantedAt: Date
id: ID!
name: String!
token: String!
2023-09-05 09:23:58 +00:00
updatedAt: Date
2022-11-09 09:35:54 +00:00
}
2023-10-27 09:54:40 +00:00
type Feed {
author: String
createdAt: Date
2023-10-27 09:54:40 +00:00
description: String
id: ID
2023-10-27 09:54:40 +00:00
image: String
publishedAt: Date
title: String!
type: String
updatedAt: Date
2023-10-27 09:54:40 +00:00
url: String!
}
2022-02-15 18:42:05 +00:00
type FeedArticle {
annotationsCount: Int
2022-02-15 18:42:05 +00:00
article: Article!
highlight: Highlight
highlightsCount: Int
id: ID!
reactions: [Reaction!]!
2022-02-15 18:42:05 +00:00
sharedAt: Date!
sharedBy: User!
2022-02-15 18:42:05 +00:00
sharedComment: String
sharedWithHighlights: Boolean
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type FeedArticleEdge {
cursor: String!
node: FeedArticle!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type FeedArticlesError {
errorCodes: [FeedArticlesErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum FeedArticlesErrorCode {
UNAUTHORIZED
}
2022-02-11 17:24:33 +00:00
union FeedArticlesResult = FeedArticlesError | FeedArticlesSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type FeedArticlesSuccess {
edges: [FeedArticleEdge!]!
pageInfo: PageInfo!
2022-02-11 17:24:33 +00:00
}
2023-10-27 09:54:40 +00:00
type FeedEdge {
cursor: String!
node: Feed!
}
type FeedsError {
errorCodes: [FeedsErrorCode!]!
}
enum FeedsErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
input FeedsInput {
after: String
first: Int
query: String
sort: SortParams
}
2023-10-27 09:54:40 +00:00
union FeedsResult = FeedsError | FeedsSuccess
type FeedsSuccess {
edges: [FeedEdge!]!
pageInfo: PageInfo!
}
2023-12-19 10:05:02 +00:00
type FetchContentError {
errorCodes: [FetchContentErrorCode!]!
}
enum FetchContentErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union FetchContentResult = FetchContentError | FetchContentSuccess
type FetchContentSuccess {
success: Boolean!
}
enum FetchContentType {
ALWAYS
NEVER
WHEN_EMPTY
}
2022-11-30 13:41:59 +00:00
type Filter {
category: String
2022-11-30 13:41:59 +00:00
createdAt: Date!
2023-08-30 17:37:24 +00:00
defaultFilter: Boolean
2022-11-30 13:41:59 +00:00
description: String
filter: String!
2023-12-08 12:03:36 +00:00
folder: String
2022-11-30 13:41:59 +00:00
id: ID!
name: String!
position: Int!
2023-09-05 09:23:58 +00:00
updatedAt: Date
2023-08-30 17:37:24 +00:00
visible: Boolean
2022-11-30 13:41:59 +00:00
}
type FiltersError {
errorCodes: [FiltersErrorCode!]!
}
enum FiltersErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union FiltersResult = FiltersError | FiltersSuccess
type FiltersSuccess {
filters: [Filter!]!
}
2024-06-10 11:25:58 +00:00
type FolderPoliciesError {
errorCodes: [FolderPoliciesErrorCode!]!
}
enum FolderPoliciesErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union FolderPoliciesResult = FolderPoliciesError | FolderPoliciesSuccess
type FolderPoliciesSuccess {
policies: [FolderPolicy!]!
}
type FolderPolicy {
action: FolderPolicyAction!
afterDays: Int!
createdAt: Date!
folder: String!
id: ID!
updatedAt: Date!
}
enum FolderPolicyAction {
ARCHIVE
DELETE
}
type GenerateApiKeyError {
errorCodes: [GenerateApiKeyErrorCode!]!
}
enum GenerateApiKeyErrorCode {
2022-05-27 03:22:50 +00:00
ALREADY_EXISTS
BAD_REQUEST
2022-05-27 03:22:50 +00:00
UNAUTHORIZED
}
input GenerateApiKeyInput {
2022-05-27 03:22:50 +00:00
expiresAt: Date!
name: String!
scopes: [String!]
}
union GenerateApiKeyResult = GenerateApiKeyError | GenerateApiKeySuccess
type GenerateApiKeySuccess {
2022-05-27 10:07:54 +00:00
apiKey: ApiKey!
}
2024-01-09 10:22:32 +00:00
type GetDiscoverFeedArticleError {
errorCodes: [GetDiscoverFeedArticleErrorCode!]!
}
enum GetDiscoverFeedArticleErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
union GetDiscoverFeedArticleResults = GetDiscoverFeedArticleError | GetDiscoverFeedArticleSuccess
type GetDiscoverFeedArticleSuccess {
discoverArticles: [DiscoverFeedArticle]
pageInfo: PageInfo!
}
type GetDiscoverTopicError {
errorCodes: [GetDiscoverTopicErrorCode!]!
}
enum GetDiscoverTopicErrorCode {
UNAUTHORIZED
}
union GetDiscoverTopicResults = GetDiscoverTopicError | GetDiscoverTopicSuccess
type GetDiscoverTopicSuccess {
discoverTopics: [DiscoverTopic!]
}
2022-02-15 18:42:05 +00:00
type GetFollowersError {
errorCodes: [GetFollowersErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum GetFollowersErrorCode {
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
union GetFollowersResult = GetFollowersError | GetFollowersSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type GetFollowersSuccess {
followers: [User!]!
}
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type GetFollowingError {
errorCodes: [GetFollowingErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum GetFollowingErrorCode {
2022-02-11 17:24:33 +00:00
UNAUTHORIZED
}
union GetFollowingResult = GetFollowingError | GetFollowingSuccess
2022-02-15 18:42:05 +00:00
type GetFollowingSuccess {
following: [User!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type GetUserPersonalizationError {
errorCodes: [GetUserPersonalizationErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum GetUserPersonalizationErrorCode {
UNAUTHORIZED
}
2022-02-11 17:24:33 +00:00
union GetUserPersonalizationResult = GetUserPersonalizationError | GetUserPersonalizationSuccess
2022-02-15 18:42:05 +00:00
type GetUserPersonalizationSuccess {
userPersonalization: UserPersonalization
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input GoogleLoginInput {
email: String!
secret: String!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type GoogleSignupError {
errorCodes: [SignupErrorCode]!
}
input GoogleSignupInput {
bio: String
2022-02-15 18:42:05 +00:00
email: String!
name: String!
pictureUrl: String!
secret: String!
2022-02-15 18:42:05 +00:00
sourceUserId: String!
username: String!
2022-02-11 17:24:33 +00:00
}
union GoogleSignupResult = GoogleSignupError | GoogleSignupSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type GoogleSignupSuccess {
me: User!
2022-02-11 17:24:33 +00:00
}
2022-12-02 04:32:26 +00:00
type GroupsError {
errorCodes: [GroupsErrorCode!]!
}
enum GroupsErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union GroupsResult = GroupsError | GroupsSuccess
type GroupsSuccess {
groups: [RecommendationGroup!]!
}
type HiddenHomeSectionError {
errorCodes: [HiddenHomeSectionErrorCode!]!
}
enum HiddenHomeSectionErrorCode {
BAD_REQUEST
PENDING
UNAUTHORIZED
}
union HiddenHomeSectionResult = HiddenHomeSectionError | HiddenHomeSectionSuccess
type HiddenHomeSectionSuccess {
section: HomeSection
}
2022-02-11 17:24:33 +00:00
type Highlight {
annotation: String
color: String
createdAt: Date!
createdByMe: Boolean!
highlightPositionAnchorIndex: Int
highlightPositionPercent: Float
html: String
id: ID!
labels: [Label!]
libraryItem: Article!
2023-03-13 09:14:36 +00:00
patch: String
prefix: String
2023-03-13 09:14:36 +00:00
quote: String
reactions: [Reaction!]!
2022-02-11 17:24:33 +00:00
replies: [HighlightReply!]!
representation: RepresentationType!
2022-02-11 17:24:33 +00:00
sharedAt: Date
shortId: String!
suffix: String
2023-03-13 09:14:36 +00:00
type: HighlightType!
2023-09-05 09:23:58 +00:00
updatedAt: Date
user: User!
2022-02-11 17:24:33 +00:00
}
2024-06-05 12:44:18 +00:00
type HighlightEdge {
cursor: String!
node: Highlight!
}
2022-02-15 18:42:05 +00:00
type HighlightReply {
createdAt: Date!
2022-02-15 18:42:05 +00:00
highlight: Highlight!
id: ID!
2022-02-15 18:42:05 +00:00
text: String!
2023-09-05 09:23:58 +00:00
updatedAt: Date
user: User!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type HighlightStats {
highlightCount: Int!
2022-02-11 17:24:33 +00:00
}
2023-03-13 09:14:36 +00:00
enum HighlightType {
HIGHLIGHT
2023-09-19 07:51:31 +00:00
NOTE
2023-03-13 09:14:36 +00:00
REDACTION
}
2024-06-05 12:44:18 +00:00
type HighlightsError {
errorCodes: [HighlightsErrorCode!]!
}
enum HighlightsErrorCode {
BAD_REQUEST
}
union HighlightsResult = HighlightsError | HighlightsSuccess
type HighlightsSuccess {
edges: [HighlightEdge!]!
pageInfo: PageInfo!
}
2024-05-27 13:11:08 +00:00
type HomeEdge {
cursor: String!
node: HomeSection!
}
type HomeError {
errorCodes: [HomeErrorCode!]!
}
enum HomeErrorCode {
BAD_REQUEST
PENDING
UNAUTHORIZED
}
type HomeItem {
author: String
broadcastCount: Int
canArchive: Boolean
canComment: Boolean
canDelete: Boolean
canMove: Boolean
2024-05-27 13:11:08 +00:00
canSave: Boolean
canShare: Boolean
date: Date!
dir: String
id: ID!
likeCount: Int
previewContent: String
saveCount: Int
score: Float
2024-05-27 13:11:08 +00:00
seen_at: Date
2024-05-29 01:15:15 +00:00
slug: String
2024-05-28 07:02:22 +00:00
source: HomeItemSource
2024-05-27 13:11:08 +00:00
thumbnail: String
title: String!
url: String!
wordCount: Int
}
2024-05-28 06:45:33 +00:00
type HomeItemSource {
icon: String
id: ID
2024-05-30 05:43:12 +00:00
name: String
2024-05-28 06:45:33 +00:00
type: HomeItemSourceType!
url: String
}
enum HomeItemSourceType {
LIBRARY
NEWSLETTER
RECOMMENDATION
RSS
}
2024-05-27 13:11:08 +00:00
union HomeResult = HomeError | HomeSuccess
type HomeSection {
items: [HomeItem!]!
layout: String
thumbnail: String
title: String
}
type HomeSuccess {
edges: [HomeEdge!]!
pageInfo: PageInfo!
}
type ImportFromIntegrationError {
errorCodes: [ImportFromIntegrationErrorCode!]!
}
enum ImportFromIntegrationErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union ImportFromIntegrationResult = ImportFromIntegrationError | ImportFromIntegrationSuccess
type ImportFromIntegrationSuccess {
success: Boolean!
}
enum ImportItemState {
ALL
ARCHIVED
UNARCHIVED
UNREAD
}
type Integration {
createdAt: Date!
enabled: Boolean!
id: ID!
name: String!
settings: JSON
taskName: String
token: String!
type: IntegrationType!
2023-09-05 09:23:58 +00:00
updatedAt: Date
}
2024-03-20 01:45:55 +00:00
type IntegrationError {
errorCodes: [IntegrationErrorCode!]!
}
enum IntegrationErrorCode {
NOT_FOUND
}
union IntegrationResult = IntegrationError | IntegrationSuccess
type IntegrationSuccess {
integration: Integration!
}
enum IntegrationType {
EXPORT
IMPORT
}
type IntegrationsError {
errorCodes: [IntegrationsErrorCode!]!
}
enum IntegrationsErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union IntegrationsResult = IntegrationsError | IntegrationsSuccess
type IntegrationsSuccess {
integrations: [Integration!]!
}
scalar JSON
2022-12-05 04:44:18 +00:00
type JoinGroupError {
errorCodes: [JoinGroupErrorCode!]!
}
enum JoinGroupErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
union JoinGroupResult = JoinGroupError | JoinGroupSuccess
type JoinGroupSuccess {
group: RecommendationGroup!
}
2022-02-15 18:42:05 +00:00
type Label {
2022-02-21 08:53:04 +00:00
color: String!
Rebased version of the elastic PR (#225) * Add elastic to our docker compose * add AND/OR/NOT search operations * add elastic and create article in elastic * change error code when elastic throws error * add search pages in elastic * add search by labels * Add elastic to GitHub Action * Update elastic version * Fix port for elastic * add url in search query * Set elastic features when running tests * add debug logs * Use localhost instead of service hostname * refresh elastic after create/update * update search labels query * add typescript support * search pages in elastic * fix search queries * use elastic for saving page * fix test failure * update getArticle api to use elastic * use generic get page function * add elastic migration python script * fix bulk helper param * save elastic page id in article_saving_request instead of postgres article_id * fix page archiving and deleting * add tests for deleteArticle * remove custom date type in elastic mappings which not exist in older version of elastic * fix timestamp format issue * add tests for save reading progress * add tests for save file * optimize search results * add alias to index * update migration script to receive env var as params * Add failing test to validate we don't decrease reading progress This test is failing with Elastic because we aren't fetching the reading progress from elastic here, and are fetching it from postgres. * Rename readingProgress to readingProgressPercent This is the name stored in elastic, so fixes issues pulling the value out. * Linting * Add failing test for creating highlights w/elastic This test fails because the highlight can't be looked up. Is there a different ID we should be passing in to query for highlights, or do we need to update the query to look for elastic_id? * add tests code coverage threshold * update nyc config * include more files in test coverage * change alias name * update updateContent to update pages in elastic * remove debug log * fix createhighlight test * search pages by alias in elastic * update set labels and delete labels in elastic * migration script enumeration * make BULK_SIZE an env var * fix pdf search indexing * debug github action exit issue * call pubsub when create/update/delete page in elastic * fix json parsing bug and reduce reading data from file * replace a depreciated pubsub api call * debug github action exit issue * debug github action exit issue * add handler to upload elastic page data to GCS * fix tests * Use http_auth instead of basic_auth * add index creation and existing postgres tables update in migration script * fix a typo to connect to elastic * rename readingProgress to readingProgressPercent * migrate elastic_page_id in highlights and article_saving_request tables * update migration script to include number of updated rows * update db migration query * read index mappings from file * fix upload pages to gcs * fix tests failure due to pageContext * fix upload file id not exist error * Handle savedAt & isArchived attributes w/out quering elastic * Fix prettier issues * fix content-type mismatching * revert pageId to linkId because frontend was not deployed yet * fix newsletters and attachment not saved in elastic * put linkId in article for setting labels * exclude orginalHtml in the result of searching to improve performace * exclude content in the result of searching to improve performace * remove score sorting * do not refresh immediately to reduce searching and indexing time * do not replace the backup data in gcs * fix no article id defined in articleSavingRequest * add logging of elastic api running time * reduce home feed pagination size to 15 * reduce home feed pagination size to 10 * stop revalidating first page * do not use a separate api to fetch reading progress * Remove unused comment * get reading progress if not exists * replace ngram tokenizer with standard tokenizer * fix tests * remove .env.local * add sort keyword in searching to sort by score Co-authored-by: Hongbo Wu <hongbo@omnivore.app>
2022-03-16 04:08:59 +00:00
createdAt: Date
2022-02-21 08:53:04 +00:00
description: String
2022-02-15 18:42:05 +00:00
id: ID!
internal: Boolean
2022-02-15 18:42:05 +00:00
name: String!
2022-07-28 13:51:40 +00:00
position: Int
source: String
2022-02-15 18:42:05 +00:00
}
type LabelsError {
errorCodes: [LabelsErrorCode!]!
}
enum LabelsErrorCode {
BAD_REQUEST
2022-02-11 17:24:33 +00:00
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
union LabelsResult = LabelsError | LabelsSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type LabelsSuccess {
labels: [Label!]!
}
2022-02-11 17:24:33 +00:00
2022-12-08 07:32:39 +00:00
type LeaveGroupError {
errorCodes: [LeaveGroupErrorCode!]!
}
enum LeaveGroupErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
union LeaveGroupResult = LeaveGroupError | LeaveGroupSuccess
type LeaveGroupSuccess {
success: Boolean!
}
2022-02-15 18:42:05 +00:00
type Link {
highlightStats: HighlightStats!
2022-02-11 17:24:33 +00:00
id: ID!
page: Page!
2022-02-15 18:42:05 +00:00
postedByViewer: Boolean!
readState: ReadState!
savedAt: Date!
savedBy: User!
savedByViewer: Boolean!
2022-02-15 18:42:05 +00:00
shareInfo: LinkShareInfo!
shareStats: ShareStats!
slug: String!
2023-09-05 09:23:58 +00:00
updatedAt: Date
url: String!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type LinkShareInfo {
description: String!
imageUrl: String!
title: String!
2022-02-11 17:24:33 +00:00
}
type LogOutError {
errorCodes: [LogOutErrorCode!]!
}
enum LogOutErrorCode {
LOG_OUT_FAILED
}
union LogOutResult = LogOutError | LogOutSuccess
type LogOutSuccess {
message: String
}
2022-02-15 18:42:05 +00:00
type LoginError {
errorCodes: [LoginErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum LoginErrorCode {
ACCESS_DENIED
2022-02-15 18:42:05 +00:00
AUTH_FAILED
INVALID_CREDENTIALS
USER_ALREADY_EXISTS
2022-02-15 18:42:05 +00:00
USER_NOT_FOUND
WRONG_SOURCE
2022-02-11 17:24:33 +00:00
}
union LoginResult = LoginError | LoginSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type LoginSuccess {
me: User!
2022-02-11 17:24:33 +00:00
}
type MarkEmailAsItemError {
errorCodes: [MarkEmailAsItemErrorCode!]!
}
enum MarkEmailAsItemErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
union MarkEmailAsItemResult = MarkEmailAsItemError | MarkEmailAsItemSuccess
type MarkEmailAsItemSuccess {
success: Boolean!
}
2022-02-15 18:42:05 +00:00
type MergeHighlightError {
errorCodes: [MergeHighlightErrorCode!]!
}
enum MergeHighlightErrorCode {
ALREADY_EXISTS
2022-02-15 18:42:05 +00:00
BAD_DATA
FORBIDDEN
2022-02-11 17:24:33 +00:00
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input MergeHighlightInput {
annotation: String
2022-02-15 18:42:05 +00:00
articleId: ID!
color: String
highlightPositionAnchorIndex: Int
highlightPositionPercent: Float
html: String
id: ID!
overlapHighlightIdList: [String!]!
2022-02-15 18:42:05 +00:00
patch: String!
prefix: String
quote: String!
representation: RepresentationType
shortId: ID!
2022-02-15 18:42:05 +00:00
suffix: String
2022-02-11 17:24:33 +00:00
}
union MergeHighlightResult = MergeHighlightError | MergeHighlightSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type MergeHighlightSuccess {
2022-02-11 17:24:33 +00:00
highlight: Highlight!
2022-02-15 18:42:05 +00:00
overlapHighlightIdList: [String!]!
2022-02-11 17:24:33 +00:00
}
type MoveFilterError {
errorCodes: [MoveFilterErrorCode!]!
}
enum MoveFilterErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
input MoveFilterInput {
afterFilterId: ID
filterId: ID!
}
union MoveFilterResult = MoveFilterError | MoveFilterSuccess
type MoveFilterSuccess {
filter: Filter!
}
2022-07-28 13:51:40 +00:00
type MoveLabelError {
errorCodes: [MoveLabelErrorCode!]!
}
enum MoveLabelErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
input MoveLabelInput {
afterLabelId: ID
labelId: ID!
}
union MoveLabelResult = MoveLabelError | MoveLabelSuccess
type MoveLabelSuccess {
label: Label!
}
2023-11-10 09:34:46 +00:00
type MoveToFolderError {
errorCodes: [MoveToFolderErrorCode!]!
}
enum MoveToFolderErrorCode {
ALREADY_EXISTS
BAD_REQUEST
UNAUTHORIZED
}
union MoveToFolderResult = MoveToFolderError | MoveToFolderSuccess
type MoveToFolderSuccess {
success: Boolean!
2023-11-10 09:34:46 +00:00
}
2022-02-15 18:42:05 +00:00
type Mutation {
2024-01-09 10:22:32 +00:00
addDiscoverFeed(input: AddDiscoverFeedInput!): AddDiscoverFeedResult!
addPopularRead(name: String!): AddPopularReadResult!
bulkAction(action: BulkActionType!, arguments: JSON, async: Boolean, expectedCount: Int, labelIds: [ID!], query: String!): BulkActionResult!
2022-02-15 18:42:05 +00:00
createArticle(input: CreateArticleInput!): CreateArticleResult!
createArticleSavingRequest(input: CreateArticleSavingRequestInput!): CreateArticleSavingRequestResult!
2024-06-10 11:25:58 +00:00
createFolderPolicy(input: CreateFolderPolicyInput!): CreateFolderPolicyResult!
2022-12-01 10:41:00 +00:00
createGroup(input: CreateGroupInput!): CreateGroupResult!
createHighlight(input: CreateHighlightInput!): CreateHighlightResult!
createLabel(input: CreateLabelInput!): CreateLabelResult!
createNewsletterEmail(input: CreateNewsletterEmailInput): CreateNewsletterEmailResult!
2024-06-15 14:07:32 +00:00
createPost(input: CreatePostInput!): CreatePostResult!
2022-06-23 00:46:04 +00:00
deleteAccount(userID: ID!): DeleteAccountResult!
2024-01-09 10:22:32 +00:00
deleteDiscoverArticle(input: DeleteDiscoverArticleInput!): DeleteDiscoverArticleResult!
deleteDiscoverFeed(input: DeleteDiscoverFeedInput!): DeleteDiscoverFeedResult!
2022-11-30 13:41:59 +00:00
deleteFilter(id: ID!): DeleteFilterResult!
2024-06-10 11:25:58 +00:00
deleteFolderPolicy(id: ID!): DeleteFolderPolicyResult!
deleteHighlight(highlightId: ID!): DeleteHighlightResult!
deleteIntegration(id: ID!): DeleteIntegrationResult!
2022-02-15 18:42:05 +00:00
deleteLabel(id: ID!): DeleteLabelResult!
deleteNewsletterEmail(newsletterEmailId: ID!): DeleteNewsletterEmailResult!
2024-06-15 14:07:32 +00:00
deletePost(id: ID!): DeletePostResult!
2022-10-28 02:43:25 +00:00
deleteRule(id: ID!): DeleteRuleResult!
2022-05-26 03:05:12 +00:00
deleteWebhook(id: ID!): DeleteWebhookResult!
2024-01-09 10:22:32 +00:00
editDiscoverFeed(input: EditDiscoverFeedInput!): EditDiscoverFeedResult!
emptyTrash: EmptyTrashResult!
exportToIntegration(integrationId: ID!): ExportToIntegrationResult!
2023-12-19 10:05:02 +00:00
fetchContent(id: ID!): FetchContentResult!
generateApiKey(input: GenerateApiKeyInput!): GenerateApiKeyResult!
googleLogin(input: GoogleLoginInput!): LoginResult!
googleSignup(input: GoogleSignupInput!): GoogleSignupResult!
importFromIntegration(integrationId: ID!): ImportFromIntegrationResult!
2022-12-05 04:44:18 +00:00
joinGroup(inviteCode: String!): JoinGroupResult!
2022-12-08 07:32:39 +00:00
leaveGroup(groupId: ID!): LeaveGroupResult!
logOut: LogOutResult!
markEmailAsItem(recentEmailId: ID!): MarkEmailAsItemResult!
mergeHighlight(input: MergeHighlightInput!): MergeHighlightResult!
moveFilter(input: MoveFilterInput!): MoveFilterResult!
2022-07-28 13:51:40 +00:00
moveLabel(input: MoveLabelInput!): MoveLabelResult!
2023-11-10 09:34:46 +00:00
moveToFolder(folder: String!, id: ID!): MoveToFolderResult!
2022-11-09 09:35:54 +00:00
optInFeature(input: OptInFeatureInput!): OptInFeatureResult!
2022-12-02 11:45:26 +00:00
recommend(input: RecommendInput!): RecommendResult!
2022-12-08 03:37:35 +00:00
recommendHighlights(input: RecommendHighlightsInput!): RecommendHighlightsResult!
2024-05-29 09:24:37 +00:00
refreshHome: RefreshHomeResult!
2024-04-09 03:16:20 +00:00
replyToEmail(recentEmailId: ID!, reply: AllowedReply!): ReplyToEmailResult!
reportItem(input: ReportItemInput!): ReportItemResult!
2022-05-27 10:07:54 +00:00
revokeApiKey(id: ID!): RevokeApiKeyResult!
saveArticleReadingProgress(input: SaveArticleReadingProgressInput!): SaveArticleReadingProgressResult!
2024-01-09 10:22:32 +00:00
saveDiscoverArticle(input: SaveDiscoverArticleInput!): SaveDiscoverArticleResult!
saveFile(input: SaveFileInput!): SaveResult!
2022-11-30 13:41:59 +00:00
saveFilter(input: SaveFilterInput!): SaveFilterResult!
savePage(input: SavePageInput!): SaveResult!
saveUrl(input: SaveUrlInput!): SaveResult!
setBookmarkArticle(input: SetBookmarkArticleInput!): SetBookmarkArticleResult!
setDeviceToken(input: SetDeviceTokenInput!): SetDeviceTokenResult!
setFavoriteArticle(id: ID!): SetFavoriteArticleResult!
setIntegration(input: SetIntegrationInput!): SetIntegrationResult!
2022-02-22 09:00:15 +00:00
setLabels(input: SetLabelsInput!): SetLabelsResult!
setLabelsForHighlight(input: SetLabelsForHighlightInput!): SetLabelsResult!
setLinkArchived(input: ArchiveLinkInput!): ArchiveLinkResult!
2022-10-28 02:43:25 +00:00
setRule(input: SetRuleInput!): SetRuleResult!
setUserPersonalization(input: SetUserPersonalizationInput!): SetUserPersonalizationResult!
2022-05-25 13:34:03 +00:00
setWebhook(input: SetWebhookInput!): SetWebhookResult!
subscribe(input: SubscribeInput!): SubscribeResult!
unsubscribe(name: String!, subscriptionId: ID): UnsubscribeResult!
2023-10-02 14:21:50 +00:00
updateEmail(input: UpdateEmailInput!): UpdateEmailResult!
2023-08-30 17:37:24 +00:00
updateFilter(input: UpdateFilterInput!): UpdateFilterResult!
2024-06-10 11:25:58 +00:00
updateFolderPolicy(input: UpdateFolderPolicyInput!): UpdateFolderPolicyResult!
updateHighlight(input: UpdateHighlightInput!): UpdateHighlightResult!
2022-03-30 12:24:29 +00:00
updateLabel(input: UpdateLabelInput!): UpdateLabelResult!
2023-12-20 03:29:10 +00:00
updateNewsletterEmail(input: UpdateNewsletterEmailInput!): UpdateNewsletterEmailResult!
2022-05-24 07:04:54 +00:00
updatePage(input: UpdatePageInput!): UpdatePageResult!
2024-06-15 14:07:32 +00:00
updatePost(input: UpdatePostInput!): UpdatePostResult!
2023-07-10 07:24:33 +00:00
updateSubscription(input: UpdateSubscriptionInput!): UpdateSubscriptionResult!
updateUser(input: UpdateUserInput!): UpdateUserResult!
updateUserProfile(input: UpdateUserProfileInput!): UpdateUserProfileResult!
uploadFileRequest(input: UploadFileRequestInput!): UploadFileRequestResult!
uploadImportFile(contentType: String!, type: UploadImportFileType!): UploadImportFileResult!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type NewsletterEmail {
address: String!
confirmationCode: String
createdAt: Date!
description: String
folder: String!
id: ID!
name: String
subscriptionCount: Int!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type NewsletterEmailsError {
errorCodes: [NewsletterEmailsErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum NewsletterEmailsErrorCode {
BAD_REQUEST
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
union NewsletterEmailsResult = NewsletterEmailsError | NewsletterEmailsSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type NewsletterEmailsSuccess {
newsletterEmails: [NewsletterEmail!]!
2022-02-11 17:24:33 +00:00
}
2022-11-09 09:35:54 +00:00
type OptInFeatureError {
errorCodes: [OptInFeatureErrorCode!]!
}
enum OptInFeatureErrorCode {
BAD_REQUEST
INELIGIBLE
2022-11-09 09:35:54 +00:00
NOT_FOUND
}
input OptInFeatureInput {
name: String!
}
union OptInFeatureResult = OptInFeatureError | OptInFeatureSuccess
type OptInFeatureSuccess {
feature: Feature!
}
2022-02-15 18:42:05 +00:00
type Page {
author: String
createdAt: Date!
description: String
hash: String!
id: ID!
image: String!
2022-02-15 18:42:05 +00:00
originalHtml: String!
originalUrl: String!
publishedAt: Date
2022-02-15 18:42:05 +00:00
readableHtml: String!
title: String!
type: PageType!
2023-09-05 09:23:58 +00:00
updatedAt: Date
url: String!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type PageInfo {
endCursor: String
2022-02-15 18:42:05 +00:00
hasNextPage: Boolean!
hasPreviousPage: Boolean!
startCursor: String
totalCount: Int
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input PageInfoInput {
author: String
canonicalUrl: String
contentType: String
2022-02-15 18:42:05 +00:00
description: String
previewImage: String
publishedAt: Date
title: String
2022-02-15 18:42:05 +00:00
}
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
enum PageType {
ARTICLE
BOOK
FILE
HIGHLIGHTS
2023-04-12 04:15:53 +00:00
IMAGE
2022-02-15 18:42:05 +00:00
PROFILE
2023-04-12 03:53:23 +00:00
TWEET
2022-02-15 18:42:05 +00:00
UNKNOWN
2023-04-12 03:53:23 +00:00
VIDEO
WEBSITE
2022-02-11 17:24:33 +00:00
}
input ParseResult {
byline: String
content: String!
dir: String
excerpt: String!
language: String
length: Int!
previewImage: String
publishedDate: Date
siteIcon: String
siteName: String
textContent: String!
title: String!
}
2024-06-15 14:07:32 +00:00
type Post {
2024-06-18 08:59:22 +00:00
author: String!
2024-06-15 14:07:32 +00:00
content: String!
createdAt: Date!
highlights: [Highlight!]
id: ID!
2024-06-18 08:59:22 +00:00
libraryItems: [Article!]
2024-06-15 14:07:32 +00:00
ownedByViewer: Boolean!
thought: String
thumbnail: String
title: String!
updatedAt: Date!
}
type PostEdge {
cursor: String!
node: Post!
}
type PostError {
errorCodes: [PostErrorCode!]!
}
enum PostErrorCode {
BAD_REQUEST
2024-06-18 07:07:38 +00:00
NOT_FOUND
2024-06-15 14:07:32 +00:00
UNAUTHORIZED
}
union PostResult = PostError | PostSuccess
type PostSuccess {
post: Post!
}
type PostsError {
errorCodes: [PostsErrorCode!]!
}
enum PostsErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union PostsResult = PostsError | PostsSuccess
type PostsSuccess {
edges: [PostEdge!]!
pageInfo: PageInfo!
}
2022-02-15 18:42:05 +00:00
input PreparedDocumentInput {
document: String!
pageInfo: PageInfoInput!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type Profile {
bio: String
id: ID!
2022-02-15 18:42:05 +00:00
pictureUrl: String
private: Boolean!
username: String!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type Query {
2022-05-27 04:44:41 +00:00
apiKeys: ApiKeysResult!
2023-01-05 04:12:48 +00:00
article(format: String, slug: String!, username: String!): ArticleResult!
articleSavingRequest(id: ID, url: String): ArticleSavingRequestResult!
2022-11-21 09:03:12 +00:00
deviceTokens: DeviceTokensResult!
2024-01-09 10:22:32 +00:00
discoverFeeds: DiscoverFeedResult!
discoverTopics: GetDiscoverTopicResults!
feeds(input: FeedsInput!): FeedsResult!
2022-11-30 13:41:59 +00:00
filters: FiltersResult!
2024-06-10 11:25:58 +00:00
folderPolicies: FolderPoliciesResult!
2024-01-09 10:22:32 +00:00
getDiscoverFeedArticles(after: String, discoverTopicId: String!, feedId: ID, first: Int): GetDiscoverFeedArticleResults!
2022-02-15 18:42:05 +00:00
getUserPersonalization: GetUserPersonalizationResult!
2022-12-02 04:32:26 +00:00
groups: GroupsResult!
hello: String
hiddenHomeSection: HiddenHomeSectionResult!
2024-06-05 12:44:18 +00:00
highlights(after: String, first: Int, query: String): HighlightsResult!
2024-05-27 13:11:08 +00:00
home(after: String, first: Int): HomeResult!
2024-03-20 02:15:49 +00:00
integration(name: String!): IntegrationResult!
integrations: IntegrationsResult!
2022-02-21 08:53:04 +00:00
labels: LabelsResult!
me: User
2022-02-15 18:42:05 +00:00
newsletterEmails: NewsletterEmailsResult!
2024-06-15 14:07:32 +00:00
post(id: ID!): PostResult!
posts(after: String, first: Int, userId: ID!): PostsResult!
2023-01-17 09:40:30 +00:00
recentEmails: RecentEmailsResult!
2022-10-11 06:53:48 +00:00
recentSearches: RecentSearchesResult!
2022-11-21 07:03:15 +00:00
rules(enabled: Boolean): RulesResult!
scanFeeds(input: ScanFeedsInput!): ScanFeedsResult!
search(after: String, first: Int, format: String, includeContent: Boolean, query: String): SearchResult!
2022-06-04 14:12:59 +00:00
sendInstallInstructions: SendInstallInstructionsResult!
subscription(id: ID!): SubscriptionResult!
subscriptions(sort: SortParams, type: SubscriptionType): SubscriptionsResult!
2022-07-13 02:46:03 +00:00
typeaheadSearch(first: Int, query: String!): TypeaheadSearchResult!
2023-11-17 03:06:44 +00:00
updatesSince(after: String, first: Int, folder: String, since: Date!, sort: SortParams): UpdatesSinceResult!
user(userId: ID, username: String): UserResult!
users: UsersResult!
validateUsername(username: String!): Boolean!
2022-05-26 03:05:12 +00:00
webhook(id: ID!): WebhookResult!
webhooks: WebhooksResult!
2022-02-15 18:42:05 +00:00
}
2022-02-11 17:24:33 +00:00
type Reaction {
code: ReactionType!
createdAt: Date!
id: ID!
2022-02-11 17:24:33 +00:00
updatedAt: Date
user: User!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum ReactionType {
CRYING
2022-02-15 18:42:05 +00:00
HEART
HUSHED
LIKE
2022-02-15 18:42:05 +00:00
POUT
SMILE
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type ReadState {
progressAnchorIndex: Int!
progressPercent: Float!
2022-02-15 18:42:05 +00:00
reading: Boolean
readingTime: Int
2022-02-11 17:24:33 +00:00
}
2023-01-17 09:40:30 +00:00
type RecentEmail {
createdAt: Date!
from: String!
html: String
id: ID!
2024-04-09 03:16:20 +00:00
reply: String
replyTo: String
2023-01-17 09:40:30 +00:00
subject: String!
text: String!
to: String!
type: String!
}
type RecentEmailsError {
errorCodes: [RecentEmailsErrorCode!]!
}
enum RecentEmailsErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union RecentEmailsResult = RecentEmailsError | RecentEmailsSuccess
type RecentEmailsSuccess {
recentEmails: [RecentEmail!]!
}
2022-10-11 06:53:48 +00:00
type RecentSearch {
createdAt: Date!
id: ID!
term: String!
}
type RecentSearchesError {
errorCodes: [RecentSearchesErrorCode!]!
}
enum RecentSearchesErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union RecentSearchesResult = RecentSearchesError | RecentSearchesSuccess
type RecentSearchesSuccess {
searches: [RecentSearch!]!
}
2022-12-02 11:45:26 +00:00
type RecommendError {
errorCodes: [RecommendErrorCode!]!
}
enum RecommendErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
2022-12-08 03:37:35 +00:00
type RecommendHighlightsError {
errorCodes: [RecommendHighlightsErrorCode!]!
}
enum RecommendHighlightsErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
input RecommendHighlightsInput {
groupIds: [ID!]!
highlightIds: [ID!]!
note: String
pageId: ID!
}
union RecommendHighlightsResult = RecommendHighlightsError | RecommendHighlightsSuccess
type RecommendHighlightsSuccess {
success: Boolean!
}
2022-12-02 11:45:26 +00:00
input RecommendInput {
groupIds: [ID!]!
note: String
2022-12-02 11:45:26 +00:00
pageId: ID!
2022-12-08 03:37:35 +00:00
recommendedWithHighlights: Boolean
2022-12-02 11:45:26 +00:00
}
union RecommendResult = RecommendError | RecommendSuccess
type RecommendSuccess {
2022-12-08 03:37:35 +00:00
success: Boolean!
2022-12-02 11:45:26 +00:00
}
2022-12-05 06:27:46 +00:00
type Recommendation {
id: ID!
name: String!
note: String
2022-12-05 06:27:46 +00:00
recommendedAt: Date!
user: RecommendingUser
2022-12-05 06:27:46 +00:00
}
2022-12-01 10:41:00 +00:00
type RecommendationGroup {
admins: [User!]!
canPost: Boolean!
canSeeMembers: Boolean!
2022-12-01 10:41:00 +00:00
createdAt: Date!
description: String
2022-12-01 10:41:00 +00:00
id: ID!
inviteUrl: String!
members: [User!]!
name: String!
topics: [String!]
2023-09-05 09:23:58 +00:00
updatedAt: Date
2022-12-01 10:41:00 +00:00
}
type RecommendingUser {
name: String!
profileImageURL: String
userId: String!
username: String!
}
2024-05-29 09:24:37 +00:00
type RefreshHomeError {
errorCodes: [RefreshHomeErrorCode!]!
}
enum RefreshHomeErrorCode {
PENDING
}
union RefreshHomeResult = RefreshHomeError | RefreshHomeSuccess
type RefreshHomeSuccess {
success: Boolean!
}
2022-02-15 18:42:05 +00:00
type Reminder {
archiveUntil: Boolean!
id: ID!
2022-02-15 18:42:05 +00:00
remindAt: Date!
sendNotification: Boolean!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type ReminderError {
errorCodes: [ReminderErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum ReminderErrorCode {
BAD_REQUEST
2022-02-11 17:24:33 +00:00
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
union ReminderResult = ReminderError | ReminderSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type ReminderSuccess {
reminder: Reminder!
2022-02-11 17:24:33 +00:00
}
type ReplyToEmailError {
errorCodes: [ReplyToEmailErrorCode!]!
}
enum ReplyToEmailErrorCode {
UNAUTHORIZED
}
union ReplyToEmailResult = ReplyToEmailError | ReplyToEmailSuccess
type ReplyToEmailSuccess {
success: Boolean!
}
2022-02-15 18:42:05 +00:00
input ReportItemInput {
itemUrl: String!
pageId: ID!
2022-02-15 18:42:05 +00:00
reportComment: String!
reportTypes: [ReportType!]!
sharedBy: ID
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type ReportItemResult {
message: String!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum ReportType {
ABUSIVE
CONTENT_DISPLAY
CONTENT_VIOLATION
SPAM
2022-02-11 17:24:33 +00:00
}
enum RepresentationType {
CONTENT
FEED_CONTENT
}
2022-05-27 10:07:54 +00:00
type RevokeApiKeyError {
errorCodes: [RevokeApiKeyErrorCode!]!
}
enum RevokeApiKeyErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
union RevokeApiKeyResult = RevokeApiKeyError | RevokeApiKeySuccess
type RevokeApiKeySuccess {
apiKey: ApiKey!
}
2022-10-28 02:43:25 +00:00
type Rule {
actions: [RuleAction!]!
createdAt: Date!
2022-11-16 01:26:06 +00:00
enabled: Boolean!
eventTypes: [RuleEventType!]!
failedAt: Date
2022-11-18 06:33:27 +00:00
filter: String!
2022-10-28 02:43:25 +00:00
id: ID!
name: String!
2023-09-05 09:23:58 +00:00
updatedAt: Date
2022-10-28 02:43:25 +00:00
}
type RuleAction {
2022-11-17 10:53:05 +00:00
params: [String!]!
2022-10-28 02:43:25 +00:00
type: RuleActionType!
}
input RuleActionInput {
2022-11-17 10:53:05 +00:00
params: [String!]!
2022-10-28 02:43:25 +00:00
type: RuleActionType!
}
enum RuleActionType {
ADD_LABEL
ARCHIVE
2024-02-23 06:41:46 +00:00
DELETE
2024-03-22 04:17:26 +00:00
EXPORT
2022-10-28 02:43:25 +00:00
MARK_AS_READ
SEND_NOTIFICATION
2024-03-21 10:13:42 +00:00
WEBHOOK
2022-10-28 02:43:25 +00:00
}
enum RuleEventType {
2024-03-21 10:13:42 +00:00
HIGHLIGHT_CREATED
2024-03-23 05:56:56 +00:00
HIGHLIGHT_UPDATED
2024-03-21 10:13:42 +00:00
LABEL_CREATED
PAGE_CREATED
PAGE_UPDATED
}
2022-10-28 02:43:25 +00:00
type RulesError {
errorCodes: [RulesErrorCode!]!
}
enum RulesErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union RulesResult = RulesError | RulesSuccess
type RulesSuccess {
rules: [Rule!]!
}
2022-02-15 18:42:05 +00:00
type SaveArticleReadingProgressError {
errorCodes: [SaveArticleReadingProgressErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum SaveArticleReadingProgressErrorCode {
BAD_DATA
NOT_FOUND
2022-02-11 17:24:33 +00:00
UNAUTHORIZED
}
2022-02-15 18:42:05 +00:00
input SaveArticleReadingProgressInput {
force: Boolean
2022-02-15 18:42:05 +00:00
id: ID!
readingProgressAnchorIndex: Int
readingProgressPercent: Float!
readingProgressTopPercent: Float
2022-02-11 17:24:33 +00:00
}
union SaveArticleReadingProgressResult = SaveArticleReadingProgressError | SaveArticleReadingProgressSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type SaveArticleReadingProgressSuccess {
updatedArticle: Article!
2022-02-11 17:24:33 +00:00
}
2024-01-09 10:22:32 +00:00
type SaveDiscoverArticleError {
errorCodes: [SaveDiscoverArticleErrorCode!]!
}
enum SaveDiscoverArticleErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
input SaveDiscoverArticleInput {
discoverArticleId: ID!
locale: String
timezone: String
}
union SaveDiscoverArticleResult = SaveDiscoverArticleError | SaveDiscoverArticleSuccess
type SaveDiscoverArticleSuccess {
saveId: String!
url: String!
}
2022-02-15 18:42:05 +00:00
type SaveError {
errorCodes: [SaveErrorCode!]!
message: String
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum SaveErrorCode {
EMBEDDED_HIGHLIGHT_FAILED
2022-02-15 18:42:05 +00:00
UNAUTHORIZED
UNKNOWN
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input SaveFileInput {
clientRequestId: ID!
folder: String
2023-03-06 06:34:50 +00:00
labels: [CreateLabelInput!]
publishedAt: Date
savedAt: Date
source: String!
2023-03-06 06:34:50 +00:00
state: ArticleSavingRequestStatus
subscription: String
2022-02-15 18:42:05 +00:00
uploadFileId: ID!
url: String!
2022-02-11 17:24:33 +00:00
}
2022-11-30 13:41:59 +00:00
type SaveFilterError {
errorCodes: [SaveFilterErrorCode!]!
}
enum SaveFilterErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
input SaveFilterInput {
category: String
2022-11-30 13:41:59 +00:00
description: String
filter: String!
folder: String
2022-11-30 13:41:59 +00:00
name: String!
2023-08-30 17:37:24 +00:00
position: Int
2022-11-30 13:41:59 +00:00
}
union SaveFilterResult = SaveFilterError | SaveFilterSuccess
type SaveFilterSuccess {
filter: Filter!
}
2022-02-15 18:42:05 +00:00
input SavePageInput {
clientRequestId: ID!
folder: String
2023-03-05 14:53:27 +00:00
labels: [CreateLabelInput!]
2022-02-15 18:42:05 +00:00
originalContent: String!
parseResult: ParseResult
publishedAt: Date
2023-07-11 05:14:43 +00:00
rssFeedUrl: String
savedAt: Date
source: String!
2023-03-03 01:27:38 +00:00
state: ArticleSavingRequestStatus
title: String
url: String!
2022-02-11 17:24:33 +00:00
}
union SaveResult = SaveError | SaveSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type SaveSuccess {
clientRequestId: ID!
url: String!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input SaveUrlInput {
clientRequestId: ID!
folder: String
2023-03-06 06:34:50 +00:00
labels: [CreateLabelInput!]
locale: String
publishedAt: Date
savedAt: Date
source: String!
2023-03-06 06:34:50 +00:00
state: ArticleSavingRequestStatus
timezone: String
url: String!
2022-02-11 17:24:33 +00:00
}
type ScanFeedsError {
errorCodes: [ScanFeedsErrorCode!]!
}
enum ScanFeedsErrorCode {
BAD_REQUEST
}
input ScanFeedsInput {
opml: String
url: String
}
union ScanFeedsResult = ScanFeedsError | ScanFeedsSuccess
type ScanFeedsSuccess {
feeds: [Feed!]!
}
type SearchError {
errorCodes: [SearchErrorCode!]!
}
enum SearchErrorCode {
2023-04-06 04:03:26 +00:00
QUERY_TOO_LONG
UNAUTHORIZED
}
type SearchItem {
aiSummary: String
2023-11-08 04:54:16 +00:00
annotation: String
archivedAt: Date
author: String
2023-11-08 04:54:16 +00:00
color: String
content: String
contentReader: ContentReader!
createdAt: Date!
description: String
directionality: DirectionalityType
feedContent: String
folder: String!
2024-04-26 03:07:41 +00:00
format: String
2022-06-28 01:53:48 +00:00
highlights: [Highlight!]
id: ID!
image: String
isArchived: Boolean!
labels: [Label!]
2022-05-23 07:31:11 +00:00
language: String
links: JSON
originalArticleUrl: String
ownedByViewer: Boolean
2023-11-08 04:54:16 +00:00
pageId: ID
pageType: PageType!
previewContentType: String
publishedAt: Date
2023-11-08 04:54:16 +00:00
quote: String
2022-06-04 14:12:59 +00:00
readAt: Date
readingProgressAnchorIndex: Int!
readingProgressPercent: Float!
readingProgressTopPercent: Float
recommendations: [Recommendation!]
savedAt: Date!
2024-05-29 07:07:22 +00:00
score: Float
2024-05-29 09:24:37 +00:00
seenAt: Date
2023-11-08 04:54:16 +00:00
shortId: String
2022-09-28 11:02:29 +00:00
siteIcon: String
2022-05-12 02:30:47 +00:00
siteName: String
slug: String!
Remove article saving request (#493) * Add state and taskName in elastic page mappings * Add state and taskName in elastic page interface * Create page with PROCESSING state before scrapping * Update createArticleRequest API * Fix tests * Add default state for pages * Update createArticle API * Update save page * Update save file * Update saving item description * Show unable to parse content for failed page * Fix date parsing * Search for not failed pages * Fix tests * Add test for saveUrl * Update get article saving request api * Update get article test * Add test for articleSavingRequest API * Add test for failure * Return new page id if clientRequestId empty * Update clientRequestId in savePage * Update clientRequestId in saveFile * Replace article with slug in articleSavingRequest * Add slug in articleSavingRequest response * Depreciate article * Use slug in web * Remove article and highlight fragments * Query article.slug on Prod * Show unable to parse description for failed page * Fix a bug having duplicate pages when saving the same url multiple times * Add state in response * Rename variables in removeArticle API * Rename state * Add state in response in web * Make state an enum * Open temporary page by link id * Use an empty reader view as the background for loading pages * Progressively load the article page as content is loaded * Add includePending flag in getArticles API * Set includePending = true in web * Add elastic update mappings in migration script * Add elastic mappings in docker image * Move index_settings.json to migrate package * Remove elastic index creation in api * Move elastic migrations to a separate directory * Remove index_settings from api docker image Co-authored-by: Jackson Harper <jacksonh@gmail.com>
2022-04-29 05:41:06 +00:00
state: ArticleSavingRequestStatus
subscription: String
title: String!
2023-11-08 04:54:16 +00:00
unsubHttpUrl: String
unsubMailTo: String
2022-06-17 09:07:13 +00:00
updatedAt: Date
uploadFileId: ID
url: String!
2023-01-02 08:49:11 +00:00
wordsCount: Int
}
type SearchItemEdge {
cursor: String!
node: SearchItem!
}
union SearchResult = SearchError | SearchSuccess
type SearchSuccess {
edges: [SearchItemEdge!]!
pageInfo: PageInfo!
}
2022-05-30 12:29:49 +00:00
type SendInstallInstructionsError {
errorCodes: [SendInstallInstructionsErrorCode!]!
}
enum SendInstallInstructionsErrorCode {
BAD_REQUEST
FORBIDDEN
NOT_FOUND
UNAUTHORIZED
}
union SendInstallInstructionsResult = SendInstallInstructionsError | SendInstallInstructionsSuccess
type SendInstallInstructionsSuccess {
sent: Boolean!
}
2022-02-15 18:42:05 +00:00
type SetBookmarkArticleError {
errorCodes: [SetBookmarkArticleErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum SetBookmarkArticleErrorCode {
BOOKMARK_EXISTS
NOT_FOUND
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input SetBookmarkArticleInput {
articleID: ID!
bookmark: Boolean!
2022-02-11 17:24:33 +00:00
}
union SetBookmarkArticleResult = SetBookmarkArticleError | SetBookmarkArticleSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type SetBookmarkArticleSuccess {
bookmarkedArticle: Article!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type SetDeviceTokenError {
errorCodes: [SetDeviceTokenErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum SetDeviceTokenErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input SetDeviceTokenInput {
id: ID
token: String
2022-02-11 17:24:33 +00:00
}
union SetDeviceTokenResult = SetDeviceTokenError | SetDeviceTokenSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type SetDeviceTokenSuccess {
deviceToken: DeviceToken!
2022-02-11 17:24:33 +00:00
}
type SetFavoriteArticleError {
errorCodes: [SetFavoriteArticleErrorCode!]!
}
enum SetFavoriteArticleErrorCode {
2023-06-09 10:58:41 +00:00
ALREADY_EXISTS
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
union SetFavoriteArticleResult = SetFavoriteArticleError | SetFavoriteArticleSuccess
type SetFavoriteArticleSuccess {
2023-09-04 07:31:11 +00:00
success: Boolean!
}
2022-02-15 18:42:05 +00:00
type SetFollowError {
errorCodes: [SetFollowErrorCode!]!
}
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
enum SetFollowErrorCode {
2022-02-11 17:24:33 +00:00
NOT_FOUND
2022-02-15 18:42:05 +00:00
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input SetFollowInput {
follow: Boolean!
userId: ID!
2022-02-11 17:24:33 +00:00
}
union SetFollowResult = SetFollowError | SetFollowSuccess
2022-02-15 18:42:05 +00:00
type SetFollowSuccess {
updatedUser: User!
2022-02-11 17:24:33 +00:00
}
type SetIntegrationError {
errorCodes: [SetIntegrationErrorCode!]!
}
enum SetIntegrationErrorCode {
ALREADY_EXISTS
BAD_REQUEST
INVALID_TOKEN
NOT_FOUND
UNAUTHORIZED
}
input SetIntegrationInput {
enabled: Boolean!
id: ID
importItemState: ImportItemState
name: String!
settings: JSON
syncedAt: Date
2023-11-17 03:25:59 +00:00
taskName: String
token: String!
type: IntegrationType
}
union SetIntegrationResult = SetIntegrationError | SetIntegrationSuccess
type SetIntegrationSuccess {
integration: Integration!
}
2022-02-22 09:00:15 +00:00
type SetLabelsError {
errorCodes: [SetLabelsErrorCode!]!
}
enum SetLabelsErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
input SetLabelsForHighlightInput {
highlightId: ID!
labelIds: [ID!]
labels: [CreateLabelInput!]
}
2022-02-22 09:00:15 +00:00
input SetLabelsInput {
labelIds: [ID!]
labels: [CreateLabelInput!]
pageId: ID!
source: String
2022-02-22 09:00:15 +00:00
}
union SetLabelsResult = SetLabelsError | SetLabelsSuccess
type SetLabelsSuccess {
labels: [Label!]!
}
2022-10-28 02:43:25 +00:00
type SetRuleError {
errorCodes: [SetRuleErrorCode!]!
}
enum SetRuleErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
input SetRuleInput {
actions: [RuleActionInput!]!
2022-11-17 10:53:05 +00:00
description: String
2022-11-16 01:26:06 +00:00
enabled: Boolean!
eventTypes: [RuleEventType!]!
2022-11-18 06:33:27 +00:00
filter: String!
2022-10-28 02:43:25 +00:00
id: ID
name: String!
2022-10-28 02:43:25 +00:00
}
union SetRuleResult = SetRuleError | SetRuleSuccess
type SetRuleSuccess {
rule: Rule!
}
2022-02-15 18:42:05 +00:00
type SetShareArticleError {
errorCodes: [SetShareArticleErrorCode!]!
}
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
enum SetShareArticleErrorCode {
NOT_FOUND
2022-02-11 17:24:33 +00:00
UNAUTHORIZED
}
2022-02-15 18:42:05 +00:00
input SetShareArticleInput {
articleID: ID!
share: Boolean!
sharedComment: String
sharedWithHighlights: Boolean
2022-02-11 17:24:33 +00:00
}
union SetShareArticleResult = SetShareArticleError | SetShareArticleSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type SetShareArticleSuccess {
updatedArticle: Article!
updatedFeedArticle: FeedArticle
updatedFeedArticleId: String
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type SetShareHighlightError {
errorCodes: [SetShareHighlightErrorCode!]!
}
2022-02-11 17:24:33 +00:00
enum SetShareHighlightErrorCode {
FORBIDDEN
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input SetShareHighlightInput {
id: ID!
share: Boolean!
2022-02-11 17:24:33 +00:00
}
union SetShareHighlightResult = SetShareHighlightError | SetShareHighlightSuccess
2022-02-15 18:42:05 +00:00
2022-02-11 17:24:33 +00:00
type SetShareHighlightSuccess {
highlight: Highlight!
}
2022-02-15 18:42:05 +00:00
type SetUserPersonalizationError {
errorCodes: [SetUserPersonalizationErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum SetUserPersonalizationErrorCode {
2022-11-11 08:11:09 +00:00
NOT_FOUND
2022-02-15 18:42:05 +00:00
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input SetUserPersonalizationInput {
2024-05-14 10:01:18 +00:00
digestConfig: DigestConfigInput
fields: JSON
2022-02-15 18:42:05 +00:00
fontFamily: String
fontSize: Int
2022-02-15 18:42:05 +00:00
libraryLayoutType: String
librarySortOrder: SortOrder
margin: Int
2022-11-11 07:24:54 +00:00
speechRate: String
speechSecondaryVoice: String
speechVoice: String
speechVolume: String
theme: String
2022-02-11 17:24:33 +00:00
}
union SetUserPersonalizationResult = SetUserPersonalizationError | SetUserPersonalizationSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type SetUserPersonalizationSuccess {
updatedUserPersonalization: UserPersonalization!
2022-02-11 17:24:33 +00:00
}
2022-05-25 13:34:03 +00:00
type SetWebhookError {
errorCodes: [SetWebhookErrorCode!]!
}
enum SetWebhookErrorCode {
ALREADY_EXISTS
BAD_REQUEST
2022-05-25 14:20:13 +00:00
NOT_FOUND
2022-05-25 13:34:03 +00:00
UNAUTHORIZED
}
input SetWebhookInput {
contentType: String
enabled: Boolean
eventTypes: [WebhookEvent!]!
2022-05-25 14:20:13 +00:00
id: ID
2022-05-25 13:34:03 +00:00
method: String
url: String!
}
union SetWebhookResult = SetWebhookError | SetWebhookSuccess
type SetWebhookSuccess {
webhook: Webhook!
}
type ShareStats {
readDuration: Int!
saveCount: Int!
viewCount: Int!
}
2022-02-15 18:42:05 +00:00
type SharedArticleError {
errorCodes: [SharedArticleErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum SharedArticleErrorCode {
NOT_FOUND
2022-02-11 17:24:33 +00:00
}
union SharedArticleResult = SharedArticleError | SharedArticleSuccess
2022-02-15 18:42:05 +00:00
type SharedArticleSuccess {
article: Article!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum SignupErrorCode {
ACCESS_DENIED
EXPIRED_TOKEN
2022-02-15 18:42:05 +00:00
GOOGLE_AUTH_ERROR
INVALID_EMAIL
INVALID_PASSWORD
2022-02-15 18:42:05 +00:00
INVALID_USERNAME
UNKNOWN
2022-02-15 18:42:05 +00:00
USER_EXISTS
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum SortBy {
2022-05-24 10:23:30 +00:00
PUBLISHED_AT
SAVED_AT
Rebased version of the elastic PR (#225) * Add elastic to our docker compose * add AND/OR/NOT search operations * add elastic and create article in elastic * change error code when elastic throws error * add search pages in elastic * add search by labels * Add elastic to GitHub Action * Update elastic version * Fix port for elastic * add url in search query * Set elastic features when running tests * add debug logs * Use localhost instead of service hostname * refresh elastic after create/update * update search labels query * add typescript support * search pages in elastic * fix search queries * use elastic for saving page * fix test failure * update getArticle api to use elastic * use generic get page function * add elastic migration python script * fix bulk helper param * save elastic page id in article_saving_request instead of postgres article_id * fix page archiving and deleting * add tests for deleteArticle * remove custom date type in elastic mappings which not exist in older version of elastic * fix timestamp format issue * add tests for save reading progress * add tests for save file * optimize search results * add alias to index * update migration script to receive env var as params * Add failing test to validate we don't decrease reading progress This test is failing with Elastic because we aren't fetching the reading progress from elastic here, and are fetching it from postgres. * Rename readingProgress to readingProgressPercent This is the name stored in elastic, so fixes issues pulling the value out. * Linting * Add failing test for creating highlights w/elastic This test fails because the highlight can't be looked up. Is there a different ID we should be passing in to query for highlights, or do we need to update the query to look for elastic_id? * add tests code coverage threshold * update nyc config * include more files in test coverage * change alias name * update updateContent to update pages in elastic * remove debug log * fix createhighlight test * search pages by alias in elastic * update set labels and delete labels in elastic * migration script enumeration * make BULK_SIZE an env var * fix pdf search indexing * debug github action exit issue * call pubsub when create/update/delete page in elastic * fix json parsing bug and reduce reading data from file * replace a depreciated pubsub api call * debug github action exit issue * debug github action exit issue * add handler to upload elastic page data to GCS * fix tests * Use http_auth instead of basic_auth * add index creation and existing postgres tables update in migration script * fix a typo to connect to elastic * rename readingProgress to readingProgressPercent * migrate elastic_page_id in highlights and article_saving_request tables * update migration script to include number of updated rows * update db migration query * read index mappings from file * fix upload pages to gcs * fix tests failure due to pageContext * fix upload file id not exist error * Handle savedAt & isArchived attributes w/out quering elastic * Fix prettier issues * fix content-type mismatching * revert pageId to linkId because frontend was not deployed yet * fix newsletters and attachment not saved in elastic * put linkId in article for setting labels * exclude orginalHtml in the result of searching to improve performace * exclude content in the result of searching to improve performace * remove score sorting * do not refresh immediately to reduce searching and indexing time * do not replace the backup data in gcs * fix no article id defined in articleSavingRequest * add logging of elastic api running time * reduce home feed pagination size to 15 * reduce home feed pagination size to 10 * stop revalidating first page * do not use a separate api to fetch reading progress * Remove unused comment * get reading progress if not exists * replace ngram tokenizer with standard tokenizer * fix tests * remove .env.local * add sort keyword in searching to sort by score Co-authored-by: Hongbo Wu <hongbo@omnivore.app>
2022-03-16 04:08:59 +00:00
SCORE
2022-02-15 18:42:05 +00:00
UPDATED_TIME
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum SortOrder {
ASCENDING
DESCENDING
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input SortParams {
by: SortBy!
order: SortOrder
2022-02-11 17:24:33 +00:00
}
2022-05-17 08:23:36 +00:00
type SubscribeError {
errorCodes: [SubscribeErrorCode!]!
}
enum SubscribeErrorCode {
ALREADY_SUBSCRIBED
BAD_REQUEST
EXCEEDED_MAX_SUBSCRIPTIONS
2022-05-17 08:23:36 +00:00
NOT_FOUND
UNAUTHORIZED
}
input SubscribeInput {
2023-11-09 11:08:52 +00:00
autoAddToLibrary: Boolean
fetchContent: Boolean
fetchContentType: FetchContentType
folder: String
2023-11-09 14:39:51 +00:00
isPrivate: Boolean
subscriptionType: SubscriptionType
2023-10-20 03:05:58 +00:00
url: String!
}
2022-05-17 08:23:36 +00:00
union SubscribeResult = SubscribeError | SubscribeSuccess
type SubscribeSuccess {
2022-05-17 10:45:52 +00:00
subscriptions: [Subscription!]!
2022-05-17 08:23:36 +00:00
}
type Subscription {
2023-11-09 14:39:51 +00:00
autoAddToLibrary: Boolean
2023-07-05 10:23:01 +00:00
count: Int!
createdAt: Date!
description: String
2024-01-24 06:54:39 +00:00
failedAt: Date
fetchContent: Boolean!
fetchContentType: FetchContentType!
folder: String!
icon: String
id: ID!
2023-11-09 14:39:51 +00:00
isPrivate: Boolean
2023-07-05 10:23:01 +00:00
lastFetchedAt: Date
mostRecentItemDate: Date
name: String!
2023-07-05 10:23:01 +00:00
newsletterEmail: String
refreshedAt: Date
status: SubscriptionStatus!
2023-07-05 10:23:01 +00:00
type: SubscriptionType!
unsubscribeHttpUrl: String
unsubscribeMailTo: String
2023-09-05 09:23:58 +00:00
updatedAt: Date
url: String
}
type SubscriptionError {
errorCodes: [ErrorCode!]!
}
union SubscriptionResult = SubscriptionError | SubscriptionSuccess
2024-05-25 03:47:45 +00:00
type SubscriptionRootType {
hello: String
}
enum SubscriptionStatus {
ACTIVE
DELETED
UNSUBSCRIBED
}
type SubscriptionSuccess {
subscription: Subscription!
}
2023-07-05 10:23:01 +00:00
enum SubscriptionType {
NEWSLETTER
RSS
}
type SubscriptionsError {
errorCodes: [SubscriptionsErrorCode!]!
}
enum SubscriptionsErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union SubscriptionsResult = SubscriptionsError | SubscriptionsSuccess
type SubscriptionsSuccess {
subscriptions: [Subscription!]!
}
2022-07-29 04:11:48 +00:00
type SyncUpdatedItemEdge {
cursor: String!
itemID: ID!
node: SearchItem
updateReason: UpdateReason!
}
type Task {
cancellable: Boolean
createdAt: Date!
failedReason: String
id: ID!
name: String!
progress: Float
runningTime: Int
state: TaskState!
}
enum TaskState {
CANCELLED
FAILED
PENDING
RUNNING
SUCCEEDED
}
2022-07-12 15:00:31 +00:00
type TypeaheadSearchError {
errorCodes: [TypeaheadSearchErrorCode!]!
2022-07-12 13:42:13 +00:00
}
2022-07-12 15:00:31 +00:00
enum TypeaheadSearchErrorCode {
2022-07-12 13:42:13 +00:00
UNAUTHORIZED
}
2022-07-12 15:00:31 +00:00
type TypeaheadSearchItem {
contentReader: ContentReader!
2022-07-12 13:42:13 +00:00
id: ID!
2022-07-13 02:57:54 +00:00
siteName: String
2022-07-12 13:42:13 +00:00
slug: String!
title: String!
}
2022-07-12 15:00:31 +00:00
union TypeaheadSearchResult = TypeaheadSearchError | TypeaheadSearchSuccess
2022-07-12 13:42:13 +00:00
2022-07-12 15:00:31 +00:00
type TypeaheadSearchSuccess {
items: [TypeaheadSearchItem!]!
2022-07-12 13:42:13 +00:00
}
type UnsubscribeError {
errorCodes: [UnsubscribeErrorCode!]!
}
enum UnsubscribeErrorCode {
ALREADY_UNSUBSCRIBED
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
UNSUBSCRIBE_METHOD_NOT_FOUND
}
union UnsubscribeResult = UnsubscribeError | UnsubscribeSuccess
type UnsubscribeSuccess {
subscription: Subscription!
}
2023-10-02 14:21:50 +00:00
type UpdateEmailError {
errorCodes: [UpdateEmailErrorCode!]!
}
enum UpdateEmailErrorCode {
BAD_REQUEST
EMAIL_ALREADY_EXISTS
UNAUTHORIZED
}
input UpdateEmailInput {
email: String!
}
union UpdateEmailResult = UpdateEmailError | UpdateEmailSuccess
type UpdateEmailSuccess {
email: String!
verificationEmailSent: Boolean
}
2023-08-30 17:37:24 +00:00
type UpdateFilterError {
errorCodes: [UpdateFilterErrorCode!]!
}
enum UpdateFilterErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
input UpdateFilterInput {
category: String
2023-08-30 17:37:24 +00:00
description: String
filter: String
folder: String
2023-08-30 17:37:24 +00:00
id: String!
name: String
position: Int
visible: Boolean
}
union UpdateFilterResult = UpdateFilterError | UpdateFilterSuccess
type UpdateFilterSuccess {
filter: Filter!
}
2024-06-10 11:25:58 +00:00
type UpdateFolderPolicyError {
errorCodes: [UpdateFolderPolicyErrorCode!]!
}
enum UpdateFolderPolicyErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
input UpdateFolderPolicyInput {
action: FolderPolicyAction
afterDays: Int
id: ID!
}
union UpdateFolderPolicyResult = UpdateFolderPolicyError | UpdateFolderPolicySuccess
type UpdateFolderPolicySuccess {
policy: FolderPolicy!
}
2022-02-15 18:42:05 +00:00
type UpdateHighlightError {
errorCodes: [UpdateHighlightErrorCode!]!
}
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
enum UpdateHighlightErrorCode {
BAD_DATA
2022-02-15 18:42:05 +00:00
FORBIDDEN
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input UpdateHighlightInput {
annotation: String
color: String
highlightId: ID!
html: String
quote: String
2022-02-15 18:42:05 +00:00
sharedAt: Date
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type UpdateHighlightReplyError {
errorCodes: [UpdateHighlightReplyErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum UpdateHighlightReplyErrorCode {
FORBIDDEN
2022-02-11 17:24:33 +00:00
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input UpdateHighlightReplyInput {
highlightReplyId: ID!
text: String!
2022-02-11 17:24:33 +00:00
}
union UpdateHighlightReplyResult = UpdateHighlightReplyError | UpdateHighlightReplySuccess
2022-02-15 18:42:05 +00:00
type UpdateHighlightReplySuccess {
highlightReply: HighlightReply!
2022-02-11 17:24:33 +00:00
}
union UpdateHighlightResult = UpdateHighlightError | UpdateHighlightSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type UpdateHighlightSuccess {
highlight: Highlight!
2022-02-11 17:24:33 +00:00
}
2022-03-30 12:24:29 +00:00
type UpdateLabelError {
errorCodes: [UpdateLabelErrorCode!]!
}
enum UpdateLabelErrorCode {
BAD_REQUEST
FORBIDDEN
NOT_FOUND
UNAUTHORIZED
}
input UpdateLabelInput {
color: String!
description: String
labelId: ID!
name: String!
}
union UpdateLabelResult = UpdateLabelError | UpdateLabelSuccess
type UpdateLabelSuccess {
label: Label!
}
2022-02-15 18:42:05 +00:00
type UpdateLinkShareInfoError {
errorCodes: [UpdateLinkShareInfoErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum UpdateLinkShareInfoErrorCode {
2022-02-11 17:24:33 +00:00
BAD_REQUEST
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input UpdateLinkShareInfoInput {
description: String!
2022-02-15 18:42:05 +00:00
linkId: ID!
title: String!
2022-02-11 17:24:33 +00:00
}
union UpdateLinkShareInfoResult = UpdateLinkShareInfoError | UpdateLinkShareInfoSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type UpdateLinkShareInfoSuccess {
message: String!
2022-02-11 17:24:33 +00:00
}
2023-12-20 03:29:10 +00:00
type UpdateNewsletterEmailError {
errorCodes: [UpdateNewsletterEmailErrorCode!]!
}
enum UpdateNewsletterEmailErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
input UpdateNewsletterEmailInput {
description: String
folder: String
id: ID!
name: String
}
union UpdateNewsletterEmailResult = UpdateNewsletterEmailError | UpdateNewsletterEmailSuccess
type UpdateNewsletterEmailSuccess {
newsletterEmail: NewsletterEmail!
}
2022-05-24 07:04:54 +00:00
type UpdatePageError {
errorCodes: [UpdatePageErrorCode!]!
}
enum UpdatePageErrorCode {
BAD_REQUEST
FORBIDDEN
NOT_FOUND
UNAUTHORIZED
UPDATE_FAILED
}
input UpdatePageInput {
2022-11-24 08:25:27 +00:00
byline: String
2022-05-24 07:04:54 +00:00
description: String
pageId: ID!
previewImage: String
2023-03-02 05:40:59 +00:00
publishedAt: Date
2022-11-30 05:17:50 +00:00
savedAt: Date
state: ArticleSavingRequestStatus
2022-05-24 07:04:54 +00:00
title: String
}
union UpdatePageResult = UpdatePageError | UpdatePageSuccess
type UpdatePageSuccess {
updatedPage: Article!
2022-05-24 07:04:54 +00:00
}
2024-06-15 14:07:32 +00:00
type UpdatePostError {
errorCodes: [UpdatePostErrorCode!]!
}
enum UpdatePostErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
input UpdatePostInput {
content: String
highlightIds: [ID!]
id: ID!
libraryItemIds: [ID!]
thought: String
thumbnail: String
title: String
}
union UpdatePostResult = UpdatePostError | UpdatePostSuccess
type UpdatePostSuccess {
post: Post!
}
2022-07-29 04:11:48 +00:00
enum UpdateReason {
CREATED
DELETED
UPDATED
}
2022-02-15 18:42:05 +00:00
type UpdateReminderError {
errorCodes: [UpdateReminderErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum UpdateReminderErrorCode {
2022-02-11 17:24:33 +00:00
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
input UpdateReminderInput {
archiveUntil: Boolean!
id: ID!
2022-02-11 17:24:33 +00:00
remindAt: Date!
sendNotification: Boolean!
2022-02-11 17:24:33 +00:00
}
union UpdateReminderResult = UpdateReminderError | UpdateReminderSuccess
2022-02-11 17:24:33 +00:00
type UpdateReminderSuccess {
reminder: Reminder!
}
2022-02-15 18:42:05 +00:00
type UpdateSharedCommentError {
errorCodes: [UpdateSharedCommentErrorCode!]!
}
enum UpdateSharedCommentErrorCode {
2022-02-11 17:24:33 +00:00
NOT_FOUND
2022-02-15 18:42:05 +00:00
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input UpdateSharedCommentInput {
articleID: ID!
sharedComment: String!
2022-02-11 17:24:33 +00:00
}
union UpdateSharedCommentResult = UpdateSharedCommentError | UpdateSharedCommentSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type UpdateSharedCommentSuccess {
articleID: ID!
sharedComment: String!
2022-02-11 17:24:33 +00:00
}
2023-07-10 07:24:33 +00:00
type UpdateSubscriptionError {
errorCodes: [UpdateSubscriptionErrorCode!]!
}
enum UpdateSubscriptionErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
input UpdateSubscriptionInput {
2023-11-09 11:08:52 +00:00
autoAddToLibrary: Boolean
2023-07-10 07:24:33 +00:00
description: String
2024-01-24 06:54:39 +00:00
failedAt: Date
fetchContent: Boolean
fetchContentType: FetchContentType
folder: String
2023-07-10 07:24:33 +00:00
id: ID!
2023-11-09 14:39:51 +00:00
isPrivate: Boolean
2023-10-18 11:53:26 +00:00
lastFetchedChecksum: String
mostRecentItemDate: Date
2023-07-10 07:24:33 +00:00
name: String
refreshedAt: Date
scheduledAt: Date
2023-08-01 14:07:53 +00:00
status: SubscriptionStatus
2023-07-10 07:24:33 +00:00
}
union UpdateSubscriptionResult = UpdateSubscriptionError | UpdateSubscriptionSuccess
type UpdateSubscriptionSuccess {
subscription: Subscription!
}
2022-02-15 18:42:05 +00:00
type UpdateUserError {
errorCodes: [UpdateUserErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum UpdateUserErrorCode {
BIO_TOO_LONG
EMPTY_NAME
2022-02-15 18:42:05 +00:00
UNAUTHORIZED
USER_NOT_FOUND
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input UpdateUserInput {
bio: String
name: String!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type UpdateUserProfileError {
errorCodes: [UpdateUserProfileErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum UpdateUserProfileErrorCode {
BAD_DATA
BAD_USERNAME
FORBIDDEN
UNAUTHORIZED
2022-02-15 18:42:05 +00:00
USERNAME_EXISTS
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input UpdateUserProfileInput {
bio: String
pictureUrl: String
userId: ID!
username: String
2022-02-11 17:24:33 +00:00
}
union UpdateUserProfileResult = UpdateUserProfileError | UpdateUserProfileSuccess
2022-02-15 18:42:05 +00:00
type UpdateUserProfileSuccess {
user: User!
2022-02-11 17:24:33 +00:00
}
union UpdateUserResult = UpdateUserError | UpdateUserSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type UpdateUserSuccess {
user: User!
2022-02-11 17:24:33 +00:00
}
2022-07-29 04:11:48 +00:00
type UpdatesSinceError {
2022-07-29 10:11:18 +00:00
errorCodes: [UpdatesSinceErrorCode!]!
2022-07-29 04:11:48 +00:00
}
enum UpdatesSinceErrorCode {
UNAUTHORIZED
}
union UpdatesSinceResult = UpdatesSinceError | UpdatesSinceSuccess
type UpdatesSinceSuccess {
edges: [SyncUpdatedItemEdge!]!
pageInfo: PageInfo!
}
2022-02-15 18:42:05 +00:00
type UploadFileRequestError {
errorCodes: [UploadFileRequestErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum UploadFileRequestErrorCode {
BAD_INPUT
FAILED_CREATE
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
input UploadFileRequestInput {
clientRequestId: String
2022-02-15 18:42:05 +00:00
contentType: String!
createPageEntry: Boolean
url: String!
2022-02-11 17:24:33 +00:00
}
union UploadFileRequestResult = UploadFileRequestError | UploadFileRequestSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type UploadFileRequestSuccess {
createdPageId: String
2022-02-15 18:42:05 +00:00
id: ID!
uploadFileId: ID
uploadSignedUrl: String
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum UploadFileStatus {
COMPLETED
INITIALIZED
2022-02-11 17:24:33 +00:00
}
type UploadImportFileError {
errorCodes: [UploadImportFileErrorCode!]!
}
enum UploadImportFileErrorCode {
BAD_REQUEST
UNAUTHORIZED
UPLOAD_DAILY_LIMIT_EXCEEDED
}
union UploadImportFileResult = UploadImportFileError | UploadImportFileSuccess
type UploadImportFileSuccess {
uploadSignedUrl: String
}
enum UploadImportFileType {
MATTER
POCKET
URL_LIST
}
2022-02-15 18:42:05 +00:00
type User {
2023-10-02 14:21:50 +00:00
email: String
2024-03-28 07:27:37 +00:00
featureList: [Feature!]
2024-04-16 05:59:04 +00:00
features: [String]
followersCount: Int
friendsCount: Int
2022-02-15 18:42:05 +00:00
id: ID!
2023-10-27 08:13:03 +00:00
intercomHash: String
2022-02-15 18:42:05 +00:00
isFriend: Boolean @deprecated(reason: "isFriend has been replaced with viewerIsFollowing")
isFullUser: Boolean
name: String!
2022-02-15 18:42:05 +00:00
picture: String
profile: Profile!
sharedArticles: [FeedArticle!]!
sharedArticlesCount: Int
sharedHighlightsCount: Int
sharedNotesCount: Int
2023-10-02 14:21:50 +00:00
source: String
viewerIsFollowing: Boolean
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type UserError {
errorCodes: [UserErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum UserErrorCode {
BAD_REQUEST
2022-02-11 17:24:33 +00:00
UNAUTHORIZED
2022-02-15 18:42:05 +00:00
USER_NOT_FOUND
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
type UserPersonalization {
digestConfig: DigestConfig
fields: JSON
2022-02-15 18:42:05 +00:00
fontFamily: String
fontSize: Int
id: ID
2022-02-15 18:42:05 +00:00
libraryLayoutType: String
librarySortOrder: SortOrder
margin: Int
speechRate: String
speechSecondaryVoice: String
speechVoice: String
speechVolume: String
theme: String
2022-02-11 17:24:33 +00:00
}
union UserResult = UserError | UserSuccess
2022-02-11 17:24:33 +00:00
type UserSuccess {
user: User!
}
2022-02-15 18:42:05 +00:00
type UsersError {
errorCodes: [UsersErrorCode!]!
2022-02-11 17:24:33 +00:00
}
2022-02-15 18:42:05 +00:00
enum UsersErrorCode {
UNAUTHORIZED
2022-02-11 17:24:33 +00:00
}
union UsersResult = UsersError | UsersSuccess
2022-02-11 17:24:33 +00:00
2022-02-15 18:42:05 +00:00
type UsersSuccess {
users: [User!]!
2022-02-11 17:24:33 +00:00
}
2022-05-25 12:56:18 +00:00
type Webhook {
2022-05-25 13:34:03 +00:00
contentType: String!
2022-05-25 12:56:18 +00:00
createdAt: Date!
2022-05-25 13:34:03 +00:00
enabled: Boolean!
2022-05-25 12:56:18 +00:00
eventTypes: [WebhookEvent!]!
id: ID!
2022-05-25 13:34:03 +00:00
method: String!
2023-09-05 09:23:58 +00:00
updatedAt: Date
2022-05-25 12:56:18 +00:00
url: String!
}
2022-05-26 03:05:12 +00:00
type WebhookError {
errorCodes: [WebhookErrorCode!]!
}
enum WebhookErrorCode {
BAD_REQUEST
NOT_FOUND
UNAUTHORIZED
}
2022-05-25 12:56:18 +00:00
enum WebhookEvent {
HIGHLIGHT_CREATED
HIGHLIGHT_DELETED
HIGHLIGHT_UPDATED
LABEL_CREATED
LABEL_DELETED
LABEL_UPDATED
PAGE_CREATED
PAGE_DELETED
PAGE_UPDATED
}
2022-05-26 03:05:12 +00:00
union WebhookResult = WebhookError | WebhookSuccess
type WebhookSuccess {
webhook: Webhook!
}
2022-05-26 03:05:12 +00:00
type WebhooksError {
errorCodes: [WebhooksErrorCode!]!
}
enum WebhooksErrorCode {
BAD_REQUEST
UNAUTHORIZED
}
union WebhooksResult = WebhooksError | WebhooksSuccess
type WebhooksSuccess {
webhooks: [Webhook!]!
}