Colocate more root resolvers

This commit is contained in:
Jordan Eldredge 2024-03-02 12:51:48 -08:00
parent cef3122d5c
commit d98f9ae0a2
13 changed files with 108 additions and 109 deletions

View file

@ -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<ModernSkinsConnection> {
if (first > 1000) {
throw new Error("Maximum limit is 1000");
}
return new ModernSkinsConnection(first, offset);
}

View file

@ -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);
}

View file

@ -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";

View file

@ -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.

View file

@ -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";

View file

@ -0,0 +1,2 @@
/** @gqlType Query */
export type Query = unknown;

View file

@ -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";

View file

@ -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<ModernSkinsConnection> {
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

View file

@ -1,5 +1,5 @@
import { Ctx } from "..";
import { Query } from "./RootResolver";
import { Query } from "./QueryResolver";
/** @gqlType User */
export default class UserResolver {

View file

@ -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";

View file

@ -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;

View file

@ -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\/([^/]+)\/?/;

View file

@ -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;