Skip to content

Commit 84ba00a

Browse files
committed
Add Draftable contract
1 parent da24fe8 commit 84ba00a

File tree

6 files changed

+105
-16
lines changed

6 files changed

+105
-16
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,15 +92,16 @@ return [
9292

9393
#### Add the trait
9494

95-
Add the `HasDrafts` trait to your model
95+
Add the `HasDrafts` trait and `Draftable` contact to your model
9696

9797
```php
9898
<?php
9999

100100
use Illuminate\Database\Eloquent\Model;
101101
use Oddvalue\LaravelDrafts\Concerns\HasDrafts;
102+
use Oddvalue\LaravelDrafts\Contacts\Draftable;
102103

103-
class Post extends Model
104+
class Post extends Model implements Draftable
104105
{
105106
use HasDrafts;
106107

src/Commands/PublishScheduledDrafts.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Illuminate\Database\Eloquent\Model;
77
use InvalidArgumentException;
88
use Oddvalue\LaravelDrafts\Concerns\HasDrafts;
9+
use Oddvalue\LaravelDrafts\Contacts\Draftable;
910

1011
class PublishScheduledDrafts extends Command
1112
{
@@ -27,7 +28,7 @@ public function handle(): int
2728
->onlyDrafts()
2829
->where($model->getWillPublishAtColumn(), '<', now())
2930
->whereNull($model->getPublishedAtColumn())
30-
->each(function (Model $record): void {
31+
->each(function (Draftable $record): void {
3132
$record->setLive();
3233
$record->save();
3334
});

src/Concerns/HasDrafts.php

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Oddvalue\LaravelDrafts\Concerns;
44

55
use Carbon\CarbonInterface;
6+
use Closure;
67
use Illuminate\Contracts\Database\Query\Builder;
78
use Illuminate\Database\Eloquent\Model;
89
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
@@ -12,12 +13,13 @@
1213
use Illuminate\Database\Eloquent\Relations\MorphToMany;
1314
use Illuminate\Support\Arr;
1415
use Illuminate\Support\Str;
16+
use Oddvalue\LaravelDrafts\Contacts\Draftable;
1517
use Oddvalue\LaravelDrafts\Facades\LaravelDrafts;
1618

1719
/**
18-
* @method void Current(Builder $query)
19-
* @method void WithoutCurrent(Builder $query)
20-
* @method void ExcludeRevision(Builder $query, int | Model $exclude)
20+
* @method \Illuminate\Database\Eloquent\Builder<Draftable> current()
21+
* @method \Illuminate\Database\Eloquent\Builder<Draftable> withoutCurrent()
22+
* @method \Illuminate\Database\Eloquent\Builder<Draftable> excludeRevision(int | Model $exclude)
2123
*/
2224
trait HasDrafts
2325
{
@@ -43,7 +45,7 @@ public function initializeHasDrafts(): void
4345

4446
public static function bootHasDrafts(): void
4547
{
46-
static::creating(function ($model) {
48+
static::creating(function (Draftable | Model $model) {
4749
$model->{$model->getIsCurrentColumn()} = true;
4850
$model->setPublisher();
4951
$model->generateUuid();
@@ -52,26 +54,26 @@ public static function bootHasDrafts(): void
5254
}
5355
});
5456

55-
static::updating(function ($model) {
57+
static::updating(function (Draftable | Model $model) {
5658
$model->newRevision();
5759
});
5860

59-
static::publishing(function ($model) {
61+
static::publishing(function (Draftable | Model $model) {
6062
$model->setLive();
6163
});
6264

63-
static::deleted(function ($model) {
65+
static::deleted(function (Draftable | Model $model) {
6466
$model->revisions()->delete();
6567
});
6668

6769
if (method_exists(static::class, 'restored')) {
68-
static::restored(function ($model) {
70+
static::restored(function (Draftable | Model $model) {
6971
$model->revisions()->restore();
7072
});
7173
}
7274

7375
if (method_exists(static::class, 'forceDeleted')) {
74-
static::forceDeleted(function ($model) {
76+
static::forceDeleted(function (Draftable | Model $model) {
7577
$model->revisions()->forceDelete();
7678
});
7779
}
@@ -262,12 +264,12 @@ public function save(array $options = []): bool
262264
return parent::save($options);
263265
}
264266

265-
public static function savingAsDraft(string|\Closure $callback): void
267+
public static function savingAsDraft(string | Closure $callback): void
266268
{
267269
static::registerModelEvent('savingAsDraft', $callback);
268270
}
269271

270-
public static function savedAsDraft(string|\Closure $callback): void
272+
public static function savedAsDraft(string | Closure $callback): void
271273
{
272274
static::registerModelEvent('drafted', $callback);
273275
}

src/Contacts/Draftable.php

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?php
2+
3+
namespace Oddvalue\LaravelDrafts\Contacts;
4+
5+
use Carbon\CarbonInterface;
6+
use Closure;
7+
use Illuminate\Database\Eloquent\Relations\HasMany;
8+
use Illuminate\Database\Eloquent\Relations\MorphTo;
9+
use Illuminate\Contracts\Database\Query\Builder;
10+
11+
interface Draftable
12+
{
13+
public function publish(): static;
14+
15+
public function save(array $options = []): bool;
16+
17+
public function isPublished(): bool;
18+
19+
public static function publishing(string|Closure $callback): void;
20+
21+
public static function published(string|Closure $callback): void;
22+
23+
public function getPublishedAtColumn(): string;
24+
25+
public function getQualifiedPublishedAtColumn(): string;
26+
27+
public function getIsPublishedColumn(): string;
28+
29+
public function getQualifiedIsPublishedColumn(): string;
30+
31+
public function shouldCreateRevision(): bool;
32+
33+
public function generateUuid(): void;
34+
35+
public function setCurrent(): void;
36+
37+
public function setLive(): void;
38+
39+
public function schedulePublishing(CarbonInterface $date): static;
40+
41+
public function clearScheduledPublishing(): static;
42+
43+
public function getDraftableRelations(): array;
44+
45+
public function saveAsDraft(array $options = []): bool;
46+
47+
public function asDraft(): static;
48+
49+
public function shouldDraft(): bool;
50+
51+
public static function savingAsDraft(string|Closure $callback): void;
52+
53+
public static function savedAsDraft(string|Closure $callback): void;
54+
55+
public function updateAsDraft(array $attributes = [], array $options = []): bool;
56+
57+
public static function createDraft(...$attributes): self;
58+
59+
public function setPublisher(): static;
60+
61+
public function pruneRevisions(): void;
62+
63+
public function getPublisherColumns(): array;
64+
65+
public function getQualifiedPublisherColumns(): array;
66+
67+
public function getIsCurrentColumn(): string;
68+
69+
public function getWillPublishAtColumn(): string;
70+
71+
public function getUuidColumn(): string;
72+
73+
public function revisions(): HasMany;
74+
75+
public function drafts();
76+
77+
public function publisher(): MorphTo;
78+
79+
public function getDraftAttribute();
80+
}

src/Facades/LaravelDrafts.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@
22

33
namespace Oddvalue\LaravelDrafts\Facades;
44

5+
use Illuminate\Contracts\Auth\Authenticatable;
6+
use Illuminate\Database\Eloquent\Model;
57
use Illuminate\Support\Facades\Facade;
68

79
/**
810
* @see \Oddvalue\LaravelDrafts\LaravelDrafts
11+
* @method Model | Authenticatable getCurrentUser();
912
*/
1013
class LaravelDrafts extends Facade
1114
{
12-
protected static function getFacadeAccessor()
15+
protected static function getFacadeAccessor(): string
1316
{
1417
return 'laravel-drafts';
1518
}

src/LaravelDrafts.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
namespace Oddvalue\LaravelDrafts;
44

5+
use Illuminate\Contracts\Auth\Authenticatable;
6+
use Illuminate\Database\Eloquent\Model;
57
use Illuminate\Support\Facades\Auth;
68

79
class LaravelDrafts
810
{
9-
public function getCurrentUser()
11+
public function getCurrentUser(): Model | Authenticatable
1012
{
1113
return Auth::guard(config('drafts.auth.guard'))->user();
1214
}

0 commit comments

Comments
 (0)