Skip to content

Commit

Permalink
Consultations for n teachers (#110)
Browse files Browse the repository at this point in the history
* Consultations for n teachers

* Added tests
  • Loading branch information
daVitekPL authored Oct 1, 2024
1 parent aedf4f7 commit 154530a
Show file tree
Hide file tree
Showing 11 changed files with 90 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
public function up()
{
Schema::create('consultation_teachers', function (Blueprint $table) {
$table->id();
$table->bigInteger('consultation_id')->unsigned()->index();
$table->bigInteger('teacher_id')->unsigned();

$table->foreign('consultation_id')->references('id')->on('consultations')->onDelete('CASCADE');
$table->foreign('teacher_id')->references('id')->on('users')->onDelete('CASCADE');
});
}

public function down()
{
Schema::dropIfExists('consultation_teachers');
}
};
5 changes: 5 additions & 0 deletions src/Dto/ConsultationDto.php
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,9 @@ protected function setActiveFrom(?string $activeFrom): void
{
$this->activeFrom = $activeFrom ? Carbon::make($activeFrom) : null;
}

protected function setTeachers(array $teachers): void
{
$this->relations['teachers'] = $teachers;
}
}
2 changes: 2 additions & 0 deletions src/Http/Requests/StoreConsultationRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ public function rules(): array
'categories' => ['array'],
'categories.*' => ['integer', 'exists:categories,id'],
'max_session_students' => ['integer', 'min:1', 'max:99'],
'teachers' => ['array'],
'teachers.*' => ['integer', 'exists:users,id'],
], ModelFields::getFieldsMetadataRules(Consultation::class));
}
}
2 changes: 2 additions & 0 deletions src/Http/Requests/UpdateConsultationRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ public function rules(): array
'categories' => ['array'],
'categories.*' => ['integer', 'exists:categories,id'],
'max_session_students' => ['integer', 'min:1', 'max:99'],
'teachers' => ['array'],
'teachers.*' => ['integer', 'exists:users,id'],
], ModelFields::getFieldsMetadataRules(Consultation::class));
}
}
1 change: 1 addition & 0 deletions src/Http/Resources/ConsultationSimpleResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public function toArray($request)
'busy_terms' => ConsultationTermResource::collection($consultationServiceContract->getBusyTermsFormatDate($this->resource->getKey())),
'categories' => $this->resource->categories,
'max_session_students' => $this->resource->max_session_students,
'teachers' => ConsultationAuthorResource::collection($this->resource->teachers),
...ModelFields::getExtraAttributesValues($this->resource, MetaFieldVisibilityEnum::PUBLIC)
];
return self::apply($fields, $this);
Expand Down
5 changes: 5 additions & 0 deletions src/Models/Consultation.php
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,11 @@ public function users(): BelongsToMany
return $this->belongsToMany(User::class, 'consultation_user');
}

public function teachers(): BelongsToMany
{
return $this->belongsToMany(User::class, 'consultation_teachers', 'consultation_id', 'teacher_id');
}

public function proposedTerms(): HasMany
{
return $this->hasMany(ConsultationProposedTerm::class, 'consultation_id');
Expand Down
8 changes: 5 additions & 3 deletions src/Repositories/ConsultationUserRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,11 @@ public function getIncomingTerm(array $criteria = []): Collection

public function getByCurrentUserTutor(): Collection
{
$query = $this->model->newQuery();
$query->whereHas('consultation', fn (Builder $query) => $query->whereAuthorId(auth()->user()->getKey()));
return $query->get();
return $this->model->newQuery()
->whereHas('consultation', fn (Builder $query) => $query
->whereAuthorId(auth()->user()->getKey())
->orWhereHas('teachers', fn (Builder $query) => $query->where('users.id', '=', auth()->user()->getKey()))
)->get();
}

public function getBusyTerms(int $consultationId, ?string $date = null): Collection
Expand Down
24 changes: 17 additions & 7 deletions src/Services/ConsultationService.php
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ public function generateJitsi(int $consultationTermId): array
$isModerator = false;
$configOverwrite = [];
$configInterface = [];
if ($consultationTerm->consultation->author->getKey() === auth()->user()->getKey()) {
if ($consultationTerm->consultation->author->getKey() === auth()->user()->getKey() || in_array(auth()->user()->getKey(), $consultationTerm->consultation->teachers()->pluck('id')->toArray())) {
$configOverwrite = [
"disableModeratorIndicator" => true,
"startScreenSharing" => false,
Expand Down Expand Up @@ -236,7 +236,7 @@ public function generateJitsiUrlForEmail(int $consultationTermId, int $userId):
$isModerator = false;
$configOverwrite = [];
$configInterface = [];
if ($consultationTerm->consultation->author->getKey() === $userId) {
if ($consultationTerm->consultation->author->getKey() === $userId || in_array($userId, $consultationTerm->consultation->teachers()->pluck('id')->toArray())) {
$configOverwrite = [
"disableModeratorIndicator" => true,
"startScreenSharing" => false,
Expand Down Expand Up @@ -383,11 +383,21 @@ public function reminderAboutConsultation(string $reminderStatus): void
$consultationTerm,
$reminderStatus
));
event(new ReminderTrainerAboutTerm(
$consultationTerm->consultation->author,
$consultationTerm,
$reminderStatus
));
if ($consultationTerm->consultation->teachers) {
$consultationTerm->consultation->teachers->each(
fn (User $teacher) => event(new ReminderTrainerAboutTerm(
$teacher,
$consultationTerm,
$reminderStatus
))
);
} else {
event(new ReminderTrainerAboutTerm(
$consultationTerm->consultation->author,
$consultationTerm,
$reminderStatus
));
}
}
}

Expand Down
22 changes: 22 additions & 0 deletions src/Strategies/Relations/ConsultationWithTeachersStrategy.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace EscolaLms\Consultations\Strategies\Relations;

use EscolaLms\Consultations\Models\Consultation;
use EscolaLms\Consultations\Strategies\Contracts\RelationStrategyContract;

class ConsultationWithTeachersStrategy implements RelationStrategyContract
{
private Consultation $consultation;
private array $data;

public function __construct(array $params) {
$this->consultation = $params[0];
$this->data = $params[1] ?? [];
}

public function setRelation(): void
{
$this->consultation->teachers()->sync($this->data['teachers']);
}
}
3 changes: 3 additions & 0 deletions tests/APIs/ConsultationStoreApiTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,15 @@ public function testConsultationStore(): void
now()->modify('+1 day')->format("Y-m-d\TH:i:s.000000\Z")
];
$categories = Category::factory(2)->create()->pluck('id')->toArray();
$teachers = User::factory()->count(4)->create();
$requestArray = array_merge(
$consultationArr,
['proposed_terms' => $proposedTerms],
['image' => UploadedFile::fake()->image('image.jpg')],
['logotype' => UploadedFile::fake()->image('image.jpg')],
['categories' => $categories],
['max_session_students' => 5],
['teachers' => $teachers->pluck('id')->toArray()],
);
$response = $this->actingAs($this->user, 'api')->json(
'POST',
Expand Down Expand Up @@ -99,6 +101,7 @@ public function testConsultationStore(): void
)
->etc()
);
$response->assertJsonCount(4, 'data.teachers');
}

public function testConsultationStoreWithModelFields(): void
Expand Down
3 changes: 3 additions & 0 deletions tests/APIs/ConsultationUpdateApiTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,14 @@ public function testConsultationUpdate(): void
$consultationUpdateArray = $consultationUpdate->toArray();
$this->assertTrue(!isset($consultation['image_path']));
$categories = Category::factory(2)->create()->pluck('id')->toArray();
$teachers = User::factory()->count(4)->create();
$requestArray = array_merge(
$consultationUpdateArray,
['proposed_terms' => $proposedTerms],
['image' => UploadedFile::fake()->image('image.jpg')],
['categories' => $categories],
['max_session_students' => 4],
['teachers' => $teachers->pluck('id')->toArray()],
);
$response = $this->actingAs($this->user, 'api')->json(
'POST',
Expand Down Expand Up @@ -118,6 +120,7 @@ public function testConsultationUpdate(): void
'proposed_terms' => $proposedTerms
]);
$response->assertJsonFragment(['success' => true]);
$response->assertJsonCount(4, 'data.teachers');
}

public function testConsultationUpdateSingleField(): void
Expand Down

0 comments on commit 154530a

Please sign in to comment.