From dd7f99db3a52287bcc0f2163a1d6c0c852fcb115 Mon Sep 17 00:00:00 2001 From: James Brooks Date: Mon, 24 Nov 2014 09:15:05 +0000 Subject: [PATCH] Flesh out the WebHook stuff, add fire and ping methods --- app/models/WebHook.php | 103 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/app/models/WebHook.php b/app/models/WebHook.php index a440571ec..b37e2002d 100644 --- a/app/models/WebHook.php +++ b/app/models/WebHook.php @@ -1,7 +1,110 @@ hasMany('WebHookContent', 'hook_id', 'id'); } + + /** + * Returns all active hooks. + * @param Illuminate\Database\Eloquent\Builder $query + * @return Illuminate\Database\Eloquent\Builder + */ + public function scopeActive($query) { + return $query->where('active', 1); + } + + /** + * Setups a Ping event that is fired upon a web hook. + * @return array result of the ping + */ + public function ping() { + return $this->fire('ping', 'Coming live to you from Cachet.'); + } + + /** + * Fires the actual web hook event. + * @param string $eventType the event to send X-Cachet-Event + * @param mixed $data Data to send to the Web Hook + * @return object + */ + public function fire($eventType, $data = null) { + $startTime = microtime(true); + + $request = $this->client->createRequest($this->requestMethod, $this->endpoint, [ + 'headers' => [ + 'X-Cachet-Event' => $eventType, + ], + 'body' => $data + ]); + + try { + $response = $this->client->send($request); + } catch (\GuzzleHttp\Exception\ClientException $e) { + // Do nothing with the exception, we want it. + $response = $e->getResponse(); + } + + $timeTaken = microtime(TRUE) - $startTime; + + // Store the request + $hookResponse = new WebHookResponse; + $hookResponse->web_hook_id = $this->id; + $hookResponse->response_code = $response->getStatusCode(); + $hookResponse->sent_headers = json_encode($request->getHeaders()); + $hookResponse->sent_body = json_encode($data); + $hookResponse->recv_headers = json_encode($response->getHeaders()); + $hookResponse->recv_body = json_encode($response->getBody()); + $hookResponse->time_taken = $timeTaken; + $hookResponse->save(); + + return $hookResponse; + } + + /** + * Returns a human readable request type name. + * @return string HEAD, GET, POST, DELETE, PATCH, PUT etc + */ + public function getRequestMethodAttribute() { + $requestMethod = NULL; + + switch ($this->request_type) { + case self::HEAD: + $requestMethod = 'HEAD'; + break; + case self::GET: + $requestMethod = 'GET'; + break; + case self::POST: + $requestMethod = 'POST'; + break; + case self::PATCH: + $requestMethod = 'PATCH'; + break; + case self::PUT: + $requestMethod = 'PUT'; + break; + case self::DELETE: + $requestMethod = 'DELETE'; + break; + + default: + throw new Exception('Unknown request type value: ' . $this->request_type); + break; + } + + return $requestMethod; + } }