Doc added

parent eacc520e
# Δοκιμαστικές κλήσεις
Βιβλιοθήκη και διαδικτυακή εφαρμογή SLIM
========================================
http://generic.local.dev/public/ping
# Οδηγίες
Αντιγράψτε το αρχείο `src\settings.php.dist` σε ένα νέο αρχείο `src\settings.php`
και τροποποιήστε αναλόγως, για παράδειγμα εισάγοντας το όνομα χρήστη που σας
έχει αποδοθεί.
http://generic.local.dev/public/apikey
**Προσοχή!** Η ρύθμιση `NO_SAFE_CURL` πρέπει να είναι false σε περιβάλλον
παραγωγής. Εάν έχετε προβλήματα κλήσης της υπηρεσίας θα πρέπει να προβείται
σε κατάλληλες ρυθμίσεις σχετικές με το SSL.
# Εφαρμογή επίδειξης
http://generic.local.dev/public/docdata/43AHBTWUtcX9a4KhU8eXBg%3D%3D
http://generic.local.dev/public/docdata/43AHBTWUtcX9a4KhU8eXBg%3D%3D/eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMDAwMDAwIn0.dW6qmMRJoGL8nA6j5U2zLYJUSc9mnoWioqXsC0D80OE
Η εφαρμογή έχει αναπτυχθεί με το 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 |
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
Η εφαρμογή δημιουργήθηκε με σημείο εκκίνησης το 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`
http://generic.local.dev/public/pdf/Q%2BnehDdzn91TSuVrWOWtoQ%3D%3D
http://generic.local.dev/public/pdf/Q%2BnehDdzn91TSuVrWOWtoQ%3D%3D/eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMDAwMDAwIn0.dW6qmMRJoGL8nA6j5U2zLYJUSc9mnoWioqXsC0D80OE
http://generic.local.dev/public/pdf/download/Q%2BnehDdzn91TSuVrWOWtoQ%3D%3D
Δείγμα απάντησης
```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
......@@ -30,16 +174,36 @@ http://generic.local.dev/public/pdf/download/Q%2BnehDdzn91TSuVrWOWtoQ%3D%3D
curl -v -X POST \
--header "User-Agent: MINEDU OSTEAM Tester" \
-F "theme=Title" \
-F "mainDoc=@test3-minimal.pdf" \
-F "mainDoc=@test2.pdf" \
-F "otherDoc=@test3-minimal.pdf" \
"http://localhost/devel/OpenApi-Papyros-PHP-Clients/slim-app/public/protocol"
"http://generic.local.dev/public/protocol"
```
# Σχετικά με την εφαρμογή
## Άλλες πιθανές απαντήσεις της εφαρμογής
Η εφαρμογή δημιουργήθηκε με σημείο εκκίνησης το Slim Framework 3 Skeleton Application.
Περισσότερες λεπτομέρειες στη [σελίδα του Slim-Skeleton](https://github.com/slimphp/Slim-Skeleton)
Σε περίπτωση που γίνει κλήση σε μη διαθέσιμο resource η εφαρμογή απαντά με
σχετικό μήνυμα.
**Σημαντικό!** Για να τρέξει η εφαρμογή είναι απαραίτητο μετά τη λήψη της
να εκτελέσετε την εντολή `composer install` μέσα στο ριζικό της φάκελο
(\slim-app).
Δείγμα απάντησης στο `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"
}
```
......@@ -23,6 +23,7 @@ class App
protected $ci = null;
protected $client = null;
protected $logger = null;
private $username = '';
private $password = '';
private $sender_id = -1;
......@@ -39,6 +40,9 @@ class App
'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;
}
}
/**
......@@ -61,12 +65,22 @@ class App
return $jsonResponse;
}
protected function setting($name)
protected function log($msg)
{
throw new \Exception("Not implemented");
if ($this->logger) {
$this->logger->info($msg);
}
}
public function ping($req, $res, $args)
/**
* 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,
......@@ -94,7 +108,10 @@ class App
/**
* Λήψη κλειδιού πιστοποίησης.
*
* @throws \Exception
* @param Psr\Http\Message\ServerRequestInterface $req
* @param Psr\Http\Message\ResponseInterface $res
* @param array $args
* @return Response
*/
public function apiKey($req, $res, $args)
{
......@@ -109,10 +126,13 @@ class App
/**
* Ανάκτηση πληροφοριών εγγράφου.
*
* @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)
{
......@@ -135,11 +155,14 @@ class App
* '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)
{
......@@ -151,7 +174,7 @@ class App
$doc_type = self::DOCUMENT_OUTGOING;
}
}
$apikey = (isset($args['apikey']) ? $args['apikey'] : $this->getApiKey());
$apikey = $req->getQueryParam('apikey', $this->getApiKey());
$payload = json_encode([
'senderId' => $req->getQueryParam('sender_id', $this->sender_id),
......@@ -169,10 +192,13 @@ class App
/**
* Λήψη πληροφοριών αρχείου
*
* @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)
{
......@@ -185,10 +211,13 @@ class App
/**
* Λήψη - μεταφόρτωση αρχείου
*
* @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)
{
......@@ -209,6 +238,14 @@ class App
->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());
......@@ -244,6 +281,7 @@ class App
'docCategory' => $req->getParam('docCategory', 20),
'mainDoc' => $mainDoc,
'attachedDoc' => (count($attachedDocs) > 0 ? $attachedDocs : null)
// αντίστοιχα εδώ μπορούν να προστεθούν και όλες οι υπόλοιπες παράμετροι, π.χ. ADA
];
$payload = json_encode($payload_items);
......
......@@ -113,10 +113,10 @@ class Client
if (curl_errno($ch)) {
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) {
if (intval(($http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) / 100) != 2) {
// πραγματοποιήθηκε κλήση αλλά δεν ήταν "επιτυχής"
// throw new Exception("Αποτυχημένη κλήση. HTTP STATUS {$http_code}. Η απάντηση ήταν: {$result}", $http_code);
// }
throw new Exception("Αποτυχημένη κλήση. HTTP STATUS {$http_code}. Η απάντηση ήταν: {$result}", $http_code);
}
curl_close($ch);
return $result;
}
......@@ -136,10 +136,10 @@ class Client
if (curl_errno($ch)) {
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) {
if (intval(($http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) / 100) != 2) {
// πραγματοποιήθηκε κλήση αλλά δεν ήταν "επιτυχής"
// throw new Exception("Αποτυχημένη κλήση. HTTP STATUS {$http_code}. Η απάντηση ήταν: {$result}", $http_code);
// }
throw new Exception("Αποτυχημένη κλήση. HTTP STATUS {$http_code}. Η απάντηση ήταν: {$result}", $http_code);
}
curl_close($ch);
return $result;
}
......@@ -163,10 +163,10 @@ class Client
if (curl_errno($ch)) {
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) {
if (intval(($http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) / 100) != 2) {
// πραγματοποιήθηκε κλήση αλλά δεν ήταν "επιτυχής"
// throw new Exception("Αποτυχημένη κλήση. HTTP STATUS {$http_code}. Η απάντηση ήταν: {$result}", $http_code);
// }
throw new Exception("Αποτυχημένη κλήση. HTTP STATUS {$http_code}. Η απάντηση ήταν: {$result}", $http_code);
}
curl_close($ch);
return $result;
}
......
<?php
$app->get('/ping', '\Gr\Gov\Minedu\Osteam\Slim\App:ping');
$app->get('/defaults', '\Gr\Gov\Minedu\Osteam\Slim\App:defaults');
$app->get('/apikey', '\Gr\Gov\Minedu\Osteam\Slim\App:apiKey');
$app->get('/docdata/{hashid}[/{apikey}]', '\Gr\Gov\Minedu\Osteam\Slim\App:docData');
$app->get('/search[/{doc_type}]', '\Gr\Gov\Minedu\Osteam\Slim\App:searchDocuments');
......
......@@ -3,6 +3,6 @@
curl -v -X POST \
--header "User-Agent: MINEDU OSTEAM Tester" \
-F "theme=Title" \
-F "mainDoc=@test3-minimal.pdf" \
-F "mainDoc=@test2-minimal.pdf" \
-F "otherDoc=@test3-minimal.pdf" \
"http://localhost/devel/OpenApi-Papyros-PHP-Clients/slim-app/public/protocol"
"http://generic.local.dev/public/protocol"
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment