feat(service): finalize snapshot + sync protection
This commit is contained in:
parent
929bda2018
commit
edceebb2f8
|
|
@ -343,6 +343,20 @@ public function finalize(Service $service): JsonResponse
|
||||||
'finalized_at' => now(),
|
'finalized_at' => now(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
$resolver = app(\App\Services\ServiceImageResolver::class);
|
||||||
|
$keyVisual = $resolver->keyVisualFor($service);
|
||||||
|
$background = $resolver->backgroundFor($service);
|
||||||
|
$updates = [];
|
||||||
|
if ($keyVisual !== null && $service->key_visual_filename === null) {
|
||||||
|
$updates['key_visual_filename'] = $keyVisual;
|
||||||
|
}
|
||||||
|
if ($background !== null && $service->background_filename === null) {
|
||||||
|
$updates['background_filename'] = $background;
|
||||||
|
}
|
||||||
|
if ($updates !== []) {
|
||||||
|
$service->update($updates);
|
||||||
|
}
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'needs_confirmation' => false,
|
'needs_confirmation' => false,
|
||||||
'success' => 'Service wurde abgeschlossen.',
|
'success' => 'Service wurde abgeschlossen.',
|
||||||
|
|
|
||||||
91
tests/Feature/FinalizeSnapshotTest.php
Normal file
91
tests/Feature/FinalizeSnapshotTest.php
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use App\Models\Service;
|
||||||
|
use App\Models\Setting;
|
||||||
|
use App\Models\User;
|
||||||
|
use App\Services\ChurchToolsService;
|
||||||
|
use App\Services\ServiceImageResolver;
|
||||||
|
use Illuminate\Support\Carbon;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
Storage::fake('public');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('finalize nimmt snapshot des globalen hintergrunds wenn service spalte null ist', function () {
|
||||||
|
Storage::disk('public')->put('slides/bg1.jpg', 'fake-content');
|
||||||
|
Setting::set('current_background', 'slides/bg1.jpg');
|
||||||
|
|
||||||
|
$service = Service::factory()->create([
|
||||||
|
'background_filename' => null,
|
||||||
|
'finalized_at' => null,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->actingAs(User::factory()->create())
|
||||||
|
->postJson(route('services.finalize', $service), ['confirmed' => true])
|
||||||
|
->assertOk();
|
||||||
|
|
||||||
|
expect($service->fresh()->background_filename)->toBe('slides/bg1.jpg');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('snapshot gewinnt: neuer globaler hintergrund beeinflusst abgeschlossenen service nicht', function () {
|
||||||
|
Storage::disk('public')->put('slides/bg1.jpg', 'fake-content');
|
||||||
|
Setting::set('current_background', 'slides/bg1.jpg');
|
||||||
|
|
||||||
|
$service = Service::factory()->create([
|
||||||
|
'background_filename' => null,
|
||||||
|
'finalized_at' => null,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->actingAs(User::factory()->create())
|
||||||
|
->postJson(route('services.finalize', $service), ['confirmed' => true])
|
||||||
|
->assertOk();
|
||||||
|
|
||||||
|
Storage::disk('public')->put('slides/bg2.jpg', 'fake-content');
|
||||||
|
Setting::set('current_background', 'slides/bg2.jpg');
|
||||||
|
|
||||||
|
$resolved = app(ServiceImageResolver::class)->backgroundFor($service->fresh());
|
||||||
|
|
||||||
|
expect($resolved)->toBe('slides/bg1.jpg');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('cts sync ueberschreibt key_visual_filename und moderator_name nicht', function () {
|
||||||
|
Carbon::setTestNow('2026-03-01 09:00:00');
|
||||||
|
|
||||||
|
$service = Service::factory()->create([
|
||||||
|
'cts_event_id' => '424242',
|
||||||
|
'key_visual_filename' => 'custom.jpg',
|
||||||
|
'moderator_name' => 'Hans',
|
||||||
|
'preacher_name_override' => 'Pastor X',
|
||||||
|
'background_filename' => 'bg-custom.jpg',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$sync = new ChurchToolsService(
|
||||||
|
eventFetcher: fn () => [
|
||||||
|
new FakeEvent(
|
||||||
|
id: 424242,
|
||||||
|
title: 'Aktualisierter Titel',
|
||||||
|
startDate: '2026-03-08T10:00:00+00:00',
|
||||||
|
eventServices: [
|
||||||
|
new FakeEventService('Predigt', new FakePerson('Neuer', 'Prediger')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
songFetcher: fn () => [],
|
||||||
|
agendaFetcher: fn () => new FakeAgenda([]),
|
||||||
|
eventServiceFetcher: fn (int $eventId) => [
|
||||||
|
new FakeEventService('Predigt', new FakePerson('Neuer', 'Prediger')),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
$sync->sync();
|
||||||
|
|
||||||
|
$fresh = DB::table('services')->where('cts_event_id', '424242')->first();
|
||||||
|
|
||||||
|
expect($fresh->key_visual_filename)->toBe('custom.jpg');
|
||||||
|
expect($fresh->moderator_name)->toBe('Hans');
|
||||||
|
expect($fresh->preacher_name_override)->toBe('Pastor X');
|
||||||
|
expect($fresh->background_filename)->toBe('bg-custom.jpg');
|
||||||
|
expect($fresh->title)->toBe('Aktualisierter Titel');
|
||||||
|
});
|
||||||
Loading…
Reference in a new issue