170 lines
5.6 KiB
JavaScript
170 lines
5.6 KiB
JavaScript
import Project from '#models/project';
|
|
import Category from '#models/category';
|
|
import Tag from '#models/tag';
|
|
import Training from '#models/training';
|
|
import Image from '#models/image';
|
|
import Experience from '#models/experience';
|
|
import { DateTime } from 'luxon';
|
|
export default class ProjectsController {
|
|
async index({ view }) {
|
|
const projects = await Project.query().preload('category').orderBy('start', 'asc');
|
|
return view.render('admin/projects/index', { projects });
|
|
}
|
|
async create({ view }) {
|
|
const [categories, tags, trainings, images, experiences] = await Promise.all([
|
|
Category.all(),
|
|
Tag.query().orderBy('name', 'asc'),
|
|
Training.all(),
|
|
Image.all(),
|
|
Experience.all(),
|
|
]);
|
|
return view.render('admin/projects/form', {
|
|
project: null,
|
|
categories,
|
|
tags,
|
|
trainings,
|
|
images,
|
|
experiences,
|
|
});
|
|
}
|
|
async store({ request, response }) {
|
|
const body = request.only([
|
|
'title',
|
|
'content',
|
|
'start',
|
|
'end',
|
|
'thumbnailUrl',
|
|
'categoryId',
|
|
'tagIds',
|
|
'trainingIds',
|
|
'experienceIds',
|
|
]);
|
|
let start = null;
|
|
if (body.start) {
|
|
const parsed = DateTime.fromISO(body.start);
|
|
if (parsed.isValid)
|
|
start = parsed;
|
|
}
|
|
let end = null;
|
|
if (body.end) {
|
|
const parsed = DateTime.fromISO(body.end);
|
|
if (parsed.isValid)
|
|
end = parsed;
|
|
}
|
|
const project = await Project.create({
|
|
title: body.title,
|
|
content: body.content || null,
|
|
start,
|
|
end,
|
|
thumbnailUrl: body.thumbnailUrl || null,
|
|
categoryId: body.categoryId ? Number(body.categoryId) : null,
|
|
});
|
|
const tagIds = Array.isArray(body.tagIds) ? body.tagIds : body.tagIds ? [body.tagIds] : [];
|
|
const trainingIds = Array.isArray(body.trainingIds)
|
|
? body.trainingIds
|
|
: body.trainingIds
|
|
? [body.trainingIds]
|
|
: [];
|
|
const experienceIds = Array.isArray(body.experienceIds)
|
|
? body.experienceIds
|
|
: body.experienceIds
|
|
? [body.experienceIds]
|
|
: [];
|
|
if (tagIds.length)
|
|
await project.related('tags').attach(tagIds.map(Number));
|
|
if (trainingIds.length)
|
|
await project.related('trainings').attach(trainingIds.map(Number));
|
|
if (experienceIds.length)
|
|
await project.related('experiences').attach(experienceIds.map(Number));
|
|
return response.redirect('/admin/projects');
|
|
}
|
|
async edit({ view, params, response }) {
|
|
const project = await Project.query()
|
|
.where('id', params.id)
|
|
.preload('tags')
|
|
.preload('trainings')
|
|
.preload('experiences')
|
|
.first();
|
|
if (!project) {
|
|
return response.notFound();
|
|
}
|
|
const [categories, tags, trainings, images, experiences] = await Promise.all([
|
|
Category.all(),
|
|
Tag.query().orderBy('name', 'asc'),
|
|
Training.all(),
|
|
Image.all(),
|
|
Experience.all(),
|
|
]);
|
|
return view.render('admin/projects/form', {
|
|
project,
|
|
categories,
|
|
tags,
|
|
trainings,
|
|
images,
|
|
experiences,
|
|
});
|
|
}
|
|
async update({ request, params, response }) {
|
|
const project = await Project.find(params.id);
|
|
if (!project) {
|
|
return response.notFound();
|
|
}
|
|
const body = request.only([
|
|
'title',
|
|
'content',
|
|
'start',
|
|
'end',
|
|
'thumbnailUrl',
|
|
'categoryId',
|
|
'tagIds',
|
|
'trainingIds',
|
|
'experienceIds',
|
|
]);
|
|
let start = null;
|
|
if (body.start) {
|
|
const parsed = DateTime.fromISO(body.start);
|
|
if (parsed.isValid)
|
|
start = parsed;
|
|
}
|
|
let end = null;
|
|
if (body.end) {
|
|
const parsed = DateTime.fromISO(body.end);
|
|
if (parsed.isValid)
|
|
end = parsed;
|
|
}
|
|
await project
|
|
.merge({
|
|
title: body.title,
|
|
content: body.content || null,
|
|
start,
|
|
end,
|
|
thumbnailUrl: body.thumbnailUrl || null,
|
|
categoryId: body.categoryId ? Number(body.categoryId) : null,
|
|
})
|
|
.save();
|
|
const tagIds = Array.isArray(body.tagIds) ? body.tagIds : body.tagIds ? [body.tagIds] : [];
|
|
const trainingIds = Array.isArray(body.trainingIds)
|
|
? body.trainingIds
|
|
: body.trainingIds
|
|
? [body.trainingIds]
|
|
: [];
|
|
const experienceIds = Array.isArray(body.experienceIds)
|
|
? body.experienceIds
|
|
: body.experienceIds
|
|
? [body.experienceIds]
|
|
: [];
|
|
await project.related('tags').sync(tagIds.map(Number));
|
|
await project.related('trainings').sync(trainingIds.map(Number));
|
|
await project.related('experiences').sync(experienceIds.map(Number));
|
|
return response.redirect('/admin/projects');
|
|
}
|
|
async destroy({ params, response }) {
|
|
const project = await Project.find(params.id);
|
|
if (!project) {
|
|
return response.notFound();
|
|
}
|
|
await project.delete();
|
|
return response.redirect('/admin/projects');
|
|
}
|
|
}
|
|
//# sourceMappingURL=projects_controller.js.map
|