feature/cierres (#25)

Varios cambios

Co-authored-by: Juan Pablo Vial <jpvialb@incoviba.cl>
Reviewed-on: #25
This commit is contained in:
2025-07-22 13:18:00 +00:00
parent ba57cad514
commit 307f2ac7d7
418 changed files with 20045 additions and 984 deletions

View File

@ -5,28 +5,8 @@ use DI\Bridge\Slim\Bridge;
require_once 'composer.php';
function buildApp() {
$builder = new ContainerBuilder();
$folders = [
'settings',
'setups'
];
foreach ($folders as $folder_name) {
$folder = implode(DIRECTORY_SEPARATOR, [
__DIR__,
$folder_name
]);
if (!file_exists($folder)) {
continue;
}
$files = new FilesystemIterator($folder);
foreach ($files as $file) {
if ($file->isDir()) {
continue;
}
$builder->addDefinitions($file->getRealPath());
}
}
$app = Bridge::create($builder->build());
require_once 'container.php';
$app = Bridge::create(buildContainer());
$folder = implode(DIRECTORY_SEPARATOR, [
__DIR__,
'middlewares'

33
app/setup/container.php Normal file
View File

@ -0,0 +1,33 @@
<?php
use Psr\Container\ContainerInterface;
use DI\ContainerBuilder;
/**
* @return ContainerInterface
* @throws Exception
*/
function buildContainer(): ContainerInterface
{
$builder = new ContainerBuilder();
$folders = [
'settings',
'setups'
];
foreach ($folders as $folder_name) {
$folder = implode(DIRECTORY_SEPARATOR, [
__DIR__,
$folder_name
]);
if (!file_exists($folder)) {
continue;
}
$files = new FilesystemIterator($folder);
foreach ($files as $file) {
if ($file->isDir()) {
continue;
}
$builder->addDefinitions($file->getRealPath());
}
}
return $builder->build();
}

View File

@ -0,0 +1,8 @@
<?php
use Psr\Container\ContainerInterface;
return [
DateTimeZone::class => function(ContainerInterface $container) {
return new DateTimeZone($container->get('TZ') ?? 'America/Santiago');
}
];

View File

@ -1,8 +1,10 @@
<?php
use Psr\Container\ContainerInterface;
return [
'urls' => function() {
'urls' => function(ContainerInterface $container) {
$urls = [
'base' => $_ENV['APP_URL'] ?? '',
'base' => $container->get('APP_URL') ?? '',
];
$urls['api'] = implode('/', [
$urls['base'],
@ -18,13 +20,35 @@ return [
]);
return (object) $urls;
},
'permittedPaths' => [
'/api',
'/api/',
],
'simplePaths' => [
'/api/login',
'/api/login/',
'/api/logout'
],
'apiUrls' => function(ContainerInterface $container) {
$permittedPaths = [
'/api'
];
$simplePaths = [
'/api/login',
'/api/logout'
];
function addTrailingSlash(array &$paths): array {
foreach ($paths as $path) {
if (!in_array(rtrim($path, '/') . '/', $paths)) {
$paths[] = rtrim($path, '/') . '/';
}
}
return $paths;
}
addTrailingSlash($permittedPaths);
addTrailingSlash($simplePaths);
return [
'permittedPaths' => $permittedPaths,
'simplePaths' => $simplePaths,
'externalPaths' => [
'/api/external' => [
'/toku/success' => [
'validator' => $container->get(Incoviba\Service\Venta\MediosPago\Toku::class),
'token' => $container->get('TOKU_TOKEN'),
]
],
]
];
}
];

View File

@ -1,65 +1,154 @@
<?php
use Psr\Container\ContainerInterface;
return [
Monolog\Processor\WebProcessor::class => function(ContainerInterface $container) {
return new Monolog\Processor\WebProcessor(null, [
'HTTP_X_FORWARDED_FOR',
'HTTP_CLIENT_IP',
'HTTP_X_CLIENT_IP',
'HTTP_X_REAL_IP',
'REMOTE_ADDR',
'REMOTE_HOST',
]);
},
Monolog\Formatter\LineFormatter::class => function(ContainerInterface $container) {
return (new Monolog\Formatter\LineFormatter(null, null, false, false, true))
->setBasePath('/code/');
},
Psr\Log\LoggerInterface::class => function(ContainerInterface $container) {
return new Monolog\Logger('incoviba', [
new Monolog\Handler\FilterHandler(
($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development')
? (new Monolog\Handler\StreamHandler('/logs/error.log'))
->setFormatter($container->get(Monolog\Formatter\LineFormatter::class))
: (new Monolog\Handler\RotatingFileHandler('/logs/error.log', 10))
->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)),
Monolog\Level::Error,
Monolog\Level::Error
),
new Monolog\Handler\FilterHandler(
($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development')
? (new Monolog\Handler\StreamHandler('/logs/critical.log'))
->setFormatter($container->get(Monolog\Formatter\LineFormatter::class))
: (new Monolog\Handler\RotatingFileHandler('/logs/critical.log', 10))
->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)),
Monolog\Level::Critical
),
new Monolog\Handler\FilterHandler(
($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development')
? (new Monolog\Handler\StreamHandler('/logs/debug.log'))
->setFormatter($container->get(Monolog\Formatter\LineFormatter::class))
: new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:notices'),
Monolog\Level::Debug,
Monolog\Level::Info
),
new Monolog\Handler\FilterHandler(
($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development')
? (new Monolog\Handler\StreamHandler('/logs/notices.log'))
->setFormatter($container->get(Monolog\Formatter\LineFormatter::class))
: (new Incoviba\Common\Implement\Log\MySQLHandler($container->get(Incoviba\Common\Define\Connection::class)))
->setFormatter(new Incoviba\Common\Implement\Log\PDOFormatter()),
Monolog\Level::Notice,
Monolog\Level::Warning
)
], [
$container->get(Incoviba\Common\Implement\Log\UserProcessor::class),
'baseMonologProcessors' => function(ContainerInterface $container) {
return [
$container->get(Monolog\Processor\IntrospectionProcessor::class),
$container->get(Monolog\Processor\WebProcessor::class),
$container->get(Monolog\Processor\MemoryUsageProcessor::class),
$container->get(Monolog\Processor\MemoryPeakUsageProcessor::class),
$container->get(Monolog\Processor\PsrLogMessageProcessor::class),
]);
$container->get(Monolog\Processor\UidProcessor::class),
];
},
'baseDefaultHandlers' => function(ContainerInterface $container) {
return [
'critical' => [
'handler' => Monolog\Handler\RotatingFileHandler::class,
'filename' => 'critical.log',
'levels' => Monolog\Level::Critical
],
'error' => [
'handler' => Monolog\Handler\RotatingFileHandler::class,
'filename' => 'error.log',
'levels' => [Monolog\Level::Error, Monolog\Level::Error],
],
'notices' => [
'handler' => Incoviba\Common\Implement\Log\Handler\MySQL::class,
'levels' => [Monolog\Level::Notice, Monolog\Level::Warning]
],
'debug' => [
'handler' => Monolog\Handler\RedisHandler::class,
'name' => 'notices',
'levels' => [Monolog\Level::Debug, Monolog\Level::Info]
],
];
},
'developmentHandlers' => function(ContainerInterface $container) {
$baseHandlers = $container->get('baseDefaultHandlers');
$baseHandlers['critical']['handler'] = Monolog\Handler\StreamHandler::class;
$baseHandlers['error']['handler'] = Monolog\Handler\StreamHandler::class;
$baseHandlers['notices']['handler'] = Monolog\Handler\StreamHandler::class;
$baseHandlers['notices']['filename'] = 'notices.log';
$baseHandlers['debug']['handler'] = Monolog\Handler\StreamHandler::class;
$baseHandlers['debug']['filename'] = 'debug.log';
return $baseHandlers;
},
'defaultMonologHandlers' => function(ContainerInterface $container) {
$key = 'baseDefault';
if ($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development') {
$key = 'development';
if (!$container->has("{$key}Handlers")) {
$key = 'baseDefault';
}
}
$baseHandlers = $container->get("{$key}Handlers");
$builder = $container->get(Incoviba\Common\Implement\Log\Processor\ArrayBuilder::class);
return $builder->build($baseHandlers);
},
Psr\Log\LoggerInterface::class => function(ContainerInterface $container) {
return new Monolog\Logger('incoviba',
$container->get('defaultMonologHandlers'),
[$container->get(Incoviba\Common\Implement\Log\Processor\User::class)]
+ $container->get('baseMonologProcessors'),
$container->get(DateTimeZone::class)
);
},
'jsonHandlers' => function(ContainerInterface $container) {
$baseHandlers = $container->get('baseDefaultHandlers');
$baseHandlers['debug']['handler'] = Monolog\Handler\RotatingFileHandler::class;
$baseHandlers['debug']['filename'] = 'info.json';
$baseHandlers['debug']['formatter'] = Monolog\Formatter\JsonFormatter::class;
$baseHandlers['notices']['handler'] = Monolog\Handler\RotatingFileHandler::class;
$baseHandlers['notices']['filename'] = 'notices.json';
$baseHandlers['notices']['formatter'] = Monolog\Formatter\JsonFormatter::class;
return $baseHandlers;
},
'jsonLogger' => function(ContainerInterface $container) {
$builder = $container->get(Incoviba\Common\Implement\Log\Processor\ArrayBuilder::class);
$handlers = $builder->build($container->get('jsonHandlers'));
return new Monolog\Logger('json',
$handlers,
[$container->get(Incoviba\Common\Implement\Log\Processor\User::class)]
+ $container->get('baseMonologProcessors'),
$container->get(DateTimeZone::class)
);
},
'loginLogger' => function(ContainerInterface $container) {
return new Monolog\Logger('login', [
new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:login'),
], [
$container->get(Monolog\Processor\IntrospectionProcessor::class),
$container->get(Monolog\Processor\WebProcessor::class),
$container->get(Monolog\Processor\MemoryUsageProcessor::class),
$container->get(Monolog\Processor\MemoryPeakUsageProcessor::class),
$container->get(Monolog\Processor\PsrLogMessageProcessor::class),
]);
}
return new Monolog\Logger('login',
[
new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:login'),
],
$container->get('baseMonologProcessors'),
$container->get(DateTimeZone::class)
);
},
'accessLogger' => function(ContainerInterface $container) {
return new Monolog\Logger('access',
[
new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:access'),
],
$container->get('baseMonologProcessors'),
$container->get(DateTimeZone::class)
);
},
'externalHandlers' => function(ContainerInterface $container) {
return [
'critical' => [
'handler' => Monolog\Handler\RedisHandler::class,
'name' => 'external:critical',
'levels' => Monolog\Level::Critical
],
'error' => [
'handler' => Monolog\Handler\RedisHandler::class,
'name' => 'external:error',
'levels' => [Monolog\Level::Error, Monolog\Level::Error],
],
'notices' => [
'handler' => Monolog\Handler\RedisHandler::class,
'name' => 'external:notices',
'levels' => [Monolog\Level::Notice, Monolog\Level::Warning],
],
'debug' => [
'handler' => Monolog\Handler\RedisHandler::class,
'name' => 'external:debug',
'levels' => [Monolog\Level::Debug, Monolog\Level::Info],
],
];
},
'externalLogger' => function(ContainerInterface $container) {
$builder = $container->get(Incoviba\Common\Implement\Log\Processor\ArrayBuilder::class);
$handlers = $builder->build($container->get('externalHandlers'));
return new Monolog\Logger('external',
$handlers,
$container->get('baseMonologProcessors'),
$container->get(DateTimeZone::class)
);
},
];

View File

@ -17,9 +17,22 @@ return [
$container->get(Psr\Log\LoggerInterface::class),
$container->get(Incoviba\Service\API::class),
$container->get(Incoviba\Service\Login::class),
$container->get('permittedPaths'),
$container->get('simplePaths'),
$container->get('API_KEY')
$container->get('API_KEY'),
$container->get('apiUrls'),
);
},
Incoviba\Middleware\NotFound::class => function(ContainerInterface $container) {
return new Incoviba\Middleware\NotFound(
$container->get('accessLogger'),
$container->get(Psr\Http\Message\ResponseFactoryInterface::class),
$container->get(Incoviba\Common\Alias\View::class)
);
},
Incoviba\Middleware\NotAllowed::class => function(ContainerInterface $container) {
return new Incoviba\Middleware\NotAllowed(
$container->get('accessLogger'),
$container->get(Psr\Http\Message\ResponseFactoryInterface::class),
$container->get(Incoviba\Common\Alias\View::class)
);
}
];

View File

@ -22,8 +22,12 @@ return [
$ine = new Incoviba\Service\Money\Ine(new GuzzleHttp\Client([
'base_uri' => 'https://api-calculadora.ine.cl/ServiciosCalculadoraVariacion'
]));
$sii = new Incoviba\Service\Money\SII(new GuzzleHttp\Client([
'base_uri' => 'https://www.sii.cl/valores_y_fechas/'
]), $container->get(Incoviba\Repository\UF::class));
return (new Incoviba\Service\Money($container->get(Psr\Log\LoggerInterface::class)))
->register('uf', $mindicador)
->register('uf', $sii)
->register('usd', $mindicador)
->register('ipc', $ine);
},
@ -110,5 +114,104 @@ return [
$container->get(Psr\Log\LoggerInterface::class),
))
->registerSub($container->get(Incoviba\Service\Contabilidad\Cartola\BCI\Mes::class));
},
'TokuClient' => function(ContainerInterface $container) {
return new GuzzleHttp\Client([
'base_uri' => $container->get('TOKU_URL'),
'headers' => [
'x-api-key' => $container->get('TOKU_TOKEN'),
'accept' => 'application/json'
]
]);
},
Incoviba\Service\Venta\MediosPago\Toku\Customer::class => function(ContainerInterface $container) {
$service = new Incoviba\Service\Venta\MediosPago\Toku\Customer(
$container->get('TokuClient'),
$container->get(Incoviba\Repository\Venta\MediosPago\Toku\Customer::class)
);
$service->setLogger($container->get('externalLogger'));
return $service;
},
Incoviba\Service\Venta\MediosPago\Toku\Subscription::class => function(ContainerInterface $container) {
$service = new Incoviba\Service\Venta\MediosPago\Toku\Subscription(
$container->get('TokuClient'),
$container->get(Incoviba\Repository\Venta\MediosPago\Toku\Subscription::class),
$container->get(Incoviba\Service\Venta::class)
);
$service->setLogger($container->get('externalLogger'));
return $service;
},
Incoviba\Service\Venta\MediosPago\Toku\Invoice::class => function(ContainerInterface $container) {
$service = new Incoviba\Service\Venta\MediosPago\Toku\Invoice(
$container->get('TokuClient'),
$container->get(Incoviba\Repository\Venta\MediosPago\Toku\Invoice::class),
$container->get(Incoviba\Service\Venta\Pago::class),
$container->get(Incoviba\Service\UF::class)
);
$service->setLogger($container->get('externalLogger'));
$service->setAltLogger($container->get('jsonLogger'));
return $service;
},
Incoviba\Service\Venta\MediosPago\Toku::class => function(ContainerInterface $container) {
return new Incoviba\Service\Venta\MediosPago\Toku(
$container->get('externalLogger'),
$container->get(Incoviba\Common\Define\Connection::class),
$container->get(Incoviba\Service\HMAC::class)
)
->register('customer', $container->get(Incoviba\Service\Venta\MediosPago\Toku\Customer::class))
->register('subscription', $container->get(Incoviba\Service\Venta\MediosPago\Toku\Subscription::class))
->register('invoice', $container->get(Incoviba\Service\Venta\MediosPago\Toku\Invoice::class));
},
Pheanstalk\Pheanstalk::class => function(ContainerInterface $container) {
return Pheanstalk\Pheanstalk::create(
$container->get('BEANSTALKD_HOST'),
$container->has('BEANSTALKD_PORT') ? $container->get('BEANSTALKD_PORT') : 11300
);
},
Incoviba\Service\MQTT::class => function(ContainerInterface $container) {
return new Incoviba\Service\MQTT()
->register('default', $container->get(Incoviba\Service\MQTT\Pheanstalk::class));
},
Incoviba\Service\Queue::class => function(ContainerInterface $container) {
return new Incoviba\Service\Queue(
$container->get(Psr\Log\LoggerInterface::class),
$container->get(Incoviba\Service\Job::class),
$container->get(Incoviba\Service\Worker\Request::class)
)
->register('request', $container->get(Incoviba\Service\Worker\Request::class))
->register('service', $container->get(Incoviba\Service\Worker\Service::class))
->register('dummy', $container->get(Incoviba\Service\Worker\Dummy::class))
->register('checkExternal', $container->get(Incoviba\Service\Worker\CheckExternal::class));
},
Incoviba\Service\Worker\Request::class => function(ContainerInterface $container) {
$apiKey = md5($container->get('API_KEY'));
$key = $apiKey;
$loginService = $container->get(Incoviba\Service\Login::class);
if ($loginService->isIn()) {
$token = $loginService->getToken();
$key = "{$apiKey}{$loginService->getSeparator()}{$token}";
}
return new Incoviba\Service\Worker\Request(
$container->get(Psr\Log\LoggerInterface::class),
new GuzzleHttp\Client([
'base_uri' => 'http://incoviba_proxy/api',
'headers' => [
'Authorization' => "Bearer {$key}"
]
])
);
},
Incoviba\Service\Worker\CheckExternal::class => function(ContainerInterface $container) {
return new Incoviba\Service\Worker\CheckExternal(
$container->get('externalLogger'),
$container
);
},
Incoviba\Service\External::class => function(ContainerInterface $container) {
return new Incoviba\Service\External(
$container->get('externalLogger'),
$container->get(Incoviba\Service\Queue::class)
)
->register($container->get(Incoviba\Service\Venta\MediosPago\Toku::class));
}
];

View File

@ -18,11 +18,11 @@ return [
if ($global_variables['login']->isIn()) {
$global_variables['user'] = $global_variables['login']->getUser();
}
return new Incoviba\Common\Alias\View(
return (new Incoviba\Common\Alias\View(
$folders->get('templates'),
$folders->get('cache'),
null,
$global_variables
);
));#->setOfuscator($container->get(Incoviba\Service\Ofuscator::class));
}
];