mirror of
https://github.com/ArthurDanjou/artdanj-shortener.git
synced 2026-01-14 15:54:08 +01:00
Working on new features
This commit is contained in:
@@ -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 })
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user