add GQL to know what species can wear an item
gonna use this on the item page to seed the species choice!
This commit is contained in:
parent
5f9b143939
commit
bcf6e6d8a7
4 changed files with 295 additions and 0 deletions
|
@ -294,6 +294,29 @@ const buildItemsThatNeedModelsLoader = (db) =>
|
||||||
return [lastResult];
|
return [lastResult];
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const buildItemSpeciesWithAppearanceDataLoader = (db) =>
|
||||||
|
new DataLoader(async (itemIds) => {
|
||||||
|
const qs = itemIds.map((_) => "?").join(",");
|
||||||
|
const [rows, _] = await db.execute(
|
||||||
|
`SELECT DISTINCT pet_types.species_id AS id, items.id AS item_id
|
||||||
|
FROM items
|
||||||
|
INNER JOIN parents_swf_assets ON
|
||||||
|
items.id = parents_swf_assets.parent_id AND
|
||||||
|
parents_swf_assets.parent_type = "Item"
|
||||||
|
INNER JOIN swf_assets ON
|
||||||
|
parents_swf_assets.swf_asset_id = swf_assets.id
|
||||||
|
INNER JOIN pet_types ON
|
||||||
|
pet_types.body_id = swf_assets.body_id OR swf_assets.body_id = 0
|
||||||
|
WHERE items.id = ${qs}
|
||||||
|
ORDER BY id`,
|
||||||
|
itemIds
|
||||||
|
);
|
||||||
|
|
||||||
|
const entities = rows.map(normalizeRow);
|
||||||
|
|
||||||
|
return itemIds.map((itemId) => entities.filter((e) => e.itemId === itemId));
|
||||||
|
});
|
||||||
|
|
||||||
const buildPetTypeLoader = (db) =>
|
const buildPetTypeLoader = (db) =>
|
||||||
new DataLoader(async (petTypeIds) => {
|
new DataLoader(async (petTypeIds) => {
|
||||||
const qs = petTypeIds.map((_) => "?").join(",");
|
const qs = petTypeIds.map((_) => "?").join(",");
|
||||||
|
@ -594,6 +617,9 @@ function buildLoaders(db) {
|
||||||
loaders.itemSearchLoader = buildItemSearchLoader(db, loaders);
|
loaders.itemSearchLoader = buildItemSearchLoader(db, loaders);
|
||||||
loaders.itemSearchToFitLoader = buildItemSearchToFitLoader(db, loaders);
|
loaders.itemSearchToFitLoader = buildItemSearchToFitLoader(db, loaders);
|
||||||
loaders.itemsThatNeedModelsLoader = buildItemsThatNeedModelsLoader(db);
|
loaders.itemsThatNeedModelsLoader = buildItemsThatNeedModelsLoader(db);
|
||||||
|
loaders.itemSpeciesWithAppearanceDataLoader = buildItemSpeciesWithAppearanceDataLoader(
|
||||||
|
db
|
||||||
|
);
|
||||||
loaders.petTypeLoader = buildPetTypeLoader(db);
|
loaders.petTypeLoader = buildPetTypeLoader(db);
|
||||||
loaders.petTypeBySpeciesAndColorLoader = buildPetTypeBySpeciesAndColorLoader(
|
loaders.petTypeBySpeciesAndColorLoader = buildPetTypeBySpeciesAndColorLoader(
|
||||||
db,
|
db,
|
||||||
|
|
|
@ -430,4 +430,67 @@ describe("Item", () => {
|
||||||
expect(res.data).toMatchSnapshot();
|
expect(res.data).toMatchSnapshot();
|
||||||
expect(getDbCalls()).toMatchSnapshot();
|
expect(getDbCalls()).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("loads species with appearance data for single-species item", async () => {
|
||||||
|
const res = await query({
|
||||||
|
query: gql`
|
||||||
|
query {
|
||||||
|
item(
|
||||||
|
id: "38911" # Zafara Agent Hood
|
||||||
|
) {
|
||||||
|
speciesWithAppearanceDataForThisItem {
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(res).toHaveNoErrors();
|
||||||
|
expect(res.data.item.speciesWithAppearanceDataForThisItem).toHaveLength(1);
|
||||||
|
expect(res.data.item.speciesWithAppearanceDataForThisItem[0].name).toEqual(
|
||||||
|
"Zafara"
|
||||||
|
);
|
||||||
|
expect(getDbCalls()).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("loads species with appearance data for all-species item", async () => {
|
||||||
|
const res = await query({
|
||||||
|
query: gql`
|
||||||
|
query {
|
||||||
|
item(
|
||||||
|
id: "74967" # 17th Birthday Party Hat
|
||||||
|
) {
|
||||||
|
speciesWithAppearanceDataForThisItem {
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(res).toHaveNoErrors();
|
||||||
|
expect(res.data.item.speciesWithAppearanceDataForThisItem).toHaveLength(55);
|
||||||
|
expect(getDbCalls()).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("loads species with appearance data for bodyId=0 item", async () => {
|
||||||
|
const res = await query({
|
||||||
|
query: gql`
|
||||||
|
query {
|
||||||
|
item(
|
||||||
|
id: "37375" # Moon and Stars Background
|
||||||
|
) {
|
||||||
|
speciesWithAppearanceDataForThisItem {
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(res).toHaveNoErrors();
|
||||||
|
expect(res.data.item.speciesWithAppearanceDataForThisItem).toHaveLength(55);
|
||||||
|
expect(getDbCalls()).toMatchSnapshot();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -11998,6 +11998,198 @@ Object {
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`Item loads species with appearance data for all-species item 1`] = `
|
||||||
|
Array [
|
||||||
|
Array [
|
||||||
|
"SELECT DISTINCT pet_types.species_id AS id, items.id AS item_id
|
||||||
|
FROM items
|
||||||
|
INNER JOIN parents_swf_assets ON
|
||||||
|
items.id = parents_swf_assets.parent_id AND
|
||||||
|
parents_swf_assets.parent_type = \\"Item\\"
|
||||||
|
INNER JOIN swf_assets ON
|
||||||
|
parents_swf_assets.swf_asset_id = swf_assets.id
|
||||||
|
INNER JOIN pet_types ON
|
||||||
|
pet_types.body_id = swf_assets.body_id OR swf_assets.body_id = 0
|
||||||
|
WHERE items.id = ?
|
||||||
|
ORDER BY id",
|
||||||
|
Array [
|
||||||
|
"74967",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
Array [
|
||||||
|
"SELECT * FROM species_translations
|
||||||
|
WHERE species_id IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) AND locale = \\"en\\"",
|
||||||
|
Array [
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
"3",
|
||||||
|
"4",
|
||||||
|
"5",
|
||||||
|
"6",
|
||||||
|
"7",
|
||||||
|
"8",
|
||||||
|
"9",
|
||||||
|
"10",
|
||||||
|
"11",
|
||||||
|
"12",
|
||||||
|
"13",
|
||||||
|
"14",
|
||||||
|
"15",
|
||||||
|
"16",
|
||||||
|
"17",
|
||||||
|
"18",
|
||||||
|
"19",
|
||||||
|
"20",
|
||||||
|
"21",
|
||||||
|
"22",
|
||||||
|
"23",
|
||||||
|
"24",
|
||||||
|
"25",
|
||||||
|
"26",
|
||||||
|
"27",
|
||||||
|
"28",
|
||||||
|
"29",
|
||||||
|
"30",
|
||||||
|
"31",
|
||||||
|
"32",
|
||||||
|
"33",
|
||||||
|
"34",
|
||||||
|
"35",
|
||||||
|
"36",
|
||||||
|
"37",
|
||||||
|
"38",
|
||||||
|
"39",
|
||||||
|
"40",
|
||||||
|
"41",
|
||||||
|
"42",
|
||||||
|
"43",
|
||||||
|
"44",
|
||||||
|
"45",
|
||||||
|
"46",
|
||||||
|
"47",
|
||||||
|
"48",
|
||||||
|
"49",
|
||||||
|
"50",
|
||||||
|
"51",
|
||||||
|
"52",
|
||||||
|
"53",
|
||||||
|
"54",
|
||||||
|
"55",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Item loads species with appearance data for bodyId=0 item 1`] = `
|
||||||
|
Array [
|
||||||
|
Array [
|
||||||
|
"SELECT DISTINCT pet_types.species_id AS id, items.id AS item_id
|
||||||
|
FROM items
|
||||||
|
INNER JOIN parents_swf_assets ON
|
||||||
|
items.id = parents_swf_assets.parent_id AND
|
||||||
|
parents_swf_assets.parent_type = \\"Item\\"
|
||||||
|
INNER JOIN swf_assets ON
|
||||||
|
parents_swf_assets.swf_asset_id = swf_assets.id
|
||||||
|
INNER JOIN pet_types ON
|
||||||
|
pet_types.body_id = swf_assets.body_id OR swf_assets.body_id = 0
|
||||||
|
WHERE items.id = ?
|
||||||
|
ORDER BY id",
|
||||||
|
Array [
|
||||||
|
"37375",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
Array [
|
||||||
|
"SELECT * FROM species_translations
|
||||||
|
WHERE species_id IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) AND locale = \\"en\\"",
|
||||||
|
Array [
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
"3",
|
||||||
|
"4",
|
||||||
|
"5",
|
||||||
|
"6",
|
||||||
|
"7",
|
||||||
|
"8",
|
||||||
|
"9",
|
||||||
|
"10",
|
||||||
|
"11",
|
||||||
|
"12",
|
||||||
|
"13",
|
||||||
|
"14",
|
||||||
|
"15",
|
||||||
|
"16",
|
||||||
|
"17",
|
||||||
|
"18",
|
||||||
|
"19",
|
||||||
|
"20",
|
||||||
|
"21",
|
||||||
|
"22",
|
||||||
|
"23",
|
||||||
|
"24",
|
||||||
|
"25",
|
||||||
|
"26",
|
||||||
|
"27",
|
||||||
|
"28",
|
||||||
|
"29",
|
||||||
|
"30",
|
||||||
|
"31",
|
||||||
|
"32",
|
||||||
|
"33",
|
||||||
|
"34",
|
||||||
|
"35",
|
||||||
|
"36",
|
||||||
|
"37",
|
||||||
|
"38",
|
||||||
|
"39",
|
||||||
|
"40",
|
||||||
|
"41",
|
||||||
|
"42",
|
||||||
|
"43",
|
||||||
|
"44",
|
||||||
|
"45",
|
||||||
|
"46",
|
||||||
|
"47",
|
||||||
|
"48",
|
||||||
|
"49",
|
||||||
|
"50",
|
||||||
|
"51",
|
||||||
|
"52",
|
||||||
|
"53",
|
||||||
|
"54",
|
||||||
|
"55",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Item loads species with appearance data for single-species item 1`] = `
|
||||||
|
Array [
|
||||||
|
Array [
|
||||||
|
"SELECT DISTINCT pet_types.species_id AS id, items.id AS item_id
|
||||||
|
FROM items
|
||||||
|
INNER JOIN parents_swf_assets ON
|
||||||
|
items.id = parents_swf_assets.parent_id AND
|
||||||
|
parents_swf_assets.parent_type = \\"Item\\"
|
||||||
|
INNER JOIN swf_assets ON
|
||||||
|
parents_swf_assets.swf_asset_id = swf_assets.id
|
||||||
|
INNER JOIN pet_types ON
|
||||||
|
pet_types.body_id = swf_assets.body_id OR swf_assets.body_id = 0
|
||||||
|
WHERE items.id = ?
|
||||||
|
ORDER BY id",
|
||||||
|
Array [
|
||||||
|
"38911",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
Array [
|
||||||
|
"SELECT * FROM species_translations
|
||||||
|
WHERE species_id IN (?) AND locale = \\"en\\"",
|
||||||
|
Array [
|
||||||
|
"54",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`Item returns empty appearance for incompatible items 1`] = `
|
exports[`Item returns empty appearance for incompatible items 1`] = `
|
||||||
Object {
|
Object {
|
||||||
"items": Array [
|
"items": Array [
|
||||||
|
|
|
@ -41,6 +41,12 @@ const typeDefs = gql`
|
||||||
# major special color like Baby (#6), or leave it blank for standard
|
# major special color like Baby (#6), or leave it blank for standard
|
||||||
# bodies like Blue, Green, Red, etc.
|
# bodies like Blue, Green, Red, etc.
|
||||||
speciesThatNeedModels(colorId: ID): [Species!]!
|
speciesThatNeedModels(colorId: ID): [Species!]!
|
||||||
|
|
||||||
|
# Species that we know how they look wearing this item. Used to initialize
|
||||||
|
# the preview on the item page with a compatible species.
|
||||||
|
# TODO: This would probably make more sense as like, compatible bodies, so
|
||||||
|
# we could also encode special-color stuff in here too.
|
||||||
|
speciesWithAppearanceDataForThisItem: [Species!]!
|
||||||
}
|
}
|
||||||
|
|
||||||
type ItemAppearance {
|
type ItemAppearance {
|
||||||
|
@ -176,6 +182,14 @@ const resolvers = {
|
||||||
);
|
);
|
||||||
return unmodeledSpeciesIds.map((id) => ({ id }));
|
return unmodeledSpeciesIds.map((id) => ({ id }));
|
||||||
},
|
},
|
||||||
|
speciesWithAppearanceDataForThisItem: async (
|
||||||
|
{ id },
|
||||||
|
_,
|
||||||
|
{ itemSpeciesWithAppearanceDataLoader }
|
||||||
|
) => {
|
||||||
|
const rows = await itemSpeciesWithAppearanceDataLoader.load(id);
|
||||||
|
return rows.map((row) => ({ id: row.id }));
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
ItemAppearance: {
|
ItemAppearance: {
|
||||||
|
|
Loading…
Reference in a new issue