mirror of
https://github.com/captbaritone/webamp.git
synced 2026-01-24 02:36:00 +00:00
135 lines
2.5 KiB
JavaScript
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,
|
|
});
|
|
};
|