Initial commit
This commit is contained in:
41
app/controllers/admin/auth_controller.js
Normal file
41
app/controllers/admin/auth_controller.js
Normal file
@@ -0,0 +1,41 @@
|
||||
import User from '#models/user';
|
||||
import env from '#start/env';
|
||||
export default class AuthController {
|
||||
async showLogin({ view }) {
|
||||
return view.render('admin/login');
|
||||
}
|
||||
async login({ request, response, auth, session }) {
|
||||
const { email, password } = request.only(['email', 'password']);
|
||||
if (email === env.get('USER_LOGIN') && password === env.get('USER_PASSWORD')) {
|
||||
let user = await User.findBy('email', email);
|
||||
if (!user) {
|
||||
user = await User.create({
|
||||
email,
|
||||
password,
|
||||
fullName: 'Admin',
|
||||
});
|
||||
}
|
||||
await auth.use('web').login(user);
|
||||
return response.redirect('/admin');
|
||||
}
|
||||
try {
|
||||
const user = await User.verifyCredentials(email, password);
|
||||
await auth.use('web').login(user);
|
||||
return response.redirect('/admin');
|
||||
}
|
||||
catch (error) {
|
||||
const isInvalidCredentials = error && typeof error === 'object' && 'code' in error && error.code === 'E_INVALID_CREDENTIALS';
|
||||
if (isInvalidCredentials) {
|
||||
session.flashExcept(['_csrf', '_method', 'password']);
|
||||
session.flashErrors({ error: 'Identifiants invalides. Vérifiez votre email et mot de passe.' });
|
||||
return response.redirect().back();
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
async logout({ response, auth }) {
|
||||
await auth.use('web').logout();
|
||||
return response.redirect('/admin/login');
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=auth_controller.js.map
|
||||
1
app/controllers/admin/auth_controller.js.map
Normal file
1
app/controllers/admin/auth_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"auth_controller.js","sourceRoot":"","sources":["../../../../app/controllers/admin/auth_controller.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,cAAc,CAAA;AAC/B,OAAO,GAAG,MAAM,YAAY,CAAA;AAE5B,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,EAAe;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAe;QAC3D,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAA;QAE/D,IAAI,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,QAAQ,KAAK,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YAC7E,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;oBACvB,KAAK;oBACL,QAAQ;oBACR,QAAQ,EAAE,OAAO;iBAClB,CAAC,CAAA;YACJ,CAAC;YAED,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACjC,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACpC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC1D,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACjC,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,oBAAoB,GACxB,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAK,KAA0B,CAAC,IAAI,KAAK,uBAAuB,CAAA;YAEvH,IAAI,oBAAoB,EAAE,CAAC;gBACzB,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAA;gBACrD,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,+DAA+D,EAAE,CAAC,CAAA;gBAC/F,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;YACnC,CAAC;YACD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAe;QAC1C,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAA;QAC9B,OAAO,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;IAC1C,CAAC;CACF"}
|
||||
116
app/controllers/admin/backup_controller.js
Normal file
116
app/controllers/admin/backup_controller.js
Normal file
@@ -0,0 +1,116 @@
|
||||
import db from '@adonisjs/lucid/services/db';
|
||||
import Project from '#models/project';
|
||||
import Category from '#models/category';
|
||||
import Tag from '#models/tag';
|
||||
import Training from '#models/training';
|
||||
import Experience from '#models/experience';
|
||||
import Music from '#models/music';
|
||||
import Information from '#models/information';
|
||||
import Image from '#models/image';
|
||||
import User from '#models/user';
|
||||
import fs from 'node:fs/promises';
|
||||
import { DateTime } from 'luxon';
|
||||
export default class BackupController {
|
||||
async index({ view }) {
|
||||
return view.render('admin/backup/index');
|
||||
}
|
||||
async export({ response }) {
|
||||
const data = {
|
||||
projects: await Project.all(),
|
||||
categories: await Category.all(),
|
||||
tags: await Tag.all(),
|
||||
trainings: await Training.all(),
|
||||
experiences: await Experience.all(),
|
||||
musics: await Music.all(),
|
||||
information: await Information.all(),
|
||||
images: await Image.all(),
|
||||
users: await User.all(),
|
||||
project_tags: await db.from('project_tag').select('*'),
|
||||
project_trainings: await db.from('project_training').select('*'),
|
||||
experience_project: await db.from('experience_project').select('*'),
|
||||
};
|
||||
const date = new Date().toISOString().split('T')[0];
|
||||
return response.header('Content-type', 'application/json')
|
||||
.header('Content-disposition', `attachment; filename=backup_${date}.json`)
|
||||
.send(data);
|
||||
}
|
||||
async import({ request, response, session }) {
|
||||
const file = request.file('backup_file', {
|
||||
extnames: ['json'],
|
||||
});
|
||||
if (!file) {
|
||||
session.flashErrors({ error: 'Please upload a JSON file.' });
|
||||
return response.redirect().back();
|
||||
}
|
||||
if (file.hasErrors) {
|
||||
session.flashErrors({ error: file.errors[0].message });
|
||||
return response.redirect().back();
|
||||
}
|
||||
try {
|
||||
const fileContent = await fs.readFile(file.tmpPath, 'utf-8');
|
||||
const data = JSON.parse(fileContent);
|
||||
await db.transaction(async (trx) => {
|
||||
await trx.rawQuery('PRAGMA foreign_keys = OFF;');
|
||||
await trx.from('project_tag').delete();
|
||||
await trx.from('project_training').delete();
|
||||
await trx.from('experience_project').delete();
|
||||
await trx.from('projects').delete();
|
||||
await trx.from('categories').delete();
|
||||
await trx.from('tags').delete();
|
||||
await trx.from('trainings').delete();
|
||||
await trx.from('experiences').delete();
|
||||
await trx.from('music').delete();
|
||||
await trx.from('information').delete();
|
||||
await trx.from('images').delete();
|
||||
await trx.from('users').delete();
|
||||
const toSnakeCase = (arr) => arr.map((item) => {
|
||||
const newItem = {};
|
||||
for (const key in item) {
|
||||
const snakeKey = key.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
|
||||
let val = item[key];
|
||||
if (typeof val === 'string' && val.includes('T')) {
|
||||
const parsed = DateTime.fromISO(val);
|
||||
if (parsed.isValid) {
|
||||
val = parsed.toFormat('yyyy-MM-dd HH:mm:ss');
|
||||
}
|
||||
}
|
||||
newItem[snakeKey] = val;
|
||||
}
|
||||
return newItem;
|
||||
});
|
||||
if (data.categories?.length)
|
||||
await trx.table('categories').multiInsert(toSnakeCase(data.categories));
|
||||
if (data.projects?.length)
|
||||
await trx.table('projects').multiInsert(toSnakeCase(data.projects));
|
||||
if (data.tags?.length)
|
||||
await trx.table('tags').multiInsert(toSnakeCase(data.tags));
|
||||
if (data.trainings?.length)
|
||||
await trx.table('trainings').multiInsert(toSnakeCase(data.trainings));
|
||||
if (data.experiences?.length)
|
||||
await trx.table('experiences').multiInsert(toSnakeCase(data.experiences));
|
||||
if (data.musics?.length)
|
||||
await trx.table('music').multiInsert(toSnakeCase(data.musics));
|
||||
if (data.information?.length)
|
||||
await trx.table('information').multiInsert(toSnakeCase(data.information));
|
||||
if (data.images?.length)
|
||||
await trx.table('images').multiInsert(toSnakeCase(data.images));
|
||||
if (data.users?.length)
|
||||
await trx.table('users').multiInsert(toSnakeCase(data.users));
|
||||
if (data.project_tags?.length)
|
||||
await trx.table('project_tag').multiInsert(data.project_tags);
|
||||
if (data.project_trainings?.length)
|
||||
await trx.table('project_training').multiInsert(data.project_trainings);
|
||||
if (data.experience_project?.length)
|
||||
await trx.table('experience_project').multiInsert(data.experience_project);
|
||||
await trx.rawQuery('PRAGMA foreign_keys = ON;');
|
||||
});
|
||||
session.flash({ success: 'Database restored successfully.' });
|
||||
}
|
||||
catch (error) {
|
||||
console.error(error);
|
||||
session.flashErrors({ error: 'Failed to import backup: ' + error.message });
|
||||
}
|
||||
return response.redirect().back();
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=backup_controller.js.map
|
||||
1
app/controllers/admin/backup_controller.js.map
Normal file
1
app/controllers/admin/backup_controller.js.map
Normal file
File diff suppressed because one or more lines are too long
40
app/controllers/admin/categories_controller.js
Normal file
40
app/controllers/admin/categories_controller.js
Normal file
@@ -0,0 +1,40 @@
|
||||
import Category from '#models/category';
|
||||
export default class CategoriesController {
|
||||
async index({ view }) {
|
||||
const categories = await Category.query().preload('projects');
|
||||
return view.render('admin/categories/index', { categories });
|
||||
}
|
||||
async create({ view }) {
|
||||
return view.render('admin/categories/form', { category: null });
|
||||
}
|
||||
async store({ request, response }) {
|
||||
const { name } = request.only(['name']);
|
||||
await Category.create({ name });
|
||||
return response.redirect('/admin/categories');
|
||||
}
|
||||
async edit({ view, params, response }) {
|
||||
const category = await Category.find(params.id);
|
||||
if (!category) {
|
||||
return response.notFound();
|
||||
}
|
||||
return view.render('admin/categories/form', { category });
|
||||
}
|
||||
async update({ request, params, response }) {
|
||||
const category = await Category.find(params.id);
|
||||
if (!category) {
|
||||
return response.notFound();
|
||||
}
|
||||
const { name } = request.only(['name']);
|
||||
await category.merge({ name }).save();
|
||||
return response.redirect('/admin/categories');
|
||||
}
|
||||
async destroy({ params, response }) {
|
||||
const category = await Category.find(params.id);
|
||||
if (!category) {
|
||||
return response.notFound();
|
||||
}
|
||||
await category.delete();
|
||||
return response.redirect('/admin/categories');
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=categories_controller.js.map
|
||||
1
app/controllers/admin/categories_controller.js.map
Normal file
1
app/controllers/admin/categories_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"categories_controller.js","sourceRoot":"","sources":["../../../../app/controllers/admin/categories_controller.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,kBAAkB,CAAA;AAEvC,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACvC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAe;QAC/B,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAC7D,OAAO,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAe;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACjE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAe;QAC5C,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;QACvC,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/B,OAAO,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAe;QAChD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAA;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC3D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAe;QACrD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAA;QAC5B,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;QACvC,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QACrC,OAAO,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAe;QAC7C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAA;QAC5B,CAAC;QACD,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAA;QACvB,OAAO,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAC/C,CAAC;CACF"}
|
||||
30
app/controllers/admin/dashboard_controller.js
Normal file
30
app/controllers/admin/dashboard_controller.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import Project from '#models/project';
|
||||
import Category from '#models/category';
|
||||
import Tag from '#models/tag';
|
||||
import Training from '#models/training';
|
||||
import Music from '#models/music';
|
||||
import Information from '#models/information';
|
||||
import Experience from '#models/experience';
|
||||
export default class DashboardController {
|
||||
async index({ view }) {
|
||||
const [projects, categories, tags, trainings, musics, experiences] = await Promise.all([
|
||||
Project.all(),
|
||||
Category.all(),
|
||||
Tag.all(),
|
||||
Training.all(),
|
||||
Music.all(),
|
||||
Experience.all(),
|
||||
]);
|
||||
const info = await Information.first();
|
||||
return view.render('admin/dashboard', {
|
||||
projectsCount: projects.length,
|
||||
categoriesCount: categories.length,
|
||||
tagsCount: tags.length,
|
||||
trainingsCount: trainings.length,
|
||||
musicsCount: musics.length,
|
||||
experiencesCount: experiences.length,
|
||||
hasInformation: !!info,
|
||||
});
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=dashboard_controller.js.map
|
||||
1
app/controllers/admin/dashboard_controller.js.map
Normal file
1
app/controllers/admin/dashboard_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"dashboard_controller.js","sourceRoot":"","sources":["../../../../app/controllers/admin/dashboard_controller.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,iBAAiB,CAAA;AACrC,OAAO,QAAQ,MAAM,kBAAkB,CAAA;AACvC,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,QAAQ,MAAM,kBAAkB,CAAA;AACvC,OAAO,KAAK,MAAM,eAAe,CAAA;AACjC,OAAO,WAAW,MAAM,qBAAqB,CAAA;AAC7C,OAAO,UAAU,MAAM,oBAAoB,CAAA;AAE3C,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACtC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAe;QAC/B,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACrF,OAAO,CAAC,GAAG,EAAE;YACb,QAAQ,CAAC,GAAG,EAAE;YACd,GAAG,CAAC,GAAG,EAAE;YACT,QAAQ,CAAC,GAAG,EAAE;YACd,KAAK,CAAC,GAAG,EAAE;YACX,UAAU,CAAC,GAAG,EAAE;SACjB,CAAC,CAAA;QACF,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,CAAA;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE;YACpC,aAAa,EAAE,QAAQ,CAAC,MAAM;YAC9B,eAAe,EAAE,UAAU,CAAC,MAAM;YAClC,SAAS,EAAE,IAAI,CAAC,MAAM;YACtB,cAAc,EAAE,SAAS,CAAC,MAAM;YAChC,WAAW,EAAE,MAAM,CAAC,MAAM;YAC1B,gBAAgB,EAAE,WAAW,CAAC,MAAM;YACpC,cAAc,EAAE,CAAC,CAAC,IAAI;SACvB,CAAC,CAAA;IACJ,CAAC;CACF"}
|
||||
67
app/controllers/admin/experiences_controller.js
Normal file
67
app/controllers/admin/experiences_controller.js
Normal file
@@ -0,0 +1,67 @@
|
||||
import Experience from '#models/experience';
|
||||
import { DateTime } from 'luxon';
|
||||
export default class ExperiencesController {
|
||||
async index({ view }) {
|
||||
const experiences = await Experience.query().orderBy('start', 'desc');
|
||||
return view.render('admin/experiences/index', { experiences });
|
||||
}
|
||||
async create({ view }) {
|
||||
return view.render('admin/experiences/form', { experience: null });
|
||||
}
|
||||
async store({ request, response }) {
|
||||
const { name, start, end, missions, place } = request.only([
|
||||
'name',
|
||||
'start',
|
||||
'end',
|
||||
'missions',
|
||||
'place',
|
||||
]);
|
||||
await Experience.create({
|
||||
name,
|
||||
start: DateTime.fromISO(start),
|
||||
end: end ? DateTime.fromISO(end) : null,
|
||||
missions: missions || null,
|
||||
place: place || null,
|
||||
});
|
||||
return response.redirect('/admin/experiences');
|
||||
}
|
||||
async edit({ view, params, response }) {
|
||||
const experience = await Experience.find(params.id);
|
||||
if (!experience) {
|
||||
return response.notFound();
|
||||
}
|
||||
return view.render('admin/experiences/form', { experience });
|
||||
}
|
||||
async update({ request, params, response }) {
|
||||
const experience = await Experience.find(params.id);
|
||||
if (!experience) {
|
||||
return response.notFound();
|
||||
}
|
||||
const { name, start, end, missions, place } = request.only([
|
||||
'name',
|
||||
'start',
|
||||
'end',
|
||||
'missions',
|
||||
'place',
|
||||
]);
|
||||
await experience
|
||||
.merge({
|
||||
name,
|
||||
start: DateTime.fromISO(start),
|
||||
end: end ? DateTime.fromISO(end) : null,
|
||||
missions: missions || null,
|
||||
place: place || null,
|
||||
})
|
||||
.save();
|
||||
return response.redirect('/admin/experiences');
|
||||
}
|
||||
async destroy({ params, response }) {
|
||||
const experience = await Experience.find(params.id);
|
||||
if (!experience) {
|
||||
return response.notFound();
|
||||
}
|
||||
await experience.delete();
|
||||
return response.redirect('/admin/experiences');
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=experiences_controller.js.map
|
||||
1
app/controllers/admin/experiences_controller.js.map
Normal file
1
app/controllers/admin/experiences_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"experiences_controller.js","sourceRoot":"","sources":["../../../../app/controllers/admin/experiences_controller.ts"],"names":[],"mappings":"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"}
|
||||
43
app/controllers/admin/images_controller.js
Normal file
43
app/controllers/admin/images_controller.js
Normal file
@@ -0,0 +1,43 @@
|
||||
import app from '@adonisjs/core/services/app';
|
||||
import Image from '#models/image';
|
||||
import fs from 'node:fs';
|
||||
export default class ImagesController {
|
||||
async index({ view }) {
|
||||
const images = await Image.query().orderBy('created_at', 'desc');
|
||||
return view.render('admin/images/index', { images });
|
||||
}
|
||||
async store({ request, response, session }) {
|
||||
const imageFile = request.file('image', {
|
||||
size: '5mb',
|
||||
extnames: ['jpg', 'png', 'jpeg', 'webp', 'gif'],
|
||||
});
|
||||
if (!imageFile) {
|
||||
session.flashErrors({ error: 'Please upload an image file.' });
|
||||
return response.redirect().back();
|
||||
}
|
||||
if (imageFile.hasErrors) {
|
||||
session.flashErrors({ error: imageFile.errors[0].message });
|
||||
return response.redirect().back();
|
||||
}
|
||||
await imageFile.move(app.makePath('public/uploads/images'));
|
||||
await Image.create({
|
||||
filePath: `/uploads/images/${imageFile.fileName}`,
|
||||
originalName: imageFile.clientName,
|
||||
mimeType: imageFile.type + '/' + imageFile.subtype,
|
||||
size: imageFile.size,
|
||||
});
|
||||
session.flash({ success: 'Image uploaded successfully.' });
|
||||
return response.redirect().back();
|
||||
}
|
||||
async destroy({ params, response, session }) {
|
||||
const image = await Image.findOrFail(params.id);
|
||||
const absolutePath = app.makePath('public' + image.filePath);
|
||||
if (fs.existsSync(absolutePath)) {
|
||||
fs.unlinkSync(absolutePath);
|
||||
}
|
||||
await image.delete();
|
||||
session.flash({ success: 'Image deleted successfully.' });
|
||||
return response.redirect().back();
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=images_controller.js.map
|
||||
1
app/controllers/admin/images_controller.js.map
Normal file
1
app/controllers/admin/images_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"images_controller.js","sourceRoot":"","sources":["../../../../app/controllers/admin/images_controller.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,6BAA6B,CAAA;AAC7C,OAAO,KAAK,MAAM,eAAe,CAAA;AACjC,OAAO,EAAE,MAAM,SAAS,CAAA;AAExB,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACjC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAe;QAC7B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;QAChE,OAAO,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IACxD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAe;QACnD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE;YACpC,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;SAClD,CAAC,CAAA;QAEF,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC,CAAA;YAC9D,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;QACrC,CAAC;QAED,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;YAC3D,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;QACrC,CAAC;QAED,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAA;QAE3D,MAAM,KAAK,CAAC,MAAM,CAAC;YACf,QAAQ,EAAE,mBAAmB,SAAS,CAAC,QAAQ,EAAE;YACjD,YAAY,EAAE,SAAS,CAAC,UAAU;YAClC,QAAQ,EAAE,SAAS,CAAC,IAAI,GAAG,GAAG,GAAG,SAAS,CAAC,OAAO;YAClD,IAAI,EAAE,SAAS,CAAC,IAAI;SACvB,CAAC,CAAA;QAEF,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAA;QAC1D,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAe;QACpD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAG/C,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;QAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;QAC/B,CAAC;QAED,MAAM,KAAK,CAAC,MAAM,EAAE,CAAA;QAEpB,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAA;QACzD,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;IACrC,CAAC;CACJ"}
|
||||
29
app/controllers/admin/information_controller.js
Normal file
29
app/controllers/admin/information_controller.js
Normal file
@@ -0,0 +1,29 @@
|
||||
import Information from '#models/information';
|
||||
import { DateTime } from 'luxon';
|
||||
export default class InformationController {
|
||||
async edit({ view }) {
|
||||
let info = await Information.first();
|
||||
if (!info) {
|
||||
info = await Information.create({
|
||||
name: '',
|
||||
headline: '',
|
||||
contact: '',
|
||||
linkedin: null,
|
||||
github: null,
|
||||
birthday: null,
|
||||
});
|
||||
}
|
||||
return view.render('admin/information/form', { information: info });
|
||||
}
|
||||
async update({ request, response }) {
|
||||
const info = await Information.first();
|
||||
if (!info) {
|
||||
return response.notFound();
|
||||
}
|
||||
const body = request.only(['name', 'headline', 'contact', 'linkedin', 'github', 'birthday']);
|
||||
const birthday = body.birthday ? DateTime.fromISO(body.birthday) : null;
|
||||
await info.merge({ ...body, birthday }).save();
|
||||
return response.redirect().back();
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=information_controller.js.map
|
||||
1
app/controllers/admin/information_controller.js.map
Normal file
1
app/controllers/admin/information_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"information_controller.js","sourceRoot":"","sources":["../../../../app/controllers/admin/information_controller.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,MAAM,CAAC,OAAO,OAAO,qBAAqB;IACxC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAe;QAC9B,IAAI,IAAI,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,CAAA;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC;gBAC9B,IAAI,EAAE,EAAE;gBACR,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,IAAI;aACf,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IACrE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAe;QAC7C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,CAAA;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAA;QAC5B,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAA;QAC5F,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACvE,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAC9C,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;IACnC,CAAC;CACF"}
|
||||
86
app/controllers/admin/music_controller.js
Normal file
86
app/controllers/admin/music_controller.js
Normal file
@@ -0,0 +1,86 @@
|
||||
import app from '@adonisjs/core/services/app';
|
||||
import Music from '#models/music';
|
||||
import fs from 'node:fs';
|
||||
export default class AdminMusicController {
|
||||
async index({ view }) {
|
||||
const musics = await Music.all();
|
||||
return view.render('admin/music/index', { musics });
|
||||
}
|
||||
async create({ view }) {
|
||||
return view.render('admin/music/form', { music: null });
|
||||
}
|
||||
async store({ request, response, session }) {
|
||||
const { name } = request.only(['name']);
|
||||
const musicFile = request.file('file', {
|
||||
size: '10mb',
|
||||
extnames: ['mp3', 'wav', 'ogg'],
|
||||
});
|
||||
if (!musicFile) {
|
||||
session.flashErrors({ error: 'Veuillez télécharger un fichier audio.' });
|
||||
return response.redirect().back();
|
||||
}
|
||||
await musicFile.move(app.makePath('public/uploads/music'), {
|
||||
name: `${new Date().getTime()}_${musicFile.clientName}`
|
||||
});
|
||||
const url = `/uploads/music/${musicFile.fileName}`;
|
||||
await Music.create({ name, url });
|
||||
session.flash({ success: 'Musique ajoutée avec succès.' });
|
||||
return response.redirect('/admin/music');
|
||||
}
|
||||
async edit({ view, params, response }) {
|
||||
const music = await Music.find(params.id);
|
||||
if (!music) {
|
||||
return response.notFound();
|
||||
}
|
||||
return view.render('admin/music/form', { music });
|
||||
}
|
||||
async update({ request, params, response, session }) {
|
||||
const music = await Music.find(params.id);
|
||||
if (!music) {
|
||||
return response.notFound();
|
||||
}
|
||||
const { name } = request.only(['name']);
|
||||
const musicFile = request.file('file', {
|
||||
size: '10mb',
|
||||
extnames: ['mp3', 'wav', 'ogg'],
|
||||
});
|
||||
let url = music.url;
|
||||
if (musicFile) {
|
||||
const oldPath = app.makePath('public' + music.url);
|
||||
if (fs.existsSync(oldPath)) {
|
||||
try {
|
||||
fs.unlinkSync(oldPath);
|
||||
}
|
||||
catch (err) {
|
||||
console.error('Failed to delete old music file', err);
|
||||
}
|
||||
}
|
||||
await musicFile.move(app.makePath('public/uploads/music'), {
|
||||
name: `${new Date().getTime()}_${musicFile.clientName}`
|
||||
});
|
||||
url = `/uploads/music/${musicFile.fileName}`;
|
||||
}
|
||||
await music.merge({ name, url }).save();
|
||||
session.flash({ success: 'Musique modifiée avec succès.' });
|
||||
return response.redirect('/admin/music');
|
||||
}
|
||||
async destroy({ params, response, session }) {
|
||||
const music = await Music.find(params.id);
|
||||
if (!music) {
|
||||
return response.notFound();
|
||||
}
|
||||
const absolutePath = app.makePath('public' + music.url);
|
||||
if (fs.existsSync(absolutePath)) {
|
||||
try {
|
||||
fs.unlinkSync(absolutePath);
|
||||
}
|
||||
catch (err) {
|
||||
console.error('Failed to delete music file', err);
|
||||
}
|
||||
}
|
||||
await music.delete();
|
||||
session.flash({ success: 'Musique supprimée avec succès.' });
|
||||
return response.redirect('/admin/music');
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=music_controller.js.map
|
||||
1
app/controllers/admin/music_controller.js.map
Normal file
1
app/controllers/admin/music_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"music_controller.js","sourceRoot":"","sources":["../../../../app/controllers/admin/music_controller.ts"],"names":[],"mappings":"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"}
|
||||
170
app/controllers/admin/projects_controller.js
Normal file
170
app/controllers/admin/projects_controller.js
Normal file
@@ -0,0 +1,170 @@
|
||||
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
|
||||
1
app/controllers/admin/projects_controller.js.map
Normal file
1
app/controllers/admin/projects_controller.js.map
Normal file
File diff suppressed because one or more lines are too long
41
app/controllers/admin/tags_controller.js
Normal file
41
app/controllers/admin/tags_controller.js
Normal file
@@ -0,0 +1,41 @@
|
||||
import Tag from '#models/tag';
|
||||
export default class TagsController {
|
||||
async index({ view }) {
|
||||
const tags = await Tag.all();
|
||||
return view.render('admin/tags/index', { tags });
|
||||
}
|
||||
async create({ view }) {
|
||||
const defaultColor = '#' + Math.floor(Math.random() * 16777215).toString(16).padStart(6, '0');
|
||||
return view.render('admin/tags/form', { tag: null, defaultColor });
|
||||
}
|
||||
async store({ request, response }) {
|
||||
const { name, color } = request.only(['name', 'color']);
|
||||
await Tag.create({ name, color: color || null });
|
||||
return response.redirect('/admin/tags');
|
||||
}
|
||||
async edit({ view, params, response }) {
|
||||
const tag = await Tag.find(params.id);
|
||||
if (!tag) {
|
||||
return response.notFound();
|
||||
}
|
||||
return view.render('admin/tags/form', { tag });
|
||||
}
|
||||
async update({ request, params, response }) {
|
||||
const tag = await Tag.find(params.id);
|
||||
if (!tag) {
|
||||
return response.notFound();
|
||||
}
|
||||
const { name, color } = request.only(['name', 'color']);
|
||||
await tag.merge({ name, color: color || null }).save();
|
||||
return response.redirect('/admin/tags');
|
||||
}
|
||||
async destroy({ params, response }) {
|
||||
const tag = await Tag.find(params.id);
|
||||
if (!tag) {
|
||||
return response.notFound();
|
||||
}
|
||||
await tag.delete();
|
||||
return response.redirect('/admin/tags');
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=tags_controller.js.map
|
||||
1
app/controllers/admin/tags_controller.js.map
Normal file
1
app/controllers/admin/tags_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"tags_controller.js","sourceRoot":"","sources":["../../../../app/controllers/admin/tags_controller.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,aAAa,CAAA;AAE7B,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAe;QAC/B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAe;QAChC,MAAM,YAAY,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QAC7F,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAe;QAC5C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;QACvD,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,CAAA;QAChD,OAAO,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAe;QAChD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACrC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAA;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAe;QACrD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACrC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAA;QAC5B,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;QACvD,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QACtD,OAAO,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAe;QAC7C,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACrC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAA;QAC5B,CAAC;QACD,MAAM,GAAG,CAAC,MAAM,EAAE,CAAA;QAClB,OAAO,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;IACzC,CAAC;CACF"}
|
||||
67
app/controllers/admin/trainings_controller.js
Normal file
67
app/controllers/admin/trainings_controller.js
Normal file
@@ -0,0 +1,67 @@
|
||||
import Training from '#models/training';
|
||||
import { DateTime } from 'luxon';
|
||||
export default class TrainingsController {
|
||||
async index({ view }) {
|
||||
const trainings = await Training.query().orderBy('start', 'desc');
|
||||
return view.render('admin/trainings/index', { trainings });
|
||||
}
|
||||
async create({ view }) {
|
||||
return view.render('admin/trainings/form', { training: null });
|
||||
}
|
||||
async store({ request, response }) {
|
||||
const { name, start, end, skill, place } = request.only([
|
||||
'name',
|
||||
'start',
|
||||
'end',
|
||||
'skill',
|
||||
'place',
|
||||
]);
|
||||
await Training.create({
|
||||
name,
|
||||
start: start ? DateTime.fromISO(start) : null,
|
||||
end: end ? DateTime.fromISO(end) : null,
|
||||
skill: skill || null,
|
||||
place: place || null,
|
||||
});
|
||||
return response.redirect('/admin/trainings');
|
||||
}
|
||||
async edit({ view, params, response }) {
|
||||
const training = await Training.find(params.id);
|
||||
if (!training) {
|
||||
return response.notFound();
|
||||
}
|
||||
return view.render('admin/trainings/form', { training });
|
||||
}
|
||||
async update({ request, params, response }) {
|
||||
const training = await Training.find(params.id);
|
||||
if (!training) {
|
||||
return response.notFound();
|
||||
}
|
||||
const { name, start, end, skill, place } = request.only([
|
||||
'name',
|
||||
'start',
|
||||
'end',
|
||||
'skill',
|
||||
'place',
|
||||
]);
|
||||
await training
|
||||
.merge({
|
||||
name,
|
||||
start: start ? DateTime.fromISO(start) : null,
|
||||
end: end ? DateTime.fromISO(end) : null,
|
||||
skill: skill || null,
|
||||
place: place || null,
|
||||
})
|
||||
.save();
|
||||
return response.redirect('/admin/trainings');
|
||||
}
|
||||
async destroy({ params, response }) {
|
||||
const training = await Training.find(params.id);
|
||||
if (!training) {
|
||||
return response.notFound();
|
||||
}
|
||||
await training.delete();
|
||||
return response.redirect('/admin/trainings');
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=trainings_controller.js.map
|
||||
1
app/controllers/admin/trainings_controller.js.map
Normal file
1
app/controllers/admin/trainings_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"trainings_controller.js","sourceRoot":"","sources":["../../../../app/controllers/admin/trainings_controller.ts"],"names":[],"mappings":"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"}
|
||||
18
app/controllers/categories_controller.js
Normal file
18
app/controllers/categories_controller.js
Normal file
@@ -0,0 +1,18 @@
|
||||
import Category from '#models/category';
|
||||
export default class CategoriesController {
|
||||
async index({ request, response }) {
|
||||
const populate = request.qs().populate;
|
||||
const query = Category.query();
|
||||
if (populate === 'projects') {
|
||||
query.preload('projects');
|
||||
}
|
||||
const categories = await query;
|
||||
return response.ok({
|
||||
data: categories.map((c) => ({
|
||||
name: c.name,
|
||||
projects: populate === 'projects' ? c.projects : [],
|
||||
})),
|
||||
});
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=categories_controller.js.map
|
||||
1
app/controllers/categories_controller.js.map
Normal file
1
app/controllers/categories_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"categories_controller.js","sourceRoot":"","sources":["../../../app/controllers/categories_controller.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,kBAAkB,CAAA;AAEvC,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACvC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAe;QAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAA;QACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAA;QAC9B,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC5B,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAC3B,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAA;QAC9B,OAAO,QAAQ,CAAC,EAAE,CAAC;YACjB,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,QAAQ,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;aACpD,CAAC,CAAC;SACJ,CAAC,CAAA;IACJ,CAAC;CACF"}
|
||||
48
app/controllers/experiences_controller.js
Normal file
48
app/controllers/experiences_controller.js
Normal file
@@ -0,0 +1,48 @@
|
||||
import Experience from '#models/experience';
|
||||
export default class ExperiencesController {
|
||||
async index({ response }) {
|
||||
const experiences = await Experience.query()
|
||||
.preload('projects')
|
||||
.orderBy('start', 'desc');
|
||||
return response.ok({
|
||||
data: experiences.map((e) => ({
|
||||
id: e.id,
|
||||
name: e.name,
|
||||
start: e.start.toISODate(),
|
||||
end: e.end?.toISODate() ?? null,
|
||||
missions: e.missions,
|
||||
place: e.place,
|
||||
projects: e.projects.map((p) => ({
|
||||
id: p.id,
|
||||
title: p.title,
|
||||
thumbnailUrl: p.thumbnailUrl,
|
||||
})),
|
||||
})),
|
||||
});
|
||||
}
|
||||
async show({ params, response }) {
|
||||
const experience = await Experience.query()
|
||||
.where('id', params.id)
|
||||
.preload('projects')
|
||||
.first();
|
||||
if (!experience) {
|
||||
return response.notFound();
|
||||
}
|
||||
return response.ok({
|
||||
data: {
|
||||
id: experience.id,
|
||||
name: experience.name,
|
||||
start: experience.start.toISODate(),
|
||||
end: experience.end?.toISODate() ?? null,
|
||||
missions: experience.missions,
|
||||
place: experience.place,
|
||||
projects: experience.projects.map((p) => ({
|
||||
id: p.id,
|
||||
title: p.title,
|
||||
thumbnailUrl: p.thumbnailUrl,
|
||||
}))
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=experiences_controller.js.map
|
||||
1
app/controllers/experiences_controller.js.map
Normal file
1
app/controllers/experiences_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"experiences_controller.js","sourceRoot":"","sources":["../../../app/controllers/experiences_controller.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,MAAM,oBAAoB,CAAA;AAE3C,MAAM,CAAC,OAAO,OAAO,qBAAqB;IACtC,KAAK,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAe;QACjC,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE;aACvC,OAAO,CAAC,UAAU,CAAC;aACnB,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAE7B,OAAO,QAAQ,CAAC,EAAE,CAAC;YACf,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1B,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE;gBAC1B,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,IAAI;gBAC/B,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7B,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,YAAY,EAAE,CAAC,CAAC,YAAY;iBAC/B,CAAC,CAAC;aACN,CAAC,CAAC;SACN,CAAC,CAAA;IACN,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAe;QACxC,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE;aACtC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;aACtB,OAAO,CAAC,UAAU,CAAC;aACnB,KAAK,EAAE,CAAA;QAEZ,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAA;QAC9B,CAAC;QAED,OAAO,QAAQ,CAAC,EAAE,CAAC;YACf,IAAI,EAAE;gBACF,EAAE,EAAE,UAAU,CAAC,EAAE;gBACjB,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE;gBACnC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,IAAI;gBACxC,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACtC,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,YAAY,EAAE,CAAC,CAAC,YAAY;iBAC/B,CAAC,CAAC;aACN;SACJ,CAAC,CAAA;IACN,CAAC;CACJ"}
|
||||
20
app/controllers/informations_controller.js
Normal file
20
app/controllers/informations_controller.js
Normal file
@@ -0,0 +1,20 @@
|
||||
import Information from '#models/information';
|
||||
export default class InformationsController {
|
||||
async show({ response }) {
|
||||
const info = await Information.first();
|
||||
if (!info) {
|
||||
return response.notFound({ data: null });
|
||||
}
|
||||
return response.ok({
|
||||
data: {
|
||||
name: info.name,
|
||||
headline: info.headline,
|
||||
contact: info.contact,
|
||||
linkedin: info.linkedin,
|
||||
github: info.github,
|
||||
birthday: info.birthday?.toISODate() ?? null,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=informations_controller.js.map
|
||||
1
app/controllers/informations_controller.js.map
Normal file
1
app/controllers/informations_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"informations_controller.js","sourceRoot":"","sources":["../../../app/controllers/informations_controller.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,qBAAqB,CAAA;AAE7C,MAAM,CAAC,OAAO,OAAO,sBAAsB;IACzC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAe;QAClC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,CAAA;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1C,CAAC;QACD,OAAO,QAAQ,CAAC,EAAE,CAAC;YACjB,IAAI,EAAE;gBACJ,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI;aAC7C;SACF,CAAC,CAAA;IACJ,CAAC;CACF"}
|
||||
12
app/controllers/music_controller.js
Normal file
12
app/controllers/music_controller.js
Normal file
@@ -0,0 +1,12 @@
|
||||
import Music from '#models/music';
|
||||
export default class MusicController {
|
||||
async index({ response }) {
|
||||
const musics = await Music.all();
|
||||
return response.ok({
|
||||
data: {
|
||||
musics: musics.map((m) => ({ name: m.name, url: m.url })),
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=music_controller.js.map
|
||||
1
app/controllers/music_controller.js.map
Normal file
1
app/controllers/music_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"music_controller.js","sourceRoot":"","sources":["../../../app/controllers/music_controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,eAAe,CAAA;AAEjC,MAAM,CAAC,OAAO,OAAO,eAAe;IAClC,KAAK,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAe;QACnC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,CAAA;QAChC,OAAO,QAAQ,CAAC,EAAE,CAAC;YACjB,IAAI,EAAE;gBACJ,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;aAC1D;SACF,CAAC,CAAA;IACJ,CAAC;CACF"}
|
||||
47
app/controllers/projects_controller.js
Normal file
47
app/controllers/projects_controller.js
Normal file
@@ -0,0 +1,47 @@
|
||||
import Project from '#models/project';
|
||||
export default class ProjectsController {
|
||||
async index({ request, response }) {
|
||||
const query = Project.query().preload('category');
|
||||
const sort = request.qs().sort;
|
||||
if (sort === 'start:desc') {
|
||||
query.orderBy('start', 'desc');
|
||||
}
|
||||
const projects = await query;
|
||||
return response.ok({
|
||||
data: projects.map((p) => ({
|
||||
id: p.id,
|
||||
title: p.title,
|
||||
category: p.category ? { name: p.category.name } : null,
|
||||
})),
|
||||
});
|
||||
}
|
||||
async show({ params, response }) {
|
||||
const numericId = Number(params.id);
|
||||
const query = Project.query()
|
||||
.preload('category')
|
||||
.preload('tags')
|
||||
.preload('trainings');
|
||||
const project = await query.where('id', numericId).first();
|
||||
if (!project) {
|
||||
return response.notFound({ data: null });
|
||||
}
|
||||
return response.ok({
|
||||
data: {
|
||||
title: project.title,
|
||||
content: project.content,
|
||||
start: project.start?.toISODate() ?? null,
|
||||
end: project.end?.toISODate() ?? null,
|
||||
thumbnail: project.thumbnailUrl ? [{ url: project.thumbnailUrl }] : [],
|
||||
tags: project.tags.map((t) => ({ name: t.name, color: t.color })),
|
||||
trainings: project.trainings.map((t) => ({
|
||||
name: t.name,
|
||||
start: t.start?.toISODate(),
|
||||
end: t.end?.toISODate(),
|
||||
skill: t.skill,
|
||||
place: t.place,
|
||||
})),
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=projects_controller.js.map
|
||||
1
app/controllers/projects_controller.js.map
Normal file
1
app/controllers/projects_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"projects_controller.js","sourceRoot":"","sources":["../../../app/controllers/projects_controller.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,iBAAiB,CAAA;AAErC,MAAM,CAAC,OAAO,OAAO,kBAAkB;IACrC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAe;QAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACjD,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,IAAI,CAAA;QAC9B,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1B,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAChC,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAA;QAC5B,OAAO,QAAQ,CAAC,EAAE,CAAC;YACjB,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzB,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;aACxD,CAAC,CAAC;SACJ,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAe;QAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE;aAC1B,OAAO,CAAC,UAAU,CAAC;aACnB,OAAO,CAAC,MAAM,CAAC;aACf,OAAO,CAAC,WAAW,CAAC,CAAA;QACvB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,KAAK,EAAE,CAAA;QAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1C,CAAC;QACD,OAAO,QAAQ,CAAC,EAAE,CAAC;YACjB,IAAI,EAAE;gBACJ,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI;gBACzC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,IAAI;gBACrC,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;gBACtE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBACjE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACvC,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE;oBAC3B,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE;oBACvB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,KAAK,EAAE,CAAC,CAAC,KAAK;iBACf,CAAC,CAAC;aACJ;SACF,CAAC,CAAA;IACJ,CAAC;CACF"}
|
||||
19
app/controllers/tags_controller.js
Normal file
19
app/controllers/tags_controller.js
Normal file
@@ -0,0 +1,19 @@
|
||||
import Tag from '#models/tag';
|
||||
export default class TagsController {
|
||||
async index({ request, response }) {
|
||||
const populate = request.qs().populate;
|
||||
const query = Tag.query();
|
||||
if (populate === 'projects') {
|
||||
query.preload('projects');
|
||||
}
|
||||
const tags = await query;
|
||||
return response.ok({
|
||||
data: tags.map((t) => ({
|
||||
name: t.name,
|
||||
color: t.color,
|
||||
projects: populate === 'projects' ? t.projects : [],
|
||||
})),
|
||||
});
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=tags_controller.js.map
|
||||
1
app/controllers/tags_controller.js.map
Normal file
1
app/controllers/tags_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"tags_controller.js","sourceRoot":"","sources":["../../../app/controllers/tags_controller.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,aAAa,CAAA;AAE7B,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAe;QAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAA;QACtC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,CAAA;QACzB,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC5B,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAC3B,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAA;QACxB,OAAO,QAAQ,CAAC,EAAE,CAAC;YACjB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,QAAQ,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;aACpD,CAAC,CAAC;SACJ,CAAC,CAAA;IACJ,CAAC;CACF"}
|
||||
19
app/controllers/trainings_controller.js
Normal file
19
app/controllers/trainings_controller.js
Normal file
@@ -0,0 +1,19 @@
|
||||
import Training from '#models/training';
|
||||
export default class TrainingsController {
|
||||
async index({ response }) {
|
||||
const trainings = await Training.query()
|
||||
.preload('projects')
|
||||
.orderBy('start', 'desc');
|
||||
return response.ok({
|
||||
data: trainings.map((t) => ({
|
||||
name: t.name,
|
||||
start: t.start?.toISODate() ?? null,
|
||||
end: t.end?.toISODate() ?? null,
|
||||
skill: t.skill,
|
||||
place: t.place,
|
||||
projects: t.projects,
|
||||
})),
|
||||
});
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=trainings_controller.js.map
|
||||
1
app/controllers/trainings_controller.js.map
Normal file
1
app/controllers/trainings_controller.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"trainings_controller.js","sourceRoot":"","sources":["../../../app/controllers/trainings_controller.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,kBAAkB,CAAA;AAEvC,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACtC,KAAK,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAe;QACnC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE;aACrC,OAAO,CAAC,UAAU,CAAC;aACnB,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC3B,OAAO,QAAQ,CAAC,EAAE,CAAC;YACjB,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI;gBACnC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,IAAI;gBAC/B,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACrB,CAAC,CAAC;SACJ,CAAC,CAAA;IACJ,CAAC;CACF"}
|
||||
Reference in New Issue
Block a user