impress-2020/src/server/index.js

127 lines
3 KiB
JavaScript
Raw Normal View History

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: {
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
},
};
const config = {
2020-04-22 11:51:36 -07:00
typeDefs,
resolvers,
context: async () => {
const db = await connectToDb();
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 11:51:36 -07:00
},
};
2020-04-22 11:51:36 -07:00
if (require.main === module) {
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}`);
});
}
module.exports = { config };