From d98f9ae0a2967cd9eedb80169b16394b0fb00394 Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Sat, 2 Mar 2024 12:51:48 -0800 Subject: [PATCH] Colocate more root resolvers --- .../api/graphql/ModernSkinsConnection.ts | 20 ++++ .../api/graphql/SkinsConnection.ts | 64 +++++++++++ .../api/graphql/TweetsConnection.ts | 2 +- .../resolvers/DatabaseStatisticsResolver.ts | 2 +- .../api/graphql/resolvers/NodeResolver.ts | 2 +- .../api/graphql/resolvers/QueryResolver.ts | 2 + .../api/graphql/resolvers/SkinResolver.ts | 2 +- .../{RootResolver.ts => SkinUpload.ts} | 107 ++---------------- .../api/graphql/resolvers/UserResolver.ts | 2 +- packages/skin-database/api/graphql/schema.ts | 8 +- .../skin-database/data/ArchiveFileModel.ts | 2 +- packages/skin-database/data/IaItemModel.ts | 2 +- packages/skin-database/data/TweetModel.ts | 2 +- 13 files changed, 108 insertions(+), 109 deletions(-) create mode 100644 packages/skin-database/api/graphql/resolvers/QueryResolver.ts rename packages/skin-database/api/graphql/resolvers/{RootResolver.ts => SkinUpload.ts} (59%) diff --git a/packages/skin-database/api/graphql/ModernSkinsConnection.ts b/packages/skin-database/api/graphql/ModernSkinsConnection.ts index bfd0cc63..369de4d7 100644 --- a/packages/skin-database/api/graphql/ModernSkinsConnection.ts +++ b/packages/skin-database/api/graphql/ModernSkinsConnection.ts @@ -3,6 +3,7 @@ import SkinModel from "../../data/SkinModel"; import { knex } from "../../db"; import ModernSkinResolver from "./resolvers/ModernSkinResolver"; import { Ctx } from "."; +import { Query } from "./resolvers/QueryResolver"; /** * A collection of "modern" Winamp skins @@ -43,3 +44,22 @@ export default class ModernSkinsConnection { }); } } + +/** + * All modern skins in the database + * @gqlField */ +export async function modern_skins( + _: Query, + { + first = 10, + offset = 0, + }: { + first?: Int; + offset?: Int; + } +): Promise { + if (first > 1000) { + throw new Error("Maximum limit is 1000"); + } + return new ModernSkinsConnection(first, offset); +} diff --git a/packages/skin-database/api/graphql/SkinsConnection.ts b/packages/skin-database/api/graphql/SkinsConnection.ts index b574338d..ecae495a 100644 --- a/packages/skin-database/api/graphql/SkinsConnection.ts +++ b/packages/skin-database/api/graphql/SkinsConnection.ts @@ -6,6 +6,7 @@ import LRU from "lru-cache"; import { Int } from "grats"; import { ISkin } from "./resolvers/CommonSkinResolver"; import { Ctx } from "."; +import { Query } from "./resolvers/QueryResolver"; const options = { max: 100, @@ -127,3 +128,66 @@ export default class SkinsConnection { }); } } + +/** @gqlEnum */ +type SkinsSortOption = + /** +the Museum's (https://skins.webamp.org) special sorting rules. + +Roughly speaking, it's: + +1. The four classic default skins +2. Tweeted skins first (sorted by the number of likes/retweets) +3. Approved, but not tweeted yet, skins +4. Unreviwed skins +5. Rejected skins +6. NSFW skins +*/ + "MUSEUM"; + +/** @gqlEnum */ +type SkinsFilterOption = + /* +Only the skins that have been approved for tweeting +*/ + | "APPROVED" + + /* +Only the skins that have been rejected for tweeting +*/ + | "REJECTED" + + /* +Only the skins that have been marked NSFW +*/ + | "NSFW" + + /* +Only the skins that have been tweeted +*/ + | "TWEETED"; + +/** + * All classic skins in the database + * + * **Note:** We don't currently support combining sorting and filtering. + * @gqlField */ +export function skins( + _: Query, + { + first = 10, + offset = 0, + sort, + filter, + }: { + first?: Int; + offset?: Int; + sort?: SkinsSortOption | null; + filter?: SkinsFilterOption | null; + } +): SkinsConnection { + if (first > 1000) { + throw new Error("Maximum limit is 1000"); + } + return new SkinsConnection(first, offset, sort, filter); +} diff --git a/packages/skin-database/api/graphql/TweetsConnection.ts b/packages/skin-database/api/graphql/TweetsConnection.ts index dfd3b1ae..b13a1ce4 100644 --- a/packages/skin-database/api/graphql/TweetsConnection.ts +++ b/packages/skin-database/api/graphql/TweetsConnection.ts @@ -1,7 +1,7 @@ import { Int } from "grats"; import TweetModel from "../../data/TweetModel"; import { knex } from "../../db"; -import { Query } from "./resolvers/RootResolver"; +import { Query } from "./resolvers/QueryResolver"; /** @gqlEnum */ export type TweetsSortOption = "LIKES" | "RETWEETS"; diff --git a/packages/skin-database/api/graphql/resolvers/DatabaseStatisticsResolver.ts b/packages/skin-database/api/graphql/resolvers/DatabaseStatisticsResolver.ts index efca3361..25c2f95b 100644 --- a/packages/skin-database/api/graphql/resolvers/DatabaseStatisticsResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/DatabaseStatisticsResolver.ts @@ -1,6 +1,6 @@ import { Int } from "grats"; import * as Skins from "../../../data/skins"; -import { Query } from "./RootResolver"; +import { Query } from "./QueryResolver"; /** * Statistics about the contents of the Museum's database. diff --git a/packages/skin-database/api/graphql/resolvers/NodeResolver.ts b/packages/skin-database/api/graphql/resolvers/NodeResolver.ts index 16edef7a..8021c786 100644 --- a/packages/skin-database/api/graphql/resolvers/NodeResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/NodeResolver.ts @@ -1,5 +1,5 @@ import { ID } from "grats"; -import { Query } from "./RootResolver"; +import { Query } from "./QueryResolver"; import { Ctx } from ".."; import SkinModel from "../../../data/SkinModel"; import SkinResolver from "./SkinResolver"; diff --git a/packages/skin-database/api/graphql/resolvers/QueryResolver.ts b/packages/skin-database/api/graphql/resolvers/QueryResolver.ts new file mode 100644 index 00000000..8658a14a --- /dev/null +++ b/packages/skin-database/api/graphql/resolvers/QueryResolver.ts @@ -0,0 +1,2 @@ +/** @gqlType Query */ +export type Query = unknown; diff --git a/packages/skin-database/api/graphql/resolvers/SkinResolver.ts b/packages/skin-database/api/graphql/resolvers/SkinResolver.ts index 0f9bc94a..7f3cbd8d 100644 --- a/packages/skin-database/api/graphql/resolvers/SkinResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/SkinResolver.ts @@ -5,7 +5,7 @@ import UserContext from "../../../data/UserContext"; import ClassicSkinResolver from "./ClassicSkinResolver"; import { ISkin } from "./CommonSkinResolver"; import ModernSkinResolver from "./ModernSkinResolver"; -import { Query } from "./RootResolver"; +import { Query } from "./QueryResolver"; import algoliasearch from "algoliasearch"; import * as Skins from "../../../data/skins"; diff --git a/packages/skin-database/api/graphql/resolvers/RootResolver.ts b/packages/skin-database/api/graphql/resolvers/SkinUpload.ts similarity index 59% rename from packages/skin-database/api/graphql/resolvers/RootResolver.ts rename to packages/skin-database/api/graphql/resolvers/SkinUpload.ts index 064b8319..24c84452 100644 --- a/packages/skin-database/api/graphql/resolvers/RootResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/SkinUpload.ts @@ -1,59 +1,10 @@ -import SkinModel from "../../../data/SkinModel"; -import SkinResolver from "../resolvers/SkinResolver"; -import SkinsConnection from "../SkinsConnection"; -import { Int } from "grats"; - -import { knex } from "../../../db"; -import ModernSkinsConnection from "../ModernSkinsConnection"; -import { ISkin } from "./CommonSkinResolver"; import { Ctx } from ".."; - -/** @gqlType Query */ -export type Query = unknown; - -/** - * All classic skins in the database - * - * **Note:** We don't currently support combining sorting and filtering. - * @gqlField */ -export function skins( - _: Query, - { - first = 10, - offset = 0, - sort, - filter, - }: { - first?: Int; - offset?: Int; - sort?: SkinsSortOption | null; - filter?: SkinsFilterOption | null; - } -): SkinsConnection { - if (first > 1000) { - throw new Error("Maximum limit is 1000"); - } - return new SkinsConnection(first, offset, sort, filter); -} - -/** - * All modern skins in the database - * @gqlField */ -export async function modern_skins( - _: Query, - { - first = 10, - offset = 0, - }: { - first?: Int; - offset?: Int; - } -): Promise { - if (first > 1000) { - throw new Error("Maximum limit is 1000"); - } - return new ModernSkinsConnection(first, offset); -} +import SkinModel from "../../../data/SkinModel"; +import UserContext from "../../../data/UserContext"; +import { knex } from "../../../db"; +import { ISkin } from "./CommonSkinResolver"; +import { Query } from "./QueryResolver"; +import SkinResolver from "./SkinResolver"; /** * Get the status of a batch of uploads by md5s @@ -80,7 +31,7 @@ export async function upload_statuses( } // Shared implementation for upload_statuses and upload_statuses_by_md5 -async function _upload_statuses({ keyName, keys }, ctx) { +async function _upload_statuses({ keyName, keys }, ctx: UserContext) { const skins = await knex("skin_uploads") .whereIn(keyName, keys) .orderBy("id", "desc") @@ -122,44 +73,6 @@ type SkinUpload = { upload_md5: string; }; -/** @gqlEnum */ -type SkinsSortOption = - /** -the Museum's (https://skins.webamp.org) special sorting rules. - -Roughly speaking, it's: - -1. The four classic default skins -2. Tweeted skins first (sorted by the number of likes/retweets) -3. Approved, but not tweeted yet, skins -4. Unreviwed skins -5. Rejected skins -6. NSFW skins -*/ - "MUSEUM"; - -/** @gqlEnum */ -type SkinsFilterOption = - /* -Only the skins that have been approved for tweeting -*/ - | "APPROVED" - - /* -Only the skins that have been rejected for tweeting -*/ - | "REJECTED" - - /* -Only the skins that have been marked NSFW -*/ - | "NSFW" - - /* -Only the skins that have been tweeted -*/ - | "TWEETED"; - /** * The current status of a pending upload. * @@ -171,13 +84,13 @@ type SkinUploadStatus = /** The user has requested a URL, but the skin has not yet been processed. */ | "URL_REQUESTED" /** The user has notified us that the skin has been uploaded, but we haven't yet - processed it. */ + processed it. */ | "UPLOAD_REPORTED" /** An error occured processing the skin. Usually this is a transient error, and - the skin will be retried at a later time. */ + the skin will be retried at a later time. */ | "ERRORED" /** An error occured processing the skin, but it was the fault of the server. It - will be processed at a later date. */ + will be processed at a later date. */ | "DELAYED" /** The skin has been successfully added to the Museum. * @deprecated diff --git a/packages/skin-database/api/graphql/resolvers/UserResolver.ts b/packages/skin-database/api/graphql/resolvers/UserResolver.ts index 30e7e7a2..1037572f 100644 --- a/packages/skin-database/api/graphql/resolvers/UserResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/UserResolver.ts @@ -1,5 +1,5 @@ import { Ctx } from ".."; -import { Query } from "./RootResolver"; +import { Query } from "./QueryResolver"; /** @gqlType User */ export default class UserResolver { diff --git a/packages/skin-database/api/graphql/schema.ts b/packages/skin-database/api/graphql/schema.ts index 799e01d2..9b2172f4 100644 --- a/packages/skin-database/api/graphql/schema.ts +++ b/packages/skin-database/api/graphql/schema.ts @@ -22,15 +22,15 @@ import { screenshot_url as modernSkinScreenshot_urlResolver } from "./resolvers/ import { tweeted as modernSkinTweetedResolver } from "./resolvers/CommonSkinResolver"; import { tweets as modernSkinTweetsResolver } from "./resolvers/CommonSkinResolver"; import { webamp_url as modernSkinWebamp_urlResolver } from "./resolvers/CommonSkinResolver"; -import { modern_skins as queryModern_skinsResolver } from "./resolvers/RootResolver"; +import { modern_skins as queryModern_skinsResolver } from "./ModernSkinsConnection"; import { node as queryNodeResolver } from "./resolvers/NodeResolver"; import { search_skins as querySearch_skinsResolver } from "./resolvers/SkinResolver"; import { skin_to_review as querySkin_to_reviewResolver } from "./resolvers/SkinResolver"; -import { skins as querySkinsResolver } from "./resolvers/RootResolver"; +import { skins as querySkinsResolver } from "./SkinsConnection"; import { statistics as queryStatisticsResolver } from "./resolvers/DatabaseStatisticsResolver"; import { tweets as queryTweetsResolver } from "./TweetsConnection"; -import { upload_statuses as queryUpload_statusesResolver } from "./resolvers/RootResolver"; -import { upload_statuses_by_md5 as queryUpload_statuses_by_md5Resolver } from "./resolvers/RootResolver"; +import { upload_statuses as queryUpload_statusesResolver } from "./resolvers/SkinUpload"; +import { upload_statuses_by_md5 as queryUpload_statuses_by_md5Resolver } from "./resolvers/SkinUpload"; import { approve_skin as mutationApprove_skinResolver } from "./resolvers/MutationResolver"; import { mark_skin_nsfw as mutationMark_skin_nsfwResolver } from "./resolvers/MutationResolver"; import { reject_skin as mutationReject_skinResolver } from "./resolvers/MutationResolver"; diff --git a/packages/skin-database/data/ArchiveFileModel.ts b/packages/skin-database/data/ArchiveFileModel.ts index 9fad4ef7..b2239032 100644 --- a/packages/skin-database/data/ArchiveFileModel.ts +++ b/packages/skin-database/data/ArchiveFileModel.ts @@ -8,7 +8,7 @@ import { ISkin } from "../api/graphql/resolvers/CommonSkinResolver"; import SkinResolver from "../api/graphql/resolvers/SkinResolver"; import { Int } from "grats"; import { Ctx } from "../api/graphql"; -import { Query } from "../api/graphql/resolvers/RootResolver"; +import { Query } from "../api/graphql/resolvers/QueryResolver"; export type ArchiveFileDebugData = { row: ArchiveFileRow; diff --git a/packages/skin-database/data/IaItemModel.ts b/packages/skin-database/data/IaItemModel.ts index d954e927..54db0836 100644 --- a/packages/skin-database/data/IaItemModel.ts +++ b/packages/skin-database/data/IaItemModel.ts @@ -7,7 +7,7 @@ import { fetchMetadata, fetchTasks } from "../services/internetArchive"; import { ISkin } from "../api/graphql/resolvers/CommonSkinResolver"; import SkinResolver from "../api/graphql/resolvers/SkinResolver"; import { Ctx } from "../api/graphql"; -import { Query } from "../api/graphql/resolvers/RootResolver"; +import { Query } from "../api/graphql/resolvers/QueryResolver"; const IA_URL = /^(https:\/\/)?archive.org\/details\/([^/]+)\/?/; diff --git a/packages/skin-database/data/TweetModel.ts b/packages/skin-database/data/TweetModel.ts index bb47a491..695e842f 100644 --- a/packages/skin-database/data/TweetModel.ts +++ b/packages/skin-database/data/TweetModel.ts @@ -8,7 +8,7 @@ import { Int } from "grats"; import { ISkin } from "../api/graphql/resolvers/CommonSkinResolver"; import SkinResolver from "../api/graphql/resolvers/SkinResolver"; import { Ctx } from "../api/graphql"; -import { Query } from "../api/graphql/resolvers/RootResolver"; +import { Query } from "../api/graphql/resolvers/QueryResolver"; export type TweetDebugData = { row: TweetRow;