diff --git a/docs/sharkey.sql b/docs/sharkey.sql new file mode 100644 index 000000000..bce0f4f53 --- /dev/null +++ b/docs/sharkey.sql @@ -0,0 +1,1061 @@ +-- Sharkey 2024.3.1 to Iceshrimp 2023.12.5 migration script +-- by @kopper@brain.d.on-t.work +-- only tested with aidx, theoretical support for aid and meid. other id schemes are NOT supported. +-- servers which have migrated from firefish and iceshrimp to sharkey may encounter undefined behavior, as +-- - sharkey's migration steps do not attempt to clean up unused firefish-exclusive data, meaning your database schema may have columns this script doesn't expect +-- - re-generating createdAt data from cuid2 is untested (though it *may* end up working with the default length of 16 characters) +-- no warranty, you're on your own if anything breaks. +-- make sure to run this script from the same postgres user as iceshrimp, otherwise you'll encounter permission errors +BEGIN; + +-- createdAt generation functions +-- https://github.com/PrivateGER/Sharkey/blob/a2f7d3c265e70966b539dc3805a30b025350cc9c/packages/backend/migration/1704279150928-add-created-time.js +CREATE FUNCTION base36_decode(IN base36 varchar) RETURNS bigint AS $$ + DECLARE + a char[]; + ret bigint; + i int; + val int; + chars varchar; + BEGIN + chars := '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + FOR i IN REVERSE char_length(base36)..1 LOOP + a := a || substring(upper(base36) FROM i FOR 1)::char; + END LOOP; + i := 0; + ret := 0; + WHILE i < (array_length(a,1)) LOOP + val := position(a[i+1] IN chars)-1; + ret := ret + (val * (36 ^ i)); + i := i + 1; + END LOOP; + + RETURN ret; + END; + $$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE; + +CREATE FUNCTION parseAId(id varchar) + RETURNS timestamp AS + $$ + DECLARE + cutTimestamp varchar; + BEGIN + -- Conversion to timestamp (first eight characters) + cutTimestamp := substring(id FROM 1 FOR 8); + + RETURN to_timestamp((base36_decode(cutTimestamp) + 946684800000) / 1000); + END; + $$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE; + +CREATE FUNCTION parseMeid(id varchar) + RETURNS timestamp AS + $$ + BEGIN + RETURN to_timestamp(('x' || substring(id from 1 for 12))::bit(48)::bigint - x'800000000000'::bigint); + END; + $$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE; + +CREATE FUNCTION generate_created_at(id varchar) + RETURNS timestamp AS + $$ + BEGIN + -- Check for aid (length 10, first 8 characters are base36) + IF length(id) = 10 AND substring(id from 1 for 8) ~* '^[0-9A-Z]{8}$' THEN + RETURN parseAId(id); + -- Check for aidx (16 base36 characters) + ELSIF length(id) = 16 AND id ~* '^[0-9A-Z]{16}$' THEN + RETURN parseAId(id); + -- Check for meid (24 hexadecimal characters) + ELSIF length(id) = 24 AND id ~* '^[0-9A-F]{24}$' THEN + RETURN parseMeid(id); + ELSE + RAISE EXCEPTION 'unrecognized id format: %', id; + END IF; + END; + $$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE; + +ALTER TABLE abuse_user_report ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE abuse_user_report SET "createdAt" = generate_created_at(id); +ALTER TABLE abuse_user_report ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE access_token ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE access_token SET "createdAt" = generate_created_at(id); +ALTER TABLE access_token ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE announcement ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE announcement SET "createdAt" = generate_created_at(id); +ALTER TABLE announcement ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE announcement_read ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE announcement_read SET "createdAt" = generate_created_at(id); +ALTER TABLE announcement_read ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE antenna ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE antenna SET "createdAt" = generate_created_at(id); +ALTER TABLE antenna ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE app ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE app SET "createdAt" = generate_created_at(id); +ALTER TABLE app ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE auth_session ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE auth_session SET "createdAt" = generate_created_at(id); +ALTER TABLE auth_session ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE blocking ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE blocking SET "createdAt" = generate_created_at(id); +ALTER TABLE blocking ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE channel ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE channel SET "createdAt" = generate_created_at(id); +ALTER TABLE channel ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE channel_following ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE channel_following SET "createdAt" = generate_created_at(id); +ALTER TABLE channel_following ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE clip ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE clip SET "createdAt" = generate_created_at(id); +ALTER TABLE clip ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE drive_file ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE drive_file SET "createdAt" = generate_created_at(id); +ALTER TABLE drive_file ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE drive_folder ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE drive_folder SET "createdAt" = generate_created_at(id); +ALTER TABLE drive_folder ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE follow_request ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE follow_request SET "createdAt" = generate_created_at(id); +ALTER TABLE follow_request ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE following ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE following SET "createdAt" = generate_created_at(id); +ALTER TABLE following ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE gallery_like ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE gallery_like SET "createdAt" = generate_created_at(id); +ALTER TABLE gallery_like ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE gallery_post ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE gallery_post SET "createdAt" = generate_created_at(id); +ALTER TABLE gallery_post ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE moderation_log ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE moderation_log SET "createdAt" = generate_created_at(id); +ALTER TABLE moderation_log ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE muting ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE muting SET "createdAt" = generate_created_at(id); +ALTER TABLE muting ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE note ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE note SET "createdAt" = generate_created_at(id); +ALTER TABLE note ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE note_favorite ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE note_favorite SET "createdAt" = generate_created_at(id); +ALTER TABLE note_favorite ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE note_reaction ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE note_reaction SET "createdAt" = generate_created_at(id); +ALTER TABLE note_reaction ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE note_thread_muting ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE note_thread_muting SET "createdAt" = generate_created_at(id); +ALTER TABLE note_thread_muting ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE page ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE page SET "createdAt" = generate_created_at(id); +ALTER TABLE page ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE page_like ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE page_like SET "createdAt" = generate_created_at(id); +ALTER TABLE page_like ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE password_reset_request ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE password_reset_request SET "createdAt" = generate_created_at(id); +ALTER TABLE password_reset_request ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE poll_vote ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE poll_vote SET "createdAt" = generate_created_at(id); +ALTER TABLE poll_vote ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE promo_read ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE promo_read SET "createdAt" = generate_created_at(id); +ALTER TABLE promo_read ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE registration_ticket ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE registration_ticket SET "createdAt" = generate_created_at(id); +ALTER TABLE registration_ticket ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE registry_item ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE registry_item SET "createdAt" = generate_created_at(id); +ALTER TABLE registry_item ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE renote_muting ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE renote_muting SET "createdAt" = generate_created_at(id); +ALTER TABLE renote_muting ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE signin ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE signin SET "createdAt" = generate_created_at(id); +ALTER TABLE signin ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE sw_subscription ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE sw_subscription SET "createdAt" = generate_created_at(id); +ALTER TABLE sw_subscription ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE "user" ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE "user" SET "createdAt" = generate_created_at(id); +ALTER TABLE "user" ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE user_list ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE user_list SET "createdAt" = generate_created_at(id); +ALTER TABLE user_list ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE user_list_membership ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE user_list_membership SET "createdAt" = generate_created_at(id); +ALTER TABLE user_list_membership ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE user_note_pining ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE user_note_pining SET "createdAt" = generate_created_at(id); +ALTER TABLE user_note_pining ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE user_pending ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE user_pending SET "createdAt" = generate_created_at(id); +ALTER TABLE user_pending ALTER COLUMN "createdAt" SET NOT NULL; + +ALTER TABLE webhook ADD COLUMN "createdAt" TIMESTAMP WITH TIME ZONE; +UPDATE webhook SET "createdAt" = generate_created_at(id); +ALTER TABLE webhook ALTER COLUMN "createdAt" SET NOT NULL; + +-- createdAt cleanup +DROP FUNCTION base36_decode; +DROP FUNCTION parseAId; +DROP FUNCTION parseMeid; +DROP FUNCTION generate_created_at; + +-- the rest of the owl + +CREATE EXTENSION IF NOT EXISTS pg_trgm; + +ALTER TYPE antenna_src_enum ADD VALUE 'group'; +ALTER TYPE antenna_src_enum ADD VALUE 'instances'; +-- DIFFERENCE: sharkey antenna_src_enum contains 'users_blacklist', not present on iceshrimp + +DROP TYPE meta_sensitivemediadetection_enum CASCADE; +DROP TYPE meta_sensitivemediadetectionsensitivity_enum CASCADE; + +DROP TYPE muted_note_reason_enum CASCADE; + +ALTER TYPE note_visibility_enum ADD VALUE 'hidden'; +ALTER TYPE poll_notevisibility_enum ADD VALUE 'hidden'; + +DROP TYPE notification_type_enum CASCADE; +CREATE TYPE notification_type_enum AS ENUM ( + 'follow', + 'mention', + 'reply', + 'renote', + 'quote', + 'reaction', + 'pollVote', + 'pollEnded', + 'receiveFollowRequest', + 'followRequestAccepted', + 'groupInvited', + 'app' +); + +DROP TYPE user_profile_mutingnotificationtypes_enum CASCADE; +CREATE TYPE user_profile_mutingnotificationtypes_enum AS ENUM ( + 'follow', + 'mention', + 'reply', + 'renote', + 'quote', + 'reaction', + 'pollVote', + 'pollEnded', + 'receiveFollowRequest', + 'followRequestAccepted', + 'groupInvited', + 'app' +); + +DROP TYPE role_target_enum CASCADE; + +ALTER TYPE user_profile_followingvisibility_enum RENAME TO user_profile_ffvisibility_enum; +DROP TYPE "user_profile_followersVisibility_enum" CASCADE; + +CREATE 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 + $$; + + +DROP TABLE __chart__per_user_pv CASCADE; +DROP TABLE __chart_day__per_user_pv CASCADE; +ALTER TABLE __chart__active_users ALTER COLUMN "___registeredWithinWeek" TYPE smallint; +ALTER TABLE __chart__active_users ALTER COLUMN "___registeredWithinMonth" TYPE smallint; +ALTER TABLE __chart__active_users ALTER COLUMN "___registeredWithinYear" TYPE smallint; +ALTER TABLE __chart__active_users ALTER COLUMN "___registeredOutsideWeek" TYPE smallint; +ALTER TABLE __chart__active_users ALTER COLUMN "___registeredOutsideMonth" TYPE smallint; +ALTER TABLE __chart__active_users ALTER COLUMN "___registeredOutsideYear" TYPE smallint; +ALTER TABLE __chart__active_users ALTER COLUMN "___readWrite" TYPE smallint; +ALTER TABLE __chart__active_users ALTER COLUMN ___read TYPE smallint; +ALTER TABLE __chart__active_users ALTER COLUMN ___write TYPE smallint; +ALTER TABLE __chart_day__active_users ALTER COLUMN "___registeredWithinWeek" TYPE smallint; +ALTER TABLE __chart_day__active_users ALTER COLUMN "___registeredWithinMonth" TYPE smallint; +ALTER TABLE __chart_day__active_users ALTER COLUMN "___registeredWithinYear" TYPE smallint; +ALTER TABLE __chart_day__active_users ALTER COLUMN "___registeredOutsideWeek" TYPE smallint; +ALTER TABLE __chart_day__active_users ALTER COLUMN "___registeredOutsideMonth" TYPE smallint; +ALTER TABLE __chart_day__active_users ALTER COLUMN "___registeredOutsideYear" TYPE smallint; +ALTER TABLE __chart_day__active_users ALTER COLUMN "___readWrite" TYPE smallint; +ALTER TABLE __chart_day__active_users ALTER COLUMN ___read TYPE smallint; +ALTER TABLE __chart_day__active_users ALTER COLUMN ___write TYPE smallint; + +ALTER TABLE "drive_file" ALTER COLUMN "userHost" TYPE character varying(512); +ALTER TABLE "user" ALTER COLUMN "host" TYPE character varying(512); +ALTER TABLE "user_profile" ALTER COLUMN "userHost" TYPE character varying(512); +ALTER TABLE "user_publickey" ALTER COLUMN "keyId" TYPE character varying(512); +ALTER TABLE "emoji" ALTER COLUMN "host" TYPE character varying(512); +ALTER TABLE "note" ALTER COLUMN "userHost" TYPE character varying(512); +ALTER TABLE "note" ALTER COLUMN "replyUserHost" TYPE character varying(512); +ALTER TABLE "note" ALTER COLUMN "renoteUserHost" TYPE character varying(512); +ALTER TABLE "instance" ALTER COLUMN "host" TYPE character varying(512); +ALTER TABLE "instance" ALTER COLUMN "iconUrl" TYPE character varying(4096); +ALTER TABLE "instance" ALTER COLUMN "faviconUrl" TYPE character varying(4096); +ALTER TABLE "poll" ALTER COLUMN "userHost" TYPE character varying(512); +ALTER TABLE "abuse_user_report" ALTER COLUMN "targetUserHost" TYPE character varying(512); +ALTER TABLE "abuse_user_report" ALTER COLUMN "reporterHost" TYPE character varying(512); +ALTER TABLE "following" ALTER COLUMN "followeeHost" TYPE character varying(512); +ALTER TABLE "following" ALTER COLUMN "followerHost" TYPE character varying(512); +ALTER TABLE "follow_request" ALTER COLUMN "followeeHost" TYPE character varying(512); +ALTER TABLE "follow_request" ALTER COLUMN "followerHost" TYPE character varying(512); + +DROP TABLE ad CASCADE; + +ALTER TABLE announcement DROP COLUMN "display" CASCADE; +ALTER TABLE announcement DROP COLUMN "needConfirmationToRead" CASCADE; +ALTER TABLE announcement DROP COLUMN "isActive" CASCADE; +ALTER TABLE announcement DROP COLUMN "forExistingUsers" CASCADE; +ALTER TABLE announcement DROP COLUMN "userId" CASCADE; +ALTER TABLE announcement DROP COLUMN icon CASCADE; +ALTER TABLE announcement DROP COLUMN silence CASCADE; +ALTER TABLE announcement ADD COLUMN "showPopup" BOOLEAN DEFAULT false NOT NULL; +ALTER TABLE announcement ADD COLUMN "isGoodNews" BOOLEAN DEFAULT false NOT NULL; + +ALTER TABLE antenna ADD COLUMN "userGroupJoiningId" CHARACTER VARYING(32); +ALTER TABLE antenna ADD COLUMN instances JSONB DEFAULT '[]'::jsonb NOT NULL; +ALTER TABLE antenna DROP COLUMN "lastUsedAt" CASCADE; +ALTER TABLE antenna DROP COLUMN "isActive" CASCADE; +ALTER TABLE antenna DROP COLUMN "localOnly" CASCADE; + +CREATE TABLE attestation_challenge ( + id character varying(32) NOT NULL, + "userId" character varying(32) NOT NULL, + challenge character varying(64) NOT NULL, + "createdAt" timestamp with time zone NOT NULL, + "registrationChallenge" boolean DEFAULT false NOT NULL +); + +DROP TABLE avatar_decoration CASCADE; +DROP TABLE bubble_game_record CASCADE; + +ALTER TABLE channel DROP COLUMN "pinnedNoteIds" CASCADE; -- TODO: check to see if this needs to be migrated to channel_note_pining table +ALTER TABLE channel DROP COLUMN color CASCADE; +ALTER TABLE channel DROP COLUMN "isArchived" CASCADE; +ALTER TABLE channel DROP COLUMN "isSensitive" CASCADE; +ALTER TABLE channel DROP COLUMN "allowRenoteToExternal" CASCADE; + +DROP TABLE channel_favorite CASCADE; + +ALTER TABLE clip DROP COLUMN "lastClippedAt" CASCADE; + +DROP TABLE clip_favorite CASCADE; + +ALTER TABLE drive_file DROP COLUMN "maybeSensitive" CASCADE; +ALTER TABLE drive_file DROP COLUMN "maybePorn" CASCADE; + +ALTER TABLE emoji DROP COLUMN "localOnly" CASCADE; +ALTER TABLE emoji DROP COLUMN "isSensitive" CASCADE; +ALTER TABLE emoji DROP COLUMN "roleIdsThatCanBeUsedThisEmojiAsReaction" CASCADE; +ALTER TABLE emoji ADD COLUMN width INTEGER; +ALTER TABLE emoji ADD COLUMN height INTEGER; + +DROP TABLE flash CASCADE; +DROP TABLE flash_like CASCADE; + +ALTER TABLE follow_request DROP COLUMN "withReplies" CASCADE; + +ALTER TABLE following DROP COLUMN notify CASCADE; +ALTER TABLE following DROP COLUMN "withReplies" CASCADE; +ALTER TABLE following DROP COLUMN "isFollowerHibernated" CASCADE; + +CREATE TABLE html_note_cache_entry ( + "noteId" character varying(32) NOT NULL, + "updatedAt" timestamp with time zone, + content text +); + +CREATE TABLE html_user_cache_entry ( + "userId" character varying(32) NOT NULL, + "updatedAt" timestamp with time zone, + bio text, + fields jsonb DEFAULT '[]'::jsonb NOT NULL +); + +ALTER TABLE instance RENAME COLUMN "firstRetrievedAt" TO "caughtAt"; +ALTER TABLE instance ADD COLUMN "latestRequestSentAt" TIMESTAMP WITH TIME ZONE; -- TODO: may want to set to now() or something +ALTER TABLE instance ADD COLUMN "latestStatus" INTEGER; +ALTER TABLE instance DROP COLUMN "isNSFW" CASCADE; +ALTER TABLE instance DROP COLUMN "moderationNote" CASCADE; + +ALTER TABLE instance ADD COLUMN "lastCommunicatedAt" TIMESTAMP WITH TIME ZONE; +UPDATE instance SET "lastCommunicatedAt" = COALESCE("latestRequestReceivedAt", NOW()); +ALTER TABLE instance ALTER COLUMN "lastCommunicatedAt" SET NOT NULL; + +ALTER TABLE meta ALTER COLUMN name TYPE character varying(128); +ALTER TABLE meta ALTER COLUMN "maintainerName" TYPE character varying(128); +ALTER TABLE meta ALTER COLUMN "maintainerEmail" TYPE character varying(128); +ALTER TABLE meta ALTER COLUMN "disableRegistration" SET DEFAULT false; +ALTER TABLE meta ALTER COLUMN langs TYPE character varying(64)[]; +ALTER TABLE meta ALTER COLUMN "hiddenTags" TYPE character varying(256)[]; +ALTER TABLE meta ALTER COLUMN "blockedHosts" TYPE character varying(256)[]; +ALTER TABLE meta ALTER COLUMN "mascotImageUrl" TYPE character varying(512); +ALTER TABLE meta ALTER COLUMN "mascotImageUrl" SET DEFAULT '/static-assets/badges/info.png'; +ALTER TABLE meta ADD COLUMN "errorImageUrl" character varying(512) DEFAULT '/static-assets/badges/error.png'; +ALTER TABLE meta ALTER COLUMN "bannerUrl" TYPE character varying(512); +ALTER TABLE meta ALTER COLUMN "iconUrl" TYPE character varying(512); +ALTER TABLE meta ALTER COLUMN "recaptchaSiteKey" TYPE character varying(64); +ALTER TABLE meta ALTER COLUMN "recaptchaSecretKey" TYPE character varying(64); +ALTER TABLE meta ALTER COLUMN "summalyProxy" TYPE character varying(128); +ALTER TABLE meta ALTER COLUMN email TYPE character varying(128); +ALTER TABLE meta ALTER COLUMN "smtpHost" TYPE character varying(128); +ALTER TABLE meta ADD COLUMN "enableGithubIntegration" boolean DEFAULT false NOT NULL; +ALTER TABLE meta ADD COLUMN "githubClientId" character varying(128); +ALTER TABLE meta ADD COLUMN "githubClientSecret" character varying(128); +ALTER TABLE meta ADD COLUMN "enableDiscordIntegration" boolean DEFAULT false NOT NULL; +ALTER TABLE meta ADD COLUMN "discordClientId" character varying(128); +ALTER TABLE meta ADD COLUMN "discordClientSecret" character varying(128); +ALTER TABLE meta ALTER COLUMN "pinnedUsers" TYPE character varying(256)[]; +ALTER TABLE meta ALTER COLUMN "termsOfServiceUrl" TYPE character varying(512); +ALTER TABLE meta RENAME COLUMN "termsOfServiceUrl" TO "ToSUrl"; +ALTER TABLE meta ALTER COLUMN "repositoryUrl" TYPE character varying(512); +ALTER TABLE meta ALTER COLUMN "repositoryUrl" SET DEFAULT 'https://iceshrimp.dev/iceshrimp/iceshrimp'; +ALTER TABLE meta ALTER COLUMN "repositoryUrl" SET NOT NULL; +ALTER TABLE meta ALTER COLUMN "feedbackUrl" TYPE character varying(512); +ALTER TABLE meta ALTER COLUMN "feedbackUrl" SET DEFAULT 'https://iceshrimp.dev/iceshrimp/iceshrimp/issues/new'; +ALTER TABLE meta ALTER COLUMN "objectStorageBucket" TYPE character varying(512); +ALTER TABLE meta ALTER COLUMN "objectStoragePrefix" TYPE character varying(512); +ALTER TABLE meta ALTER COLUMN "objectStorageBaseUrl" TYPE character varying(512); +ALTER TABLE meta ALTER COLUMN "objectStorageEndpoint" TYPE character varying(512); +ALTER TABLE meta ALTER COLUMN "objectStorageRegion" TYPE character varying(512); +ALTER TABLE meta ALTER COLUMN "objectStorageAccessKey" TYPE character varying(512); +ALTER TABLE meta ALTER COLUMN "objectStorageSecretKey" TYPE character varying(512); +ALTER TABLE meta ALTER COLUMN "hcaptchaSiteKey" TYPE character varying(64); +ALTER TABLE meta ALTER COLUMN "hcaptchaSecretKey" TYPE character varying(64); +ALTER TABLE meta ADD COLUMN "pinnedPages" character varying(512)[] DEFAULT '{/featured,/channels,/explore,/pages,/about-iceshrimp}'::character varying[] NOT NULL; +ALTER TABLE meta ALTER COLUMN "backgroundImageUrl" TYPE character varying(512); +ALTER TABLE meta ALTER COLUMN "logoImageUrl" TYPE character varying(512); +ALTER TABLE meta ADD COLUMN "pinnedClipId" character varying(32); +ALTER TABLE meta ADD COLUMN "allowedHosts" character varying(256)[] DEFAULT '{}'::character varying[] NOT NULL; +ALTER TABLE meta ADD COLUMN "secureMode" boolean DEFAULT true NOT NULL; +ALTER TABLE meta ADD COLUMN "privateMode" boolean DEFAULT false NOT NULL; +ALTER TABLE meta ALTER COLUMN "deeplAuthKey" TYPE character varying(128); +ALTER TABLE meta ALTER COLUMN "themeColor" TYPE character varying(512); +ALTER TABLE meta DROP COLUMN "setSensitiveFlagAutomatically" CASCADE; +ALTER TABLE meta ADD COLUMN "customMOTD" character varying(256)[] DEFAULT '{}'::character varying[] NOT NULL; +ALTER TABLE meta ADD COLUMN "customSplashIcons" character varying(256)[] DEFAULT '{}'::character varying[] NOT NULL; +ALTER TABLE meta DROP COLUMN "enableSensitiveMediaDetectionForVideos" CASCADE; +ALTER TABLE meta DROP COLUMN "enableTurnstile" CASCADE; +ALTER TABLE meta DROP COLUMN "turnstileSiteKey" CASCADE; +ALTER TABLE meta DROP COLUMN "turnstileSecretKey" CASCADE; +ALTER TABLE meta DROP COLUMN policies CASCADE; +ALTER TABLE meta DROP COLUMN "sensitiveWords" CASCADE; +ALTER TABLE meta DROP COLUMN "enableChartsForRemoteUser" CASCADE; +ALTER TABLE meta DROP COLUMN "enableChartsForFederatedInstances" CASCADE; +ALTER TABLE meta DROP COLUMN "serverRules" CASCADE; +ALTER TABLE meta DROP COLUMN "preservedUsernames" CASCADE; +ALTER TABLE meta DROP COLUMN "serverErrorImageUrl" CASCADE; +ALTER TABLE meta DROP COLUMN "notFoundImageUrl" CASCADE; +ALTER TABLE meta DROP COLUMN "infoImageUrl" CASCADE; +ALTER TABLE meta DROP COLUMN "cacheRemoteSensitiveFiles" CASCADE; +ALTER TABLE meta DROP COLUMN "app192IconUrl" CASCADE; +ALTER TABLE meta DROP COLUMN "app512IconUrl" CASCADE; +ALTER TABLE meta DROP COLUMN "manifestJsonOverride" CASCADE; +ALTER TABLE meta DROP COLUMN "shortName" CASCADE; +ALTER TABLE meta DROP COLUMN "enableAchievements" CASCADE; +ALTER TABLE meta DROP COLUMN "impressumUrl" CASCADE; +ALTER TABLE meta DROP COLUMN "privacyPolicyUrl" CASCADE; +ALTER TABLE meta DROP COLUMN "perLocalUserUserTimelineCacheMax" CASCADE; +ALTER TABLE meta DROP COLUMN "perRemoteUserUserTimelineCacheMax" CASCADE; +ALTER TABLE meta DROP COLUMN "perUserHomeTimelineCacheMax" CASCADE; +ALTER TABLE meta DROP COLUMN "perUserListTimelineCacheMax" CASCADE; +ALTER TABLE meta DROP COLUMN "notesPerOneAd" CASCADE; +ALTER TABLE meta ALTER COLUMN "silencedHosts" TYPE character varying(256)[]; +ALTER TABLE meta DROP COLUMN "approvalRequiredForSignup" CASCADE; +ALTER TABLE meta DROP COLUMN "enableBotTrending" CASCADE; +ALTER TABLE meta DROP COLUMN "enableFanoutTimeline" CASCADE; +ALTER TABLE meta RENAME COLUMN "defaultLike" TO "defaultReaction"; +ALTER TABLE meta ALTER COLUMN "defaultReaction" TYPE character varying(256); +ALTER TABLE meta ALTER COLUMN "defaultReaction" SET NOT NULL; +ALTER TABLE meta ALTER COLUMN "defaultReaction" SET DEFAULT '⭐'; +ALTER TABLE meta DROP COLUMN "enableFanoutTimelineDbFallback" CASCADE; +ALTER TABLE meta DROP COLUMN "verifymailAuthKey" CASCADE; +ALTER TABLE meta DROP COLUMN "enableVerifymailApi" CASCADE; +ALTER TABLE meta RENAME COLUMN "bubbleInstances" TO "recommendedInstances"; +ALTER TABLE meta DROP COLUMN "bannedEmailDomains" CASCADE; +ALTER TABLE meta DROP COLUMN "truemailInstance" CASCADE; +ALTER TABLE meta DROP COLUMN "truemailAuthKey" CASCADE; +ALTER TABLE meta DROP COLUMN "enableTruemailApi" CASCADE; +ALTER TABLE meta DROP COLUMN "enableMcaptcha" CASCADE; +ALTER TABLE meta DROP COLUMN "mcaptchaSitekey" CASCADE; +ALTER TABLE meta DROP COLUMN "mcaptchaSecretKey" CASCADE; +ALTER TABLE meta DROP COLUMN "mcaptchaInstanceUrl" CASCADE; +ALTER TABLE meta RENAME COLUMN "donationUrl" TO "donationLink"; +ALTER TABLE meta ALTER COLUMN "donationLink" TYPE character varying(256); +ALTER TABLE meta DROP COLUMN "deeplFreeMode" CASCADE; +ALTER TABLE meta DROP COLUMN "deeplFreeInstance" CASCADE; +ALTER TABLE meta DROP COLUMN "prohibitedWords" CASCADE; +ALTER TABLE meta ADD COLUMN "libreTranslateApiUrl" character varying(512); +ALTER TABLE meta ADD COLUMN "libreTranslateApiKey" character varying(128); +ALTER TABLE meta ADD COLUMN "experimentalFeatures" jsonb DEFAULT '{}'::jsonb NOT NULL; +ALTER TABLE meta ADD COLUMN "autofollowedAccount" character varying(128); +ALTER TABLE meta DROP COLUMN "enableServiceWorker" CASCADE; +ALTER TABLE meta DROP COLUMN "proxyAccountId" CASCADE; + +-- DIFFERENCE: sharkey swPublicKey and swPrivateKey are nullable. +ALTER TABLE meta ALTER COLUMN "swPublicKey" TYPE character varying(128); +ALTER TABLE meta ALTER COLUMN "swPrivateKey" TYPE character varying(128); + +ALTER TABLE meta ADD COLUMN "localDriveCapacityMb" integer DEFAULT 1024 NOT NULL; +ALTER TABLE meta ADD COLUMN "remoteDriveCapacityMb" integer DEFAULT 32 NOT NULL; +ALTER TABLE meta ADD COLUMN "disableLocalTimeline" boolean DEFAULT false NOT NULL; +ALTER TABLE meta ADD COLUMN "disableGlobalTimeline" boolean DEFAULT false NOT NULL; +ALTER TABLE meta ADD COLUMN "disableRecommendedTimeline" boolean DEFAULT true NOT NULL; + +ALTER TABLE note ADD COLUMN score integer DEFAULT 0 NOT NULL; +ALTER TABLE note DROP COLUMN "reactionAcceptance" CASCADE; +ALTER TABLE note DROP COLUMN "clippedCount" CASCADE; +ALTER TABLE note DROP COLUMN "reactionAndUserPairCache" CASCADE; + +ALTER TABLE note_edit RENAME COLUMN "newText" TO text; +ALTER TABLE note_edit DROP COLUMN "oldText" CASCADE; +ALTER TABLE note_edit DROP COLUMN "oldDate" CASCADE; + +CREATE TABLE notification ( + id character varying(32) NOT NULL, + "createdAt" timestamp with time zone NOT NULL, + "notifieeId" character varying(32) NOT NULL, + "notifierId" character varying(32), + "isRead" boolean DEFAULT false NOT NULL, + "noteId" character varying(32), + reaction character varying(128), + choice integer, + "followRequestId" character varying(32), + type notification_type_enum NOT NULL, + "userGroupInvitationId" character varying(32), + "customBody" character varying(2048), + "customHeader" character varying(256), + "customIcon" character varying(1024), + "appAccessTokenId" character varying(32) +); + + +CREATE TABLE oauth_app ( + id character varying(32) NOT NULL, + "createdAt" timestamp with time zone NOT NULL, + "clientId" character varying(64) NOT NULL, + "clientSecret" character varying(64) NOT NULL, + name character varying(128) NOT NULL, + website character varying(256), + scopes character varying(64)[] NOT NULL, + "redirectUris" character varying(512)[] NOT NULL +); + + +CREATE TABLE oauth_token ( + id character varying(32) NOT NULL, + "createdAt" timestamp with time zone NOT NULL, + "appId" character varying(32) NOT NULL, + "userId" character varying(32) NOT NULL, + code character varying(64) NOT NULL, + token character varying(64) NOT NULL, + active boolean NOT NULL, + scopes character varying(64)[] NOT NULL, + "redirectUri" character varying(512) NOT NULL +); + +ALTER TABLE page ADD COLUMN "isPublic" boolean NOT NULL; + +ALTER TABLE registration_ticket DROP COLUMN "expiresAt" CASCADE; +ALTER TABLE registration_ticket DROP COLUMN "usedAt" CASCADE; +ALTER TABLE registration_ticket DROP COLUMN "pendingUserId" CASCADE; +ALTER TABLE registration_ticket DROP COLUMN "createdById" CASCADE; +ALTER TABLE registration_ticket DROP COLUMN "usedById" CASCADE; + +DROP TABLE retention_aggregation CASCADE; +DROP TABLE reversi_game CASCADE; +DROP TABLE reversi_matching CASCADE; +DROP TABLE role CASCADE; +DROP TABLE role_assignment CASCADE; + +ALTER TABLE "user" RENAME COLUMN "isRoot" TO "isAdmin"; +ALTER TABLE "user" ADD COLUMN "isModerator" boolean DEFAULT false NOT NULL; +ALTER TABLE "user" ADD COLUMN "driveCapacityOverrideMb" integer; +ALTER TABLE "user" DROP COLUMN "movedAt" CASCADE; +ALTER TABLE "user" DROP COLUMN "isHibernated" CASCADE; +ALTER TABLE "user" DROP COLUMN "backgroundId" CASCADE; +ALTER TABLE "user" DROP COLUMN "backgroundUrl" CASCADE; +ALTER TABLE "user" DROP COLUMN "backgroundBlurhash" CASCADE; +ALTER TABLE "user" DROP COLUMN approved CASCADE; +ALTER TABLE "user" DROP COLUMN "signupReason" CASCADE; +ALTER TABLE "user" DROP COLUMN "avatarDecorations" CASCADE; +ALTER TABLE "user" DROP COLUMN noindex CASCADE; + +ALTER TABLE user_list ADD COLUMN "hideFromHomeTl" boolean DEFAULT false NOT NULL; +ALTER TABLE user_list DROP COLUMN "isPublic" CASCADE; + +DROP TABLE user_list_favorite CASCADE; + +ALTER TABLE user_list_membership RENAME TO user_list_joining; +ALTER TABLE user_list_joining DROP COLUMN "withReplies" CASCADE; +ALTER TABLE user_list_joining DROP COLUMN "userListUserId" CASCADE; + +DROP TABLE user_memo CASCADE; + +ALTER TABLE user_pending DROP COLUMN reason CASCADE; + +ALTER TABLE user_profile ADD COLUMN integrations jsonb DEFAULT '{}'::jsonb NOT NULL; +ALTER TABLE user_profile ADD COLUMN "mutingNotificationTypes" user_profile_mutingnotificationtypes_enum[] DEFAULT '{}'::user_profile_mutingnotificationtypes_enum[] NOT NULL; +ALTER TABLE user_profile ALTER COLUMN "emailNotificationTypes" SET DEFAULT '["follow", "receiveFollowRequest", "groupInvited"]'::jsonb; +ALTER TABLE user_profile ALTER COLUMN "publicReactions" SET DEFAULT false; +ALTER TABLE user_profile ADD COLUMN mentions jsonb DEFAULT '[]'::jsonb NOT NULL; +ALTER TABLE user_profile DROP COLUMN "autoSensitive" CASCADE; +ALTER TABLE user_profile DROP COLUMN achievements CASCADE; +ALTER TABLE user_profile DROP COLUMN "loggedInDates" CASCADE; +ALTER TABLE user_profile DROP COLUMN "twoFactorBackupSecret" CASCADE; +ALTER TABLE user_profile DROP COLUMN listenbrainz CASCADE; +ALTER TABLE user_profile DROP COLUMN "verifiedLinks" CASCADE; +ALTER TABLE user_profile DROP COLUMN "notificationRecieveConfig" CASCADE; +ALTER TABLE user_profile DROP COLUMN "hardMutedWords" CASCADE; +ALTER TABLE user_profile RENAME COLUMN "followingVisibility" TO "ffVisibility"; + +ALTER TABLE user_security_key ALTER COLUMN "lastUsed" DROP DEFAULT; +ALTER TABLE user_security_key DROP COLUMN counter CASCADE; +ALTER TABLE user_security_key DROP COLUMN "credentialDeviceType" CASCADE; +ALTER TABLE user_security_key DROP COLUMN "credentialBackedUp" CASCADE; +ALTER TABLE user_security_key DROP COLUMN transports CASCADE; + +-- primary keys +ALTER TABLE ONLY attestation_challenge ADD CONSTRAINT "PK_d0ba6786e093f1bcb497572a6b5" PRIMARY KEY (id, "userId"); +ALTER TABLE ONLY html_note_cache_entry ADD CONSTRAINT "PK_6ef86ec901b2017cbe82d3a8286" PRIMARY KEY ("noteId"); +ALTER TABLE ONLY html_user_cache_entry ADD CONSTRAINT "PK_920b9474e3c9cae3f3c37c057e1" PRIMARY KEY ("userId"); +ALTER TABLE ONLY notification ADD CONSTRAINT "PK_705b6c7cdf9b2c2ff7ac7872cb7" PRIMARY KEY (id); +ALTER TABLE ONLY oauth_app ADD CONSTRAINT "PK_3256b97c0a3ee2d67240805dca4" PRIMARY KEY (id); +ALTER TABLE ONLY oauth_token ADD CONSTRAINT "PK_7e6a25a3cc4395d1658f5b89c73" PRIMARY KEY (id); + +-- indices +CREATE INDEX "IDX_01f4581f114e0ebd2bbb876f0b" ON note_reaction USING btree ("createdAt"); +CREATE INDEX "IDX_02878d441ceae15ce060b73daf" ON drive_folder USING btree ("createdAt"); +CREATE INDEX "IDX_048a757923ed8b157e9895da53" ON app USING btree ("createdAt"); +CREATE INDEX "IDX_080ab397c379af09b9d2169e5b" ON notification USING btree ("isRead"); +CREATE INDEX "IDX_0fb627e1c2f753262a74f0562d" ON poll_vote USING btree ("createdAt"); +CREATE INDEX "IDX_118ec703e596086fc4515acb39" ON announcement USING btree ("createdAt"); +CREATE INDEX "IDX_11e71f2511589dcc8a4d3214f9" ON channel_following USING btree ("createdAt"); +CREATE INDEX "IDX_25dfc71b0369b003a4cd434d0b" ON note USING btree ("attachedFileTypes"); +CREATE INDEX "IDX_2cbeb4b389444bcf4379ef4273" ON oauth_token USING btree (token); +CREATE INDEX "IDX_2cd3b2a6b4cf0b910b260afe08" ON instance USING btree ("caughtAt"); +CREATE INDEX "IDX_33f33cc8ef29d805a97ff4628b" ON notification USING btree (type); +CREATE INDEX "IDX_3b4e96eec8d36a8bbb9d02aa71" ON notification USING btree ("notifierId"); +CREATE INDEX "IDX_3c601b70a1066d2c8b517094cb" ON notification USING btree ("notifieeId"); +CREATE INDEX "IDX_47efb914aed1f72dd39a306c7b" ON attestation_challenge USING btree (challenge); +CREATE INDEX "IDX_51c063b6a133a9cb87145450f5" ON note USING btree ("fileIds"); +CREATE INDEX "IDX_54ebcb6d27222913b908d56fd8" ON note USING btree (mentions); +CREATE INDEX "IDX_582f8fab771a9040a12961f3e7" ON following USING btree ("createdAt"); +CREATE INDEX "IDX_605472305f26818cc93d1baaa7" ON user_list_joining USING btree ("userListId"); +CREATE UNIQUE INDEX "IDX_65b61f406c811241e1315a2f82" ON oauth_app USING btree ("clientId"); +CREATE INDEX "IDX_71cb7b435b7c0d4843317e7e16" ON channel USING btree ("createdAt"); +CREATE INDEX "IDX_796a8c03959361f97dc2be1d5c" ON note USING btree ("visibleUserIds"); +CREATE INDEX "IDX_88937d94d7443d9a99a76fa5c0" ON note USING btree (tags); +CREATE INDEX "IDX_8977c6037a7bc2cb0c84b6d4db" ON "user" USING btree ("isSuspended"); +CREATE INDEX "IDX_8f1a239bd077c8864a20c62c2c" ON gallery_post USING btree ("createdAt"); +CREATE UNIQUE INDEX "IDX_90f7da835e4c10aca6853621e1" ON user_list_joining USING btree ("userId", "userListId"); +CREATE INDEX "IDX_b11a5e627c41d4dc3170f1d370" ON notification USING btree ("createdAt"); +CREATE INDEX "IDX_b9a354f7941c1e779f3b33aea6" ON blocking USING btree ("createdAt"); +CREATE INDEX "IDX_c8dfad3b72196dd1d6b5db168a" ON drive_file USING btree ("createdAt"); +CREATE INDEX "IDX_d1259a2c2b7bb413ff449e8711" ON renote_muting USING btree ("createdAt"); +CREATE INDEX "IDX_d844bfc6f3f523a05189076efa" ON user_list_joining USING btree ("userId"); +CREATE INDEX "IDX_db2098070b2b5a523c58181f74" ON abuse_user_report USING btree ("createdAt"); +CREATE INDEX "IDX_dc5fe174a8b59025055f0ec136" ON oauth_token USING btree (code); +CREATE INDEX "IDX_e11e649824a45d8ed01d597fd9" ON "user" USING btree ("createdAt"); +CREATE INDEX "IDX_e22bf6bda77b6adc1fd9e75c8c" ON notification USING btree ("appAccessTokenId"); +CREATE INDEX "IDX_e7c0567f5261063592f022e9b5" ON note USING btree ("createdAt"); +CREATE INDEX "IDX_f1a461a618fa1755692d0e0d59" ON attestation_challenge USING btree ("userId"); +CREATE INDEX "IDX_f86d57fbca33c7a4e6897490cc" ON muting USING btree ("createdAt"); +CREATE INDEX "IDX_fbb4297c927a9b85e9cefa2eb1" ON page USING btree ("createdAt"); +CREATE INDEX "IDX_note_createdAt_userId" ON note USING btree ("createdAt", "userId"); +CREATE INDEX "IDX_note_id_userHost" ON note USING btree (id, "userHost"); +CREATE INDEX "IDX_note_url" ON note USING btree (url); +CREATE INDEX "IDX_note_userId_id" ON note USING btree ("userId", id); +CREATE INDEX note_text_fts_idx ON note USING gin (text gin_trgm_ops); + +DROP INDEX "IDX_NOTE_FILE_IDS" CASCADE; -- the iceshrimp index is a btree, this one is gin, so can't just rename! +DROP INDEX "IDX_de22cd2b445eee31ae51cdbe99" CASCADE; -- ON public.user_profile USING btree (substr((birthday)::text, 6, 5)); +DROP INDEX "IDX_f7b9d338207e40e768e4a5265a" CASCADE; -- ON public.instance USING btree ("caughtAt"); + +-- foreign keys +ALTER TABLE ONLY notification ADD CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710" FOREIGN KEY ("notifierId") REFERENCES "user"(id) ON DELETE CASCADE; +ALTER TABLE ONLY notification ADD CONSTRAINT "FK_3c601b70a1066d2c8b517094cb9" FOREIGN KEY ("notifieeId") REFERENCES "user"(id) ON DELETE CASCADE; +ALTER TABLE ONLY oauth_token ADD CONSTRAINT "FK_6d3ef28ea647b1449ba79690874" FOREIGN KEY ("appId") REFERENCES oauth_app(id) ON DELETE CASCADE; +ALTER TABLE ONLY html_note_cache_entry ADD CONSTRAINT "FK_6ef86ec901b2017cbe82d3a8286" FOREIGN KEY ("noteId") REFERENCES note(id) ON DELETE CASCADE; +ALTER TABLE ONLY notification ADD CONSTRAINT "FK_769cb6b73a1efe22ddf733ac453" FOREIGN KEY ("noteId") REFERENCES note(id) ON DELETE CASCADE; +ALTER TABLE ONLY notification ADD CONSTRAINT "FK_8fe87814e978053a53b1beb7e98" FOREIGN KEY ("userGroupInvitationId") REFERENCES user_group_invitation(id) ON DELETE CASCADE; +ALTER TABLE ONLY html_user_cache_entry ADD CONSTRAINT "FK_920b9474e3c9cae3f3c37c057e1" FOREIGN KEY ("userId") REFERENCES "user"(id) ON DELETE CASCADE; +ALTER TABLE ONLY notification ADD CONSTRAINT "FK_bd7fab507621e635b32cd31892c" FOREIGN KEY ("followRequestId") REFERENCES follow_request(id) ON DELETE CASCADE; +ALTER TABLE ONLY antenna ADD CONSTRAINT "FK_ccbf5a8c0be4511133dcc50ddeb" FOREIGN KEY ("userGroupJoiningId") REFERENCES user_group_joining(id) ON DELETE CASCADE; +ALTER TABLE ONLY notification ADD CONSTRAINT "FK_e22bf6bda77b6adc1fd9e75c8c9" FOREIGN KEY ("appAccessTokenId") REFERENCES access_token(id) ON DELETE CASCADE; +ALTER TABLE ONLY attestation_challenge ADD CONSTRAINT "FK_f1a461a618fa1755692d0e0d592" FOREIGN KEY ("userId") REFERENCES "user"(id) ON DELETE CASCADE; +ALTER TABLE ONLY oauth_token ADD CONSTRAINT "FK_f6b4b1ac66b753feab5d831ba04" FOREIGN KEY ("userId") REFERENCES "user"(id) ON DELETE CASCADE; + +-- comments +COMMENT ON COLUMN abuse_user_report."createdAt" IS 'The created date of the AbuseUserReport.'; +COMMENT ON COLUMN access_token."createdAt" IS 'The created date of the AccessToken.'; +COMMENT ON COLUMN announcement."createdAt" IS 'The created date of the Announcement.'; +COMMENT ON COLUMN announcement_read."createdAt" IS 'The created date of the AnnouncementRead.'; +COMMENT ON COLUMN antenna."createdAt" IS 'The created date of the Antenna.'; +COMMENT ON COLUMN app."createdAt" IS 'The created date of the App.'; +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.'; +COMMENT ON COLUMN auth_session."createdAt" IS 'The created date of the AuthSession.'; +COMMENT ON COLUMN blocking."createdAt" IS 'The created date of the Blocking.'; +COMMENT ON COLUMN channel."createdAt" IS 'The created date of the Channel.'; +COMMENT ON COLUMN channel_following."createdAt" IS 'The created date of the ChannelFollowing.'; +COMMENT ON COLUMN clip."createdAt" IS 'The created date of the Clip.'; +COMMENT ON COLUMN drive_file."createdAt" IS 'The created date of the DriveFile.'; +COMMENT ON COLUMN drive_folder."createdAt" IS 'The created date of the DriveFolder.'; +COMMENT ON COLUMN emoji.width IS 'Image width'; +COMMENT ON COLUMN emoji.height IS 'Image height'; +COMMENT ON COLUMN follow_request."createdAt" IS 'The created date of the FollowRequest.'; +COMMENT ON COLUMN following."createdAt" IS 'The created date of the Following.'; +COMMENT ON COLUMN gallery_post."createdAt" IS 'The created date of the GalleryPost.'; +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 moderation_log."createdAt" IS 'The created date of the ModerationLog.'; +COMMENT ON COLUMN muting."createdAt" IS 'The created date of the Muting.'; +COMMENT ON COLUMN note."createdAt" IS 'The created date of the Note.'; +COMMENT ON COLUMN note_favorite."createdAt" IS 'The created date of the NoteFavorite.'; +COMMENT ON COLUMN note_reaction."createdAt" IS 'The created date of the NoteReaction.'; +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 was read.'; +COMMENT ON COLUMN notification.type IS 'The type of the Notification.'; +COMMENT ON COLUMN oauth_app."createdAt" IS 'The created date of the OAuth application'; +COMMENT ON COLUMN oauth_app."clientId" IS 'The client id of the OAuth application'; +COMMENT ON COLUMN oauth_app."clientSecret" IS 'The client secret of the OAuth application'; +COMMENT ON COLUMN oauth_app.name IS 'The name of the OAuth application'; +COMMENT ON COLUMN oauth_app.website IS 'The website of the OAuth application'; +COMMENT ON COLUMN oauth_app.scopes IS 'The scopes requested by the OAuth application'; +COMMENT ON COLUMN oauth_app."redirectUris" IS 'The redirect URIs of the OAuth application'; +COMMENT ON COLUMN oauth_token."createdAt" IS 'The created date of the OAuth token'; +COMMENT ON COLUMN oauth_token.code IS 'The auth code for the OAuth token'; +COMMENT ON COLUMN oauth_token.token IS 'The OAuth token'; +COMMENT ON COLUMN oauth_token.active IS 'Whether or not the token has been activated'; +COMMENT ON COLUMN oauth_token.scopes IS 'The scopes requested by the OAuth token'; +COMMENT ON COLUMN oauth_token."redirectUri" IS 'The redirect URI of the OAuth token'; +COMMENT ON COLUMN page."createdAt" IS 'The created date of the Page.'; +COMMENT ON COLUMN poll_vote."createdAt" IS 'The created date of the PollVote.'; +COMMENT ON COLUMN promo_read."createdAt" IS 'The created date of the PromoRead.'; +COMMENT ON COLUMN registry_item."createdAt" IS 'The created date of the RegistryItem.'; +COMMENT ON COLUMN renote_muting."createdAt" IS 'The created date of the Muting.'; +COMMENT ON COLUMN signin."createdAt" IS 'The created date of the Signin.'; +COMMENT ON COLUMN "user"."createdAt" IS 'The created date of the User.'; +COMMENT ON COLUMN "user"."isSilenced" IS 'Whether the User is silenced.'; +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"."driveCapacityOverrideMb" IS 'Overrides user drive capacity limit'; +COMMENT ON COLUMN "user"."speakAsCat" IS 'Whether to speak as a cat if isCat.'; +COMMENT ON COLUMN "user"."avatarUrl" IS 'The URL of the avatar DriveFile'; +COMMENT ON COLUMN "user"."avatarBlurhash" IS 'The blurhash of the avatar DriveFile'; +COMMENT ON COLUMN "user"."bannerUrl" IS 'The URL of the banner DriveFile'; +COMMENT ON COLUMN "user"."bannerBlurhash" IS 'The blurhash of the banner DriveFile'; +COMMENT ON COLUMN user_list."createdAt" IS 'The created date of the UserList.'; +COMMENT ON COLUMN user_list."hideFromHomeTl" IS 'Whether posts from list members should be hidden from the home timeline.'; +COMMENT ON COLUMN user_list_joining."createdAt" IS 'The created date of the UserListJoining.'; +COMMENT ON COLUMN user_note_pining."createdAt" IS 'The created date of the UserNotePinings.'; +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 webhook."createdAt" IS 'The created date of the Antenna.'; + +-- lie to typeorm +TRUNCATE migrations; +COPY migrations (id, "timestamp", name) FROM stdin; +1 1000000000000 Init1000000000000 +2 1556348509290 Pages1556348509290 +3 1556746559567 UserProfile1556746559567 +4 1557476068003 PinnedUsers1557476068003 +5 1557761316509 AddSomeUrls1557761316509 +6 1557932705754 ObjectStorageSetting1557932705754 +7 1558072954435 PageLike1558072954435 +8 1558103093633 UserGroup1558103093633 +9 1558257926829 UserGroupInvite1558257926829 +10 1558266512381 UserListJoining1558266512381 +11 1561706992953 webauthn1561706992953 +12 1561873850023 ChartIndexes1561873850023 +13 1562422242907 PasswordLessLogin1562422242907 +14 1562444565093 PinnedPage1562444565093 +15 1562448332510 PageTitleHideOption1562448332510 +16 1562869971568 ModerationLog1562869971568 +17 1563757595828 UsedUsername1563757595828 +18 1565634203341 room1565634203341 +19 1571220798684 CustomEmojiCategory1571220798684 +20 1572760203493 nodeinfo1572760203493 +21 1576269851876 TalkFederationId1576269851876 +22 1576869585998 ProxyRemoteFiles1576869585998 +23 1579267006611 v121579267006611 +24 1579270193251 v1221579270193251 +25 1579282808087 v1231579282808087 +26 1579544426412 v1241579544426412 +27 1579977526288 v1251579977526288 +28 1579993013959 v1261579993013959 +29 1580069531114 v1271580069531114 +30 1580148575182 v1281580148575182 +31 1580154400017 v1291580154400017 +32 1580276619901 v12101580276619901 +33 1580331224276 v12111580331224276 +34 1580508795118 v12121580508795118 +35 1580543501339 v12131580543501339 +36 1580864313253 v12141580864313253 +37 1581526429287 userGroupInvitation1581526429287 +38 1581695816408 userGroupAntenna1581695816408 +39 1581708415836 driveUserFolderIdIndex1581708415836 +40 1581979837262 promo1581979837262 +41 1582019042083 featuredInjecttion1582019042083 +42 1582210532752 antennaExclude1582210532752 +43 1582875306439 noteReactionLength1582875306439 +44 1585361548360 miauth1585361548360 +45 1585385921215 customNotification1585385921215 +46 1585772678853 apUrl1585772678853 +47 1586624197029 AddObjectStorageUseProxy1586624197029 +48 1586641139527 remoteReaction1586641139527 +49 1586708940386 pageAiScript1586708940386 +50 1588044505511 hCaptcha1588044505511 +51 1589023282116 pubRelay1589023282116 +52 1595075960584 blurhash1595075960584 +53 1595077605646 blurhashForAvatarBanner1595077605646 +54 1595676934834 instanceIconUrl1595676934834 +55 1595771249699 wordMute1595771249699 +56 1595782306083 wordMute21595782306083 +57 1596548170836 channel1596548170836 +58 1596786425167 channel21596786425167 +59 1597230137744 objectStorageSetPublicRead1597230137744 +60 1597236229720 IncludingNotificationTypes1597236229720 +61 1597385880794 addSensitiveIndex1597385880794 +62 1597459042300 channelUnread1597459042300 +63 1597893996136 ChannelNoteIdDescIndex1597893996136 +64 1600353287890 mutingNotificationTypes1600353287890 +65 1603094348345 refineAbuseUserReport1603094348345 +66 1603095701770 refineAbuseUserReport21603095701770 +67 1603776877564 instanceThemeColor1603776877564 +68 1603781553011 instanceFavicon1603781553011 +69 1604821689616 deleteAutoWatch1604821689616 +70 1605408848373 clipDescription1605408848373 +71 1605408971051 comments1605408971051 +72 1605585339718 instancePinnedPages1605585339718 +73 1605965516823 instanceImages1605965516823 +74 1606191203881 noCrawle1606191203881 +75 1607151207216 instancePinnedClip1607151207216 +76 1607353487793 isExplorable1607353487793 +77 1610277136869 registry1610277136869 +78 1610277585759 registry21610277585759 +79 1610283021566 registry31610283021566 +80 1611354329133 followersUri1611354329133 +81 1611397665007 gallery1611397665007 +82 1611547387175 objectStorageS3ForcePathStyle1611547387175 +83 1612619156584 announcementEmail1612619156584 +84 1613155914446 emailNotificationTypes1613155914446 +85 1613181457597 userLang1613181457597 +86 1613503367223 useBigintForDriveUsage1613503367223 +87 1615965918224 chartV21615965918224 +88 1615966519402 chartV221615966519402 +89 1618637372000 userLastActiveDate1618637372000 +90 1618639857000 userHideOnlineStatus1618639857000 +91 1619942102890 passwordReset1619942102890 +92 1620019354680 ad1620019354680 +93 1620364649428 ad21620364649428 +94 1621479946000 addNoteIndexes1621479946000 +95 1622679304522 userProfileDescriptionLength1622679304522 +96 1622681548499 logMessageLength1622681548499 +97 1626509500668 fixRemoteFileProxy1626509500668 +98 1626733991004 allowlistSecureMode1626733991004 +99 1629004542760 chartReindex1629004542760 +100 1629024377804 deeplIntegration1629024377804 +101 1629288472000 fixChannelUserId1629288472000 +102 1629512953000 isUserDeleted1629512953000 +103 1629778475000 deeplIntegration21629778475000 +104 1629833361000 addShowTLReplies1629833361000 +105 1629968054000 userInstanceBlocks1629968054000 +106 1633068642000 emailRequiredForSignup1633068642000 +107 1633071909016 userPending1633071909016 +108 1634486652000 userPublicReactions1634486652000 +109 1634902659689 deleteLog1634902659689 +110 1635500777168 noteThreadMute1635500777168 +111 1636197624383 ffVisibility1636197624383 +112 1636697408073 removeViaMobile1636697408073 +113 1637320813000 forwardedReport1637320813000 +114 1639325650583 chartV31639325650583 +115 1642611822809 emojiUrl1642611822809 +116 1642613870898 driveFileWebpublicType1642613870898 +117 1643963705770 chartV41643963705770 +118 1643966656277 chartV51643966656277 +119 1643967331284 chartV61643967331284 +120 1644010796173 convertHardMutes1644010796173 +121 1644058404077 chartV71644058404077 +122 1644059847460 chartV81644059847460 +123 1644060125705 chartV91644060125705 +124 1644073149413 chartV101644073149413 +125 1644095659741 chartV111644095659741 +126 1644328606241 chartV121644328606241 +127 1644331238153 chartV131644331238153 +128 1644344266289 chartV141644344266289 +129 1644395759931 instanceThemeColor1644395759931 +130 1644481657998 chartV151644481657998 +131 1644551208096 followingIndexes1644551208096 +132 1645340161439 removeMaxNoteTextLength1645340161439 +133 1645599900873 federationChartPubsub1645599900873 +134 1646143552768 instanceDefaultTheme1646143552768 +135 1646387162108 muteExpiresAt1646387162108 +136 1646549089451 pollEndedNotification1646549089451 +137 1646633030285 chartFederationActive1646633030285 +138 1646655454495 removeInstanceDriveColumns1646655454495 +139 1646732390560 chartFederationActiveSubPub1646732390560 +140 1648548247382 webhook1648548247382 +141 1648816172177 webhook21648816172177 +142 1651224615271 foreignKeyReports1651224615271 +143 1652859567549 uniformThemecolor1652859567549 +144 1655368940105 nsfwDetection1655368940105 +145 1655371960534 nsfwDetection21655371960534 +146 1655388169582 nsfwDetection31655388169582 +147 1655393015659 nsfwDetection41655393015659 +148 1655813815729 driveCapacityOverrideMb1655813815729 +149 1655918165614 userIp1655918165614 +150 1656122560740 fileIp1656122560740 +151 1656251734807 nsfwDetection51656251734807 +152 1656328812281 ip21656328812281 +153 1656408772602 nsfwDetection61656408772602 +154 1656772790599 userModerationNote1656772790599 +155 1657346559800 activeEmailValidation1657346559800 +156 1658203170545 calckey1658203170545 +157 1658656633972 noteRepliesFunction1658656633972 +158 1658939464003 CustomMOTD1658939464003 +159 1658941974648 CustomSplashIcons1658941974648 +160 1658981842728 FixFirefish1658981842728 +161 1659042130648 RecommendedTimeline1659042130648 +162 1660068273737 GuestTimeline1660068273737 +163 1665091090561 addRenoteMuting1665091090561 +164 1668828368510 Page1668828368510 +165 1668831378728 FixFirefishAgain1668831378728 +166 1669138716634 whetherPushNotifyToSendReadMessage1669138716634 +167 1669288094000 addMovedToAndKnownAs1669288094000 +168 1671199573000 addFkAbuseUserReportTargetUserIdToUserId1671199573000 +169 1671388343000 FirefishRepoMove1671388343000 +170 1672882664294 DefaultReaction1672882664294 +171 1673336077243 PollChoiceLength1673336077243 +172 1676093997212 AntennaInstances1676093997212 +173 1677935903517 DriveComment1677935903517 +174 1678426061773 tweakVarcharLength1678426061773 +175 1678945242650 addPropsForCustomEmoji1678945242650 +176 1679269929000 FixRepo1679269929000 +177 1680375641101 CleanCharts1680375641101 +178 1680426269172 SpeakAsCat1680426269172 +179 1682753227899 NoteEdit1682753227899 +180 1682777547198 LibreTranslate1682777547198 +181 1682891890317 InstanceSilence1682891890317 +182 1682891891317 AddHiddenPosts1682891891317 +183 1683682889948 PreventAiLearning1683682889948 +184 1683980686995 ExperimentalFeatures1683980686995 +185 1684206886988 RemoveShowTimelineReplies1684206886988 +186 1684494870830 EmojiSize1684494870830 +187 1688280713783 AddMetaOptions1688280713783 +188 1688845537045 AnnouncementPopup1688845537045 +189 1689136347561 DonationLink1689136347561 +190 1689739513827 FirefishRepo1689739513827 +191 1689965609061 IceshrimpRepo1689965609061 +192 1695747439252 DropReversi1695747439252 +193 1695748502971 IndexNoteUrl1695748502971 +194 1695748874491 DropAds1695748874491 +195 1695749386779 InstanceAccountDomainCleanup1695749386779 +196 1695749948350 MoveAntennaToCache1695749948350 +197 1695861526125 IndexNoteUserId1695861526125 +198 1697216726757 AutoGenerateVapidKeys1697216726757 +199 1697226201723 AddOAuthTables1697226201723 +200 1697246035867 IncreaseOAuthRedirecturisLength1697246035867 +201 1697286869039 IncreaseOauthTokenRedirecturisLength1697286869039 +202 1697289658422 ResyncWithOrm1697289658422 +203 1697302438587 AddUserProfileMentions1697302438587 +204 1697649475796 SecureModeDefaults1697649475796 +205 1697663824168 RemoveNsfwDetection1697663824168 +206 1697665612162 RemoveProxyAccount1697665612162 +207 1697733603329 UserListOptions1697733603329 +208 1700331070890 NoteTextFtsIdx1700331070890 +209 1700517975122 UserAvatarBannerRefactor1700517975122 +210 1700623165718 AddNoteIdUserhostIdx1700623165718 +211 1700686908916 AddAutofollowedAccount1700686908916 +212 1700962939886 AddHtmlCache1700962939886 +213 1701069578019 RemoveTwitterIntegration1701069578019 +214 1701108527387 ReworkHardMutes1701108527387 +215 1701118152149 IncreaseHostCharLimit1701118152149 +216 1702680809638 AddNoteCreatedatUseridIdx1702680809638 +217 1702744857694 UserIssuspendedIdx1702744857694 +\. + +SELECT pg_catalog.setval('public.migrations_id_seq', 217, true); + +-- this is just for my personal fork, you won't need it +DROP FUNCTION IF EXISTS kopper_fts_reindex_file_comment CASCADE; +DROP FUNCTION IF EXISTS kopper_fts_reindex_note CASCADE; +DROP FUNCTION IF EXISTS kopper_fts_generate_search_vector CASCADE; +ALTER TABLE note DROP COLUMN IF EXISTS kopper_fts_search_vector CASCADE; + +COMMIT; -- cross your fingers diff --git a/locales/de-DE.yml b/locales/de-DE.yml index b997e9536..885cc518c 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -54,7 +54,7 @@ searchUser: "Nach einem Nutzer suchen" reply: "Antworten" loadMore: "Mehr laden" showMore: "Mehr anzeigen" -showLess: "Schließen" +showLess: "Warte, nein" youGotNewFollower: "folgt dir" receiveFollowRequest: "Follow-Anfrage erhalten" followRequestAccepted: "Follow-Anfrage akzeptiert" diff --git a/locales/en-US.yml b/locales/en-US.yml index b01f56f13..7b0a88b8a 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -65,7 +65,7 @@ newer: "newer" older: "older" expandAllCws: "Show content for all replies" collapseAllCws: "Hide content for all replies" -showLess: "Show less" +showLess: "Wait no" youGotNewFollower: "followed you" receiveFollowRequest: "Follow request received" followRequestAccepted: "Follow request accepted" diff --git a/packages/backend/src/server/proxy/proxy-media.ts b/packages/backend/src/server/proxy/proxy-media.ts index b3bb03124..2da2c0045 100644 --- a/packages/backend/src/server/proxy/proxy-media.ts +++ b/packages/backend/src/server/proxy/proxy-media.ts @@ -112,9 +112,7 @@ export async function proxyMedia(ctx: Koa.Context) { }; } else if (mime === "image/svg+xml") { image = await convertToWebp(path, 2048, 2048, 1); - } else if ( - !(mime.startsWith("image/") && FILE_TYPE_BROWSERSAFE.includes(mime)) - ) { + } else if (!FILE_TYPE_BROWSERSAFE.includes(mime)) { throw new StatusError("Rejected type", 403, "Rejected type"); } else { image = {