add GQL for individual trade lists
This commit is contained in:
parent
a49e66e359
commit
21039ec148
3 changed files with 345 additions and 0 deletions
|
@ -399,4 +399,60 @@ describe("User", () => {
|
||||||
]
|
]
|
||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("gets public closet lists, but not private, for other users", async () => {
|
||||||
|
const res = await query({
|
||||||
|
query: gql`
|
||||||
|
query {
|
||||||
|
user(id: "44743") {
|
||||||
|
id
|
||||||
|
username
|
||||||
|
closetLists {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
ownsOrWantsItems
|
||||||
|
isDefaultList
|
||||||
|
items {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(res).toHaveNoErrors();
|
||||||
|
expect(res.data).toMatchSnapshot("data");
|
||||||
|
expect(getDbCalls()).toMatchSnapshot("db");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("gets public and private closet lists for current user", async () => {
|
||||||
|
await logInAsTestUser();
|
||||||
|
|
||||||
|
const res = await query({
|
||||||
|
query: gql`
|
||||||
|
query {
|
||||||
|
user(id: "44743") {
|
||||||
|
id
|
||||||
|
username
|
||||||
|
closetLists {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
ownsOrWantsItems
|
||||||
|
isDefaultList
|
||||||
|
items {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(res).toHaveNoErrors();
|
||||||
|
expect(res.data).toMatchSnapshot("data");
|
||||||
|
expect(getDbCalls()).toMatchSnapshot("db");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
207
src/server/query-tests/__snapshots__/User.test.js.snap
Normal file
207
src/server/query-tests/__snapshots__/User.test.js.snap
Normal file
|
@ -0,0 +1,207 @@
|
||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`User gets public and private closet lists for current user: data 1`] = `
|
||||||
|
Object {
|
||||||
|
"user": Object {
|
||||||
|
"closetLists": Array [
|
||||||
|
Object {
|
||||||
|
"id": "184791",
|
||||||
|
"isDefaultList": false,
|
||||||
|
"items": Array [
|
||||||
|
Object {
|
||||||
|
"id": "39948",
|
||||||
|
"name": "Altador Cup Background - Lost Desert",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"name": "A Private Own List",
|
||||||
|
"ownsOrWantsItems": "OWNS",
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"id": "184793",
|
||||||
|
"isDefaultList": false,
|
||||||
|
"items": Array [
|
||||||
|
Object {
|
||||||
|
"id": "39945",
|
||||||
|
"name": "Altador Cup Background - Haunted Woods",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"name": "A Private Want List",
|
||||||
|
"ownsOrWantsItems": "WANTS",
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"id": "184790",
|
||||||
|
"isDefaultList": false,
|
||||||
|
"items": Array [
|
||||||
|
Object {
|
||||||
|
"id": "39955",
|
||||||
|
"name": "Altador Cup Background - Virtupets",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"name": "A Public Own List",
|
||||||
|
"ownsOrWantsItems": "OWNS",
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"id": "184792",
|
||||||
|
"isDefaultList": false,
|
||||||
|
"items": Array [
|
||||||
|
Object {
|
||||||
|
"id": "39947",
|
||||||
|
"name": "Altador Cup Background - Shenkuu",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"name": "A Public Want List",
|
||||||
|
"ownsOrWantsItems": "WANTS",
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"id": "user-44743-default-list-OWNS",
|
||||||
|
"isDefaultList": true,
|
||||||
|
"items": Array [
|
||||||
|
Object {
|
||||||
|
"id": "74967",
|
||||||
|
"name": "17th Birthday Party Hat",
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"id": "49026",
|
||||||
|
"name": "Abominable Snowman Hat",
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"id": "40319",
|
||||||
|
"name": "Blue Jelly Tiara",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"name": "(Not in a list)",
|
||||||
|
"ownsOrWantsItems": "OWNS",
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"id": "user-44743-default-list-WANTS",
|
||||||
|
"isDefaultList": true,
|
||||||
|
"items": Array [
|
||||||
|
Object {
|
||||||
|
"id": "39956",
|
||||||
|
"name": "Altador Cup Background - Kreludor",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"name": "(Not in a list)",
|
||||||
|
"ownsOrWantsItems": "WANTS",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"id": "44743",
|
||||||
|
"username": "dti-test",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`User gets public and private closet lists for current user: db 1`] = `
|
||||||
|
Array [
|
||||||
|
Array [
|
||||||
|
"SELECT * FROM users WHERE id IN (?)",
|
||||||
|
Array [
|
||||||
|
"44743",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
Array [
|
||||||
|
"SELECT closet_hangers.*, item_translations.name as item_name FROM closet_hangers
|
||||||
|
INNER JOIN items ON items.id = closet_hangers.item_id
|
||||||
|
INNER JOIN item_translations ON
|
||||||
|
item_translations.item_id = items.id AND locale = \\"en\\"
|
||||||
|
WHERE user_id IN (?)
|
||||||
|
ORDER BY item_name",
|
||||||
|
Array [
|
||||||
|
"44743",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
Array [
|
||||||
|
"SELECT * FROM closet_lists
|
||||||
|
WHERE user_id IN (?)
|
||||||
|
ORDER BY name",
|
||||||
|
Array [
|
||||||
|
"44743",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
Array [
|
||||||
|
"SELECT * FROM item_translations WHERE item_id IN (?,?,?,?,?,?,?,?) AND locale = \\"en\\"",
|
||||||
|
Array [
|
||||||
|
"39948",
|
||||||
|
"39945",
|
||||||
|
"39955",
|
||||||
|
"39947",
|
||||||
|
"74967",
|
||||||
|
"49026",
|
||||||
|
"40319",
|
||||||
|
"39956",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`User gets public closet lists, but not private, for other users: data 1`] = `
|
||||||
|
Object {
|
||||||
|
"user": Object {
|
||||||
|
"closetLists": Array [
|
||||||
|
Object {
|
||||||
|
"id": "184790",
|
||||||
|
"isDefaultList": false,
|
||||||
|
"items": Array [
|
||||||
|
Object {
|
||||||
|
"id": "39955",
|
||||||
|
"name": "Altador Cup Background - Virtupets",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"name": "A Public Own List",
|
||||||
|
"ownsOrWantsItems": "OWNS",
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"id": "184792",
|
||||||
|
"isDefaultList": false,
|
||||||
|
"items": Array [
|
||||||
|
Object {
|
||||||
|
"id": "39947",
|
||||||
|
"name": "Altador Cup Background - Shenkuu",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"name": "A Public Want List",
|
||||||
|
"ownsOrWantsItems": "WANTS",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"id": "44743",
|
||||||
|
"username": "dti-test",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`User gets public closet lists, but not private, for other users: db 1`] = `
|
||||||
|
Array [
|
||||||
|
Array [
|
||||||
|
"SELECT * FROM users WHERE id IN (?)",
|
||||||
|
Array [
|
||||||
|
"44743",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
Array [
|
||||||
|
"SELECT closet_hangers.*, item_translations.name as item_name FROM closet_hangers
|
||||||
|
INNER JOIN items ON items.id = closet_hangers.item_id
|
||||||
|
INNER JOIN item_translations ON
|
||||||
|
item_translations.item_id = items.id AND locale = \\"en\\"
|
||||||
|
WHERE user_id IN (?)
|
||||||
|
ORDER BY item_name",
|
||||||
|
Array [
|
||||||
|
"44743",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
Array [
|
||||||
|
"SELECT * FROM closet_lists
|
||||||
|
WHERE user_id IN (?)
|
||||||
|
ORDER BY name",
|
||||||
|
Array [
|
||||||
|
"44743",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
Array [
|
||||||
|
"SELECT * FROM item_translations WHERE item_id IN (?,?) AND locale = \\"en\\"",
|
||||||
|
Array [
|
||||||
|
"39955",
|
||||||
|
"39947",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
]
|
||||||
|
`;
|
|
@ -1,14 +1,40 @@
|
||||||
const { gql } = require("apollo-server");
|
const { gql } = require("apollo-server");
|
||||||
|
|
||||||
const typeDefs = gql`
|
const typeDefs = gql`
|
||||||
|
enum OwnsOrWants {
|
||||||
|
OWNS
|
||||||
|
WANTS
|
||||||
|
}
|
||||||
|
|
||||||
type User {
|
type User {
|
||||||
id: ID!
|
id: ID!
|
||||||
username: String!
|
username: String!
|
||||||
contactNeopetsUsername: String
|
contactNeopetsUsername: String
|
||||||
|
|
||||||
|
closetLists: [ClosetList!]!
|
||||||
|
|
||||||
itemsTheyOwn: [Item!]!
|
itemsTheyOwn: [Item!]!
|
||||||
itemsTheyWant: [Item!]!
|
itemsTheyWant: [Item!]!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ClosetList {
|
||||||
|
id: ID!
|
||||||
|
name: String
|
||||||
|
|
||||||
|
# Whether this is a list of items they own, or items they want.
|
||||||
|
ownsOrWantsItems: OwnsOrWants!
|
||||||
|
|
||||||
|
# Each user has a "default list" of items they own/want. When users click
|
||||||
|
# the Own/Want button on the item page, items go here automatically. (On
|
||||||
|
# the backend, this is managed as the hangers having a null list ID.)
|
||||||
|
#
|
||||||
|
# This field is true if the list is the default list, so we can style it
|
||||||
|
# differently and change certain behaviors (e.g. can't be deleted).
|
||||||
|
isDefaultList: Boolean!
|
||||||
|
|
||||||
|
items: [Item!]!
|
||||||
|
}
|
||||||
|
|
||||||
extend type Query {
|
extend type Query {
|
||||||
user(id: ID!): User
|
user(id: ID!): User
|
||||||
currentUser: User
|
currentUser: User
|
||||||
|
@ -109,6 +135,62 @@ const resolvers = {
|
||||||
}));
|
}));
|
||||||
return items;
|
return items;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
closetLists: async (
|
||||||
|
{ id },
|
||||||
|
_,
|
||||||
|
{
|
||||||
|
currentUserId,
|
||||||
|
userLoader,
|
||||||
|
userClosetListsLoader,
|
||||||
|
userClosetHangersLoader,
|
||||||
|
}
|
||||||
|
) => {
|
||||||
|
const isCurrentUser = currentUserId === id;
|
||||||
|
const [allClosetHangers, closetLists, user] = await Promise.all([
|
||||||
|
userClosetHangersLoader.load(id),
|
||||||
|
userClosetListsLoader.load(id),
|
||||||
|
userLoader.load(id),
|
||||||
|
]);
|
||||||
|
|
||||||
|
const closetListNodes = closetLists
|
||||||
|
.filter((closetList) => isCurrentUser || closetList.visibility >= 1)
|
||||||
|
.map((closetList) => ({
|
||||||
|
id: closetList.id,
|
||||||
|
name: closetList.name,
|
||||||
|
ownsOrWantsItems: closetList.hangersOwned ? "OWNS" : "WANTS",
|
||||||
|
isDefaultList: false,
|
||||||
|
items: allClosetHangers
|
||||||
|
.filter((h) => h.listId === closetList.id)
|
||||||
|
.map((h) => ({ id: h.itemId })),
|
||||||
|
}));
|
||||||
|
|
||||||
|
if (isCurrentUser || user.ownedClosetHangersVisibility >= 1) {
|
||||||
|
closetListNodes.push({
|
||||||
|
id: `user-${id}-default-list-OWNS`,
|
||||||
|
name: "(Not in a list)",
|
||||||
|
ownsOrWantsItems: "OWNS",
|
||||||
|
isDefaultList: true,
|
||||||
|
items: allClosetHangers
|
||||||
|
.filter((h) => h.listId == null && h.owned)
|
||||||
|
.map((h) => ({ id: h.itemId })),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isCurrentUser || user.wantedClosetHangersVisibility >= 1) {
|
||||||
|
closetListNodes.push({
|
||||||
|
id: `user-${id}-default-list-WANTS`,
|
||||||
|
name: "(Not in a list)",
|
||||||
|
ownsOrWantsItems: "WANTS",
|
||||||
|
isDefaultList: true,
|
||||||
|
items: allClosetHangers
|
||||||
|
.filter((h) => h.listId == null && !h.owned)
|
||||||
|
.map((h) => ({ id: h.itemId })),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return closetListNodes;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
Query: {
|
Query: {
|
||||||
|
|
Loading…
Reference in a new issue