namespace App\Http\Controllers\Api; use App\Http\Resources\ProfileResource; use App\Models\Profile; class ProfileController extends Controller { public function me(): ProfileResource { return new ProfileResource(Profile::firstOrFail()); } }
namespace App\Http\Controllers\Api; use App\Http\Resources\ProjectResource; use App\Models\Project; class ProjectController extends Controller { public function index() { return ProjectResource::collection( Project::with(['company', 'stack'])->oldest()->get() ); } }
namespace App\Http\Controllers\Api; use App\Models\Skill; class StackController extends Controller { public function index() { $stacks = Skill::all() ->groupBy('category') ->map(fn ($skills) => $skills->pluck('name')); return response()->json($stacks); } }
namespace App\Http\Controllers\Api; use App\Http\Requests\ContactRequest; use App\Mail\ContactMail; use Illuminate\Support\Facades\Mail; class ContactController extends Controller { public function store(ContactRequest $request) { Mail::to(config('contact.email')) ->queue(new ContactMail($request->validated())); return response()->json(['message' => 'Message envoyé.'], 201); } }
namespace App\Http\Controllers\Api; class CvController extends Controller { public function download() { return response()->download(storage_path('app/private/CV-Alexis-Yanguas.pdf')); } }
use App\Http\Controllers\Api\{ContactController, CvController, ProfileController, ProjectController, StackController}; use Illuminate\Support\Facades\Route; Route::prefix('v1')->group(function () { Route::get('/me', [ProfileController::class, 'me']); Route::get('/projects', [ProjectController::class, 'index']); Route::get('/stacks', [StackController::class, 'index']); Route::post('/contact', [ContactController::class, 'store']); Route::get('/cv', [CvController::class, 'download']); }); $$\ $$\ $$ | $$ | $$ | $$$$$$\ $$$$$$\ $$$$$$\ $$\ $$\ $$$$$$\ $$ | $$ | \____$$\ $$ __$$\ \____$$\ \$$\ $$ |$$ __$$\ $$ | $$ | $$$$$$$ |$$ | \__| $$$$$$$ | \$$\$$ / $$$$$$$$ |$$ | $$ | $$ __$$ |$$ | $$ __$$ | \$$$ / $$ ____|$$ | $$$$$$$$\ \$$$$$$$ |$$ | \$$$$$$$ | \$ / \$$$$$$$\ $$ | \________| \_______|\__| \_______| \_/ \_______|\__|
{ "name": "Alexis Yanguas", "role": "Développeur Full-Stack", "focus": "backend", "pitch": "Le jour, un écosystème logiciel d'entreprise. Le soir, des projets sur mesure.", "location": "Chalon-sur-Saône", "available": true }
ITSM de suivi des tickets, avec préfacturation, CRM et outils internes reliés au planning, à la facturation et aux livraisons. Les tickets arrivent aussi via le portail et son API ; pour certains clients, l'intégration est développée sur mesure avec une interconnexion dédiée.
ERP/CRM : gestion, planning, devis, trésorerie et espace partenaire, avec hub SSO et permissions par application. De la maquette à la mise en production.
API du portail client de l'ITSM. Schémas générés dynamiquement selon les permissions configurées pour chaque client.
Application mobile Android de l'ERP/CRM pour le planning terrain et l'accès à l'espace partenaire.
Site vitrine avec back-office Filament, relié à l'ERP/CRM pour la remontée des demandes de contact.
{ "backend": [ "PHP", "Laravel" ], "data": [ "MySQL", "PostgreSQL" ], "front": [ "ReactJS", "TypeScript", "Tailwind", "LESS" ], "mobile": [ "React Native" ], "realtime": [ "Pusher" ], "infra": [ "Git", "Linux", "macOS", "Cloudflare R2" ] }