Skip to content

Commit 9fe3a1a

Browse files
committed
feat(scopes): installer for moox:scope and fix scopes.allowed configs
1 parent c0e13e4 commit 9fe3a1a

11 files changed

Lines changed: 127 additions & 119 deletions

File tree

packages/address/config/address.php

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,6 @@
22

33
use Moox\Address\Models\Address;
44
use Moox\Address\Models\Addressable;
5-
use Moox\Category\Resources\CategoryResource;
6-
use Moox\Media\Resources\MediaResource;
7-
use Moox\Tag\Resources\TagResource;
8-
use Moox\User\Models\User;
9-
use Moox\User\Resources\UserResource;
105

116
/*
127
|--------------------------------------------------------------------------
@@ -76,20 +71,6 @@
7671
],
7772

7873
'scopes' => [
79-
'allowed' => [
80-
'media' => [
81-
'resource' => MediaResource::class,
82-
],
83-
'tag' => [
84-
'resource' => TagResource::class,
85-
],
86-
'category' => [
87-
'resource' => CategoryResource::class,
88-
],
89-
'user' => [
90-
'resource' => UserResource::class,
91-
],
92-
],
9374
'registry' => [
9475
'sources' => [
9576
'address' => Address::class,

packages/category/config/category.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
use Moox\Category\Models\Category;
44
use Moox\Media\Resources\MediaResource;
5-
use Moox\Tag\Resources\TagResource;
65

76
/*
87
|--------------------------------------------------------------------------
@@ -86,9 +85,6 @@
8685
'media' => [
8786
'resource' => MediaResource::class,
8887
],
89-
'tag' => [
90-
'resource' => TagResource::class,
91-
],
9288
],
9389
'registry' => [
9490
'origins' => [

packages/company/config/company.php

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
<?php
22

3-
use Moox\Category\Resources\CategoryResource;
43
use Moox\Company\Models\Company;
5-
use Moox\Media\Resources\MediaResource;
6-
use Moox\News\Moox\Entities\News\News\NewsResource;
7-
use Moox\Tag\Resources\TagResource;
8-
use Moox\User\Models\User;
9-
use Moox\User\Resources\UserResource;
10-
use Moox\UserDevice\Resources\UserDeviceResource;
114

125
/*
136
|--------------------------------------------------------------------------
@@ -88,26 +81,6 @@
8881
],
8982

9083
'scopes' => [
91-
'allowed' => [
92-
'news' => [
93-
'resource' => NewsResource::class,
94-
],
95-
'media' => [
96-
'resource' => MediaResource::class,
97-
],
98-
'tag' => [
99-
'resource' => TagResource::class,
100-
],
101-
'category' => [
102-
'resource' => CategoryResource::class,
103-
],
104-
'user' => [
105-
'resource' => UserResource::class,
106-
],
107-
'user-device' => [
108-
'resource' => UserDeviceResource::class,
109-
],
110-
],
11184
'registry' => [
11285
'sources' => [
11386
'company' => Company::class,

packages/contact/config/contact.php

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,10 @@
22

33
use Moox\Address\Models\Address;
44
use Moox\Address\Models\Addressable;
5-
use Moox\Category\Resources\CategoryResource;
65
use Moox\Company\Models\Company;
76
use Moox\Company\Resources\CompanyResource;
87
use Moox\Contact\Models\CompanyContact;
98
use Moox\Contact\Models\Contact;
10-
use Moox\Media\Resources\MediaResource;
11-
use Moox\News\Moox\Entities\News\News\NewsResource;
12-
use Moox\Tag\Resources\TagResource;
13-
use Moox\User\Models\User;
14-
use Moox\User\Resources\UserResource;
15-
use Moox\UserDevice\Resources\UserDeviceResource;
169

1710
/*
1811
|--------------------------------------------------------------------------
@@ -95,26 +88,6 @@
9588
],
9689

9790
'scopes' => [
98-
'allowed' => [
99-
'news' => [
100-
'resource' => NewsResource::class,
101-
],
102-
'media' => [
103-
'resource' => MediaResource::class,
104-
],
105-
'tag' => [
106-
'resource' => TagResource::class,
107-
],
108-
'category' => [
109-
'resource' => CategoryResource::class,
110-
],
111-
'user' => [
112-
'resource' => UserResource::class,
113-
],
114-
'user-device' => [
115-
'resource' => UserDeviceResource::class,
116-
],
117-
],
11891
'registry' => [
11992
'sources' => [
12093
'contact' => Contact::class,

packages/core/src/Console/Commands/ScopesSyncCommand.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ protected function collectScopeRows(): array
111111

112112
$scopes = $resourceDefinition['scopes'] ?? $resourceDefinition['children'] ?? null;
113113

114+
if (! is_array($scopes)) {
115+
continue;
116+
}
117+
114118
// If scopes contain registry metadata, treat the remaining keys as scope definitions.
115119
if (is_array($scopes) && array_key_exists('registry', $scopes)) {
116120
$allowed = is_array($scopes['allowed'] ?? null) ? $scopes['allowed'] : null;

packages/draft/config/draft.php

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
use Moox\News\Resources\NewsResource;
99
use Moox\Tag\Models\Tag;
1010
use Moox\Tag\Resources\TagResource;
11-
use Moox\User\Models\User;
12-
use Moox\User\Resources\UserResource;
1311

1412
/*
1513
|--------------------------------------------------------------------------
@@ -91,15 +89,6 @@
9189
'category' => [
9290
'resource' => CategoryResource::class,
9391
],
94-
'user' => [
95-
'resource' => UserResource::class,
96-
],
97-
// 'user' => [
98-
// 'resource' => UserResource::class,
99-
// ],
100-
// 'user-device' => [
101-
// 'resource' => UserDeviceResource::class,
102-
// ],
10392
],
10493
'registry' => [
10594
'sources' => [

packages/item/config/item.php

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
<?php
22

3-
use Moox\Category\Resources\CategoryResource;
43
use Moox\Item\Models\Item;
5-
use Moox\Media\Resources\MediaResource;
6-
use Moox\Tag\Resources\TagResource;
74

85
/*
96
|--------------------------------------------------------------------------
@@ -41,18 +38,8 @@
4138
],
4239
],
4340

41+
// No scopes.allowed: Item has no taxonomies/tags/media scoping (dev skeleton).
4442
'scopes' => [
45-
'allowed' => [
46-
'media' => [
47-
'resource' => MediaResource::class,
48-
],
49-
'tag' => [
50-
'resource' => TagResource::class,
51-
],
52-
'category' => [
53-
'resource' => CategoryResource::class,
54-
],
55-
],
5643
'registry' => [
5744
'sources' => [
5845
'item' => Item::class,

packages/record/config/record.php

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,9 @@
33
use Moox\Category\Forms\TaxonomyCreateForm;
44
use Moox\Category\Models\Category;
55
use Moox\Category\Resources\CategoryResource;
6-
use Moox\Media\Resources\MediaResource;
7-
use Moox\News\Resources\NewsResource;
86
use Moox\Record\Models\Record;
97
use Moox\Tag\Models\Tag;
108
use Moox\Tag\Resources\TagResource;
11-
use Moox\User\Models\User;
12-
use Moox\User\Resources\UserResource;
139

1410
/*
1511
|--------------------------------------------------------------------------
@@ -80,21 +76,12 @@
8076

8177
'scopes' => [
8278
'allowed' => [
83-
'news' => [
84-
'resource' => NewsResource::class,
85-
],
86-
'media' => [
87-
'resource' => MediaResource::class,
88-
],
8979
'tag' => [
9080
'resource' => TagResource::class,
9181
],
9282
'category' => [
9383
'resource' => CategoryResource::class,
9484
],
95-
'user' => [
96-
'resource' => UserResource::class,
97-
],
9885
],
9986
'registry' => [
10087
'sources' => [
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Moox\Scopes\Installers;
6+
7+
use Illuminate\Support\Facades\Artisan;
8+
use Illuminate\Support\Facades\DB;
9+
use Illuminate\Support\Facades\Schema;
10+
use Moox\Core\Installer\AbstractAssetInstaller;
11+
12+
use function Moox\Prompts\error;
13+
use function Moox\Prompts\note;
14+
15+
/**
16+
* Installer für das Scopes-Package.
17+
*
18+
* Synchronisiert Scopes aus den Package-Configs (resources.*.scopes.allowed)
19+
* in die scopes-Tabelle — gleiche Logik wie `php artisan moox:scope`.
20+
* Voraussetzung: Migrationen (moox/core, scopes-Tabelle).
21+
*/
22+
class ScopesInstaller extends AbstractAssetInstaller
23+
{
24+
public function getType(): string
25+
{
26+
return 'scopes';
27+
}
28+
29+
public function getLabel(): string
30+
{
31+
return 'Scopes (sync from config)';
32+
}
33+
34+
/**
35+
* Nach Migrationen und Config-Publish, vor Plugins.
36+
*/
37+
protected function getDefaultConfig(): array
38+
{
39+
$config = parent::getDefaultConfig();
40+
$config['priority'] = 25;
41+
42+
return $config;
43+
}
44+
45+
public function hasItemSelection(): bool
46+
{
47+
// Keine Item-Auswahl, Sync läuft als Ganzes.
48+
return false;
49+
}
50+
51+
public function checkExists(string $packageName, array $items): bool
52+
{
53+
// Wenn es bereits Scopes gibt, war der Sync schon einmal gelaufen.
54+
if (! Schema::hasTable('scopes')) {
55+
return false;
56+
}
57+
58+
return DB::table('scopes')->exists();
59+
}
60+
61+
public function install(array $assets): bool
62+
{
63+
if (! Schema::hasTable('scopes')) {
64+
note('ℹ️ Table scopes not found. Run migrations first (moox core).');
65+
66+
return false;
67+
}
68+
69+
try {
70+
note('🔗 Syncing scopes from package configs (moox:scope) …');
71+
72+
if ($this->command) {
73+
$exitCode = $this->command->call('moox:scope');
74+
} else {
75+
$exitCode = Artisan::call('moox:scope');
76+
}
77+
78+
if ($exitCode !== 0) {
79+
error('⚠️ Scope sync failed (moox:scope exit code '.$exitCode.').');
80+
81+
return false;
82+
}
83+
84+
note('✅ Scopes synced from config.');
85+
86+
return true;
87+
} catch (\Throwable $e) {
88+
error('⚠️ Scope sync failed: '.$e->getMessage());
89+
90+
return false;
91+
}
92+
}
93+
}

packages/scopes/src/ScopesServiceProvider.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
namespace Moox\Scopes;
66

7+
use Moox\Core\Installer\Contracts\AssetInstallerInterface;
78
use Moox\Core\MooxServiceProvider;
9+
use Moox\Scopes\Installers\ScopesInstaller;
810
use Spatie\LaravelPackageTools\Package;
911

1012
class ScopesServiceProvider extends MooxServiceProvider
@@ -16,4 +18,31 @@ public function configureMoox(Package $package): void
1618
->hasConfigFile()
1719
->hasTranslations();
1820
}
21+
22+
/**
23+
* Custom-Installer für das Scopes-Package, vom Moox-Installer ausgewertet.
24+
*
25+
* @return array<AssetInstallerInterface>
26+
*/
27+
public function getCustomInstallers(): array
28+
{
29+
return [
30+
new ScopesInstaller,
31+
];
32+
}
33+
34+
/**
35+
* Custom-Assets, damit der Typ "scopes" im Installer auswählbar ist.
36+
*/
37+
public function getCustomInstallAssets(): array
38+
{
39+
return [
40+
[
41+
'type' => 'scopes',
42+
'data' => [
43+
'sync-scopes-from-config',
44+
],
45+
],
46+
];
47+
}
1948
}

0 commit comments

Comments
 (0)