src/Controller/Api/TrafficInfosApiController.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api;
  3. use Carbon\Carbon;
  4. use Pimcore\Controller\FrontendController;
  5. use Pimcore\Mail;
  6. use Pimcore\Model\DataObject;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\Routing\Annotation\Route;
  9. class TrafficInfosApiController extends FrontendController
  10. {
  11.     private $openAIService;
  12.     /**
  13.      * @Route("/api/get-traffic-infos", name="traffic-infos")
  14.      */
  15.     public function defaultAction(Request $request)
  16.     {
  17.         $trafficInfos = new DataObject\TrafficInfo\Listing();
  18. //        $trafficInfos->setOrderKey("o_modificationDate");
  19.         $blitzerOnly $request->get("blitzerOnly"false);
  20.         $blitzerOff $request->get("blitzerOff"false);
  21.         $condition = [];
  22.         $conditionParams = [];
  23.         if ($blitzerOnly) {
  24.             $condition[] = "(category = :blitzer or category = :blitzeranhaenger)";
  25.             $conditionParams["blitzer"] = "Blitzer";
  26.             $conditionParams["blitzeranhaenger"] = "Blitzeranhänger";
  27.             $trafficInfos->setOrderKey("o_creationDate");
  28.             $trafficInfos->setOrder("desc");
  29.         } else if ($blitzerOff) {
  30.             $condition[] = "(category != :blitzer and category != :blitzeranhaenger)";
  31.             $conditionParams["blitzer"] = "Blitzer";
  32.             $conditionParams["blitzeranhaenger"] = "Blitzeranhänger";
  33.             $trafficInfos->setOrderKey("o_creationDate");
  34.             $trafficInfos->setOrder("desc");
  35.         } else {
  36.             $trafficInfos->setOrderKey("o_creationDate");
  37.             $trafficInfos->setOrder("desc");
  38.         }
  39.         $trafficInfos->setCondition(join(' AND '$condition), $conditionParams);
  40.         $data = [];
  41.         /**
  42.          * @var  $key
  43.          * @var DataObject\TrafficInfo $info
  44.          */
  45.         foreach ($trafficInfos->load() as $key => $info) {
  46.             $data[] = [
  47.                 "traffic" => true,
  48.                 "id" => $info->getId(),
  49.                 "category" => $info->getCategory(),
  50.                 "title" => $info->getTitle(),
  51.                 "text" => trim(strip_tags($info->getText())),
  52.                 "timeInfo" => $info->getTime(),
  53.                 "streetType" => $info->getStreetType(),
  54.                 "paths" => json_decode($info->getMdmPath(), true),
  55.                 "published" => $info->getPublished(),
  56.                 "geolocation" => $info->getGeolocation() !== null ? ["latitude" => $info->getGeolocation()->getLatitude(), "longitude" => $info->getGeolocation()->getLongitude()] : ["latitude" => 0"longitude" => 0],
  57.                 "hasGeolocation" => $info->getGeolocation() !== null,
  58.                 "date" => $info->getModificationDate(),
  59.                 "createdAt" => date("c"$info->getCreationDate()),
  60.                 "updatedAt" => date("c"$info->getModificationDate())
  61.             ];
  62.         }
  63.         // sort by geolocation Lat, then by date
  64.         usort($data, fn($a$b) => $b['geolocation']['latitude'] - $a['geolocation']['latitude']);
  65.         foreach ($data as $key => $val) {
  66.             if (!$val['hasGeolocation']) {
  67.                 $data[$key]['geolocation'] = null;
  68.             }
  69.         }
  70.         $return $this->json(["success" => true"data" => $data]);
  71.         $return->setExpires(new \DateTime('+15 seconds'));
  72.         return $return;
  73.     }
  74.     /**
  75.      * @Route("/api/traffic-report", name="traffic-report")
  76.      */
  77.     public function trafficReportAction(Request $request)
  78.     {
  79.         $content $request->getContent();
  80.         $path DataObject::getByPath('/TrafficInfo/Usermeldungen');
  81.         $id null;
  82.         if ($content) {
  83.             $data json_decode($contenttrue);
  84.             if (
  85.                 trim($data['location']) &&
  86.                 trim($data['appDevice']) &&
  87.                 trim($data['appVersion']) &&
  88.                 trim($data['appUserId'])
  89.             ) {
  90.                 $report = new DataObject\TrafficReport();
  91.                 $report->setParent($path);
  92.                 // mandatory
  93.                 $report->setLocation(trim($data['location']));
  94.                 $report->setAppDevice(trim($data['appDevice']));
  95.                 $report->setAppVersion(trim($data['appVersion']));
  96.                 $report->setAppUserId(trim($data['appUserId']));
  97.                 $report->setUsername(isset($data['username']) ? trim($data['username']) : '');
  98.                 // optional
  99.                 $report->setTime($data['time'] ? trim($data['time']) : '');
  100.                 $report->setBlitzerDirection($data['blitzerDirection'] ? trim($data['blitzerDirection']) : '');
  101.                 $report->setBlitzerType($data['blitzerType'] ? trim($data['blitzerType']) : '');
  102.                 if ($data['geolocation']) {
  103.                     $geolocation = new \Pimcore\Model\DataObject\Data\GeoCoordinates($data['geolocation']['lat'], $data['geolocation']['lon']);
  104.                     $report->setGeolocation($geolocation);
  105.                 }
  106.                 $report->setPublished(true);
  107.                 $now = new \DateTime();
  108.                 $report->setKey($now->format('Y-m-d G:i:s') . ' ' trim($data['appUserId']));
  109.                 $report->save();
  110.                 $id $report->getId();
  111.                 try {
  112.                     // send mail
  113.                     $mail = new Mail();
  114.                     $mail->from('Radio Oberland <no-reply@radio-oberland.de>');
  115.                     $mail->replyTo('no-reply@radio-oberland.de');
  116.                     $mail->to('redaktion@radio-oberland.de');
  117.                     $mail->text('Neue Blitzermeldung aus der BOA App\n\nZu finden auch im RO Backend Dashboard\n\nWo: ' $report->getLocation() . '\nRichtung: ' $report->getBlitzerDirection() . '\nWas: ' $report->getBlitzerType());
  118.                     $mail->html('<h1>Neue Blitzermeldung aus der BOA App</h1><br/>Zu finden auch im RO Backend Dashboard<br/><br/>Wo: ' $report->getLocation() . '<br/>Richtung: '$report->getBlitzerDirection() . '<br/>Was: ' $report->getBlitzerType());
  119.                     $mail->subject('BOA Blitzermeldung');
  120.                     $mail->send();
  121.                 } catch (\Exception $e) {
  122.                     // ignore
  123.                 }
  124.             }
  125.         }
  126.         return $this->json(["success" => true"id" => $id]);
  127.     }
  128.     /**
  129.      * @Route("/api/get-traffic-report", name="get-traffic-report")
  130.      */
  131.     public function getTrafficReportAction(Request $request)
  132.     {
  133.         $listing = new DataObject\TrafficReport\Listing();
  134.         $listing->setOrderKey("o_creationDate");
  135.         $listing->setOrder("desc");
  136.         $listing->setLimit(100);
  137.         $data = [];
  138.         /** @var DataObject\TrafficReport $report */
  139.         foreach ($listing->load() as $report) {
  140.             $created Carbon::createFromTimestamp($report->getCreationDate());
  141.             $data[] = [
  142.                 "id" => $report->getId(),
  143.                 "created" => $created->format('d.m.Y'),
  144.                 "time" => $report->getTime(),
  145.                 "location" => $report->getLocation(),
  146.                 "type" => $report->getBlitzerType(),
  147.                 "direction" => $report->getBlitzerDirection(),
  148.                 "source" => $report->getAppDevice()
  149.             ];
  150.         }
  151.         return $this->json(["data" => $data]);
  152.     }
  153.     /**
  154.      * @Route("/api/get-audio-traffic", name="audio-traffic")
  155.      */
  156.     public function audioTrafficAction(Request $request) {
  157.         $forceNew $request->get("forceNew"false);
  158.         $gptPrompt '';
  159.         $trafficInfos = new DataObject\TrafficInfo\Listing();
  160.         $condition = ["(category != :blitzer and category != :blitzeranhaenger)"];
  161.         $conditionParams = [
  162.             "blitzer" => "Blitzer",
  163.             "blitzeranhaenger" => "Blitzeranhänger"
  164.         ];
  165.         $trafficInfos->setOrderKey("o_creationDate");
  166.         $trafficInfos->setOrder("desc");
  167.         $trafficInfos->setCondition(join(' AND '$condition), $conditionParams);
  168.         $entries $trafficInfos->load();
  169.         if (count($entries)) {
  170.             $i 0;
  171.             foreach ($trafficInfos->load() as $key => $info) {
  172.                 $i++;
  173.                 $gptPrompt .= $i '.\n'
  174.                     'Straße: ' $info->getTitle() . '\n'
  175.                     'Details: ' $info->getText() . '\n\n';
  176.             }
  177.             $gptPrompt .= 'Das waren die Radio Oberland Verkehrsmeldungen. Wir wünschen allen eine gute Fahrt.';
  178.         } else {
  179.             $gptPrompt .= 'Derzeit alles ruhig auf den Straßen im Oberland.';
  180.         }
  181.         $openAIService = new \App\Service\OpenAIService();
  182.         $response $openAIService->prompt([$gptPrompt], [
  183.             'Du bist ein Radiosprecher für die Verkehrsmeldungen',
  184.             'Erzeuge mir einen Sprechertext für folgende Datensätze. Nutze die Aufzählungen nur zum Erkennen der einzelnen Meldungen, nicht im ausgegebenen Text.',
  185.             'Bei Entfernungsangaben müssen die Zahlen gerundet werden',
  186.             'Schreibe Zahlen als Worte in korrekter deutscher Hunderter-Schreibweise aus und lass die Angaben der Durschnittsgeschwindigkeiten weg.',
  187.         ]);
  188. //        dd($responseText);
  189.         $audio false;
  190.         if (isset($response['message']) && $response['message']) {
  191.             $voiceService = new \App\Service\VoiceService();
  192.             $audio $voiceService->createVoice($response['message'], 'raphi');
  193.         }
  194.         return $this->json(["success" => $response['status'], "message" => $response['message'], "prompt" => $gptPrompt"audio" => $audio]);
  195.     }
  196.     /**
  197.      * @Route("/api/test-audio-traffic", name="audio-traffic-test")
  198.      */
  199.     public function audioTestAction() {
  200.         $text "Achtung Autofahrer auf der A fünfundneunzig von München in Richtung Garmisch-Partenkirchen: Zwischen Penzberg/Iffeldorf und Sindelsdorf ist die Strecke gesperrt. Grund dafür ist eine ungesicherte Unfallstelle nach einem schweren Unfall. Die Sperrung wird voraussichtlich bis zum fünfzehnten November zweitausendvierundzwanzig um circa fünfzehn Uhr andauern. Bitte planen Sie alternative Routen ein und fahren Sie besonders vorsichtig in diesem Bereich.\n\nAuf der B siebzehn besteht zwischen der B vierhundertzweiundsiebzig bei Peiting-West und der B vierhundertzweiundsiebzig bei Schongau-West stockender Verkehr auf einer Strecke von drei Kilometern. Die Verzögerung kann zu einem Zeitverlust von bis zu drei Minuten führen.\n\nEbenfalls auf der B zwei von Weilheim in Richtung Mittenwald müssen Sie zwischen der Lena-Christ-Straße und Weilheim in Oberbayern mit stockendem Verkehr rechnen. Hier staut es sich auf einer Länge von ungefähr einem Kilometer mit einer Verzögerung von ebenfalls bis zu drei Minuten.\n\nDas waren die Verkehrsmeldungen von Radio Oberland. Wir wünschen Ihnen weiterhin eine gute und sichere Fahrt.";
  201.         $voiceService = new \App\Service\VoiceService();
  202.         $voiceService->createVoice($text'raphi');
  203.     }
  204.     /**
  205.      * @Route("/api/unpublish-traffic-report", name="unpublish-traffic-report")
  206.      */
  207.     public function unpublishTrafficReportAction(Request $request)
  208.     {
  209.         $id $request->get("id");
  210.         $report DataObject\TrafficReport::getById($id);
  211.         $success false;
  212.         if ($report) {
  213.             $report->setPublished(false);
  214.             $report->save();
  215.             $success true;
  216.         }
  217.         return $this->json(["success" => $success]);
  218.     }
  219. }