feat: solution exercise 4

This commit is contained in:
Kristof Van Miegem 2019-02-07 15:58:00 +01:00
parent f5070142cb
commit 971e366a1b
3 changed files with 55 additions and 2 deletions

View File

@ -81,11 +81,29 @@ function getStoreProducts(storeId) {
} }
function getReservationProducts(reservationId) { function getReservationProducts(reservationId) {
return []; return reservationProducts
// Join
.filter((rp) => rp.reservationId === reservationId)
.map((rp) => ({
product: products.find(p => p.id === rp.productId),
quantity: rp.quantity
}));
} }
function createReservation(reservation) { function createReservation(reservation) {
return {}; const reservationId = uuid();
const newReservation = {
date: new Date(),
id: reservationId,
};
reservations.push(newReservation);
reservationProducts = reservationProducts.concat(
reservation.reservationProducts.map((reservationProduct) => ({
...reservationProduct,
reservationId
})
));
return newReservation;
} }
module.exports = { module.exports = {

View File

@ -47,6 +47,11 @@ module.exports = {
return data.getStore(id); return data.getStore(id);
}, },
}, },
Reservation: {
reservationProducts: async ({ id }) => {
return data.getReservationProducts(id);
}
},
Store: { Store: {
products: async ({ id: storeId }) => { products: async ({ id: storeId }) => {
return data.getStoreProducts(storeId); return data.getStoreProducts(storeId);
@ -62,5 +67,14 @@ module.exports = {
const { city, name, number, postalCode, street } = input; const { city, name, number, postalCode, street } = input;
return data.createStore({ city, name, number, postalCode, street }); return data.createStore({ city, name, number, postalCode, street });
}, },
createReservation: async (parent, { input }) => {
try {
await createReservationSchema.validate(input);
} catch (e) {
throw new UserInputError('Invalid input.', { validationErrors: e.errors });
}
const { reservationProducts } = input;
return data.createReservation({ reservationProducts });
}
} }
}; };

View File

@ -23,6 +23,17 @@ module.exports = gql`
street: String street: String
} }
type ReservationProduct {
product: Product
quantity: Int
}
type Reservation {
date: String
id: String
reservationProducts: [ReservationProduct]
}
# The "Query" type is the root of all GraphQL queries. # The "Query" type is the root of all GraphQL queries.
# (A "Mutation" type will be covered later on.) # (A "Mutation" type will be covered later on.)
type Query { type Query {
@ -38,7 +49,17 @@ module.exports = gql`
street: String street: String
} }
input ReservationProductInput {
productId: String!
quantity: Int
}
input ReservationInput {
reservationProducts: [ReservationProductInput]
}
type Mutation { type Mutation {
createStore(input: StoreInput): Store createStore(input: StoreInput): Store
createReservation(input: ReservationInput): Reservation
} }
`; `;