Added POST and DELETE routes on Snippets

This commit is contained in:
Florian Sylvain
2023-02-01 23:40:33 +01:00
parent b1f126b674
commit 0e5af06915
3 changed files with 108 additions and 38 deletions
+55 -1
View File
@@ -13,6 +13,7 @@ const testUserCredentials = {
}
let category_id: number
let snippet_id: number
// Mettre a jour les routes Category en stockant les IDs sur GET pour reutiliser sur DELETE
@@ -129,7 +130,7 @@ describe('POST /v1/category', () => {
})
describe('GET /v1/category', () => {
it('returns status code 200 and the category created', async () => {
it('returns status code 200 and the categories', async () => {
const res = await request(app)
.get('/v1/category')
.set('Content-Type', 'application/json')
@@ -200,6 +201,59 @@ describe('DELETE /v1/category', () => {
})
})
describe('POST /v1/snippet', () => {
it('returns status code 200 and the snippets', async () => {
const res = await request(app)
.post('/v1/snippet')
.set('Content-Type', 'application/json')
.set('Cookie', jwtCookie as string)
.send(JSON.stringify({
title: 'Vue3 CompAPI TS script-template-style',
code: `<script setup lang="ts">
</script>
<template>
</template>
<style scoped>
</style>`,
language: 'vue'
}))
expect(res.status).toEqual(200)
expect(res.body).toHaveProperty('message')
})
})
describe('GET /v1/snippet', () => {
it('returns status code 200 and success message', async () => {
const res = await request(app)
.get('/v1/snippet')
.set('Content-Type', 'application/json')
.set('Cookie', jwtCookie as string)
snippet_id = res.body.snippets[0].id
expect(res.status).toEqual(200)
expect(res.body.snippets[0].title).toEqual('Vue3 CompAPI TS script-template-style')
})
})
describe('DELETE /v1/snippet', () => {
it('returns status code 200 and success message', async () => {
const res = await request(app)
.delete('/v1/snippet')
.set('Content-Type', 'application/json')
.set('Cookie', jwtCookie as string)
.send(JSON.stringify({
id: snippet_id
}))
expect(res.status).toEqual(200)
expect(res.body).toHaveProperty('message')
})
})
describe('PUT /v1/user', () => {
it('returns status code 200 and success message', async () => {
const res = await request(app)
+2
View File
@@ -7,6 +7,7 @@ import cookieParser from 'cookie-parser'
import { getJwtSecret } from './utils/jwt.js'
import sessionRouter from './routers/session.js'
import categoryRouter from './routers/category.js'
import snippetRouter from './routers/snippet'
const authMiddleware: RequestHandler = (req, res, next) => {
const token = req.cookies.jwt
@@ -59,6 +60,7 @@ export function initServer(): express.Express {
appRouter.use('/session/', sessionRouter)
appRouter.use('/user/', authMiddleware, userRouter)
appRouter.use('/category/', authMiddleware, categoryRouter)
appRouter.use('/snippet/', authMiddleware, snippetRouter)
app.use('/v1/', appRouter)
+51 -37
View File
@@ -6,11 +6,17 @@ import { userIdMiddleware } from "./user.js"
const snippetRouter = express.Router()
const prisma = new PrismaClient()
const snippetData = z.object({
const snippetPostParser = z.object({
code: z.string(),
title: z.string().max(50)
title: z.string().max(50),
language: z.string().max(32)
}).required()
const snippetDeleteParser = z.object({
id: z.number(),
}).required()
// TODO Ajouter paramètres sur la requête pour rechercher des snippets
// TODO Ajouter pagination
const snippetGet: RequestHandler = async (req, res) => {
@@ -23,50 +29,58 @@ const snippetGet: RequestHandler = async (req, res) => {
return;
}
res.json({ categories: snippets })
res.json({ snippets })
}
// const snippetPost: RequestHandler = async (req, res) => {
// try {
// const newSnippet = snippetData.parse(req.body)
// await prisma.snippet.create({
// data: {
// code: newSnippet.code,
// title: newSnippet.code,
// user_id: req.body.userId
// }
// })
// } catch (error: any) {
// res.status(400).json({ message: (error.issues ?? error) })
// return;
// }
const snippetPost: RequestHandler = async (req, res) => {
try {
const newSnippet = snippetPostParser.parse(req.body)
await prisma.snippet.create({
data: {
title: newSnippet.title,
code: newSnippet.code,
user: {
connect: { id: req.body.userId }
},
language: {
connectOrCreate: {
where: { name: newSnippet.language },
create: { name: newSnippet.language }
}
}
}
})
} catch (error: any) {
res.status(400).json({ message: (error.issues ?? error) })
return;
}
// res.json({ message: 'Snippet successfully added.' })
// }
res.json({ message: 'Snippet successfully added.' })
}
// const snippetDelete: RequestHandler = async (req, res) => {
// let deleted: Prisma.BatchPayload
const snippetDelete: RequestHandler = async (req, res) => {
let deleted: Prisma.BatchPayload
// try {
// const snippetToDel = snippetData.parse(req.body)
// deleted = await prisma.snippet.deleteMany({
// where: {
try {
const snippetToDel = snippetDeleteParser.parse(req.body)
deleted = await prisma.category.deleteMany({
where: {
id: snippetToDel.id,
user_id: req.body.userId
}
})
} catch (error: any) {
res.status(400).json({ message: (error.issues ?? error) })
return;
}
// user_id: req.body.userId
// }
// })
// } catch (error: any) {
// res.status(400).json({ message: (error.issues ?? error) })
// return;
// }
// res.json({ message: `${deleted.count} category / categories successfully deleted.` })
// }
res.json({ message: `${deleted.count} snippet(s) successfully deleted.` })
}
// TODO update snippet
snippetRouter.get('/', userIdMiddleware, snippetGet)
// snippetRouter.post('/', userIdMiddleware, snippetPost)
// snippetRouter.delete('/', userIdMiddleware, snippetDelete)
snippetRouter.post('/', userIdMiddleware, snippetPost)
snippetRouter.delete('/', userIdMiddleware, snippetDelete)
export default snippetRouter