diff --git a/migrations/0060_drop_unused_tables.sql b/migrations/0060_drop_unused_tables.sql new file mode 100644 index 00000000..41b21d5a --- /dev/null +++ b/migrations/0060_drop_unused_tables.sql @@ -0,0 +1,79 @@ +DROP TABLE auth_group CASCADE; +DROP TABLE auth_group_permissions CASCADE; +DROP TABLE auth_permission CASCADE; +DROP TABLE auth_user CASCADE; +DROP TABLE auth_user_groups CASCADE; +DROP TABLE auth_user_user_permissions CASCADE; +DROP TABLE django_admin_log CASCADE; +DROP TABLE django_content_type CASCADE; +DROP TABLE django_mfa_u2fkey CASCADE; +DROP TABLE django_mfa_userotp CASCADE; +DROP TABLE django_mfa_userrecoverycodes CASCADE; +DROP TABLE django_migrations CASCADE; +DROP TABLE django_session CASCADE; + +DROP TABLE "recentEpisodesByCategory" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp0" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp1" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp2" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp3" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp4" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp5" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp6" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp7" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp8" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp9" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp10" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp11" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp12" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp13" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp14" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp15" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp16" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp17" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp18" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp19" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp20" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp21" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp22" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp23" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp24" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp25" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp26" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp27" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp28" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp29" CASCADE; +DROP TABLE "recentEpisodesByCategoryTemp30" CASCADE; + +DROP TABLE "recentEpisodesByPodcast" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp0" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp1" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp2" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp3" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp4" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp5" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp6" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp7" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp8" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp9" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp10" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp11" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp12" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp13" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp14" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp15" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp16" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp17" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp18" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp19" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp20" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp21" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp22" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp23" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp24" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp25" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp26" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp27" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp28" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp29" CASCADE; +DROP TABLE "recentEpisodesByPodcastTemp30" CASCADE; diff --git a/package.json b/package.json index 98d92d95..1859c8b2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "podverse-api", - "version": "4.16.18", + "version": "4.16.19", "description": "Data API, database migration scripts, and backend services for all Podverse models.", "contributors": [ "Mitch Downey" @@ -19,6 +19,7 @@ "dev:scripts:addAllPublicFeedUrlsToQueue": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/scripts/queue/addAllPublicFeedUrlsToQueue.ts", "dev:scripts:addAllUntitledPodcastFeedUrlsToQueue": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/scripts/queue/addAllUntitledPodcastFeedUrlsToQueue.ts", "dev:scripts:addAndParseFeedUrls": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/scripts/feedUrls/addAndParseFeedUrls.ts", + "dev:scripts:addAuthorityFeedUrlByPodcastIdToQueue": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/scripts/queue/addAuthorityFeedUrlByPodcastIdToQueue.ts", "dev:scripts:addFeedsByPodcastIndexIdToQueue": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/scripts/podcastIndex/addFeedsByPodcastIndexIdToQueue.ts", "dev:scripts:addFeedsToQueueByPriority": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/scripts/queue/addFeedsToQueueByPriority.ts", "dev:scripts:addFeedUrls": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/scripts/feedUrls/addFeedUrls.ts", @@ -46,7 +47,6 @@ "dev:scripts:removeDeadEpisodes": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/scripts/episodes/removeDeadEpisodes.ts", "dev:scripts:removePodcastsByIds": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/scripts/podcasts/removePodcastsByIds.ts", "dev:scripts:syncWithFeedUrlsCSVDump": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/scripts/podcastIndex/syncWithFeedUrlsCSVDump.ts", - "dev:scripts:updateRecentEpisodesTables": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/scripts/recentEpisodes/updateRecentEpisodesTables.ts", "dev:seeds:categories": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/seeds/categories.ts", "dev:seeds:podcasts": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/seeds/podcasts.ts", "dev:seeds:qa:populateDatabase": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/seeds/qa/populateDatabase.ts", @@ -56,6 +56,7 @@ "scripts:addAllUntitledPodcastFeedUrlsToQueue": "ts-node -r tsconfig-paths/register ./src/scripts/queue/addAllUntitledPodcastFeedUrlsToQueue.ts", "scripts:addAndParseFeedUrls": "ts-node -r tsconfig-paths/register ./src/scripts/feedUrls/addAndParseFeedUrls.ts", "scripts:addFeedsByPodcastIndexIdToQueue": "ts-node -r tsconfig-paths/register ./src/scripts/podcastIndex/addFeedsByPodcastIndexIdToQueue.ts", + "scripts:addAuthorityFeedUrlByPodcastIdToQueue": "ts-node -r tsconfig-paths/register ./src/scripts/queue/addAuthorityFeedUrlByPodcastIdToQueue.ts", "scripts:addFeedsToQueueByPriority": "ts-node -r tsconfig-paths/register ./src/scripts/queue/addFeedsToQueueByPriority.ts", "scripts:addFeedUrls": "ts-node -r tsconfig-paths/register ./src/scripts/feedUrls/addFeedUrls.ts", "scripts:addFeedUrlsByFeedIdToQueue": "ts-node -r tsconfig-paths/register ./src/scripts/queue/addFeedUrlsByFeedIdToQueue.ts", @@ -81,7 +82,6 @@ "scripts:removeDeadEpisodes": "ts-node -r tsconfig-paths/register ./src/scripts/episodes/removeDeadEpisodes.ts", "scripts:removePodcastsByIds": "ts-node -r tsconfig-paths/register ./src/scripts/podcasts/removePodcastsByIds.ts", "scripts:syncWithFeedUrlsCSVDump": "ts-node -r tsconfig-paths/register ./src/scripts/podcastIndex/syncWithFeedUrlsCSVDump.ts", - "scripts:updateRecentEpisodesTables": "ts-node -r tsconfig-paths/register ./src/scripts/recentEpisodes/updateRecentEpisodesTables.ts", "seeds:categories": "ts-node -r tsconfig-paths/register ./src/seeds/categories.ts", "seeds:podcasts": "ts-node -r tsconfig-paths/register ./src/seeds/podcasts.ts", "start": "ts-node -r tsconfig-paths/register src/server.ts", diff --git a/src/controllers/feedUrl.ts b/src/controllers/feedUrl.ts index 56d2ddac..f3254b34 100644 --- a/src/controllers/feedUrl.ts +++ b/src/controllers/feedUrl.ts @@ -120,6 +120,20 @@ const getFeedUrls = (query) => { }) } +export const getAuthorityFeedUrlByPodcastId = async (podcastId: string): Promise => { + const feedUrlRepo = getRepository(FeedUrl) + + const feedUrl = await feedUrlRepo + .createQueryBuilder('feedUrl') + .select('feedUrl.url') + .addSelect('feedUrl.id') + .innerJoin('feedUrl.podcast', 'podcast') + .where('feedUrl.isAuthority = true AND podcast.id = :podcastId', { podcastId }) + .getOne() + + return feedUrl || null +} + export const getAuthorityFeedUrlByPodcastIndexId = async (podcastIndexId: string, allowNonPublic?: boolean) => { const repository = getRepository(FeedUrl) diff --git a/src/controllers/recentEpisodes.ts b/src/controllers/recentEpisodes.ts deleted file mode 100644 index 45500b11..00000000 --- a/src/controllers/recentEpisodes.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { getConnection } from 'typeorm' - -const days = process.env.RECENT_EPISODES_DATE_RANGE ? parseInt(process.env.RECENT_EPISODES_DATE_RANGE) : 31 - -const updateRecentEpisodesTables = async () => { - const promises = [] as any - const em = await getConnection().createEntityManager() - - await dropTempTables(em) - - for (let i = 0; i < days; i++) { - // Why are these generated one day at a time? Revisit later. - const byCategoryPromise = generateByCategoryQueryPromise(em, i) - const byPodcastPromise = generateByPodcastQueryPromise(em, i) - promises.push(byCategoryPromise) - promises.push(byPodcastPromise) - } - - await Promise.all(promises) - - let byCategorySelects = '' - for (let i = 0; i < days; i++) { - byCategorySelects += `SELECT * FROM "recentEpisodesByCategoryTemp${i}" ${i === days - 1 ? '' : 'UNION '}` - } - - // These would be faster if the indexes were added at the end but its difficult to deal with the ever-changing index names - // created by the CREATE TABLE LIKE process. - await em.query(` - CREATE TABLE "recentEpisodesByCategoryTempCombined" ( - LIKE "recentEpisodesByCategory" INCLUDING ALL - ); - `) - await em.query(`INSERT INTO "recentEpisodesByCategoryTempCombined" ${byCategorySelects};`) - - await em.query(` - ALTER TABLE "recentEpisodesByCategory" - RENAME TO "recentEpisodesByCategoryOld"; - `) - - await em.query(` - ALTER TABLE "recentEpisodesByCategoryTempCombined" - RENAME TO "recentEpisodesByCategory"; - `) - - await em.query(`DROP TABLE "recentEpisodesByCategoryOld" CASCADE;`) - - let byPodcastSelects = '' - for (let i = 0; i < days; i++) { - byPodcastSelects += `SELECT * FROM "recentEpisodesByPodcastTemp${i}" ${i === days - 1 ? '' : 'UNION '}` - } - - await em.query(` - CREATE TABLE "recentEpisodesByPodcastTempCombined" ( - LIKE "recentEpisodesByPodcast" INCLUDING ALL - ); - `) - await em.query(`INSERT INTO "recentEpisodesByPodcastTempCombined" ${byPodcastSelects};`) - - await em.query(` - ALTER TABLE "recentEpisodesByPodcast" - RENAME TO "recentEpisodesByPodcastOld"; - `) - - await em.query(` - ALTER TABLE "recentEpisodesByPodcastTempCombined" - RENAME TO "recentEpisodesByPodcast"; - `) - - await em.query(`DROP TABLE "recentEpisodesByPodcastOld" CASCADE;`) - - await dropTempTables(em) -} - -const generateByCategoryQueryPromise = (em, i) => { - return new Promise(async (resolve) => { - await em.query(` - CREATE TABLE "recentEpisodesByCategoryTemp${i}" ( - LIKE "recentEpisodesByCategory" EXCLUDING ALL - ); - `) - - await em.query(` - INSERT INTO "recentEpisodesByCategoryTemp${i}" ("categoryId", "episodeId", "pubDate") - SELECT COALESCE(podcasts_categories_categories."categoriesId", '0'), - episodes.id as episodeId, episodes."pubDate" as pubDate - FROM episodes - LEFT JOIN podcasts_categories_categories - ON podcasts_categories_categories."podcastsId" = episodes."podcastId" - WHERE episodes."isPublic" = TRUE - AND episodes."pubDate" > '${getDateString(i)}' - AND episodes."pubDate" <= '${getDateString(i, true)}' - `) - - resolve() - }) -} - -const generateByPodcastQueryPromise = (em, i) => { - return new Promise(async (resolve) => { - await em.query(` - CREATE TABLE "recentEpisodesByPodcastTemp${i}" ( - LIKE "recentEpisodesByPodcast" EXCLUDING ALL - ); - `) - - await em.query(` - INSERT INTO "recentEpisodesByPodcastTemp${i}" ("podcastId", "episodeId", "pubDate") - SELECT episodes."podcastId", episodes.id as episodeId, episodes."pubDate" as pubDate - FROM episodes - WHERE episodes."isPublic" = TRUE - AND episodes."pubDate" > '${getDateString(i)}' - AND episodes."pubDate" <= '${getDateString(i, true)}' - `) - - resolve() - }) -} - -const dropTempTables = async (em) => { - for (let i = 0; i < days; i++) { - await em.query(`DROP TABLE IF EXISTS "recentEpisodesByCategoryTemp${i}" CASCADE;`) - } - - for (let i = 0; i < days; i++) { - await em.query(`DROP TABLE IF EXISTS "recentEpisodesByPodcastTemp${i}" CASCADE;`) - } - - await em.query('DROP TABLE IF EXISTS "recentEpisodesByCategoryOld";') - await em.query('DROP TABLE IF EXISTS "recentEpisodesByCategoryTempCombined";') - await em.query('DROP TABLE IF EXISTS "recentEpisodesByPodcastOld";') - await em.query('DROP TABLE IF EXISTS "recentEpisodesByPodcastTempCombined";') -} - -const getDateString = (i, isEndDate = false) => { - const date = new Date() - i = isEndDate ? i + 1 : i - date.setDate(date.getDate() - days + i) - return date.toISOString().slice(0, 19).replace('T', ' ') -} - -export { updateRecentEpisodesTables } diff --git a/src/entities/episode.ts b/src/entities/episode.ts index 566525f5..896d5f01 100644 --- a/src/entities/episode.ts +++ b/src/entities/episode.ts @@ -190,7 +190,7 @@ export class Episode { @OneToMany((type) => UserQueueItem, (userQueueItem) => userQueueItem.episode) userQueueItems: UserQueueItem[] - @OneToOne(() => StatsEpisode, (stats_episode) => stats_episode.episode) + @OneToMany(() => StatsEpisode, (stats_episode) => stats_episode.episode) stats_episode?: StatsEpisode @CreateDateColumn() diff --git a/src/entities/index.ts b/src/entities/index.ts index cf9a943e..8207ac51 100644 --- a/src/entities/index.ts +++ b/src/entities/index.ts @@ -15,8 +15,6 @@ export { Notification } from './notification' export { PayPalOrder } from './paypalOrder' export { Playlist } from './playlist' export { Podcast } from './podcast' -export { RecentEpisodeByCategory } from './recentEpisodeByCategory' -export { RecentEpisodeByPodcast } from './recentEpisodeByPodcast' export { StatsEpisode } from './statsEpisode' export { StatsMediaRef } from './statsMediaRef' export { StatsPodcast } from './statsPodcast' diff --git a/src/entities/mediaRef.ts b/src/entities/mediaRef.ts index 30292826..67a20700 100644 --- a/src/entities/mediaRef.ts +++ b/src/entities/mediaRef.ts @@ -13,7 +13,6 @@ import { ManyToMany, ManyToOne, OneToMany, - OneToOne, PrimaryColumn, Unique, UpdateDateColumn @@ -129,7 +128,7 @@ export class MediaRef { @OneToMany((type) => UserQueueItem, (userQueueItem) => userQueueItem.mediaRef) userQueueItems: UserQueueItem[] - @OneToOne(() => StatsMediaRef, (stats_media_ref) => stats_media_ref.mediaRef) + @OneToMany(() => StatsMediaRef, (stats_media_ref) => stats_media_ref.mediaRef) stats_media_ref?: StatsMediaRef @CreateDateColumn() diff --git a/src/entities/podcast.ts b/src/entities/podcast.ts index 74b80ba8..6275d7ea 100644 --- a/src/entities/podcast.ts +++ b/src/entities/podcast.ts @@ -15,7 +15,6 @@ import { JoinTable, ManyToMany, OneToMany, - OneToOne, PrimaryColumn, UpdateDateColumn } from 'typeorm' @@ -199,7 +198,7 @@ export class Podcast { @OneToMany((type) => Notification, (notification) => notification.podcast) notifications: Notification[] - @OneToOne(() => StatsPodcast, (stats_podcast) => stats_podcast.podcast) + @OneToMany(() => StatsPodcast, (stats_podcast) => stats_podcast.podcast) stats_podcast?: StatsPodcast @CreateDateColumn() diff --git a/src/entities/recentEpisodeByCategory.ts b/src/entities/recentEpisodeByCategory.ts deleted file mode 100644 index 6df536cf..00000000 --- a/src/entities/recentEpisodeByCategory.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Column, Entity, Index, PrimaryColumn } from 'typeorm' - -@Entity('recentEpisodesByCategory') -@Index(['categoryId', 'pubDate']) -export class RecentEpisodeByCategory { - @PrimaryColumn() - episodeId: string - - @Column() - categoryId: string - - @Column({ nullable: true }) - pubDate?: Date -} diff --git a/src/entities/recentEpisodeByPodcast.ts b/src/entities/recentEpisodeByPodcast.ts deleted file mode 100644 index 0e605763..00000000 --- a/src/entities/recentEpisodeByPodcast.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Column, Entity, Index, PrimaryColumn } from 'typeorm' - -@Entity('recentEpisodesByPodcast') -@Index(['podcastId', 'pubDate']) -export class RecentEpisodeByPodcast { - @PrimaryColumn() - episodeId: string - - @Column() - podcastId: string - - @Column({ nullable: true }) - pubDate?: Date -} diff --git a/src/entities/statsEpisode.ts b/src/entities/statsEpisode.ts index be9f2411..b0816162 100644 --- a/src/entities/statsEpisode.ts +++ b/src/entities/statsEpisode.ts @@ -1,6 +1,15 @@ import { IsInt, Min, ValidateIf } from 'class-validator' import { Episode } from '~/entities' -import { Column, CreateDateColumn, Entity, Index, JoinColumn, OneToOne, PrimaryColumn, UpdateDateColumn } from 'typeorm' +import { + Column, + CreateDateColumn, + Entity, + Index, + JoinColumn, + ManyToOne, + PrimaryColumn, + UpdateDateColumn +} from 'typeorm' import { StatsTimeFrames, timeframeEnumValues } from '~/lib/stats' @Entity('stats_episode') @@ -24,7 +33,7 @@ export class StatsEpisode { timeframe: StatsTimeFrames @Index() - @OneToOne(() => Episode, { onDelete: 'CASCADE', nullable: false }) + @ManyToOne(() => Episode, { onDelete: 'CASCADE', nullable: false }) @JoinColumn({ name: 'episode_id' }) episode: Episode diff --git a/src/entities/statsMediaRef.ts b/src/entities/statsMediaRef.ts index 765a8356..f8648c5b 100644 --- a/src/entities/statsMediaRef.ts +++ b/src/entities/statsMediaRef.ts @@ -1,6 +1,15 @@ import { IsInt, Min, ValidateIf } from 'class-validator' import { MediaRef } from '~/entities' -import { Column, CreateDateColumn, Entity, Index, JoinColumn, OneToOne, PrimaryColumn, UpdateDateColumn } from 'typeorm' +import { + Column, + CreateDateColumn, + Entity, + Index, + JoinColumn, + ManyToOne, + PrimaryColumn, + UpdateDateColumn +} from 'typeorm' import { StatsTimeFrames, timeframeEnumValues } from '~/lib/stats' @Entity('stats_media_ref') @@ -24,7 +33,7 @@ export class StatsMediaRef { timeframe: StatsTimeFrames @Index() - @OneToOne(() => MediaRef, { onDelete: 'CASCADE', nullable: false }) + @ManyToOne(() => MediaRef, { onDelete: 'CASCADE', nullable: false }) @JoinColumn({ name: 'media_ref_id' }) mediaRef: MediaRef diff --git a/src/entities/statsPodcast.ts b/src/entities/statsPodcast.ts index cfd9d2b3..6a5a489e 100644 --- a/src/entities/statsPodcast.ts +++ b/src/entities/statsPodcast.ts @@ -1,6 +1,15 @@ import { IsInt, Min, ValidateIf } from 'class-validator' import { Podcast } from '~/entities' -import { Column, CreateDateColumn, Entity, Index, JoinColumn, OneToOne, PrimaryColumn, UpdateDateColumn } from 'typeorm' +import { + Column, + CreateDateColumn, + Entity, + Index, + JoinColumn, + ManyToOne, + PrimaryColumn, + UpdateDateColumn +} from 'typeorm' import { StatsTimeFrames, timeframeEnumValues } from '~/lib/stats' @Entity('stats_podcast') @@ -24,7 +33,7 @@ export class StatsPodcast { timeframe: StatsTimeFrames @Index() - @OneToOne(() => Podcast, { onDelete: 'CASCADE', nullable: false }) + @ManyToOne(() => Podcast, { onDelete: 'CASCADE', nullable: false }) @JoinColumn({ name: 'podcast_id' }) podcast: Podcast diff --git a/src/lib/db.ts b/src/lib/db.ts index 65fcbf51..a37eb301 100644 --- a/src/lib/db.ts +++ b/src/lib/db.ts @@ -18,8 +18,6 @@ import { PayPalOrder, Playlist, Podcast, - RecentEpisodeByCategory, - RecentEpisodeByPodcast, StatsEpisode, StatsMediaRef, StatsPodcast, @@ -49,8 +47,6 @@ const entities = [ PayPalOrder, Playlist, Podcast, - RecentEpisodeByCategory, - RecentEpisodeByPodcast, StatsEpisode, StatsMediaRef, StatsPodcast, diff --git a/src/lib/utility/index.ts b/src/lib/utility/index.ts index 5c958161..a016f339 100644 --- a/src/lib/utility/index.ts +++ b/src/lib/utility/index.ts @@ -144,7 +144,7 @@ export const addOrderByToQuery = (qb, type, sort, sortDateKey, allowRandom, isFr ormStatsType = StatsMediaRef } - if (!sort && isFromManticoreSearch) { + if (isFromManticoreSearch) { // apply no sorting } else if (sort === 'live-item-start-asc') { qb.orderBy(`liveItem.start`, ascKey) diff --git a/src/scripts/queue/addAuthorityFeedUrlByPodcastIdToQueue.ts b/src/scripts/queue/addAuthorityFeedUrlByPodcastIdToQueue.ts new file mode 100644 index 00000000..df612990 --- /dev/null +++ b/src/scripts/queue/addAuthorityFeedUrlByPodcastIdToQueue.ts @@ -0,0 +1,42 @@ +import { addAuthorityFeedUrlByPodcastIdToQueue } from '~/services/queue' +;(async function () { + let podcastIds = [] + + try { + if (process.argv.length > 2) { + let delimitedPodcastIds = process.argv[2] + delimitedPodcastIds = delimitedPodcastIds.replace(/ |'|"|`/g, '') + podcastIds = (delimitedPodcastIds.split(',') as never) || [] + } else { + console.log('You must provide a list of podcastIds as a comma-delimited npm argument.') + return + } + + await addAuthorityFeedUrlByPodcastIdToQueue(podcastIds) + } catch (error) { + console.log(error) + } +})() + +// const fs = require('fs') +// import { addAuthorityFeedUrlByPodcastIdToQueue } from '~/services/queue' +// ;(async function () { +// let podcastIds = [] + +// try { +// if (process.argv.length > 2) { +// const csvFile = process.argv[2] // Get the CSV file from the command-line arguments +// const fileContents = fs.readFileSync(csvFile, 'utf8') // Read the contents of the file +// let delimitedPodcastIds = fileContents +// delimitedPodcastIds = delimitedPodcastIds.replace(/ |'|"|`/g, '') +// podcastIds = (delimitedPodcastIds.split(',') as never) || [] +// } else { +// console.log('You must provide a list of podcastIds as a comma-delimited npm argument.') +// return +// } + +// await addAuthorityFeedUrlByPodcastIdToQueue(podcastIds) +// } catch (error) { +// console.log(error) +// } +// })() diff --git a/src/scripts/recentEpisodes/updateRecentEpisodesTables.ts b/src/scripts/recentEpisodes/updateRecentEpisodesTables.ts deleted file mode 100644 index 5b99df18..00000000 --- a/src/scripts/recentEpisodes/updateRecentEpisodesTables.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { connectToDb } from '~/lib/db' -import { updateRecentEpisodesTables } from '~/controllers/recentEpisodes' -;(async function () { - try { - await connectToDb() - await updateRecentEpisodesTables() - } catch (error) { - console.log(error) - } -})() diff --git a/src/seeds/qa/populateDatabase.ts b/src/seeds/qa/populateDatabase.ts index 9c9d4361..dc95ce8e 100644 --- a/src/seeds/qa/populateDatabase.ts +++ b/src/seeds/qa/populateDatabase.ts @@ -47,10 +47,6 @@ const populateDatabase = async (connection: Connection, isQuickRun: boolean): Pr /* Playlists */ await generateQAPlaylists() - /* TODO: RecentEpisodesByCategory */ - - /* TODO: RecentEpisodesByPodcast */ - /* TODO: UPDevices */ /* TODO: UserHistoryItems */ diff --git a/src/services/queue.ts b/src/services/queue.ts index 503c54cd..805b43c4 100644 --- a/src/services/queue.ts +++ b/src/services/queue.ts @@ -5,6 +5,7 @@ import { chunkArray } from '~/lib/utility' import { connectToDb } from '~/lib/db' import { sqs } from '~/services/aws' import { generateFeedMessageAttributes } from '~/services/parser' +import { getAuthorityFeedUrlByPodcastId } from '~/controllers/feedUrl' const { awsConfig } = config const queueUrls = awsConfig.queueUrls @@ -104,6 +105,29 @@ export const addFeedsToQueueByPriority = async (parsingPriority: number, offset } } +export const addAuthorityFeedUrlByPodcastIdToQueue = async (podcastIds: string[]) => { + await connectToDb() + + const feedUrls: FeedUrl[] = [] + + for (const podcastId of podcastIds) { + try { + const feedUrl = await getAuthorityFeedUrlByPodcastId(podcastId) + if (feedUrl) { + console.log('feedUrl', feedUrl) + feedUrls.push(feedUrl) + } + } catch (error) { + console.log('addAuthorityFeedUrlByPodcastIdToQueue error') + console.log(error) + } + } + + const forceReparsing = true + const cacheBust = false + await sendFeedUrlsToQueue(feedUrls, queueUrls.feedsToParse.priorityQueueUrl, forceReparsing, cacheBust) +} + export const addAllUntitledPodcastFeedUrlsToQueue = async () => { await connectToDb()