Commit c8282b76 authored by Σταύρος Παπαδάκης's avatar Σταύρος Παπαδάκης

Merge branch 'slim-app' into 'master'

Slim app

See merge request !3
parents 54736aa1 6b27474a
......@@ -106,7 +106,7 @@ class Client
$result = curl_exec($ch);
if (curl_errno($ch)) {
throw new Exception("Λάθος κατά την κλήση του {$uri}. Curl error: " . curl_error($ch) . " Curl info: ", var_export(curl_getinfo($ch), true));
throw new Exception("Λάθος κατά την κλήση του {$uri}. Curl error: " . curl_error($ch) . " Curl info: " . var_export(curl_getinfo($ch), true));
}
if (intval(($http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) / 100) != 2) {
// πραγματοποιήθηκε κλήση αλλά δεν ήταν "επιτυχής"
......@@ -129,7 +129,7 @@ class Client
$result = curl_exec($ch);
if (curl_errno($ch)) {
throw new Exception("Λάθος κατά την κλήση του {$uri}. Curl error: " . curl_error($ch) . " Curl info: ", var_export(curl_getinfo($ch), true));
throw new Exception("Λάθος κατά την κλήση του {$uri}. Curl error: " . curl_error($ch) . " Curl info: " . var_export(curl_getinfo($ch), true));
}
if (intval(($http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) / 100) != 2) {
// πραγματοποιήθηκε κλήση αλλά δεν ήταν "επιτυχής"
......@@ -156,7 +156,7 @@ class Client
$result = curl_exec($ch);
if (curl_errno($ch)) {
throw new Exception("Λάθος κατά την κλήση του {$uri}. Curl error: " . curl_error($ch) . " Curl info: ", var_export(curl_getinfo($ch), true));
throw new Exception("Λάθος κατά την κλήση του {$uri}. Curl error: " . curl_error($ch) . " Curl info: " . var_export(curl_getinfo($ch), true));
}
if (intval(($http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) / 100) != 2) {
// πραγματοποιήθηκε κλήση αλλά δεν ήταν "επιτυχής"
......
/vendor/
/logs/*
!/logs/README.md
Βιβλιοθήκη και διαδικτυακή εφαρμογή SLIM
========================================
# Οδηγίες
Αντιγράψτε το αρχείο `src\settings.php.dist` σε ένα νέο αρχείο `src\settings.php`
και τροποποιήστε αναλόγως, για παράδειγμα εισάγοντας το όνομα χρήστη που σας
έχει αποδοθεί.
**Προσοχή!** Η ρύθμιση `NO_SAFE_CURL` πρέπει να είναι false σε περιβάλλον
παραγωγής. Εάν έχετε προβλήματα κλήσης της υπηρεσίας θα πρέπει να προβείται
σε κατάλληλες ρυθμίσεις σχετικές με το SSL.
# Εφαρμογή επίδειξης
Η εφαρμογή έχει αναπτυχθεί με το SLIM framework και παρέχει τις παρακάτω
λειτουργίες. Οι σχετικές path parameters αποδίδονται στις μεθόδους.
Όπου χρησιμοποιούνται επιπλέον παράμετροι, μέσω query string ή post
body, αναφέρονται παρακάτω στις σχετικές παραγράφους περιγραφής των
λειτουργιών.
| HTTP Method | Resource routes | Επιστρεφόμενη τιμή | Μέθοδος που καλείται στο [[Gr\Gov\Minedu\Osteam\Slim\App](src/osteam/App.php) |
|-------------+-----------------+--------------------+--------------------------------------------------------------------------------|
| GET | defaults | JSON μήνυμα | defaults |
| GET | apikey | JSON μήνυμα | apiKey |
| GET | docdata/{hashid}[/{apikey}] | JSON μήνυμα | docData |
| GET | search[/{doc_type}] | JSON μήνυμα | searchDocuments |
| GET | pdf/download/{hashid}[/{apikey}] | αρχείο για λήψη | pdfDownload |
| GET | pdf/{hashid}[/{apikey}] | JSON μήνυμα | pdfData |
| POST | protocol[/{apikey}] | JSON μήνυμα | postProtocol |
Η εφαρμογή δημιουργήθηκε με σημείο εκκίνησης το Slim Framework 3 Skeleton Application.
Περισσότερες λεπτομέρειες στη [σελίδα του Slim-Skeleton](https://github.com/slimphp/Slim-Skeleton)
Στο φάκελο [src\osteam](src/osteam) βρίσκεται ο κύριος κώδικας της εφαρμογής και στο
αρχείο [src\routes.php](src/routes.php) καθορίζονται τα σχετικά routes.
**Σημαντικό!** Για να τρέξει η εφαρμογή είναι απαραίτητο μετά τη λήψη της
να εκτελέσετε την εντολή `composer install` μέσα στο ριζικό της φάκελο
(\slim-app).
## Gr\Gov\Minedu\Osteam\Slim\App
Η κλάση [Gr\Gov\Minedu\Osteam\Slim\App](src/osteam/App.php) παρέχει μεθόδους
διευκόλυνσης για τον προγραμματιστή ώστε να μπορεί εύκολα να καταναλώσει
λειτουργίες που αφορούν την πρωτοκόλληση εγγράφων. Οι βασικές λειτουργίες
περιγράφηκαν παραπάνω.
**Τεκμηρίωση παρέχεται εντός του [Gr\Gov\Minedu\Osteam\Slim\App](src/osteam/App.php)**
## Gr\Gov\Minedu\Osteam\Client
Η κλάση [Gr\Gov\Minedu\Osteam\Slim\Client](src/osteam/Client.php) καταναλώνει
λειτουργίες του
[minedu OpenApi της ΠΑΠΥΡΟΣ](https://git.minedu.gov.gr/itminedu/minedu-OpenApi-PapyrosDrivers)
αξιοποιώντας τη βιβλιοθήκη CURL. Παρέχει μεθόδους αφαίρεσης για κατανάλωση των
λειτουργιών που αφορούν την πρωτοκόλληση εγγράφων καθώς και βασικές μεθόδους
κλήσης GET, PUT, POST. Οι βασικές λειτουργίες είναι:
* pauth($payload)
* searchDocuments($payload, $apikey)
* getDocData($hashid, $apikey)
* getPdf($hashid, $apikey)
* postProtocol($payload, $apikey)
* _put($uri, $payload, $headers = [])_
* _post($uri, $payload, $headers = [])_
* _get($uri, $params = [], $headers = [])_
# Λειτουργίες
> Στα παρακάτω δείγματα κλήσης θεωρείται ότι η εφαρμογή είναι διαθέσιμη στη διεύθυνση: http://generic.local.dev/public/
## Προεπιλεγμές τιμές
- `http://generic.local.dev/public/defaults`
Δείγμα απάντησης
```json
{"username":"test","sender_id":100000001}
```
## Λήψη κλειδιού πιστοποίησης
- `http://generic.local.dev/public/apikey`
Δείγμα απάντησης
```json
{"apiKey":"eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMDAwMDAwIn0.m3fbJK4J4JqHB4PNBNk2_XDy_SXH-GPY-oahHwo_Sh4"}
```
## Ανάκτηση πληροφοριών εγγράφου
- `http://generic.local.dev/public/docdata/43AHBTWUtcX9a4KhU8eXBg%3D%3D`
- `http://generic.local.dev/public/docdata/43AHBTWUtcX9a4KhU8eXBg%3D%3D/eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMDAwMDAwIn0.dW6qmMRJoGL8nA6j5U2zLYJUSc9mnoWioqXsC0D80OE`
Δείγμα απάντησης
```json
{
"id": "D289A4QVa0xWG500eUxKuw%3D%3D",
"protocolNumber": 180047,
"protocolDate": "29/12/2016",
"docType": 7,
"sender": 100000001,
"senderProtocol": null,
"senderDateProtocol": null,
"docCategory": 20,
"theme": "Title",
"ada": null,
"attachedDocsDescr": null,
"director": null,
"attachedId": [
"4UFlGXntdNn46L3d3SBVsw%3D%3D"
]
}
```
## Αναζήτηση εγγράφων
Εκτός από τις path parameters doc_type και apikey μπορούν να δοθούν και
οι παρακάτω παραμέτροι στο query string:
- `sender_id` Κωδικός αποστολέα, π.χ. 10000001. Η προκαθορισμένη τιμή του senderId προέρχεται από τα settings
- `date_from` (προεραιτικό) Ημερομηνία αναζήτησης - Από, σε μορφή DATE_W3C κατά προτίμηση (μπορεί να είναι και YYYY-MM-DD ή άλλο). Η προκαθορισμένη τιμή είναι 5 μέρες πριν.
- `date_to` (προεραιτικό) Ημερομηνία αναζήτησης - Έως, σε μορφή DATE_W3C κατά προτίμηση (μπορεί να είναι και YYYY-MM-DD ή άλλο). Η προκαθορισμένη τιμή είναι η χρονική στιγμή της κλήσης.
- `apikey` (προεραιτικό) Το κλειδί αυθεντικοποίησης
- `http://generic.local.dev/public/search`
- `http://generic.local.dev/public/search/incoming`
- `http://generic.local.dev/public/search?date_from=2016-12-01`
- `http://generic.local.dev/public/search?sender_id=100000001&date_from=2016-12-01&date_to=2016-12-22`
Δείγμα απάντησης
```json
{
"hashIds": [
"43AHBTWUtcX9a4KhU8eXBg%3D%3D",
"Q%2BnehDdzn91TSuVrWOWtoQ%3D%3D",
"HYL69nwQRzL3lRcRhA3Few%3D%3D",
"sipQIdbfK%2ByrcK2IFI3ehQ%3D%3D",
"D289A4QVa0xWG500eUxKuw%3D%3D"
]
}
```
## Λήψη πληροφοριών αρχείου
- `http://generic.local.dev/public/pdf/Q%2BnehDdzn91TSuVrWOWtoQ%3D%3D`
- `http://generic.local.dev/public/pdf/Q%2BnehDdzn91TSuVrWOWtoQ%3D%3D/eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMDAwMDAwIn0.dW6qmMRJoGL8nA6j5U2zLYJUSc9mnoWioqXsC0D80OE`
Δείγμα απάντησης
```json
{
"document": {
"base64": "..."
},
"fileName": "test-file.pdf",
"description": "ΕΙΣ - 180043 - 2016"
}
```
## Λήψη - μεταφόρτωση αρχείου
- `http://generic.local.dev/public/pdf/download/Q%2BnehDdzn91TSuVrWOWtoQ%3D%3D`
## Αποστολή αρχείου για πρωτοκόλληση
Το script <test-post.sh> μπορεί να χρησιμοποιηθεί για την αποστολή προς
πρωτοκόλληση ενός εγγράφου _test2.pdf_, με θέμα _Title_ και συνημμένο
έγγραφο _test3-minimal.pdf_.
```sh
#!/bin/sh
curl -v -X POST \
--header "User-Agent: MINEDU OSTEAM Tester" \
-F "theme=Title" \
-F "mainDoc=@test2.pdf" \
-F "otherDoc=@test3-minimal.pdf" \
"http://generic.local.dev/public/protocol"
```
## Άλλες πιθανές απαντήσεις της εφαρμογής
Σε περίπτωση που γίνει κλήση σε μη διαθέσιμο resource η εφαρμογή απαντά με
σχετικό μήνυμα.
Δείγμα απάντησης στο `http://generic.local.dev/public/%CE%B1%CF%85%CF%84%CF%8C%20%CE%B4%CE%B5%CE%BD%20%CF%85%CF%80%CE%AC%CF%81%CF%87%CE%B5%CE%B9`
```json
{
"message": "Δεν αναγνωρίστηκε το αίτημα σας",
"in": "array (\n 'anythingelse' => 'αυτό δεν υπάρχει',\n)"
}
```
Δείγμα απάντησης σε κλήση με λανθασμένο apikey
```json
{
"message": "Προέκυψε λάθος",
"in": "Αποτυχημένη κλήση. HTTP STATUS 401. Η απάντηση ήταν: {\"errorCode\":401,\"httpStatusCode\":401,\"errorMessage\":\"Η κλήση σας δεν περιείχε κατάλληλα διαπιστευτήρια και δεν πραγματοποίθηκε. Παρακαλώ δοκιμάστε ξανά παραλαμβάνοντας καινούριο κλειδί\",\"devMessage\":\"Api Key was not found\",\"seeAlso\":null,\"codeError\":null}"
}
```
Δείγμα απάντησης σε κλήση με αποτυχία
```json
{
"message": "Προέκυψε λάθος",
"in": "Αποτυχημένη κλήση. HTTP STATUS 403. Η απάντηση ήταν: <!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>403 Forbidden</title>\n</head><body>\n<h1>Forbidden</h1>\n<p>You don't have permission to access /openpapyros/api/document/pdf/43AHBTWUddtcX9a4KhU8eXBg==\non this server.<br />\n</p>\n<p>Additionally, a 403 Forbidden\nerror was encountered while trying to use an ErrorDocument to handle the request.</p>\n</body></html>\n"
}
```
{
"name": "minedu-osteam/papyros-open-api-slim-app",
"description": "A Slim Framework application for consuming the PAPYROS Open Api for MINEDU",
"keywords": ["rest", "minedu"],
"homepage": "https://git.minedu.gov.gr/spapad/OpenApi-Papyros-PHP-Clients",
"license": "EUPL",
"authors": [
{
"name": "MINEDU OPEN SOURCE TEAM",
"email": "osteam@minedu.gov.gr",
"homepage": "http://ostmgmt.minedu.gov.gr/"
},
{
"name": "Stavros Papadakis",
"email": "spapad@gmail.com"
}
],
"require": {
"php": ">=5.5.0",
"slim/slim": "^3.1",
"slim/php-view": "^2.0",
"monolog/monolog": "^1.17"
},
"require-dev": {
"phpunit/phpunit": ">=4.8 < 6.0"
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"scripts": {
"start": "php -S 0.0.0.0:8080 -t public public/index.php",
"test": "phpunit"
}
}
This diff is collapsed.
Your Slim Framework application's log files will be written to this directory.
<phpunit bootstrap="vendor/autoload.php">
<testsuites>
<testsuite name="SlimSkeleton">
<directory>tests</directory>
</testsuite>
</testsuites>
</phpunit>
\ No newline at end of file
RewriteEngine On
# Some hosts may require you to use the `RewriteBase` directive.
# If you need to use the `RewriteBase` directive, it should be the
# absolute physical path to the directory that contains this htaccess file.
#
# RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
<?php
if (PHP_SAPI == 'cli-server') {
// To help the built-in PHP dev server, check if the request was actually for
// something which should probably be served as a static file
$url = parse_url($_SERVER['REQUEST_URI']);
$file = __DIR__ . $url['path'];
if (is_file($file)) {
return false;
}
}
$autoloader = require __DIR__ . '/../vendor/autoload.php';
session_name('MineduOsteamApp');
session_start();
date_default_timezone_set('Europe/Athens');
// Instantiate the app
$settings = require __DIR__ . '/../src/settings.php';
$app = new \Slim\App($settings);
$container = $app->getContainer();
// Set up dependencies
require __DIR__ . '/../src/dependencies.php';
// Register middleware
require __DIR__ . '/../src/middleware.php';
//
// setup the app
//
$container['autoloader'] = $autoloader;
$autoloader->addPsr4('Gr\Gov\Minedu\Osteam\Slim\\', __DIR__ . '/../src/osteam');
$container['errorHandler'] = function ($c) {
return function ($request, $response, $exception) use ($c) {
return $c['response']->withJson([
'message' => 'Προέκυψε λάθος',
'in' => $exception->getMessage()
], $exception->getCode()
);
};
};
//
// end setup the app
//
// Register routes
require __DIR__ . '/../src/routes.php';
// Run app
$app->run();
<?php
// DIC configuration
$container = $app->getContainer();
// view renderer
$container['renderer'] = function ($c) {
$settings = $c->get('settings')['renderer'];
return new Slim\Views\PhpRenderer($settings['template_path']);
};
// monolog
$container['logger'] = function ($c) {
$settings = $c->get('settings')['logger'];
$logger = new Monolog\Logger($settings['name']);
$logger->pushProcessor(new Monolog\Processor\UidProcessor());
$logger->pushHandler(new Monolog\Handler\StreamHandler($settings['path'], $settings['level']));
return $logger;
};
<?php
// Application middleware
// e.g: $app->add(new \Slim\Csrf\Guard);
<?php
namespace Gr\Gov\Minedu\Osteam\Slim;
use Interop\Container\ContainerInterface;
use Slim\Http\Body;
use Gr\Gov\Minedu\Osteam\Slim\Client;
/**
* Description of app
*
* @author spapad
*/
class App
{
// Εισερχόμενο
const DOCUMENT_INCOMING = 1;
const DOCUMENT_INCOMING_STR = 'incoming';
// Εξερχόμενο
const DOCUMENT_OUTGOING = 2;
const DOCUMENT_OUTGOING_STR = 'outgoing';
protected $ci = null;
protected $client = null;
protected $logger = null;
private $username = '';
private $password = '';
private $sender_id = -1;
private $_files = [];
public function __construct(ContainerInterface $ci)
{
$this->ci = $ci;
$settings = $this->ci->get('settings');
$this->username = (isset($settings['username']) ? $settings['username'] : '');
$this->password = (isset($settings['password']) ? $settings['password'] : '');
$this->sender_id = (isset($settings['sender_id']) ? $settings['sender_id'] : '');
$this->client = new Client([
'NO_SAFE_CURL' => (isset($settings['NO_SAFE_CURL']) ? $settings['NO_SAFE_CURL'] : false),
'base_uri' => (isset($settings['base_uri']) ? $settings['base_uri'] : 'https://protocoltest.minedu.gov.gr:443/openpapyros/api')
]);
if (($logger = $this->ci->get('logger')) != null) {
$this->logger = $logger;
}
}
/**
* Send a JSON formatted string as JSON response to the client.
*
* @param Response $res
* @param mixed $data The data
* @param int $status The HTTP status code.
* @return response
*/
public function withJsonReady($res, $data, $status = null)
{
$response = $res->withBody(new Body(fopen('php://temp', 'r+')));
$response->getBody()->write($data);
$jsonResponse = $response->withHeader('Content-Type', 'application/json;charset=utf-8');
if (isset($status)) {
return $jsonResponse->withStatus($status);
}
return $jsonResponse;
}
protected function log($msg)
{
if ($this->logger) {
$this->logger->info($msg);
}
}
/**
* Provide information about default values used in app.
*
* @param Psr\Http\Message\ServerRequestInterface $req
* @param Psr\Http\Message\ResponseInterface $res
* @param array $args
* @return Response
*/
public function defaults($req, $res, $args)
{
return $res->withJson([
'username' => $this->username,
'sender_id' => $this->sender_id,
]);
}
/**
* Λήψη κλειδιού πιστοποίησης.
*
* @return string The api key
* @throws \Exception
*/
protected function getApiKey()
{
$payload = json_encode([
'username' => $this->username,
'password' => $this->password
]);
$response = json_decode($this->client->pauth($payload));
return $response->apiKey;
}
/**
* Λήψη κλειδιού πιστοποίησης.
*
* @param Psr\Http\Message\ServerRequestInterface $req
* @param Psr\Http\Message\ResponseInterface $res
* @param array $args
* @return Response
*/
public function apiKey($req, $res, $args)
{
$payload = json_encode([
'username' => $this->username,
'password' => $this->password
]);
return $this->withJsonReady($res, $this->client->pauth($payload));
}
/**
* Ανάκτηση πληροφοριών εγγράφου.
*
* @param Psr\Http\Message\ServerRequestInterface $req
* @param Psr\Http\Message\ResponseInterface $res
* @param string[] $args Πίνακας με παραμέτρους από το call:
* 'hashid' Το μοναδικό hashid του εγγράφου
* 'apikey' (προεραιτικό) Κλειδί αυθεντικοποίησης
* @throws \Exception
* @return Response
*/
public function docData($req, $res, $args)
{
$hashid = (isset($args['hashid']) ? $args['hashid'] : '');
$apikey = (isset($args['apikey']) ? $args['apikey'] : $this->getApiKey());
return $this->withJsonReady($res, $this->client->getDocData($hashid, $apikey));
}
/**
* Αναζήτηση εγγράφων.
* Εκτός από τις path parameters που περιγράφονται παρακάτω ($args)
* η μέθοδος αναζητά και τις παρακάτω (προεραιτικές) παραμέτρους στο
* query string:
* 'sender_id' Κωδικός αποστολέα, π.χ. 10000001
* Η προκαθορισμένη τιμή του senderId προέρχεται από τα settings
* 'date_from' (προεραιτικό) Ημερομηνία αναζήτησης - Από σε μορφή DATE_W3C
* κατά προτίμηση (μπορεί να είναι και YYYY-MM-DD ή άλλο)
* Η προκαθορισμένη τιμή είναι 5 μέρες πριν
* 'date_to' (προεραιτικό) Ημερομηνία αναζήτησης - Έως σε μορφή DATE_W3C
* κατά προτίμηση (μπορεί να είναι και YYYY-MM-DD ή άλλο)
* Η προκαθορισμένη τιμή είναι η χρονική στιγμή της κλήσης
* @param Psr\Http\Message\ServerRequestInterface $req
* @param Psr\Http\Message\ResponseInterface $res
* @param string[] $args Πίνακας με παραμέτρους από το call:
* 'doc_type' (προεραιτικό) Δείτε App::DOCUMENT_INCOMING, App::DOCUMENT_OUTGOING
* App::DOCUMENT_INCOMING_STR, App::DOCUMENT_OUTGOING_STR
* 'apikey' (προεραιτικό) Κλειδί αυθεντικοποίησης
* @throws \Exception
* @return Response
*/
public function searchDocuments($req, $res, $args)
{
$doc_type = null;
if (isset($args['doc_type'])) {
if ($args['doc_type'] == self::DOCUMENT_INCOMING || $args['doc_type'] == self::DOCUMENT_INCOMING_STR) {
$doc_type = self::DOCUMENT_INCOMING;
} elseif ($args['doc_type'] == self::DOCUMENT_OUTGOING || $args['doc_type'] == self::DOCUMENT_OUTGOING_STR) {
$doc_type = self::DOCUMENT_OUTGOING;
}
}
$apikey = $req->getQueryParam('apikey', $this->getApiKey());
$payload = json_encode([
'senderId' => $req->getQueryParam('sender_id', $this->sender_id),
'docType' => "$doc_type",
'startDate' => $req->getQueryParam('date_from', date(DATE_W3C, mktime(0, 0, 0, date("m"), date("d") - 5, date("Y")))),
'endDate' => $req->getQueryParam('date_to', date(DATE_W3C)),
]
);
return $res->withJson([
'hashIds' => json_decode($this->client->searchDocuments($payload, $apikey))
]);
}
/**
* Λήψη πληροφοριών αρχείου
*
* @param Psr\Http\Message\ServerRequestInterface $req
* @param Psr\Http\Message\ResponseInterface $res
* @param string[] $args Πίνακας με παραμέτρους από το call:
* 'hashid' Το μοναδικό hashid του εγγράφου
* 'apikey' (προεραιτικό) Κλειδί αυθεντικοποίησης
* @throws \Exception
* @return Response
*/
public function pdfData($req, $res, $args)
{
$hashid = (isset($args['hashid']) ? $args['hashid'] : '');
$apikey = (isset($args['apikey']) ? $args['apikey'] : $this->getApiKey());
return $this->withJsonReady($res, $this->client->getPdf($hashid, $apikey));
}
/**
* Λήψη - μεταφόρτωση αρχείου
*
* @param Psr\Http\Message\ServerRequestInterface $req
* @param Psr\Http\Message\ResponseInterface $res
* @param string[] $args Πίνακας με παραμέτρους από το call:
* 'hashid' Το μοναδικό hashid του εγγράφου
* 'apikey' (προεραιτικό) Κλειδί αυθεντικοποίησης
* @throws \Exception
* @return Response
*/
public function pdfDownload($req, $res, $args)
{
$hashid = (isset($args['hashid']) ? $args['hashid'] : '');
$apikey = (isset($args['apikey']) ? $args['apikey'] : $this->getApiKey());
$result = json_decode($this->client->getPdf($hashid, $apikey), true);
$res = $res->withBody(new Body(fopen('php://temp', 'r+')));
$res->getBody()->write(base64_decode($result["document"]["base64"]));
return $res
->withHeader('Content-Description', 'Get file ' . filter_var($result["description"], FILTER_SANITIZE_STRING))
->withHeader('Content-Type', 'application/pdf')
->withHeader('Content-Disposition', 'attachment;filename="' . basename($result["fileName"]) . '"')
->withHeader('Content-Transfer-Encoding', 'binary')
->withHeader('Expires', '0')
->withHeader('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
->withHeader('Pragma', 'public');
}
/**
* Αποστολή αρχείου/ων και λήψη πρωτοκόλλου.
*
* @param Psr\Http\Message\ServerRequestInterface $req
* @param Psr\Http\Message\ResponseInterface $res
* @param array $args
* @return Response
*/
public function postProtocol($req, $res, $args)
{
$apikey = (isset($args['apikey']) ? $args['apikey'] : $this->getApiKey());
$params = $req->getParams();