diff --git a/app/Controllers/Http/PostColorsController.ts b/app/Controllers/Http/PostColorsController.ts new file mode 100644 index 0000000..b9cc49d --- /dev/null +++ b/app/Controllers/Http/PostColorsController.ts @@ -0,0 +1,46 @@ +import {HttpContextContract} from "@ioc:Adonis/Core/HttpContext"; +import PostColor from "App/Models/PostColor"; +import PostColorStoreValidator from "App/Validators/postColor/PostColorStoreValidator"; +import PostColorUpdateValidator from "App/Validators/postColor/PostColorUpdateValidator"; + +export default class PostColorsController { + + public async index ({ response }: HttpContextContract) { + return response.status(200).send({ + users: await PostColor.all() + }) + } + + public async store ({ request, response }: HttpContextContract) { + const data = await request.validate(PostColorStoreValidator) + const postColor = await PostColor.create(data) + return response.status(200).send({ + postColor + }) + } + + public async show ({ params, response }: HttpContextContract) { + const postColor = await PostColor.findOrFail(params.id) + return response.status(200).send({ + postColor + }) + } + + public async update ({ request, params, response }: HttpContextContract) { + const data = await request.validate(PostColorUpdateValidator) + const postColor = await PostColor.findOrFail(params.id) + await postColor.merge(data).save() + return response.status(200).send({ + postColor + }) + } + + public async destroy ({ response, params }: HttpContextContract) { + const postColor = await PostColor.findOrFail(params.id) + await postColor.delete() + return response.status(200).send({ + message: 'PostColor successfully deleted!' + }) + } + +} diff --git a/app/Controllers/Http/PostsController.ts b/app/Controllers/Http/PostsController.ts index 9eaa25e..31aa93c 100755 --- a/app/Controllers/Http/PostsController.ts +++ b/app/Controllers/Http/PostsController.ts @@ -4,6 +4,7 @@ import PostUpdateValidator from "App/Validators/post/PostUpdateValidator"; import getTranslation from "App/Utils/getTranslation"; import File from "App/Models/File"; import PostStoreValidator from "App/Validators/post/PostStoreValidator"; +import PostColor from "App/Models/PostColor"; export default class PostsController { @@ -15,6 +16,8 @@ export default class PostsController { tags.preload('label') }) .preload('cover') + .preload('color') + .preload('content') .preload('title') .preload('description') }) @@ -23,12 +26,19 @@ export default class PostsController { public async store ({ request, response }: HttpContextContract) { const data = await request.validate(PostStoreValidator) const post = await Post.create(data) + const cover = await File.findByOrFail('label', data.cover) + const color = await PostColor.findByOrFail('name', data.color) await post.related('cover').associate(cover) + await post.related('color').associate(color) + await post.related('description').associate(await getTranslation(data.description)) await post.related('title').associate(await getTranslation(data.title)) + await post.related('content').associate(await getTranslation(data.content)) + await post.related('tags').sync(data.tags!) + return response.status(200).send({ post }) @@ -39,6 +49,8 @@ export default class PostsController { await post.load('cover') await post.load('title') await post.load('description') + await post.load('content') + await post.load('color') await post.load('tags', (tags) => { tags.preload('label') }) @@ -60,6 +72,8 @@ export default class PostsController { await post.load('cover') await post.load('description') await post.load('title') + await post.load('content') + await post.load('color') return response.status(200).send({ post }) @@ -70,12 +84,18 @@ export default class PostsController { const data = await request.validate(PostUpdateValidator) await post.merge(data).save() + await post.related('tags').sync(data.tags!) await post.related('description').associate(await getTranslation(data.description!)) await post.related('title').associate(await getTranslation(data.title!)) + await post.related('content').associate(await getTranslation(data.content!)) const cover = await File.findBy('label', data.cover) if (cover) await post.related('cover').associate(cover) + + const color = await PostColor.findBy('name', data.color) + if (color) await post.related('color').associate(color) + return response.status(200).send({ post }) diff --git a/app/Models/Post.ts b/app/Models/Post.ts index 2fac1d4..316b8f7 100755 --- a/app/Models/Post.ts +++ b/app/Models/Post.ts @@ -3,6 +3,7 @@ import {BaseModel, BelongsTo, belongsTo, column, manyToMany, ManyToMany} from '@ import Tag from "App/Models/Tag"; import Translation from "App/Models/Translation"; import File from "App/Models/File"; +import PostColor from "App/Models/PostColor"; export default class Post extends BaseModel { @column({ isPrimary: true }) @@ -49,6 +50,14 @@ export default class Post extends BaseModel { @column() public contentId: number + @belongsTo(() => PostColor, { + foreignKey: 'postColorId' + }) + public color: BelongsTo + + @column() + public postColorId: number + @column() public readingTime: number diff --git a/app/Models/PostColor.ts b/app/Models/PostColor.ts new file mode 100644 index 0000000..95c540b --- /dev/null +++ b/app/Models/PostColor.ts @@ -0,0 +1,19 @@ +import { DateTime } from 'luxon' +import { BaseModel, column } from '@ioc:Adonis/Lucid/Orm' + +export default class PostColor extends BaseModel { + @column({ isPrimary: true }) + public id: number + + @column() + public name: string + + @column() + public color: string + + @column.dateTime({ autoCreate: true }) + public createdAt: DateTime + + @column.dateTime({ autoCreate: true, autoUpdate: true }) + public updatedAt: DateTime +} diff --git a/app/Validators/post/PostStoreValidator.ts b/app/Validators/post/PostStoreValidator.ts index 99fe1b6..4c329b4 100644 --- a/app/Validators/post/PostStoreValidator.ts +++ b/app/Validators/post/PostStoreValidator.ts @@ -12,6 +12,8 @@ export default class PostStoreValidator { cover: schema.string(), readingTime: schema.number(), date: schema.string(), + color: schema.string(), + content: schema.string() }) public messages = { required: 'The field {{field}} is required' diff --git a/app/Validators/post/PostUpdateValidator.ts b/app/Validators/post/PostUpdateValidator.ts index 7a0fcb2..3b4fb6c 100644 --- a/app/Validators/post/PostUpdateValidator.ts +++ b/app/Validators/post/PostUpdateValidator.ts @@ -12,6 +12,8 @@ export default class PostUpdateValidator { cover: schema.string.optional(), readingTime: schema.number.optional(), date: schema.string.optional(), + color: schema.string.optional(), + content: schema.string.optional() }) public messages = { required: 'The field {{field}} is required' diff --git a/app/Validators/postColor/PostColorStoreValidator.ts b/app/Validators/postColor/PostColorStoreValidator.ts new file mode 100755 index 0000000..6b15449 --- /dev/null +++ b/app/Validators/postColor/PostColorStoreValidator.ts @@ -0,0 +1,16 @@ +import {schema} from '@ioc:Adonis/Core/Validator' +import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext' + +export default class PostColorStoreValidator { + constructor (protected ctx: HttpContextContract) { + } + + public schema = schema.create({ + name: schema.string(), + color: schema.string() + }) + + public messages = { + required: 'The field {{field}} is required' + } +} diff --git a/app/Validators/postColor/PostColorUpdateValidator.ts b/app/Validators/postColor/PostColorUpdateValidator.ts new file mode 100644 index 0000000..7d79bb7 --- /dev/null +++ b/app/Validators/postColor/PostColorUpdateValidator.ts @@ -0,0 +1,16 @@ +import {schema} from '@ioc:Adonis/Core/Validator' +import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext' + +export default class PostColorUpdateValidator { + public schema = schema.create({ + name: schema.string.optional(), + color: schema.string.optional() + }) + + public messages = { + required: 'The field {{field}} is required' + } + + constructor (protected ctx: HttpContextContract) { + } +} diff --git a/database/migrations/1629148762478_posts.ts b/database/migrations/1629148762478_posts.ts index 205be3b..98353ac 100644 --- a/database/migrations/1629148762478_posts.ts +++ b/database/migrations/1629148762478_posts.ts @@ -30,6 +30,11 @@ export default class Posts extends BaseSchema { .unsigned() .references('translations.id') .onDelete('CASCADE') + table + .integer('post_color_id') + .unsigned() + .references('post_colors.id') + .onDelete('CASCADE') table.timestamps(true, true) }) } diff --git a/database/migrations/1629722224211_maintenances.ts b/database/migrations/1629722224211_maintenances.ts index 65312e6..83f02e1 100644 --- a/database/migrations/1629722224211_maintenances.ts +++ b/database/migrations/1629722224211_maintenances.ts @@ -5,7 +5,7 @@ export default class Maintenances extends BaseSchema { public async up () { this.schema.createTable(this.tableName, (table) => { - table.increments('id') + table.increments('id').primary() table.boolean('active').defaultTo(false).notNullable() table .integer('reason_id') diff --git a/database/migrations/1630182451186_post_colors.ts b/database/migrations/1630182451186_post_colors.ts new file mode 100644 index 0000000..260dfed --- /dev/null +++ b/database/migrations/1630182451186_post_colors.ts @@ -0,0 +1,18 @@ +import BaseSchema from '@ioc:Adonis/Lucid/Schema' + +export default class PostColors extends BaseSchema { + protected tableName = 'post_colors' + + public async up () { + this.schema.createTable(this.tableName, (table) => { + table.increments('id').primary() + table.string('name').notNullable() + table.string('color').notNullable() + 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 02f29af..c7afeb8 100644 --- a/start/routes/artsite.ts +++ b/start/routes/artsite.ts @@ -7,6 +7,8 @@ Route.group(() => { Route.resource('/maintenance', 'MaintenancesController').only(['index', 'update']) + Route.resource('/colors', 'PostColorsController').only(['index', 'update']) + Route.resource('/experiences', 'ExperiencesController').except(['edit', 'create']) Route.resource('/formations', 'FormationsController').except(['edit', 'create'])