diff --git a/.gitignore b/.gitignore index 1ca23a3d..92933782 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /vendor /app/config/config.local.neon /.vagrant +/node_modules !.gitignore !.htaccess diff --git a/Gulpfile.js b/Gulpfile.js new file mode 100644 index 00000000..a15af1b9 --- /dev/null +++ b/Gulpfile.js @@ -0,0 +1,44 @@ +'use strict'; + +var gulp = require('gulp'); +var gutil = require('gulp-util'); +var plugins = require('gulp-load-plugins')(); +var bower = require('gulp-bower'); +var concat = require('gulp-concat'); +var uglify = require('gulp-uglify'); +var sourcemaps = require('gulp-sourcemaps'); + +var config = { + assetsPath : 'assets', + cssPath : 'www/css', + jsPath : 'www/js', + bowerPath : 'temp/bower' +}; + +var jsFiles = [ + config.bowerPath + '/stomp-websocket/lib/stomp.js', + config.assetsPath + '/js/main.js', + config.assetsPath + '/js/nette.ajax.js', + config.assetsPath + '/js/stomp.js', + config.assetsPath + '/js/websocket.js' +]; + +gulp.task('bower', function () { + return bower('temp/bower'); +}); + +gulp.task('js', ['bower'], function () { + gulp + .src(jsFiles) + .pipe(gulp.dest(config.jsPath)); +}); + + +// Úlohy + +gulp.task('watch', function () { +}); + + +gulp.task('build', ['js']); +gulp.task('default', ['build']); diff --git a/app/Check/Consumers/Check.php b/app/Check/Consumers/Check.php index a13fe75a..6497389b 100644 --- a/app/Check/Consumers/Check.php +++ b/app/Check/Consumers/Check.php @@ -1,4 +1,4 @@ -checksRepository = $checksRepository; $this->dateTimeProvider = $dateTimeProvider; $this->orm = $orm; + $this->onCheckChangeDispatcher = $onCheckChangeDispatcher; } public function process(\PhpAmqpLib\Message\AMQPMessage $message): int { - $checkId = $message->getBody(); + $checkId = (int) $message->getBody(); $this->orm->clearIdentityMapAndCaches(\Nextras\Orm\Model\IModel::I_KNOW_WHAT_I_AM_DOING); @@ -48,12 +55,18 @@ public function process(\PhpAmqpLib\Message\AMQPMessage $message): int $maxAttempts = $this->getMaxAttempts(); $attempts = 0; + $oldStatus = $check->status; + do { $check->lastCheck = $this->dateTimeProvider->getDateTime(); $result = $this->doHardJob($check); } while ( ! $result && ++$attempts < $maxAttempts && sleep(3) === 0); + if ($oldStatus !== $check->status) { + $this->onCheckChangeDispatcher->change($check); + } + $this->checksRepository->persistAndFlush($check); return self::MSG_ACK; diff --git a/app/Check/IOnCheckChange.php b/app/Check/IOnCheckChange.php new file mode 100644 index 00000000..a0493cfc --- /dev/null +++ b/app/Check/IOnCheckChange.php @@ -0,0 +1,10 @@ +producer = $producer; + } + + + public function onCheckChange(\Pd\Monitoring\Check\Check $check): void + { + $this->onProjectChange($check->project); + } + + + public function onProjectChange(\Pd\Monitoring\Project\Project $project): void + { + $this->producer->publish('', $project->id); + } +} diff --git a/app/Check/Listeners/NotifyWebSocketListener.php b/app/Check/Listeners/NotifyWebSocketListener.php new file mode 100644 index 00000000..e7c8dcab --- /dev/null +++ b/app/Check/Listeners/NotifyWebSocketListener.php @@ -0,0 +1,26 @@ +producer = $producer; + } + + + public function onCheckChange(\Pd\Monitoring\Check\Check $check): void + { + $this->producer->publish('', $check->id); + } +} diff --git a/app/Check/OnCheckChangeDispatcher.php b/app/Check/OnCheckChangeDispatcher.php new file mode 100644 index 00000000..a1bc3a0b --- /dev/null +++ b/app/Check/OnCheckChangeDispatcher.php @@ -0,0 +1,26 @@ +listeners as $listener) { + $listener->onChange($check); + } + } + + + public function addListener(IOnCheckChange $onCheckChange): void + { + $this->listeners[] = $onCheckChange; + } +} diff --git a/app/DI/Extension.php b/app/DI/Extension.php index c0aac1c1..eeb73b6e 100644 --- a/app/DI/Extension.php +++ b/app/DI/Extension.php @@ -1,9 +1,9 @@ -getContainerBuilder(); + + /** @var Pd\Monitoring\Check\Listeners\NotifyWebSocketListener $notifyWebSocketListener */ + $notifyWebSocketListener = $container->getByType(Pd\Monitoring\Check\Listeners\NotifyWebSocketListener::class); + + /** @var \Nextras\Orm\Repository\Repository $projectsRepository */ + $projectsRepository = $container->getByType(Pd\Monitoring\Check\ChecksRepository::class); + + $projectsRepository->onFlush[] = function ($persisted, $removed) use ($notifyWebSocketListener) { + foreach ($persisted as $entity) { + $notifyWebSocketListener->onCheckChange($entity); + } + }; + } + } diff --git a/app/DashBoard/Controls/Check/Control.latte b/app/DashBoard/Controls/Check/Control.latte index 7ee0fe7b..11a5698f 100644 --- a/app/DashBoard/Controls/Check/Control.latte +++ b/app/DashBoard/Controls/Check/Control.latte @@ -1,5 +1,10 @@ {snippet} -