diff --git a/packages/api/src/entity/label.ts b/packages/api/src/entity/label.ts index dd0c65079..384cf4ed9 100644 --- a/packages/api/src/entity/label.ts +++ b/packages/api/src/entity/label.ts @@ -3,9 +3,12 @@ import { CreateDateColumn, Entity, JoinColumn, + JoinTable, + ManyToMany, ManyToOne, PrimaryGeneratedColumn, } from 'typeorm' +import { LibraryItem } from './library_item' import { User } from './user' @Entity({ name: 'labels' }) @@ -34,4 +37,8 @@ export class Label { @Column('boolean', { default: false }) internal!: boolean + + @ManyToMany(() => LibraryItem, (libraryItem) => libraryItem.labels) + @JoinTable() + libraryItems?: LibraryItem[] } diff --git a/packages/api/src/entity/library_item.ts b/packages/api/src/entity/library_item.ts index 730f6c4a6..04228c67f 100644 --- a/packages/api/src/entity/library_item.ts +++ b/packages/api/src/entity/library_item.ts @@ -3,10 +3,14 @@ import { CreateDateColumn, Entity, JoinColumn, + JoinTable, + ManyToMany, OneToOne, PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm' +import { Label } from './label' +import { Subscription } from './subscription' import { UploadFile } from './upload_file' import { User } from './user' @@ -36,6 +40,11 @@ export enum ContentReaderType { EPUB = 'EPUB', } +export enum DirectionalityType { + LTR = 'LTR', + RTL = 'RTL', +} + @Entity({ name: 'library_item' }) export class LibraryItem { @PrimaryGeneratedColumn('uuid') @@ -166,4 +175,15 @@ export class LibraryItem { @Column('text', { nullable: true }) gcsArchiveId?: string + + @OneToOne(() => Subscription, { onDelete: 'CASCADE' }) + @JoinColumn({ name: 'subscription_id' }) + subscription?: Subscription + + @ManyToMany(() => Label, (label) => label.libraryItems) + @JoinTable() + labels?: Label[] + + @Column('enum', { enum: DirectionalityType, default: DirectionalityType.LTR }) + directionality?: DirectionalityType } diff --git a/packages/api/src/entity/library_item_preview.ts b/packages/api/src/entity/library_item_preview.ts new file mode 100644 index 000000000..cf2a9b7dd --- /dev/null +++ b/packages/api/src/entity/library_item_preview.ts @@ -0,0 +1,43 @@ +import { + Column, + CreateDateColumn, + Entity, + JoinColumn, + OneToOne, + PrimaryGeneratedColumn, + UpdateDateColumn, +} from 'typeorm' +import { LibraryItem } from './library_item' +import { User } from './user' + +@Entity({ name: 'library_item_preview' }) +export class LibraryItemPreview { + @PrimaryGeneratedColumn('uuid') + id?: string + + @OneToOne(() => User, { onDelete: 'CASCADE' }) + @JoinColumn({ name: 'sender_id' }) + sender!: User + + @Column('array', { name: 'recipient_ids' }) + recipientIds!: string[] + + @OneToOne(() => LibraryItem, { onDelete: 'CASCADE' }) + @JoinColumn({ name: 'library_item_id' }) + libraryItem!: LibraryItem + + @Column('text') + thumbnail?: string + + @Column('bool', { default: false }) + includesNote?: boolean + + @Column('bool', { default: false }) + includesHighlight?: boolean + + @CreateDateColumn() + createdAt?: Date + + @UpdateDateColumn() + updatedAt?: Date +} diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json index 9d64d8069..7c8caecfd 100644 --- a/packages/api/tsconfig.json +++ b/packages/api/tsconfig.json @@ -4,9 +4,7 @@ "files": true }, "compilerOptions": { - "outDir": "dist", - "emitDecoratorMetadata": true, - "experimentalDecorators": true + "outDir": "dist" }, "include": ["src", "test"], "exclude": ["./src/generated", "./test"] diff --git a/packages/db/migrations/0118.do.library_item.sql b/packages/db/migrations/0118.do.library_item.sql index 5d3ec8765..5d8e6a459 100755 --- a/packages/db/migrations/0118.do.library_item.sql +++ b/packages/db/migrations/0118.do.library_item.sql @@ -7,10 +7,9 @@ BEGIN; CREATE EXTENSION 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 ( id uuid PRIMARY KEY DEFAULT uuid_generate_v1mc(), @@ -53,7 +52,10 @@ CREATE TABLE omnivore.library_item ( model_name text, embedding vector(768), text_content_hash text, - gcs_archive_id text + gcs_archive_id text, + directionality directionality_type NOT NULL DEFAULT 'LTR', + subscription_id uuid REFERENCES omnivore.subscriptions ON DELETE CASCADE, + UNIQUE (user_id, original_url) ); CREATE TRIGGER update_library_item_modtime BEFORE UPDATE ON omnivore.library_item FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column(); diff --git a/packages/db/migrations/0118.undo.library_item.sql b/packages/db/migrations/0118.undo.library_item.sql index 6197c6c44..202b831dd 100755 --- a/packages/db/migrations/0118.undo.library_item.sql +++ b/packages/db/migrations/0118.undo.library_item.sql @@ -7,15 +7,16 @@ BEGIN; DROP TRIGGER library_item_tsv_update ON omnivore.library_item; DROP FUNCTION update_library_item_tsv(); -DROP INDEX library_item_search_tsv_idx; -DROP INDEX library_item_description_tsv_idx; -DROP INDEX library_item_author_tsv_idx; -DROP INDEX library_item_title_tsv_idx; -DROP INDEX library_item_site_tsv_idx; -DROP INDEX library_item_content_tsv_idx; +DROP INDEX omnivore.library_item_search_tsv_idx; +DROP INDEX omnivore.library_item_description_tsv_idx; +DROP INDEX omnivore.library_item_author_tsv_idx; +DROP INDEX omnivore.library_item_title_tsv_idx; +DROP INDEX omnivore.library_item_site_tsv_idx; +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; diff --git a/packages/db/migrations/0120.do.library_item_labels.sql b/packages/db/migrations/0119.do.library_item_labels.sql similarity index 100% rename from packages/db/migrations/0120.do.library_item_labels.sql rename to packages/db/migrations/0119.do.library_item_labels.sql diff --git a/packages/db/migrations/0119.do.library_item_subscriptions.sql b/packages/db/migrations/0119.do.library_item_subscriptions.sql deleted file mode 100755 index 0700299ef..000000000 --- a/packages/db/migrations/0119.do.library_item_subscriptions.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Type: DO --- Name: library_item_subscriptions --- Description: Create a join table for library item and subscriptions - -BEGIN; - -CREATE TABLE omnivore.library_item_subscriptions ( - library_item_id uuid NOT NULL REFERENCES omnivore.library_item(id) ON DELETE CASCADE, - subscription_id uuid NOT NULL REFERENCES omnivore.subscriptions(id) ON DELETE CASCADE, - PRIMARY KEY (library_item_id, subscription_id) -); - -COMMIT; diff --git a/packages/db/migrations/0120.undo.library_item_labels.sql b/packages/db/migrations/0119.undo.library_item_labels.sql similarity index 100% rename from packages/db/migrations/0120.undo.library_item_labels.sql rename to packages/db/migrations/0119.undo.library_item_labels.sql diff --git a/packages/db/migrations/0119.undo.library_item_subscriptions.sql b/packages/db/migrations/0119.undo.library_item_subscriptions.sql deleted file mode 100755 index dbedc0b21..000000000 --- a/packages/db/migrations/0119.undo.library_item_subscriptions.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Type: UNDO --- Name: library_item_subscriptions --- Description: Create a join table for library item and subscriptions - -BEGIN; - -DROP TABLE omnivore.library_item_subscriptions; - -COMMIT; diff --git a/packages/db/migrations/0121.do.library_item_preview.sql b/packages/db/migrations/0120.do.library_item_preview.sql similarity index 100% rename from packages/db/migrations/0121.do.library_item_preview.sql rename to packages/db/migrations/0120.do.library_item_preview.sql diff --git a/packages/db/migrations/0121.undo.library_item_preview.sql b/packages/db/migrations/0120.undo.library_item_preview.sql similarity index 100% rename from packages/db/migrations/0121.undo.library_item_preview.sql rename to packages/db/migrations/0120.undo.library_item_preview.sql