From 2c4a7c0ddad0763d3c916a8553ab5ed089473b43 Mon Sep 17 00:00:00 2001 From: Arthur DANJOU Date: Mon, 16 Aug 2021 22:38:58 +0200 Subject: [PATCH] Added Tags --- app/Controllers/Http/TagsController.ts | 58 +++++++++++++++++++++++ app/Models/Tag.ts | 21 ++++++++ app/Validators/tag/TagStoreValidator.ts | 15 ++++++ app/Validators/tag/TagUpdateValidator.ts | 15 ++++++ database/migrations/1629146001824_tags.ts | 21 ++++++++ 5 files changed, 130 insertions(+) create mode 100644 app/Controllers/Http/TagsController.ts create mode 100644 app/Models/Tag.ts create mode 100644 app/Validators/tag/TagStoreValidator.ts create mode 100644 app/Validators/tag/TagUpdateValidator.ts create mode 100644 database/migrations/1629146001824_tags.ts diff --git a/app/Controllers/Http/TagsController.ts b/app/Controllers/Http/TagsController.ts new file mode 100644 index 0000000..6b12d0f --- /dev/null +++ b/app/Controllers/Http/TagsController.ts @@ -0,0 +1,58 @@ +import {HttpContextContract} from "@ioc:Adonis/Core/HttpContext"; +import getTranslation from "App/Tasks/getTranslation"; +import TagStoreValidator from "App/Validators/tag/TagStoreValidator"; +import TagUpdateValidator from "App/Validators/tag/TagUpdateValidator"; +import Tag from "App/Models/Tag"; + +export default class TagsController { + + public async index ({ response }: HttpContextContract) { + const tags = await Tag + .query() + .preload('label') + return response.status(200).send({ + tags: tags + }) + } + + public async store ({ request, response }: HttpContextContract) { + const data = await request.validate(TagStoreValidator) + const tag = await Tag.create({}) + + await tag.related('label').associate(await getTranslation(data.label)) + + return response.status(200).send({ + tag: tag + }) + } + + public async show ({ params, response }: HttpContextContract) { + const tag = await Tag.findOrFail(params.id) + tag.load('label') + return response.status(200).send({ + tag + }) + } + + public async update ({ request, params, response }: HttpContextContract) { + const data = await request.validate(TagUpdateValidator) + const tag = await Tag.findOrFail(params.id) + + if (data.label) { + await tag.related('label').associate(await getTranslation(data.label)) + } + + return response.status(200).send({ + tag + }) + } + + public async destroy ({ response, params }: HttpContextContract) { + const tag = await Tag.findOrFail(params.id) + await tag.delete() + return response.status(200).send({ + message: 'Tag successfully deleted!' + }) + } + +} diff --git a/app/Models/Tag.ts b/app/Models/Tag.ts new file mode 100644 index 0000000..1e27f59 --- /dev/null +++ b/app/Models/Tag.ts @@ -0,0 +1,21 @@ +import { DateTime } from 'luxon' +import {BaseModel, BelongsTo, belongsTo, column} from '@ioc:Adonis/Lucid/Orm' +import Translation from "App/Models/Translation"; + +export default class Tag extends BaseModel { + @column({ isPrimary: true }) + public id: number + + @belongsTo(() => Translation, { + foreignKey: 'labelId' + }) + public label: BelongsTo + + public labelId: number + + @column.dateTime({ autoCreate: true }) + public createdAt: DateTime + + @column.dateTime({ autoCreate: true, autoUpdate: true }) + public updatedAt: DateTime +} diff --git a/app/Validators/tag/TagStoreValidator.ts b/app/Validators/tag/TagStoreValidator.ts new file mode 100644 index 0000000..1551d36 --- /dev/null +++ b/app/Validators/tag/TagStoreValidator.ts @@ -0,0 +1,15 @@ +import { schema } from '@ioc:Adonis/Core/Validator' +import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext' + +export default class TagStoreValidator { + constructor (protected ctx: HttpContextContract) { + } + + public schema = schema.create({ + label: schema.string() + }) + + public messages = { + required: 'The field {{field}} is required', + } +} diff --git a/app/Validators/tag/TagUpdateValidator.ts b/app/Validators/tag/TagUpdateValidator.ts new file mode 100644 index 0000000..f9a9d17 --- /dev/null +++ b/app/Validators/tag/TagUpdateValidator.ts @@ -0,0 +1,15 @@ +import { schema } from '@ioc:Adonis/Core/Validator' +import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext' + +export default class TagUpdateValidator { + constructor (protected ctx: HttpContextContract) { + } + + public schema = schema.create({ + label: schema.string.optional() + }) + + public messages = { + required: 'The field {{field}} is required', + } +} diff --git a/database/migrations/1629146001824_tags.ts b/database/migrations/1629146001824_tags.ts new file mode 100644 index 0000000..da82622 --- /dev/null +++ b/database/migrations/1629146001824_tags.ts @@ -0,0 +1,21 @@ +import BaseSchema from '@ioc:Adonis/Lucid/Schema' + +export default class Tags extends BaseSchema { + protected tableName = 'tags' + + public async up () { + this.schema.createTable(this.tableName, (table) => { + table.increments('id').primary() + table + .integer('label_id') + .unsigned() + .references('translations.id') + .onDelete('CASCADE') + table.timestamps(true, true) + }) + } + + public async down () { + this.schema.dropTable(this.tableName) + } +}