Initial commit

This commit is contained in:
Rutra
2026-02-25 00:34:39 +01:00
commit 54b0fc3485
178 changed files with 12761 additions and 0 deletions

View 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

View 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"}

View 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

File diff suppressed because one or more lines are too long

View 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

View 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"}

View 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

View 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"}

View 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

View File

@@ -0,0 +1 @@
{"version":3,"file":"experiences_controller.js","sourceRoot":"","sources":["../../../../app/controllers/admin/experiences_controller.ts"],"names":[],"mappings":"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"}

View 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

View 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"}

View 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

View 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"}

View 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

View File

@@ -0,0 +1 @@
{"version":3,"file":"music_controller.js","sourceRoot":"","sources":["../../../../app/controllers/admin/music_controller.ts"],"names":[],"mappings":"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"}

View 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

File diff suppressed because one or more lines are too long

View 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

View 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"}

View 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

View File

@@ -0,0 +1 @@
{"version":3,"file":"trainings_controller.js","sourceRoot":"","sources":["../../../../app/controllers/admin/trainings_controller.ts"],"names":[],"mappings":"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"}

View 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

View 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"}

View 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

View 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"}

View 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

View 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"}

View 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

View 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"}

View 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

View 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"}

View 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

View 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"}

View 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

View 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"}