From 2e89002641c2d7c10bb94e4b436c07e7124b7b10 Mon Sep 17 00:00:00 2001 From: philipp lang Date: Wed, 11 Jun 2025 22:33:03 +0200 Subject: [PATCH] Move Membership to data --- app/Member/Actions/MemberShowAction.php | 15 +++-- app/Member/Data/ActivityData.php | 19 ++++++ app/Member/Data/GroupData.php | 19 ++++++ app/Member/Data/MembershipData.php | 80 +++++++++++++++++++++++++ app/Member/Data/SubactivityData.php | 19 ++++++ app/Member/MemberResource.php | 4 +- app/Membership/Actions/IndexAction.php | 14 ++--- app/Membership/MembershipResource.php | 64 -------------------- tests/Feature/Member/ShowTest.php | 11 +++- tests/Feature/Membership/IndexTest.php | 10 ++-- 10 files changed, 169 insertions(+), 86 deletions(-) create mode 100644 app/Member/Data/ActivityData.php create mode 100644 app/Member/Data/GroupData.php create mode 100644 app/Member/Data/MembershipData.php create mode 100644 app/Member/Data/SubactivityData.php delete mode 100644 app/Membership/MembershipResource.php diff --git a/app/Member/Actions/MemberShowAction.php b/app/Member/Actions/MemberShowAction.php index 55515e60..f3b4b0ad 100644 --- a/app/Member/Actions/MemberShowAction.php +++ b/app/Member/Actions/MemberShowAction.php @@ -20,12 +20,15 @@ class MemberShowAction return [ 'data' => new MemberResource( $member - ->load('memberships') - ->load('invoicePositions.invoice') - ->load('nationality') - ->load('region') - ->load('subscription') - ->load('courses.course') + ->load([ + 'memberships.activity', + 'memberships.subactivity', + 'invoicePositions.invoice', + 'nationality', + 'region', + 'subscription', + 'courses.course' + ]) ), 'meta' => MemberResource::meta(), ]; diff --git a/app/Member/Data/ActivityData.php b/app/Member/Data/ActivityData.php new file mode 100644 index 00000000..2e346d2c --- /dev/null +++ b/app/Member/Data/ActivityData.php @@ -0,0 +1,19 @@ +withoutMagicalCreation()->from([ + 'id' => $membership->id, + 'activity' => $membership->activity, + 'subactivity' => $membership->subactivity, + 'is_active' => $membership->isActive(), + 'from' => $membership->from, + 'group' => $membership->group, + 'promised_at' => $membership->promised_at, + ]); + } + + /** + * @return array + */ + public function with(): array + { + return [ + 'human_date' => $this->from->format('d.m.Y'), + 'promised_at_human' => $this->promisedAt?->format('d.m.Y'), + 'promised_at' => $this->promisedAt?->format('Y-m-d'), + 'links' => [ + 'update' => route('membership.update', ['membership' => $this->id]), + 'destroy' => route('membership.destroy', ['membership' => $this->id]), + ] + ]; + } + + /** + * @return array + */ + public static function memberMeta(Member $member): array + { + $activities = Activity::with('subactivities')->get(); + + return [ + 'links' => [ + 'store' => route('member.membership.store', ['member' => $member]), + ], + 'groups' => NestedGroup::cacheForSelect(), + 'activities' => $activities->map(fn($activity) => ['id' => $activity->id, 'name' => $activity->name]), + 'subactivities' => $activities->mapWithKeys(fn($activity) => [$activity->id => $activity->subactivities->map(fn($subactivity) => ['id' => $subactivity->id, 'name' => $subactivity->name, 'is_age_group' => $subactivity->is_age_group])]), + 'default' => [ + 'group_id' => $member->group_id, + 'activity_id' => null, + 'subactivity_id' => null, + 'promised_at' => null, + ], + ]; + } +} diff --git a/app/Member/Data/SubactivityData.php b/app/Member/Data/SubactivityData.php new file mode 100644 index 00000000..e8dea078 --- /dev/null +++ b/app/Member/Data/SubactivityData.php @@ -0,0 +1,19 @@ + $this->pending_payment ? number_format($this->pending_payment / 100, 2, ',', '.') . ' €' : null, 'age_group_icon' => $this->ageGroupMemberships->first()?->subactivity->slug, 'courses' => CourseMemberResource::collection($this->whenLoaded('courses')), - 'memberships' => MembershipResource::collection($this->whenLoaded('memberships')), + 'memberships' => $this->relationLoaded('memberships') ? MembershipData::collect($this->memberships) : null, 'invoicePositions' => InvoicePositionResource::collection($this->whenLoaded('invoicePositions')), 'nationality' => new NationalityResource($this->whenLoaded('nationality')), 'region' => new RegionResource($this->whenLoaded('region')), diff --git a/app/Membership/Actions/IndexAction.php b/app/Membership/Actions/IndexAction.php index 86919cf0..c09b03b5 100644 --- a/app/Membership/Actions/IndexAction.php +++ b/app/Membership/Actions/IndexAction.php @@ -4,10 +4,10 @@ namespace App\Membership\Actions; use App\Member\Member; use App\Member\Membership; -use App\Membership\MembershipResource; use Illuminate\Database\Eloquent\Collection; -use Illuminate\Http\Resources\Json\AnonymousResourceCollection; use Lorisleiva\Actions\Concerns\AsAction; +use App\Member\Data\MembershipData; +use Illuminate\Http\JsonResponse; class IndexAction { @@ -21,11 +21,11 @@ class IndexAction return $member->memberships; } - public function asController(Member $member): AnonymousResourceCollection + public function asController(Member $member): JsonResponse { - return MembershipResource::collection($this->handle($member)) - ->additional([ - 'meta' => MembershipResource::memberMeta($member) - ]); + return response()->json([ + 'data' => MembershipData::collect($this->handle($member)), + 'meta' => MembershipData::memberMeta($member), + ]); } } diff --git a/app/Membership/MembershipResource.php b/app/Membership/MembershipResource.php deleted file mode 100644 index f24e68e7..00000000 --- a/app/Membership/MembershipResource.php +++ /dev/null @@ -1,64 +0,0 @@ - $this->id, - 'group_id' => $this->group_id, - 'activity_id' => $this->activity_id, - 'activity_name' => $this->activity->name, - 'subactivity_id' => $this->subactivity_id, - 'subactivity_name' => $this->subactivity?->name, - 'human_date' => $this->from->format('d.m.Y'), - 'promised_at' => $this->promised_at?->format('Y-m-d'), - 'is_active' => $this->isActive(), - 'links' => [ - 'update' => route('membership.update', ['membership' => $this->getModel()]), - 'destroy' => route('membership.destroy', ['membership' => $this->getModel()]), - ] - ]; - } - - /** - * @return array - */ - public static function memberMeta(Member $member): array - { - $activities = Activity::with('subactivities')->get(); - - return [ - 'links' => [ - 'store' => route('member.membership.store', ['member' => $member]), - ], - 'groups' => NestedGroup::cacheForSelect(), - 'activities' => $activities->map(fn ($activity) => ['id' => $activity->id, 'name' => $activity->name]), - 'subactivities' => $activities->mapWithKeys(fn ($activity) => [$activity->id => $activity->subactivities->map(fn ($subactivity) => ['id' => $subactivity->id, 'name' => $subactivity->name, 'is_age_group' => $subactivity->is_age_group])]), - 'default' => [ - 'group_id' => $member->group_id, - 'activity_id' => null, - 'subactivity_id' => null, - 'promised_at' => null, - ], - ]; - } -} diff --git a/tests/Feature/Member/ShowTest.php b/tests/Feature/Member/ShowTest.php index 156a1fc8..f5fdeaaa 100644 --- a/tests/Feature/Member/ShowTest.php +++ b/tests/Feature/Member/ShowTest.php @@ -118,12 +118,19 @@ class ShowTest extends TestCase ], ], $response, 'data'); $this->assertInertiaHas([ - 'activity_name' => '€ LeiterIn', - 'subactivity_name' => 'Jungpfadfinder', 'id' => $member->memberships->first()->id, 'human_date' => '19.11.2022', 'promised_at' => now()->format('Y-m-d'), + 'activity' => [ + 'name' => '€ LeiterIn', + 'id' => $member->memberships->first()->activity->id, + ], + 'subactivity' => [ + 'name' => 'Jungpfadfinder', + 'id' => $member->memberships->first()->subactivity->id, + ] ], $response, 'data.memberships.0'); + $this->assertInertiaHas([ 'organizer' => 'DPSG', 'event_name' => 'Wochenende', diff --git a/tests/Feature/Membership/IndexTest.php b/tests/Feature/Membership/IndexTest.php index 0e58c6ac..bf7348f8 100644 --- a/tests/Feature/Membership/IndexTest.php +++ b/tests/Feature/Membership/IndexTest.php @@ -28,12 +28,12 @@ class IndexTest extends TestCase $membership = $member->memberships->first(); $this->get("/member/{$member->id}/membership") - ->assertJsonPath('data.0.activity_id', $membership->activity_id) - ->assertJsonPath('data.0.subactivity_id', $membership->subactivity_id) - ->assertJsonPath('data.0.activity_name', '€ Mitglied') - ->assertJsonPath('data.0.subactivity_name', 'Wölfling') + ->assertJsonPath('data.0.activity.id', $membership->activity_id) + ->assertJsonPath('data.0.subactivity.id', $membership->subactivity_id) + ->assertJsonPath('data.0.activity.name', '€ Mitglied') + ->assertJsonPath('data.0.subactivity.name', 'Wölfling') ->assertJsonPath('data.0.human_date', '02.11.2022') - ->assertJsonPath('data.0.group_id', $group->id) + ->assertJsonPath('data.0.group.id', $group->id) ->assertJsonPath('data.0.id', $membership->id) ->assertJsonPath('data.0.links.update', route('membership.update', ['membership' => $membership])) ->assertJsonPath('data.0.links.destroy', route('membership.destroy', ['membership' => $membership]))