mirror of
https://github.com/captbaritone/webamp.git
synced 2026-08-01 14:33:38 +00:00
Move IaItem graphql fields to model
This commit is contained in:
parent
ace904f357
commit
67082a0441
7 changed files with 55 additions and 88 deletions
|
|
@ -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<InternetArchiveItemResolver | null> {
|
||||
internet_archive_item(): Promise<IaItemModel | null> {
|
||||
return super.internet_archive_item();
|
||||
}
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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<InternetArchiveItemResolver | null>;
|
||||
internet_archive_item(): Promise<IaItemModel | null>;
|
||||
|
||||
/**
|
||||
* 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<Array<ReviewResolver | null>>;
|
||||
|
|
@ -130,12 +130,8 @@ export default abstract class CommonSkinResolver {
|
|||
async archive_files(): Promise<Array<ArchiveFileModel | null>> {
|
||||
return this._model.getArchiveFiles();
|
||||
}
|
||||
async internet_archive_item(): Promise<InternetArchiveItemResolver | null> {
|
||||
const item = await this._model.getIaItem();
|
||||
if (item == null) {
|
||||
return null;
|
||||
}
|
||||
return new InternetArchiveItemResolver(item);
|
||||
async internet_archive_item(): Promise<IaItemModel | null> {
|
||||
return this._model.getIaItem();
|
||||
}
|
||||
|
||||
async reviews(): Promise<Array<ReviewResolver | 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<ISkin | null> {
|
||||
const skin = await this._model.getSkin();
|
||||
if (skin == null) {
|
||||
return null;
|
||||
}
|
||||
return SkinResolver.fromModel(skin);
|
||||
}
|
||||
}
|
||||
|
|
@ -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<InternetArchiveItemResolver | null> {
|
||||
async internet_archive_item(): Promise<IaItemModel | null> {
|
||||
return super.internet_archive_item();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<InternetArchiveItemResolver | null> {
|
||||
const iaItem = await IaItemModel.fromIdentifier(ctx, identifier);
|
||||
if (iaItem == null) {
|
||||
return null;
|
||||
}
|
||||
return new InternetArchiveItemResolver(iaItem);
|
||||
): Promise<IaItemModel | null> {
|
||||
return IaItemModel.fromIdentifier(ctx, identifier);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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<ISkin | null> {
|
||||
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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue