From 95965106adf5ce1b87f70c13d2832591c6848e1a Mon Sep 17 00:00:00 2001 From: Arthur DANJOU Date: Mon, 23 Aug 2021 17:29:31 +0200 Subject: [PATCH] Working on posts --- app/Controllers/Http/PostsController.ts | 30 +++++++++++++++------- app/Validators/post/PostUpdateValidator.ts | 17 ++++++++++++ start/routes/artsite.ts | 4 +-- 3 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 app/Validators/post/PostUpdateValidator.ts diff --git a/app/Controllers/Http/PostsController.ts b/app/Controllers/Http/PostsController.ts index eb43e87..1a4c0e3 100755 --- a/app/Controllers/Http/PostsController.ts +++ b/app/Controllers/Http/PostsController.ts @@ -1,5 +1,6 @@ import Post from "App/Models/Post"; import {HttpContextContract} from "@ioc:Adonis/Core/HttpContext"; +import PostUpdateValidator from "App/Validators/post/PostUpdateValidator"; export default class PostsController { @@ -13,7 +14,12 @@ export default class PostsController { } public async show ({ params, response }: HttpContextContract) { - const post = await Post.findByOrFail('slug', params.slug) + const post = await Post.firstOrCreate({ + slug: params.slug + }, { + slug: params.slug, + likes: 0 + }) await post.load('tags', (tags) => { tags.preload('label') }) @@ -22,16 +28,22 @@ export default class PostsController { }) } - public async getLikes ({ params, response }: HttpContextContract) { - const post = await Post.firstOrCreate({ - slug: params.slug - }, { - slug: params.slug, - likes: 0 - }) + public async update ({ request, params, response }: HttpContextContract) { + const post = await Post.findOrFail(params.id) + const data = await request.validate(PostUpdateValidator) + await post.merge(data).save() + await post.related('tags').sync(data.tags!) return response.status(200).send({ - likes: post.likes + post + }) + } + + public async destroy ({ response, params }: HttpContextContract) { + const post = await Post.findOrFail(params.id) + await post.delete() + return response.status(200).send({ + message: 'Post successfully deleted!' }) } diff --git a/app/Validators/post/PostUpdateValidator.ts b/app/Validators/post/PostUpdateValidator.ts new file mode 100644 index 0000000..9dec108 --- /dev/null +++ b/app/Validators/post/PostUpdateValidator.ts @@ -0,0 +1,17 @@ +import {schema} from '@ioc:Adonis/Core/Validator' +import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext' + +export default class PostUpdateValidator { + + public schema = schema.create({ + slug: schema.string.optional(), + likes: schema.number.optional(), + tags: schema.array.optional().members(schema.string()) + }) + public messages = { + required: 'The field {{field}} is required' + } + + constructor (protected ctx: HttpContextContract) { + } +} diff --git a/start/routes/artsite.ts b/start/routes/artsite.ts index 1be9817..56bd80b 100644 --- a/start/routes/artsite.ts +++ b/start/routes/artsite.ts @@ -20,11 +20,9 @@ Route.group(() => { Route.resource('/informations', 'InformationsController').only(['index', 'update']) Route.group(() => { - Route.get('/:slug/likes', 'PostsController.getLikes') + Route.resource('/', 'PostsController').only(['index', 'show', 'destroy']) Route.post('/:slug/like', 'PostsController.like') Route.post('/:slug/unlike', 'PostsController.unlike') - Route.get('/', 'PostsController.index') - Route.get('/:slug', 'PostsController.show') }).prefix('/posts') Route.resource('/subscribers', 'SubscribersController').only(['index', 'store', 'destroy'])