diff --git a/src/Contracts/IssueOwnerModelContract.php b/src/Contracts/IssueOwnerModelContract.php index 675cd2a..34d42ed 100644 --- a/src/Contracts/IssueOwnerModelContract.php +++ b/src/Contracts/IssueOwnerModelContract.php @@ -2,6 +2,7 @@ namespace AuroraWebSoftware\AIssue\Contracts; +use AuroraWebSoftware\AIssue\Models\AIssue; use AuroraWebSoftware\Connective\Collections\ConnectiveCollection; use AuroraWebSoftware\Connective\Contracts\ConnectiveContract; use Illuminate\Database\Query\Builder; @@ -11,13 +12,17 @@ */ interface IssueOwnerModelContract extends ConnectiveContract { + public function ownIssue(AIssue $issue): void; + + public function disownIssue(AIssue $issue): void; + /** * ConnectiveCollection */ - public function getOwningIssues(): ConnectiveCollection; + public function getOwningIssues(): ?ConnectiveCollection; /** * ConnectiveCollection */ - public function scopeAllOwningIssues(Builder $query): ConnectiveCollection; + public function scopeAllOwningIssues(Builder $query): ?ConnectiveCollection; } diff --git a/src/Models/AIssue.php b/src/Models/AIssue.php index ea5b1ad..9fbedaa 100644 --- a/src/Models/AIssue.php +++ b/src/Models/AIssue.php @@ -8,6 +8,7 @@ use AuroraWebSoftware\ACalendar\Models\Event; use AuroraWebSoftware\ACalendar\Traits\HasEvents; use AuroraWebSoftware\AIssue\Contracts\IssueActorModelContract; +use AuroraWebSoftware\AIssue\Contracts\IssueOwnerModelContract; use AuroraWebSoftware\ArFlow\Contacts\StateableModelContract; use AuroraWebSoftware\ArFlow\Traits\HasState; use AuroraWebSoftware\Connective\Collections\ConnectiveCollection; @@ -180,4 +181,23 @@ public function removeAllObservers(): void $observer->delete(); } } + + public function getOwnerModel(): IssueOwnerModelContract|Model|null + { + return $this->connectives('issue_owner_model')?->first(); + } + + /** + * @throws ConnectionTypeNotSupportedException + * @throws ConnectionTypeException + */ + public function setOwnerModel(IssueActorModelContract&Model $issueOwnerModel): void + { + if ($this->connections('issue_owner_model')) { + $this->connections('issue_owner_model') + ->each(fn (Model $connection) => $connection->delete()); + } + + $this->connectTo($issueOwnerModel, 'issue_owner_model'); + } } diff --git a/src/Traits/AIssueOwner.php b/src/Traits/AIssueOwner.php index e9c452a..426d54e 100644 --- a/src/Traits/AIssueOwner.php +++ b/src/Traits/AIssueOwner.php @@ -3,10 +3,34 @@ namespace AuroraWebSoftware\AIssue\Traits; use AuroraWebSoftware\AIssue\Contracts\IssueOwnerModelContract; +use AuroraWebSoftware\AIssue\Models\AIssue; use AuroraWebSoftware\Connective\Collections\ConnectiveCollection; +use AuroraWebSoftware\Connective\Exceptions\ConnectionTypeException; +use AuroraWebSoftware\Connective\Exceptions\ConnectionTypeNotSupportedException; +use Illuminate\Database\Query\Builder; trait AIssueOwner { + /** + * @throws ConnectionTypeNotSupportedException + * @throws ConnectionTypeException + */ + public function ownIssue(AIssue $issue): void + { + $issue->connectTo($this, 'issue_owner_model'); + } + + public function disownIssue(AIssue $issue): void + { + // todo + foreach ($this->getOwningIssues() ?? [] as $issueItem) { + if ($issue->getId() === $issueItem->getId()) { + $issue->connections('issue_owner_model')->delete(); + break; + } + } + } + /** * ConnectiveCollection */ @@ -18,4 +42,10 @@ public function getOwningIssues(): ConnectiveCollection return $this->inverseConnectives('issue_owner_model'); } + + public function scopeAllOwningIssues(Builder $query): ?ConnectiveCollection + { + // todo will be implemented + return ConnectiveCollection::make(); + } } diff --git a/tests/Models/ExampleIssueOwner.php b/tests/Models/ExampleIssueOwner.php new file mode 100644 index 0000000..2558509 --- /dev/null +++ b/tests/Models/ExampleIssueOwner.php @@ -0,0 +1,26 @@ +timestamps(); }); + Schema::create('example_issue_owners', function (Blueprint $table) { + $table->id(); + $table->string('name'); + $table->timestamps(); + }); + $classArflow = require __DIR__.'/../../vendor/aurorawebsoftware/arflow/database/migrations/create_arflow_history_table.php'; (new $classArflow)->up(); @@ -192,4 +199,10 @@ expect($issue->currentState())->toEqual('state2'); + $exampleIssueOwner1 = ExampleIssueOwner::create(['name' => 'example issue owner 1']); + $exampleIssueOwner1->ownIssue($issue); + expect($exampleIssueOwner1->getOwningIssues())->toHaveCount(1); + + // todo delete kısmı yazılmadı henüz + });