mirror of
https://github.com/sct/overseerr.git
synced 2025-12-27 08:45:06 +01:00
* chore(release): 1.4.0 * chore(release): 1.4.1 * chore(release): 1.5.0 * chore(release): 1.6.0 * chore(release): 1.7.0 * feat: support for postgresql * test(pgsql): disable root certificate verification * test(ci): temporarily change CI for local repo * fix: don't use SQLite idiom when using PgSQL * feat(db): add flag to toggle TLS for Postgres * feat(postgres and migrations): added migrations for postgres & imporved ssl for postgres config #186 * fix: restored workflow actions * fix: access order * fix: added pushover sound migration tto initial migration * fix: added option to log queries * fix: issue with session migration * chore: relocate pushover sound migration * feat: added logging option to other datasources * chore: small tweaks for the datasource. Added docs for db setup * chore: cleanup logs * fix: added default dates to postgres migration * fix: removed psql specific relation checks * chore: added some debug sanity checks * chore: added some more debug sanity checks * chore: added some more additional debug sanity checks * chore: added some more+ additional debug sanity checks * chore: mild log cleanup * chore: more log cleanup * chore: finish log cleanup * fix: added not null to migration so typeorm doesn't delete ids * chore: cleanup extra psql code * fix: remove eager load * docs: added documentation for migration to postgres * docs: added database option to bug template * feat: created docker-compose postgres file * fix: updated ts schema to align with change to migration * fix: switch timestamp to include timezone * fix: fixed indentation in psql docker-compose * fix: changed version to 0.1.0 to remove ui notification * style: fixed prettier in docker-compose.pastgres.yaml * chore: restored CHANGELOG.md * chore: revverted ts commit * fix: update pnpm lock with pg package * chore(pnpm-lock.yaml): updated pnpm-lock * docs: update docs to add psql set up info * refactor: clean up code from cr comments * feat: migrate blacklist * fix: fix issue with cypress tests * docs: update psql docs * fix: fix psql issue in user page; fix tiny psql error when selecting by empty list * fix: incorrect current date function * fix: null contraint with mediaAddedAt; fix psql col type * refactor: removed unnecessary import * feat: add postgres migration for streaming region --------- Co-authored-by: Fallenbagel <98979876+Fallenbagel@users.noreply.github.com> Co-authored-by: semantic-release-bot <semantic-release-bot@martynus.net> Co-authored-by: zackhow <zackhow@gmail.com> Co-authored-by: Ryan Algar <me@ralgar.dev> Co-authored-by: Ryan Algar <59636191+ralgar@users.noreply.github.com>
305 lines
11 KiB
TypeScript
305 lines
11 KiB
TypeScript
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
|
|
export class InitialMigration1705599190375 implements MigrationInterface {
|
|
name = 'InitialMigration1705599190375';
|
|
|
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
await queryRunner.query(
|
|
`create table if not exists session
|
|
(
|
|
"expiredAt" bigint,
|
|
id text,
|
|
json text
|
|
);`
|
|
);
|
|
await queryRunner.query(
|
|
`create index if not exists "idx_194703_IDX_28c5d1d16da7908c97c9bc2f74"
|
|
on session ("expiredAt");`
|
|
);
|
|
await queryRunner.query(
|
|
`create unique index if not exists idx_194703_sqlite_autoindex_session_1
|
|
on session (id);`
|
|
);
|
|
await queryRunner.query(
|
|
`create table if not exists media
|
|
(
|
|
id serial,
|
|
"mediaType" text,
|
|
"tmdbId" int,
|
|
"tvdbId" int,
|
|
"imdbId" text,
|
|
status int default '1'::int,
|
|
status4k int default '1'::int,
|
|
"createdAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
"updatedAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
"lastSeasonChange" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
"mediaAddedAt" timestamp with time zone,
|
|
"serviceId" int,
|
|
"serviceId4k" int,
|
|
"externalServiceId" int,
|
|
"externalServiceId4k" int,
|
|
"externalServiceSlug" text,
|
|
"externalServiceSlug4k" text,
|
|
"ratingKey" text,
|
|
"ratingKey4k" text,
|
|
"jellyfinMediaId" text,
|
|
"jellyfinMediaId4k" text,
|
|
constraint idx_194722_media_pkey
|
|
primary key (id)
|
|
);`
|
|
);
|
|
await queryRunner.query(
|
|
`create table if not exists season
|
|
(
|
|
id serial,
|
|
"seasonNumber" int,
|
|
status int default '1'::int,
|
|
"createdAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
"updatedAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
"mediaId" int not null,
|
|
status4k int default '1'::int,
|
|
constraint idx_194715_season_pkey
|
|
primary key (id),
|
|
foreign key ("mediaId") references media
|
|
on delete cascade
|
|
);`
|
|
);
|
|
await queryRunner.query(
|
|
`create index if not exists "idx_194722_IDX_7ff2d11f6a83cb52386eaebe74"
|
|
on media ("imdbId");`
|
|
);
|
|
await queryRunner.query(
|
|
`create index if not exists "idx_194722_IDX_41a289eb1fa489c1bc6f38d9c3"
|
|
on media ("tvdbId");`
|
|
);
|
|
await queryRunner.query(
|
|
`create index if not exists "idx_194722_IDX_7157aad07c73f6a6ae3bbd5ef5"
|
|
on media ("tmdbId");`
|
|
);
|
|
await queryRunner.query(
|
|
`create unique index if not exists idx_194722_sqlite_autoindex_media_1
|
|
on media ("tvdbId");`
|
|
);
|
|
await queryRunner.query(
|
|
`create table if not exists "user"
|
|
(
|
|
id serial,
|
|
email text,
|
|
username text,
|
|
"plexId" int,
|
|
"plexToken" text,
|
|
permissions int default '0'::int,
|
|
avatar text,
|
|
"createdAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
"updatedAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
password text,
|
|
"userType" int default '1'::int,
|
|
"plexUsername" text,
|
|
"resetPasswordGuid" text,
|
|
"recoveryLinkExpirationDate" date,
|
|
"movieQuotaLimit" int,
|
|
"movieQuotaDays" int,
|
|
"tvQuotaLimit" int,
|
|
"tvQuotaDays" int,
|
|
"jellyfinUsername" text,
|
|
"jellyfinAuthToken" text,
|
|
"jellyfinUserId" text,
|
|
"jellyfinDeviceId" text,
|
|
constraint idx_194731_user_pkey
|
|
primary key (id)
|
|
);`
|
|
);
|
|
await queryRunner.query(
|
|
`create unique index if not exists idx_194731_sqlite_autoindex_user_1
|
|
on "user" (email);`
|
|
);
|
|
await queryRunner.query(
|
|
`create table if not exists user_push_subscription
|
|
(
|
|
id serial,
|
|
endpoint text,
|
|
p256dh text,
|
|
auth text,
|
|
"userId" int,
|
|
constraint idx_194740_user_push_subscription_pkey
|
|
primary key (id),
|
|
foreign key ("userId") references "user"
|
|
on delete cascade
|
|
);`
|
|
);
|
|
await queryRunner.query(
|
|
`create unique index if not exists idx_194740_sqlite_autoindex_user_push_subscription_1
|
|
on user_push_subscription (auth);`
|
|
);
|
|
await queryRunner.query(
|
|
`create table if not exists issue
|
|
(
|
|
id serial,
|
|
"issueType" int,
|
|
status int default '1'::int,
|
|
"problemSeason" int default '0'::int,
|
|
"problemEpisode" int default '0'::int,
|
|
"createdAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
"updatedAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
"mediaId" int not null,
|
|
"createdById" int,
|
|
"modifiedById" int,
|
|
constraint idx_194747_issue_pkey
|
|
primary key (id),
|
|
foreign key ("modifiedById") references "user"
|
|
on delete cascade,
|
|
foreign key ("createdById") references "user"
|
|
on delete cascade,
|
|
foreign key ("mediaId") references media
|
|
on delete cascade
|
|
);`
|
|
);
|
|
await queryRunner.query(
|
|
`create table if not exists issue_comment
|
|
(
|
|
id serial,
|
|
message text,
|
|
"createdAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
"updatedAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
"userId" int,
|
|
"issueId" int,
|
|
constraint idx_194755_issue_comment_pkey
|
|
primary key (id),
|
|
foreign key ("issueId") references issue
|
|
on delete cascade,
|
|
foreign key ("userId") references "user"
|
|
on delete cascade
|
|
);`
|
|
);
|
|
await queryRunner.query(
|
|
`create table if not exists user_settings
|
|
(
|
|
id serial,
|
|
"notificationTypes" text,
|
|
"discordId" text,
|
|
"userId" int,
|
|
region text,
|
|
"originalLanguage" text,
|
|
"telegramChatId" text,
|
|
"telegramSendSilently" boolean,
|
|
"pgpKey" text,
|
|
locale text default ''::text,
|
|
"pushbulletAccessToken" text,
|
|
"pushoverApplicationToken" text,
|
|
"pushoverUserKey" text,
|
|
"watchlistSyncMovies" boolean,
|
|
"watchlistSyncTv" boolean,
|
|
"pushoverSound" varchar,
|
|
constraint idx_194762_user_settings_pkey
|
|
primary key (id),
|
|
foreign key ("userId") references "user"
|
|
on delete cascade
|
|
);`
|
|
);
|
|
await queryRunner.query(
|
|
`create unique index if not exists idx_194762_sqlite_autoindex_user_settings_1
|
|
on user_settings ("userId");`
|
|
);
|
|
await queryRunner.query(
|
|
`create table if not exists media_request
|
|
(
|
|
id serial,
|
|
status int,
|
|
"createdAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
"updatedAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
type text,
|
|
"mediaId" int not null,
|
|
"requestedById" int,
|
|
"modifiedById" int,
|
|
is4k boolean default false,
|
|
"serverId" int,
|
|
"profileId" int,
|
|
"rootFolder" text,
|
|
"languageProfileId" int,
|
|
tags text,
|
|
"isAutoRequest" boolean default false,
|
|
constraint idx_194770_media_request_pkey
|
|
primary key (id),
|
|
foreign key ("modifiedById") references "user"
|
|
on delete set null,
|
|
foreign key ("requestedById") references "user"
|
|
on delete cascade,
|
|
foreign key ("mediaId") references media
|
|
on delete cascade
|
|
);`
|
|
);
|
|
await queryRunner.query(
|
|
`create table if not exists season_request
|
|
(
|
|
id serial NOT NULL,
|
|
"seasonNumber" int,
|
|
status int default '1'::int,
|
|
"createdAt" timestamp with time zone default now(),
|
|
"updatedAt" timestamp with time zone default now(),
|
|
"requestId" int,
|
|
constraint idx_194709_season_request_pkey
|
|
primary key (id),
|
|
foreign key ("requestId") references media_request
|
|
on delete cascade
|
|
);`
|
|
);
|
|
await queryRunner.query(
|
|
`create table if not exists discover_slider
|
|
(
|
|
id serial,
|
|
type integer,
|
|
"order" integer,
|
|
"isBuiltIn" boolean default false,
|
|
enabled boolean default true,
|
|
title text,
|
|
data text,
|
|
"createdAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
"updatedAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
constraint idx_194779_discover_slider_pkey
|
|
primary key (id)
|
|
);`
|
|
);
|
|
await queryRunner.query(
|
|
`create table if not exists watchlist
|
|
(
|
|
id serial,
|
|
"ratingKey" text,
|
|
"mediaType" text,
|
|
title text,
|
|
"tmdbId" int,
|
|
"createdAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
"updatedAt" timestamp with time zone default CURRENT_TIMESTAMP,
|
|
"requestedById" int,
|
|
"mediaId" int not null,
|
|
constraint idx_194788_watchlist_pkey
|
|
primary key (id)
|
|
);`
|
|
);
|
|
await queryRunner.query(
|
|
`create index if not exists "idx_194788_IDX_939f205946256cc0d2a1ac51a8"
|
|
on watchlist ("tmdbId");`
|
|
);
|
|
await queryRunner.query(
|
|
`create unique index if not exists idx_194788_sqlite_autoindex_watchlist_1
|
|
on watchlist ("tmdbId", "requestedById");`
|
|
);
|
|
}
|
|
|
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
await queryRunner.query(`drop table if exists session cascade`);
|
|
await queryRunner.query(`drop table if exists season_request cascade`);
|
|
await queryRunner.query(`drop table if exists season cascade`);
|
|
await queryRunner.query(
|
|
`drop table if exists user_push_subscription cascade`
|
|
);
|
|
await queryRunner.query(`drop table if exists issue_comment cascade`);
|
|
await queryRunner.query(`drop table if exists issue cascade`);
|
|
await queryRunner.query(`drop table if exists user_settings cascade`);
|
|
await queryRunner.query(`drop table if exists media_request cascade`);
|
|
await queryRunner.query(`drop table if exists media cascade`);
|
|
await queryRunner.query(`drop table if exists "user" cascade`);
|
|
await queryRunner.query(`drop table if exists discover_slider cascade`);
|
|
await queryRunner.query(`drop table if exists watchlist cascade`);
|
|
}
|
|
}
|