Fixed: Fetch courses
This commit is contained in:
parent
3dfdd1ce7c
commit
f84c8d2cc4
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
namespace App\Actions;
|
||||
|
||||
use App\Course\Models\Course;
|
||||
use App\Member\Member;
|
||||
use App\Setting\NamiSettings;
|
||||
use Lorisleiva\Actions\Concerns\AsAction;
|
||||
use Zoomyboy\LaravelNami\Api;
|
||||
|
||||
class PullCoursesAction
|
||||
{
|
||||
use AsAction;
|
||||
|
||||
public function handle(Member $member): void
|
||||
{
|
||||
if (!$member->hasNami) {
|
||||
return;
|
||||
}
|
||||
|
||||
$courses = $this->api()->coursesFor($member->nami_id);
|
||||
|
||||
foreach ($courses as $course) {
|
||||
$member->courses()->updateOrCreate(['nami_id' => $course->id], [
|
||||
'course_id' => Course::nami($course->courseId)->id,
|
||||
'organizer' => $course->organizer,
|
||||
'nami_id' => $course->id,
|
||||
'completed_at' => $course->completedAt,
|
||||
'event_name' => $course->eventName,
|
||||
]);
|
||||
}
|
||||
|
||||
$courseIds = $courses->map(fn ($course) => $course->id)->toArray();
|
||||
$member->courses()->whereNotIn('nami_id', $courseIds)->whereNotNull('nami_id')->delete();
|
||||
}
|
||||
|
||||
private function api(): Api
|
||||
{
|
||||
return app(NamiSettings::class)->login();
|
||||
}
|
||||
}
|
|
@ -2,12 +2,14 @@
|
|||
|
||||
namespace App\Course\Models;
|
||||
|
||||
use App\Nami\HasNamiField;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Course extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
use HasNamiField;
|
||||
|
||||
public $timestamps = false;
|
||||
public $fillable = ['name', 'nami_id'];
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
namespace App\Initialize;
|
||||
|
||||
use App\Actions\PullCoursesAction;
|
||||
use App\Actions\PullMemberAction;
|
||||
use App\Actions\PullMembershipsAction;
|
||||
use DB;
|
||||
|
@ -23,6 +24,7 @@ class InitializeMembers
|
|||
$this->api->search([])->each(function ($member) {
|
||||
$localMember = app(PullMemberAction::class)->handle($member->groupId, $member->id);
|
||||
app(PullMembershipsAction::class)->handle($localMember);
|
||||
app(PullCoursesAction::class)->handle($localMember);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 5890d0dbe1b1428c1e1c82039d362bfbb224cb4c
|
||||
Subproject commit acaae53ac865966f7174c03f7c3c0f64447953af
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature\Initialize;
|
||||
|
||||
use App\Actions\PullCoursesAction;
|
||||
use App\Actions\PullMemberAction;
|
||||
use App\Actions\PullMembershipsAction;
|
||||
use App\Initialize\InitializeMembers;
|
||||
use App\Setting\NamiSettings;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Tests\TestCase;
|
||||
use Zoomyboy\LaravelNami\Data\MemberEntry;
|
||||
use Zoomyboy\LaravelNami\Fakes\SearchFake;
|
||||
|
||||
class InitializeMembersTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function testItInitializesMembers(): void
|
||||
{
|
||||
$this->loginNami();
|
||||
$api = app(NamiSettings::class)->login();
|
||||
app(SearchFake::class)->fetches(1, 0, [
|
||||
MemberEntry::factory()->toMember(['groupId' => 100, 'id' => 20]),
|
||||
]);
|
||||
PullMemberAction::shouldRun()->once()->with(100, 20);
|
||||
PullMembershipsAction::shouldRun()->once();
|
||||
PullCoursesAction::shouldRun()->once();
|
||||
|
||||
app(InitializeMembers::class)->handle($api);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,105 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature\Member;
|
||||
|
||||
use App\Actions\PullCoursesAction;
|
||||
use App\Activity;
|
||||
use App\Country;
|
||||
use App\Course\Models\Course;
|
||||
use App\Course\Models\CourseMember;
|
||||
use App\Fee;
|
||||
use App\Gender;
|
||||
use App\Group;
|
||||
use App\Member\Member;
|
||||
use App\Nationality;
|
||||
use App\Payment\Subscription;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Tests\TestCase;
|
||||
use Zoomyboy\LaravelNami\Data\Course as NamiCourse;
|
||||
use Zoomyboy\LaravelNami\Fakes\CourseFake;
|
||||
|
||||
class PullCoursesActionTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
Subscription::factory()->name('test')->for(Fee::factory()->inNami(300))->create();
|
||||
Gender::factory()->inNami(303)->create();
|
||||
Country::factory()->inNami(302)->create();
|
||||
Nationality::factory()->inNami(1054)->create();
|
||||
$this->loginNami();
|
||||
}
|
||||
|
||||
public function testItDoesntSyncCoursesOfNonNamiMembers(): void
|
||||
{
|
||||
$member = Member::factory()->defaults()->for(Group::factory()->inNami(1000)->name('SG Wald'))->create();
|
||||
|
||||
app(PullCoursesAction::class)->handle($member);
|
||||
|
||||
Http::assertSentCount(0);
|
||||
}
|
||||
|
||||
public function testFetchCourses(): void
|
||||
{
|
||||
$activity = Activity::factory()->inNami(1003)->name('Tätigkeit')->create();
|
||||
$member = Member::factory()->defaults()->for(Group::factory()->inNami(1000)->name('SG Wald'))->inNami(1001)->create();
|
||||
$course = Course::factory()->name('BS')->inNami(11)->create();
|
||||
app(CourseFake::class)->fetches(1001, [50])->shows(1001, NamiCourse::factory()->toModel([
|
||||
'courseId' => 11,
|
||||
'organizer' => 'TTT',
|
||||
'eventName' => 'Schulung',
|
||||
'completedAt' => '2021-06-29 00:00:00',
|
||||
'id' => 50,
|
||||
]));
|
||||
|
||||
app(PullCoursesAction::class)->handle($member);
|
||||
|
||||
$this->assertDatabaseHas('course_members', [
|
||||
'nami_id' => 50,
|
||||
'member_id' => $member->id,
|
||||
'organizer' => 'TTT',
|
||||
'completed_at' => '2021-06-29',
|
||||
'event_name' => 'Schulung',
|
||||
'course_id' => $course->id,
|
||||
]);
|
||||
}
|
||||
|
||||
public function testDeleteExistingCourses(): void
|
||||
{
|
||||
$activity = Activity::factory()->inNami(1003)->name('Tätigkeit')->create();
|
||||
$member = Member::factory()
|
||||
->defaults()
|
||||
->for(Group::factory()->inNami(1000)->name('SG Wald'))
|
||||
->has(CourseMember::factory()->for(Course::factory()->inNami(50))->inNami(55), 'courses')
|
||||
->inNami(1001)
|
||||
->create();
|
||||
app(CourseFake::class)->fetches(1001, []);
|
||||
|
||||
app(PullCoursesAction::class)->handle($member);
|
||||
|
||||
$this->assertDatabaseCount('course_members', 0);
|
||||
}
|
||||
|
||||
public function testCourseIsUpdated(): void
|
||||
{
|
||||
$activity = Activity::factory()->inNami(1003)->name('Tätigkeit')->create();
|
||||
$member = Member::factory()
|
||||
->defaults()
|
||||
->for(Group::factory()->inNami(1000)->name('SG Wald'))
|
||||
->has(CourseMember::factory()->for(Course::factory()->inNami(50))->inNami(55), 'courses')
|
||||
->inNami(1001)
|
||||
->create();
|
||||
app(CourseFake::class)->fetches(1001, [55])->shows(1001, NamiCourse::factory()->toModel(['id' => 55, 'courseId' => 50, 'organizer' => 'ZZU']));
|
||||
|
||||
app(PullCoursesAction::class)->handle($member);
|
||||
|
||||
$this->assertDatabaseCount('course_members', 1);
|
||||
$this->assertDatabaseHas('course_members', [
|
||||
'organizer' => 'ZZU',
|
||||
]);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue