From 67dac9ba315d8fa6703e1690ed7fbdf7717ce520 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Sun, 26 May 2024 14:41:38 +0800 Subject: [PATCH] add public item source --- packages/api/src/entity/public_item.ts | 7 ++++ packages/api/src/entity/public_item_source.ts | 40 +++++++++++++++++++ .../api/src/jobs/update_just_read_feed.ts | 9 ++--- packages/api/src/services/just_read_feed.ts | 5 +++ .../db/migrations/0177.do.public_item.sql | 13 +++--- 5 files changed, 63 insertions(+), 11 deletions(-) create mode 100644 packages/api/src/entity/public_item_source.ts diff --git a/packages/api/src/entity/public_item.ts b/packages/api/src/entity/public_item.ts index e2843a399..78a174e31 100644 --- a/packages/api/src/entity/public_item.ts +++ b/packages/api/src/entity/public_item.ts @@ -2,10 +2,13 @@ import { Column, CreateDateColumn, Entity, + JoinColumn, + ManyToOne, OneToOne, PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm' +import { PublicItemSource } from './public_item_source' import { PublicItemStats } from './public_item_stats' @Entity({ name: 'public_item' }) @@ -16,6 +19,10 @@ export class PublicItem { @OneToOne(() => PublicItemStats) stats!: PublicItemStats + @ManyToOne(() => PublicItemSource) + @JoinColumn({ name: 'source_id' }) + source!: PublicItemSource + @Column('text') siteIcon?: string diff --git a/packages/api/src/entity/public_item_source.ts b/packages/api/src/entity/public_item_source.ts new file mode 100644 index 000000000..a79a6ec19 --- /dev/null +++ b/packages/api/src/entity/public_item_source.ts @@ -0,0 +1,40 @@ +import { + Column, + CreateDateColumn, + Entity, + PrimaryGeneratedColumn, + UpdateDateColumn, +} from 'typeorm' + +@Entity({ name: 'public_item_source' }) +export class PublicItemSource { + @PrimaryGeneratedColumn('uuid') + id!: string + + @Column('text') + type!: string + + @Column('text') + name!: string + + @Column('text') + url?: string + + @Column('boolean') + approved!: boolean + + @Column('text') + icon?: string + + @Column('text') + topics?: string[] + + @Column('text') + languageCodes?: string[] + + @CreateDateColumn() + createdAt!: Date + + @UpdateDateColumn() + updatedAt!: Date +} diff --git a/packages/api/src/jobs/update_just_read_feed.ts b/packages/api/src/jobs/update_just_read_feed.ts index ffc316e29..3f75ae8ad 100644 --- a/packages/api/src/jobs/update_just_read_feed.ts +++ b/packages/api/src/jobs/update_just_read_feed.ts @@ -103,12 +103,11 @@ const publicItemToCandidate = (item: PublicItem): FeedItem => ({ likeCount: item.stats.likeCount, broadcastCount: item.stats.broadcastCount, siteIcon: item.siteIcon, - // TODO - subscriptionType: 'public', + subscriptionType: item.type, subscription: { - id: item.id, - name: item.siteName || '', - icon: item.siteIcon, + id: item.source.id, + name: item.source.name, + icon: item.source.icon, }, }) diff --git a/packages/api/src/services/just_read_feed.ts b/packages/api/src/services/just_read_feed.ts index 7d8a18103..895192062 100644 --- a/packages/api/src/services/just_read_feed.ts +++ b/packages/api/src/services/just_read_feed.ts @@ -23,6 +23,11 @@ export const findUnseenPublicItems = async ( 'stats', 'stats.public_item_id = public_item.id' ) + .innerJoin( + 'public_item_source', + 'source', + 'source.id = public_item.source_id' + ) .where('interaction.user_id = :userId', { userId }) .andWhere('interaction.seen_at IS NULL') .orderBy('public_item.createdAt', 'DESC') diff --git a/packages/db/migrations/0177.do.public_item.sql b/packages/db/migrations/0177.do.public_item.sql index 32a618660..7e45df56f 100755 --- a/packages/db/migrations/0177.do.public_item.sql +++ b/packages/db/migrations/0177.do.public_item.sql @@ -7,10 +7,11 @@ BEGIN; CREATE TABLE omnivore.public_item_source ( id uuid PRIMARY KEY DEFAULT uuid_generate_v1mc(), name TEXT NOT NULL, - topics TEXT[] NOT NULL, - thumbnail TEXT, - url TEXT NOT NULL, - language_codes TEXT[] NOT NULL, + type TEXT NOT NULL, -- public feeds, newsletters, or user recommended + topics TEXT[], + icon TEXT, + url TEXT, + language_codes TEXT[], approved BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP @@ -22,8 +23,8 @@ GRANT SELECT ON omnivore.public_item_source TO omnivore_user; CREATE TABLE omnivore.public_item ( id uuid PRIMARY KEY DEFAULT uuid_generate_v1mc(), - source_name TEXT NOT NULL, - source_icon TEXT, + source_id uuid NOT NULL REFERENCES omnivore.public_item_source(id) ON DELETE CASCADE, + site_icon TEXT, type TEXT NOT NULL, -- public feeds, newsletters, or user recommended title TEXT NOT NULL, url TEXT NOT NULL,