diff --git a/app/common/Controller/Sources.php b/app/common/Controller/Sources.php index c7a0aef..d2100e2 100644 --- a/app/common/Controller/Sources.php +++ b/app/common/Controller/Sources.php @@ -15,10 +15,10 @@ class Sources { $output = compact('sources'); return $this->withJson($response, $output); } - public function get(Request $request, Response $response, ModelFactory $factory, $currency_id, $url): Response { - $source = $factory->find(Source::class)->where([['currency_id', $currency_id], ['url', $url]])->one(); + public function get(Request $request, Response $response, ModelFactory $factory, $source_id): Response { + $source = $factory->find(Source::class)->one($source_id); $output = [ - 'get_data' => compact('currency_id', 'url'), + 'get_data' => compact('source_id'), 'source' => null ]; if ($source) { @@ -45,13 +45,13 @@ class Sources { ]; return $this->withJson($response, $output); } - public function edit(Request $request, Response $response, ModelFactory $factory, $currency_id, $url) { + public function edit(Request $request, Response $response, ModelFactory $factory, $source_id) { $post = json_decode($request->getBody()->getContents()); $output = [ - 'get_data' => compact('currency_id', 'url'), + 'get_data' => compact('source_id'), 'post_data' => $post ]; - $source = $factory->find(Source::class)->where([['currency_id', $currency_id], ['url', $url]])->one(); + $source = $factory->find(Source::class)->one($source_id); $edited = false; if ($source) { $edited = $source->edit($post); @@ -60,9 +60,9 @@ class Sources { } return $this->withJson($response, $output); } - public function delete(Request $request, Response $response, ModelFactory $factory, $currency_id, $url): Response { - $source = $factory->find(Source::class)->where([['currency_id', $currency_id], ['url', $url]])->one(); - $output = ['get_data' => compact('currency_id', 'url'), 'source' => null, 'deleted' => false]; + public function delete(Request $request, Response $response, ModelFactory $factory, $source_id): Response { + $source = $factory->find(Source::class)->one($source_id); + $output = ['get_data' => compact('source_id'), 'source' => null, 'deleted' => false]; if ($source) { $output['source'] = $source->asArray(); $status = $source->delete(); diff --git a/app/common/Controller/Update.php b/app/common/Controller/Update.php new file mode 100644 index 0000000..d6d663e --- /dev/null +++ b/app/common/Controller/Update.php @@ -0,0 +1,86 @@ +get($url); + if ($res->getStatusCode() < 200 or $res->getStatusCode() >= 300) { + if ($exception) { + throw new \Exception('Url ' . $url . ' not connected.'); + } + return false; + } + return json_decode($res->getBody()); + } + + protected function baseMap($unit) { + $map = [ + 'Dólar' => 'US Dollar', + 'Pesos' => 'Peso Chileno' + ]; + return $map[$unit] ?? $unit; + } + + public function __invoke(Request $request, Response $response, Client $client, ModelFactory $factory, Container $container): Response { + ini_set('max_execution_time', 300); + + $sources = $factory->find(Source::class)->many(); + $date = Carbon::now(); + $output = ['count' => 0, 'values' => []]; + foreach ($sources as $source) { + $url = str_replace([ + '{year}', + '{month}', + '{day}', + '{hour}', + '{minute}', + '{second}' + ], [ + $date->year, + $date->month, + $date->day, + $date->hour, + $date->minute, + $date->second + ], $source->url); + $b = $this->get($client, $url, false); + if ($b === false) { + continue; + } + $base = $factory->find(Currency::class)->where([ + ['name', '%' . $this->baseMap($b->unidad_medida) . '%', 'like'] + ])->one(); + if (!$base) { + continue; + } + foreach ($b->serie as $info) { + $f = Carbon::parse($info->fecha); + $data = [ + 'currency_id' => $source->currency()->id, + 'date_time' => $f->format('Y-m-d H:i:s'), + 'value' => $info->valor, + 'base_id' => $base->id + ]; + $result = Value::add($factory, $data); + $output['values'] []= $result; + if ($result->created === true) { + $output['count'] ++; + } + } + } + return $this->withJson($response, $output); + } +} diff --git a/app/composer.json b/app/composer.json index ab73eea..cabfd3f 100644 --- a/app/composer.json +++ b/app/composer.json @@ -10,6 +10,7 @@ "provm/models": "dev-master", "provm/controller": "dev-master", "vlucas/phpdotenv": "^5.3", + "guzzlehttp/guzzle": "^7.3", "nesbot/carbon": "^2.46" }, "license": "MIT", diff --git a/app/docker/nginx.conf b/app/docker/nginx.conf index 19d8867..e6390d9 100644 --- a/app/docker/nginx.conf +++ b/app/docker/nginx.conf @@ -13,6 +13,7 @@ server { add_header 'Access-Control-Allow-Origin' 'http://localhost:8080'; add_header 'Access-Control-Allow-Methods' 'GET,POST,PUT,DELETE,OPTIONS'; add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept"; + add_header 'Content-Type' 'application/json'; location ~ \.php { try_files $uri =404; diff --git a/app/resources/routes/api.php b/app/resources/routes/api.php index 8940f95..9a5f2a1 100644 --- a/app/resources/routes/api.php +++ b/app/resources/routes/api.php @@ -1,9 +1,16 @@ isDir()) { + continue; + } + include_once $file->getRealPath(); +} $app->get('/', API::class); diff --git a/app/resources/routes/currencies.php b/app/resources/routes/api/currencies.php similarity index 100% rename from app/resources/routes/currencies.php rename to app/resources/routes/api/currencies.php diff --git a/app/resources/routes/sources.php b/app/resources/routes/api/sources.php similarity index 85% rename from app/resources/routes/sources.php rename to app/resources/routes/api/sources.php index 920a10f..4387059 100644 --- a/app/resources/routes/sources.php +++ b/app/resources/routes/api/sources.php @@ -6,7 +6,7 @@ $app->group('/sources', function($app) { $app->get('[/]', Sources::class); }); -$app->group('/source/{currency_id}/{url}', function($app) { +$app->group('/source/{source_id}', function($app) { $app->put('/edit[/]', [Sources::class, 'edit']); $app->delete('/delete[/]', [Sources::class, 'delete']); $app->get('[/]', [Sources::class, 'get']); diff --git a/app/resources/routes/api/update.php b/app/resources/routes/api/update.php new file mode 100644 index 0000000..6458ad9 --- /dev/null +++ b/app/resources/routes/api/update.php @@ -0,0 +1,4 @@ +get('/update', Update::class); diff --git a/app/resources/routes/values.php b/app/resources/routes/api/values.php similarity index 100% rename from app/resources/routes/values.php rename to app/resources/routes/api/values.php diff --git a/app/setup/api/setups.php b/app/setup/api/setups.php new file mode 100644 index 0000000..e342d27 --- /dev/null +++ b/app/setup/api/setups.php @@ -0,0 +1,8 @@ + function(Container $c) { + return new GuzzleHttp\Client(); + } +];