From 4ff5484d8e915f1df10978ad648c6e91f9fb85c7 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 19 Sep 2023 19:33:43 +0800 Subject: [PATCH] change item_type to text --- packages/api/src/entity/library_item.ts | 16 ++------------ packages/api/src/resolvers/article/index.ts | 12 ++++------- .../api/src/resolvers/upload_files/index.ts | 11 +++++----- packages/api/src/routers/page_router.ts | 6 +++--- .../api/src/routers/svc/email_attachment.ts | 12 ++++------- .../src/services/create_page_save_request.ts | 5 +++-- packages/api/src/services/library_item.ts | 10 +++------ packages/api/src/services/popular_reads.ts | 5 +++-- packages/api/src/services/save_email.ts | 8 ++----- packages/api/src/services/save_page.ts | 10 +++------ packages/api/src/utils/search.ts | 21 ++++++++----------- packages/api/src/utils/uploads.ts | 9 ++++---- packages/api/test/resolvers/article.test.ts | 7 ++++--- packages/api/test/utils/uploads.test.ts | 9 ++++---- .../db/migrations/0118.do.library_item.sql | 5 ++--- .../db/migrations/0118.undo.library_item.sql | 1 - 16 files changed, 56 insertions(+), 91 deletions(-) diff --git a/packages/api/src/entity/library_item.ts b/packages/api/src/entity/library_item.ts index 5a86933a0..960c05635 100644 --- a/packages/api/src/entity/library_item.ts +++ b/packages/api/src/entity/library_item.ts @@ -26,18 +26,6 @@ export enum LibraryItemState { Archived = 'ARCHIVED', } -export enum LibraryItemType { - Article = 'ARTICLE', - Book = 'BOOK', - File = 'FILE', - Profile = 'PROFILE', - Website = 'WEBSITE', - Tweet = 'TWEET', - Video = 'VIDEO', - Image = 'IMAGE', - Unknown = 'UNKNOWN', -} - export enum ContentReaderType { WEB = 'WEB', PDF = 'PDF', @@ -134,8 +122,8 @@ export class LibraryItem { @Column('text', { nullable: true }) thumbnail?: string | null - @Column('enum', { enum: LibraryItemType, default: LibraryItemType.Unknown }) - itemType!: LibraryItemType + @Column('text') + itemType!: string @OneToOne(() => UploadFile, { onDelete: 'CASCADE' }) @JoinColumn({ name: 'upload_file_id' }) diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index fb848cdd2..4e6c82d49 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -6,11 +6,7 @@ import { Readability } from '@omnivore/readability' import graphqlFields from 'graphql-fields' import { DeepPartial } from 'typeorm' -import { - LibraryItem, - LibraryItemState, - LibraryItemType, -} from '../../entity/library_item' +import { LibraryItem, LibraryItemState } from '../../entity/library_item' import { env } from '../../env' import { ArticleError, @@ -194,7 +190,7 @@ export const createArticleResolver = authorized< let canonicalUrl let uploadFileHash = null let domContent = null - let itemType = LibraryItemType.Unknown + let itemType = PageType.Unknown const DUMMY_RESPONSE = { user, @@ -207,7 +203,7 @@ export const createArticleResolver = authorized< content: '', description: '', title: '', - pageType: itemType as unknown as PageType, + pageType: itemType, contentReader: ContentReader.Web, author: '', url, @@ -263,7 +259,7 @@ export const createArticleResolver = authorized< parsedContent = parseResults.parsedContent canonicalUrl = parseResults.canonicalUrl domContent = parseResults.domContent - itemType = parseResults.pageType as unknown as LibraryItemType + itemType = parseResults.pageType } else if (!preparedDocument?.document) { // We have a URL but no document, so we try to send this to puppeteer // and return a dummy response. diff --git a/packages/api/src/resolvers/upload_files/index.ts b/packages/api/src/resolvers/upload_files/index.ts index 0a5001834..e94154b96 100644 --- a/packages/api/src/resolvers/upload_files/index.ts +++ b/packages/api/src/resolvers/upload_files/index.ts @@ -1,11 +1,12 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import normalizeUrl from 'normalize-url' import path from 'path' -import { LibraryItemState, LibraryItemType } from '../../entity/library_item' +import { LibraryItemState } from '../../entity/library_item' import { UploadFile } from '../../entity/upload_file' import { env } from '../../env' import { MutationUploadFileRequestArgs, + PageType, UploadFileRequestError, UploadFileRequestErrorCode, UploadFileRequestSuccess, @@ -31,13 +32,11 @@ const isFileUrl = (url: string): boolean => { return parsedUrl.protocol == 'file:' } -export const itemTypeForContentType = ( - contentType: string -): LibraryItemType => { +export const itemTypeForContentType = (contentType: string) => { if (contentType == 'application/epub+zip') { - return LibraryItemType.Book + return PageType.Book } - return LibraryItemType.File + return PageType.File } export const uploadFileRequestResolver = authorized< diff --git a/packages/api/src/routers/page_router.ts b/packages/api/src/routers/page_router.ts index 3db753c13..5f63c0b7b 100644 --- a/packages/api/src/routers/page_router.ts +++ b/packages/api/src/routers/page_router.ts @@ -5,11 +5,11 @@ import cors from 'cors' import express from 'express' import * as jwt from 'jsonwebtoken' -import { LibraryItemState, LibraryItemType } from '../entity/library_item' +import { LibraryItemState } from '../entity/library_item' import { Recommendation } from '../entity/recommendation' import { UploadFile } from '../entity/upload_file' import { env } from '../env' -import { UploadFileStatus } from '../generated/graphql' +import { PageType, UploadFileStatus } from '../generated/graphql' import { authTrx } from '../repository' import { Claims } from '../resolvers/types' import { @@ -124,7 +124,7 @@ export function pageRouter() { user: { id: claims.uid }, title, originalContent: '', - itemType: LibraryItemType.File, + itemType: PageType.File, uploadFile: { id: uploadFileData.id }, slug: generateSlug(uploadFilePathName), state: LibraryItemState.Processing, diff --git a/packages/api/src/routers/svc/email_attachment.ts b/packages/api/src/routers/svc/email_attachment.ts index c50b79d7a..361a5b16f 100644 --- a/packages/api/src/routers/svc/email_attachment.ts +++ b/packages/api/src/routers/svc/email_attachment.ts @@ -1,13 +1,9 @@ import express from 'express' import { DeepPartial } from 'typeorm' -import { - LibraryItem, - LibraryItemState, - LibraryItemType, -} from '../../entity/library_item' +import { LibraryItem, LibraryItemState } from '../../entity/library_item' import { UploadFile } from '../../entity/upload_file' import { env } from '../../env' -import { UploadFileStatus } from '../../generated/graphql' +import { PageType, UploadFileStatus } from '../../generated/graphql' import { authTrx } from '../../repository' import { createLibraryItem } from '../../services/library_item' import { findNewsletterEmailByAddress } from '../../services/newsletters' @@ -151,8 +147,8 @@ export function emailAttachmentRouter() { const uploadFileHash = uploadFileDetails.md5Hash const itemType = uploadFile.contentType === 'application/pdf' - ? LibraryItemType.File - : LibraryItemType.Book + ? PageType.File + : PageType.Book const title = subject || uploadFileData.fileName const articleToSave: DeepPartial = { originalUrl: uploadFileUrlOverride, diff --git a/packages/api/src/services/create_page_save_request.ts b/packages/api/src/services/create_page_save_request.ts index dc8e4b0b4..9c21144a6 100644 --- a/packages/api/src/services/create_page_save_request.ts +++ b/packages/api/src/services/create_page_save_request.ts @@ -1,10 +1,11 @@ import * as privateIpLib from 'private-ip' -import { LibraryItemState, LibraryItemType } from '../entity/library_item' +import { LibraryItemState } from '../entity/library_item' import { ArticleSavingRequest, ArticleSavingRequestStatus, CreateArticleSavingRequestErrorCode, CreateLabelInput, + PageType, } from '../generated/graphql' import { createPubSubClient, PubsubClient } from '../pubsub' import { userRepository } from '../repository/user' @@ -118,7 +119,7 @@ export const createPageSaveRequest = async ({ id: articleSavingRequestId, user: { id: userId }, readableContent: SAVING_CONTENT, - itemType: LibraryItemType.Unknown, + itemType: PageType.Unknown, slug: generateSlug(url), title: url, originalUrl: url, diff --git a/packages/api/src/services/library_item.ts b/packages/api/src/services/library_item.ts index 6b8041d66..1e973e653 100644 --- a/packages/api/src/services/library_item.ts +++ b/packages/api/src/services/library_item.ts @@ -3,11 +3,7 @@ import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity import { EntityLabel } from '../entity/entity_label' import { Highlight } from '../entity/highlight' import { Label } from '../entity/label' -import { - LibraryItem, - LibraryItemState, - LibraryItemType, -} from '../entity/library_item' +import { LibraryItem, LibraryItemState } from '../entity/library_item' import { BulkActionType } from '../generated/graphql' import { createPubSubClient, EntityType } from '../pubsub' import { authTrx } from '../repository' @@ -34,7 +30,7 @@ export interface SearchArgs { query?: string inFilter?: InFilter readFilter?: ReadFilter - typeFilter?: LibraryItemType + typeFilter?: string labelFilters?: LabelFilter[] hasFilters?: HasFilter[] dateFilters?: DateFilter[] @@ -58,7 +54,7 @@ export interface SearchResultItem { id: string image?: string | null pageId?: string - pageType: LibraryItemType + pageType: string publishedAt?: Date quote?: string | null shortId?: string | null diff --git a/packages/api/src/services/popular_reads.ts b/packages/api/src/services/popular_reads.ts index c030a877f..28030be8e 100644 --- a/packages/api/src/services/popular_reads.ts +++ b/packages/api/src/services/popular_reads.ts @@ -2,7 +2,8 @@ import * as httpContext from 'express-http-context2' import { readFileSync } from 'fs' import path from 'path' import { DeepPartial, EntityManager } from 'typeorm' -import { LibraryItem, LibraryItemType } from '../entity/library_item' +import { LibraryItem } from '../entity/library_item' +import { PageType } from '../generated/graphql' import { authTrx, entityManager } from '../repository' import { libraryItemRepository } from '../repository/library_item' import { generateSlug, stringToHash, wordsCount } from '../utils/helpers' @@ -69,7 +70,7 @@ const popularReadToLibraryItem = ( title: pr.title, author: pr.author, originalUrl: pr.url, - itemType: LibraryItemType.Article, + itemType: PageType.Article, textContentHash: stringToHash(pr.content), thumbnail: pr.previewImage, publishedAt: pr.publishedAt, diff --git a/packages/api/src/services/save_email.ts b/packages/api/src/services/save_email.ts index a3d040c02..1fc673c65 100644 --- a/packages/api/src/services/save_email.ts +++ b/packages/api/src/services/save_email.ts @@ -1,8 +1,4 @@ -import { - LibraryItem, - LibraryItemState, - LibraryItemType, -} from '../entity/library_item' +import { LibraryItem, LibraryItemState } from '../entity/library_item' import { getInternalLabelWithColor } from '../repository/label' import { enqueueThumbnailTask } from '../utils/createTask' import { @@ -102,7 +98,7 @@ export const saveEmail = async ( title: input.title, author: input.author, originalUrl: cleanedUrl, - itemType: parseResult.pageType as unknown as LibraryItemType, + itemType: parseResult.pageType, textContentHash: stringToHash(content), thumbnail: metadata?.previewImage || diff --git a/packages/api/src/services/save_page.ts b/packages/api/src/services/save_page.ts index 9764690b2..ca500b081 100644 --- a/packages/api/src/services/save_page.ts +++ b/packages/api/src/services/save_page.ts @@ -1,10 +1,6 @@ import { Readability } from '@omnivore/readability' import { DeepPartial } from 'typeorm' -import { - LibraryItem, - LibraryItemState, - LibraryItemType, -} from '../entity/library_item' +import { LibraryItem, LibraryItemState } from '../entity/library_item' import { User } from '../entity/user' import { homePageURL } from '../env' import { @@ -86,7 +82,7 @@ export const savePage = async ( slug, croppedPathname, parsedContent: parseResult.parsedContent, - itemType: parseResult.pageType as unknown as LibraryItemType, + itemType: parseResult.pageType, originalHtml: parseResult.domContent, canonicalUrl: parseResult.canonicalUrl, saveTime: input.savedAt ? new Date(input.savedAt) : undefined, @@ -210,7 +206,7 @@ export const parsedContentToLibraryItem = ({ userId: string slug: string croppedPathname: string - itemType: LibraryItemType + itemType: string parsedContent: Readability.ParseResult | null originalHtml?: string | null itemId?: string | null diff --git a/packages/api/src/utils/search.ts b/packages/api/src/utils/search.ts index 178996544..e5447fba8 100644 --- a/packages/api/src/utils/search.ts +++ b/packages/api/src/utils/search.ts @@ -9,8 +9,7 @@ import { SearchParserKeyWordOffset, SearchParserTextOffset, } from 'search-query-parser' -import { LibraryItemType } from '../entity/library_item' -import { InputMaybe, SortParams } from '../generated/graphql' +import { InputMaybe, PageType, SortParams } from '../generated/graphql' export enum ReadFilter { ALL, @@ -31,7 +30,7 @@ export interface SearchFilter { query: string | undefined inFilter: InFilter readFilter: ReadFilter - typeFilter?: LibraryItemType + typeFilter?: string labelFilters: LabelFilter[] sort?: Sort hasFilters: HasFilter[] @@ -134,27 +133,25 @@ const parseInFilter = ( return query ? InFilter.ALL : InFilter.INBOX } -const parseTypeFilter = ( - str: string | undefined -): LibraryItemType | undefined => { +const parseTypeFilter = (str: string | undefined): string | undefined => { if (str === undefined) { return undefined } switch (str.toLowerCase()) { case 'article': - return LibraryItemType.Article + return PageType.Article case 'book': - return LibraryItemType.Book + return PageType.Book case 'pdf': case 'file': - return LibraryItemType.File + return PageType.File case 'profile': - return LibraryItemType.Profile + return PageType.Profile case 'website': - return LibraryItemType.Website + return PageType.Website case 'unknown': - return LibraryItemType.Unknown + return PageType.Unknown } return undefined } diff --git a/packages/api/src/utils/uploads.ts b/packages/api/src/utils/uploads.ts index c625bb737..1ee51b62c 100644 --- a/packages/api/src/utils/uploads.ts +++ b/packages/api/src/utils/uploads.ts @@ -1,21 +1,22 @@ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ import { File, GetSignedUrlConfig, Storage } from '@google-cloud/storage' -import { ContentReaderType, LibraryItemType } from '../entity/library_item' +import { ContentReaderType } from '../entity/library_item' import { env } from '../env' +import { PageType } from '../generated/graphql' import { logger } from './logger' export const contentReaderForLibraryItem = ( - itemType: LibraryItemType, + itemType: string, uploadFileId: string | null | undefined ) => { if (!uploadFileId) { return ContentReaderType.WEB } switch (itemType) { - case LibraryItemType.Book: + case PageType.Book: return ContentReaderType.EPUB - case LibraryItemType.File: + case PageType.File: return ContentReaderType.PDF default: return ContentReaderType.WEB diff --git a/packages/api/test/resolvers/article.test.ts b/packages/api/test/resolvers/article.test.ts index b59dc210a..2e8a5f022 100644 --- a/packages/api/test/resolvers/article.test.ts +++ b/packages/api/test/resolvers/article.test.ts @@ -5,15 +5,16 @@ import 'mocha' import sinon from 'sinon' import { DeepPartial } from 'typeorm' import { Highlight } from '../../src/entity/highlight' -import { LibraryItem, LibraryItemState, LibraryItemType } from '../../src/entity/library_item' +import { LibraryItem, LibraryItemState } from '../../src/entity/library_item' import { UploadFile } from '../../src/entity/upload_file' import { User } from '../../src/entity/user' import { ArticleSavingRequestStatus, BulkActionType, + PageType, SyncUpdatedItemEdge, UpdateReason, - UploadFileStatus + UploadFileStatus, } from '../../src/generated/graphql' import { getRepository } from '../../src/repository' import { createHighlight } from '../../src/services/highlights' @@ -1070,7 +1071,7 @@ describe('Article API', () => { await createLibraryItem( { user, - itemType: i == 0 ? LibraryItemType.Article : LibraryItemType.File, + itemType: i == 0 ? PageType.Article : PageType.File, title: 'test page', readableContent: '

test

', slug: '', diff --git a/packages/api/test/utils/uploads.test.ts b/packages/api/test/utils/uploads.test.ts index faf0fdff0..60b5f47c8 100644 --- a/packages/api/test/utils/uploads.test.ts +++ b/packages/api/test/utils/uploads.test.ts @@ -1,24 +1,23 @@ import { expect } from 'chai' import 'mocha' -import { LibraryItemType } from '../../src/entity/library_item' -import { ContentReader } from '../../src/generated/graphql' +import { ContentReader, PageType } from '../../src/generated/graphql' import { contentReaderForLibraryItem } from '../../src/utils/uploads' describe('contentReaderForPage', () => { it('returns web if there is no uploadFileId', () => { - const result = contentReaderForLibraryItem(LibraryItemType.Book, undefined) + const result = contentReaderForLibraryItem(PageType.Book, undefined) expect(result).to.eq(ContentReader.Web) }) it('returns Epub if there is an uploadFileId and type is book', () => { const result = contentReaderForLibraryItem( - LibraryItemType.Book, + PageType.Book, 'fakeUploadFileId' ) expect(result).to.eq(ContentReader.Epub) }) it('returns PDF if there is an uploadFileId and type is File', () => { const result = contentReaderForLibraryItem( - LibraryItemType.File, + PageType.File, 'fakeUploadFileId' ) expect(result).to.eq(ContentReader.Pdf) diff --git a/packages/db/migrations/0118.do.library_item.sql b/packages/db/migrations/0118.do.library_item.sql index 8a33fd990..2b7be74b4 100755 --- a/packages/db/migrations/0118.do.library_item.sql +++ b/packages/db/migrations/0118.do.library_item.sql @@ -4,11 +4,10 @@ BEGIN; -CREATE EXTENSION vector; +CREATE EXTENSION IF NOT EXISTS vector; CREATE TYPE library_item_state AS ENUM ('SUCCEEDED', 'FAILED', 'PROCESSING', 'ARCHIVED', 'DELETED'); CREATE TYPE content_reader_type AS ENUM ('WEB', 'PDF', 'EPUB'); -CREATE TYPE library_item_type AS ENUM ('ARTICLE', 'BOOK', 'FILE', 'PROFILE', 'WEBSITE', 'TWEET', 'VIDEO', 'IMAGE', 'UNKNOWN'); CREATE TYPE directionality_type AS ENUM ('LTR', 'RTL'); CREATE TABLE omnivore.library_item ( @@ -38,7 +37,7 @@ CREATE TABLE omnivore.library_item ( reading_progress_top_percent real NOT NULL DEFAULT 0, reading_progress_bottom_percent real NOT NULL DEFAULT 0, thumbnail text, - item_type library_item_type NOT NULL DEFAULT 'UNKNOWN', + item_type text NOT NULL DEFAULT 'UNKNOWN', upload_file_id uuid REFERENCES omnivore.upload_files ON DELETE CASCADE, content_reader content_reader_type NOT NULL DEFAULT 'WEB', original_content text, diff --git a/packages/db/migrations/0118.undo.library_item.sql b/packages/db/migrations/0118.undo.library_item.sql index 57e2a2e43..7085737d6 100755 --- a/packages/db/migrations/0118.undo.library_item.sql +++ b/packages/db/migrations/0118.undo.library_item.sql @@ -18,7 +18,6 @@ DROP INDEX omnivore.library_item_content_tsv_idx; DROP TRIGGER update_library_item_modtime ON omnivore.library_item; DROP TABLE omnivore.library_item; DROP TYPE directionality_type; -DROP TYPE library_item_type; DROP TYPE content_reader_type; DROP TYPE library_item_state;