diff --git a/app/Controllers/Http/AnnouncesController.ts b/app/Controllers/Http/AnnouncesController.ts index edf602c..9820ca5 100644 --- a/app/Controllers/Http/AnnouncesController.ts +++ b/app/Controllers/Http/AnnouncesController.ts @@ -43,7 +43,7 @@ export default class AnnouncesController { }) } - public async update({ request, params, response }: HttpContextContract) { + public async update ({ request, params, response }: HttpContextContract) { const data = await request.validate(AnnounceUpdateValidator) const announce = await Announce.findOrFail(params.id) @@ -54,6 +54,7 @@ export default class AnnouncesController { const cover = await File.findBy('label', data.cover) if (cover) await announce.related('file').associate(cover) + await announce.merge(data).save() return response.status(200).send({ announce diff --git a/app/Controllers/Http/SkillsController.ts b/app/Controllers/Http/SkillsController.ts new file mode 100644 index 0000000..beb0488 --- /dev/null +++ b/app/Controllers/Http/SkillsController.ts @@ -0,0 +1,59 @@ +import {HttpContextContract} from "@ioc:Adonis/Core/HttpContext"; +import File from "App/Models/File"; +import Skill from "App/Models/Skill"; +import SkillStoreValidator from "App/Validators/skill/SkillStoreValidator"; +import SkillUpdateValidator from "App/Validators/skill/SkillUpdateValidator"; + +export default class SkillsController { + + public async index ({ response }: HttpContextContract) { + const skills = await Skill + .query() + .preload('file') + return response.status(200).send({ + skills: skills + }) + } + + public async store ({ request, response }: HttpContextContract) { + const data = await request.validate(SkillStoreValidator) + const skill = await Skill.create(data) + + const cover = await File.findBy('label', data.cover) + if (cover) await skill.related('file').associate(cover) + + return response.status(200).send({ + skill: skill + }) + } + + public async show ({ params, response }: HttpContextContract) { + const skill = await Skill.findOrFail(params.id) + skill.load('file') + return response.status(200).send({ + skill + }) + } + + public async update ({ request, params, response }: HttpContextContract) { + const data = await request.validate(SkillUpdateValidator) + const skill = await Skill.findOrFail(params.id) + + const cover = await File.findBy('label', data.cover) + if (cover) await skill.related('file').associate(cover) + await skill.merge(data).save() + + return response.status(200).send({ + skill + }) + } + + public async destroy ({ response, params }: HttpContextContract) { + const skill = await Skill.findOrFail(params.id) + await skill.delete() + return response.status(200).send({ + message: 'Skill successfully deleted!' + }) + } + +} diff --git a/app/Models/Skill.ts b/app/Models/Skill.ts new file mode 100644 index 0000000..d689bb4 --- /dev/null +++ b/app/Models/Skill.ts @@ -0,0 +1,23 @@ +import { DateTime } from 'luxon' +import {BaseModel, BelongsTo, belongsTo, column} from '@ioc:Adonis/Lucid/Orm' +import File from "App/Models/File"; + +export default class Skill extends BaseModel { + @column({ isPrimary: true }) + public id: number + + @column() + public name: string + + @belongsTo(() => File) + public file: BelongsTo + + @column() + public fileId: number + + @column.dateTime({ autoCreate: true }) + public createdAt: DateTime + + @column.dateTime({ autoCreate: true, autoUpdate: true }) + public updatedAt: DateTime +} diff --git a/app/Validators/skill/SkillStoreValidator.ts b/app/Validators/skill/SkillStoreValidator.ts new file mode 100644 index 0000000..c58907d --- /dev/null +++ b/app/Validators/skill/SkillStoreValidator.ts @@ -0,0 +1,15 @@ +import { schema } from '@ioc:Adonis/Core/Validator' +import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext' + +export default class SkillStoreValidator { + constructor (protected ctx: HttpContextContract) { + } + + public schema = schema.create({ + name: schema.string(), + cover: schema.string(), + }) + public messages = { + required: 'The field {{field}} is required' + } +} diff --git a/app/Validators/skill/SkillUpdateValidator.ts b/app/Validators/skill/SkillUpdateValidator.ts new file mode 100644 index 0000000..5454ef6 --- /dev/null +++ b/app/Validators/skill/SkillUpdateValidator.ts @@ -0,0 +1,16 @@ +import { schema } from '@ioc:Adonis/Core/Validator' +import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext' + +export default class SkillUpdateValidator { + constructor (protected ctx: HttpContextContract) { + } + + public schema = schema.create({ + name: schema.string.optional(), + cover: schema.string.optional(), + }) + + public messages = { + required: 'The field {{field}} is required' + } +} diff --git a/database/migrations/1628936238073_skills.ts b/database/migrations/1628936238073_skills.ts new file mode 100644 index 0000000..3e54d20 --- /dev/null +++ b/database/migrations/1628936238073_skills.ts @@ -0,0 +1,22 @@ +import BaseSchema from '@ioc:Adonis/Lucid/Schema' + +export default class Skills extends BaseSchema { + protected tableName = 'skills' + + public async up () { + this.schema.createTable(this.tableName, (table) => { + table.increments('id') + table.string('name') + table + .integer('file_id') + .unsigned() + .references('files.id') + .onDelete('CASCADE') + table.timestamps(true, true) + }) + } + + public async down () { + this.schema.dropTable(this.tableName) + } +} diff --git a/start/routes/artsite.ts b/start/routes/artsite.ts index ecb861c..077e33a 100644 --- a/start/routes/artsite.ts +++ b/start/routes/artsite.ts @@ -5,6 +5,8 @@ Route.group(() => { Route.resource('/announces', 'AnnouncesController').except(['edit', 'create']) + Route.resource('/skills', 'SkillsController').except(['edit', 'create']) + Route.resource('/projects', 'ProjectsController').except(['edit', 'create']) Route.resource('/profile', 'ProfilesController').only(['index', 'update'])