2021-12-30 12:05:56 +01:00
|
|
|
package Mod::APIvelo;
|
|
|
|
#
|
|
|
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
# Copyright (c) Rainer Gümpelein, TeilRad GmbH
|
|
|
|
#
|
|
|
|
#Server for velofaktur
|
|
|
|
#
|
|
|
|
#curl -d '{"Typ":"Statusmeldung","Station":8,"Slot":1,"Fahrzeug":{"Buchbar":false,"Id":"200008","LadezustandBatterie":"75"}}' -H "Content-Type: application/json" -X POST https://shareeapp-fr01.copri4.de/APIvelo
|
|
|
|
#
|
|
|
|
#ATTENTION
|
|
|
|
##In DB context $q->escapeHTML must always done by API
|
|
|
|
#
|
|
|
|
#use lib qw(/var/www/copri4/shareeapp-fr01/src);
|
|
|
|
use warnings;
|
|
|
|
use strict;
|
|
|
|
use POSIX;
|
|
|
|
use Exporter;
|
|
|
|
our @ISA = qw (Exporter);
|
|
|
|
|
|
|
|
#use POSIX;
|
|
|
|
use CGI;
|
|
|
|
use Apache2::Const -compile => qw(OK );
|
|
|
|
use JSON;
|
|
|
|
use Scalar::Util qw(looks_like_number);
|
|
|
|
use Config::General;
|
|
|
|
|
|
|
|
use Lib::Config;
|
|
|
|
use Mod::DBtank;
|
|
|
|
use Mod::Basework;
|
|
|
|
use Mod::APIfunc;
|
|
|
|
use Mod::APIjsonclient;
|
|
|
|
use Data::Dumper;
|
|
|
|
|
|
|
|
sub handler {
|
|
|
|
my ($r) = @_;
|
|
|
|
my $q = new CGI;
|
|
|
|
my $json = JSON->new->allow_nonref;
|
|
|
|
my $cf = new Config;
|
|
|
|
my $dbt = new DBtank;
|
|
|
|
my $bw = new Basework;
|
|
|
|
|
|
|
|
|
|
|
|
my %varenv = $cf->envonline();
|
|
|
|
my $now_dt = strftime "%Y-%m-%d %H:%M:%S", localtime;
|
|
|
|
my $lang="de";
|
|
|
|
my $owner=182;#velofactur API
|
|
|
|
my $debug=1;
|
|
|
|
my $user_agent = $q->user_agent();
|
|
|
|
my $dbh = "";
|
2023-12-19 05:13:56 +01:00
|
|
|
my %headers = map { $_ => $q->http($_) } $q->http();
|
|
|
|
#$bw->log("APIvelo POST:\n--> user-agent: '$user_agent' to syshost: $varenv{syshost}\n",$q,"");
|
2021-12-30 12:05:56 +01:00
|
|
|
|
|
|
|
print $q->header(-type => "application/json", -charset => "utf-8", -'Access-Control-Allow-Origin' => "*");
|
|
|
|
|
|
|
|
open(FILE,">>$varenv{logdir}/APIvelo.log") if($debug);
|
|
|
|
print FILE "\n*** $now_dt user-agent: '$user_agent' to syshost: $varenv{syshost}\n" if($debug);
|
2023-12-19 05:13:56 +01:00
|
|
|
#print FILE "headers:" . Dumper(%headers) . "\n";
|
|
|
|
for my $header ( keys %headers ) {
|
|
|
|
print FILE "$header: $headers{$header}\n";
|
|
|
|
}
|
2021-12-30 12:05:56 +01:00
|
|
|
print FILE "<=== veloDUMP\n " . Dumper($q) . "\n" if($debug);
|
|
|
|
print FILE "<=== DUMP postdata:\n " . Dumper($q->param('POSTDATA')) . "\n" if($debug);
|
|
|
|
|
|
|
|
my $jrout = "seems to be not valid";
|
|
|
|
eval {
|
|
|
|
my $response_in = decode_json( $q->param('POSTDATA'));
|
|
|
|
|
|
|
|
|
|
|
|
#- int19=bike charge
|
|
|
|
#- int27=velofactur bike ID
|
|
|
|
#- int28=station_lock_state (station lock velofactur)
|
|
|
|
#- int30=velofactur station ID
|
|
|
|
#- int31=velofactur slot ID
|
|
|
|
|
2023-12-19 05:13:56 +01:00
|
|
|
my $jrout = $json->pretty->encode($response_in);
|
2021-12-30 12:05:56 +01:00
|
|
|
print FILE "<=== JSON POST from velofactur:\n$jrout\n" if($debug);
|
|
|
|
|
|
|
|
my $record_cc = { c_id => 0 };
|
|
|
|
|
|
|
|
if($response_in->{Typ} eq "Statusmeldung" && $response_in->{Fahrzeug}->{Id} =~ /(\d+)/){
|
|
|
|
my $velo_id = $1;
|
|
|
|
print FILE "condition: : $response_in->{Typ} && $response_in->{Fahrzeug}->{Id}\n" if($debug);
|
|
|
|
my $pref_cc = {
|
|
|
|
table => "content",
|
|
|
|
fetch => "one",
|
|
|
|
template_id => "205",
|
|
|
|
int27 => $velo_id,
|
|
|
|
};
|
|
|
|
|
|
|
|
#loop operators to get velofactur bike Id
|
|
|
|
while (my ($mandant_conf, $value) = each %{ $dbt->{operator} }) {
|
|
|
|
if($value->{database}->{dbname} && $value->{hwtype} eq "velofactur"){
|
|
|
|
my $rows = 0;
|
|
|
|
|
|
|
|
my $sharee_operator = $value->{database}->{dbname};
|
|
|
|
my $dbh_operator = $dbt->dbconnect_extern($sharee_operator);
|
|
|
|
$record_cc = $dbt->fetch_record($dbh_operator,$pref_cc);
|
|
|
|
|
|
|
|
if($record_cc->{c_id}){
|
|
|
|
my $update_cc = {
|
|
|
|
table => "content",
|
|
|
|
mtime => "now()",
|
|
|
|
owner => "$owner",
|
|
|
|
};
|
|
|
|
|
|
|
|
#$update_cc->{int28} = 0;#where is the key=value for station_lock_state? Buchbar?
|
|
|
|
$update_cc->{int19} = $response_in->{Fahrzeug}->{LadezustandBatterie} if(looks_like_number($response_in->{Fahrzeug}->{LadezustandBatterie}));
|
|
|
|
$update_cc->{int27} = $1 if($response_in->{Fahrzeug}->{Id} && $response_in->{Fahrzeug}->{Id} =~ /(\d+)/);
|
|
|
|
$update_cc->{int30} = $1 if($response_in->{Station} && $response_in->{Station} =~ /(\d+)/);
|
|
|
|
$update_cc->{int31} = $1 if($response_in->{Slot} && $response_in->{Slot} =~ /(\d+)/);
|
|
|
|
|
|
|
|
#velofactur false|true boeelan
|
|
|
|
#set bike_state to maintanance
|
|
|
|
#only if saved! velofactur Buchbar_state = true and bike_state = available
|
2022-07-12 19:59:44 +02:00
|
|
|
#$update_cc->{int10} = 4 if($update_cc->{int29} == 1 && $update_cc->{int10} == 1);
|
|
|
|
#$update_cc->{int29} = 0;
|
2021-12-30 12:05:56 +01:00
|
|
|
|
|
|
|
if($response_in->{Fahrzeug}->{Buchbar}){
|
|
|
|
#set bike_state to available
|
|
|
|
#only if saved! velofactur Buchbar_state = false and bike_state = maintanance
|
2022-07-12 19:59:44 +02:00
|
|
|
#$update_cc->{int10} = 1 if($update_cc->{int29} == 0 && $update_cc->{int10} == 4);
|
|
|
|
#$update_cc->{int29} = 1;
|
2021-12-30 12:05:56 +01:00
|
|
|
}
|
|
|
|
|
2023-12-19 05:13:56 +01:00
|
|
|
#$rows = $dbt->update_record($dbh_operator,$update_cc,$record_cc);
|
2021-12-30 12:05:56 +01:00
|
|
|
$bw->log("velofactur updates dbname: $sharee_operator, c_id=$record_cc->{c_id} by fakturjson $response_in->{Typ} | rows:$rows",$update_cc,"");
|
|
|
|
print FILE "---> velofactur updates dbname: $sharee_operator, c_id=$record_cc->{c_id} by fakturjson $response_in->{Typ} | rows:$rows\n" . Dumper($update_cc) . "\n" if($debug);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
############
|
|
|
|
#stdout printed JSON to velofactur endpoint
|
|
|
|
my %jsonout;
|
|
|
|
$jsonout{Typ} = "sharee Befehlsmeldung";
|
|
|
|
$jsonout{Status} = "DONE";
|
|
|
|
|
|
|
|
foreach my $resp (keys (%{ $response_in })) {
|
|
|
|
#print $resp . ":" . $response_in->{$resp} . "\n";
|
|
|
|
$jsonout{$resp} = $response_in->{$resp} if($resp eq "Id");
|
|
|
|
}
|
|
|
|
my $rest_json = $json->pretty->encode(\%jsonout);
|
|
|
|
print $rest_json;
|
|
|
|
############
|
|
|
|
|
|
|
|
}else{
|
|
|
|
print FILE "condition anywhere an for selftests\n" if($debug);
|
|
|
|
print $jrout;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
if ($@){
|
|
|
|
print FILE "failure! can not decode POST json, POSTDATA:\n" . Dumper($q->param('POSTDATA')) . "\n" if($debug);
|
|
|
|
warn $@;
|
|
|
|
}
|
|
|
|
|
|
|
|
close(FILE) if($debug);
|
|
|
|
return Apache2::Const::OK;
|
|
|
|
}
|
|
|
|
1;
|