diff --git a/app/Controllers/Http/PostsController.ts b/app/Controllers/Http/PostsController.ts new file mode 100644 index 0000000..7e190f7 --- /dev/null +++ b/app/Controllers/Http/PostsController.ts @@ -0,0 +1,74 @@ +import Post from "App/Models/Post"; +import {HttpContextContract} from "@ioc:Adonis/Core/HttpContext"; +import Redis from "@ioc:Adonis/Addons/Redis"; + +export default class PostsController { + + public async getLikes ({params}: HttpContextContract) { + let post = await Post.findBy('slug', params.slug) + + if (!post) { + post = await Post.create({ + slug: params.slug, + likes: 0 + }) + } + + return post.likes + } + + public async unlike ({request, params}: HttpContextContract) { + const post = await Post.findByOrFail('slug', params.slug) + const ip = await request.ip() + + const getLikes = post.likes - 1 + const isLiked = await Redis.exists(`posts:${post.slug}/${ip}`) + + if (isLiked) { + await Redis.del(`posts:${post.slug}/${ip}`) + await post.merge({ + likes: getLikes + }).save() + return { + code: 200, + post + } + } + } + + public async isLiked ({params, request}: HttpContextContract) { + const post = await Post.findBy('slug', params.slug) + if (post) { + const ip = request.ip() + return Redis.exists(`posts:${post.slug}/${ip}`); + } + return false + } + + public async like ({request, params}: HttpContextContract) { + let post = await Post.findBy('slug', params.slug) + const ip = await request.ip() + + if (!post) { + post = await Post.create({ + slug: params.slug, + likes: 0 + }) + } + + const getLikes = post.likes + 1 + const isLiked = await Redis.exists(`posts:${post.slug}/${ip}`) + + if (!isLiked) { + await Redis.set(`posts:${post.slug}/${ip}`, Date.now()) + await post.merge({ + likes: getLikes + }).save() + return { + code: 200, + post + } + } + } + +} diff --git a/start/routes.ts b/start/routes.ts index e87fdf6..da70ead 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -71,3 +71,11 @@ Route.group(() => { Route.post('/api/login', 'AuthController.loginApi') Route.post('/api/logout', 'AuthController.logoutApi') }).prefix('auth') + +// ArtSite +Route.group(() => { + Route.get('/:slug', 'PostsController.getLikes') + Route.get('/is/:slug', 'PostsController.isLiked') + Route.post('/:slug/like', 'PostsController.like') + Route.post('/:slug/unlike', 'PostsController.unlike') +}).prefix('posts')