From fd26fdef93a671a06d667af290c2ae8e8bb0cdf4 Mon Sep 17 00:00:00 2001 From: Natty Date: Sat, 29 Jul 2023 05:20:00 +0200 Subject: [PATCH] Added SQL migrations and bootstrapping --- Cargo.lock | 113 + Cargo.toml | 1 + README.md | 3 - ext_calckey_model/Cargo.toml | 2 + ext_calckey_model/migration/Cargo.toml | 16 + ext_calckey_model/migration/README.md | 41 + .../migration/src/bootstrap_down.sql | 223 ++ .../migration/src/bootstrap_up.sql | 3168 +++++++++++++++++ ext_calckey_model/migration/src/lib.rs | 12 + .../src/m20220101_000001_bootstrap.rs | 25 + ext_calckey_model/migration/src/main.rs | 6 + ext_calckey_model/src/lib.rs | 7 + src/main.rs | 2 + 13 files changed, 3616 insertions(+), 3 deletions(-) create mode 100644 ext_calckey_model/migration/Cargo.toml create mode 100644 ext_calckey_model/migration/README.md create mode 100644 ext_calckey_model/migration/src/bootstrap_down.sql create mode 100644 ext_calckey_model/migration/src/bootstrap_up.sql create mode 100644 ext_calckey_model/migration/src/lib.rs create mode 100644 ext_calckey_model/migration/src/m20220101_000001_bootstrap.rs create mode 100644 ext_calckey_model/migration/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index d60fcdb..624db9e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -383,6 +383,42 @@ dependencies = [ "serde", ] +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "bitflags", + "clap_derive", + "clap_lex", + "indexmap", + "once_cell", + "textwrap", +] + +[[package]] +name = "clap_derive" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" +dependencies = [ + "heck 0.4.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "core-foundation-sys" version = "0.8.4" @@ -482,6 +518,14 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "ext_calckey_model_migration" +version = "0.2.0" +dependencies = [ + "sea-orm-migration", + "tokio", +] + [[package]] name = "fnv" version = "1.0.7" @@ -996,6 +1040,7 @@ dependencies = [ "chrono", "ck", "dotenvy", + "ext_calckey_model_migration", "magnetar_common", "sea-orm", "serde", @@ -1194,6 +1239,12 @@ version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +[[package]] +name = "os_str_bytes" +version = "6.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" + [[package]] name = "ouroboros" version = "0.15.6" @@ -1728,6 +1779,22 @@ dependencies = [ "uuid", ] +[[package]] +name = "sea-orm-cli" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbf34a2caf70c2e3be9bb1e674e9540f6dfd7c8f40f6f05daf3b9740e476005" +dependencies = [ + "chrono", + "clap", + "dotenvy", + "regex", + "sea-schema", + "tracing", + "tracing-subscriber", + "url", +] + [[package]] name = "sea-orm-macros" version = "0.11.3" @@ -1741,6 +1808,23 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "sea-orm-migration" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278d3adfd0832b6ffc17d3cfbc574d3695a5c1b38814e0bc8ac238d33f3d87cf" +dependencies = [ + "async-trait", + "clap", + "dotenvy", + "futures", + "sea-orm", + "sea-orm-cli", + "sea-schema", + "tracing", + "tracing-subscriber", +] + [[package]] name = "sea-query" version = "0.28.5" @@ -1785,6 +1869,29 @@ dependencies = [ "thiserror", ] +[[package]] +name = "sea-schema" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeb2940bb5a10bc6cd05b450ce6cd3993e27fddd7eface2becb97fc5af3a040e" +dependencies = [ + "futures", + "sea-query", + "sea-schema-derive", +] + +[[package]] +name = "sea-schema-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56821b7076f5096b8f726e2791ad255a99c82498e08ec477a65a96c461ff1927" +dependencies = [ + "heck 0.3.3", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "sea-strum" version = "0.23.0" @@ -2147,6 +2254,12 @@ dependencies = [ "unic-segment", ] +[[package]] +name = "textwrap" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" + [[package]] name = "thiserror" version = "1.0.40" diff --git a/Cargo.toml b/Cargo.toml index a5b5ce5..de549d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ log = "0.4" miette = "5.9" percent-encoding = "2.2" sea-orm = "0.11" +sea-orm-migration = "0.11" serde = "1" serde_json = "1" tera = { version = "1", default-features = false } diff --git a/README.md b/README.md index 140a416..546a4b8 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,6 @@ A social networking server anyone can self-host -**WARNING: Currently the project cannot be bootstrapped from scratch as -it requires a Calckey 14.0RC3 database model.** - **This project is in early development.** ## Quick start diff --git a/ext_calckey_model/Cargo.toml b/ext_calckey_model/Cargo.toml index f51d6c4..e8646cf 100644 --- a/ext_calckey_model/Cargo.toml +++ b/ext_calckey_model/Cargo.toml @@ -8,6 +8,8 @@ crate-type = ["rlib"] [dependencies] ck = { path = "./entity_ck" } +ext_calckey_model_migration = { path = "./migration" } + magnetar_common = { path = "../magnetar_common" } dotenvy = { workspace = true} diff --git a/ext_calckey_model/migration/Cargo.toml b/ext_calckey_model/migration/Cargo.toml new file mode 100644 index 0000000..d20128c --- /dev/null +++ b/ext_calckey_model/migration/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "ext_calckey_model_migration" +version.workspace = true +edition.workspace = true + +[[bin]] +name = "migrate" +path = "src/main.rs" + +[lib] +name = "ext_calckey_model_migration" +path = "src/lib.rs" + +[dependencies] +tokio = { workspace = true, features = ["full"] } +sea-orm-migration = { workspace = true, features = ["runtime-tokio-rustls", "sqlx-postgres"] } diff --git a/ext_calckey_model/migration/README.md b/ext_calckey_model/migration/README.md new file mode 100644 index 0000000..b3ea53e --- /dev/null +++ b/ext_calckey_model/migration/README.md @@ -0,0 +1,41 @@ +# Running Migrator CLI + +- Generate a new migration file + ```sh + cargo run -- migrate generate MIGRATION_NAME + ``` +- Apply all pending migrations + ```sh + cargo run + ``` + ```sh + cargo run -- up + ``` +- Apply first 10 pending migrations + ```sh + cargo run -- up -n 10 + ``` +- Rollback last applied migrations + ```sh + cargo run -- down + ``` +- Rollback last 10 applied migrations + ```sh + cargo run -- down -n 10 + ``` +- Drop all tables from the database, then reapply all migrations + ```sh + cargo run -- fresh + ``` +- Rollback all applied migrations, then reapply all migrations + ```sh + cargo run -- refresh + ``` +- Rollback all applied migrations + ```sh + cargo run -- reset + ``` +- Check the status of all migrations + ```sh + cargo run -- status + ``` diff --git a/ext_calckey_model/migration/src/bootstrap_down.sql b/ext_calckey_model/migration/src/bootstrap_down.sql new file mode 100644 index 0000000..d7e7223 --- /dev/null +++ b/ext_calckey_model/migration/src/bootstrap_down.sql @@ -0,0 +1,223 @@ +alter table drive_folder + drop constraint "FK_f4fc06e49c0171c85f1c48060d2"; + +alter table drive_file + drop constraint "FK_860fa6f6c7df5bb887249fba22e"; + +drop table poll_vote; + +drop table note_reaction; + +drop table note_watching; + +drop table note_unread; + +drop table notification; + +drop type notification_type_enum; + +drop table access_token; + +drop table meta; + +drop type meta_sensitivemediadetection_enum; + +drop type meta_sensitivemediadetectionsensitivity_enum; + +drop table following; + +drop table instance; + +drop table muting; + +drop table sw_subscription; + +drop table blocking; + +drop table user_list_joining; + +drop table hashtag; + +drop table note_favorite; + +drop table abuse_user_report; + +drop table registration_ticket; + +drop table messaging_message; + +drop table signin; + +drop table auth_session; + +drop table app; + +drop table follow_request; + +drop table emoji; + +drop table user_note_pining; + +drop table poll; + +drop type poll_notevisibility_enum; + +drop table user_keypair; + +drop table user_publickey; + +drop table user_profile; + +drop type user_profile_ffvisibility_enum; + +drop table __chart__active_users; + +drop table __chart__drive; + +drop table __chart__federation; + +drop table __chart__hashtag; + +drop table __chart__instance; + +drop table __chart__network; + +drop table __chart__notes; + +drop table __chart__per_user_drive; + +drop table __chart__per_user_following; + +drop table __chart__per_user_notes; + +drop table __chart__per_user_reaction; + +drop table __chart__test_grouped; + +drop table __chart__test_unique; + +drop table __chart__test; + +drop table __chart__users; + +drop table page_like; + +drop table page; + +drop type page_visibility_enum; + +drop table user_group_invite; + +drop table attestation_challenge; + +drop table user_security_key; + +drop table moderation_log; + +drop table used_username; + +drop table announcement_read; + +drop table announcement; + +drop table clip_note; + +drop table clip; + +drop table antenna_note; + +drop table antenna; + +drop type antenna_src_enum; + +drop table user_list; + +drop table user_group_joining; + +drop table user_group_invitation; + +drop table user_group; + +drop table promo_note; + +drop table promo_read; + +drop table relay; + +drop type relay_status_enum; + +drop table muted_note; + +drop type muted_note_reason_enum; + +drop table channel_following; + +drop table channel_note_pining; + +drop table registry_item; + +drop table gallery_like; + +drop table gallery_post; + +drop table password_reset_request; + +drop table ad; + +drop table user_pending; + +drop table note_thread_muting; + +drop table __chart_day__federation; + +drop table __chart_day__notes; + +drop table __chart_day__users; + +drop table __chart_day__network; + +drop table __chart_day__active_users; + +drop table __chart_day__instance; + +drop table __chart_day__per_user_notes; + +drop table __chart_day__drive; + +drop table __chart_day__per_user_reaction; + +drop table __chart_day__hashtag; + +drop table __chart_day__per_user_following; + +drop table __chart_day__per_user_drive; + +drop table __chart__ap_request; + +drop table __chart_day__ap_request; + +drop table webhook; + +drop table user_ip; + +drop table renote_muting; + +drop table note_edit; + +drop table note; + +drop type note_visibility_enum; + +drop table channel; + +drop table "user"; + +drop table drive_file; + +drop table drive_folder; + +drop function note_replies(varchar, integer, integer); + +drop type log_level_enum; + +drop type user_profile_mutingnotificationtypes_enum; \ No newline at end of file diff --git a/ext_calckey_model/migration/src/bootstrap_up.sql b/ext_calckey_model/migration/src/bootstrap_up.sql new file mode 100644 index 0000000..32987fb --- /dev/null +++ b/ext_calckey_model/migration/src/bootstrap_up.sql @@ -0,0 +1,3168 @@ +create type log_level_enum as enum ('error', 'warning', 'info', 'success', 'debug'); + +create type note_visibility_enum as enum ('public', 'home', 'followers', 'specified', 'hidden'); + +create type poll_notevisibility_enum as enum ('public', 'home', 'followers', 'specified'); + +create type page_visibility_enum as enum ('public', 'followers', 'specified'); + +create type antenna_src_enum as enum ('home', 'all', 'users', 'list', 'group', 'instances'); + +create type relay_status_enum as enum ('requesting', 'accepted', 'rejected'); + +create type muted_note_reason_enum as enum ('word', 'manual', 'spam', 'other'); + +create type user_profile_mutingnotificationtypes_enum as enum ('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app'); + +create type user_profile_ffvisibility_enum as enum ('public', 'followers', 'private'); + +create type notification_type_enum as enum ('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app'); + +create type meta_sensitivemediadetection_enum as enum ('none', 'all', 'local', 'remote'); + +create type meta_sensitivemediadetectionsensitivity_enum as enum ('medium', 'low', 'high', 'veryLow', 'veryHigh'); + +create table if not exists drive_folder +( + id varchar(32) not null + constraint "PK_7a0c089191f5ebdc214e0af808a" + primary key, + "createdAt" timestamp with time zone not null, + name varchar(128) not null, + "userId" varchar(32), + "parentId" varchar(32) + constraint "FK_00ceffb0cdc238b3233294f08f2" + references drive_folder + on delete set null +); + +comment on column drive_folder."createdAt" is 'The created date of the DriveFolder.'; + +comment on column drive_folder.name is 'The name of the DriveFolder.'; + +comment on column drive_folder."userId" is 'The owner ID.'; + +comment on column drive_folder."parentId" is 'The parent folder ID. If null, it means the DriveFolder is located in root.'; + +create index if not exists "IDX_02878d441ceae15ce060b73daf" + on drive_folder ("createdAt"); + +create index if not exists "IDX_f4fc06e49c0171c85f1c48060d" + on drive_folder ("userId"); + +create index if not exists "IDX_00ceffb0cdc238b3233294f08f" + on drive_folder ("parentId"); + +create table if not exists drive_file +( + id varchar(32) not null + constraint "PK_43ddaaaf18c9e68029b7cbb032e" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32), + "userHost" varchar(128), + md5 varchar(32) not null, + name varchar(256) not null, + type varchar(128) not null, + size integer not null, + comment varchar(8192), + properties jsonb default '{}'::jsonb not null, + "storedInternal" boolean not null, + url varchar(512) not null, + "thumbnailUrl" varchar(512), + "webpublicUrl" varchar(512), + "accessKey" varchar(256), + "thumbnailAccessKey" varchar(256), + "webpublicAccessKey" varchar(256), + uri varchar(512), + src varchar(512), + "folderId" varchar(32) + constraint "FK_bb90d1956dafc4068c28aa7560a" + references drive_folder + on delete set null, + "isSensitive" boolean default false not null, + "isLink" boolean default false not null, + blurhash varchar(128), + "webpublicType" varchar(128), + "requestHeaders" jsonb default '{}'::jsonb, + "requestIp" varchar(128), + "maybeSensitive" boolean default false not null, + "maybePorn" boolean default false not null +); + +comment on column drive_file."createdAt" is 'The created date of the DriveFile.'; + +comment on column drive_file."userId" is 'The owner ID.'; + +comment on column drive_file."userHost" is 'The host of owner. It will be null if the user in local.'; + +comment on column drive_file.md5 is 'The MD5 hash of the DriveFile.'; + +comment on column drive_file.name is 'The file name of the DriveFile.'; + +comment on column drive_file.type is 'The content type (MIME) of the DriveFile.'; + +comment on column drive_file.size is 'The file size (bytes) of the DriveFile.'; + +comment on column drive_file.comment is 'The comment of the DriveFile.'; + +comment on column drive_file.properties is 'The any properties of the DriveFile. For example, it includes image width/height.'; + +comment on column drive_file.url is 'The URL of the DriveFile.'; + +comment on column drive_file."thumbnailUrl" is 'The URL of the thumbnail of the DriveFile.'; + +comment on column drive_file."webpublicUrl" is 'The URL of the webpublic of the DriveFile.'; + +comment on column drive_file.uri is 'The URI of the DriveFile. it will be null when the DriveFile is local.'; + +comment on column drive_file."folderId" is 'The parent folder ID. If null, it means the DriveFile is located in root.'; + +comment on column drive_file."isSensitive" is 'Whether the DriveFile is NSFW.'; + +comment on column drive_file."isLink" is 'Whether the DriveFile is direct link to remote server.'; + +comment on column drive_file.blurhash is 'The BlurHash string.'; + +comment on column drive_file."maybeSensitive" is 'Whether the DriveFile is NSFW. (predict)'; + +create index if not exists "IDX_c8dfad3b72196dd1d6b5db168a" + on drive_file ("createdAt"); + +create index if not exists "IDX_860fa6f6c7df5bb887249fba22" + on drive_file ("userId"); + +create index if not exists "IDX_92779627994ac79277f070c91e" + on drive_file ("userHost"); + +create index if not exists "IDX_37bb9a1b4585f8a3beb24c62d6" + on drive_file (md5); + +create index if not exists "IDX_a40b8df8c989d7db937ea27cf6" + on drive_file (type); + +create unique index if not exists "IDX_d85a184c2540d2deba33daf642" + on drive_file ("accessKey"); + +create unique index if not exists "IDX_e74022ce9a074b3866f70e0d27" + on drive_file ("thumbnailAccessKey"); + +create unique index if not exists "IDX_c55b2b7c284d9fef98026fc88e" + on drive_file ("webpublicAccessKey"); + +create index if not exists "IDX_e5848eac4940934e23dbc17581" + on drive_file (uri); + +create index if not exists "IDX_bb90d1956dafc4068c28aa7560" + on drive_file ("folderId"); + +create index if not exists "IDX_55720b33a61a7c806a8215b825" + on drive_file ("userId", "folderId", id); + +create index if not exists "IDX_a7eba67f8b3fa27271e85d2e26" + on drive_file ("isSensitive"); + +create index if not exists "IDX_315c779174fe8247ab324f036e" + on drive_file ("isLink"); + +create index if not exists "IDX_3b33dff77bb64b23c88151d23e" + on drive_file ("maybeSensitive"); + +create index if not exists "IDX_8bdcd3dd2bddb78014999a16ce" + on drive_file ("maybePorn"); + +create table if not exists "user" +( + id varchar(32) not null + constraint "PK_cace4a159ff9f2512dd42373760" + primary key, + "createdAt" timestamp with time zone not null, + "updatedAt" timestamp with time zone, + "lastFetchedAt" timestamp with time zone, + username varchar(128) not null, + "usernameLower" varchar(128) not null, + name varchar(128), + "followersCount" integer default 0 not null, + "followingCount" integer default 0 not null, + "notesCount" integer default 0 not null, + "avatarId" varchar(32) + constraint "REL_58f5c71eaab331645112cf8cfa" + unique + constraint "FK_58f5c71eaab331645112cf8cfa5" + references drive_file + on delete set null, + "bannerId" varchar(32) + constraint "REL_afc64b53f8db3707ceb34eb28e" + unique + constraint "FK_afc64b53f8db3707ceb34eb28e2" + references drive_file + on delete set null, + tags varchar(128)[] default '{}'::character varying[] not null, + "isSuspended" boolean default false not null, + "isSilenced" boolean default false not null, + "isLocked" boolean default false not null, + "isBot" boolean default false not null, + "isCat" boolean default false not null, + "isAdmin" boolean default false not null, + "isModerator" boolean default false not null, + emojis varchar(128)[] default '{}'::character varying[] not null, + host varchar(128), + inbox varchar(512), + "sharedInbox" varchar(512), + featured varchar(512), + uri varchar(512), + token char(16) + constraint "UQ_a854e557b1b14814750c7c7b0c9" + unique, + "isExplorable" boolean default true not null, + "followersUri" varchar(512), + "lastActiveDate" timestamp with time zone, + "hideOnlineStatus" boolean default false not null, + "isDeleted" boolean default false not null, + "driveCapacityOverrideMb" integer, + "movedToUri" varchar(512), + "alsoKnownAs" text, + "speakAsCat" boolean default true not null +); + +comment on column "user"."createdAt" is 'The created date of the User.'; + +comment on column "user"."updatedAt" is 'The updated date of the User.'; + +comment on column "user".username is 'The username of the User.'; + +comment on column "user"."usernameLower" is 'The username (lowercased) of the User.'; + +comment on column "user".name is 'The name of the User.'; + +comment on column "user"."followersCount" is 'The count of followers.'; + +comment on column "user"."followingCount" is 'The count of following.'; + +comment on column "user"."notesCount" is 'The count of notes.'; + +comment on column "user"."avatarId" is 'The ID of avatar DriveFile.'; + +comment on column "user"."bannerId" is 'The ID of banner DriveFile.'; + +comment on column "user"."isSuspended" is 'Whether the User is suspended.'; + +comment on column "user"."isSilenced" is 'Whether the User is silenced.'; + +comment on column "user"."isLocked" is 'Whether the User is locked.'; + +comment on column "user"."isBot" is 'Whether the User is a bot.'; + +comment on column "user"."isCat" is 'Whether the User is a cat.'; + +comment on column "user"."isAdmin" is 'Whether the User is the admin.'; + +comment on column "user"."isModerator" is 'Whether the User is a moderator.'; + +comment on column "user".host is 'The host of the User. It will be null if the origin of the user is local.'; + +comment on column "user".inbox is 'The inbox URL of the User. It will be null if the origin of the user is local.'; + +comment on column "user"."sharedInbox" is 'The sharedInbox URL of the User. It will be null if the origin of the user is local.'; + +comment on column "user".featured is 'The featured URL of the User. It will be null if the origin of the user is local.'; + +comment on column "user".uri is 'The URI of the User. It will be null if the origin of the user is local.'; + +comment on column "user".token is 'The native access token of the User. It will be null if the origin of the user is local.'; + +comment on column "user"."isExplorable" is 'Whether the User is explorable.'; + +comment on column "user"."followersUri" is 'The URI of the user Follower Collection. It will be null if the origin of the user is local.'; + +comment on column "user"."isDeleted" is 'Whether the User is deleted.'; + +comment on column "user"."driveCapacityOverrideMb" is 'Overrides user drive capacity limit'; + +comment on column "user"."movedToUri" is 'The URI of the new account of the User'; + +comment on column "user"."alsoKnownAs" is 'URIs the user is known as too'; + +comment on column "user"."speakAsCat" is 'Whether to speak as a cat if isCat.'; + +alter table drive_folder + add constraint "FK_f4fc06e49c0171c85f1c48060d2" + foreign key ("userId") references "user" + on delete cascade; + + +alter table drive_file + add constraint "FK_860fa6f6c7df5bb887249fba22e" + foreign key ("userId") references "user" + on delete set null; + +create index if not exists "IDX_e11e649824a45d8ed01d597fd9" + on "user" ("createdAt"); + +create index if not exists "IDX_80ca6e6ef65fb9ef34ea8c90f4" + on "user" ("updatedAt"); + +create index if not exists "IDX_a27b942a0d6dcff90e3ee9b5e8" + on "user" ("usernameLower"); + +create index if not exists "IDX_fa99d777623947a5b05f394cae" + on "user" (tags); + +create index if not exists "IDX_3252a5df8d5bbd16b281f7799e" + on "user" (host); + +create index if not exists "IDX_be623adaa4c566baf5d29ce0c8" + on "user" (uri); + +create unique index if not exists "IDX_a854e557b1b14814750c7c7b0c" + on "user" (token); + +create unique index if not exists "IDX_5deb01ae162d1d70b80d064c27" + on "user" ("usernameLower", host); + +create index if not exists "IDX_d5a1b83c7cab66f167e6888188" + on "user" ("isExplorable"); + +create index if not exists "IDX_c8cc87bd0f2f4487d17c651fbf" + on "user" ("lastActiveDate"); + +create table if not exists app +( + id varchar(32) not null + constraint "PK_9478629fc093d229df09e560aea" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) + constraint "FK_3f5b0899ef90527a3462d7c2cb3" + references "user" + on delete set null, + secret varchar(64) not null, + name varchar(128) not null, + description varchar(512) not null, + permission varchar(64)[] not null, + "callbackUrl" varchar(512) +); + +comment on column app."createdAt" is 'The created date of the App.'; + +comment on column app."userId" is 'The owner ID.'; + +comment on column app.secret is 'The secret key of the App.'; + +comment on column app.name is 'The name of the App.'; + +comment on column app.description is 'The description of the App.'; + +comment on column app.permission is 'The permission of the App.'; + +comment on column app."callbackUrl" is 'The callbackUrl of the App.'; + +create index if not exists "IDX_048a757923ed8b157e9895da53" + on app ("createdAt"); + +create index if not exists "IDX_3f5b0899ef90527a3462d7c2cb" + on app ("userId"); + +create index if not exists "IDX_f49922d511d666848f250663c4" + on app (secret); + +create table if not exists access_token +( + id varchar(32) not null + constraint "PK_f20f028607b2603deabd8182d12" + primary key, + "createdAt" timestamp with time zone not null, + token varchar(128) not null, + hash varchar(128) not null, + "userId" varchar(32) not null + constraint "FK_9949557d0e1b2c19e5344c171e9" + references "user" + on delete cascade, + "appId" varchar(32) + constraint "FK_a3ff16c90cc87a82a0b5959e560" + references app + on delete cascade, + "lastUsedAt" timestamp with time zone, + session varchar(128), + name varchar(128), + description varchar(512), + "iconUrl" varchar(512), + permission varchar(64)[] default '{}'::character varying[] not null, + fetched boolean default false not null +); + +comment on column access_token."createdAt" is 'The created date of the AccessToken.'; + +create index if not exists "IDX_70ba8f6af34bc924fc9e12adb8" + on access_token (token); + +create index if not exists "IDX_64c327441248bae40f7d92f34f" + on access_token (hash); + +create index if not exists "IDX_9949557d0e1b2c19e5344c171e" + on access_token ("userId"); + +create index if not exists "IDX_bf3a053c07d9fb5d87317c56ee" + on access_token (session); + +create table if not exists meta +( + id varchar(32) not null + constraint "PK_c4c17a6c2bd7651338b60fc590b" + primary key, + name varchar(128), + description varchar(1024), + "maintainerName" varchar(128), + "maintainerEmail" varchar(128), + "disableRegistration" boolean default false not null, + "disableLocalTimeline" boolean default false not null, + "disableGlobalTimeline" boolean default false not null, + "useStarForReactionFallback" boolean default false not null, + langs varchar(64)[] default '{}'::character varying[] not null, + "hiddenTags" varchar(256)[] default '{}'::character varying[] not null, + "blockedHosts" varchar(256)[] default '{}'::character varying[] not null, + "mascotImageUrl" varchar(512) default '/assets/ai.png'::character varying, + "bannerUrl" varchar(512), + "errorImageUrl" varchar(512) default 'https://xn--931a.moe/aiart/yubitun.png'::character varying, + "iconUrl" varchar(512), + "cacheRemoteFiles" boolean default true not null, + "enableRecaptcha" boolean default false not null, + "recaptchaSiteKey" varchar(64), + "recaptchaSecretKey" varchar(64), + "localDriveCapacityMb" integer default 1024 not null, + "remoteDriveCapacityMb" integer default 32 not null, + "summalyProxy" varchar(128), + "enableEmail" boolean default false not null, + email varchar(128), + "smtpSecure" boolean default false not null, + "smtpHost" varchar(128), + "smtpPort" integer, + "smtpUser" varchar(128), + "smtpPass" varchar(128), + "enableServiceWorker" boolean default false not null, + "swPublicKey" varchar(128), + "swPrivateKey" varchar(128), + "enableTwitterIntegration" boolean default false not null, + "twitterConsumerKey" varchar(128), + "twitterConsumerSecret" varchar(128), + "enableGithubIntegration" boolean default false not null, + "githubClientId" varchar(128), + "githubClientSecret" varchar(128), + "enableDiscordIntegration" boolean default false not null, + "discordClientId" varchar(128), + "discordClientSecret" varchar(128), + "pinnedUsers" varchar(256)[] default '{}'::character varying[] not null, + "ToSUrl" varchar(512), + "repositoryUrl" varchar(512) default 'https://github.com/misskey-dev/misskey'::character varying not null, + "feedbackUrl" varchar(512) default 'https://github.com/misskey-dev/misskey/issues/new'::character varying, + "useObjectStorage" boolean default false not null, + "objectStorageBucket" varchar(512), + "objectStoragePrefix" varchar(512), + "objectStorageBaseUrl" varchar(512), + "objectStorageEndpoint" varchar(512), + "objectStorageRegion" varchar(512), + "objectStorageAccessKey" varchar(512), + "objectStorageSecretKey" varchar(512), + "objectStoragePort" integer, + "objectStorageUseSSL" boolean default true not null, + "proxyAccountId" varchar(32) + constraint "FK_ab1bc0c1e209daa77b8e8d212ad" + references "user" + on delete set null, + "objectStorageUseProxy" boolean default true not null, + "enableHcaptcha" boolean default false not null, + "hcaptchaSiteKey" varchar(64), + "hcaptchaSecretKey" varchar(64), + "objectStorageSetPublicRead" boolean default false not null, + "pinnedPages" varchar(512)[] default '{/featured,/channels,/explore,/pages,/about-misskey}'::character varying[] not null, + "backgroundImageUrl" varchar(512), + "logoImageUrl" varchar(512), + "pinnedClipId" varchar(32), + "objectStorageS3ForcePathStyle" boolean default true not null, + "allowedHosts" varchar(256)[] default '{}'::character varying[], + "secureMode" boolean default false, + "privateMode" boolean default false, + "deeplAuthKey" varchar(128), + "deeplIsPro" boolean default false not null, + "emailRequiredForSignup" boolean default false not null, + "themeColor" varchar(512), + "defaultLightTheme" varchar(8192), + "defaultDarkTheme" varchar(8192), + "sensitiveMediaDetection" meta_sensitivemediadetection_enum default 'none'::meta_sensitivemediadetection_enum not null, + "sensitiveMediaDetectionSensitivity" meta_sensitivemediadetectionsensitivity_enum default 'medium'::meta_sensitivemediadetectionsensitivity_enum not null, + "setSensitiveFlagAutomatically" boolean default false not null, + "enableIpLogging" boolean default false not null, + "enableSensitiveMediaDetectionForVideos" boolean default false not null, + "enableActiveEmailValidation" boolean default true not null, + "customMOTD" varchar(256)[] default '{}'::character varying[] not null, + "customSplashIcons" varchar(256)[] default '{}'::character varying[] not null, + "disableRecommendedTimeline" boolean default true not null, + "recommendedInstances" varchar(256)[] default '{}'::character varying[] not null, + "enableGuestTimeline" boolean default false not null, + "defaultReaction" varchar(256) default '⭐'::character varying not null, + "libreTranslateApiUrl" varchar(512), + "libreTranslateApiKey" varchar(128), + "silencedHosts" varchar(256)[] default '{}'::character varying[] not null, + "experimentalFeatures" jsonb default '{}'::jsonb not null +); + +comment on column meta."localDriveCapacityMb" is 'Drive capacity of a local user (MB)'; + +comment on column meta."remoteDriveCapacityMb" is 'Drive capacity of a remote user (MB)'; + +comment on column meta."defaultReaction" is 'The fallback reaction for emoji reacts'; + +create table if not exists following +( + id varchar(32) not null + constraint "PK_c76c6e044bdf76ecf8bfb82a645" + primary key, + "createdAt" timestamp with time zone not null, + "followeeId" varchar(32) not null + constraint "FK_24e0042143a18157b234df186c3" + references "user" + on delete cascade, + "followerId" varchar(32) not null + constraint "FK_6516c5a6f3c015b4eed39978be5" + references "user" + on delete cascade, + "followerHost" varchar(128), + "followerInbox" varchar(512), + "followerSharedInbox" varchar(512), + "followeeHost" varchar(128), + "followeeInbox" varchar(512), + "followeeSharedInbox" varchar(512) +); + +comment on column following."createdAt" is 'The created date of the Following.'; + +comment on column following."followeeId" is 'The followee user ID.'; + +comment on column following."followerId" is 'The follower user ID.'; + +comment on column following."followerHost" is '[Denormalized]'; + +comment on column following."followerInbox" is '[Denormalized]'; + +comment on column following."followerSharedInbox" is '[Denormalized]'; + +comment on column following."followeeHost" is '[Denormalized]'; + +comment on column following."followeeInbox" is '[Denormalized]'; + +comment on column following."followeeSharedInbox" is '[Denormalized]'; + +create index if not exists "IDX_582f8fab771a9040a12961f3e7" + on following ("createdAt"); + +create index if not exists "IDX_24e0042143a18157b234df186c" + on following ("followeeId"); + +create index if not exists "IDX_6516c5a6f3c015b4eed39978be" + on following ("followerId"); + +create unique index if not exists "IDX_307be5f1d1252e0388662acb96" + on following ("followerId", "followeeId"); + +create index if not exists "IDX_4ccd2239268ebbd1b35e318754" + on following ("followerHost"); + +create index if not exists "IDX_fcdafee716dfe9c3b5fde90f30" + on following ("followeeHost"); + +create table if not exists instance +( + id varchar(32) not null + constraint "PK_eaf60e4a0c399c9935413e06474" + primary key, + "caughtAt" timestamp with time zone not null, + host varchar(128) not null, + "usersCount" integer default 0 not null, + "notesCount" integer default 0 not null, + "followingCount" integer default 0 not null, + "followersCount" integer default 0 not null, + "latestRequestSentAt" timestamp with time zone, + "latestStatus" integer, + "latestRequestReceivedAt" timestamp with time zone, + "lastCommunicatedAt" timestamp with time zone not null, + "isNotResponding" boolean default false not null, + "softwareName" varchar(64), + "softwareVersion" varchar(64), + "openRegistrations" boolean, + name varchar(256), + description varchar(4096), + "maintainerName" varchar(128), + "maintainerEmail" varchar(256), + "infoUpdatedAt" timestamp with time zone, + "isSuspended" boolean default false not null, + "iconUrl" varchar(256), + "themeColor" varchar(64), + "faviconUrl" varchar(256) +); + +comment on column instance."caughtAt" is 'The caught date of the Instance.'; + +comment on column instance.host is 'The host of the Instance.'; + +comment on column instance."usersCount" is 'The count of the users of the Instance.'; + +comment on column instance."notesCount" is 'The count of the notes of the Instance.'; + +comment on column instance."softwareName" is 'The software of the Instance.'; + +create index if not exists "IDX_2cd3b2a6b4cf0b910b260afe08" + on instance ("caughtAt"); + +create unique index if not exists "IDX_8d5afc98982185799b160e10eb" + on instance (host); + +create index if not exists "IDX_34500da2e38ac393f7bb6b299c" + on instance ("isSuspended"); + +create table if not exists muting +( + id varchar(32) not null + constraint "PK_2e92d06c8b5c602eeb27ca9ba48" + primary key, + "createdAt" timestamp with time zone not null, + "muteeId" varchar(32) not null + constraint "FK_ec96b4fed9dae517e0dbbe0675c" + references "user" + on delete cascade, + "muterId" varchar(32) not null + constraint "FK_93060675b4a79a577f31d260c67" + references "user" + on delete cascade, + "expiresAt" timestamp with time zone +); + +comment on column muting."createdAt" is 'The created date of the Muting.'; + +comment on column muting."muteeId" is 'The mutee user ID.'; + +comment on column muting."muterId" is 'The muter user ID.'; + +create index if not exists "IDX_f86d57fbca33c7a4e6897490cc" + on muting ("createdAt"); + +create index if not exists "IDX_ec96b4fed9dae517e0dbbe0675" + on muting ("muteeId"); + +create index if not exists "IDX_93060675b4a79a577f31d260c6" + on muting ("muterId"); + +create unique index if not exists "IDX_1eb9d9824a630321a29fd3b290" + on muting ("muterId", "muteeId"); + +create index if not exists "IDX_c1fd1c3dfb0627aa36c253fd14" + on muting ("expiresAt"); + +create index if not exists "IDX_renote_muting_createdAt" + on muting ("createdAt"); + +create index if not exists "IDX_renote_muting_muteeId" + on muting ("muteeId"); + +create index if not exists "IDX_renote_muting_muterId" + on muting ("muterId"); + +create table if not exists sw_subscription +( + id varchar(32) not null + constraint "PK_e8f763631530051b95eb6279b91" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_97754ca6f2baff9b4abb7f853dd" + references "user" + on delete cascade, + endpoint varchar(512) not null, + auth varchar(256) not null, + publickey varchar(128) not null, + "sendReadMessage" boolean default false not null +); + +create index if not exists "IDX_97754ca6f2baff9b4abb7f853d" + on sw_subscription ("userId"); + +create table if not exists blocking +( + id varchar(32) not null + constraint "PK_e5d9a541cc1965ee7e048ea09dd" + primary key, + "createdAt" timestamp with time zone not null, + "blockeeId" varchar(32) not null + constraint "FK_2cd4a2743a99671308f5417759e" + references "user" + on delete cascade, + "blockerId" varchar(32) not null + constraint "FK_0627125f1a8a42c9a1929edb552" + references "user" + on delete cascade +); + +comment on column blocking."createdAt" is 'The created date of the Blocking.'; + +comment on column blocking."blockeeId" is 'The blockee user ID.'; + +comment on column blocking."blockerId" is 'The blocker user ID.'; + +create index if not exists "IDX_b9a354f7941c1e779f3b33aea6" + on blocking ("createdAt"); + +create index if not exists "IDX_2cd4a2743a99671308f5417759" + on blocking ("blockeeId"); + +create index if not exists "IDX_0627125f1a8a42c9a1929edb55" + on blocking ("blockerId"); + +create unique index if not exists "IDX_98a1bc5cb30dfd159de056549f" + on blocking ("blockerId", "blockeeId"); + +create table if not exists user_list +( + id varchar(32) not null + constraint "PK_87bab75775fd9b1ff822b656402" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + + constraint "FK_b7fcefbdd1c18dce86687531f99" + references "user" + on delete cascade, + name varchar(128) not null +); + +comment on column user_list."createdAt" is 'The created date of the UserList.'; + +comment on column user_list."userId" is 'The owner ID.'; + +comment on column user_list.name is 'The name of the UserList.'; + +create index if not exists "IDX_b7fcefbdd1c18dce86687531f9" + on user_list ("userId"); + +create table if not exists user_list_joining +( + id varchar(32) not null + constraint "PK_11abb3768da1c5f8de101c9df45" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_d844bfc6f3f523a05189076efaa" + references "user" + on delete cascade, + "userListId" varchar(32) not null + constraint "FK_605472305f26818cc93d1baaa74" + references user_list + on delete cascade +); + +comment on column user_list_joining."createdAt" is 'The created date of the UserListJoining.'; + +comment on column user_list_joining."userId" is 'The user ID.'; + +comment on column user_list_joining."userListId" is 'The list ID.'; + +create index if not exists "IDX_d844bfc6f3f523a05189076efa" + on user_list_joining ("userId"); + +create index if not exists "IDX_605472305f26818cc93d1baaa7" + on user_list_joining ("userListId"); + +create unique index if not exists "IDX_90f7da835e4c10aca6853621e1" + on user_list_joining ("userId", "userListId"); + +create table if not exists hashtag +( + id varchar(32) not null + constraint "PK_cb36eb8af8412bfa978f1165d78" + primary key, + name varchar(128) not null, + "mentionedUserIds" varchar(32)[] not null, + "mentionedUsersCount" integer default 0 not null, + "mentionedLocalUserIds" varchar(32)[] not null, + "mentionedLocalUsersCount" integer default 0 not null, + "mentionedRemoteUserIds" varchar(32)[] not null, + "mentionedRemoteUsersCount" integer default 0 not null, + "attachedUserIds" varchar(32)[] not null, + "attachedUsersCount" integer default 0 not null, + "attachedLocalUserIds" varchar(32)[] not null, + "attachedLocalUsersCount" integer default 0 not null, + "attachedRemoteUserIds" varchar(32)[] not null, + "attachedRemoteUsersCount" integer default 0 not null +); + +create unique index if not exists "IDX_347fec870eafea7b26c8a73bac" + on hashtag (name); + +create index if not exists "IDX_2710a55f826ee236ea1a62698f" + on hashtag ("mentionedUsersCount"); + +create index if not exists "IDX_0e206cec573f1edff4a3062923" + on hashtag ("mentionedLocalUsersCount"); + +create index if not exists "IDX_4c02d38a976c3ae132228c6fce" + on hashtag ("mentionedRemoteUsersCount"); + +create index if not exists "IDX_d57f9030cd3af7f63ffb1c267c" + on hashtag ("attachedUsersCount"); + +create index if not exists "IDX_0c44bf4f680964145f2a68a341" + on hashtag ("attachedLocalUsersCount"); + +create index if not exists "IDX_0b03cbcd7e6a7ce068efa8ecc2" + on hashtag ("attachedRemoteUsersCount"); + +create table if not exists abuse_user_report +( + id varchar(32) not null + constraint "PK_87873f5f5cc5c321a1306b2d18c" + primary key, + "createdAt" timestamp with time zone not null, + "targetUserId" varchar(32) not null + constraint fk_7f4e851a35d81b64dda28eee0 + references "user" + on delete cascade, + "reporterId" varchar(32) not null + constraint "FK_04cc96756f89d0b7f9473e8cdf3" + references "user" + on delete cascade, + "assigneeId" varchar(32) + constraint "FK_08b883dd5fdd6f9c4c1572b36de" + references "user" + on delete set null, + resolved boolean default false not null, + comment varchar(2048) not null, + "targetUserHost" varchar(128), + "reporterHost" varchar(128), + forwarded boolean default false not null +); + +comment on column abuse_user_report."createdAt" is 'The created date of the AbuseUserReport.'; + +comment on column abuse_user_report."targetUserHost" is '[Denormalized]'; + +comment on column abuse_user_report."reporterHost" is '[Denormalized]'; + +create index if not exists "IDX_db2098070b2b5a523c58181f74" + on abuse_user_report ("createdAt"); + +create index if not exists "IDX_04cc96756f89d0b7f9473e8cdf" + on abuse_user_report ("reporterId"); + +create index if not exists "IDX_2b15aaf4a0dc5be3499af7ab6a" + on abuse_user_report (resolved); + +create index if not exists "IDX_4ebbf7f93cdc10e8d1ef2fc6cd" + on abuse_user_report ("targetUserHost"); + +create index if not exists "IDX_f8d8b93740ad12c4ce8213a199" + on abuse_user_report ("reporterHost"); + +create table if not exists registration_ticket +( + id varchar(32) not null + constraint "PK_f11696b6fafcf3662d4292734f8" + primary key, + "createdAt" timestamp with time zone not null, + code varchar(64) not null +); + +create unique index if not exists "IDX_0ff69e8dfa9fe31bb4a4660f59" + on registration_ticket (code); + +create table if not exists signin +( + id varchar(32) not null + constraint "PK_9e96ddc025712616fc492b3b588" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_2c308dbdc50d94dc625670055f7" + references "user" + on delete cascade, + ip varchar(128) not null, + headers jsonb not null, + success boolean not null +); + +comment on column signin."createdAt" is 'The created date of the Signin.'; + +create index if not exists "IDX_2c308dbdc50d94dc625670055f" + on signin ("userId"); + +create table if not exists auth_session +( + id varchar(32) not null + constraint "PK_19354ed146424a728c1112a8cbf" + primary key, + "createdAt" timestamp with time zone not null, + token varchar(128) not null, + "userId" varchar(32) + constraint "FK_c072b729d71697f959bde66ade0" + references "user" + on delete cascade, + "appId" varchar(32) not null + constraint "FK_dbe037d4bddd17b03a1dc778dee" + references app + on delete cascade +); + +comment on column auth_session."createdAt" is 'The created date of the AuthSession.'; + +create index if not exists "IDX_62cb09e1129f6ec024ef66e183" + on auth_session (token); + +create table if not exists follow_request +( + id varchar(32) not null + constraint "PK_53a9aa3725f7a3deb150b39dbfc" + primary key, + "createdAt" timestamp with time zone not null, + "followeeId" varchar(32) not null + constraint "FK_12c01c0d1a79f77d9f6c15fadd2" + references "user" + on delete cascade, + "followerId" varchar(32) not null + constraint "FK_a7fd92dd6dc519e6fb435dd108f" + references "user" + on delete cascade, + "requestId" varchar(128), + "followerHost" varchar(128), + "followerInbox" varchar(512), + "followerSharedInbox" varchar(512), + "followeeHost" varchar(128), + "followeeInbox" varchar(512), + "followeeSharedInbox" varchar(512) +); + +comment on column follow_request."createdAt" is 'The created date of the FollowRequest.'; + +comment on column follow_request."followeeId" is 'The followee user ID.'; + +comment on column follow_request."followerId" is 'The follower user ID.'; + +comment on column follow_request."requestId" is 'id of Follow Activity.'; + +comment on column follow_request."followerHost" is '[Denormalized]'; + +comment on column follow_request."followerInbox" is '[Denormalized]'; + +comment on column follow_request."followerSharedInbox" is '[Denormalized]'; + +comment on column follow_request."followeeHost" is '[Denormalized]'; + +comment on column follow_request."followeeInbox" is '[Denormalized]'; + +comment on column follow_request."followeeSharedInbox" is '[Denormalized]'; + +create index if not exists "IDX_12c01c0d1a79f77d9f6c15fadd" + on follow_request ("followeeId"); + +create index if not exists "IDX_a7fd92dd6dc519e6fb435dd108" + on follow_request ("followerId"); + +create unique index if not exists "IDX_d54a512b822fac7ed52800f6b4" + on follow_request ("followerId", "followeeId"); + +create table if not exists emoji +( + id varchar(32) not null + constraint "PK_df74ce05e24999ee01ea0bc50a3" + primary key, + "updatedAt" timestamp with time zone, + name varchar(128) not null, + host varchar(128), + "originalUrl" varchar(512) not null, + uri varchar(512), + type varchar(64), + aliases varchar(128)[] default '{}'::character varying[] not null, + category varchar(128), + "publicUrl" varchar(512) default ''::character varying not null, + license varchar(1024), + width integer, + height integer +); + +comment on column emoji.width is 'Image width'; + +comment on column emoji.height is 'Image height'; + +create index if not exists "IDX_b37dafc86e9af007e3295c2781" + on emoji (name); + +create index if not exists "IDX_5900e907bb46516ddf2871327c" + on emoji (host); + +create unique index if not exists "IDX_4f4d35e1256c84ae3d1f0eab10" + on emoji (name, host); + +create table if not exists user_keypair +( + "userId" varchar(32) not null + constraint "PK_f4853eb41ab722fe05f81cedeb6" + primary key + constraint "UQ_f4853eb41ab722fe05f81cedeb6" + unique + constraint "FK_f4853eb41ab722fe05f81cedeb6" + references "user" + on delete cascade, + "publicKey" varchar(4096) not null, + "privateKey" varchar(4096) not null +); + +create table if not exists user_publickey +( + "userId" varchar(32) not null + constraint "PK_10c146e4b39b443ede016f6736d" + primary key + constraint "UQ_10c146e4b39b443ede016f6736d" + unique + constraint "FK_10c146e4b39b443ede016f6736d" + references "user" + on delete cascade, + "keyId" varchar(256) not null, + "keyPem" varchar(4096) not null +); + +create unique index if not exists "IDX_171e64971c780ebd23fae140bb" + on user_publickey ("keyId"); + +create table if not exists __chart__active_users +( + id serial + constraint "PK_317237a9f733b970604a11e314f" + primary key, + date integer not null + constraint "UQ_0ad37b7ef50f4ddc84363d7ccca" + unique, + "unique_temp___registeredWithinWeek" character varying[] default '{}'::character varying[] not null, + "___registeredWithinWeek" smallint default '0'::smallint not null, + "unique_temp___registeredWithinMonth" character varying[] default '{}'::character varying[] not null, + "___registeredWithinMonth" smallint default '0'::smallint not null, + "unique_temp___registeredWithinYear" character varying[] default '{}'::character varying[] not null, + "___registeredWithinYear" smallint default '0'::smallint not null, + "unique_temp___registeredOutsideWeek" character varying[] default '{}'::character varying[] not null, + "___registeredOutsideWeek" smallint default '0'::smallint not null, + "unique_temp___registeredOutsideMonth" character varying[] default '{}'::character varying[] not null, + "___registeredOutsideMonth" smallint default '0'::smallint not null, + "unique_temp___registeredOutsideYear" character varying[] default '{}'::character varying[] not null, + "___registeredOutsideYear" smallint default '0'::smallint not null, + "___readWrite" smallint default '0'::smallint not null, + unique_temp___read character varying[] default '{}'::character varying[] not null, + ___read smallint default '0'::smallint not null, + unique_temp___write character varying[] default '{}'::character varying[] not null, + ___write smallint default '0'::smallint not null +); + +create unique index if not exists "IDX_0ad37b7ef50f4ddc84363d7ccc" + on __chart__active_users (date); + +create table if not exists __chart__drive +( + id serial + constraint "PK_f96bc548a765cd4b3b354221ce7" + primary key, + date integer not null + constraint "UQ_13565815f618a1ff53886c5b28a" + unique, + "___local_incCount" integer default '0'::bigint not null, + "___local_incSize" integer default '0'::bigint not null, + "___local_decCount" integer default '0'::bigint not null, + "___local_decSize" integer default '0'::bigint not null, + "___remote_incCount" integer default '0'::bigint not null, + "___remote_incSize" integer default '0'::bigint not null, + "___remote_decCount" integer default '0'::bigint not null, + "___remote_decSize" integer default '0'::bigint not null +); + +create unique index if not exists "IDX_13565815f618a1ff53886c5b28" + on __chart__drive (date); + +create table if not exists __chart__federation +( + id serial + constraint "PK_b39dcd31a0fe1a7757e348e85fd" + primary key, + date integer not null + constraint "UQ_36cb699c49580d4e6c2e6159f97" + unique, + "unique_temp___deliveredInstances" character varying[] default '{}'::character varying[] not null, + "___deliveredInstances" smallint default '0'::smallint not null, + "unique_temp___inboxInstances" character varying[] default '{}'::character varying[] not null, + "___inboxInstances" smallint default '0'::smallint not null, + unique_temp___stalled character varying[] default '{}'::character varying[] not null, + ___stalled smallint default '0'::smallint not null, + ___sub smallint default '0'::smallint not null, + ___pub smallint default '0'::smallint not null, + ___pubsub smallint default '0'::smallint not null, + "___subActive" smallint default '0'::smallint not null, + "___pubActive" smallint default '0'::smallint not null +); + +create unique index if not exists "IDX_36cb699c49580d4e6c2e6159f9" + on __chart__federation (date); + +create table if not exists __chart__hashtag +( + id serial + constraint "PK_c32f1ea2b44a5d2f7881e37f8f9" + primary key, + date integer not null, + "group" varchar(128) not null, + ___local_users integer default 0 not null, + ___remote_users integer default 0 not null, + unique_temp___local_users character varying[] default '{}'::character varying[] not null, + unique_temp___remote_users character varying[] default '{}'::character varying[] not null, + constraint "UQ_25a97c02003338124b2b75fdbc8" + unique (date, "group") +); + +create unique index if not exists "IDX_25a97c02003338124b2b75fdbc" + on __chart__hashtag (date, "group"); + +create table if not exists __chart__instance +( + id serial + constraint "PK_1267c67c7c2d47b4903975f2c00" + primary key, + date integer not null, + "group" varchar(128) not null, + ___requests_failed smallint default '0'::bigint not null, + ___requests_succeeded smallint default '0'::bigint not null, + ___requests_received smallint default '0'::bigint not null, + ___notes_total integer default '0'::bigint not null, + ___notes_inc integer default '0'::bigint not null, + ___notes_dec integer default '0'::bigint not null, + ___notes_diffs_normal integer default '0'::bigint not null, + ___notes_diffs_reply integer default '0'::bigint not null, + ___notes_diffs_renote integer default '0'::bigint not null, + ___users_total integer default '0'::bigint not null, + ___users_inc smallint default '0'::bigint not null, + ___users_dec smallint default '0'::bigint not null, + ___following_total integer default '0'::bigint not null, + ___following_inc smallint default '0'::bigint not null, + ___following_dec smallint default '0'::bigint not null, + ___followers_total integer default '0'::bigint not null, + ___followers_inc smallint default '0'::bigint not null, + ___followers_dec smallint default '0'::bigint not null, + "___drive_totalFiles" integer default '0'::bigint not null, + "___drive_incFiles" integer default '0'::bigint not null, + "___drive_incUsage" integer default '0'::bigint not null, + "___drive_decFiles" integer default '0'::bigint not null, + "___drive_decUsage" integer default '0'::bigint not null, + "___notes_diffs_withFile" integer default 0 not null, + constraint "UQ_39ee857ab2f23493037c6b66311" + unique (date, "group") +); + +create unique index if not exists "IDX_39ee857ab2f23493037c6b6631" + on __chart__instance (date, "group"); + +create table if not exists __chart__network +( + id serial + constraint "PK_bc4290c2e27fad14ef0c1ca93f3" + primary key, + date integer not null + constraint "UQ_a1efd3e0048a5f2793a47360dc6" + unique, + "___incomingRequests" integer default '0'::bigint not null, + "___outgoingRequests" integer default '0'::bigint not null, + "___totalTime" integer default '0'::bigint not null, + "___incomingBytes" integer default '0'::bigint not null, + "___outgoingBytes" integer default '0'::bigint not null +); + +create unique index if not exists "IDX_a1efd3e0048a5f2793a47360dc" + on __chart__network (date); + +create table if not exists __chart__notes +( + id serial + constraint "PK_0aec823fa85c7f901bdb3863b14" + primary key, + date integer not null + constraint "UQ_42eb716a37d381cdf566192b2be" + unique, + ___local_total integer default '0'::bigint not null, + ___local_inc integer default '0'::bigint not null, + ___local_dec integer default '0'::bigint not null, + ___local_diffs_normal integer default '0'::bigint not null, + ___local_diffs_reply integer default '0'::bigint not null, + ___local_diffs_renote integer default '0'::bigint not null, + ___remote_total integer default '0'::bigint not null, + ___remote_inc integer default '0'::bigint not null, + ___remote_dec integer default '0'::bigint not null, + ___remote_diffs_normal integer default '0'::bigint not null, + ___remote_diffs_reply integer default '0'::bigint not null, + ___remote_diffs_renote integer default '0'::bigint not null, + "___local_diffs_withFile" integer default 0 not null, + "___remote_diffs_withFile" integer default 0 not null +); + +create unique index if not exists "IDX_42eb716a37d381cdf566192b2b" + on __chart__notes (date); + +create table if not exists __chart__per_user_drive +( + id serial + constraint "PK_d0ef23d24d666e1a44a0cd3d208" + primary key, + date integer not null, + "group" varchar(128) not null, + "___totalCount" integer default '0'::bigint not null, + "___totalSize" integer default '0'::bigint not null, + "___incCount" smallint default '0'::bigint not null, + "___incSize" integer default '0'::bigint not null, + "___decCount" smallint default '0'::bigint not null, + "___decSize" integer default '0'::bigint not null, + constraint "UQ_30bf67687f483ace115c5ca6429" + unique (date, "group") +); + +create unique index if not exists "IDX_30bf67687f483ace115c5ca642" + on __chart__per_user_drive (date, "group"); + +create table if not exists __chart__per_user_following +( + id serial + constraint "PK_85bb1b540363a29c2fec83bd907" + primary key, + date integer not null, + "group" varchar(128) not null, + ___local_followings_total integer default '0'::bigint not null, + ___local_followings_inc smallint default '0'::bigint not null, + ___local_followings_dec smallint default '0'::bigint not null, + ___local_followers_total integer default '0'::bigint not null, + ___local_followers_inc smallint default '0'::bigint not null, + ___local_followers_dec smallint default '0'::bigint not null, + ___remote_followings_total integer default '0'::bigint not null, + ___remote_followings_inc smallint default '0'::bigint not null, + ___remote_followings_dec smallint default '0'::bigint not null, + ___remote_followers_total integer default '0'::bigint not null, + ___remote_followers_inc smallint default '0'::bigint not null, + ___remote_followers_dec smallint default '0'::bigint not null, + constraint "UQ_b77d4dd9562c3a899d9a286fcd7" + unique (date, "group") +); + +create unique index if not exists "IDX_b77d4dd9562c3a899d9a286fcd" + on __chart__per_user_following (date, "group"); + +create table if not exists __chart__per_user_notes +( + id serial + constraint "PK_334acf6e915af2f29edc11b8e50" + primary key, + date integer not null, + "group" varchar(128) not null, + ___total integer default '0'::bigint not null, + ___inc smallint default '0'::bigint not null, + ___dec smallint default '0'::bigint not null, + ___diffs_normal smallint default '0'::bigint not null, + ___diffs_reply smallint default '0'::bigint not null, + ___diffs_renote smallint default '0'::bigint not null, + "___diffs_withFile" smallint default '0'::smallint not null, + constraint "UQ_5048e9daccbbbc6d567bb142d34" + unique (date, "group") +); + +create unique index if not exists "IDX_5048e9daccbbbc6d567bb142d3" + on __chart__per_user_notes (date, "group"); + +create table if not exists __chart__per_user_reaction +( + id serial + constraint "PK_984f54dae441e65b633e8d27a7f" + primary key, + date integer not null, + "group" varchar(128) not null, + ___local_count smallint default '0'::bigint not null, + ___remote_count smallint default '0'::bigint not null, + constraint "UQ_229a41ad465f9205f1f57032910" + unique (date, "group") +); + +create unique index if not exists "IDX_229a41ad465f9205f1f5703291" + on __chart__per_user_reaction (date, "group"); + +create table if not exists __chart__test_grouped +( + id serial + constraint "PK_f4a2b175d308695af30d4293272" + primary key, + date integer not null, + "group" varchar(128), + ___foo_total bigint not null, + ___foo_inc bigint not null, + ___foo_dec bigint not null +); + +create unique index if not exists "IDX_b14489029e4b3aaf4bba5fb524" + on __chart__test_grouped (date, "group"); + +create unique index if not exists "IDX_da522b4008a9f5d7743b87ad55" + on __chart__test_grouped (date) + where ("group" IS NULL); + +create table if not exists __chart__test_unique +( + id serial + constraint "PK_409bac9c97cc612d8500012319d" + primary key, + date integer not null, + "group" varchar(128), + ___foo character varying[] default '{}'::character varying[] not null +); + +create unique index if not exists "IDX_a0cd75442dd10d0643a17c4a49" + on __chart__test_unique (date, "group"); + +create unique index if not exists "IDX_16effb2e888f6763673b579f80" + on __chart__test_unique (date) + where ("group" IS NULL); + +create table if not exists __chart__test +( + id serial + constraint "PK_b4bc31dffbd1b785276a3ecfc1e" + primary key, + date integer not null, + "group" varchar(128), + ___foo_total bigint not null, + ___foo_inc bigint not null, + ___foo_dec bigint not null +); + +create unique index if not exists "IDX_a319e5dbf47e8a17497623beae" + on __chart__test (date, "group"); + +create unique index if not exists "IDX_dab383a36f3c9db4a0c9b02cf3" + on __chart__test (date) + where ("group" IS NULL); + +create table if not exists __chart__users +( + id serial + constraint "PK_4dfcf2c78d03524b9eb2c99d328" + primary key, + date integer not null + constraint "UQ_845254b3eaf708ae8a6cac30265" + unique, + ___local_total integer default '0'::bigint not null, + ___local_inc smallint default '0'::bigint not null, + ___local_dec smallint default '0'::bigint not null, + ___remote_total integer default '0'::bigint not null, + ___remote_inc smallint default '0'::bigint not null, + ___remote_dec smallint default '0'::bigint not null +); + +create unique index if not exists "IDX_845254b3eaf708ae8a6cac3026" + on __chart__users (date); + +create table if not exists page +( + id varchar(32) not null + constraint "PK_742f4117e065c5b6ad21b37ba1f" + primary key, + "createdAt" timestamp with time zone not null, + "updatedAt" timestamp with time zone not null, + title varchar(256) not null, + name varchar(256) not null, + summary varchar(256), + "alignCenter" boolean not null, + font varchar(32) not null, + "userId" varchar(32) not null + constraint "FK_ae1d917992dd0c9d9bbdad06c4a" + references "user" + on delete cascade, + "eyeCatchingImageId" varchar(32) + constraint "FK_a9ca79ad939bf06066b81c9d3aa" + references drive_file + on delete cascade, + content jsonb default '[]'::jsonb not null, + variables jsonb default '[]'::jsonb not null, + visibility page_visibility_enum not null, + "visibleUserIds" varchar(32)[] default '{}'::character varying[] not null, + "likedCount" integer default 0 not null, + "hideTitleWhenPinned" boolean default false not null, + script varchar(16384) default ''::character varying not null, + "isPublic" boolean default true not null +); + +comment on column page."createdAt" is 'The created date of the Page.'; + +comment on column page."updatedAt" is 'The updated date of the Page.'; + +comment on column page."userId" is 'The ID of author.'; + +create table if not exists user_profile +( + "userId" varchar(32) not null + constraint "PK_51cb79b5555effaf7d69ba1cff9" + primary key + constraint "UQ_51cb79b5555effaf7d69ba1cff9" + unique + constraint "FK_51cb79b5555effaf7d69ba1cff9" + references "user" + on delete cascade, + location varchar(128), + birthday char(10), + description varchar(2048), + fields jsonb default '[]'::jsonb not null, + url varchar(512), + email varchar(128), + "emailVerifyCode" varchar(128), + "emailVerified" boolean default false not null, + "twoFactorTempSecret" varchar(128), + "twoFactorSecret" varchar(128), + "twoFactorEnabled" boolean default false not null, + password varchar(128), + "clientData" jsonb default '{}'::jsonb not null, + "autoAcceptFollowed" boolean default false not null, + "alwaysMarkNsfw" boolean default false not null, + "carefulBot" boolean default false not null, + "userHost" varchar(128), + "securityKeysAvailable" boolean default false not null, + "usePasswordLessLogin" boolean default false not null, + "pinnedPageId" varchar(32) + constraint "UQ_6dc44f1ceb65b1e72bacef2ca27" + unique + constraint "FK_6dc44f1ceb65b1e72bacef2ca27" + references page + on delete set null, + room jsonb default '{}'::jsonb not null, + integrations jsonb default '{}'::jsonb not null, + "injectFeaturedNote" boolean default true not null, + "enableWordMute" boolean default false not null, + "mutedWords" jsonb default '[]'::jsonb not null, + "mutingNotificationTypes" user_profile_mutingnotificationtypes_enum[] default '{}'::user_profile_mutingnotificationtypes_enum[] not null, + "noCrawle" boolean default false not null, + "receiveAnnouncementEmail" boolean default true not null, + "emailNotificationTypes" jsonb default '["follow", "receiveFollowRequest", "groupInvited"]'::jsonb not null, + lang varchar(32), + "mutedInstances" jsonb default '[]'::jsonb not null, + "publicReactions" boolean default false not null, + "ffVisibility" user_profile_ffvisibility_enum default 'public'::user_profile_ffvisibility_enum not null, + "autoSensitive" boolean default false not null, + "moderationNote" varchar(8192) default ''::character varying not null, + "preventAiLearning" boolean default true not null +); + +comment on column user_profile.location is 'The location of the User.'; + +comment on column user_profile.birthday is 'The birthday (YYYY-MM-DD) of the User.'; + +comment on column user_profile.description is 'The description (bio) of the User.'; + +comment on column user_profile.url is 'Remote URL of the user.'; + +comment on column user_profile.email is 'The email address of the User.'; + +comment on column user_profile.password is 'The password hash of the User. It will be null if the origin of the user is local.'; + +comment on column user_profile."clientData" is 'The client-specific data of the User.'; + +comment on column user_profile."userHost" is '[Denormalized]'; + +comment on column user_profile.room is 'The room data of the User.'; + +comment on column user_profile."noCrawle" is 'Whether reject index by crawler.'; + +comment on column user_profile."mutedInstances" is 'List of instances muted by the user.'; + +create index if not exists "IDX_dce530b98e454793dac5ec2f5a" + on user_profile ("userHost"); + +create index if not exists "IDX_3befe6f999c86aff06eb0257b4" + on user_profile ("enableWordMute"); + +create index if not exists "IDX_fbb4297c927a9b85e9cefa2eb1" + on page ("createdAt"); + +create index if not exists "IDX_af639b066dfbca78b01a920f8a" + on page ("updatedAt"); + +create index if not exists "IDX_b82c19c08afb292de4600d99e4" + on page (name); + +create index if not exists "IDX_ae1d917992dd0c9d9bbdad06c4" + on page ("userId"); + +create index if not exists "IDX_90148bbc2bf0854428786bfc15" + on page ("visibleUserIds"); + +create unique index if not exists "IDX_2133ef8317e4bdb839c0dcbf13" + on page ("userId", name); + +create table if not exists page_like +( + id varchar(32) not null + constraint "PK_813f034843af992d3ae0f43c64c" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_0e61efab7f88dbb79c9166dbb48" + references "user" + on delete cascade, + "pageId" varchar(32) not null + constraint "FK_cf8782626dced3176038176a847" + references page + on delete cascade +); + +create index if not exists "IDX_0e61efab7f88dbb79c9166dbb4" + on page_like ("userId"); + +create unique index if not exists "IDX_4ce6fb9c70529b4c8ac46c9bfa" + on page_like ("userId", "pageId"); + +create table if not exists user_group +( + id varchar(32) not null + constraint "PK_3c29fba6fe013ec8724378ce7c9" + primary key, + "createdAt" timestamp with time zone not null, + name varchar(256) not null, + "userId" varchar(32) not null + constraint "FK_3d6b372788ab01be58853003c93" + references "user" + on delete cascade, + "isPrivate" boolean default false not null +); + +comment on column user_group."createdAt" is 'The created date of the UserGroup.'; + +comment on column user_group."userId" is 'The ID of owner.'; + +create table if not exists messaging_message +( + id varchar(32) not null + constraint "PK_db398fd79dc95d0eb8c30456eaa" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_5377c307783fce2b6d352e1203b" + references "user" + on delete cascade, + "recipientId" varchar(32) + constraint "FK_cac14a4e3944454a5ce7daa5142" + references "user" + on delete cascade, + text varchar(4096), + "isRead" boolean default false not null, + "fileId" varchar(32) + constraint "FK_535def119223ac05ad3fa9ef64b" + references drive_file + on delete cascade, + "groupId" varchar(32) + constraint "FK_2c4be03b446884f9e9c502135be" + references user_group + on delete cascade, + reads varchar(32)[] default '{}'::character varying[] not null, + uri varchar(512) +); + +comment on column messaging_message."createdAt" is 'The created date of the MessagingMessage.'; + +comment on column messaging_message."userId" is 'The sender user ID.'; + +comment on column messaging_message."recipientId" is 'The recipient user ID.'; + +comment on column messaging_message."groupId" is 'The recipient group ID.'; + +create index if not exists "IDX_e21cd3646e52ef9c94aaf17c2e" + on messaging_message ("createdAt"); + +create index if not exists "IDX_5377c307783fce2b6d352e1203" + on messaging_message ("userId"); + +create index if not exists "IDX_cac14a4e3944454a5ce7daa514" + on messaging_message ("recipientId"); + +create index if not exists "IDX_2c4be03b446884f9e9c502135b" + on messaging_message ("groupId"); + +create index if not exists "IDX_20e30aa35180e317e133d75316" + on user_group ("createdAt"); + +create index if not exists "IDX_3d6b372788ab01be58853003c9" + on user_group ("userId"); + +create table if not exists user_group_joining +( + id varchar(32) not null + constraint "PK_15f2425885253c5507e1599cfe7" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_f3a1b4bd0c7cabba958a0c0b231" + references "user" + on delete cascade, + "userGroupId" varchar(32) not null + constraint "FK_67dc758bc0566985d1b3d399865" + references user_group + on delete cascade +); + +comment on column user_group_joining."createdAt" is 'The created date of the UserGroupJoining.'; + +comment on column user_group_joining."userId" is 'The user ID.'; + +comment on column user_group_joining."userGroupId" is 'The group ID.'; + +create index if not exists "IDX_f3a1b4bd0c7cabba958a0c0b23" + on user_group_joining ("userId"); + +create index if not exists "IDX_67dc758bc0566985d1b3d39986" + on user_group_joining ("userGroupId"); + +create unique index if not exists "IDX_d9ecaed8c6dc43f3592c229282" + on user_group_joining ("userId", "userGroupId"); + +create table if not exists user_group_invite +( + id varchar(32) not null + constraint "PK_3893884af0d3a5f4d01e7921a97" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_1039988afa3bf991185b277fe03" + references "user" + on delete cascade, + "userGroupId" varchar(32) not null + constraint "FK_e10924607d058004304611a436a" + references user_group + on delete cascade +); + +create index if not exists "IDX_1039988afa3bf991185b277fe0" + on user_group_invite ("userId"); + +create index if not exists "IDX_e10924607d058004304611a436" + on user_group_invite ("userGroupId"); + +create unique index if not exists "IDX_78787741f9010886796f2320a4" + on user_group_invite ("userId", "userGroupId"); + +create table if not exists attestation_challenge +( + id varchar(32) not null, + "userId" varchar(32) not null + constraint "FK_f1a461a618fa1755692d0e0d592" + references "user" + on delete cascade, + challenge varchar(64) not null, + "createdAt" timestamp with time zone not null, + "registrationChallenge" boolean default false not null, + constraint "PK_d0ba6786e093f1bcb497572a6b5" + primary key (id, "userId") +); + +comment on column attestation_challenge.challenge is 'Hex-encoded sha256 hash of the challenge.'; + +comment on column attestation_challenge."createdAt" is 'The date challenge was created for expiry purposes.'; + +comment on column attestation_challenge."registrationChallenge" is 'Indicates that the challenge is only for registration purposes if true to prevent the challenge for being used as authentication.'; + +create index if not exists "IDX_f1a461a618fa1755692d0e0d59" + on attestation_challenge ("userId"); + +create index if not exists "IDX_47efb914aed1f72dd39a306c7b" + on attestation_challenge (challenge); + +create table if not exists user_security_key +( + id varchar not null + constraint "PK_3e508571121ab39c5f85d10c166" + primary key, + "userId" varchar(32) not null + constraint "FK_ff9ca3b5f3ee3d0681367a9b447" + references "user" + on delete cascade, + "publicKey" varchar not null, + "lastUsed" timestamp with time zone not null, + name varchar(30) not null +); + +comment on column user_security_key.id is 'Variable-length id given to navigator.credentials.get()'; + +comment on column user_security_key."publicKey" is 'Variable-length public key used to verify attestations (hex-encoded).'; + +comment on column user_security_key."lastUsed" is 'The date of the last time the UserSecurityKey was successfully validated.'; + +comment on column user_security_key.name is 'User-defined name for this key'; + +create index if not exists "IDX_ff9ca3b5f3ee3d0681367a9b44" + on user_security_key ("userId"); + +create index if not exists "IDX_0d7718e562dcedd0aa5cf2c9f7" + on user_security_key ("publicKey"); + +create table if not exists moderation_log +( + id varchar(32) not null + constraint "PK_d0adca6ecfd068db83e4526cc26" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_a08ad074601d204e0f69da9a954" + references "user" + on delete cascade, + type varchar(128) not null, + info jsonb not null +); + +comment on column moderation_log."createdAt" is 'The created date of the ModerationLog.'; + +create index if not exists "IDX_a08ad074601d204e0f69da9a95" + on moderation_log ("userId"); + +create table if not exists used_username +( + username varchar(128) not null + constraint "PK_78fd79d2d24c6ac2f4cc9a31a5d" + primary key, + "createdAt" timestamp with time zone not null +); + +create table if not exists announcement +( + id varchar(32) not null + constraint "PK_e0ef0550174fd1099a308fd18a0" + primary key, + "createdAt" timestamp with time zone not null, + text varchar(8192) not null, + title varchar(256) not null, + "imageUrl" varchar(1024), + "updatedAt" timestamp with time zone +); + +comment on column announcement."createdAt" is 'The created date of the Announcement.'; + +comment on column announcement."updatedAt" is 'The updated date of the Announcement.'; + +create index if not exists "IDX_118ec703e596086fc4515acb39" + on announcement ("createdAt"); + +create table if not exists announcement_read +( + id varchar(32) not null + constraint "PK_4b90ad1f42681d97b2683890c5e" + primary key, + "userId" varchar(32) not null + constraint "FK_8288151386172b8109f7239ab28" + references "user" + on delete cascade, + "announcementId" varchar(32) not null + constraint "FK_603a7b1e7aa0533c6c88e9bfafe" + references announcement + on delete cascade, + "createdAt" timestamp with time zone not null +); + +comment on column announcement_read."createdAt" is 'The created date of the AnnouncementRead.'; + +create index if not exists "IDX_8288151386172b8109f7239ab2" + on announcement_read ("userId"); + +create index if not exists "IDX_603a7b1e7aa0533c6c88e9bfaf" + on announcement_read ("announcementId"); + +create unique index if not exists "IDX_924fa71815cfa3941d003702a0" + on announcement_read ("userId", "announcementId"); + +create table if not exists clip +( + id varchar(32) not null + constraint "PK_f0685dac8d4dd056d7255670b75" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_2b5ec6c574d6802c94c80313fb2" + references "user" + on delete cascade, + name varchar(128) not null, + "isPublic" boolean default false not null, + description varchar(2048) +); + +comment on column clip."createdAt" is 'The created date of the Clip.'; + +comment on column clip."userId" is 'The owner ID.'; + +comment on column clip.name is 'The name of the Clip.'; + +comment on column clip.description is 'The description of the Clip.'; + +create index if not exists "IDX_2b5ec6c574d6802c94c80313fb" + on clip ("userId"); + +create table if not exists antenna +( + id varchar(32) not null + constraint "PK_c170b99775e1dccca947c9f2d5f" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_6446c571a0e8d0f05f01c789096" + references "user" + on delete cascade, + name varchar(128) not null, + src antenna_src_enum not null, + "userListId" varchar(32) + constraint "FK_709d7d32053d0dd7620f678eeb9" + references user_list + on delete cascade, + keywords jsonb default '[]'::jsonb not null, + "withFile" boolean not null, + expression varchar(2048), + notify boolean not null, + "caseSensitive" boolean default false not null, + "withReplies" boolean default false not null, + "userGroupJoiningId" varchar(32) + constraint "FK_ccbf5a8c0be4511133dcc50ddeb" + references user_group_joining + on delete cascade, + users varchar(1024)[] default '{}'::character varying[] not null, + "excludeKeywords" jsonb default '[]'::jsonb not null, + instances jsonb default '[]'::jsonb not null +); + +comment on column antenna."createdAt" is 'The created date of the Antenna.'; + +comment on column antenna."userId" is 'The owner ID.'; + +comment on column antenna.name is 'The name of the Antenna.'; + +create index if not exists "IDX_6446c571a0e8d0f05f01c78909" + on antenna ("userId"); + +create table if not exists user_group_invitation +( + id varchar(32) not null + constraint "PK_160c63ec02bf23f6a5c5e8140d6" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_bfbc6305547539369fe73eb144a" + references "user" + on delete cascade, + "userGroupId" varchar(32) not null + constraint "FK_5cc8c468090e129857e9fecce5a" + references user_group + on delete cascade +); + +comment on column user_group_invitation."createdAt" is 'The created date of the UserGroupInvitation.'; + +comment on column user_group_invitation."userId" is 'The user ID.'; + +comment on column user_group_invitation."userGroupId" is 'The group ID.'; + +create index if not exists "IDX_bfbc6305547539369fe73eb144" + on user_group_invitation ("userId"); + +create index if not exists "IDX_5cc8c468090e129857e9fecce5" + on user_group_invitation ("userGroupId"); + +create unique index if not exists "IDX_e9793f65f504e5a31fbaedbf2f" + on user_group_invitation ("userId", "userGroupId"); + +create table if not exists relay +( + id varchar(32) not null + constraint "PK_78ebc9cfddf4292633b7ba57aee" + primary key, + inbox varchar(512) not null, + status relay_status_enum not null +); + +create unique index if not exists "IDX_0d9a1738f2cf7f3b1c3334dfab" + on relay (inbox); + +create table if not exists channel +( + id varchar(32) not null + constraint "PK_590f33ee6ee7d76437acf362e39" + primary key, + "createdAt" timestamp with time zone not null, + "lastNotedAt" timestamp with time zone, + "userId" varchar(32) + constraint "FK_823bae55bd81b3be6e05cff4383" + references "user" + on delete set null, + name varchar(128) not null, + description varchar(2048), + "bannerId" varchar(32) + constraint "FK_999da2bcc7efadbfe0e92d3bc19" + references drive_file + on delete set null, + "notesCount" integer default 0 not null, + "usersCount" integer default 0 not null +); + +comment on column channel."createdAt" is 'The created date of the Channel.'; + +comment on column channel."userId" is 'The owner ID.'; + +comment on column channel.name is 'The name of the Channel.'; + +comment on column channel.description is 'The description of the Channel.'; + +comment on column channel."bannerId" is 'The ID of banner Channel.'; + +comment on column channel."notesCount" is 'The count of notes.'; + +comment on column channel."usersCount" is 'The count of users.'; + +create table if not exists note +( + id varchar(32) not null + constraint "PK_96d0c172a4fba276b1bbed43058" + primary key, + "createdAt" timestamp with time zone not null, + "replyId" varchar(32) + constraint "FK_17cb3553c700a4985dff5a30ff5" + references note + on delete cascade, + "renoteId" varchar(32) + constraint "FK_52ccc804d7c69037d558bac4c96" + references note + on delete cascade, + text text, + name varchar(256), + cw varchar(512), + "userId" varchar(32) not null + constraint "FK_5b87d9d19127bd5d92026017a7b" + references "user" + on delete cascade, + "localOnly" boolean default false not null, + "renoteCount" smallint default 0 not null, + "repliesCount" smallint default 0 not null, + reactions jsonb default '{}'::jsonb not null, + visibility note_visibility_enum not null, + uri varchar(512), + score integer default 0 not null, + "fileIds" varchar(32)[] default '{}'::character varying[] not null, + "attachedFileTypes" varchar(256)[] default '{}'::character varying[] not null, + "visibleUserIds" varchar(32)[] default '{}'::character varying[] not null, + mentions varchar(32)[] default '{}'::character varying[] not null, + "mentionedRemoteUsers" text default '[]'::text not null, + emojis varchar(128)[] default '{}'::character varying[] not null, + tags varchar(128)[] default '{}'::character varying[] not null, + "hasPoll" boolean default false not null, + "userHost" varchar(128), + "replyUserId" varchar(32), + "replyUserHost" varchar(128), + "renoteUserId" varchar(32), + "renoteUserHost" varchar(128), + url varchar(512), + "channelId" varchar(32) + constraint "FK_f22169eb10657bded6d875ac8f9" + references channel + on delete cascade, + "threadId" varchar(256), + "updatedAt" timestamp with time zone +); + +comment on column note."createdAt" is 'The created date of the Note.'; + +comment on column note."replyId" is 'The ID of reply target.'; + +comment on column note."renoteId" is 'The ID of renote target.'; + +comment on column note."userId" is 'The ID of author.'; + +comment on column note.uri is 'The URI of a note. it will be null when the note is local.'; + +comment on column note."userHost" is '[Denormalized]'; + +comment on column note."replyUserId" is '[Denormalized]'; + +comment on column note."replyUserHost" is '[Denormalized]'; + +comment on column note."renoteUserId" is '[Denormalized]'; + +comment on column note."renoteUserHost" is '[Denormalized]'; + +comment on column note.url is 'The human readable url of a note. it will be null when the note is local.'; + +comment on column note."channelId" is 'The ID of source channel.'; + +comment on column note."updatedAt" is 'The updated date of the Note.'; + +create index if not exists "IDX_e7c0567f5261063592f022e9b5" + on note ("createdAt"); + +create index if not exists "IDX_17cb3553c700a4985dff5a30ff" + on note ("replyId"); + +create index if not exists "IDX_52ccc804d7c69037d558bac4c9" + on note ("renoteId"); + +create index if not exists "IDX_5b87d9d19127bd5d92026017a7" + on note ("userId"); + +create unique index if not exists "IDX_153536c67d05e9adb24e99fc2b" + on note (uri); + +create index if not exists "IDX_51c063b6a133a9cb87145450f5" + on note ("fileIds"); + +create index if not exists "IDX_25dfc71b0369b003a4cd434d0b" + on note ("attachedFileTypes"); + +create index if not exists "IDX_796a8c03959361f97dc2be1d5c" + on note ("visibleUserIds"); + +create index if not exists "IDX_54ebcb6d27222913b908d56fd8" + on note (mentions); + +create index if not exists "IDX_88937d94d7443d9a99a76fa5c0" + on note (tags); + +create index if not exists "IDX_7125a826ab192eb27e11d358a5" + on note ("userHost"); + +create index if not exists "IDX_NOTE_TAGS" + on note using gin (tags); + +create index if not exists "IDX_NOTE_MENTIONS" + on note using gin (mentions); + +create index if not exists "IDX_NOTE_VISIBLE_USER_IDS" + on note using gin ("visibleUserIds"); + +create index if not exists "IDX_d4ebdef929896d6dc4a3c5bb48" + on note ("threadId"); + +create index if not exists "IDX_f22169eb10657bded6d875ac8f" + on note ("channelId"); + +create table if not exists poll_vote +( + id varchar(32) not null + constraint "PK_fd002d371201c472490ba89c6a0" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_66d2bd2ee31d14bcc23069a89f8" + references "user" + on delete cascade, + "noteId" varchar(32) not null + constraint "FK_aecfbd5ef60374918e63ee95fa7" + references note + on delete cascade, + choice integer not null +); + +comment on column poll_vote."createdAt" is 'The created date of the PollVote.'; + +create index if not exists "IDX_0fb627e1c2f753262a74f0562d" + on poll_vote ("createdAt"); + +create index if not exists "IDX_66d2bd2ee31d14bcc23069a89f" + on poll_vote ("userId"); + +create index if not exists "IDX_aecfbd5ef60374918e63ee95fa" + on poll_vote ("noteId"); + +create unique index if not exists "IDX_50bd7164c5b78f1f4a42c4d21f" + on poll_vote ("userId", "noteId", choice); + +create table if not exists note_reaction +( + id varchar(32) not null + constraint "PK_767ec729b108799b587a3fcc9cf" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_13761f64257f40c5636d0ff95ee" + references "user" + on delete cascade, + "noteId" varchar(32) not null + constraint "FK_45145e4953780f3cd5656f0ea6a" + references note + on delete cascade, + reaction varchar(260) not null +); + +comment on column note_reaction."createdAt" is 'The created date of the NoteReaction.'; + +create index if not exists "IDX_01f4581f114e0ebd2bbb876f0b" + on note_reaction ("createdAt"); + +create index if not exists "IDX_13761f64257f40c5636d0ff95e" + on note_reaction ("userId"); + +create index if not exists "IDX_45145e4953780f3cd5656f0ea6" + on note_reaction ("noteId"); + +create unique index if not exists "IDX_ad0c221b25672daf2df320a817" + on note_reaction ("userId", "noteId"); + +create table if not exists note_watching +( + id varchar(32) not null + constraint "PK_49286fdb23725945a74aa27d757" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_b0134ec406e8d09a540f8182888" + references "user" + on delete cascade, + "noteId" varchar(32) not null + constraint "FK_03e7028ab8388a3f5e3ce2a8619" + references note + on delete cascade, + "noteUserId" varchar(32) not null +); + +comment on column note_watching."createdAt" is 'The created date of the NoteWatching.'; + +comment on column note_watching."userId" is 'The watcher ID.'; + +comment on column note_watching."noteId" is 'The target Note ID.'; + +comment on column note_watching."noteUserId" is '[Denormalized]'; + +create index if not exists "IDX_318cdf42a9cfc11f479bd802bb" + on note_watching ("createdAt"); + +create index if not exists "IDX_b0134ec406e8d09a540f818288" + on note_watching ("userId"); + +create index if not exists "IDX_03e7028ab8388a3f5e3ce2a861" + on note_watching ("noteId"); + +create index if not exists "IDX_44499765eec6b5489d72c4253b" + on note_watching ("noteUserId"); + +create unique index if not exists "IDX_a42c93c69989ce1d09959df4cf" + on note_watching ("userId", "noteId"); + +create table if not exists note_unread +( + id varchar(32) not null + constraint "PK_1904eda61a784f57e6e51fa9c1f" + primary key, + "userId" varchar(32) not null + constraint "FK_56b0166d34ddae49d8ef7610bb9" + references "user" + on delete cascade, + "noteId" varchar(32) not null + constraint "FK_e637cba4dc4410218c4251260e4" + references note + on delete cascade, + "noteUserId" varchar(32) not null, + "isSpecified" boolean not null, + "isMentioned" boolean not null, + "noteChannelId" varchar(32) +); + +comment on column note_unread."noteUserId" is '[Denormalized]'; + +comment on column note_unread."noteChannelId" is '[Denormalized]'; + +create index if not exists "IDX_56b0166d34ddae49d8ef7610bb" + on note_unread ("userId"); + +create index if not exists "IDX_e637cba4dc4410218c4251260e" + on note_unread ("noteId"); + +create unique index if not exists "IDX_d908433a4953cc13216cd9c274" + on note_unread ("userId", "noteId"); + +create index if not exists "IDX_25b1dd384bec391b07b74b861c" + on note_unread ("isMentioned"); + +create index if not exists "IDX_89a29c9237b8c3b6b3cbb4cb30" + on note_unread ("isSpecified"); + +create index if not exists "IDX_29e8c1d579af54d4232939f994" + on note_unread ("noteUserId"); + +create index if not exists "IDX_6a57f051d82c6d4036c141e107" + on note_unread ("noteChannelId"); + +create table if not exists notification +( + id varchar(32) not null + constraint "PK_705b6c7cdf9b2c2ff7ac7872cb7" + primary key, + "createdAt" timestamp with time zone not null, + "notifieeId" varchar(32) not null + constraint "FK_3c601b70a1066d2c8b517094cb9" + references "user" + on delete cascade, + "notifierId" varchar(32) + constraint "FK_3b4e96eec8d36a8bbb9d02aa710" + references "user" + on delete cascade, + "isRead" boolean default false not null, + "noteId" varchar(32) + constraint "FK_769cb6b73a1efe22ddf733ac453" + references note + on delete cascade, + reaction varchar(128), + choice integer, + "followRequestId" varchar(32) + constraint "FK_bd7fab507621e635b32cd31892c" + references follow_request + on delete cascade, + type notification_type_enum not null, + "userGroupInvitationId" varchar(32) + constraint "FK_8fe87814e978053a53b1beb7e98" + references user_group_invitation + on delete cascade, + "customBody" varchar(2048), + "customHeader" varchar(256), + "customIcon" varchar(1024), + "appAccessTokenId" varchar(32) + constraint "FK_e22bf6bda77b6adc1fd9e75c8c9" + references access_token + on delete cascade +); + +comment on column notification."createdAt" is 'The created date of the Notification.'; + +comment on column notification."notifieeId" is 'The ID of recipient user of the Notification.'; + +comment on column notification."notifierId" is 'The ID of sender user of the Notification.'; + +comment on column notification."isRead" is 'Whether the Notification is read.'; + +comment on column notification.type is 'The type of the Notification.'; + +create index if not exists "IDX_b11a5e627c41d4dc3170f1d370" + on notification ("createdAt"); + +create index if not exists "IDX_3c601b70a1066d2c8b517094cb" + on notification ("notifieeId"); + +create index if not exists "IDX_3b4e96eec8d36a8bbb9d02aa71" + on notification ("notifierId"); + +create index if not exists "IDX_080ab397c379af09b9d2169e5b" + on notification ("isRead"); + +create index if not exists "IDX_e22bf6bda77b6adc1fd9e75c8c" + on notification ("appAccessTokenId"); + +create index if not exists "IDX_33f33cc8ef29d805a97ff4628b" + on notification (type); + +create table if not exists note_favorite +( + id varchar(32) not null + constraint "PK_af0da35a60b9fa4463a62082b36" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_47f4b1892f5d6ba8efb3057d81a" + references "user" + on delete cascade, + "noteId" varchar(32) not null + constraint "FK_0e00498f180193423c992bc4370" + references note + on delete cascade +); + +comment on column note_favorite."createdAt" is 'The created date of the NoteFavorite.'; + +create index if not exists "IDX_47f4b1892f5d6ba8efb3057d81" + on note_favorite ("userId"); + +create unique index if not exists "IDX_0f4fb9ad355f3effff221ef245" + on note_favorite ("userId", "noteId"); + +create table if not exists user_note_pining +( + id varchar(32) not null + constraint "PK_a6a2dad4ae000abce2ea9d9b103" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_bfbc6f79ba4007b4ce5097f08d6" + references "user" + on delete cascade, + "noteId" varchar(32) not null + constraint "FK_68881008f7c3588ad7ecae471cf" + references note + on delete cascade +); + +comment on column user_note_pining."createdAt" is 'The created date of the UserNotePinings.'; + +create index if not exists "IDX_bfbc6f79ba4007b4ce5097f08d" + on user_note_pining ("userId"); + +create unique index if not exists "IDX_410cd649884b501c02d6e72738" + on user_note_pining ("userId", "noteId"); + +create table if not exists poll +( + "noteId" varchar(32) not null + constraint "PK_da851e06d0dfe2ef397d8b1bf1b" + primary key + constraint "UQ_da851e06d0dfe2ef397d8b1bf1b" + unique + constraint "FK_da851e06d0dfe2ef397d8b1bf1b" + references note + on delete cascade, + "expiresAt" timestamp with time zone, + multiple boolean not null, + choices varchar(256)[] default '{}'::character varying[] not null, + votes integer[] not null, + "noteVisibility" poll_notevisibility_enum not null, + "userId" varchar(32) not null, + "userHost" varchar(128) +); + +comment on column poll."noteVisibility" is '[Denormalized]'; + +comment on column poll."userId" is '[Denormalized]'; + +comment on column poll."userHost" is '[Denormalized]'; + +create index if not exists "IDX_0610ebcfcfb4a18441a9bcdab2" + on poll ("userId"); + +create index if not exists "IDX_7fa20a12319c7f6dc3aed98c0a" + on poll ("userHost"); + +create table if not exists clip_note +( + id varchar(32) not null + constraint "PK_e94cda2f40a99b57e032a1a738b" + primary key, + "noteId" varchar(32) not null + constraint "FK_a012eaf5c87c65da1deb5fdbfa3" + references note + on delete cascade, + "clipId" varchar(32) not null + constraint "FK_ebe99317bbbe9968a0c6f579adf" + references clip + on delete cascade +); + +comment on column clip_note."noteId" is 'The note ID.'; + +comment on column clip_note."clipId" is 'The clip ID.'; + +create index if not exists "IDX_a012eaf5c87c65da1deb5fdbfa" + on clip_note ("noteId"); + +create index if not exists "IDX_ebe99317bbbe9968a0c6f579ad" + on clip_note ("clipId"); + +create unique index if not exists "IDX_6fc0ec357d55a18646262fdfff" + on clip_note ("noteId", "clipId"); + +create table if not exists antenna_note +( + id varchar(32) not null + constraint "PK_fb28d94d0989a3872df19fd6ef8" + primary key, + "noteId" varchar(32) not null + constraint "FK_bd0397be22147e17210940e125b" + references note + on delete cascade, + "antennaId" varchar(32) not null + constraint "FK_0d775946662d2575dfd2068a5f5" + references antenna + on delete cascade, + read boolean default false not null +); + +comment on column antenna_note."noteId" is 'The note ID.'; + +comment on column antenna_note."antennaId" is 'The antenna ID.'; + +create index if not exists "IDX_bd0397be22147e17210940e125" + on antenna_note ("noteId"); + +create index if not exists "IDX_0d775946662d2575dfd2068a5f" + on antenna_note ("antennaId"); + +create unique index if not exists "IDX_335a0bf3f904406f9ef3dd51c2" + on antenna_note ("noteId", "antennaId"); + +create index if not exists "IDX_9937ea48d7ae97ffb4f3f063a4" + on antenna_note (read); + +create table if not exists promo_note +( + "noteId" varchar(32) not null + constraint "PK_e263909ca4fe5d57f8d4230dd5c" + primary key + constraint "UQ_e263909ca4fe5d57f8d4230dd5c" + unique + constraint "FK_e263909ca4fe5d57f8d4230dd5c" + references note + on delete cascade, + "expiresAt" timestamp with time zone not null, + "userId" varchar(32) not null +); + +comment on column promo_note."userId" is '[Denormalized]'; + +create index if not exists "IDX_83f0862e9bae44af52ced7099e" + on promo_note ("userId"); + +create table if not exists promo_read +( + id varchar(32) not null + constraint "PK_61917c1541002422b703318b7c9" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_9657d55550c3d37bfafaf7d4b05" + references "user" + on delete cascade, + "noteId" varchar(32) not null + constraint "FK_a46a1a603ecee695d7db26da5f4" + references note + on delete cascade +); + +comment on column promo_read."createdAt" is 'The created date of the PromoRead.'; + +create index if not exists "IDX_9657d55550c3d37bfafaf7d4b0" + on promo_read ("userId"); + +create unique index if not exists "IDX_2882b8a1a07c7d281a98b6db16" + on promo_read ("userId", "noteId"); + +create table if not exists muted_note +( + id varchar(32) not null + constraint "PK_897e2eff1c0b9b64e55ca1418a4" + primary key, + "noteId" varchar(32) not null + constraint "FK_70ab9786313d78e4201d81cdb89" + references note + on delete cascade, + "userId" varchar(32) not null + constraint "FK_d8e07aa18c2d64e86201601aec1" + references "user" + on delete cascade, + reason muted_note_reason_enum not null +); + +comment on column muted_note."noteId" is 'The note ID.'; + +comment on column muted_note."userId" is 'The user ID.'; + +comment on column muted_note.reason is 'The reason of the MutedNote.'; + +create index if not exists "IDX_70ab9786313d78e4201d81cdb8" + on muted_note ("noteId"); + +create index if not exists "IDX_d8e07aa18c2d64e86201601aec" + on muted_note ("userId"); + +create unique index if not exists "IDX_a8c6bfd637d3f1d67a27c48e27" + on muted_note ("noteId", "userId"); + +create index if not exists "IDX_636e977ff90b23676fb5624b25" + on muted_note (reason); + +create index if not exists "IDX_71cb7b435b7c0d4843317e7e16" + on channel ("createdAt"); + +create index if not exists "IDX_29ef80c6f13bcea998447fce43" + on channel ("lastNotedAt"); + +create index if not exists "IDX_823bae55bd81b3be6e05cff438" + on channel ("userId"); + +create index if not exists "IDX_0f58c11241e649d2a638a8de94" + on channel ("notesCount"); + +create index if not exists "IDX_094b86cd36bb805d1aa1e8cc9a" + on channel ("usersCount"); + +create table if not exists channel_following +( + id varchar(32) not null + constraint "PK_8b104be7f7415113f2a02cd5bdd" + primary key, + "createdAt" timestamp with time zone not null, + "followeeId" varchar(32) not null + constraint "FK_0e43068c3f92cab197c3d3cd86e" + references channel + on delete cascade, + "followerId" varchar(32) not null + constraint "FK_6d8084ec9496e7334a4602707e1" + references "user" + on delete cascade +); + +comment on column channel_following."createdAt" is 'The created date of the ChannelFollowing.'; + +comment on column channel_following."followeeId" is 'The followee channel ID.'; + +comment on column channel_following."followerId" is 'The follower user ID.'; + +create index if not exists "IDX_11e71f2511589dcc8a4d3214f9" + on channel_following ("createdAt"); + +create index if not exists "IDX_0e43068c3f92cab197c3d3cd86" + on channel_following ("followeeId"); + +create index if not exists "IDX_6d8084ec9496e7334a4602707e" + on channel_following ("followerId"); + +create unique index if not exists "IDX_2e230dd45a10e671d781d99f3e" + on channel_following ("followerId", "followeeId"); + +create table if not exists channel_note_pining +( + id varchar(32) not null + constraint "PK_44f7474496bcf2e4b741681146d" + primary key, + "createdAt" timestamp with time zone not null, + "channelId" varchar(32) not null + constraint "FK_8125f950afd3093acb10d2db8a8" + references channel + on delete cascade, + "noteId" varchar(32) not null + constraint "FK_10b19ef67d297ea9de325cd4502" + references note + on delete cascade +); + +comment on column channel_note_pining."createdAt" is 'The created date of the ChannelNotePining.'; + +create index if not exists "IDX_8125f950afd3093acb10d2db8a" + on channel_note_pining ("channelId"); + +create unique index if not exists "IDX_f36fed37d6d4cdcc68c803cd9c" + on channel_note_pining ("channelId", "noteId"); + +create table if not exists registry_item +( + id varchar(32) not null + constraint "PK_64b3f7e6008b4d89b826cd3af95" + primary key, + "createdAt" timestamp with time zone not null, + "updatedAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_fb9d21ba0abb83223263df6bcb3" + references "user" + on delete cascade, + key varchar(1024) not null, + scope varchar(1024)[] default '{}'::character varying[] not null, + domain varchar(512), + value jsonb default '{}'::jsonb +); + +comment on column registry_item."createdAt" is 'The created date of the RegistryItem.'; + +comment on column registry_item."updatedAt" is 'The updated date of the RegistryItem.'; + +comment on column registry_item."userId" is 'The owner ID.'; + +comment on column registry_item.key is 'The key of the RegistryItem.'; + +comment on column registry_item.value is 'The value of the RegistryItem.'; + +create index if not exists "IDX_fb9d21ba0abb83223263df6bcb" + on registry_item ("userId"); + +create index if not exists "IDX_22baca135bb8a3ea1a83d13df3" + on registry_item (scope); + +create index if not exists "IDX_0a72bdfcdb97c0eca11fe7ecad" + on registry_item (domain); + +create table if not exists gallery_post +( + id varchar(32) not null + constraint "PK_8e90d7b6015f2c4518881b14753" + primary key, + "createdAt" timestamp with time zone not null, + "updatedAt" timestamp with time zone not null, + title varchar(256) not null, + description varchar(2048), + "userId" varchar(32) not null + constraint "FK_985b836dddd8615e432d7043ddb" + references "user" + on delete cascade, + "fileIds" varchar(32)[] default '{}'::character varying[] not null, + "isSensitive" boolean default false not null, + "likedCount" integer default 0 not null, + tags varchar(128)[] default '{}'::character varying[] not null +); + +comment on column gallery_post."createdAt" is 'The created date of the GalleryPost.'; + +comment on column gallery_post."updatedAt" is 'The updated date of the GalleryPost.'; + +comment on column gallery_post."userId" is 'The ID of author.'; + +comment on column gallery_post."isSensitive" is 'Whether the post is sensitive.'; + +create index if not exists "IDX_8f1a239bd077c8864a20c62c2c" + on gallery_post ("createdAt"); + +create index if not exists "IDX_f631d37835adb04792e361807c" + on gallery_post ("updatedAt"); + +create index if not exists "IDX_985b836dddd8615e432d7043dd" + on gallery_post ("userId"); + +create index if not exists "IDX_3ca50563facd913c425e7a89ee" + on gallery_post ("fileIds"); + +create index if not exists "IDX_f2d744d9a14d0dfb8b96cb7fc5" + on gallery_post ("isSensitive"); + +create index if not exists "IDX_1a165c68a49d08f11caffbd206" + on gallery_post ("likedCount"); + +create index if not exists "IDX_05cca34b985d1b8edc1d1e28df" + on gallery_post (tags); + +create table if not exists gallery_like +( + id varchar(32) not null + constraint "PK_853ab02be39b8de45cd720cc15f" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_8fd5215095473061855ceb948cf" + references "user" + on delete cascade, + "postId" varchar(32) not null + constraint "FK_b1cb568bfe569e47b7051699fc8" + references gallery_post + on delete cascade +); + +create index if not exists "IDX_8fd5215095473061855ceb948c" + on gallery_like ("userId"); + +create unique index if not exists "IDX_df1b5f4099e99fb0bc5eae53b6" + on gallery_like ("userId", "postId"); + +create table if not exists password_reset_request +( + id varchar(32) not null + constraint "PK_fcf4b02eae1403a2edaf87fd074" + primary key, + "createdAt" timestamp with time zone not null, + token varchar(256) not null, + "userId" varchar(32) not null + constraint "FK_4bb7fd4a34492ae0e6cc8d30ac8" + references "user" + on delete cascade +); + +create unique index if not exists "IDX_0b575fa9a4cfe638a925949285" + on password_reset_request (token); + +create index if not exists "IDX_4bb7fd4a34492ae0e6cc8d30ac" + on password_reset_request ("userId"); + +create table if not exists ad +( + id varchar(32) not null + constraint "PK_0193d5ef09746e88e9ea92c634d" + primary key, + "createdAt" timestamp with time zone not null, + "expiresAt" timestamp with time zone not null, + place varchar(32) not null, + priority varchar(32) not null, + url varchar(1024) not null, + "imageUrl" varchar(1024) not null, + memo varchar(8192) not null, + ratio integer default 1 not null +); + +comment on column ad."createdAt" is 'The created date of the Ad.'; + +comment on column ad."expiresAt" is 'The expired date of the Ad.'; + +create index if not exists "IDX_1129c2ef687fc272df040bafaa" + on ad ("createdAt"); + +create index if not exists "IDX_2da24ce20ad209f1d9dc032457" + on ad ("expiresAt"); + +create table if not exists user_pending +( + id varchar(32) not null + constraint "PK_d4c84e013c98ec02d19b8fbbafa" + primary key, + "createdAt" timestamp with time zone not null, + code varchar(128) not null, + username varchar(128) not null, + email varchar(128) not null, + password varchar(128) not null +); + +create unique index if not exists "IDX_4e5c4c99175638ec0761714ab0" + on user_pending (code); + +create table if not exists note_thread_muting +( + id varchar(32) not null + constraint "PK_ec5936d94d1a0369646d12a3a47" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_29c11c7deb06615076f8c95b80a" + references "user" + on delete cascade, + "threadId" varchar(256) not null +); + +create index if not exists "IDX_29c11c7deb06615076f8c95b80" + on note_thread_muting ("userId"); + +create index if not exists "IDX_c426394644267453e76f036926" + on note_thread_muting ("threadId"); + +create unique index if not exists "IDX_ae7aab18a2641d3e5f25e0c4ea" + on note_thread_muting ("userId", "threadId"); + +create table if not exists __chart_day__federation +( + id serial + constraint "PK_7ca721c769f31698e0e1331e8e6" + primary key, + date integer not null + constraint "UQ_617a8fe225a6e701d89e02d2c74" + unique, + "unique_temp___deliveredInstances" character varying[] default '{}'::character varying[] not null, + "___deliveredInstances" smallint default '0'::smallint not null, + "unique_temp___inboxInstances" character varying[] default '{}'::character varying[] not null, + "___inboxInstances" smallint default '0'::smallint not null, + unique_temp___stalled character varying[] default '{}'::character varying[] not null, + ___stalled smallint default '0'::smallint not null, + ___sub smallint default '0'::smallint not null, + ___pub smallint default '0'::smallint not null, + ___pubsub smallint default '0'::smallint not null, + "___subActive" smallint default '0'::smallint not null, + "___pubActive" smallint default '0'::smallint not null +); + +create unique index if not exists "IDX_617a8fe225a6e701d89e02d2c7" + on __chart_day__federation (date); + +create table if not exists __chart_day__notes +( + id serial + constraint "PK_1fa4139e1f338272b758d05e090" + primary key, + date integer not null + constraint "UQ_1a527b423ad0858a1af5a056d43" + unique, + ___local_total integer default '0'::bigint not null, + ___local_inc integer default '0'::bigint not null, + ___local_dec integer default '0'::bigint not null, + ___local_diffs_normal integer default '0'::bigint not null, + ___local_diffs_reply integer default '0'::bigint not null, + ___local_diffs_renote integer default '0'::bigint not null, + ___remote_total integer default '0'::bigint not null, + ___remote_inc integer default '0'::bigint not null, + ___remote_dec integer default '0'::bigint not null, + ___remote_diffs_normal integer default '0'::bigint not null, + ___remote_diffs_reply integer default '0'::bigint not null, + ___remote_diffs_renote integer default '0'::bigint not null, + "___local_diffs_withFile" integer default 0 not null, + "___remote_diffs_withFile" integer default 0 not null +); + +create unique index if not exists "IDX_1a527b423ad0858a1af5a056d4" + on __chart_day__notes (date); + +create table if not exists __chart_day__users +( + id serial + constraint "PK_d7f7185abb9851f70c4726c54bd" + primary key, + date integer not null + constraint "UQ_cad6e07c20037f31cdba8a350c3" + unique, + ___local_total integer default '0'::bigint not null, + ___local_inc smallint default '0'::bigint not null, + ___local_dec smallint default '0'::bigint not null, + ___remote_total integer default '0'::bigint not null, + ___remote_inc smallint default '0'::bigint not null, + ___remote_dec smallint default '0'::bigint not null +); + +create unique index if not exists "IDX_cad6e07c20037f31cdba8a350c" + on __chart_day__users (date); + +create table if not exists __chart_day__network +( + id serial + constraint "PK_cac499d6f471042dfed1e7e0132" + primary key, + date integer not null + constraint "UQ_8bfa548c2b31f9e07db113773ee" + unique, + "___incomingRequests" integer default '0'::bigint not null, + "___outgoingRequests" integer default '0'::bigint not null, + "___totalTime" integer default '0'::bigint not null, + "___incomingBytes" integer default '0'::bigint not null, + "___outgoingBytes" integer default '0'::bigint not null +); + +create unique index if not exists "IDX_8bfa548c2b31f9e07db113773e" + on __chart_day__network (date); + +create table if not exists __chart_day__active_users +( + id serial + constraint "PK_b1790489b14f005ae8f404f5795" + primary key, + date integer not null + constraint "UQ_d5954f3df5e5e3bdfc3c03f3906" + unique, + "unique_temp___registeredWithinWeek" character varying[] default '{}'::character varying[] not null, + "___registeredWithinWeek" smallint default '0'::smallint not null, + "unique_temp___registeredWithinMonth" character varying[] default '{}'::character varying[] not null, + "___registeredWithinMonth" smallint default '0'::smallint not null, + "unique_temp___registeredWithinYear" character varying[] default '{}'::character varying[] not null, + "___registeredWithinYear" smallint default '0'::smallint not null, + "unique_temp___registeredOutsideWeek" character varying[] default '{}'::character varying[] not null, + "___registeredOutsideWeek" smallint default '0'::smallint not null, + "unique_temp___registeredOutsideMonth" character varying[] default '{}'::character varying[] not null, + "___registeredOutsideMonth" smallint default '0'::smallint not null, + "unique_temp___registeredOutsideYear" character varying[] default '{}'::character varying[] not null, + "___registeredOutsideYear" smallint default '0'::smallint not null, + "___readWrite" smallint default '0'::smallint not null, + unique_temp___read character varying[] default '{}'::character varying[] not null, + ___read smallint default '0'::smallint not null, + unique_temp___write character varying[] default '{}'::character varying[] not null, + ___write smallint default '0'::smallint not null +); + +create unique index if not exists "IDX_d5954f3df5e5e3bdfc3c03f390" + on __chart_day__active_users (date); + +create table if not exists __chart_day__instance +( + id serial + constraint "PK_479a8ff9d959274981087043023" + primary key, + date integer not null, + "group" varchar(128) not null, + ___requests_failed smallint default '0'::bigint not null, + ___requests_succeeded smallint default '0'::bigint not null, + ___requests_received smallint default '0'::bigint not null, + ___notes_total integer default '0'::bigint not null, + ___notes_inc integer default '0'::bigint not null, + ___notes_dec integer default '0'::bigint not null, + ___notes_diffs_normal integer default '0'::bigint not null, + ___notes_diffs_reply integer default '0'::bigint not null, + ___notes_diffs_renote integer default '0'::bigint not null, + ___users_total integer default '0'::bigint not null, + ___users_inc smallint default '0'::bigint not null, + ___users_dec smallint default '0'::bigint not null, + ___following_total integer default '0'::bigint not null, + ___following_inc smallint default '0'::bigint not null, + ___following_dec smallint default '0'::bigint not null, + ___followers_total integer default '0'::bigint not null, + ___followers_inc smallint default '0'::bigint not null, + ___followers_dec smallint default '0'::bigint not null, + "___drive_totalFiles" integer default '0'::bigint not null, + "___drive_incFiles" integer default '0'::bigint not null, + "___drive_incUsage" integer default '0'::bigint not null, + "___drive_decFiles" integer default '0'::bigint not null, + "___drive_decUsage" integer default '0'::bigint not null, + "___notes_diffs_withFile" integer default 0 not null, + constraint "UQ_fea7c0278325a1a2492f2d6acbf" + unique (date, "group") +); + +create unique index if not exists "IDX_fea7c0278325a1a2492f2d6acb" + on __chart_day__instance (date, "group"); + +create table if not exists __chart_day__per_user_notes +( + id serial + constraint "PK_58bab6b6d3ad9310cbc7460fd28" + primary key, + date integer not null, + "group" varchar(128) not null, + ___total integer default '0'::bigint not null, + ___inc smallint default '0'::bigint not null, + ___dec smallint default '0'::bigint not null, + ___diffs_normal smallint default '0'::bigint not null, + ___diffs_reply smallint default '0'::bigint not null, + ___diffs_renote smallint default '0'::bigint not null, + "___diffs_withFile" smallint default '0'::smallint not null, + constraint "UQ_c5545d4b31cdc684034e33b81c3" + unique (date, "group") +); + +create unique index if not exists "IDX_c5545d4b31cdc684034e33b81c" + on __chart_day__per_user_notes (date, "group"); + +create table if not exists __chart_day__drive +( + id serial + constraint "PK_e7ec0de057c77c40fc8d8b62151" + primary key, + date integer not null + constraint "UQ_0b60ebb3aa0065f10b0616c1171" + unique, + "___local_incCount" integer default '0'::bigint not null, + "___local_incSize" integer default '0'::bigint not null, + "___local_decCount" integer default '0'::bigint not null, + "___local_decSize" integer default '0'::bigint not null, + "___remote_incCount" integer default '0'::bigint not null, + "___remote_incSize" integer default '0'::bigint not null, + "___remote_decCount" integer default '0'::bigint not null, + "___remote_decSize" integer default '0'::bigint not null +); + +create unique index if not exists "IDX_0b60ebb3aa0065f10b0616c117" + on __chart_day__drive (date); + +create table if not exists __chart_day__per_user_reaction +( + id serial + constraint "PK_8af24e2d51ff781a354fe595eda" + primary key, + date integer not null, + "group" varchar(128) not null, + ___local_count smallint default '0'::bigint not null, + ___remote_count smallint default '0'::bigint not null, + constraint "UQ_d54b653660d808b118e36c184c0" + unique (date, "group") +); + +create unique index if not exists "IDX_d54b653660d808b118e36c184c" + on __chart_day__per_user_reaction (date, "group"); + +create table if not exists __chart_day__hashtag +( + id serial + constraint "PK_13d5a3b089344e5557f8e0980b4" + primary key, + date integer not null, + "group" varchar(128) not null, + ___local_users integer default 0 not null, + ___remote_users integer default 0 not null, + unique_temp___local_users character varying[] default '{}'::character varying[] not null, + unique_temp___remote_users character varying[] default '{}'::character varying[] not null, + constraint "UQ_8f589cf056ff51f09d6096f6450" + unique (date, "group") +); + +create unique index if not exists "IDX_8f589cf056ff51f09d6096f645" + on __chart_day__hashtag (date, "group"); + +create table if not exists __chart_day__per_user_following +( + id serial + constraint "PK_68ce6b67da57166da66fc8fb27e" + primary key, + date integer not null, + "group" varchar(128) not null, + ___local_followings_total integer default '0'::bigint not null, + ___local_followings_inc smallint default '0'::bigint not null, + ___local_followings_dec smallint default '0'::bigint not null, + ___local_followers_total integer default '0'::bigint not null, + ___local_followers_inc smallint default '0'::bigint not null, + ___local_followers_dec smallint default '0'::bigint not null, + ___remote_followings_total integer default '0'::bigint not null, + ___remote_followings_inc smallint default '0'::bigint not null, + ___remote_followings_dec smallint default '0'::bigint not null, + ___remote_followers_total integer default '0'::bigint not null, + ___remote_followers_inc smallint default '0'::bigint not null, + ___remote_followers_dec smallint default '0'::bigint not null, + constraint "UQ_e4849a3231f38281280ea4c0eee" + unique (date, "group") +); + +create unique index if not exists "IDX_e4849a3231f38281280ea4c0ee" + on __chart_day__per_user_following (date, "group"); + +create table if not exists __chart_day__per_user_drive +( + id serial + constraint "PK_1ae135254c137011645da7f4045" + primary key, + date integer not null, + "group" varchar(128) not null, + "___totalCount" integer default '0'::bigint not null, + "___totalSize" integer default '0'::bigint not null, + "___incCount" smallint default '0'::bigint not null, + "___incSize" integer default '0'::bigint not null, + "___decCount" smallint default '0'::bigint not null, + "___decSize" integer default '0'::bigint not null, + constraint "UQ_62aa5047b5aec92524f24c701d7" + unique (date, "group") +); + +create unique index if not exists "IDX_62aa5047b5aec92524f24c701d" + on __chart_day__per_user_drive (date, "group"); + +create table if not exists __chart__ap_request +( + id serial + constraint "PK_56a25cd447c7ee08876b3baf8d8" + primary key, + date integer not null + constraint "UQ_e56f4beac5746d44bc3e19c80d0" + unique, + "___deliverFailed" integer default 0 not null, + "___deliverSucceeded" integer default 0 not null, + "___inboxReceived" integer default 0 not null +); + +create unique index if not exists "IDX_e56f4beac5746d44bc3e19c80d" + on __chart__ap_request (date); + +create table if not exists __chart_day__ap_request +( + id serial + constraint "PK_9318b49daee320194e23f712e69" + primary key, + date integer not null + constraint "UQ_a848f66d6cec11980a5dd595822" + unique, + "___deliverFailed" integer default 0 not null, + "___deliverSucceeded" integer default 0 not null, + "___inboxReceived" integer default 0 not null +); + +create unique index if not exists "IDX_a848f66d6cec11980a5dd59582" + on __chart_day__ap_request (date); + +create table if not exists webhook +( + id varchar(32) not null + constraint "PK_e6765510c2d078db49632b59020" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null + constraint "FK_f272c8c8805969e6a6449c77b3c" + references "user" + on delete cascade, + name varchar(128) not null, + "on" varchar(128)[] default '{}'::character varying[] not null, + url varchar(1024) not null, + secret varchar(1024) not null, + active boolean default true not null, + "latestSentAt" timestamp with time zone, + "latestStatus" integer +); + +comment on column webhook."createdAt" is 'The created date of the Antenna.'; + +comment on column webhook."userId" is 'The owner ID.'; + +comment on column webhook.name is 'The name of the Antenna.'; + +create index if not exists "IDX_f272c8c8805969e6a6449c77b3" + on webhook ("userId"); + +create index if not exists "IDX_8063a0586ed1dfbe86e982d961" + on webhook ("on"); + +create index if not exists "IDX_5a056076f76b2efe08216ba655" + on webhook (active); + +create table if not exists user_ip +( + id serial + constraint "PK_2c44ddfbf7c0464d028dcef325e" + primary key, + "createdAt" timestamp with time zone not null, + "userId" varchar(32) not null, + ip varchar(128) not null +); + +create index if not exists "IDX_7f7f1c66f48e9a8e18a33bc515" + on user_ip ("userId"); + +create unique index if not exists "IDX_361b500e06721013c124b7b6c5" + on user_ip ("userId", ip); + +create table if not exists renote_muting +( + id varchar(32) not null + constraint "PK_renoteMuting_id" + primary key, + "createdAt" timestamp with time zone not null, + "muteeId" varchar(32) not null, + "muterId" varchar(32) not null +); + +create table if not exists note_edit +( + id varchar(32) not null + constraint "PK_736fc6e0d4e222ecc6f82058e08" + primary key, + "noteId" varchar(32) not null + constraint "FK_702ad5ae993a672e4fbffbcd38c" + references note + on delete cascade, + text text, + cw varchar(512), + "fileIds" varchar(32)[] default '{}'::character varying[] not null, + "updatedAt" timestamp with time zone not null +); + +comment on column note_edit."noteId" is 'The ID of note.'; + +comment on column note_edit."updatedAt" is 'The updated date of the Note.'; + +create index if not exists "IDX_702ad5ae993a672e4fbffbcd38" + on note_edit ("noteId"); + +create or replace function note_replies(start_id character varying, max_depth integer, max_breadth integer) + returns TABLE(id character varying) + language sql +as +$$ + SELECT DISTINCT id FROM ( + WITH RECURSIVE tree (id, ancestors, depth) AS ( + SELECT start_id, '{}'::VARCHAR[], 0 + UNION + SELECT + note.id, + CASE + WHEN note."replyId" = tree.id THEN tree.ancestors || note."replyId" + ELSE tree.ancestors || note."renoteId" + END, + depth + 1 + FROM note, tree + WHERE ( + note."replyId" = tree.id + OR + ( + -- get renotes but not pure renotes + note."renoteId" = tree.id + AND + ( + note.text IS NOT NULL + OR + CARDINALITY(note."fileIds") != 0 + OR + note."hasPoll" = TRUE + ) + ) + ) AND depth < max_depth + ) + SELECT + id, + -- apply the limit per node + row_number() OVER (PARTITION BY ancestors[array_upper(ancestors, 1)]) AS nth_child + FROM tree + WHERE depth > 0 + ) AS recursive WHERE nth_child < max_breadth + $$; + diff --git a/ext_calckey_model/migration/src/lib.rs b/ext_calckey_model/migration/src/lib.rs new file mode 100644 index 0000000..b3f6905 --- /dev/null +++ b/ext_calckey_model/migration/src/lib.rs @@ -0,0 +1,12 @@ +pub use sea_orm_migration::prelude::*; + +mod m20220101_000001_bootstrap; + +pub struct Migrator; + +#[async_trait::async_trait] +impl MigratorTrait for Migrator { + fn migrations() -> Vec> { + vec![Box::new(m20220101_000001_bootstrap::Migration)] + } +} diff --git a/ext_calckey_model/migration/src/m20220101_000001_bootstrap.rs b/ext_calckey_model/migration/src/m20220101_000001_bootstrap.rs new file mode 100644 index 0000000..1de1efb --- /dev/null +++ b/ext_calckey_model/migration/src/m20220101_000001_bootstrap.rs @@ -0,0 +1,25 @@ +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + let db = manager.get_connection(); + + db.execute_unprepared(include_str!("bootstrap_up.sql")) + .await?; + + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + let db = manager.get_connection(); + + db.execute_unprepared(include_str!("bootstrap_down.sql")) + .await?; + + Ok(()) + } +} diff --git a/ext_calckey_model/migration/src/main.rs b/ext_calckey_model/migration/src/main.rs new file mode 100644 index 0000000..e315af3 --- /dev/null +++ b/ext_calckey_model/migration/src/main.rs @@ -0,0 +1,6 @@ +use sea_orm_migration::prelude::*; + +#[tokio::main] +async fn main() { + cli::run_cli(ext_calckey_model_migration::Migrator).await; +} diff --git a/ext_calckey_model/src/lib.rs b/ext_calckey_model/src/lib.rs index 172e97c..6f4d0c7 100644 --- a/ext_calckey_model/src/lib.rs +++ b/ext_calckey_model/src/lib.rs @@ -1,4 +1,5 @@ use ck::user; +use ext_calckey_model_migration::{Migrator, MigratorTrait}; use sea_orm::{ColumnTrait, ConnectOptions, DatabaseConnection, EntityTrait, QueryFilter}; use thiserror::Error; use tracing::log::LevelFilter; @@ -29,6 +30,12 @@ impl CalckeyModel { Ok(CalckeyModel(sea_orm::Database::connect(opt).await?)) } + pub async fn migrate(&self) -> Result<(), CalckeyDbError> { + Migrator::up(&self.0, None).await?; + + Ok(()) + } + pub async fn get_user_by_tag( &self, name: &str, diff --git a/src/main.rs b/src/main.rs index e33ecd5..585c444 100644 --- a/src/main.rs +++ b/src/main.rs @@ -37,6 +37,8 @@ async fn main() -> miette::Result<()> { .await .into_diagnostic()?; + db.migrate().await.into_diagnostic()?; + let well_known_router = Router::new() .route( "/webfinger",