File: /var/www/api_matriculas/app/Http/Requests/Configuration/StoreOrUpdateConfigurationRequest.php
<?php
namespace App\Http\Requests\Configuration;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Validation\Rule;
class StoreOrUpdateConfigurationRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'code' => [
'required',
Rule::exists('configurations', 'code'),
],
'data' => 'required',
];
}
public function messages()
{
return [
'code.required' => 'Configuración requerida',
'code.exists' => 'Configuración no encontrada',
'data.required' => 'Data de Configuración requerida',
];
}
public function withValidator(Validator $validator)
{
$validator->after(function ($validator) {
if ($validator->errors()->any()) {
return;
}
$code = $this->input('code');
$encodedData = $this->input('data');
$config = json_decode(base64_decode($encodedData), true);
if (empty($config)) {
$validator->errors()->add('data', 'Los datos de configuración no son válidos.');
return;
}
$configRules = $this->getConfigRules($code);
if (empty($configRules['rules'])) {
return;
}
$configValidator = \Illuminate\Support\Facades\Validator::make(
$config,
$configRules['rules'],
$configRules['messages']
);
if ($configValidator->fails()) {
foreach ($configValidator->errors()->all() as $error) {
$validator->errors()->add('config', $error);
}
}
});
}
private function getConfigRules(string $code): array
{
switch ($code) {
case 'contract_template':
return [
'rules' => [
'template' => 'required|string',
],
'messages' => [
'template.string' => 'El Template del contrato es requerido.',
],
];
case 'general':
return [
'rules' => [
'email' => 'nullable|email|max:255',
'whatsapp' => 'nullable|string|max:20',
'cae_title' => 'required|string|max:150',
'cae_message' => 'required|string|max:255',
'cfe_title' => 'required|string|max:150',
'cfe_message' => 'required|string|max:255',
'inactive_title' => 'nullable|string|max:150',
'inactive_message' => 'nullable|string|max:255',
'enrollment_start_date' => 'nullable|date',
'enrollment_end_date' => 'nullable|date|after_or_equal:enrollment_start_date',
],
'messages' => [
'email.email' => 'El email debe tener un formato válido.',
'email.max' => 'El email no puede exceder 255 caracteres.',
'whatsapp.string' => 'El whatsapp debe ser un texto.',
'whatsapp.max' => 'El whatsapp no puede exceder 20 caracteres.',
'cae_title.required' => 'El título CAE es obligatorio.',
'cae_title.string' => 'El título CAE debe ser un texto.',
'cae_title.max' => 'El título CAE no puede exceder 150 caracteres.',
'cae_message.required' => 'La descripción CAE es obligatorio.',
'cae_message.string' => 'La descripción CAE debe ser un texto.',
'cae_message.max' => 'La descripción CAE no puede exceder 255 caracteres.',
'cfe_title.required' => 'El título CFE es obligatorio.',
'cfe_title.string' => 'El título CFE debe ser un texto.',
'cfe_title.max' => 'El título CFE no puede exceder 150 caracteres.',
'cfe_message.required' => 'La descripción CFE es obligatorio.',
'cfe_message.string' => 'La descripción CFE debe ser un texto.',
'cfe_message.max' => 'La descripción CFE no puede exceder 255 caracteres.',
'inactive_title.string' => 'El título de alumno inactivo debe ser un texto.',
'inactive_title.max' => 'El título de alumno inactivo no puede exceder 150 caracteres.',
'inactive_message.string' => 'La descripción de alumno inactivo debe ser un texto.',
'inactive_message.max' => 'La descripción de alumno inactivo no puede exceder 255 caracteres.',
'enrollment_start_date.date' => 'La fecha de apertura debe ser una fecha válida.',
'enrollment_end_date.date' => 'La fecha de cierre debe ser una fecha válida.',
'enrollment_end_date.after_or_equal' => 'La fecha de cierre debe ser posterior o igual a la fecha de apertura.',
],
];
case 'toku':
return [
'rules' => [
'status' => 'required|boolean',
'url_toku' => 'required|string',
'api_token' => 'required|string',
],
'messages' => [
'status.required' => 'El estado del modal es obligatorio.',
'status.boolean' => 'El estado del modal debe ser verdadero o falso.',
'url_toku.required' => 'La URL de Toku es obligatoria.',
'url_toku.string' => 'La URL de Toku debe ser texto.',
'api_token.required' => 'El API Token es obligatorio.',
'api_token.string' => 'El API Token debe ser texto.',
],
];
case 'firmaki':
return [
'rules' => [
'status' => 'required|boolean',
'environment' => 'required|string|in:production,integration',
'url_sandbox' => 'required|string|url',
'url_production' => 'required|string|url',
'api_key' => 'required|string',
'email_account' => 'required|email',
'password_account' => 'required|string|min:6',
],
'messages' => [
'status.required' => 'El estado es obligatorio.',
'status.boolean' => 'El estado debe ser verdadero o falso.',
'environment.required' => 'El entorno es obligatorio.',
'environment.string' => 'El entorno debe ser texto.',
'environment.in' => 'El entorno debe ser "production" o "integration".',
'url_sandbox.required' => 'La URL del sandbox es obligatoria.',
'url_sandbox.string' => 'La URL del sandbox debe ser texto.',
'url_sandbox.url' => 'La URL del sandbox debe ser válida.',
'url_production.required' => 'La URL de producción es obligatoria.',
'url_production.string' => 'La URL de producción debe ser texto.',
'url_production.url' => 'La URL de producción debe ser válida.',
'api_key.required' => 'El API Key es obligatorio.',
'api_key.string' => 'El API Key debe ser texto.',
'email_account.required' => 'El correo de la cuenta es obligatorio.',
'email_account.email' => 'El correo de la cuenta debe ser válido.',
'password_account.required' => 'La contraseña es obligatoria.',
'password_account.string' => 'La contraseña debe ser texto.',
'password_account.min' => 'La contraseña debe tener al menos :min caracteres.',
],
];
default:
return ['rules' => [], 'messages' => []];
}
}
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(
genericResponse(['error' => implode(', ', $validator->errors()->all())], 400)
);
}
}