import type { HttpContext } from '@adonisjs/core/http' import vpsConfig from '#config/vps' import UserError from '#exceptions/user_error' import projectService, { PROJECT_ACTIONS, type ProjectAction } from '#services/project_service' import { DEFAULT_NODE_COMMAND } from '#services/templates' import { actor } from '#services/audit' import { createProjectValidator, projectActionValidator } from '#validators/project' export default class ProjectsController { async index() { return projectService.list() } /** * Values used by the "new project" form. */ async options() { return { baseDomain: vpsConfig.baseDomain, categories: vpsConfig.projectCategories, srvRoot: vpsConfig.srvRoot, defaultNodeCommand: DEFAULT_NODE_COMMAND, } } async show({ params }: HttpContext) { const project = await projectService.find(params.category, params.name) return projectService.details(project) } async fetch({ params }: HttpContext) { const project = await projectService.find(params.category, params.name) return projectService.fetch(project) } async action(ctx: HttpContext) { const action = ctx.params.action as ProjectAction if (!PROJECT_ACTIONS.includes(action)) throw new UserError('Action inconnue.', 404) const { commit } = await ctx.request.validateUsing(projectActionValidator) const project = await projectService.find(ctx.params.category, ctx.params.name) const job = await projectService.runAction(project, action, { commit }, actor(ctx)) return { jobId: job.id } } async store(ctx: HttpContext) { const input = await ctx.request.validateUsing(createProjectValidator) const job = await projectService.create(input, actor(ctx)) return { jobId: job.id } } }