diff --git a/packages/skin-database/addSkin.ts b/packages/skin-database/addSkin.ts index 1d86320e..bfcc8b51 100644 --- a/packages/skin-database/addSkin.ts +++ b/packages/skin-database/addSkin.ts @@ -31,19 +31,19 @@ export async function addSkinFromBuffer( const ctx = new UserContext(); const md5 = md5Buffer(buffer); if (await SkinModel.exists(ctx, md5)) { - console.log("Skin found.") + console.log("Skin found."); return { md5, status: "FOUND" }; } // Note: This will thrown on invalid skins. - console.log("Getting zip...") + console.log("Getting zip..."); const zip = await JSZip.loadAsync(buffer); - console.log("Getting skin type...") + console.log("Getting skin type..."); const skinType = await getSkinType(zip); switch (skinType) { case "CLASSIC": - console.log("Adding classic skin...") + console.log("Adding classic skin..."); return addClassicSkinFromBuffer(ctx, buffer, md5, filePath, uploader); case "MODERN": return addModernSkinFromBuffer(ctx, buffer, md5, filePath, uploader); @@ -57,13 +57,13 @@ async function addModernSkinFromBuffer( filePath: string, uploader: string ): Promise { - console.log("Write temporarty file.") + console.log("Write temporarty file."); const tempFile = temp.path({ suffix: ".wal" }); fs.writeFileSync(tempFile, buffer); - console.log("Put skin to S3.") + console.log("Put skin to S3."); await S3.putSkin(md5, buffer, "wal"); - console.log("Add skin to DB") + console.log("Add skin to DB"); await Skins.addSkin({ ctx, md5, diff --git a/packages/skin-database/api/__tests__/graphql.test.ts b/packages/skin-database/api/__tests__/graphql.test.ts index 6904ad9e..d50419e2 100644 --- a/packages/skin-database/api/__tests__/graphql.test.ts +++ b/packages/skin-database/api/__tests__/graphql.test.ts @@ -46,7 +46,7 @@ async function graphQLRequest(query: string, variables?: any) { if (body.errors && body.errors.length) { for (const err of body.errors) { console.warn(err.message); - console.warn('Stack', err.stack) + console.warn("Stack", err.stack); } } @@ -55,35 +55,31 @@ async function graphQLRequest(query: string, variables?: any) { test(".node", async () => { const { data } = await graphQLRequest(gql` - query { - skins(first: 1) { - nodes { - id + query { + skins(first: 1) { + nodes { + id + md5 + } + } + } + `); + const skin = data.skins.nodes[0]; + expect(skin.id).toEqual("U2tpbl9fYV9mYWtlX21kNQ=="); + + const { data: data2 } = await graphQLRequest( + gql` + query MyQuery($id: ID!) { + node(id: $id) { + ... on Skin { md5 } } } - `); - const skin = data.skins.nodes[0]; - expect(skin.id).toEqual("U2tpbl9fYV9mYWtlX21kNQ=="); - - const { data: data2 } = await graphQLRequest(gql` - query MyQuery($id: ID!) { - node(id: $id) { - ... on Skin { - md5 - } - } - - - - } -`, { id: skin.id }); - expect( - - - - data2.node).toEqual({ md5: skin.md5 }) + `, + { id: skin.id } + ); + expect(data2.node).toEqual({ md5: skin.md5 }); }); describe(".me", () => { diff --git a/packages/skin-database/api/graphql/index.ts b/packages/skin-database/api/graphql/index.ts index 303efbe8..0b546cb6 100644 --- a/packages/skin-database/api/graphql/index.ts +++ b/packages/skin-database/api/graphql/index.ts @@ -17,7 +17,7 @@ function getQueryNameFromDocument(document) { (def) => def.kind === "OperationDefinition" ); if (!operationDefinition) { - return null + return null; } return operationDefinition.name?.value; } diff --git a/packages/skin-database/api/graphql/resolvers/NodeResolver.ts b/packages/skin-database/api/graphql/resolvers/NodeResolver.ts index adf4f3f4..b3055334 100644 --- a/packages/skin-database/api/graphql/resolvers/NodeResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/NodeResolver.ts @@ -1,14 +1,14 @@ export interface NodeResolver { - id({ id }): Promise - __typename: String -}; + id({ id }): Promise; + __typename: string; +} export function toId(graphqlType: string, id: string) { - return Buffer.from(`${graphqlType}__${id}`).toString('base64') + return Buffer.from(`${graphqlType}__${id}`).toString("base64"); } -export function fromId(base64Id: string): { graphqlType: string, id: string } { - const decoded = Buffer.from(base64Id, 'base64').toString('ascii') - const [graphqlType, id] = decoded.split("__") - return { graphqlType, id } +export function fromId(base64Id: string): { graphqlType: string; id: string } { + const decoded = Buffer.from(base64Id, "base64").toString("ascii"); + const [graphqlType, id] = decoded.split("__"); + return { graphqlType, id }; } diff --git a/packages/skin-database/api/graphql/resolvers/RootResolver.ts b/packages/skin-database/api/graphql/resolvers/RootResolver.ts index e704e4d6..d212f966 100644 --- a/packages/skin-database/api/graphql/resolvers/RootResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/RootResolver.ts @@ -23,7 +23,7 @@ const index = client.initIndex("Skins"); class RootResolver extends MutationResolver { async node({ id }, { ctx }) { - const { graphqlType, id: localId } = fromId(id) + const { graphqlType, id: localId } = fromId(id); // TODO Use typeResolver switch (graphqlType) { case "Skin": { @@ -128,7 +128,7 @@ class RootResolver extends MutationResolver { const skinModel = await SkinModel.fromMd5(ctx, skin_md5); const skin = skinModel == null ? null : new SkinResolver(skinModel); // Most of the time when a skin fails to process, it's due to some infa - // issue on our side, and we can recover. For now, we'll always tell the user + // issue on our side, and we can recover. For now, we'll always tell the user // That processing is just delayed. status = status === "ERRORED" ? "DELAYED" : status; return { id, skin, status, upload_md5: skin_md5 }; diff --git a/packages/skin-database/api/graphql/resolvers/SkinResolver.ts b/packages/skin-database/api/graphql/resolvers/SkinResolver.ts index 95395476..95df5eaf 100644 --- a/packages/skin-database/api/graphql/resolvers/SkinResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/SkinResolver.ts @@ -12,7 +12,7 @@ export default class SkinResolver implements NodeResolver { } __typename = "Skin"; async id() { - return toId("Skin", this.md5()) + return toId("Skin", this.md5()); } md5() { return this._model.getMd5(); diff --git a/packages/skin-database/cli.ts b/packages/skin-database/cli.ts index 159df88b..aae2610d 100755 --- a/packages/skin-database/cli.ts +++ b/packages/skin-database/cli.ts @@ -32,7 +32,6 @@ import { program } from "commander"; import * as config from "./config"; import { setHashesForSkin } from "./skinHash"; - async function withHandler( cb: (handler: DiscordEventHandler) => Promise ) { @@ -73,7 +72,7 @@ program .command("share") .description( "Share a skin on Twitter and Instagram. If no md5 is " + - "given, random approved skins are shared." + "given, random approved skins are shared." ) .argument("[md5]", "md5 of the skin to share") .option("-t, --twitter", "Share on Twitter") @@ -102,12 +101,12 @@ program .option( "--delete", "Delete a skin from the database, including its S3 files " + - "CloudFlare cache and seach index entries." + "CloudFlare cache and seach index entries." ) .option( "--delete-local", "Delete a skin from the database only, NOT including its S3 files " + - "CloudFlare cache and seach index entries." + "CloudFlare cache and seach index entries." ) .option("--index", "Update the seach index for a skin.") .option( @@ -116,30 +115,35 @@ program ) .option("--reject", 'Give a skin a "rejected" review.') .option("--metadata", "Push metadata to the archive.") - .action(async (md5, { delete: del, deleteLocal, index, refresh, reject, metadata }) => { - const ctx = new UserContext("CLI"); - if (del) { - await Skins.deleteSkin(md5); + .action( + async ( + md5, + { delete: del, deleteLocal, index, refresh, reject, metadata } + ) => { + const ctx = new UserContext("CLI"); + if (del) { + await Skins.deleteSkin(md5); + } + if (deleteLocal) { + await Skins.deleteLocalSkin(md5); + } + if (index) { + console.log(await Skins.updateSearchIndex(ctx, md5)); + } + if (refresh) { + const skin = await SkinModel.fromMd5Assert(ctx, md5); + await refreshSkins([skin], { noScreenshot: true }); + } + if (reject) { + await Skins.reject(ctx, md5); + } + if (metadata) { + const skin = await SkinModel.fromMd5Assert(ctx, md5); + await SyncToArchive.updateMetadata(skin); + console.log("Updated Metadata"); + } } - if (deleteLocal) { - await Skins.deleteLocalSkin(md5); - } - if (index) { - console.log(await Skins.updateSearchIndex(ctx, md5)); - } - if (refresh) { - const skin = await SkinModel.fromMd5Assert(ctx, md5); - await refreshSkins([skin], { noScreenshot: true }); - } - if (reject) { - await Skins.reject(ctx, md5); - } - if (metadata) { - const skin = await SkinModel.fromMd5Assert(ctx, md5); - await SyncToArchive.updateMetadata(skin); - console.log("Updated Metadata"); - } - }); + ); program .command("file") @@ -178,18 +182,18 @@ program .option( "--fetch-metadata ", "Fetch missing metadata for items from the Internet " + - "Archive. Currently it only fetches missing metadata. In the " + - "future it could refresh stale metadata." + "Archive. Currently it only fetches missing metadata. In the " + + "future it could refresh stale metadata." ) .option( "--fetch-items", "Seach the Internet Archive for items that we don't know about" + - "and add them to our database." + "and add them to our database." ) .option( "--update-metadata ", "Find items in our database that have incorrect or incomplete " + - "metadata, and update the Internet Archive" + "metadata, and update the Internet Archive" ) .option( "--upload-new", @@ -223,7 +227,7 @@ program .command("stats") .description( "Report information about skins in the database. " + - "Identical to `!stats` in Discord." + "Identical to `!stats` in Discord." ) .action(async () => { console.table([await Skins.getStats()]); @@ -269,17 +273,17 @@ program .option( "--likes", "Scrape @winampskins tweets for like and retweet counts, " + - "and update the database." + "and update the database." ) .option( "--milestones", "Check the most recent @winampskins tweets to see if they have " + - "passed a milestone. If so, notify the Discord channel." + "passed a milestone. If so, notify the Discord channel." ) .option( "--followers", "Check if @winampskins has passed a follower count milestone. " + - "If so, notify the Discord channel." + "If so, notify the Discord channel." ) .action(async ({ likes, milestones, followers }) => { if (likes) { @@ -307,7 +311,7 @@ program .option( "--upload-ia-screenshot ", "Upload a screenshot of a skin to the skin's Internet Archive itme. " + - "[[Warning!]] This might result in multiple screenshots on the item." + "[[Warning!]] This might result in multiple screenshots on the item." ) .option( "--upload-missing-screenshots", diff --git a/packages/skin-database/data/SkinModel.ts b/packages/skin-database/data/SkinModel.ts index b2da4904..2b20d6f4 100644 --- a/packages/skin-database/data/SkinModel.ts +++ b/packages/skin-database/data/SkinModel.ts @@ -27,7 +27,7 @@ export const IS_NOT_README = /(genex\.txt)|(genexinfo\.txt)|(gen_gslyrics\.txt)|(region\.txt)|(pledit\.txt)|(viscolor\.txt)|(winampmb\.txt)|("gen_ex help\.txt)|(mbinner\.txt)$/i; export default class SkinModel { - constructor(readonly ctx: UserContext, readonly row: SkinRow) { } + constructor(readonly ctx: UserContext, readonly row: SkinRow) {} static async fromMd5( ctx: UserContext, @@ -37,10 +37,7 @@ export default class SkinModel { return row == null ? null : new SkinModel(ctx, row); } - static clearMd5( - ctx: UserContext, - md5: string - ): void { + static clearMd5(ctx: UserContext, md5: string): void { getSkinLoader(ctx).clear(md5); } diff --git a/packages/skin-database/data/skins.ts b/packages/skin-database/data/skins.ts index afb6e007..f88f830f 100644 --- a/packages/skin-database/data/skins.ts +++ b/packages/skin-database/data/skins.ts @@ -32,7 +32,7 @@ export async function addSkin({ uploader, modern, }: { - ctx: UserContext, + ctx: UserContext; md5: string; filePath: string; uploader: string;