Skip to content

Commit

Permalink
Merge pull request #187 from biigle/laravel-11-larastan
Browse files Browse the repository at this point in the history
Add listener for volume.cloned event
  • Loading branch information
mzur authored Sep 2, 2024
2 parents c396904 + cb5429a commit 39e0ead
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/LargoServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Biigle\Modules\Largo\Listeners\AttachLabelListener;
use Biigle\Modules\Largo\Listeners\ImagesCleanupListener;
use Biigle\Modules\Largo\Listeners\VideosCleanupListener;
use Biigle\Modules\Largo\Listeners\VolumeClonedListener;
use Biigle\Modules\Largo\Observers\ImageAnnotationObserver;
use Biigle\Modules\Largo\Observers\VideoAnnotationObserver;
use Biigle\Services\Modules;
Expand Down Expand Up @@ -52,6 +53,7 @@ public function boot(Modules $modules, Router $router)
Event::listen(ImagesDeleted::class, ImagesCleanupListener::class);
Event::listen(VideosDeleted::class, VideosCleanupListener::class);
Event::listen(AnnotationLabelAttached::class, AttachLabelListener::class);
Event::listen('volume.cloned', VolumeClonedListener::class);

$modules->register('largo', [
'viewMixins' => [
Expand Down
33 changes: 33 additions & 0 deletions src/Listeners/VolumeClonedListener.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

namespace Biigle\Modules\Largo\Listeners;

use Biigle\Modules\Largo\Jobs\ProcessAnnotatedImage;
use Biigle\Modules\Largo\Jobs\ProcessAnnotatedVideo;
use Biigle\Volume;

class VolumeClonedListener
{
public function handle(Volume $volume): void
{
// Give the ProcessNewVolumeFiles job (from CloneImagesorVideos) a head start so
// the file thumbnails are generated (mostly) before the annotation thumbnails.
$delay = now()->addSeconds(30);

$volume->images()
->whereHas('annotations')
->eachById(function ($image) use ($delay) {
ProcessAnnotatedImage::dispatch($image)
->delay($delay)
->onQueue(config('largo.generate_annotation_patch_queue'));
});

$volume->videos()
->whereHas('annotations')
->eachById(function ($video) use ($delay) {
ProcessAnnotatedVideo::dispatch($video)
->delay($delay)
->onQueue(config('largo.generate_annotation_patch_queue'));
});
}
}
66 changes: 66 additions & 0 deletions tests/Listeners/VolumeClonedListenerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?php

namespace Biigle\Tests\Modules\Largo\Listeners;

use Biigle\Image;
use Biigle\ImageAnnotation;
use Biigle\ImageAnnotationLabel;
use Biigle\MediaType;
use Biigle\Modules\Largo\Jobs\ProcessAnnotatedImage;
use Biigle\Modules\Largo\Jobs\ProcessAnnotatedVideo;
use Biigle\Project;
use Biigle\Video;
use Biigle\VideoAnnotation;
use Biigle\VideoAnnotationLabel;
use Biigle\Volume;
use Queue;
use TestCase;

class VolumeClonedListenerTest extends TestCase
{
public function testHandleImageAnnotationPatches()
{
// The target project.
$project = Project::factory()->create();

$volume = Volume::factory()->create([
'media_type_id' => MediaType::imageId(),
'created_at' => '2022-11-09 14:37:00',
'updated_at' => '2022-11-09 14:37:00',
])->fresh();// Use fresh() to load even the null fields.
$copy = $volume->replicate();
$copy->save();

$oldImage = Image::factory()->create(['volume_id' => $volume->id])->fresh();
$oldAnnotation = ImageAnnotation::factory()->create(['image_id' => $oldImage->id]);
ImageAnnotationLabel::factory()->create(['annotation_id' => $oldAnnotation->id]);

Queue::fake();
event('volume.cloned', $volume);

Queue::assertPushed(ProcessAnnotatedImage::class);
}

public function testHandleVideoAnnotationPatches()
{
// The target project.
$project = Project::factory()->create();

$volume = Volume::factory()->create([
'media_type_id' => MediaType::videoId(),
'created_at' => '2022-11-09 14:37:00',
'updated_at' => '2022-11-09 14:37:00',
])->fresh();// Use fresh() to load even the null fields.
$copy = $volume->replicate();
$copy->save();

$oldVideo = Video::factory()->create(['volume_id' => $volume->id])->fresh();
$oldAnnotation = VideoAnnotation::factory()->create(['video_id' => $oldVideo->id]);
VideoAnnotationLabel::factory()->create(['annotation_id' => $oldAnnotation->id]);

Queue::fake();
event('volume.cloned', $volume);

Queue::assertPushed(ProcessAnnotatedVideo::class);
}
}

0 comments on commit 39e0ead

Please sign in to comment.