Изменение частоты оповещений на основе ответа http

Мой код отлично работает при отправке http запрос и в случае, если веб-сайт не работает или код ответа не 200, он посылает слабое уведомление. То, что я пытаюсь выяснить сейчас, в таблице уведомлений у меня есть check_frequency а также alert_frequence, Если веб-сайт не работает, вместо того, чтобы использовать частоту проверки для расчета времени прохождения, он должен использовать alert_frequence,

namespace App\Http\Controllers;use GuzzleHttp\Client;
use App\Utilities\Reporter;
use GuzzleHttp\Exception\ClientException;
use App\Notification;
use App\Status;
use App\Setting;

class GuzzleController extends Controller
{
private $default_check_frequency;

protected $client;
protected $reporter;public function __construct()
{
$this->client = new Client;

$this->reporter = new Reporter;

$this->default_check_frequency = Setting::defaultCheckFrequency();
}

public function status()
{
$notifications = Notification::where('active', 1)->get();

$status = Status::where('name', 'health')->first();

foreach ($notifications as $notification) {
$this->updateStatus($notification, $status);}
}

private function updateStatus(Notification $notification, Status $status)
{
$status_health = $notification->status('health');$frequency = $this->getFrequency($notification);

$elapsed_time = \Carbon\Carbon::parse($status_health['timestamp'])->diffInMinutes();

if($elapsed_time >= $frequency) {

$response = $this->client->get($notification->website_url, [
'http_errors' => false
]);$resCode = $response->getStatusCode();

$notification->statuses()->attach($status, [
'values' => $resCode === 200 ? 'up' : 'down'
]);

if($resCode != 200){
/* how to send slack to different slach channels, now it is sending only to one channel!*/

$this->reporter->slack($notification->website_url.':'.'  is down'. ' please check your email for the status code!'.' @- '.$notification->email,
$notification->slack_channel);
$this->reporter->mail($notification->email,$resCode );

}
}

}

private function getFrequency(Notification $notification)
{
return isset($notification->check_frequency)
? intval($notification->check_frequency)
: $this->default_check_frequency;
}
}

1

Решение

Я не уверен, что это то, что вам нужно, но вот что вы можете сделать, чтобы выбрать другой столбец из вашей таблицы, в зависимости от статуса:

<?php

class GuzzleController extends Controller
{
private $default_check_frequency;

protected $client;
protected $reporter;

public function __construct()
{
$this->client = new Client;

$this->reporter = new Reporter;

$this->default_check_frequency = Setting::defaultCheckFrequency();
}

public function status()
{
$notifications = Notification::where('active', 1)->get();

$status = Status::where('name', 'health')->first();

foreach ($notifications as $notification) {
$this->updateStatus($notification, $status);
}
}

private function updateStatus(Notification $notification, Status $status)
{
$status_health = $notification->status('health');

/// move it here
$response = $this->client->get($notification->website_url, [
'http_errors' => false
]);
$resCode = $response->getStatusCode();
/// --- end

$frequency = $this->getFrequency($notification, $resCode);

$elapsed_time = \Carbon\Carbon::parse($status_health['timestamp'])->diffInMinutes();

if($elapsed_time >= $frequency) {
$notification->statuses()->attach($status, [
'values' => $resCode === 200 ? 'up' : 'down'
]);

if($resCode != 200){
/* how to send slack to different slach channels, now it is sending only to one channel!*/
$this->reporter->slack($notification->website_url.':'.'  is down'. ' please check your email for the status code!'.' @- '.$notification->email,
$notification->slack_channel);
$this->reporter->mail($notification->email,$resCode );
}
}
}

private function getFrequency(Notification $notification, $resCode)
{
/// -- select your column here
$column = $resCode == '200' ? 'check_frequency' : 'alert_frequence';

return isset($notification->{$column})
? intval($notification->{$column})
: $this->default_check_frequency;
}
}

И я взял на себя смелость рефакторинг, разделив проблемы метода:

<?php

use Carbon\Carbon;

class GuzzleController extends Controller
{
private $default_check_frequency;

protected $client;

protected $reporter;

public function __construct()
{
$this->client = new Client;

$this->reporter = new Reporter;

$this->default_check_frequency = Setting::defaultCheckFrequency();
}

private function addStatusToNotification(Notification $notification, Status $status, $resCode)
{
$notification->statuses()->attach($status, [
'values' => $resCode === 200
? 'up'
: 'down'
]);
}

private function report(Notification $notification, $resCode)
{
/* how to send slack to different slach channels, now it is sending only to one channel!*/
$this->reporter->slack($notification->website_url . ':' . '  is down' . ' please check your email for the status code!' . ' @- ' . $notification->email,
$notification->slack_channel);

$this->reporter->mail($notification->email, $resCode);
}

private function sendNotification(Notification $notification, Status $status, $status_health, $frequency, $resCode)
{
$elapsed_time = Carbon::parse($status_health['timestamp'])->diffInMinutes();

if ($elapsed_time >= $frequency) {
$this->addStatusToNotification($notification, $status, $resCode);

if ($resCode != 200) {
$this->report($notification, $resCode);
}
}
}

public function status()
{
$notifications = Notification::where('active', 1)->get();

$status = Status::where('name', 'health')->first();

foreach ($notifications as $notification) {
$this->updateStatus($notification, $status);
}
}

private function updateStatus(Notification $notification, Status $status)
{
$resCode = $this->getStatusCode($notification->website_url);

$this->sendNotification(
$notification,
$status,
$notification->status('health'),
$this->getFrequency($notification, $resCode),
$resCode
);
}

private function getFrequency(Notification $notification, $resCode)
{
$column = $resCode == '200' ? 'check_frequency' : 'alert_frequence';

return isset($notification->{$column})
? intval($notification->{$column})
: $this->default_check_frequency;
}

private function getStatusCode($url)
{
$response = $this->client->get($url, [
'http_errors' => false
]);

return $response->getStatusCode();
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]