diff --git a/app/Http/Controllers/Gate/NotificationGateController.php b/app/Http/Controllers/Gate/NotificationGateController.php new file mode 100644 --- /dev/null +++ b/app/Http/Controllers/Gate/NotificationGateController.php @@ -0,0 +1,139 @@ +door = $door; + + try { + $this->extractPayload(); + $this->normalizePayload(); + } catch (InvalidArgumentException $ex) { + abort(400, 'Bad request.'); + } + + // Process the request + + $this->logRequest(); + $this->onPayload(); + + // Output + + return parent::renderReport(); + } + + /** + * Extracts payload from the request + */ + protected function extractPayload () { + $request = Request::instance(); + $this->rawRequestContent = $request->getContent(); + $this->payload = $this->getNotification(); + } + + protected function getServiceName () : string { + return (string)$this->payload->service; + } + + /// + /// Helper methods to get notification + /// + + private function getNotification () : Notification { + $payload = json_decode($this->rawRequestContent); + if ($payload === null) { + throw new InvalidArgumentException("Invalid JSON"); + } + + $mapper = new \JsonMapper(); + return $mapper->map( + $payload, + new Notification + ); + } + + private function normalizePayload () : void { + $this->normalizeProject(); + $this->ensureRequiredPayloadFieldsArePresent(); + } + + private function normalizeProject () : void { + if (!$this->isPayloadFieldPresent('project')) { + $this->payload->project = $this->door; + } + } + + private function ensureRequiredPayloadFieldsArePresent () : void { + foreach ($this->getMandatoryPayloadFields() as $field) { + if (!$this->isPayloadFieldPresent($field)) { + throw new InvalidArgumentException("Field $field is missing."); + } + } + } + + private function getMandatoryPayloadFields () : array { + return [ + 'service', + 'project', + 'group', + 'type', + ]; + } + + private function isPayloadFieldPresent (string $field) : bool { + return (string)$this->payload->$field !== ""; + } + + /// + /// Payload processing + /// + + protected function onPayload () { + $this->initializeReport(); + + Event::fire(new NotificationEvent($this->payload)); + } + +} diff --git a/config/gate.php b/config/gate.php --- a/config/gate.php +++ b/config/gate.php @@ -13,6 +13,10 @@ */ 'controllers' => [ + // Native notifications + 'Notification', + + // External services 'DockerHub', 'GitHub', 'Jenkins', diff --git a/tests/data/config.json b/tests/data/config.json --- a/tests/data/config.json +++ b/tests/data/config.json @@ -1,5 +1,6 @@ { "gates": [ + "Notification", "DockerHub", "GitHub", "Jenkins",