#1 Add item API Endpoint added

Signed-off-by: Benny Samir Hierl <bennysamir@posteo.de>
This commit is contained in:
Benny Samir Hierl 2022-02-05 14:47:37 +01:00
parent 56db8ba65a
commit dea3aaf477
7 changed files with 74 additions and 31 deletions

View file

@ -43,3 +43,15 @@ Content-Type: application/json
"description": "Juniors Wishlist", "description": "Juniors Wishlist",
"slugUrlText": "junior" "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"
}

View file

@ -12,30 +12,12 @@ const wishlistData: Prisma.WishlistCreateInput[] = [
items: { items: {
create: [ create: [
{ {
title: 'Mr Maria Lion "First Light" Lampe', title: 'Goldfish 40442 | BrickHeadz',
url: 'https://babykochs.de/mr-maria-lion-first-light-lampe/', url: 'https://www.lego.com/en-de/product/goldfish-40442',
imageSrc: 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: 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.', 'Cute goldfish and fry, build-and-display BrickHeadz™ model',
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 habens 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.',
comment: '', comment: '',
}, },
], ],

View file

@ -1,7 +1,7 @@
export const wishlistItemRequestSchema = { export const wishlistItemRequestSchema = {
type: 'object', type: 'object',
additionalProperties: false, additionalProperties: false,
required: ['title', 'imageSrc'], required: ['title', 'description'],
properties: { properties: {
title: { type: 'string' }, title: { type: 'string' },
url: { type: 'string' }, url: { type: 'string' },

View file

@ -1,5 +1,5 @@
import { prisma } from '../../services' import { prisma } from '../../services'
import { Wishlist } from '@/types' import { Wishlist, WishlistItem } from '@/types'
export default { export default {
getAll: async (): Promise<any> => { getAll: async (): Promise<any> => {
@ -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 // eslint-disable-next-line @typescript-eslint/no-explicit-any
updateItem: async (itemId: number, payload: any) => { updateItem: async (itemId: number, payload: any) => {
return await prisma.client.item.update({ return await prisma.client.item.update({

View file

@ -1,13 +1,21 @@
import { Wishlist } from '@/types' import { Wishlist, WishlistItem } from '@/types'
import { FastifyRequest, FastifyReply, RouteOptions } from 'fastify' import { FastifyRequest, FastifyReply, RouteOptions } from 'fastify'
import { wishlist } from '../../models' import { wishlist } from '../../models'
import { prisma } from '../../services' import { prisma } from '../../services'
import { uniqueKeyError } from '../../config/errors' import { uniqueKeyError } from '../../config/errors'
import { import {
wishlistItemRequestSchema,
wishlistItemResponseSchema,
wishlistRequestSchema, wishlistRequestSchema,
wishlistResponseSchema, wishlistResponseSchema,
} from '../../config/schemas' } from '../../config/schemas'
interface createItemRequest extends FastifyRequest {
params: {
wishlistId: string
}
}
export const createList = <RouteOptions>{ export const createList = <RouteOptions>{
method: 'POST', method: 'POST',
url: '/', url: '/',
@ -30,3 +38,29 @@ export const createList = <RouteOptions>{
reply.code(201).send(item) reply.code(201).send(item)
}, },
} }
export const createItem = <RouteOptions>{
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)
},
}

View file

@ -1,12 +1,13 @@
import { FastifyInstance } from 'fastify' import { FastifyInstance } from 'fastify'
import { getAll, getBySlugUrl } from './read' import { getAll, getBySlugUrl } from './read'
import { updateList, updateItem } from './update' import { updateList, updateItem } from './update'
import { createList } from './create' import { createList, createItem } from './create'
export default async (app: FastifyInstance) => { export default async (app: FastifyInstance) => {
await app.route(getAll) await app.route(getAll)
await app.route(getBySlugUrl) await app.route(getBySlugUrl)
await app.route(createList) await app.route(createList)
await app.route(createItem)
await app.route(updateList) await app.route(updateList)
await app.route(updateItem) await app.route(updateItem)
} }

View file

@ -15,6 +15,7 @@ interface updateRequest extends FastifyRequest {
wishlistId: string wishlistId: string
} }
} }
interface updateItemRequest extends FastifyRequest { interface updateItemRequest extends FastifyRequest {
params: { params: {
wishlistId: string wishlistId: string
@ -67,12 +68,9 @@ export const updateItem = <RouteOptions>{
request.body request.body
) )
if (item) { if (item) {
return item reply.send(item)
} else { } else {
return reply.code(404).send({ reply.callNotFound()
error: 'notFound',
http: 404,
})
} }
}, },
} }