Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
302c2ab
feat(album-statistics): add album_size_statistics table and model
ildyria Jan 2, 2026
4428d8b
feat(album-statistics): implement RecomputeAlbumSizeJob with propagation
ildyria Jan 2, 2026
298d610
feat(album-statistics): add event listeners for automatic recomputation
ildyria Jan 2, 2026
2bdd58d
test(album-size-statistics): add unit tests for AlbumSizeStatistics m…
ildyria Jan 3, 2026
202ea54
feat(factories): add helper methods to SizeVariantFactory
ildyria Jan 3, 2026
3baa5e7
refactor(statistics): use pre-computed album_size_statistics table
ildyria Jan 3, 2026
014731b
test(album-statistics): add comprehensive tests for RecomputeAlbumSiz…
ildyria Jan 3, 2026
a824c18
docs(tasks): mark T-004-14 complete
ildyria Jan 3, 2026
fd93bdb
docs(tasks): mark T-004-22, T-004-23, T-004-25, T-004-28 complete
ildyria Jan 3, 2026
3e89905
test(album-statistics): add propagation feature tests
ildyria Jan 3, 2026
1ec30b2
test(album-statistics): add event listener integration tests
ildyria Jan 3, 2026
18f728c
docs(tasks): mark T-004-16, T-004-17, T-004-21 complete
ildyria Jan 3, 2026
7419f7c
feat(commands): add album size statistics management commands
ildyria Jan 3, 2026
d865620
docs(tasks): mark command implementation tasks complete
ildyria Jan 3, 2026
62462e1
add album size statistics
ildyria Jan 3, 2026
04d0a3e
fix tests
ildyria Jan 3, 2026
61da698
Merge branch 'master' into album-size-statistics
ildyria Jan 3, 2026
7f1b30b
some fixes
ildyria Jan 3, 2026
49a20f9
fix phpstna
ildyria Jan 3, 2026
4d29708
improve Space speed
ildyria Jan 3, 2026
5705fca
dispatch after import
ildyria Jan 3, 2026
074e012
fix
ildyria Jan 3, 2026
4b34078
fix
ildyria Jan 3, 2026
92e16c3
fix
ildyria Jan 3, 2026
c94d0ac
improve
ildyria Jan 3, 2026
20baca6
Merge branch 'master' into album-size-statistics
ildyria Jan 3, 2026
1225c1a
stuff
ildyria Jan 3, 2026
2be87e0
fix error
ildyria Jan 3, 2026
9f62189
fix jobs count
ildyria Jan 3, 2026
b191935
fix comments
ildyria Jan 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions app/Actions/Import/Pipes/ExecuteBatch.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use App\Contracts\Import\ImportPipe;
use App\DTO\ImportDTO;
use App\DTO\ImportEventReport;
use App\Jobs\ImportImageJob;

class ExecuteBatch implements ImportPipe
{
Expand All @@ -37,11 +38,13 @@ public function handle(ImportDTO $state, \Closure $next): ImportDTO
foreach ($state->job_bus as $idx => $job) {
try {
$progress = (int) (($idx + 1) * 100 / $total);
$this->report(ImportEventReport::createDebug('imported', $job->file_path, 'Processing... ' . $progress . '%'));
$path = ($job instanceof ImportImageJob) ? $job->file_path : get_class($job);
$this->report(ImportEventReport::createDebug('imported', $path, 'Processing... ' . $progress . '%'));
dispatch($job);
// @codeCoverageIgnoreStart
} catch (\Throwable $e) {
$this->report(ImportEventReport::createFromException($e, $job->file_path));
$path = ($job instanceof ImportImageJob) ? $job->file_path : get_class($job);
$this->report(ImportEventReport::createFromException($e, $path));
}
// @codeCoverageIgnoreEnd
}
Expand Down
8 changes: 8 additions & 0 deletions app/Actions/Import/Pipes/ImportPhotos.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
use App\DTO\ImportEventReport;
use App\Image\Files\NativeLocalFile;
use App\Jobs\ImportImageJob;
use App\Jobs\RecomputeAlbumSizeJob;
use App\Jobs\RecomputeAlbumStatsJob;
use App\Models\Album;
use App\Models\Photo;
use App\Repositories\ConfigManager;
Expand Down Expand Up @@ -80,6 +82,12 @@ private function importImagesForNode(FolderNode $node): void
foreach ($image_paths as $idx => $image_path) {
$this->importSingleImage($image_path, $node->album, $idx / $total * 100);
}

// Dispatch recompute jobs for the album after importing photos
if ($node->album !== null) {
$this->state->job_bus[] = new RecomputeAlbumSizeJob($node->album?->id);
$this->state->job_bus[] = new RecomputeAlbumStatsJob($node->album?->id);
}
}

/**
Expand Down
10 changes: 5 additions & 5 deletions app/Actions/Photo/MoveOrDuplicate.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
use App\Actions\User\Notify;
use App\Constants\PhotoAlbum as PA;
use App\Contracts\Models\AbstractAlbum;
use App\Events\AlbumSaved;
use App\Events\PhotoDeleted;
use App\Events\PhotoSaved;
use App\Models\Album;
use App\Models\Photo;
use App\Models\Purchasable;
Expand Down Expand Up @@ -50,6 +50,9 @@ public function do(Collection $photos, ?AbstractAlbum $from_album, ?Album $to_al
->whereIn(PA::PHOTO_ID, $photos_ids)
->where(PA::ALBUM_ID, '=', $from_album->get_id())
->delete();

// Dispatch event for origin album (photos moved out)
AlbumSaved::dispatchIf($from_album instanceof Album, $from_album);
}

// Dispatch event for source album (photos removed)
Expand All @@ -67,10 +70,7 @@ public function do(Collection $photos, ?AbstractAlbum $from_album, ?Album $to_al
DB::table(PA::PHOTO_ALBUM)->insert(array_map(fn (string $id) => ['photo_id' => $id, 'album_id' => $to_album->id], $photos_ids));

// Dispatch event for destination album (photos added)
// Note: We dispatch PhotoSaved for each photo to trigger recomputation
foreach ($photos as $photo) {
PhotoSaved::dispatch($photo);
}
AlbumSaved::dispatchIf($to_album instanceof Album, $to_album);
}

// In case of move, we need to remove the header_id of said photos.
Expand Down
2 changes: 1 addition & 1 deletion app/Actions/Photo/Pipes/Shared/Save.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public function handle(PhotoDTO $state, \Closure $next): PhotoDTO
$state->getPhoto()->tags()->sync($state->getTags()->pluck('id')->all());

// Dispatch event for album stats recomputation
PhotoSaved::dispatch($state->getPhoto());
PhotoSaved::dispatch($state->getPhoto()->id);

return $next($state);
}
Expand Down
Loading
Loading