diff --git a/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts b/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts index 63f577e7..a9ec75a9 100644 --- a/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts @@ -3,9 +3,9 @@ import { NodeResolver, toId } from "./NodeResolver"; import ReviewResolver from "./ReviewResolver"; import path from "path"; import { ID, Int } from "grats"; -import InternetArchiveItemResolver from "./InternetArchiveItemResolver"; import TweetModel from "../../../data/TweetModel"; import ArchiveFileModel from "../../../data/ArchiveFileModel"; +import IaItemModel from "../../../data/IaItemModel"; /** * A classic Winamp skin @@ -77,7 +77,7 @@ export default class ClassicSkinResolver /** * The skin's "item" at archive.org * @gqlField */ - internet_archive_item(): Promise { + internet_archive_item(): Promise { return super.internet_archive_item(); } /** diff --git a/packages/skin-database/api/graphql/resolvers/CommonSkinResolver.ts b/packages/skin-database/api/graphql/resolvers/CommonSkinResolver.ts index d9a26dc2..ef3b951a 100644 --- a/packages/skin-database/api/graphql/resolvers/CommonSkinResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/CommonSkinResolver.ts @@ -1,9 +1,9 @@ import { ID } from "grats"; import SkinModel from "../../../data/SkinModel"; -import InternetArchiveItemResolver from "./InternetArchiveItemResolver"; import ReviewResolver from "./ReviewResolver"; import TweetModel from "../../../data/TweetModel"; import ArchiveFileModel from "../../../data/ArchiveFileModel"; +import IaItemModel from "../../../data/IaItemModel"; /** * A Winamp skin. Could be modern or classic. @@ -69,11 +69,11 @@ export interface ISkin { * The skin's "item" at archive.org * @gqlField */ - internet_archive_item(): Promise; + internet_archive_item(): Promise; /** * Times that the skin has been reviewed either on the Museum's Tinder-style - * reivew page, or via the Discord bot. + * review page, or via the Discord bot. * @gqlField */ reviews(): Promise>; @@ -130,12 +130,8 @@ export default abstract class CommonSkinResolver { async archive_files(): Promise> { return this._model.getArchiveFiles(); } - async internet_archive_item(): Promise { - const item = await this._model.getIaItem(); - if (item == null) { - return null; - } - return new InternetArchiveItemResolver(item); + async internet_archive_item(): Promise { + return this._model.getIaItem(); } async reviews(): Promise> { diff --git a/packages/skin-database/api/graphql/resolvers/InternetArchiveItemResolver.ts b/packages/skin-database/api/graphql/resolvers/InternetArchiveItemResolver.ts deleted file mode 100644 index 650d0cd1..00000000 --- a/packages/skin-database/api/graphql/resolvers/InternetArchiveItemResolver.ts +++ /dev/null @@ -1,61 +0,0 @@ -import IaItemModel from "../../../data/IaItemModel"; -import { ISkin } from "./CommonSkinResolver"; -import SkinResolver from "./SkinResolver"; - -/** @gqlType InternetArchiveItem */ -export default class InternetArchiveItemResolver { - _model: IaItemModel; - constructor(model: IaItemModel) { - this._model = model; - } - /** - * The Internet Archive's unique identifier for this item - * @gqlField - */ - identifier(): string { - return this._model.getIdentifier(); - } - /** - * The URL where this item can be viewed on the Internet Archive - * @gqlField - */ - url(): string { - return this._model.getUrl(); - } - /** - * URL to get the Internet Archive's metadata for this item in JSON form. - * @gqlField - */ - metadata_url(): string { - return this._model.getMetadataUrl(); - } - - /** - * The date and time that we last scraped this item's metadata. - * **Note:** This field is temporary and will be removed in the future. - * The date format is just what we get from the database, and it's ambiguous. - * @gqlField - */ - last_metadata_scrape_date_UNSTABLE(): string | null { - return this._model.getMetadataTimestamp(); - } - - /** - * Our cached version of the metadata avaliable at \`metadata_url\` (above) - * @gqlField - */ - raw_metadata_json(): string | null { - return this._model.getMetadataJSON(); - } - /** - * The skin that this item contains - * @gqlField - */ - async skin(): Promise { - const skin = await this._model.getSkin(); - if (skin == null) { - return null; - } - return SkinResolver.fromModel(skin); - } -} diff --git a/packages/skin-database/api/graphql/resolvers/ModernSkinResolver.ts b/packages/skin-database/api/graphql/resolvers/ModernSkinResolver.ts index 7b488297..a4da3ca4 100644 --- a/packages/skin-database/api/graphql/resolvers/ModernSkinResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/ModernSkinResolver.ts @@ -4,10 +4,10 @@ import { NodeResolver, toId } from "./NodeResolver"; import path from "path"; import { ID } from "grats"; import ReviewResolver from "./ReviewResolver"; -import InternetArchiveItemResolver from "./InternetArchiveItemResolver"; import { XMLParser } from "fast-xml-parser"; import TweetModel from "../../../data/TweetModel"; import ArchiveFileModel from "../../../data/ArchiveFileModel"; +import IaItemModel from "../../../data/IaItemModel"; /** * A "modern" Winamp skin. These skins use the `.wal` file extension and are free-form. @@ -85,7 +85,7 @@ export default class ModernSkinResolver /** * The skin's "item" at archive.org * @gqlField */ - async internet_archive_item(): Promise { + async internet_archive_item(): Promise { return super.internet_archive_item(); } diff --git a/packages/skin-database/api/graphql/resolvers/RootResolver.ts b/packages/skin-database/api/graphql/resolvers/RootResolver.ts index 66774a4e..cc822b47 100644 --- a/packages/skin-database/api/graphql/resolvers/RootResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/RootResolver.ts @@ -5,7 +5,6 @@ import SkinResolver from "../resolvers/SkinResolver"; import UserResolver from "../resolvers/UserResolver"; import SkinsConnection from "../SkinsConnection"; import TweetsConnection, { TweetsSortOption } from "../TweetsConnection"; -import InternetArchiveItemResolver from "./InternetArchiveItemResolver"; import * as Skins from "../../../data/skins"; import { ID, Int } from "grats"; @@ -86,12 +85,8 @@ class RootResolver extends MutationResolver { async fetch_internet_archive_item_by_identifier( { identifier }: { identifier: string }, { ctx } - ): Promise { - const iaItem = await IaItemModel.fromIdentifier(ctx, identifier); - if (iaItem == null) { - return null; - } - return new InternetArchiveItemResolver(iaItem); + ): Promise { + return IaItemModel.fromIdentifier(ctx, identifier); } /** diff --git a/packages/skin-database/api/graphql/schema.graphql b/packages/skin-database/api/graphql/schema.graphql index a1168baf..88e54f80 100644 --- a/packages/skin-database/api/graphql/schema.graphql +++ b/packages/skin-database/api/graphql/schema.graphql @@ -144,23 +144,23 @@ type DatabaseStatistics { type InternetArchiveItem { """The Internet Archive's unique identifier for this item""" - identifier: String + identifier: String @methodName(name: "getIdentifier") """ The date and time that we last scraped this item's metadata. **Note:** This field is temporary and will be removed in the future. The date format is just what we get from the database, and it's ambiguous. """ - last_metadata_scrape_date_UNSTABLE: String + last_metadata_scrape_date_UNSTABLE: String @methodName(name: "getMetadataTimestamp") """URL to get the Internet Archive's metadata for this item in JSON form.""" - metadata_url: String + metadata_url: String @methodName(name: "getMetadataUrl") """ - Our cached version of the metadata avaliable at \`metadata_url\` (above) + Our cached version of the metadata available at \`metadata_url\` (above) """ - raw_metadata_json: String + raw_metadata_json: String @methodName(name: "getMetadataJSON") """The skin that this item contains""" skin: Skin """The URL where this item can be viewed on the Internet Archive""" - url: String + url: String @methodName(name: "getUrl") } """ @@ -365,7 +365,7 @@ interface Skin { readme_text: String @deprecated(reason: "Needed for migration") """ Times that the skin has been reviewed either on the Museum's Tinder-style - reivew page, or via the Discord bot. + review page, or via the Discord bot. """ reviews: [Review] screenshot_url: String diff --git a/packages/skin-database/data/IaItemModel.ts b/packages/skin-database/data/IaItemModel.ts index 41b277f4..532e11b2 100644 --- a/packages/skin-database/data/IaItemModel.ts +++ b/packages/skin-database/data/IaItemModel.ts @@ -4,6 +4,8 @@ import SkinModel from "./SkinModel"; import DataLoader from "dataloader"; import { knex } from "../db"; import { fetchMetadata, fetchTasks } from "../services/internetArchive"; +import { ISkin } from "../api/graphql/resolvers/CommonSkinResolver"; +import SkinResolver from "../api/graphql/resolvers/SkinResolver"; const IA_URL = /^(https:\/\/)?archive.org\/details\/([^/]+)\/?/; @@ -11,6 +13,7 @@ export type IaItemDebugData = { row: IaItemRow; }; +/** @gqlType InternetArchiveItem */ export default class IaItemModel { constructor(readonly ctx: UserContext, readonly row: IaItemRow) {} @@ -53,22 +56,52 @@ export default class IaItemModel { return skin; } + /** + * The skin that this item contains + * @gqlField + */ + async skin(): Promise { + const skin = await this.getSkin(); + if (skin == null) { + return null; + } + return SkinResolver.fromModel(skin); + } + getMd5(): string { return this.row.skin_md5; } + /** + * The URL where this item can be viewed on the Internet Archive + * @gqlField url + */ getUrl(): string { return `https://archive.org/details/${this.getIdentifier()}`; } + /** + * URL to get the Internet Archive's metadata for this item in JSON form. + * @gqlField metadata_url + */ getMetadataUrl(): string { return `https://archive.org/metadata/${this.getIdentifier()}`; } + /** + * The date and time that we last scraped this item's metadata. + * **Note:** This field is temporary and will be removed in the future. + * The date format is just what we get from the database, and it's ambiguous. + * @gqlField last_metadata_scrape_date_UNSTABLE + */ getMetadataTimestamp(): string | null { return this.row.metadata_timestamp; } + /** + * The Internet Archive's unique identifier for this item + * @gqlField identifier + */ getIdentifier(): string { const { identifier } = this.row; if (identifier == null) { @@ -79,6 +112,10 @@ export default class IaItemModel { return identifier; } + /** + * Our cached version of the metadata available at \`metadata_url\` (above) + * @gqlField raw_metadata_json + */ getMetadataJSON(): string | null { return this.row.metadata; }