Skip to content

Commit f921435

Browse files
committed
config/settings data object
1 parent 51cb680 commit f921435

20 files changed

Lines changed: 1066 additions & 174 deletions

src/Commands/BaseCommand.php

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,19 @@
77
use STS\Keep\Commands\Concerns\InteractsWithFilesystem;
88
use STS\Keep\Commands\Concerns\InteractsWithVaults;
99
use STS\Keep\Exceptions\KeepException;
10-
use STS\Keep\KeepManager;
10+
use STS\Keep\Facades\Keep;
1111
use function Laravel\Prompts\error;
1212
use function Laravel\Prompts\note;
1313

1414
abstract class BaseCommand extends Command
1515
{
1616
use GathersInput, InteractsWithFilesystem, InteractsWithVaults;
1717

18-
protected KeepManager $manager;
19-
20-
public function setManager(KeepManager $manager): self
21-
{
22-
$this->manager = $manager;
23-
return $this;
24-
}
2518

2619
public function handle(): int
2720
{
28-
$this->manager = $this->getApplication()->getManager();
29-
3021
// Check if Keep is initialized (unless this command doesn't require it)
31-
if ($this->requiresInitialization() && !$this->manager->isInitialized()) {
22+
if ($this->requiresInitialization() && !Keep::isInitialized()) {
3223
error('Keep is not initialized in this directory.');
3324
note('Run: keep configure');
3425
return self::FAILURE;

src/Commands/Concerns/ConfiguresVaults.php

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace STS\Keep\Commands\Concerns;
44

5+
use STS\Keep\Data\VaultConfig;
6+
use STS\Keep\Facades\Keep;
57
use function Laravel\Prompts\text;
68
use function Laravel\Prompts\select;
79
use function Laravel\Prompts\info;
@@ -12,7 +14,7 @@ trait ConfiguresVaults
1214
protected function configureNewVault(): ?array
1315
{
1416
// Get available vault classes and build options
15-
$availableVaults = $this->manager->getAvailableVaults();
17+
$availableVaults = Keep::getAvailableVaults();
1618
$driverOptions = [];
1719
$vaultClassMap = [];
1820

@@ -38,34 +40,31 @@ protected function configureNewVault(): ?array
3840
default: $defaultSlug,
3941
hint: 'Short identifier used in secret templates like {vault:DB_PASSWORD}'
4042
);
41-
42-
// Validate slug uniqueness
43-
$existingVaults = $this->manager->getConfiguredVaults();
44-
if (isset($existingVaults[$slug])) {
43+
44+
$existingVaults = Keep::getConfiguredVaults();
45+
if ($existingVaults->has($slug)) {
4546
error("A vault with slug '{$slug}' already exists!");
4647
return null;
4748
}
48-
49-
// Get friendly name
49+
5050
$friendlyName = text(
5151
label: 'Friendly name for this vault',
5252
default: $selectedVaultClass::NAME,
5353
hint: 'A descriptive name to identify this vault configuration'
5454
);
55-
56-
// Configure the specific vault using dynamic prompts
57-
$vaultConfig = $this->configureVaultSettings($selectedVaultClass, $friendlyName);
55+
56+
$vaultConfig = $this->configureVaultSettings($selectedVaultClass, $friendlyName, $slug);
5857

5958
if (!$vaultConfig) {
6059
error('Failed to configure vault');
6160
return null;
6261
}
6362

64-
// Save the vault configuration
65-
$this->saveVaultConfig($slug, $vaultConfig);
63+
// Save the vault configuration using robust VaultConfiguration object
64+
VaultConfig::fromArray($vaultConfig)->save();
6665

6766
// Set as default vault if none exists
68-
if (empty($this->manager->getSetting('default_vault'))) {
67+
if (empty(Keep::getSetting('default_vault'))) {
6968
info("Setting '{$slug}' as your default vault since you don't have one yet.");
7069
$this->setDefaultVault($slug);
7170
}
@@ -77,7 +76,7 @@ protected function configureNewVault(): ?array
7776

7877
private function generateUniqueSlug(string $driver): string
7978
{
80-
$existingVaults = $this->manager->getConfiguredVaults();
79+
$existingVaults = Keep::getConfiguredVaults();
8180

8281
// If the driver doesn't exist, use it as-is
8382
if (!isset($existingVaults[$driver])) {
@@ -93,13 +92,14 @@ private function generateUniqueSlug(string $driver): string
9392
return "{$driver}{$counter}";
9493
}
9594

96-
private function configureVaultSettings(string $vaultClass, string $friendlyName): ?array
95+
private function configureVaultSettings(string $vaultClass, string $friendlyName, string $slug): ?array
9796
{
9897
info("Configuring {$friendlyName}...");
9998

10099
// Get dynamic prompts from the vault class
101100
$prompts = $vaultClass::configure();
102101
$config = [
102+
'slug' => $slug,
103103
'driver' => $vaultClass::DRIVER,
104104
'name' => $friendlyName
105105
];
@@ -117,17 +117,23 @@ private function configureVaultSettings(string $vaultClass, string $friendlyName
117117
return $config;
118118
}
119119

120-
private function saveVaultConfig(string $name, array $config): void
121-
{
122-
$vaultPath = getcwd() . "/.keep/vaults/{$name}.json";
123-
file_put_contents($vaultPath, json_encode($config, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
124-
}
125-
126120
private function setDefaultVault(string $vaultName): void
127121
{
128-
$settingsPath = getcwd() . '/.keep/settings.json';
129-
$settings = json_decode(file_get_contents($settingsPath), true);
130-
$settings['default_vault'] = $vaultName;
131-
file_put_contents($settingsPath, json_encode($settings, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
122+
// Load existing settings or create minimal settings if none exist
123+
$settings = \STS\Keep\Data\Settings::load();
124+
125+
if ($settings) {
126+
$updatedSettings = $settings->withDefaultVault($vaultName);
127+
} else {
128+
// Create minimal settings if file doesn't exist
129+
$updatedSettings = new \STS\Keep\Data\Settings(
130+
appName: 'keep-app',
131+
namespace: 'keep-app',
132+
stages: ['local', 'staging', 'production'],
133+
defaultVault: $vaultName
134+
);
135+
}
136+
137+
$updatedSettings->save();
132138
}
133139
}

src/Commands/Concerns/GathersInput.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace STS\Keep\Commands\Concerns;
44

55
use STS\Keep\Data\Context;
6+
use STS\Keep\Facades\Keep;
67

78
use function Laravel\Prompts\select;
89
use function Laravel\Prompts\text;
@@ -60,17 +61,17 @@ protected function vaultName($prompt = "Vault", $cacheName = 'vaultName')
6061
{
6162
return $this->{$cacheName} ??= match (true) {
6263
$this->hasOption('vault') && (bool) $this->option('vault') => $this->option('vault'),
63-
count($this->manager->getConfiguredVaults()) === 1 => $this->manager->getDefaultVault(),
64-
default => select($prompt, $this->manager->getConfiguredVaults(), $this->manager->getDefaultVault()),
64+
Keep::getConfiguredVaults()->count() === 1 => Keep::getDefaultVault(),
65+
default => select($prompt, Keep::getConfiguredVaults()->keys()->toArray(), Keep::getDefaultVault()),
6566
};
6667
}
6768

6869
protected function stage($prompt = "Stage", $cacheName = 'stage')
6970
{
7071
return $this->{$cacheName} ??= match (true) {
7172
$this->hasOption('stage') && (bool) $this->option('stage') => $this->option('stage'),
72-
count($this->manager->getStages()) === 1 => $this->manager->getStages()[0],
73-
default => select($prompt, $this->manager->getStages()),
73+
count(Keep::getStages()) === 1 => Keep::getStages()[0],
74+
default => select($prompt, Keep::getStages()),
7475
};
7576
}
7677

src/Commands/ConfigureCommand.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Illuminate\Support\Str;
66
use STS\Keep\Commands\Concerns\ConfiguresVaults;
7+
use STS\Keep\Facades\Keep;
78
use function Laravel\Prompts\text;
89
use function Laravel\Prompts\multiselect;
910
use function Laravel\Prompts\info;
@@ -28,7 +29,7 @@ protected function process()
2829
info('🔐 Keep Configuration');
2930
note('Configure Keep settings for your project. Run this anytime to review or update your settings.');
3031

31-
$existingSettings = $this->manager->getSettings();
32+
$existingSettings = Keep::getSettings();
3233

3334
// Gather basic configuration
3435
$appName = text(
@@ -64,7 +65,7 @@ protected function process()
6465
info('✅ Configuration updated successfully!');
6566

6667
// Offer to create first vault if none exist (but not in non-interactive mode)
67-
if (empty($this->manager->getConfiguredVaults()) && !$this->option('no-interaction')) {
68+
if (Keep::getConfiguredVaults()->isEmpty() && !$this->option('no-interaction')) {
6869
info('🗄️ Vault Setup');
6970
note('You\'ll need at least one vault to store your secrets.');
7071

@@ -81,7 +82,7 @@ protected function process()
8182
note('No worries! You can add a vault later with: keep vault:add');
8283
}
8384
} else {
84-
if (empty($this->manager->getConfiguredVaults())) {
85+
if (Keep::getConfiguredVaults()->isEmpty()) {
8586
note('Next steps:');
8687
note('• Add your first vault: keep vault:add');
8788
note('• Set your first secret: keep set MY_SECRET');

src/Commands/DiffCommand.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,13 @@ protected function getVaultsToCompare(): array
5656
if ($vaultOption) {
5757
$requestedVaults = array_map('trim', explode(',', $vaultOption));
5858

59-
$invalidVaults = array_diff($requestedVaults, Keep::getConfiguredVaults());
59+
$configuredVaultNames = Keep::getConfiguredVaults()->keys()->toArray();
60+
$invalidVaults = array_diff($requestedVaults, $configuredVaultNames);
6061
if (! empty($invalidVaults)) {
6162
$this->warn('Warning: Unknown vaults specified: '.implode(', ', $invalidVaults));
6263
}
6364

64-
return array_intersect($requestedVaults, Keep::getConfiguredVaults());
65+
return array_intersect($requestedVaults, $configuredVaultNames);
6566
}
6667

6768
// Default to current/default vault only
@@ -159,10 +160,11 @@ protected function parseContextsToVaultsAndStages(): array
159160
$stages = $contexts->pluck('stage')->unique()->values()->toArray();
160161

161162
// Validate vaults exist
162-
$invalidVaults = array_diff($vaults, Keep::getConfiguredVaults());
163+
$configuredVaultNames = Keep::getConfiguredVaults()->keys()->toArray();
164+
$invalidVaults = array_diff($vaults, $configuredVaultNames);
163165
if (!empty($invalidVaults)) {
164166
$this->warn('Warning: Unknown vaults specified: ' . implode(', ', $invalidVaults));
165-
$vaults = array_intersect($vaults, Keep::getConfiguredVaults());
167+
$vaults = array_intersect($vaults, $configuredVaultNames);
166168
}
167169

168170
// Validate stages exist

src/Commands/InfoCommand.php

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

33
namespace STS\Keep\Commands;
44

5+
use STS\Keep\Facades\Keep;
56
use function Laravel\Prompts\info;
67
use function Laravel\Prompts\warning;
78
use function Laravel\Prompts\table;
@@ -35,7 +36,7 @@ private function showSystemInfo(): void
3536

3637
private function showConfiguration(): void
3738
{
38-
$settings = $this->manager->getSettings();
39+
$settings = Keep::getSettings();
3940

4041
info('📋 Configuration');
4142
table(
@@ -51,22 +52,22 @@ private function showConfiguration(): void
5152

5253
private function showVaults(): void
5354
{
54-
$configuredVaults = $this->manager->getConfiguredVaults();
55+
$configuredVaults = Keep::getConfiguredVaults();
5556

56-
if (empty($configuredVaults)) {
57+
if ($configuredVaults->isEmpty()) {
5758
warning('No vaults configured');
5859
info('Run "keep vault:add" to add your first vault');
5960
return;
6061
}
6162

6263
info('🗄️ Configured Vaults');
6364

64-
$settings = $this->manager->getSettings();
65+
$settings = Keep::getSettings();
6566
$vaultRows = [];
6667

6768
foreach ($configuredVaults as $slug => $config) {
6869
$isDefault = $slug === $settings['default_vault'] ? ' (default)' : '';
69-
$vaultRows[] = [$slug . $isDefault, $config['name'], $config['driver']];
70+
$vaultRows[] = [$slug . $isDefault, $config->name(), $config->driver()];
7071
}
7172

7273
table(

src/Commands/VaultEditCommand.php

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

33
namespace STS\Keep\Commands;
44

5+
use STS\Keep\Facades\Keep;
56
use function Laravel\Prompts\text;
67
use function Laravel\Prompts\select;
78
use function Laravel\Prompts\info;
@@ -16,7 +17,7 @@ protected function process(): int
1617
{
1718
info('🔧 Edit Vault Configuration');
1819

19-
$configuredVaults = $this->manager->getConfiguredVaults();
20+
$configuredVaults = Keep::getConfiguredVaults();
2021

2122
if (empty($configuredVaults)) {
2223
error('No vaults are configured yet.');
@@ -86,7 +87,7 @@ protected function process(): int
8687
$this->saveVaultConfig($newSlug, $updatedConfig);
8788

8889
// Update default vault if this was the default
89-
if ($this->manager->getSetting('default_vault') === $slug) {
90+
if (Keep::getSetting('default_vault') === $slug) {
9091
$this->setDefaultVault($newSlug);
9192
}
9293

@@ -102,7 +103,7 @@ protected function process(): int
102103

103104
private function findVaultClass(string $driver): ?string
104105
{
105-
$availableVaults = $this->manager->getAvailableVaults();
106+
$availableVaults = Keep::getAvailableVaults();
106107

107108
foreach ($availableVaults as $vaultClass) {
108109
if ($vaultClass::DRIVER === $driver) {

src/Commands/VaultListCommand.php

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

33
namespace STS\Keep\Commands;
44

5+
use STS\Keep\Facades\Keep;
56
use function Laravel\Prompts\table;
67
use function Laravel\Prompts\info;
78

@@ -12,23 +13,23 @@ class VaultListCommand extends BaseCommand
1213

1314
protected function process(): int
1415
{
15-
$configuredVaults = $this->manager->getConfiguredVaults();
16+
$configuredVaults = Keep::getConfiguredVaults();
1617

17-
if (empty($configuredVaults)) {
18+
if ($configuredVaults->isEmpty()) {
1819
info('No vaults are configured yet.');
1920
info('Add your first vault with: keep vault:add');
2021
return self::SUCCESS;
2122
}
2223

23-
$defaultVault = $this->manager->getSetting('default_vault');
24+
$defaultVault = Keep::getSetting('default_vault');
2425
$rows = [];
2526

2627
foreach ($configuredVaults as $slug => $config) {
2728
$isDefault = $slug === $defaultVault ? '' : '';
2829
$rows[] = [
2930
$slug,
30-
$config['name'] ?? 'Unknown',
31-
$config['driver'] ?? 'Unknown',
31+
$config->name(),
32+
$config->driver(),
3233
$isDefault
3334
];
3435
}

0 commit comments

Comments
 (0)