From 8231b15b56f11cdb99d0e175ed3b5f04a8deedfc Mon Sep 17 00:00:00 2001
From: arsaizdihar <arsadihar@gmail.com>
Date: Tue, 7 Nov 2023 18:51:55 +0700
Subject: [PATCH] feat: connect to SOAP

---
 .env.example                       |  5 +++
 .gitignore                         |  3 +-
 Dockerfile                         |  3 +-
 docker-compose.yml                 | 13 +++-----
 src/Controllers/DormController.php |  2 ++
 src/Soap/SubscriptionService.php   | 49 ++++++++++++++++++++++++++++++
 6 files changed, 64 insertions(+), 11 deletions(-)
 create mode 100644 .env.example
 create mode 100644 src/Soap/SubscriptionService.php

diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..e922c88
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,5 @@
+POSTGRES_USER=postgres
+POSTGRES_PASSWORD=postgres
+POSTGRES_DB=mykos
+POSTGRES_HOST=db
+SOAP_URL=http://host.docker.internal:7000/ws/
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index a293e6d..3b52e16 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
-src/public/media/
\ No newline at end of file
+src/public/media/
+.env
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 8fde4f3..685cd7b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,3 +1,4 @@
 FROM php:8.2-apache
-RUN apt-get update && apt-get install -y libpq-dev && docker-php-ext-install pdo pdo_pgsql
+RUN apt-get update && apt-get install -y libpq-dev -y libxml2-dev
+RUN docker-php-ext-install pdo pdo_pgsql soap
 RUN a2enmod rewrite
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
index e4b068f..1b63473 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,19 +11,14 @@ services:
       - ./src/php.ini:/usr/local/etc/php/php.ini
     networks:
       - php-network
+    env_file:
+      - .env
     depends_on:
       - db
-    environment:
-      - POSTGRES_USER=postgres
-      - POSTGRES_PASSWORD=postgres
-      - POSTGRES_DB=mykos
-      - POSTGRES_HOST=db
   db:
     image: postgres:14.1-alpine
-    environment:
-      - POSTGRES_USER=postgres
-      - POSTGRES_PASSWORD=postgres
-      - POSTGRES_DB=mykos
+    env_file:
+      - .env
     volumes:
       - db:/var/lib/postgresql/data
       - ./src/Models/schema.sql:/docker-entrypoint-initdb.d/schema.sql
diff --git a/src/Controllers/DormController.php b/src/Controllers/DormController.php
index 83cb827..654eac7 100644
--- a/src/Controllers/DormController.php
+++ b/src/Controllers/DormController.php
@@ -12,6 +12,7 @@ use app\Models\Dorm;
 use app\Models\Media;
 use app\Models\Owners;
 use app\Models\Reviews;
+use app\Soap\SubscriptionService;
 use app\Utils\FileManager;
 use app\Utils\Toast;
 
@@ -110,6 +111,7 @@ class DormController extends Controller
         unset($form->data["dorm_name"]);
         $dorm = Dorm::toModel($form->data);
         $dorm->save();
+        SubscriptionService::getInstance()->notifyNewDorm($dorm);
         Response::redirect("/dorms/{$dorm->dorm_id}/media");
         return;
       }
diff --git a/src/Soap/SubscriptionService.php b/src/Soap/SubscriptionService.php
new file mode 100644
index 0000000..a7196c9
--- /dev/null
+++ b/src/Soap/SubscriptionService.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace app\Soap;
+
+use app\Models\Dorm;
+use SoapClient;
+
+class SubscriptionService
+{
+  private $client;
+  private static SubscriptionService $instance;
+
+  public function __construct()
+  {
+    $opts = array(
+      'http' => array(
+        'user_agent' => 'PHPSoapClient'
+      ),
+    );
+    $context = stream_context_create($opts);
+    $url = getenv("SOAP_URL");
+    if ($url === false) {
+      $url = "http://host.docker.internal:7000/ws/";
+    }
+    $this->client = new SoapClient($url . "Subscription?wsdl", array([
+      'stream_context' => $context,
+    ]));
+  }
+
+  public function notifyNewDorm(Dorm $dorm)
+  {
+    $this->client->notifyNewDorm(["dorm" => array(
+      "dorm_id" => $dorm->dorm_id,
+      "name" => $dorm->name,
+      "description" => $dorm->description,
+      "address" => $dorm->address,
+      "city" => $dorm->city,
+      "price" => $dorm->price,
+    )]);
+  }
+
+  public static function getInstance()
+  {
+    if (!isset(self::$instance)) {
+      self::$instance = new SubscriptionService();
+    }
+    return self::$instance;
+  }
+}
-- 
GitLab