diff --git a/app/Controllers/Http/LinksController.ts b/app/Controllers/Http/LinksController.ts index 87feed6..4038975 100755 --- a/app/Controllers/Http/LinksController.ts +++ b/app/Controllers/Http/LinksController.ts @@ -1,76 +1,115 @@ -import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext' -import StoreValidator from "App/Validators/StoreValidator"; -import UpdateValidator from "App/Validators/UpdateValidator"; +import { HttpContextContract} from '@ioc:Adonis/Core/HttpContext' import Link from "App/Models/Link"; +import Redis from "@ioc:Adonis/Addons/Redis"; +import Click from "App/Models/Click"; +import {DateTime} from "luxon"; +import LinkUpdateValidator from "App/Validators/links/LinkUpdateValidator"; +import LinkStoreValidator from "App/Validators/links/LinkStoreValidator"; export default class LinksController { - public async getLink ({params, response, i18n}: HttpContextContract) { + public async visit ({ request, params, response, i18n }: HttpContextContract) { const code = params.id - const link = await Link.findByOrFail('code', code) + const link = await Link.findBy('code', code) + + if (!link) { + return response.status(404).send({ + message: i18n.formatMessage('messages.no_exists', { code: code }) + }) + } + + if (request.input('json') == '') { + await link.load('author', (query) => { + query.select('email') + }) + return response.status(200).send({ + link + }) + } if (link.code === code) { - let visitCount = link.visitCount + 1 - await link.merge({ - visitCount: visitCount - }).save() - return response.status(200).redirect(link.target) + const ip = request.ip() + + if (link.type === 'TEMPORARY' && link.expire! <= DateTime.now()) { + await link.related('author').dissociate() + await link.delete() + return response.status(404).send({ + message: i18n.formatMessage('messages.no_exists', { code: code }) + }) + } + + const exist = await Redis.get(`${link.code}:${ip}:tracked`) + if (!exist) { + await Redis.set(`${link.code}:${ip}:tracked`, 'true', 'ex', '3600') + const click = await Click.create({ + date: DateTime.now(), + ip, + country: '' + }) + await click.related('link').associate(link) + await link.related('clicks').save(click) + } + return response.redirect(link.target) } - return response.status(404).send({ - message: i18n.formatMessage('messages.no_exists', { code: code }) - }) } - public async getAllLinks ({response}: HttpContextContract) { - const links = await Link.query().orderBy('id', 'asc') + public async index ({ response }: HttpContextContract) { + const links = await Link + .query() + .orderBy('id', 'asc') + .preload('author', (query) => { + query.select('email') + }) return response.status(200).send({ links }) } - public async getVisitCount ({params, response, i18n}: HttpContextContract) { + public async getCount ({ params, response, i18n }: HttpContextContract) { const code = params.id - const link = await Link.findByOrFail('code', code) + const link = await Link.findBy('code', code) - //Check if code exists - if (link.code === code) { - return response.status(200).send({ - count: link.visitCount + if (!link) { + return response.status(404).send({ + message: i18n.formatMessage('messages.no_exists', { code: code }) + }) + } + + if (link.code === code) { + return response.status(200).send({ + count: link.clicks.length }) } - return response.status(404).send({ - message: i18n.formatMessage('messages.no_exists', { code: code }) - }) } - public async createLink ({response, request, auth, i18n}: HttpContextContract) { + public async store ({ response, request, auth, i18n }: HttpContextContract) { await auth.authenticate() - const link = await Link.create(await request.validate(StoreValidator)) + const link = await Link.create(await request.validate(LinkStoreValidator)) + const user = await auth.user + await link.related('author').associate(user!) return response.status(200).send({ - message: i18n.formatMessage('messages.created', { link: link.code, target: link.target }) + message: i18n.formatMessage('messages.created', { link: link.code, target: link.target }) }) } - public async updateLink ({response, request, auth}: HttpContextContract) { + public async update ({ response, request, auth }: HttpContextContract) { await auth.authenticate() const link = await Link.findByOrFail('code', request.input('code')) - const data = await request.validate(UpdateValidator) - await link.merge({ - target: data.target, - visitCount: 0 - }).save() + const data = await request.validate(LinkUpdateValidator) + await link.merge(data).save() return response.status(200).send({ link }) } - public async deleteLink ({i18n, response, request, auth}: HttpContextContract) { + public async delete ({ i18n, response, request, auth }: HttpContextContract) { await auth.authenticate() const code = request.input('code') const link = await Link.findByOrFail('code', code) + await link.related('author').dissociate() await link.delete() return response.status(200).send({ - message: i18n.formatMessage('messages.deleted', { link: link.code }) + message: i18n.formatMessage('messages.deleted', { link: link.code }) }) }