2020-04-22 13:03:32 -07:00
|
|
|
const { gql } = require("apollo-server");
|
2020-04-22 11:51:36 -07:00
|
|
|
|
|
|
|
const connectToDb = require("./db");
|
2020-04-23 01:08:00 -07:00
|
|
|
const loaders = require("./loaders");
|
2020-04-22 11:51:36 -07:00
|
|
|
|
|
|
|
const typeDefs = gql`
|
2020-04-23 01:08:00 -07:00
|
|
|
enum LayerImageSize {
|
|
|
|
SIZE_600
|
|
|
|
SIZE_300
|
|
|
|
SIZE_150
|
|
|
|
}
|
|
|
|
|
2020-04-22 11:51:36 -07:00
|
|
|
type Item {
|
|
|
|
id: ID!
|
|
|
|
name: String!
|
2020-04-22 14:55:12 -07:00
|
|
|
thumbnailUrl: String!
|
2020-04-23 01:08:00 -07:00
|
|
|
appearanceOn(speciesId: ID!, colorId: ID!): ItemAppearance
|
|
|
|
}
|
|
|
|
|
|
|
|
type ItemAppearance {
|
|
|
|
layers: [ItemAppearanceLayer!]!
|
|
|
|
}
|
|
|
|
|
|
|
|
type ItemAppearanceLayer {
|
|
|
|
id: ID!
|
|
|
|
zone: Zone!
|
|
|
|
imageUrl(size: LayerImageSize): String
|
|
|
|
}
|
|
|
|
|
|
|
|
type Zone {
|
|
|
|
id: ID!
|
|
|
|
depth: Int!
|
|
|
|
label: String!
|
2020-04-22 11:51:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
type Query {
|
|
|
|
items(ids: [ID!]!): [Item!]!
|
|
|
|
}
|
|
|
|
`;
|
|
|
|
|
|
|
|
const resolvers = {
|
|
|
|
Item: {
|
2020-04-22 12:00:52 -07:00
|
|
|
name: async (item, _, { itemTranslationLoader }) => {
|
|
|
|
const translation = await itemTranslationLoader.load(item.id);
|
2020-04-22 11:51:36 -07:00
|
|
|
return translation.name;
|
|
|
|
},
|
2020-04-23 01:08:00 -07:00
|
|
|
appearanceOn: (item, { speciesId, colorId }) => ({
|
|
|
|
itemId: item.id,
|
|
|
|
speciesId,
|
|
|
|
colorId,
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
ItemAppearance: {
|
|
|
|
layers: async (ia, _, { petTypeLoader, swfAssetLoader }) => {
|
|
|
|
const petType = await petTypeLoader.load({
|
|
|
|
speciesId: ia.speciesId,
|
|
|
|
colorId: ia.colorId,
|
|
|
|
});
|
|
|
|
const swfAssets = await swfAssetLoader.load({
|
|
|
|
itemId: ia.itemId,
|
|
|
|
bodyId: petType.bodyId,
|
|
|
|
});
|
|
|
|
return swfAssets;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ItemAppearanceLayer: {
|
|
|
|
zone: async (layer, _, { zoneLoader }) => {
|
|
|
|
const zone = await zoneLoader.load(layer.zoneId);
|
|
|
|
return zone;
|
|
|
|
},
|
|
|
|
imageUrl: (layer, { size }) => {
|
|
|
|
if (!layer.hasImage) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
const sizeNum = size.split("_")[1];
|
|
|
|
|
|
|
|
const rid = layer.remoteId;
|
|
|
|
const paddedId = rid.padStart(12, "0");
|
|
|
|
const rid1 = paddedId.slice(0, 3);
|
|
|
|
const rid2 = paddedId.slice(3, 6);
|
|
|
|
const rid3 = paddedId.slice(6, 9);
|
|
|
|
const time = Number(new Date(layer.convertedAt));
|
|
|
|
|
|
|
|
return `https://impress-asset-images.s3.amazonaws.com/object/${rid1}/${rid2}/${rid3}/${rid}/${sizeNum}x${sizeNum}.png?${time}`;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Zone: {
|
|
|
|
label: async (zone, _, { zoneTranslationLoader }) => {
|
|
|
|
const zoneTranslation = await zoneTranslationLoader.load(zone.id);
|
|
|
|
return zoneTranslation.label;
|
|
|
|
},
|
2020-04-22 11:51:36 -07:00
|
|
|
},
|
|
|
|
Query: {
|
2020-04-23 01:08:00 -07:00
|
|
|
items: async (_, { ids }, { db }) => {
|
|
|
|
const items = await loaders.loadItems(db, ids);
|
|
|
|
return items;
|
|
|
|
},
|
2020-04-22 11:51:36 -07:00
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2020-04-22 13:03:32 -07:00
|
|
|
const config = {
|
2020-04-22 11:51:36 -07:00
|
|
|
typeDefs,
|
|
|
|
resolvers,
|
|
|
|
context: async () => {
|
|
|
|
const db = await connectToDb();
|
2020-04-22 12:00:52 -07:00
|
|
|
return {
|
|
|
|
db,
|
2020-04-23 01:08:00 -07:00
|
|
|
itemTranslationLoader: loaders.buildItemTranslationLoader(db),
|
|
|
|
petTypeLoader: loaders.buildPetTypeLoader(db),
|
|
|
|
swfAssetLoader: loaders.buildSwfAssetLoader(db),
|
|
|
|
zoneLoader: loaders.buildZoneLoader(db),
|
|
|
|
zoneTranslationLoader: loaders.buildZoneTranslationLoader(db),
|
2020-04-22 12:00:52 -07:00
|
|
|
};
|
2020-04-22 11:51:36 -07:00
|
|
|
},
|
2020-04-23 01:09:17 -07:00
|
|
|
|
|
|
|
// Enable Playground in production :)
|
|
|
|
introspection: true,
|
2020-04-23 01:12:52 -07:00
|
|
|
playground: {
|
|
|
|
endpoint: "/api/graphql",
|
|
|
|
},
|
2020-04-22 13:03:32 -07:00
|
|
|
};
|
2020-04-22 11:51:36 -07:00
|
|
|
|
|
|
|
if (require.main === module) {
|
2020-04-22 13:03:32 -07:00
|
|
|
const { ApolloServer } = require("apollo-server");
|
|
|
|
const server = new ApolloServer(config);
|
2020-04-22 11:51:36 -07:00
|
|
|
server.listen().then(({ url }) => {
|
|
|
|
console.log(`🚀 Server ready at ${url}`);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-04-22 13:03:32 -07:00
|
|
|
module.exports = { config };
|