webamp/experiments/skin-database/graphql.js
Jordan Eldredge d09293c975 Fix lints
2019-11-30 13:42:53 -08:00

135 lines
2.5 KiB
JavaScript

const graphqlHTTP = require("express-graphql");
const { buildSchema } = require("graphql");
const Skins = require("./data/skins");
// Construct a schema, using GraphQL schema language
const schema = buildSchema(`
enum TweetStatus {
TWEETED
REJECTED
APPROVED
UNREVIEWED
}
type InternetArchiveItem {
url: String
skinFilename: String
}
type Skin {
md5: String!
canonicalFilename: String
filenames: [String]
emails: [String]
tweetUrl: String
skinUrl: String
screenshotUrl: String
averageColor: String
webampUrl: String
tweetStatus: TweetStatus
readmeText: String
internetArchiveItem: InternetArchiveItem
}
type Query {
skin(md5: String!): Skin
}
`);
class InternetArchiveItem {
constructor(md5) {
this._md5 = md5;
this._itemPromise = Skins.getInternetArchiveItem(md5);
}
async url() {
const item = await this._itemPromise;
if (item == null) {
return null;
}
return Skins.getInternetArchiveUrl(item.identifier);
}
async skinFilename() {
const item = await this._itemPromise;
if (item == null) {
return null;
}
return item.skinFileName;
}
}
class Skin {
constructor(md5) {
this._md5 = md5;
this._skinPromise = Skins.getSkinByMd5(this._md5);
}
md5() {
return this._md5;
}
async _get(getter) {
const skin = await this._skinPromise;
if (skin == null) {
return null;
}
return getter(skin);
}
async canonicalFilename() {
return this._get(skin => skin.canonicalFilename);
}
async filenames() {
return this._get(skin => skin.fileNames);
}
async emails() {
return this._get(skin => skin.emails);
}
async tweetUrl() {
return this._get(skin => skin.tweetUrl);
}
async skinUrl() {
return this._get(skin => skin.skinUrl);
}
async screenshotUrl() {
return this._get(skin => skin.screenshotUrl);
}
async webampUrl() {
return this._get(skin => skin.webampUrl);
}
async tweetStatus() {
return Skins.getStatus(this._md5);
}
async readmeText() {
return this._get(skin => skin.readmeText);
}
async averageColor() {
return this._get(skin => skin.averageColor);
}
internetArchiveItem() {
return new InternetArchiveItem(this._md5);
}
}
// The root provides a resolver function for each API endpoint
const root = {
skin: ({ md5 }) => {
return new Skin(md5);
},
};
exports.default = function() {
return graphqlHTTP({
schema: schema,
rootValue: root,
graphiql: true,
});
};