diff --git a/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts b/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts index a9ec75a9..9748e776 100644 --- a/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts @@ -1,39 +1,25 @@ -import CommonSkinResolver, { ISkin } from "./CommonSkinResolver"; +import { ISkin } from "./CommonSkinResolver"; import { NodeResolver, toId } from "./NodeResolver"; import ReviewResolver from "./ReviewResolver"; import path from "path"; import { ID, Int } from "grats"; -import TweetModel from "../../../data/TweetModel"; -import ArchiveFileModel from "../../../data/ArchiveFileModel"; -import IaItemModel from "../../../data/IaItemModel"; +import SkinModel from "../../../data/SkinModel"; /** * A classic Winamp skin * @gqlType ClassicSkin */ -export default class ClassicSkinResolver - extends CommonSkinResolver - implements NodeResolver, ISkin -{ +export default class ClassicSkinResolver implements NodeResolver, ISkin { + _model: SkinModel; __typename = "ClassicSkin"; - /** - * GraphQL ID of the skin - * @gqlField - * @killsParentOnException - */ + + md5(): string { + return this._model.getMd5(); + } + id(): ID { return toId(this.__typename, this.md5()); } - /** - * Filename of skin when uploaded to the Museum. Note: In some cases a skin - * has been uploaded under multiple names. Here we just pick one. - * @gqlField */ - async filename({ - normalize_extension = false, - }: { - /** If true, the the correct file extension (.wsz or .wal) will be . - Otherwise, the original user-uploaded file extension will be used. */ - normalize_extension?: boolean; - }): Promise { + async filename(normalize_extension?: boolean): Promise { const filename = await this._model.getFileName(); if (normalize_extension) { return path.parse(filename).name + ".wsz"; @@ -41,78 +27,21 @@ export default class ClassicSkinResolver return filename; } - /** - * MD5 hash of the skin's file - * @gqlField */ - md5(): string { - return super.md5(); - } - /** - * URL to download the skin - * @gqlField */ - download_url(): string { - return super.download_url(); - } - /** - * Has the skin been tweeted? - * @gqlField */ - tweeted(): Promise { - return super.tweeted(); - } - - /** - * List of @winampskins tweets that mentioned the skin. - * @gqlField */ - tweets(): Promise> { - return super.tweets(); - } - - /** - * List of files contained within the skin's .wsz archive - * @gqlField */ - archive_files(): Promise> { - return super.archive_files(); - } - - /** - * The skin's "item" at archive.org - * @gqlField */ - internet_archive_item(): Promise { - return super.internet_archive_item(); - } - /** - * URL of the skin on the Winamp Skin Museum - * @gqlField */ museum_url(): string { return this._model.getMuseumUrl(); } - /** - * URL of webamp.org with the skin loaded - * @gqlField */ webamp_url(): string { return this._model.getWebampUrl(); } - /** - * URL of a screenshot of the skin - * @gqlField */ async screenshot_url(): Promise { return this._model.getScreenshotUrl(); } - /** - * Text of the readme file extracted from the skin - * @gqlField */ readme_text(): Promise { return this._model.getReadme(); } - /** - * Has the skin been flagged as "not safe for wrok"? - * @gqlField */ nsfw(): Promise { return this._model.getIsNsfw(); } - /** - * String representation (rgb usually) of the skin's average color - * @gqlField */ average_color(): string { return this._model.getAverageColor(); } @@ -122,10 +51,7 @@ export default class ClassicSkinResolver has_media_library(): Promise { return this._model.hasMediaLibrary(); } - /** - * Times that the skin has been reviewed either on the Museum's Tinder-style - * reivew page, or via the Discord bot. - * @gqlField */ + async reviews(): Promise> { const reviews = await this._model.getReviews(); return reviews.map((row) => new ReviewResolver(row)); diff --git a/packages/skin-database/api/graphql/resolvers/CommonSkinResolver.ts b/packages/skin-database/api/graphql/resolvers/CommonSkinResolver.ts index ef3b951a..0e25785a 100644 --- a/packages/skin-database/api/graphql/resolvers/CommonSkinResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/CommonSkinResolver.ts @@ -13,19 +13,67 @@ import IaItemModel from "../../../data/IaItemModel"; */ export interface ISkin { __typename: string; - /** - * GraphQL ID of the skin - * @gqlField - * @killsParentOnException - */ + _model: SkinModel; id(): ID; + filename(normalize_extension: boolean): Promise; + md5(): string; + museum_url(): string | null; + webamp_url(): string | null; + screenshot_url(): Promise; + readme_text(): Promise; + nsfw(): Promise; + average_color(): string | null; +} - /** - * Filename of skin when uploaded to the Museum. Note: In some cases a skin - * has been uploaded under multiple names. Here we just pick one. - * @gqlField - */ - filename({ +/** + * URL of webamp.org with the skin loaded + * @gqlField + */ +export function webamp_url(skin: ISkin): string | null { + return skin.webamp_url(); +} + +/** + * URL of a screenshot of the skin + * @gqlField + */ +export function screenshot_url(skin: ISkin): Promise { + return skin.screenshot_url(); +} + +/** + * Text of the readme file extracted from the skin + * @gqlField + */ +export function readme_text(skin: ISkin): Promise { + return skin.readme_text(); +} + +/** + * Has the skin been flagged as "not safe for work"?" + * @gqlField + */ +export function nsfw(skin: ISkin): Promise { + return skin.nsfw(); +} + +/** + * GraphQL ID of the skin + * @gqlField + * @killsParentOnException + */ +export function id(skin: ISkin): ID { + return skin.id(); +} + +/** + * Filename of skin when uploaded to the Museum. Note: In some cases a skin + * has been uploaded under multiple names. Here we just pick one. + * @gqlField + */ +export function filename( + skin: ISkin, + { normalize_extension = false, }: { /** @@ -33,109 +81,86 @@ export interface ISkin { * Otherwise, the original user-uploaded file extension will be used. */ normalize_extension?: boolean; - }): Promise; - - /** - * MD5 hash of the skin's file - * @gqlField - */ - md5(): string; - - /** - * URL to download the skin - * @gqlField - */ - download_url(): string; - - /** - * Has the skin been tweeted? - * @gqlField - */ - tweeted(): Promise; - - /** - * List of @winampskins tweets that mentioned the skin. - * @gqlField - */ - tweets(): Promise>; - - /** - * List of files contained within the skin's .wsz archive - * @gqlField - */ - archive_files(): Promise>; - - /** - * The skin's "item" at archive.org - * @gqlField - */ - internet_archive_item(): Promise; - - /** - * Times that the skin has been reviewed either on the Museum's Tinder-style - * review page, or via the Discord bot. - * @gqlField - */ - reviews(): Promise>; - - /** - * @gqlField - * @deprecated Needed for migration - */ - museum_url(): string | null; - - /** - * @gqlField - * @deprecated Needed for migration - */ - webamp_url(): string | null; - - /** @gqlField */ - screenshot_url(): Promise; - - /** - * @gqlField - * @deprecated Needed for migration */ - readme_text(): Promise; - - /** - * @gqlField - * @deprecated Needed for migration */ - nsfw(): Promise; - - /** - * @gqlField - * @deprecated Needed for migration */ - average_color(): string | null; + } +): Promise { + return skin.filename(normalize_extension); } -export default abstract class CommonSkinResolver { - _model: SkinModel; - constructor(model: SkinModel) { - this._model = model; - } - md5(): string { - return this._model.getMd5(); - } - - download_url(): string { - return this._model.getSkinUrl(); - } - tweeted(): Promise { - return this._model.tweeted(); - } - async tweets(): Promise> { - return this._model.getTweets(); - } - async archive_files(): Promise> { - return this._model.getArchiveFiles(); - } - async internet_archive_item(): Promise { - return this._model.getIaItem(); - } - - async reviews(): Promise> { - const reviews = await this._model.getReviews(); - return reviews.map((row) => new ReviewResolver(row)); - } +/** + * URL to download the skin + * @gqlField + */ +export function download_url(skin: ISkin): string { + return skin._model.getSkinUrl(); +} + +/** + * Has the skin been tweeted? + * @gqlField + */ +export function tweeted(skin: ISkin): Promise { + return skin._model.tweeted(); +} + +/** + * List of @winampskins tweets that mentioned the skin. + * @gqlField + */ +export function tweets(skin: ISkin): Promise> { + return skin._model.getTweets(); +} + +/** + * Times that the skin has been reviewed either on the Museum's Tinder-style + * review page, or via the Discord bot. + * @gqlField + */ +export async function reviews( + skin: ISkin +): Promise> { + const reviews = await skin._model.getReviews(); + return reviews.map((row) => new ReviewResolver(row)); +} + +/** + * List of files contained within the skin's .wsz archive + * @gqlField + */ +export function archive_files( + skin: ISkin +): Promise> { + return skin._model.getArchiveFiles(); +} +/** + * The skin's "item" at archive.org + * @gqlField + */ +export function internet_archive_item( + skin: ISkin +): Promise { + return skin._model.getIaItem(); +} + +/** + * URL of the skin on the Winamp Skin Museum + * @gqlField + */ +export function museum_url(skin: ISkin): string | null { + return skin.museum_url(); +} + +/** + * String representation (rgb usually) of the skin's average color + * @gqlField + */ +export function average_color(skin: ISkin): string | null { + return skin.average_color(); +} + +/** + * MD5 hash of the skin's file + * @gqlField + */ +export function md5(skin: ISkin): string { + return skin.md5(); } diff --git a/packages/skin-database/api/graphql/resolvers/ModernSkinResolver.ts b/packages/skin-database/api/graphql/resolvers/ModernSkinResolver.ts index a4da3ca4..641adb82 100644 --- a/packages/skin-database/api/graphql/resolvers/ModernSkinResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/ModernSkinResolver.ts @@ -1,13 +1,9 @@ import SkinModel from "../../../data/SkinModel"; -import CommonSkinResolver, { ISkin } from "./CommonSkinResolver"; +import { ISkin } from "./CommonSkinResolver"; import { NodeResolver, toId } from "./NodeResolver"; import path from "path"; import { ID } from "grats"; -import ReviewResolver from "./ReviewResolver"; 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. @@ -15,23 +11,14 @@ import IaItemModel from "../../../data/IaItemModel"; * Most functionality in the Winamp Skin Museum is centered around "classic" skins, * which are currently called just `Skin` in this schema. * @gqlType ModernSkin */ -export default class ModernSkinResolver - extends CommonSkinResolver - implements NodeResolver, ISkin -{ +export default class ModernSkinResolver implements NodeResolver, ISkin { _model: SkinModel; __typename = "ModernSkin"; - /** - * Filename of skin when uploaded to the Museum. Note: In some cases a skin - * has been uploaded under multiple names. Here we just pick one. - * @gqlField */ - async filename({ - normalize_extension = false, - }: { - /** If true, the the correct file extension (.wsz or .wal) will be . - Otherwise, the original user-uploaded file extension will be used. */ - normalize_extension?: boolean; - }): Promise { + + md5(): string { + return this._model.getMd5(); + } + async filename(normalize_extension: boolean): Promise { const filename = await this._model.getFileName(); if (normalize_extension) { return path.parse(filename).name + ".wal"; @@ -41,76 +28,17 @@ export default class ModernSkinResolver /* TODO: Get all of these from the parent class/interface */ - /** - * GraphQL ID of the skin - * @gqlField - * @killsParentOnException */ id(): ID { return toId(this.__typename, this.md5()); } - /** - * MD5 hash of the skin's file - * @gqlField */ - md5(): string { - return super.md5(); - } - - /** - * URL to download the skin - * @gqlField */ - download_url(): string { - return super.download_url(); - } - /** - * Has the skin been tweeted? - * @gqlField */ - tweeted(): Promise { - return super.tweeted(); - } - /** - * List of @winampskins tweets that mentioned the skin. - * @gqlField */ - async tweets(): Promise> { - return super.tweets(); - } - - /** - * List of files contained within the skin's .wsz archive - * @gqlField */ - async archive_files(): Promise> { - return super.archive_files(); - } - - /** - * The skin's "item" at archive.org - * @gqlField */ - async internet_archive_item(): Promise { - return super.internet_archive_item(); - } - - /** - * Times that the skin has been reviewed either on the Museum's Tinder-style - * reivew page, or via the Discord bot. - * @gqlField */ - async reviews(): Promise> { - return super.reviews(); - } - - /** - * @gqlField - * @deprecated Needed for migration */ museum_url(): string | null { return null; } - /** - * @gqlField - * @deprecated Needed for migration */ webamp_url(): string | null { return null; } - /** @gqlField */ async screenshot_url(): Promise { const archiveFiles = await this._model.getArchiveFiles(); const skinXml = archiveFiles.find((f) => @@ -150,21 +78,12 @@ export default class ModernSkinResolver return screenshotFile.getUrl(); } - /** - * @gqlField - * @deprecated Needed for migration */ async readme_text(): Promise { return null; } - /** - * @gqlField - * @deprecated Needed for migration */ async nsfw(): Promise { return null; } - /** - * @gqlField - * @deprecated Needed for migration */ average_color(): string | null { return null; } diff --git a/packages/skin-database/api/graphql/schema.graphql b/packages/skin-database/api/graphql/schema.graphql index 88e54f80..35c994a9 100644 --- a/packages/skin-database/api/graphql/schema.graphql +++ b/packages/skin-database/api/graphql/schema.graphql @@ -41,11 +41,11 @@ type ArchiveFile { """A classic Winamp skin""" type ClassicSkin implements Node & Skin { """List of files contained within the skin's .wsz archive""" - archive_files: [ArchiveFile] + archive_files: [ArchiveFile] @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "archive_files") """String representation (rgb usually) of the skin's average color""" - average_color: String + average_color: String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "average_color") """URL to download the skin""" - download_url: String + download_url: String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "download_url") """ Filename of skin when uploaded to the Museum. Note: In some cases a skin has been uploaded under multiple names. Here we just pick one. @@ -56,41 +56,43 @@ type ClassicSkin implements Node & Skin { Otherwise, the original user-uploaded file extension will be used. """ normalize_extension: Boolean = false - ): String + ): String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "filename") """Does the skin include sprite sheets for the media library?""" has_media_library: Boolean """GraphQL ID of the skin""" - id: ID! + id: ID! @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "id") """The skin's "item" at archive.org""" - internet_archive_item: InternetArchiveItem + internet_archive_item: InternetArchiveItem @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "internet_archive_item") """ The date on which this skin was last updated in the Algolia search index. Given in simplified extended ISO format (ISO 8601). """ last_algolia_index_update_date: String """MD5 hash of the skin's file""" - md5: String + md5: String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "md5") """URL of the skin on the Winamp Skin Museum""" - museum_url: String - """Has the skin been flagged as "not safe for wrok"?""" - nsfw: Boolean + museum_url: String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "museum_url") + """ + Has the skin been flagged as "not safe for work"?" + """ + nsfw: Boolean @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "nsfw") """Text of the readme file extracted from the skin""" - readme_text: String + readme_text: String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "readme_text") """ 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] + reviews: [Review] @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "reviews") """URL of a screenshot of the skin""" - screenshot_url: String + screenshot_url: String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "screenshot_url") """The number of transparent pixels rendered by the skin.""" transparent_pixels: Int """Has the skin been tweeted?""" - tweeted: Boolean + tweeted: Boolean @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "tweeted") """List of @winampskins tweets that mentioned the skin.""" - tweets: [Tweet] + tweets: [Tweet] @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "tweets") """URL of webamp.org with the skin loaded""" - webamp_url: String + webamp_url: String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "webamp_url") } """Statistics about the contents of the Museum's database.""" @@ -116,13 +118,9 @@ type DatabaseStatistics { **Note:** Generally skins that have been marked NSFW are also marked as rejected. """ rejected_skins_count: Int - """ - The number of skins that have been approved for tweeting, but not yet tweeted. - """ + """The number of skins that have been approved for tweeting, but not yet tweeted.""" tweetable_skins_count: Int - """ - The number of skins in the Museum that have been tweeted by @winampskins - """ + """The number of skins in the Museum that have been tweeted by @winampskins""" tweeted_skins_count: Int """The total number of classic skins in the Museum's database""" unique_classic_skins_count: Int @@ -136,9 +134,7 @@ type DatabaseStatistics { pipeline gets stuck. """ uploads_pending_processing_count: Int - """ - Number of skins that have been uploaded to the Museum via the web interface. - """ + """Number of skins that have been uploaded to the Museum via the web interface.""" web_uploads_count: Int } @@ -153,9 +149,7 @@ type InternetArchiveItem { 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 @methodName(name: "getMetadataUrl") - """ - Our cached version of the metadata available at \`metadata_url\` (above) - """ + """Our cached version of the metadata available at \`metadata_url\` (above)""" raw_metadata_json: String @methodName(name: "getMetadataJSON") """The skin that this item contains""" skin: Skin @@ -171,10 +165,11 @@ which are currently called just `Skin` in this schema. """ type ModernSkin implements Node & Skin { """List of files contained within the skin's .wsz archive""" - archive_files: [ArchiveFile] - average_color: String @deprecated(reason: "Needed for migration") + archive_files: [ArchiveFile] @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "archive_files") + """String representation (rgb usually) of the skin's average color""" + average_color: String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "average_color") """URL to download the skin""" - download_url: String + download_url: String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "download_url") """ Filename of skin when uploaded to the Museum. Note: In some cases a skin has been uploaded under multiple names. Here we just pick one. @@ -185,27 +180,34 @@ type ModernSkin implements Node & Skin { Otherwise, the original user-uploaded file extension will be used. """ normalize_extension: Boolean = false - ): String + ): String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "filename") """GraphQL ID of the skin""" - id: ID! + id: ID! @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "id") """The skin's "item" at archive.org""" - internet_archive_item: InternetArchiveItem + internet_archive_item: InternetArchiveItem @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "internet_archive_item") """MD5 hash of the skin's file""" - md5: String - museum_url: String @deprecated(reason: "Needed for migration") - nsfw: Boolean @deprecated(reason: "Needed for migration") - readme_text: String @deprecated(reason: "Needed for migration") + md5: String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "md5") + """URL of the skin on the Winamp Skin Museum""" + museum_url: String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "museum_url") + """ + Has the skin been flagged as "not safe for work"?" + """ + nsfw: Boolean @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "nsfw") + """Text of the readme file extracted from the skin""" + readme_text: String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "readme_text") """ 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 + reviews: [Review] @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "reviews") + """URL of a screenshot of the skin""" + screenshot_url: String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "screenshot_url") """Has the skin been tweeted?""" - tweeted: Boolean + tweeted: Boolean @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "tweeted") """List of @winampskins tweets that mentioned the skin.""" - tweets: [Tweet] - webamp_url: String @deprecated(reason: "Needed for migration") + tweets: [Tweet] @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "tweets") + """URL of webamp.org with the skin loaded""" + webamp_url: String @exported(filename: "../../../../packages/skin-database/dist/api/graphql/resolvers/CommonSkinResolver.js", functionName: "webamp_url") } """A collection of "modern" Winamp skins""" @@ -241,9 +243,7 @@ type Mutation { in. """ request_nsfw_review_for_skin(md5: String!): Boolean - """ - Send a message to the admin of the site. Currently this appears in Discord. - """ + """Send a message to the admin of the site. Currently this appears in Discord.""" send_feedback(email: String, message: String!, url: String): Boolean """Mutations for the upload flow""" upload: UploadMutations @@ -340,7 +340,8 @@ A Winamp skin. Could be modern or classic. interface Skin { """List of files contained within the skin's .wsz archive""" archive_files: [ArchiveFile] - average_color: String @deprecated(reason: "Needed for migration") + """String representation (rgb usually) of the skin's average color""" + average_color: String """URL to download the skin""" download_url: String """ @@ -360,20 +361,46 @@ interface Skin { internet_archive_item: InternetArchiveItem """MD5 hash of the skin's file""" md5: String - museum_url: String @deprecated(reason: "Needed for migration") - nsfw: Boolean @deprecated(reason: "Needed for migration") - readme_text: String @deprecated(reason: "Needed for migration") + """URL of the skin on the Winamp Skin Museum""" + museum_url: String + """ + Has the skin been flagged as "not safe for work"?" + """ + nsfw: Boolean + """Text of the readme file extracted from the skin""" + readme_text: String """ Times that the skin has been reviewed either on the Museum's Tinder-style review page, or via the Discord bot. """ reviews: [Review] + """URL of a screenshot of the skin""" screenshot_url: String """Has the skin been tweeted?""" tweeted: Boolean """List of @winampskins tweets that mentioned the skin.""" tweets: [Tweet] - webamp_url: String @deprecated(reason: "Needed for migration") + """URL of webamp.org with the skin loaded""" + webamp_url: String +} + +"""A collection of classic Winamp skins""" +type SkinsConnection { + """The total number of skins matching the filter""" + count: Int + """The list of skins""" + nodes: [Skin] +} + +enum SkinsFilterOption { + APPROVED + NSFW + REJECTED + TWEETED +} + +enum SkinsSortOption { + MUSEUM } """Information about an attempt to upload a skin to the Museum.""" @@ -403,34 +430,11 @@ enum SkinUploadStatus { URL_REQUESTED } -"""A collection of classic Winamp skins""" -type SkinsConnection { - """The total number of skins matching the filter""" - count: Int - """The list of skins""" - nodes: [Skin] -} - -enum SkinsFilterOption { - APPROVED - NSFW - REJECTED - TWEETED -} - -enum SkinsSortOption { - MUSEUM -} - """A tweet made by @winampskins mentioning a Winamp skin""" type Tweet { - """ - Number of likes the tweet has received. Updated nightly. (Note: Recent likes on older tweets may not be reflected here) - """ + """Number of likes the tweet has received. Updated nightly. (Note: Recent likes on older tweets may not be reflected here)""" likes: Int @methodName(name: "getLikes") - """ - Number of retweets the tweet has received. Updated nightly. (Note: Recent retweets on older tweets may not be reflected here) - """ + """Number of retweets the tweet has received. Updated nightly. (Note: Recent retweets on older tweets may not be reflected here)""" retweets: Int @methodName(name: "getRetweets") """The skin featured in this Tweet""" skin: Skin @@ -494,4 +498,4 @@ input UploadUrlRequest { type User { username: String -} \ No newline at end of file +} diff --git a/packages/skin-database/package.json b/packages/skin-database/package.json index 4c49ea22..13369ded 100644 --- a/packages/skin-database/package.json +++ b/packages/skin-database/package.json @@ -29,7 +29,7 @@ "express-sitemap-xml": "^2.0.0", "fast-xml-parser": "^4.2.2", "graphql": "14.7.0", - "grats": "^0.0.0-main-8de1c8ac", + "grats": "0.0.0-main-b47472ff", "imagemin": "^7.0.0", "imagemin-optipng": "^7.0.0", "knex": "^0.21.1", diff --git a/yarn.lock b/yarn.lock index 6a9ca466..6e0c8a4a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14783,10 +14783,10 @@ graphql@14.7.0, graphql@15.3.0, graphql@^16.6.0: resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.3.0.tgz#3ad2b0caab0d110e3be4a5a9b2aa281e362b5278" integrity sha512-GTCJtzJmkFLWRfFJuoo9RWWa/FfamUHgiFosxi/X1Ani4AVWbeyBenZTNX6dM+7WSbbFfTo/25eh0LLkwHMw2w== -grats@^0.0.0-main-8de1c8ac: - version "0.0.0-main-8de1c8ac" - resolved "https://registry.yarnpkg.com/grats/-/grats-0.0.0-main-8de1c8ac.tgz#ddd0eb60c290951e76307028143b24a3f8608ea4" - integrity sha512-lP/CpAU/6qE/Cn7+MUPbQT100kzuxh5rJ2fAiDbtAzxvG3MFhtXySy8Cz6sFt0eBjHv77a2G3J3Ua6+xoM6GnA== +grats@0.0.0-main-b47472ff: + version "0.0.0-main-b47472ff" + resolved "https://registry.yarnpkg.com/grats/-/grats-0.0.0-main-b47472ff.tgz#ca8d7f9bad66fcf7011090c681207105c4542f13" + integrity sha512-k+O8Jh3rqhCp80lZcYrXY5oWEf4FzwAtvLuTQtFskKPU8y6V/mlzL6per643uFSnisv7lmFrxY+8aBIbUDEFfg== dependencies: "@graphql-tools/utils" "^9.2.1" commander "^10.0.0"