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

Merge branch 'barebone' into 'master'

Barebone PHP client and sample command line php application

See merge request !2
parents 3b2d3832 db5f1404
This diff is collapsed.
<?php
// barebone app - autoload classes from src/ dir
spl_autoload_register(function ($class_name) {
$class_name_parts = explode('\\', $class_name);
$class_filename = __DIR__ . '/src/' . end($class_name_parts) . '.php';
if (file_exists($class_filename)) {
include $class_filename;
if (class_exists($class_name)) {
return true;
}
}
return false;
});
use Gr\Gov\Minedu\Osteam\App;
$settings = require(__DIR__ . '/settings.php');
/**
* Λήψη παραμέτρων καθορισμού λειτουργίας από τη γραμμή εντολών
* v = verbose output
* i = incoming file type
* o = outgoing file type
*/
$options = getopt('vio', ['send:', 'list', 'listshow', 'show:', 'get:', 'save:', 'attach:']);
$send = isset($options['send']);
$attach = $send && isset($options['attach']);
$list = isset($options['list']) || isset($options['listshow']);
$listdetails = isset($options['listshow']);
$show = isset($options['show']);
$get = isset($options['get']) || isset($options['save']);
$save = isset($options['save']);
$incoming_only = isset($options['i']);
$outgoing_only = isset($options['o']);
if ($attach) {
$files = $options['attach'];
if (!is_array($files)) {
$files = [$files];
}
} else {
$files = [];
}
/**
* Αρχικοποίηση εφαρμογής
*/
$app = new App($settings);
$app->setDebug(isset($options['v']));
/**
* Έλεγχος παραμέτρων
*/
if (!$send && !$list && !$show && !$get) {
echo "Χρήση: {$argv[0]} [-v] [--list] [--listshow] [-i|-o] [--send <file>] [--attach <file>] [--show <hashid>] [--get <hashid>] [--save <hashid>]", PHP_EOL,
" v: παραγωγή μηνυμάτων παρακολούθησης εκτέλεσης", PHP_EOL,
" list: λίστα hashids των εγγράφων (των τελευταίων 5 ημερών)", PHP_EOL,
" listshow: λίστα αρχείων (των τελευταίων 5 ημερών)", PHP_EOL,
" i: να συμπεριληφθούν μόνο τα εισερχόμενα στη λίστα αρχείων", PHP_EOL,
" ο: να συμπεριληφθούν μόνο τα εξερχόμενα στη λίστα αρχείων", PHP_EOL,
" send <file>: καταχώρηση πρωτοκόλλου με αποστολή του αρχείου file", PHP_EOL,
"attach <file>: επισύναψη αρχείου στην καταχώρηση (πολλαπλό)", PHP_EOL,
" show <hash>: αναλυτικές πληροφορίες αρχείου με δεδομένο hashid", PHP_EOL,
" get <hash>: λήψη αρχείου με δεδομένο hashid", PHP_EOL,
" save <hash>: λήψη και αποθήκευση αρχείου με δεδομένο hashid", PHP_EOL,
" στον τρέχοντα φάκελο και με το όνομα αρχείου που επιστρέφεται", PHP_EOL,
exit(0);
}
/**
* If any work is to be done, an api key is required
*/
echo "Ανάκτηση API key...", PHP_EOL;
try {
$apikey = $app->getApiKey();
echo "Το API key είναι: ", $apikey, PHP_EOL;
} catch (\Exception $e) {
echo 'ΛΑΘΟΣ: Αδυναμία ανάκτησης API key. ', PHP_EOL, $e->getMessage(), PHP_EOL;
exit(-1);
}
/**
* Αποστολή αρχείου για πρωτοκόλληση
*/
if ($send) {
echo "Αποστολή εγγράφου...", PHP_EOL;
echo "Έλεγχος για το αρχείο {$options['send']}... ";
if ($app->loadFile($options['send'])) {
echo "OK", PHP_EOL;
} else {
echo PHP_EOL, "ΛΑΘΟΣ: Το αρχείο δεν είναι αναγνώσιμο.", PHP_EOL;
exit(-1);
}
if ($attach) {
foreach ($files as $filename) {
echo "Έλεγχος για το συνημμένο αρχείο {$filename}... ";
if ($app->loadFile($filename)) {
echo "OK", PHP_EOL;
} else {
echo PHP_EOL, "ΛΑΘΟΣ: Το αρχείο δεν είναι αναγνώσιμο.", PHP_EOL;
exit(-1);
}
}
}
try {
// καθορισμός παραμέτρων σε πίνακα για απλοποίηση
// το παράδειγμα δεν περιλαμβάνει συνημμένα αρχεία
// και ορισμένες επιπλέον παραμέτρους
// senderId, senderProtocol, senderProtocolDate, ada
$submission_data = [
'theme' => 'ΔΟΚΙΜΗ: Αυτοματοποιημένο κείμενο της ' . date('c'),
'description' => 'ΔΟΚΙΜΗ: Αυτοματοποιημένο κείμενο περιγραφής ' . date('Ymdhmi'),
'docCategory' => 20,
];
// προσθήκη κυρίως αρχείου
$submission_data['mainDoc'] = [
'document' => $options['send'],
// document: μπορεί να είναι
// string = αναφορά σε αρχείο που έχει ήδη φορτωθεί με την $app->loadFile()
// array = associative array me key "base64" και value το base64 encoding του περιεχομένου του αρχείου
'fileName' => $options['send'],
'description' => "ΔΟΚΙΜΗ: Αποστολή δοκιμαστικού αρχείου {$options['send']}"
];
// προσθήκη συνημμένων
if ($attach) {
$submission_data['attachedDoc'] = [];
foreach ($files as $filename) {
$submission_data['attachedDoc'][] = [
'document' => $filename,
// document: μπορεί να είναι
// string = αναφορά σε αρχείο που έχει ήδη φορτωθεί με την $app->loadFile()
// array = associative array me key "base64" και value το base64 encoding του περιεχομένου του αρχείου
'fileName' => $filename,
'description' => "ΔΟΚΙΜΗ: Αποστολή συνημμένου δοκιμαστικού αρχείου {$filename}"
];
}
}
$doc_info = $app->postProtocol($submission_data, $apikey);
echo "Η αποστολή ολοκληρώθηκε με ΑΡ.Π.: ", $doc_info["protocolNumber"], PHP_EOL;
echo "Αναλυτικά: ", print_r($doc_info, true), PHP_EOL;
} catch (\Exception $e) {
echo 'ΛΑΘΟΣ: Αδυναμία αποστολής εγγράφου. ', PHP_EOL, $e->getMessage(), PHP_EOL;
exit(1);
}
}
/**
* Λειτουργία λήψης λίστας των καταχωρημένων πρωτοκόλλων.
* Εάν έχει ζητηθεί επιστρέφονται και οι αναλυτικές πληροφορίες των εγγράφων.
*/
if ($list) {
echo "Ανάκτηση λίστας εγγράφων...", PHP_EOL;
try {
$now = date(DATE_W3C);
$fivedaysbefore = date(DATE_W3C, mktime(0, 0, 0, date("m"), date("d") - 5, date("Y")));
$doc_type = ($incoming_only ? App::DOCUMENT_INCOMING : null);
$doc_type = ($incoming_only ? App::DOCUMENT_OUTGOING : $doc_type);
$doc_hash_ids = $app->searchDocuments(null, $fivedaysbefore, $now, $doc_type, $apikey);
if ($listdetails) {
$doc_details = array_map(function ($hashid) use ($app, $apikey) {
try {
$details = $app->getDocData($hashid, $apikey);
} catch (Exception $ex) {
return [
'id' => $hashid,
'error' => $ex->getCode()
];
}
return $details;
}, $doc_hash_ids);
echo "Λεπτομέρειες εγγράφων: ", PHP_EOL, print_r($doc_details, true), PHP_EOL;
} else {
echo "Λίστα εγγράφων: ", PHP_EOL, implode(PHP_EOL, $doc_hash_ids), PHP_EOL;
}
} catch (\Exception $e) {
echo 'ΛΑΘΟΣ: Αδυναμία ανάκτησης λίστας εγγράφων. ', PHP_EOL, $e->getMessage(), PHP_EOL;
exit(1);
}
}
/**
* Λειτουργία ανάκτησης πληροφοριών αρχείου με δεδομένο hash id $options['show']
*/
if ($show) {
try {
$doc_details = $app->getDocData($options['show'], $apikey);
echo "Λεπτομέρειες εγγράφου: ", PHP_EOL, print_r($doc_details, true), PHP_EOL;
} catch (\Exception $e) {
echo 'ΛΑΘΟΣ: Αδυναμία ανάκτησης λεπτομερειών εγγράφων. ', PHP_EOL, $e->getMessage(), PHP_EOL;
exit(1);
}
}
/**
* Λειτουργία λήψης αρχείου με δεδομένο hash id $options['save'] ή $options['get']
*/
if ($get) {
if ($save) {
$doc_details = $app->savePdf($options['save'], $apikey);
echo "Λεπτομέρειες αποθήκευσης εγγράφου: ", PHP_EOL, print_r($doc_details, true), PHP_EOL;
} else {
$doc_details = $app->getPdf($options['get'], $apikey);
echo "Λεπτομέρειες εγγράφου: ", PHP_EOL, print_r($doc_details, true), PHP_EOL;
}
}
echo "Done.", PHP_EOL;
exit(0);
<?php
return [
// username and password to authenticate
'username' => 'test',
'password' => '123456',
// sender id for test lookups
'sender_id' => 100000001
];
<?php
//
namespace Gr\Gov\Minedu\Osteam;
use Gr\Gov\Minedu\Osteam\Client;
/**
* Description of app
*
* @author spapad
*/
class App
{
// Εισερχόμενο
const DOCUMENT_INCOMING = 1;
// Εξερχόμενο
const DOCUMENT_OUTGOING = 2;
private $client = null;
private $_settings = [];
private $_debug = false;
private $_files = [];
/**
*
* @param array $settings is an array of configuration parameters
*/
function __construct($settings = [])
{
$this->_settings = array_merge($this->_settings, $settings);
$this->client = new Client();
}
protected function setting($name)
{
return (isset($this->_settings["$name"]) ?
$this->_settings["$name"] :
null);
}
/**
* Λήψη κλειδιού πιστοποίησης.
*
* @return string The api key
* @throws \Exception
*/
public function getApiKey()
{
$payload = json_encode([
'username' => $this->setting('username'),
'password' => $this->setting('password')
]);
if ($this->_debug) {
echo "getApiKey :: payload: {$payload}", PHP_EOL;
}
$response = json_decode($this->client->pauth($payload));
return $response->apiKey;
}
/**
* Αναζήτηση εγγράφων.
*
* @param int $sender_id Κωδικός αποστολέα, π.χ. 10000001
* Η προκαθορισμένη τιμή του senderId προέρχεται από τα settings
* @param date $date_from Ημερομηνία αναζήτησης - Από
* @param date $date_to Ημερομηνία αναζήτησης - Έως
* @param int $doc_type Δείτε App::DOCUMENT_INCOMING, App::DOCUMENT_OUTGOING
* @param type $apikey Κλειδί αυθεντικόποίησης
* @return string[] Πίνακας με hashids
* @throws \Exception
*/
public function searchDocuments($sender_id = null, $date_from = null, $date_to = null, $doc_type = null, $apikey = null)
{
$payload = json_encode([
'senderId' => $sender_id === null ? $this->setting('sender_id') : null,
'docType' => $doc_type,
'startDate' => $date_from,
'endDate' => $date_to
]
);
if ($this->_debug) {
echo "searchDocuments :: payload: {$payload}", PHP_EOL;
}
$response = json_decode($this->client->searchDocuments($payload, $apikey === null ? $this->getApiKey() : $apikey));
return $response;
}
/**
* Ανάκτηση πληροφοριών εγγράφου.
*
* @param type $hashid Το μοναδικό hashid του εγγράφου
* @param type $apikey Κλειδί αυθεντικόποίησης
* @return string[]
* @throws \Exception
*/
public function getDocData($hashid, $apikey = null)
{
if ($this->_debug) {
echo "getDocData:: hash id: {$hashid}", PHP_EOL;
}
$response = json_decode($this->client->getDocData($hashid, $apikey === null ? $this->getApiKey() : $apikey), true);
return $response;
}
public function postProtocol($submission_data, $apikey = null)
{
$postdata = array_merge([
'senderId' => $this->setting('sender_id'),
], $submission_data
);
// take care of files...
if (isset($postdata['mainDoc'])) {
if (is_string($postdata['mainDoc']['document'])) {
$postdata['mainDoc']['document'] = $this->_files[$postdata['mainDoc']['document']];
}
}
if (isset($postdata['attachedDoc'])) {
$postdata['attachedDoc'] = array_map(function ($doc) {
if (is_string($doc['document'])) {
$doc['document'] = $this->_files[$doc['document']];
}
return $doc;
}, $postdata['attachedDoc']);
}
$payload = json_encode($postdata);
if ($this->_debug) {
echo "postProtocol :: payload: {$payload}", PHP_EOL;
}
$response = json_decode($this->client->postProtocol($payload, $apikey === null ? $this->getApiKey() : $apikey), true);
return $response;
}
public function getPdf($hashid, $apikey = null)
{
if ($this->_debug) {
echo "getPdf:: hash id: {$hashid}", PHP_EOL;
}
$response = json_decode($this->client->getPdf($hashid, $apikey === null ? $this->getApiKey() : $apikey), true);
return $response;
}
public function savePdf($hashid, $apikey = null)
{
if ($this->_debug) {
echo "savePdf:: hash id: {$hashid}", PHP_EOL;
}
$result = $this->getPdf($hashid, $apikey = null);
$save = file_put_contents($result["fileName"], base64_decode($result["document"]["base64"]));
return [
'file_name' => $result["fileName"],
'description' => $result["description"],
'save' => ($save ? 'Αποθηκεύτηκε' : 'ΔΕΝ αποθηκεύθηκε')
];
}
/**
* Read a file to use later
*
* @param string $filename The file to read
* @return boolean
*/
public function loadFile($filename)
{
if (is_readable($filename)) {
$file = base64_encode(file_get_contents($filename));
if ($file !== false) {
$this->_files["$filename"] = $file;
return true;
}
}
return false;
}
public function setDebug($debug = true)
{
$this->_debug = ($debug === true);
$this->client->setDebug($debug);
return;
}
}
<?php
/*
*
*/
namespace Gr\Gov\Minedu\Osteam;
use Exception;
/**
* Description of Client
*
* @author spapad
*/
class Client
{
private $_debug = false;
private $_settings = [
'base_uri' => 'https://protocoltest.minedu.gov.gr:443/openpapyros/api'
];
public function __construct($settings = [])
{
$this->_settings = array_merge($this->_settings, $settings);
}
public function pauth($payload)
{
$result = $this->put("{$this->_settings['base_uri']}/pauthenticate/pauth", $payload, [
"Content-Type: application/json",
"Accept: application/json",
]
);
return $result;
}
public function searchDocuments($payload, $apikey)
{
$result = $this->post("{$this->_settings['base_uri']}/search/documents", $payload, [
"api_key: {$apikey}",
"Content-Type: application/json",
"Accept: application/json",
]
);
return $result;
}
public function getDocData($hashid, $apikey)
{
$result = $this->get("{$this->_settings['base_uri']}/document/data/{$hashid}", [], [
"api_key: {$apikey}",
"Content-Type: text/plain",
"Accept: application/json",
]
);
return $result;
}
public function getPdf($hashid, $apikey)
{
$result = $this->get("{$this->_settings['base_uri']}/document/pdf/{$hashid}", [], [
"api_key: {$apikey}",
"Content-Type: text/plain",
"Accept: application/json",
]
);
return $result;
}
public function postProtocol($payload, $apikey)
{
$result = $this->post("{$this->_settings['base_uri']}/protocol/submit", $payload, [
"api_key: {$apikey}",
"Content-Type: application/json",
"Accept: application/json",
]
);
return $result;
}
protected function setCommonCurlOptions($ch, $uri, $headers)
{
curl_setopt($ch, CURLOPT_URL, $uri);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_USERAGENT, "OSTEAM barebone php client");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
if ($this->_debug === true) {
curl_setopt($ch, CURLOPT_VERBOSE, true);
}
}
public function put($uri, $payload, $headers = [])
{
$ch = curl_init();
$this->setCommonCurlOptions($ch, $uri, $headers);
// curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$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));
}
if (intval(($http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) / 100) != 2) {
// πραγματοποιήθηκε κλήση αλλά δεν ήταν "επιτυχής"
throw new Exception("Αποτυχημένη κλήση. HTTP STATUS {$http_code}. Η απάντηση ήταν: {$result}", $http_code);
}
curl_close($ch);
return $result;
}
public function post($uri, $payload, $headers = [])
{
$ch = curl_init();
$this->setCommonCurlOptions($ch, $uri, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$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));
}
if (intval(($http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) / 100) != 2) {
// πραγματοποιήθηκε κλήση αλλά δεν ήταν "επιτυχής"
throw new Exception("Αποτυχημένη κλήση. HTTP STATUS {$http_code}. Η απάντηση ήταν: {$result}", $http_code);
}
curl_close($ch);
return $result;
}
public function get($uri, $params = [], $headers = [])
{
$ch = curl_init();
if (is_array($params) && count($params) > 0) {
$qs = '?' . http_build_query($params);
} else {
$qs = '';
}
$this->setCommonCurlOptions($ch, "{$uri}{$qs}", $headers);
// curl_setopt($ch, CURLOPT_HTTPGET, true); // default
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$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));
}
if (intval(($http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) / 100) != 2) {
// πραγματοποιήθηκε κλήση αλλά δεν ήταν "επιτυχής"
throw new Exception("Αποτυχημένη κλήση. HTTP STATUS {$http_code}. Η απάντηση ήταν: {$result}", $http_code);
}
curl_close($ch);
return $result;
}
public function setDebug($debug = true)
{
$this->_debug = ($debug === true);
return;
}
}
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