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

25
.gitignore vendored Normal file
View File

@@ -0,0 +1,25 @@
# Git ignore for portfolio API
# Node modules
node_modules/
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Uploads (images and music)
uploads/images/
uploads/music/
# Environment variables
.env
# Database
database/db.sqlite3
# IDE files
.vscode/

7
ace.js Normal file
View File

@@ -0,0 +1,7 @@
/**
* This file is auto-generated by the build process.
* If you had any custom code inside this file, then
* instead write it inside the "bin/console.js" file.
*/
await import('./bin/console.js')

56
adonisrc.js Normal file
View File

@@ -0,0 +1,56 @@
import { defineConfig } from '@adonisjs/core/app';
export default defineConfig({
experimental: {
mergeMultipartFieldsAndFiles: true,
shutdownInReverseOrder: true,
},
commands: [() => import('@adonisjs/core/commands'), () => import('@adonisjs/lucid/commands')],
providers: [
() => import('@adonisjs/cors/cors_provider'),
() => import('@adonisjs/core/providers/app_provider'),
() => import('@adonisjs/core/providers/hash_provider'),
{
file: () => import('@adonisjs/core/providers/repl_provider'),
environment: ['repl', 'test'],
},
() => import('@adonisjs/core/providers/vinejs_provider'),
() => import('@adonisjs/core/providers/edge_provider'),
() => import('@adonisjs/session/session_provider'),
() => import('@adonisjs/vite/vite_provider'),
() => import('@adonisjs/shield/shield_provider'),
() => import('@adonisjs/static/static_provider'),
() => import('@adonisjs/lucid/database_provider'),
() => import('@adonisjs/auth/auth_provider')
],
preloads: [() => import('#start/routes'), () => import('#start/kernel')],
tests: {
suites: [
{
files: ['tests/unit/**/*.spec(.ts|.js)'],
name: 'unit',
timeout: 2000,
},
{
files: ['tests/functional/**/*.spec(.ts|.js)'],
name: 'functional',
timeout: 30000,
},
],
forceExit: false,
},
metaFiles: [
{
pattern: 'resources/views/**/*.edge',
reloadServer: false,
},
{
pattern: 'public/**',
reloadServer: false,
},
],
assetsBundler: false,
hooks: {
onBuildStarting: [() => import('@adonisjs/vite/build_hook')],
},
});
//# sourceMappingURL=adonisrc.js.map

1
adonisrc.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"adonisrc.js","sourceRoot":"","sources":["../adonisrc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,eAAe,YAAY,CAAC;IAW1B,YAAY,EAAE;QACZ,4BAA4B,EAAE,IAAI;QAClC,sBAAsB,EAAE,IAAI;KAC7B;IAWD,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,yBAAyB,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;IAW7F,SAAS,EAAE;QACT,GAAG,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC;QAC5C,GAAG,EAAE,CAAC,MAAM,CAAC,uCAAuC,CAAC;QACrD,GAAG,EAAE,CAAC,MAAM,CAAC,wCAAwC,CAAC;QACtD;YACE,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,wCAAwC,CAAC;YAC5D,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;SAC9B;QACD,GAAG,EAAE,CAAC,MAAM,CAAC,0CAA0C,CAAC;QACxD,GAAG,EAAE,CAAC,MAAM,CAAC,wCAAwC,CAAC;QACtD,GAAG,EAAE,CAAC,MAAM,CAAC,oCAAoC,CAAC;QAClD,GAAG,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC;QAC5C,GAAG,EAAE,CAAC,MAAM,CAAC,kCAAkC,CAAC;QAChD,GAAG,EAAE,CAAC,MAAM,CAAC,kCAAkC,CAAC;QAChD,GAAG,EAAE,CAAC,MAAM,CAAC,mCAAmC,CAAC;QACjD,GAAG,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC;KAC7C;IAUD,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAWxE,KAAK,EAAE;QACL,MAAM,EAAE;YACN;gBACE,KAAK,EAAE,CAAC,+BAA+B,CAAC;gBACxC,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI;aACd;YACD;gBACE,KAAK,EAAE,CAAC,qCAAqC,CAAC;gBAC9C,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,KAAK;aACf;SACF;QACD,SAAS,EAAE,KAAK;KACjB;IAED,SAAS,EAAE;QACT;YACE,OAAO,EAAE,2BAA2B;YACpC,YAAY,EAAE,KAAK;SACpB;QACD;YACE,OAAO,EAAE,WAAW;YACpB,YAAY,EAAE,KAAK;SACpB;KACF;IAED,aAAa,EAAE,KAAK;IACpB,KAAK,EAAE;QACL,eAAe,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;KAC7D;CACF,CAAC,CAAA"}

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

21
app/exceptions/handler.js Normal file
View File

@@ -0,0 +1,21 @@
import app from '@adonisjs/core/services/app';
import { ExceptionHandler } from '@adonisjs/core/http';
export default class HttpExceptionHandler extends ExceptionHandler {
debug = !app.inProduction;
renderStatusPages = app.inProduction;
statusPages = {
'404': (error, { view }) => {
return view.render('pages/errors/not_found', { error });
},
'500..599': (error, { view }) => {
return view.render('pages/errors/server_error', { error });
},
};
async handle(error, ctx) {
return super.handle(error, ctx);
}
async report(error, ctx) {
return super.report(error, ctx);
}
}
//# sourceMappingURL=handler.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../app/exceptions/handler.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,6BAA6B,CAAA;AAC7C,OAAO,EAAe,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAGnE,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,gBAAgB;IAKtD,KAAK,GAAG,CAAC,GAAG,CAAC,YAAY,CAAA;IAOzB,iBAAiB,GAAG,GAAG,CAAC,YAAY,CAAA;IAMpC,WAAW,GAAgD;QACnE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;YACzB,OAAO,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QACzD,CAAC;QACD,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;YAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QAC5D,CAAC;KACF,CAAA;IAMD,KAAK,CAAC,MAAM,CAAC,KAAc,EAAE,GAAgB;QAC3C,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACjC,CAAC;IAQD,KAAK,CAAC,MAAM,CAAC,KAAc,EAAE,GAAgB;QAC3C,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACjC,CAAC;CACF"}

View File

@@ -0,0 +1,8 @@
export default class AdminAuthMiddleware {
redirectTo = '/admin/login';
async handle(ctx, next, options = {}) {
await ctx.auth.authenticateUsing(options.guards, { loginRoute: this.redirectTo });
return next();
}
}
//# sourceMappingURL=admin_auth_middleware.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"admin_auth_middleware.js","sourceRoot":"","sources":["../../../app/middleware/admin_auth_middleware.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACtC,UAAU,GAAG,cAAc,CAAA;IAE3B,KAAK,CAAC,MAAM,CACV,GAAgB,EAChB,IAAY,EACZ,UAAiD,EAAE;QAEnD,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;QACjF,OAAO,IAAI,EAAE,CAAA;IACf,CAAC;CACF"}

View File

@@ -0,0 +1,12 @@
export default class AdminGuestMiddleware {
redirectTo = '/admin';
async handle(ctx, next, options = {}) {
for (let guard of options.guards || [ctx.auth.defaultGuard]) {
if (await ctx.auth.use(guard).check()) {
return ctx.response.redirect(this.redirectTo, true);
}
}
return next();
}
}
//# sourceMappingURL=admin_guest_middleware.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"admin_guest_middleware.js","sourceRoot":"","sources":["../../../app/middleware/admin_guest_middleware.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACvC,UAAU,GAAG,QAAQ,CAAA;IAErB,KAAK,CAAC,MAAM,CACV,GAAgB,EAChB,IAAY,EACZ,UAAiD,EAAE;QAEnD,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5D,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gBACtC,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,EAAE,CAAA;IACf,CAAC;CACF"}

View File

@@ -0,0 +1,8 @@
export default class AuthMiddleware {
redirectTo = '/login';
async handle(ctx, next, options = {}) {
await ctx.auth.authenticateUsing(options.guards, { loginRoute: this.redirectTo });
return next();
}
}
//# sourceMappingURL=auth_middleware.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"auth_middleware.js","sourceRoot":"","sources":["../../../app/middleware/auth_middleware.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,OAAO,OAAO,cAAc;IAIjC,UAAU,GAAG,QAAQ,CAAA;IAErB,KAAK,CAAC,MAAM,CACV,GAAgB,EAChB,IAAY,EACZ,UAEI,EAAE;QAEN,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;QACjF,OAAO,IAAI,EAAE,CAAA;IACf,CAAC;CACF"}

View File

@@ -0,0 +1,10 @@
import { Logger } from '@adonisjs/core/logger';
import { HttpContext } from '@adonisjs/core/http';
export default class ContainerBindingsMiddleware {
handle(ctx, next) {
ctx.containerResolver.bindValue(HttpContext, ctx);
ctx.containerResolver.bindValue(Logger, ctx.logger);
return next();
}
}
//# sourceMappingURL=container_bindings_middleware.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"container_bindings_middleware.js","sourceRoot":"","sources":["../../../app/middleware/container_bindings_middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAUjD,MAAM,CAAC,OAAO,OAAO,2BAA2B;IAC9C,MAAM,CAAC,GAAgB,EAAE,IAAY;QACnC,GAAG,CAAC,iBAAiB,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;QACjD,GAAG,CAAC,iBAAiB,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;QAEnD,OAAO,IAAI,EAAE,CAAA;IACf,CAAC;CACF"}

View File

@@ -0,0 +1,12 @@
export default class GuestMiddleware {
redirectTo = '/';
async handle(ctx, next, options = {}) {
for (let guard of options.guards || [ctx.auth.defaultGuard]) {
if (await ctx.auth.use(guard).check()) {
return ctx.response.redirect(this.redirectTo, true);
}
}
return next();
}
}
//# sourceMappingURL=guest_middleware.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"guest_middleware.js","sourceRoot":"","sources":["../../../app/middleware/guest_middleware.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,OAAO,OAAO,eAAe;IAIlC,UAAU,GAAG,GAAG,CAAA;IAEhB,KAAK,CAAC,MAAM,CACV,GAAgB,EAChB,IAAY,EACZ,UAAiD,EAAE;QAEnD,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5D,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gBACtC,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;QAED,OAAO,IAAI,EAAE,CAAA;IACf,CAAC;CACF"}

View File

@@ -0,0 +1,7 @@
export default class SilentAuthMiddleware {
async handle(ctx, next) {
await ctx.auth.check();
return next();
}
}
//# sourceMappingURL=silent_auth_middleware.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"silent_auth_middleware.js","sourceRoot":"","sources":["../../../app/middleware/silent_auth_middleware.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACvC,KAAK,CAAC,MAAM,CACV,GAAgB,EAChB,IAAY;QAEZ,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;QAEtB,OAAO,IAAI,EAAE,CAAA;IACf,CAAC;CACF"}

35
app/models/category.js Normal file
View File

@@ -0,0 +1,35 @@
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { DateTime } from 'luxon';
import { BaseModel, column, hasMany } from '@adonisjs/lucid/orm';
import Project from '#models/project';
export default class Category extends BaseModel {
}
__decorate([
column({ isPrimary: true }),
__metadata("design:type", Number)
], Category.prototype, "id", void 0);
__decorate([
column(),
__metadata("design:type", String)
], Category.prototype, "name", void 0);
__decorate([
column.dateTime({ autoCreate: true }),
__metadata("design:type", DateTime)
], Category.prototype, "createdAt", void 0);
__decorate([
column.dateTime({ autoCreate: true, autoUpdate: true }),
__metadata("design:type", Object)
], Category.prototype, "updatedAt", void 0);
__decorate([
hasMany(() => Project),
__metadata("design:type", Object)
], Category.prototype, "projects", void 0);
//# sourceMappingURL=category.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"category.js","sourceRoot":"","sources":["../../../app/models/category.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAEhE,OAAO,OAAO,MAAM,iBAAiB,CAAA;AAErC,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,SAAS;CAe9C;AAbS;IADP,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;oCACV;AAGV;IADP,MAAM,EAAE;;sCACW;AAGZ;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;8BACnB,QAAQ;2CAAA;AAGnB;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;2CACtB;AAG1B;IADP,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;;0CACkB"}

55
app/models/experience.js Normal file
View File

@@ -0,0 +1,55 @@
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { DateTime } from 'luxon';
import { BaseModel, column, manyToMany } from '@adonisjs/lucid/orm';
import Project from '#models/project';
export default class Experience extends BaseModel {
}
__decorate([
column({ isPrimary: true }),
__metadata("design:type", Number)
], Experience.prototype, "id", void 0);
__decorate([
column(),
__metadata("design:type", String)
], Experience.prototype, "name", void 0);
__decorate([
column.date(),
__metadata("design:type", DateTime)
], Experience.prototype, "start", void 0);
__decorate([
column.date(),
__metadata("design:type", Object)
], Experience.prototype, "end", void 0);
__decorate([
column(),
__metadata("design:type", Object)
], Experience.prototype, "missions", void 0);
__decorate([
column(),
__metadata("design:type", Object)
], Experience.prototype, "place", void 0);
__decorate([
column.dateTime({ autoCreate: true }),
__metadata("design:type", DateTime)
], Experience.prototype, "createdAt", void 0);
__decorate([
column.dateTime({ autoCreate: true, autoUpdate: true }),
__metadata("design:type", DateTime)
], Experience.prototype, "updatedAt", void 0);
__decorate([
manyToMany(() => Project, {
pivotTable: 'experience_project',
pivotForeignKey: 'experience_id',
pivotRelatedForeignKey: 'project_id',
}),
__metadata("design:type", Object)
], Experience.prototype, "projects", void 0);
//# sourceMappingURL=experience.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"experience.js","sourceRoot":"","sources":["../../../app/models/experience.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEnE,OAAO,OAAO,MAAM,iBAAiB,CAAA;AAErC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;CA+BhD;AA7BS;IADP,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;sCACV;AAGV;IADP,MAAM,EAAE;;wCACW;AAGZ;IADP,MAAM,CAAC,IAAI,EAAE;8BACC,QAAQ;yCAAA;AAGf;IADP,MAAM,CAAC,IAAI,EAAE;;uCACc;AAGpB;IADP,MAAM,EAAE;;4CACsB;AAGvB;IADP,MAAM,EAAE;;yCACmB;AAGpB;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;8BACnB,QAAQ;6CAAA;AAGnB;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;8BACrC,QAAQ;6CAAA;AAOnB;IALP,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;QACzB,UAAU,EAAE,oBAAoB;QAChC,eAAe,EAAE,eAAe;QAChC,sBAAsB,EAAE,YAAY;KACrC,CAAC;;4CAC0C"}

42
app/models/image.js Normal file
View File

@@ -0,0 +1,42 @@
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { DateTime } from 'luxon';
import { BaseModel, column } from '@adonisjs/lucid/orm';
export default class Image extends BaseModel {
}
__decorate([
column({ isPrimary: true }),
__metadata("design:type", Number)
], Image.prototype, "id", void 0);
__decorate([
column(),
__metadata("design:type", String)
], Image.prototype, "filePath", void 0);
__decorate([
column(),
__metadata("design:type", String)
], Image.prototype, "originalName", void 0);
__decorate([
column(),
__metadata("design:type", String)
], Image.prototype, "mimeType", void 0);
__decorate([
column(),
__metadata("design:type", Number)
], Image.prototype, "size", void 0);
__decorate([
column.dateTime({ autoCreate: true }),
__metadata("design:type", DateTime)
], Image.prototype, "createdAt", void 0);
__decorate([
column.dateTime({ autoCreate: true, autoUpdate: true }),
__metadata("design:type", DateTime)
], Image.prototype, "updatedAt", void 0);
//# sourceMappingURL=image.js.map

1
app/models/image.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../../app/models/image.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,SAAS;CAqB3C;AAnBS;IADP,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;iCACV;AAGV;IADP,MAAM,EAAE;;uCACe;AAGhB;IADP,MAAM,EAAE;;2CACmB;AAGpB;IADP,MAAM,EAAE;;uCACe;AAGhB;IADP,MAAM,EAAE;;mCACW;AAGZ;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;8BACnB,QAAQ;wCAAA;AAGnB;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;8BACrC,QAAQ;wCAAA"}

50
app/models/information.js Normal file
View File

@@ -0,0 +1,50 @@
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { DateTime } from 'luxon';
import { BaseModel, column } from '@adonisjs/lucid/orm';
export default class Information extends BaseModel {
}
__decorate([
column({ isPrimary: true }),
__metadata("design:type", Number)
], Information.prototype, "id", void 0);
__decorate([
column(),
__metadata("design:type", String)
], Information.prototype, "name", void 0);
__decorate([
column(),
__metadata("design:type", String)
], Information.prototype, "headline", void 0);
__decorate([
column(),
__metadata("design:type", String)
], Information.prototype, "contact", void 0);
__decorate([
column(),
__metadata("design:type", Object)
], Information.prototype, "linkedin", void 0);
__decorate([
column(),
__metadata("design:type", Object)
], Information.prototype, "github", void 0);
__decorate([
column.date(),
__metadata("design:type", Object)
], Information.prototype, "birthday", void 0);
__decorate([
column.dateTime({ autoCreate: true }),
__metadata("design:type", DateTime)
], Information.prototype, "createdAt", void 0);
__decorate([
column.dateTime({ autoCreate: true, autoUpdate: true }),
__metadata("design:type", Object)
], Information.prototype, "updatedAt", void 0);
//# sourceMappingURL=information.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"information.js","sourceRoot":"","sources":["../../../app/models/information.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,SAAS;CA2BjD;AAzBS;IADP,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;uCACV;AAGV;IADP,MAAM,EAAE;;yCACW;AAGZ;IADP,MAAM,EAAE;;6CACe;AAGhB;IADP,MAAM,EAAE;;4CACc;AAGf;IADP,MAAM,EAAE;;6CACsB;AAGvB;IADP,MAAM,EAAE;;2CACoB;AAGrB;IADP,MAAM,CAAC,IAAI,EAAE;;6CACmB;AAGzB;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;8BACnB,QAAQ;8CAAA;AAGnB;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;8CACtB"}

34
app/models/music.js Normal file
View File

@@ -0,0 +1,34 @@
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { DateTime } from 'luxon';
import { BaseModel, column } from '@adonisjs/lucid/orm';
export default class Music extends BaseModel {
}
__decorate([
column({ isPrimary: true }),
__metadata("design:type", Number)
], Music.prototype, "id", void 0);
__decorate([
column(),
__metadata("design:type", String)
], Music.prototype, "name", void 0);
__decorate([
column(),
__metadata("design:type", String)
], Music.prototype, "url", void 0);
__decorate([
column.dateTime({ autoCreate: true }),
__metadata("design:type", DateTime)
], Music.prototype, "createdAt", void 0);
__decorate([
column.dateTime({ autoCreate: true, autoUpdate: true }),
__metadata("design:type", Object)
], Music.prototype, "updatedAt", void 0);
//# sourceMappingURL=music.js.map

1
app/models/music.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"music.js","sourceRoot":"","sources":["../../../app/models/music.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,SAAS;CAe3C;AAbS;IADP,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;iCACV;AAGV;IADP,MAAM,EAAE;;mCACW;AAGZ;IADP,MAAM,EAAE;;kCACU;AAGX;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;8BACnB,QAAQ;wCAAA;AAGnB;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;wCACtB"}

82
app/models/project.js Normal file
View File

@@ -0,0 +1,82 @@
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { DateTime } from 'luxon';
import { BaseModel, column, belongsTo, manyToMany } from '@adonisjs/lucid/orm';
import Category from '#models/category';
import Tag from '#models/tag';
import Training from '#models/training';
import Experience from '#models/experience';
export default class Project extends BaseModel {
}
__decorate([
column({ isPrimary: true }),
__metadata("design:type", Number)
], Project.prototype, "id", void 0);
__decorate([
column(),
__metadata("design:type", String)
], Project.prototype, "title", void 0);
__decorate([
column(),
__metadata("design:type", Object)
], Project.prototype, "content", void 0);
__decorate([
column.date(),
__metadata("design:type", Object)
], Project.prototype, "start", void 0);
__decorate([
column.date(),
__metadata("design:type", Object)
], Project.prototype, "end", void 0);
__decorate([
column(),
__metadata("design:type", Object)
], Project.prototype, "thumbnailUrl", void 0);
__decorate([
column(),
__metadata("design:type", Object)
], Project.prototype, "categoryId", void 0);
__decorate([
column.dateTime({ autoCreate: true }),
__metadata("design:type", DateTime)
], Project.prototype, "createdAt", void 0);
__decorate([
column.dateTime({ autoCreate: true, autoUpdate: true }),
__metadata("design:type", Object)
], Project.prototype, "updatedAt", void 0);
__decorate([
belongsTo(() => Category),
__metadata("design:type", Object)
], Project.prototype, "category", void 0);
__decorate([
manyToMany(() => Tag, {
pivotTable: 'project_tag',
pivotForeignKey: 'project_id',
pivotRelatedForeignKey: 'tag_id',
}),
__metadata("design:type", Object)
], Project.prototype, "tags", void 0);
__decorate([
manyToMany(() => Training, {
pivotTable: 'project_training',
pivotForeignKey: 'project_id',
pivotRelatedForeignKey: 'training_id',
}),
__metadata("design:type", Object)
], Project.prototype, "trainings", void 0);
__decorate([
manyToMany(() => Experience, {
pivotTable: 'experience_project',
pivotForeignKey: 'project_id',
pivotRelatedForeignKey: 'experience_id',
}),
__metadata("design:type", Object)
], Project.prototype, "experiences", void 0);
//# sourceMappingURL=project.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../app/models/project.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAE9E,OAAO,QAAQ,MAAM,kBAAkB,CAAA;AACvC,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,QAAQ,MAAM,kBAAkB,CAAA;AACvC,OAAO,UAAU,MAAM,oBAAoB,CAAA;AAE3C,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,SAAS;CAmD7C;AAjDS;IADP,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;mCACV;AAGV;IADP,MAAM,EAAE;;sCACY;AAGb;IADP,MAAM,EAAE;;wCACqB;AAGtB;IADP,MAAM,CAAC,IAAI,EAAE;;sCACgB;AAGtB;IADP,MAAM,CAAC,IAAI,EAAE;;oCACc;AAGpB;IADP,MAAM,EAAE;;6CAC0B;AAG3B;IADP,MAAM,EAAE;;2CACwB;AAGzB;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;8BACnB,QAAQ;0CAAA;AAGnB;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;0CACtB;AAG1B;IADP,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC;;yCACkB;AAOpC;IALP,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE;QACrB,UAAU,EAAE,aAAa;QACzB,eAAe,EAAE,YAAY;QAC7B,sBAAsB,EAAE,QAAQ;KACjC,CAAC;;qCACkC;AAO5B;IALP,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAC1B,UAAU,EAAE,kBAAkB;QAC9B,eAAe,EAAE,YAAY;QAC7B,sBAAsB,EAAE,aAAa;KACtC,CAAC;;0CAC4C;AAOtC;IALP,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE;QAC5B,UAAU,EAAE,oBAAoB;QAChC,eAAe,EAAE,YAAY;QAC7B,sBAAsB,EAAE,eAAe;KACxC,CAAC;;4CACgD"}

43
app/models/tag.js Normal file
View File

@@ -0,0 +1,43 @@
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { DateTime } from 'luxon';
import { BaseModel, column, manyToMany } from '@adonisjs/lucid/orm';
import Project from '#models/project';
export default class Tag extends BaseModel {
}
__decorate([
column({ isPrimary: true }),
__metadata("design:type", Number)
], Tag.prototype, "id", void 0);
__decorate([
column(),
__metadata("design:type", String)
], Tag.prototype, "name", void 0);
__decorate([
column(),
__metadata("design:type", Object)
], Tag.prototype, "color", void 0);
__decorate([
column.dateTime({ autoCreate: true }),
__metadata("design:type", DateTime)
], Tag.prototype, "createdAt", void 0);
__decorate([
column.dateTime({ autoCreate: true, autoUpdate: true }),
__metadata("design:type", Object)
], Tag.prototype, "updatedAt", void 0);
__decorate([
manyToMany(() => Project, {
pivotTable: 'project_tag',
pivotForeignKey: 'tag_id',
pivotRelatedForeignKey: 'project_id',
}),
__metadata("design:type", Object)
], Tag.prototype, "projects", void 0);
//# sourceMappingURL=tag.js.map

1
app/models/tag.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"tag.js","sourceRoot":"","sources":["../../../app/models/tag.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEnE,OAAO,OAAO,MAAM,iBAAiB,CAAA;AAErC,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,SAAS;CAsBzC;AApBS;IADP,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;+BACV;AAGV;IADP,MAAM,EAAE;;iCACW;AAGZ;IADP,MAAM,EAAE;;kCACmB;AAGpB;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;8BACnB,QAAQ;sCAAA;AAGnB;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;sCACtB;AAO1B;IALP,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;QACzB,UAAU,EAAE,aAAa;QACzB,eAAe,EAAE,QAAQ;QACzB,sBAAsB,EAAE,YAAY;KACrC,CAAC;;qCAC0C"}

55
app/models/training.js Normal file
View File

@@ -0,0 +1,55 @@
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { DateTime } from 'luxon';
import { BaseModel, column, manyToMany } from '@adonisjs/lucid/orm';
import Project from '#models/project';
export default class Training extends BaseModel {
}
__decorate([
column({ isPrimary: true }),
__metadata("design:type", Number)
], Training.prototype, "id", void 0);
__decorate([
column(),
__metadata("design:type", String)
], Training.prototype, "name", void 0);
__decorate([
column.date(),
__metadata("design:type", Object)
], Training.prototype, "start", void 0);
__decorate([
column.date(),
__metadata("design:type", Object)
], Training.prototype, "end", void 0);
__decorate([
column(),
__metadata("design:type", Object)
], Training.prototype, "skill", void 0);
__decorate([
column(),
__metadata("design:type", Object)
], Training.prototype, "place", void 0);
__decorate([
column.dateTime({ autoCreate: true }),
__metadata("design:type", DateTime)
], Training.prototype, "createdAt", void 0);
__decorate([
column.dateTime({ autoCreate: true, autoUpdate: true }),
__metadata("design:type", Object)
], Training.prototype, "updatedAt", void 0);
__decorate([
manyToMany(() => Project, {
pivotTable: 'project_training',
pivotForeignKey: 'training_id',
pivotRelatedForeignKey: 'project_id',
}),
__metadata("design:type", Object)
], Training.prototype, "projects", void 0);
//# sourceMappingURL=training.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"training.js","sourceRoot":"","sources":["../../../app/models/training.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEnE,OAAO,OAAO,MAAM,iBAAiB,CAAA;AAErC,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,SAAS;CA+B9C;AA7BS;IADP,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;oCACV;AAGV;IADP,MAAM,EAAE;;sCACW;AAGZ;IADP,MAAM,CAAC,IAAI,EAAE;;uCACgB;AAGtB;IADP,MAAM,CAAC,IAAI,EAAE;;qCACc;AAGpB;IADP,MAAM,EAAE;;uCACmB;AAGpB;IADP,MAAM,EAAE;;uCACmB;AAGpB;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;8BACnB,QAAQ;2CAAA;AAGnB;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;2CACtB;AAO1B;IALP,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;QACzB,UAAU,EAAE,kBAAkB;QAC9B,eAAe,EAAE,aAAa;QAC9B,sBAAsB,EAAE,YAAY;KACrC,CAAC;;0CAC0C"}

45
app/models/user.js Normal file
View File

@@ -0,0 +1,45 @@
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { DateTime } from 'luxon';
import hash from '@adonisjs/core/services/hash';
import { compose } from '@adonisjs/core/helpers';
import { BaseModel, column } from '@adonisjs/lucid/orm';
import { withAuthFinder } from '@adonisjs/auth/mixins/lucid';
const AuthFinder = withAuthFinder(() => hash.use('scrypt'), {
uids: ['email'],
passwordColumnName: 'password',
});
export default class User extends compose(BaseModel, AuthFinder) {
}
__decorate([
column({ isPrimary: true }),
__metadata("design:type", Number)
], User.prototype, "id", void 0);
__decorate([
column(),
__metadata("design:type", Object)
], User.prototype, "fullName", void 0);
__decorate([
column(),
__metadata("design:type", String)
], User.prototype, "email", void 0);
__decorate([
column({ serializeAs: null }),
__metadata("design:type", String)
], User.prototype, "password", void 0);
__decorate([
column.dateTime({ autoCreate: true }),
__metadata("design:type", DateTime)
], User.prototype, "createdAt", void 0);
__decorate([
column.dateTime({ autoCreate: true, autoUpdate: true }),
__metadata("design:type", Object)
], User.prototype, "updatedAt", void 0);
//# sourceMappingURL=user.js.map

1
app/models/user.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../app/models/user.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,IAAI,MAAM,8BAA8B,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAE5D,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;IAC1D,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,kBAAkB,EAAE,UAAU;CAC/B,CAAC,CAAA;AAEF,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC;CAkB/D;AAhBS;IADP,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;gCACV;AAGV;IADP,MAAM,EAAE;;sCACsB;AAGvB;IADP,MAAM,EAAE;;mCACY;AAGb;IADP,MAAM,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;;sCACN;AAGhB;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;8BACnB,QAAQ;uCAAA;AAGnB;IADP,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;uCACtB"}

24
bin/console.js Normal file
View File

@@ -0,0 +1,24 @@
import 'reflect-metadata';
import { Ignitor, prettyPrintError } from '@adonisjs/core';
const APP_ROOT = new URL('../', import.meta.url);
const IMPORTER = (filePath) => {
if (filePath.startsWith('./') || filePath.startsWith('../')) {
return import(new URL(filePath, APP_ROOT).href);
}
return import(filePath);
};
new Ignitor(APP_ROOT, { importer: IMPORTER })
.tap((app) => {
app.booting(async () => {
await import('#start/env');
});
app.listen('SIGTERM', () => app.terminate());
app.listenIf(app.managedByPm2, 'SIGINT', () => app.terminate());
})
.ace()
.handle(process.argv.splice(2))
.catch((error) => {
process.exitCode = 1;
prettyPrintError(error);
});
//# sourceMappingURL=console.js.map

1
bin/console.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../bin/console.ts"],"names":[],"mappings":"AAaA,OAAO,kBAAkB,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAM1D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAMhD,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,EAAE;IACpC,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAA;IACjD,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAA;AACzB,CAAC,CAAA;AAED,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;KAC1C,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;IACX,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;QACrB,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IACF,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;IAC5C,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;AACjE,CAAC,CAAC;KACD,GAAG,EAAE;KACL,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;KAC9B,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACf,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IACpB,gBAAgB,CAAC,KAAK,CAAC,CAAA;AACzB,CAAC,CAAC,CAAA"}

24
bin/server.js Normal file
View File

@@ -0,0 +1,24 @@
import 'reflect-metadata';
import { Ignitor, prettyPrintError } from '@adonisjs/core';
const APP_ROOT = new URL('../', import.meta.url);
const IMPORTER = (filePath) => {
if (filePath.startsWith('./') || filePath.startsWith('../')) {
return import(new URL(filePath, APP_ROOT).href);
}
return import(filePath);
};
new Ignitor(APP_ROOT, { importer: IMPORTER })
.tap((app) => {
app.booting(async () => {
await import('#start/env');
});
app.listen('SIGTERM', () => app.terminate());
app.listenIf(app.managedByPm2, 'SIGINT', () => app.terminate());
})
.httpServer()
.start()
.catch((error) => {
process.exitCode = 1;
prettyPrintError(error);
});
//# sourceMappingURL=server.js.map

1
bin/server.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../bin/server.ts"],"names":[],"mappings":"AAWA,OAAO,kBAAkB,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAM1D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAMhD,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,EAAE;IACpC,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAA;IACjD,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAA;AACzB,CAAC,CAAA;AAED,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;KAC1C,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;IACX,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;QACrB,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IACF,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;IAC5C,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;AACjE,CAAC,CAAC;KACD,UAAU,EAAE;KACZ,KAAK,EAAE;KACP,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACf,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IACpB,gBAAgB,CAAC,KAAK,CAAC,CAAA;AACzB,CAAC,CAAC,CAAA"}

38
bin/test.js Normal file
View File

@@ -0,0 +1,38 @@
process.env.NODE_ENV = 'test';
import 'reflect-metadata';
import { Ignitor, prettyPrintError } from '@adonisjs/core';
import { configure, processCLIArgs, run } from '@japa/runner';
const APP_ROOT = new URL('../', import.meta.url);
const IMPORTER = (filePath) => {
if (filePath.startsWith('./') || filePath.startsWith('../')) {
return import(new URL(filePath, APP_ROOT).href);
}
return import(filePath);
};
new Ignitor(APP_ROOT, { importer: IMPORTER })
.tap((app) => {
app.booting(async () => {
await import('#start/env');
});
app.listen('SIGTERM', () => app.terminate());
app.listenIf(app.managedByPm2, 'SIGINT', () => app.terminate());
})
.testRunner()
.configure(async (app) => {
const { runnerHooks, ...config } = await import('../tests/bootstrap.js');
processCLIArgs(process.argv.splice(2));
configure({
...app.rcFile.tests,
...config,
...{
setup: runnerHooks.setup,
teardown: runnerHooks.teardown.concat([() => app.terminate()]),
},
});
})
.run(() => run())
.catch((error) => {
process.exitCode = 1;
prettyPrintError(error);
});
//# sourceMappingURL=test.js.map

1
bin/test.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../bin/test.ts"],"names":[],"mappings":"AAYA,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAA;AAE7B,OAAO,kBAAkB,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAM7D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAMhD,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,EAAE;IACpC,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAA;IACjD,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAA;AACzB,CAAC,CAAA;AAED,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;KAC1C,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;IACX,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;QACrB,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IACF,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;IAC5C,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;AACjE,CAAC,CAAC;KACD,UAAU,EAAE;KACZ,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACvB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAA;IAExE,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACtC,SAAS,CAAC;QACR,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK;QACnB,GAAG,MAAM;QACT,GAAG;YACD,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;SAC/D;KACF,CAAC,CAAA;AACJ,CAAC,CAAC;KACD,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;KAChB,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACf,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IACpB,gBAAgB,CAAC,KAAK,CAAC,CAAA;AACzB,CAAC,CAAC,CAAA"}

52
commands/check_user.js Normal file
View File

@@ -0,0 +1,52 @@
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { BaseCommand, args } from '@adonisjs/core/ace';
export default class CheckUser extends BaseCommand {
static commandName = 'check:password';
static description = 'Verify password for admin@portfolio.local';
static options = {
startApp: true,
};
async run() {
const { default: User } = await import('#models/user');
const { default: hash } = await import('@adonisjs/core/services/hash');
const email = 'admin@portfolio.local';
let password = this.password;
if (!password) {
password = await this.prompt.secure('Enter password for ' + email);
}
this.logger.info(`Verifying credentials for ${email}...`);
try {
const user = await User.findBy('email', email);
if (!user) {
this.logger.error('User not found!');
return;
}
this.logger.info(`User ID: ${user.id}`);
this.logger.info(`Stored Hash: ${user.password.substring(0, 20)}...`);
const isValid = await hash.verify(user.password, password);
this.logger.info(`Hash Check (scrypt): ${isValid}`);
if (isValid) {
this.logger.success('Password is CORRECT!');
}
else {
this.logger.error('Password is INCORRECT!');
}
}
catch (error) {
this.logger.error(error);
}
}
}
__decorate([
args.string({ description: 'Password to verify', required: false }),
__metadata("design:type", String)
], CheckUser.prototype, "password", void 0);
//# sourceMappingURL=check_user.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"check_user.js","sourceRoot":"","sources":["../../commands/check_user.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAGtD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,WAAW,GAAG,gBAAgB,CAAA;IACrC,MAAM,CAAC,WAAW,GAAG,2CAA2C,CAAA;IAEhE,MAAM,CAAC,OAAO,GAAmB;QAC/B,QAAQ,EAAE,IAAI;KACf,CAAA;IAKD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;QACtD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAA;QAEtE,MAAM,KAAK,GAAG,uBAAuB,CAAA;QACrC,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAE5B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,qBAAqB,GAAG,KAAK,CAAC,CAAA;QACpE,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,KAAK,KAAK,CAAC,CAAA;QAEzD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;gBACpC,OAAM;YACR,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;YACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAA;YAErE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YAC1D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAA;YAEnD,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;YAC7C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;YAC7C,CAAC;QAEH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;;AArCO;IADP,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;;2CAC5C"}

49
commands/debug_hash.js Normal file
View File

@@ -0,0 +1,49 @@
import { BaseCommand } from '@adonisjs/core/ace';
export default class DebugHash extends BaseCommand {
static commandName = 'debug:hash';
static description = 'Debug hashing and DB storage';
static options = {
startApp: true,
};
async run() {
const { default: hash } = await import('@adonisjs/core/services/hash');
const { default: User } = await import('#models/user');
const { default: db } = await import('@adonisjs/lucid/services/db');
console.log('--- Starting Hash Debug ---');
const password = 'admin123';
const hashed = await hash.make(password);
console.log(`Original Password: ${password}`);
console.log(`Generated Hash (len=${hashed.length}): ${hashed}`);
const verifyImmediate = await hash.verify(hashed, password);
console.log(`Immediate Verify: ${verifyImmediate}`);
const email = 'admin@portfolio.local';
const user = await User.findBy('email', email);
if (user) {
console.log(`\nUpdating user ${user.id} with new hash via RAW DB...`);
await db.from('users').where('id', user.id).update({ password: hashed });
const userReloaded = await User.find(user.id);
if (!userReloaded)
return;
console.log(`Reloaded Model Hash (len=${userReloaded.password.length}): ${userReloaded.password}`);
if (userReloaded.password !== hashed) {
console.error('MISMATCH! storage altered the hash.');
console.error(`Expected: ${hashed}`);
console.error(`Actual: ${userReloaded.password}`);
}
else {
console.log('MATCH! Storage preserved the hash.');
}
const verifyModel = await hash.verify(userReloaded.password, password);
console.log(`Model Verify: ${verifyModel}`);
const rawUser = await db.from('users').where('id', user.id).first();
console.log(`Raw DB Hash (len=${rawUser.password.length}): ${rawUser.password}`);
if (rawUser.password !== hashed) {
console.error('MISMATCH in Raw DB!');
}
}
else {
console.error('User not found!');
}
}
}
//# sourceMappingURL=debug_hash.js.map

View File

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

51
commands/fix_dates.js Normal file
View File

@@ -0,0 +1,51 @@
import { BaseCommand } from '@adonisjs/core/ace';
export default class FixDates extends BaseCommand {
static commandName = 'fix:dates';
static description = 'Fix invalid ISO dates in SQLite database';
static options = {
startApp: true,
};
async run() {
const { default: db } = await import('@adonisjs/lucid/services/db');
const { DateTime } = await import('luxon');
const tables = [
'projects', 'categories', 'tags', 'trainings',
'experiences', 'music', 'information', 'images', 'users'
];
this.logger.info('Starting to fix dates in the database...');
let totalFixed = 0;
for (const table of tables) {
try {
const rows = await db.from(table).select('*');
let tableFixed = 0;
for (const row of rows) {
const updates = {};
for (const [key, value] of Object.entries(row)) {
if (typeof value === 'string' && value.includes('T')) {
const parsed = DateTime.fromISO(value);
if (parsed.isValid) {
updates[key] = parsed.toFormat('yyyy-MM-dd HH:mm:ss');
}
}
}
if (Object.keys(updates).length > 0) {
await db.from(table).where('id', row.id).update(updates);
tableFixed++;
totalFixed++;
}
}
if (tableFixed > 0) {
this.logger.success(`Fixed ${tableFixed} rows in table "${table}"`);
}
else {
this.logger.info(`No invalid dates found in table "${table}"`);
}
}
catch (error) {
this.logger.warning(`Failed to process table "${table}": ${error.message}`);
}
}
this.logger.success(`Date fixing complete! Total rows fixed: ${totalFixed}`);
}
}
//# sourceMappingURL=fix_dates.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"fix_dates.js","sourceRoot":"","sources":["../../commands/fix_dates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGhD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC7C,MAAM,CAAC,WAAW,GAAG,WAAW,CAAA;IAChC,MAAM,CAAC,WAAW,GAAG,0CAA0C,CAAA;IAE/D,MAAM,CAAC,OAAO,GAAmB;QAC7B,QAAQ,EAAE,IAAI;KACjB,CAAA;IAED,KAAK,CAAC,GAAG;QACL,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAA;QACnE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAA;QAE1C,MAAM,MAAM,GAAG;YACX,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW;YAC7C,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO;SAC3D,CAAA;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;QAE5D,IAAI,UAAU,GAAG,CAAC,CAAA;QAElB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAC7C,IAAI,UAAU,GAAG,CAAC,CAAA;gBAElB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACrB,MAAM,OAAO,GAAQ,EAAE,CAAA;oBACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;4BACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;4BACtC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gCACjB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAA;4BACzD,CAAC;wBACL,CAAC;oBACL,CAAC;oBAED,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAClC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;wBACxD,UAAU,EAAE,CAAA;wBACZ,UAAU,EAAE,CAAA;oBAChB,CAAC;gBACL,CAAC;gBAED,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;oBACjB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,UAAU,mBAAmB,KAAK,GAAG,CAAC,CAAA;gBACvE,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,KAAK,GAAG,CAAC,CAAA;gBAClE,CAAC;YACL,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBAClB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,4BAA4B,KAAK,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;YAC/E,CAAC;QACL,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAA;IAChF,CAAC"}

View File

@@ -0,0 +1,34 @@
import { BaseCommand } from '@adonisjs/core/ace';
export default class ResetPassword extends BaseCommand {
static commandName = 'reset:password';
static description = 'Reset admin password';
static options = {
startApp: true,
};
async run() {
const { default: User } = await import('#models/user');
const { default: hash } = await import('@adonisjs/core/services/hash');
const email = 'admin@portfolio.local';
this.logger.info(`Resetting password for ${email}...`);
try {
const user = await User.findBy('email', email);
if (!user) {
this.logger.error('User not found in database!');
return;
}
this.logger.info(`User found: ${user.id}`);
const newPassword = await this.prompt.secure('Enter new password (default: admin123)') || 'admin123';
const { default: db } = await import('@adonisjs/lucid/services/db');
await db.from('users').where('id', user.id).update({
password: await hash.make(newPassword),
updated_at: new Date().toISOString()
});
this.logger.success(`Password for ${email} has been reset to: ${newPassword}`);
this.logger.info('Please try logging in now.');
}
catch (error) {
this.logger.error(error);
}
}
}
//# sourceMappingURL=reset_password.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"reset_password.js","sourceRoot":"","sources":["../../commands/reset_password.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGhD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,MAAM,CAAC,WAAW,GAAG,gBAAgB,CAAA;IACrC,MAAM,CAAC,WAAW,GAAG,sBAAsB,CAAA;IAE3C,MAAM,CAAC,OAAO,GAAmB;QAC/B,QAAQ,EAAE,IAAI;KACf,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;QACtD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAA;QAEtE,MAAM,KAAK,GAAG,uBAAuB,CAAA;QACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,KAAK,KAAK,CAAC,CAAA;QAEtD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YAE9C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;gBAChD,OAAM;YACR,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;YAE1C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,wCAAwC,CAAC,IAAI,UAAU,CAAA;YAEpG,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAA;YAEnE,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;gBACjD,QAAQ,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;gBACtC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACrC,CAAC,CAAA;YAIF,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,KAAK,uBAAuB,WAAW,EAAE,CAAC,CAAA;YAC9E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;QAEhD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC"}

19
config/app.js Normal file
View File

@@ -0,0 +1,19 @@
import env from '#start/env';
import app from '@adonisjs/core/services/app';
import { Secret } from '@adonisjs/core/helpers';
import { defineConfig } from '@adonisjs/core/http';
export const appKey = new Secret(env.get('APP_KEY'));
export const http = defineConfig({
generateRequestId: true,
allowMethodSpoofing: true,
useAsyncLocalStorage: false,
cookie: {
domain: '',
path: '/',
maxAge: '2h',
httpOnly: true,
secure: app.inProduction,
sameSite: 'lax',
},
});
//# sourceMappingURL=app.js.map

1
config/app.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../config/app.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,YAAY,CAAA;AAC5B,OAAO,GAAG,MAAM,6BAA6B,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AASlD,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;AAKpD,MAAM,CAAC,MAAM,IAAI,GAAG,YAAY,CAAC;IAC/B,iBAAiB,EAAE,IAAI;IACvB,mBAAmB,EAAE,IAAI;IAMzB,oBAAoB,EAAE,KAAK;IAM3B,MAAM,EAAE;QACN,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,GAAG,CAAC,YAAY;QACxB,QAAQ,EAAE,KAAK;KAChB;CACF,CAAC,CAAA"}

15
config/auth.js Normal file
View File

@@ -0,0 +1,15 @@
import { defineConfig } from '@adonisjs/auth';
import { sessionGuard, sessionUserProvider } from '@adonisjs/auth/session';
const authConfig = defineConfig({
default: 'web',
guards: {
web: sessionGuard({
useRememberMeTokens: false,
provider: sessionUserProvider({
model: () => import('#models/user')
}),
}),
},
});
export default authConfig;
//# sourceMappingURL=auth.js.map

1
config/auth.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../config/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAG1E,MAAM,UAAU,GAAG,YAAY,CAAC;IAC9B,OAAO,EAAE,KAAK;IACd,MAAM,EAAE;QACN,GAAG,EAAE,YAAY,CAAC;YAChB,mBAAmB,EAAE,KAAK;YAC1B,QAAQ,EAAE,mBAAmB,CAAC;gBAC5B,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC;aACpC,CAAC;SACH,CAAC;KACH;CACF,CAAC,CAAA;AAEF,eAAe,UAAU,CAAA"}

26
config/bodyparser.js Normal file
View File

@@ -0,0 +1,26 @@
import { defineConfig } from '@adonisjs/core/bodyparser';
const bodyParserConfig = defineConfig({
allowedMethods: ['POST', 'PUT', 'PATCH', 'DELETE'],
form: {
convertEmptyStringsToNull: true,
types: ['application/x-www-form-urlencoded'],
},
json: {
convertEmptyStringsToNull: true,
types: [
'application/json',
'application/json-patch+json',
'application/vnd.api+json',
'application/csp-report',
],
},
multipart: {
autoProcess: true,
convertEmptyStringsToNull: true,
processManually: [],
limit: '20mb',
types: ['multipart/form-data'],
},
});
export default bodyParserConfig;
//# sourceMappingURL=bodyparser.js.map

1
config/bodyparser.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"bodyparser.js","sourceRoot":"","sources":["../../config/bodyparser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,MAAM,gBAAgB,GAAG,YAAY,CAAC;IAKpC,cAAc,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC;IAMlD,IAAI,EAAE;QACJ,yBAAyB,EAAE,IAAI;QAC/B,KAAK,EAAE,CAAC,mCAAmC,CAAC;KAC7C;IAKD,IAAI,EAAE;QACJ,yBAAyB,EAAE,IAAI;QAC/B,KAAK,EAAE;YACL,kBAAkB;YAClB,6BAA6B;YAC7B,0BAA0B;YAC1B,wBAAwB;SACzB;KACF;IAMD,SAAS,EAAE;QAMT,WAAW,EAAE,IAAI;QACjB,yBAAyB,EAAE,IAAI;QAC/B,eAAe,EAAE,EAAE;QAMnB,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,CAAC,qBAAqB,CAAC;KAC/B;CACF,CAAC,CAAA;AAEF,eAAe,gBAAgB,CAAA"}

12
config/cors.js Normal file
View File

@@ -0,0 +1,12 @@
import { defineConfig } from '@adonisjs/cors';
const corsConfig = defineConfig({
enabled: true,
origin: ['http://localhost:4200', 'http://127.0.0.1:4200', 'https://portfolio.nucleus-ludus.fr', 'https://www.portfolio.nucleus-ludus.fr'],
methods: ['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
headers: true,
exposeHeaders: [],
credentials: true,
maxAge: 90,
});
export default corsConfig;
//# sourceMappingURL=cors.js.map

1
config/cors.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../../config/cors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,MAAM,UAAU,GAAG,YAAY,CAAC;IAI9B,OAAO,EAAE,IAAI;IAMb,MAAM,EAAE,CAAC,uBAAuB,EAAE,uBAAuB,EAAE,oCAAoC,EAAE,wCAAwC,CAAC;IAK1I,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;IAMrE,OAAO,EAAE,IAAI;IAKb,aAAa,EAAE,EAAE;IAKjB,WAAW,EAAE,IAAI;IAKjB,MAAM,EAAE,EAAE;CACX,CAAC,CAAA;AAEF,eAAe,UAAU,CAAA"}

20
config/database.js Normal file
View File

@@ -0,0 +1,20 @@
import app from '@adonisjs/core/services/app';
import { defineConfig } from '@adonisjs/lucid';
const dbConfig = defineConfig({
connection: 'sqlite',
connections: {
sqlite: {
client: 'better-sqlite3',
connection: {
filename: app.makePath('database/db.sqlite3')
},
useNullAsDefault: true,
migrations: {
naturalSort: true,
paths: ['database/migrations'],
},
},
},
});
export default dbConfig;
//# sourceMappingURL=database.js.map

1
config/database.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../config/database.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,6BAA6B,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,MAAM,QAAQ,GAAG,YAAY,CAAC;IAC5B,UAAU,EAAE,QAAQ;IACpB,WAAW,EAAE;QACX,MAAM,EAAE;YACN,MAAM,EAAE,gBAAgB;YACxB,UAAU,EAAE;gBACV,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC;aAC9C;YACD,gBAAgB,EAAE,IAAI;YACtB,UAAU,EAAE;gBACV,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,CAAC,qBAAqB,CAAC;aAC/B;SACF;KACF;CACF,CAAC,CAAA;AAEF,eAAe,QAAQ,CAAA"}

14
config/hash.js Normal file
View File

@@ -0,0 +1,14 @@
import { defineConfig, drivers } from '@adonisjs/core/hash';
const hashConfig = defineConfig({
default: 'scrypt',
list: {
scrypt: drivers.scrypt({
cost: 16384,
blockSize: 8,
parallelization: 1,
maxMemory: 33554432,
}),
},
});
export default hashConfig;
//# sourceMappingURL=hash.js.map

1
config/hash.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../config/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAE3D,MAAM,UAAU,GAAG,YAAY,CAAC;IAC9B,OAAO,EAAE,QAAQ;IAEjB,IAAI,EAAE;QACJ,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;YACrB,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,CAAC;YACZ,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,QAAQ;SACpB,CAAC;KACH;CACF,CAAC,CAAA;AAEF,eAAe,UAAU,CAAA"}

21
config/logger.js Normal file
View File

@@ -0,0 +1,21 @@
import env from '#start/env';
import app from '@adonisjs/core/services/app';
import { defineConfig, targets } from '@adonisjs/core/logger';
const loggerConfig = defineConfig({
default: 'app',
loggers: {
app: {
enabled: true,
name: env.get('APP_NAME'),
level: env.get('LOG_LEVEL'),
transport: {
targets: targets()
.pushIf(!app.inProduction, targets.pretty())
.pushIf(app.inProduction, targets.file({ destination: 1 }))
.toArray(),
},
},
},
});
export default loggerConfig;
//# sourceMappingURL=logger.js.map

1
config/logger.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../config/logger.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,YAAY,CAAA;AAC5B,OAAO,GAAG,MAAM,6BAA6B,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAE7D,MAAM,YAAY,GAAG,YAAY,CAAC;IAChC,OAAO,EAAE,KAAK;IAMd,OAAO,EAAE;QACP,GAAG,EAAE;YACH,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC;YACzB,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC;YAC3B,SAAS,EAAE;gBACT,OAAO,EAAE,OAAO,EAAE;qBACf,MAAM,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;qBAC3C,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;qBAC1D,OAAO,EAAE;aACb;SACF;KACF;CACF,CAAC,CAAA;AAEF,eAAe,YAAY,CAAA"}

Some files were not shown because too many files have changed in this diff Show More