From dea3aaf477983a75772cd13dede5ad2a4c752ac5 Mon Sep 17 00:00:00 2001 From: Benny Samir Hierl Date: Sat, 5 Feb 2022 14:47:37 +0100 Subject: [PATCH] #1 Add item API Endpoint added Signed-off-by: Benny Samir Hierl --- examples.http | 12 ++++++++++ prisma/seed.ts | 26 ++++----------------- src/api/config/schemas/wishlist.ts | 2 +- src/api/models/wishlist/index.ts | 18 ++++++++++++++- src/api/routes/wishlist/create.ts | 36 +++++++++++++++++++++++++++++- src/api/routes/wishlist/index.ts | 3 ++- src/api/routes/wishlist/update.ts | 8 +++---- 7 files changed, 74 insertions(+), 31 deletions(-) diff --git a/examples.http b/examples.http index 700d9a6..eefce8d 100644 --- a/examples.http +++ b/examples.http @@ -43,3 +43,15 @@ Content-Type: application/json "description": "Juniors Wishlist", "slugUrlText": "junior" } + +### +# @name addItemToFirstWishlist +POST {{BASE_URL}}/wishlist/{{getWishlists.response.body.0.id}}/item +Content-Type: application/json + +{ + "title": "Goldfish 40442 | BrickHeadz", + "url": "https://www.lego.com/en-de/product/goldfish-40442", + "imageSrc": "https://www.lego.com/cdn/cs/set/assets/blt1fc37afef51cfa9f/40442.jpg?fit=bounds&format=jpg&quality=80&width=1500&height=1500&dpr=1", + "description": "Cute goldfish and fry, build-and-display BrickHeadz™ model" +} diff --git a/prisma/seed.ts b/prisma/seed.ts index c369da5..b404659 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -12,30 +12,12 @@ const wishlistData: Prisma.WishlistCreateInput[] = [ items: { create: [ { - title: 'Mr Maria Lion "First Light" Lampe', - url: 'https://babykochs.de/mr-maria-lion-first-light-lampe/', + title: 'Goldfish 40442 | BrickHeadz', + url: 'https://www.lego.com/en-de/product/goldfish-40442', imageSrc: - 'https://babykochs.de/wp-content/uploads/2021/01/First-Light-Lion1.jpg', + 'https://www.lego.com/cdn/cs/set/assets/blt1fc37afef51cfa9f/40442.jpg?fit=bounds&format=jpg&quality=80&width=1500&height=1500&dpr=1', description: - 'Lion ist Teil der Serie "First Light - Miffy und Freunde" Kollektion, eine Nachtlampe, die als "kleiner Freund für ein kleines Wunder" entworfen wurde.', - comment: '', - }, - { - title: 'Liewood Nachtlicht Winston Bär dove blue', - url: 'https://babykochs.de/liewood-nachtlicht-baer/', - imageSrc: - 'https://babykochs.de/wp-content/uploads/2021/01/Liewood-Nachtlicht-Winston-bear-dove-blue.jpg', - description: - 'Mit dem Licht dieses süßen Bären fühlen sich Eure Kleinen in der Nacht ganz sicher und haben’s schön gemütlich.', - comment: '', - }, - { - title: 'Baby- und Kleinkindbett', - url: 'https://www.tchibo.de/baby-und-kleinkindbett-p400114225.html#modal-productimagegallery-modalGalleryImage-400886394', - imageSrc: - 'https://www.tchibo.de/newmedia/art_img/MAIN-IMPORTED/f045f71ebabea9e4/baby-und-kleinkindbett.jpg', - description: - 'Ein Bett, das mitwächst Zu einem erholsamen Schlaf und einer schönen Nacht gehört natürlich auch ein gutes Bett – das gilt auch für die Kleinsten.', + 'Cute goldfish and fry, build-and-display BrickHeadz™ model', comment: '', }, ], diff --git a/src/api/config/schemas/wishlist.ts b/src/api/config/schemas/wishlist.ts index 897bf25..3e575fc 100644 --- a/src/api/config/schemas/wishlist.ts +++ b/src/api/config/schemas/wishlist.ts @@ -1,7 +1,7 @@ export const wishlistItemRequestSchema = { type: 'object', additionalProperties: false, - required: ['title', 'imageSrc'], + required: ['title', 'description'], properties: { title: { type: 'string' }, url: { type: 'string' }, diff --git a/src/api/models/wishlist/index.ts b/src/api/models/wishlist/index.ts index 15245e1..e140f3d 100644 --- a/src/api/models/wishlist/index.ts +++ b/src/api/models/wishlist/index.ts @@ -1,5 +1,5 @@ import { prisma } from '../../services' -import { Wishlist } from '@/types' +import { Wishlist, WishlistItem } from '@/types' export default { getAll: async (): Promise => { @@ -33,6 +33,22 @@ export default { }, }) }, + createItem: async (wishlistId: string, payload: WishlistItem) => { + const wishlist = await prisma.client.wishlist.update({ + where: { + id: wishlistId, + }, + data: { + items: { + create: { + ...payload, + }, + }, + }, + include: { items: true }, + }) + return wishlist.items.pop() + }, // eslint-disable-next-line @typescript-eslint/no-explicit-any updateItem: async (itemId: number, payload: any) => { return await prisma.client.item.update({ diff --git a/src/api/routes/wishlist/create.ts b/src/api/routes/wishlist/create.ts index 9ee934a..55a5087 100644 --- a/src/api/routes/wishlist/create.ts +++ b/src/api/routes/wishlist/create.ts @@ -1,13 +1,21 @@ -import { Wishlist } from '@/types' +import { Wishlist, WishlistItem } from '@/types' import { FastifyRequest, FastifyReply, RouteOptions } from 'fastify' import { wishlist } from '../../models' import { prisma } from '../../services' import { uniqueKeyError } from '../../config/errors' import { + wishlistItemRequestSchema, + wishlistItemResponseSchema, wishlistRequestSchema, wishlistResponseSchema, } from '../../config/schemas' +interface createItemRequest extends FastifyRequest { + params: { + wishlistId: string + } +} + export const createList = { method: 'POST', url: '/', @@ -30,3 +38,29 @@ export const createList = { reply.code(201).send(item) }, } + +export const createItem = { + method: 'POST', + url: '/:wishlistId/item', + schema: { + body: wishlistItemRequestSchema, + response: { + 201: wishlistItemResponseSchema, + }, + }, + errorHandler: (error, request, reply) => { + if (error instanceof prisma.errorType && error.code === 'P2025') { + return reply.callNotFound() + } + request.log.error(error) + reply.send(new Error('Unexptected Error')) + }, + handler: async (request: createItemRequest, reply: FastifyReply) => { + request.log.debug(request.body) + const item = await wishlist.createItem( + request.params.wishlistId, + request.body as WishlistItem + ) + reply.code(201).send(item) + }, +} diff --git a/src/api/routes/wishlist/index.ts b/src/api/routes/wishlist/index.ts index 33f34fb..ec37853 100644 --- a/src/api/routes/wishlist/index.ts +++ b/src/api/routes/wishlist/index.ts @@ -1,12 +1,13 @@ import { FastifyInstance } from 'fastify' import { getAll, getBySlugUrl } from './read' import { updateList, updateItem } from './update' -import { createList } from './create' +import { createList, createItem } from './create' export default async (app: FastifyInstance) => { await app.route(getAll) await app.route(getBySlugUrl) await app.route(createList) + await app.route(createItem) await app.route(updateList) await app.route(updateItem) } diff --git a/src/api/routes/wishlist/update.ts b/src/api/routes/wishlist/update.ts index b6f9a4d..be8224c 100644 --- a/src/api/routes/wishlist/update.ts +++ b/src/api/routes/wishlist/update.ts @@ -15,6 +15,7 @@ interface updateRequest extends FastifyRequest { wishlistId: string } } + interface updateItemRequest extends FastifyRequest { params: { wishlistId: string @@ -67,12 +68,9 @@ export const updateItem = { request.body ) if (item) { - return item + reply.send(item) } else { - return reply.code(404).send({ - error: 'notFound', - http: 404, - }) + reply.callNotFound() } }, }