From bb56d58b9fff5b53ac54069f7eed62487fde5d61 Mon Sep 17 00:00:00 2001 From: Alfred Nutile Date: Tue, 11 Jun 2024 16:56:23 -0400 Subject: [PATCH] add the settings page now to make it work --- app/Http/Controllers/SettingController.php | 122 ++++++++++++++++++ app/Http/Resources/SettingResource.php | 19 +++ app/Models/Setting.php | 25 ++++ database/factories/SettingFactory.php | 39 ++++++ ...024_06_11_183813_create_settings_table.php | 31 +++++ resources/js/Components/ActionMessage.vue | 2 +- resources/js/Components/FormSection.vue | 6 +- resources/js/Components/SectionTitle.vue | 4 +- .../Pages/Settings/Partials/ClaudeSecrets.vue | 75 +++++++++++ .../Pages/Settings/Partials/GroqSecrets.vue | 89 +++++++++++++ .../Settings/Partials/OllamaApiSecrets.vue | 88 +++++++++++++ .../Pages/Settings/Partials/OpenAiSecrets.vue | 89 +++++++++++++ resources/js/Pages/Settings/Show.vue | 41 ++++++ routes/web.php | 15 +++ .../Controllers/SettingControllerTest.php | 49 +++++++ tests/Feature/Models/SettingTest.php | 23 ++++ 16 files changed, 711 insertions(+), 6 deletions(-) create mode 100644 app/Http/Controllers/SettingController.php create mode 100644 app/Http/Resources/SettingResource.php create mode 100644 app/Models/Setting.php create mode 100644 database/factories/SettingFactory.php create mode 100644 database/migrations/2024_06_11_183813_create_settings_table.php create mode 100644 resources/js/Pages/Settings/Partials/ClaudeSecrets.vue create mode 100644 resources/js/Pages/Settings/Partials/GroqSecrets.vue create mode 100644 resources/js/Pages/Settings/Partials/OllamaApiSecrets.vue create mode 100644 resources/js/Pages/Settings/Partials/OpenAiSecrets.vue create mode 100644 resources/js/Pages/Settings/Show.vue create mode 100644 tests/Feature/Http/Controllers/SettingControllerTest.php create mode 100644 tests/Feature/Models/SettingTest.php diff --git a/app/Http/Controllers/SettingController.php b/app/Http/Controllers/SettingController.php new file mode 100644 index 00000000..49f6209f --- /dev/null +++ b/app/Http/Controllers/SettingController.php @@ -0,0 +1,122 @@ + [ + 'setup_secrets' => false, + ], + 'meta_data' => [ + 'openai' => [ + 'models' => [], + ], + ], + 'secrets' => [ + 'openai' => [ + 'api_key' => null, + 'api_url' => 'https://api.openai.com/v1', + ], + 'claude' => [ + 'api_key' => null, + ], + 'groq' => [ + 'api_key' => null, + 'api_url' => 'https://api.groq.com/openai/v1/', + ], + 'ollama' => [ + 'api_key' => 'ollama', + 'api_url' => 'http://localhost:11434/api/', + ], + ], + ]); + } else { + $setting = Setting::first(); + } + + return inertia('Settings/Show', [ + 'setting' => new SettingResource($setting), + ]); + } + + protected function updateStep(Setting $setting): Setting + { + $steps = $setting->steps; + $steps['setup_secrets'] = true; + $setting->steps = $steps; + $setting->save(); + + return $setting; + } + + public function updateClaude(Request $request, Setting $setting) + { + $validated = $request->validate([ + 'api_key' => 'string|required', + ]); + + $secrets = $setting->secrets; + $secrets['claude'] = $validated; + $setting->secrets = $secrets; + $setting->save(); + $this->updateStep($setting); + + return back(); + } + + public function updateOllama(Request $request, Setting $setting) + { + $validated = $request->validate([ + 'api_key' => 'string|required', + 'api_url' => 'string|required', + ]); + + $secrets = $setting->secrets; + $secrets['ollama'] = $validated; + $setting->secrets = $secrets; + $setting->save(); + $this->updateStep($setting); + + return back(); + } + + public function updateGroq(Request $request, Setting $setting) + { + $validated = $request->validate([ + 'api_key' => 'string|required', + 'api_url' => 'string|required', + ]); + + $secrets = $setting->secrets; + $secrets['groq'] = $validated; + $setting->secrets = $secrets; + $setting->save(); + $this->updateStep($setting); + + return back(); + } + + public function updateOpenAi(Request $request, Setting $setting) + { + $validated = $request->validate([ + 'api_key' => 'string|required', + 'api_url' => 'string|required', + ]); + + $secrets = $setting->secrets; + $secrets['openai'] = $validated; + $setting->secrets = $secrets; + $setting->save(); + $this->updateStep($setting); + + return back(); + } +} diff --git a/app/Http/Resources/SettingResource.php b/app/Http/Resources/SettingResource.php new file mode 100644 index 00000000..f05e431a --- /dev/null +++ b/app/Http/Resources/SettingResource.php @@ -0,0 +1,19 @@ + + */ + public function toArray(Request $request): array + { + return parent::toArray($request); + } +} diff --git a/app/Models/Setting.php b/app/Models/Setting.php new file mode 100644 index 00000000..c8f9ad1e --- /dev/null +++ b/app/Models/Setting.php @@ -0,0 +1,25 @@ + 'array', + 'meta_data' => 'array', + 'secrets' => 'encrypted:array', + ]; + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } +} diff --git a/database/factories/SettingFactory.php b/database/factories/SettingFactory.php new file mode 100644 index 00000000..9697ef57 --- /dev/null +++ b/database/factories/SettingFactory.php @@ -0,0 +1,39 @@ + + */ +class SettingFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'steps' => [ + 'setup_secrets' => false, + ], + 'meta_data' => [ + 'openai' => [ + 'models' => [ + 'completion_model' => 'gpt-3.5-turbo', + ], + ], + ], + 'secrets' => [ + 'openai' => [ + 'api_key' => 'foobar', + ], + ], + 'user_id' => User::factory(), + ]; + } +} diff --git a/database/migrations/2024_06_11_183813_create_settings_table.php b/database/migrations/2024_06_11_183813_create_settings_table.php new file mode 100644 index 00000000..19d1607f --- /dev/null +++ b/database/migrations/2024_06_11_183813_create_settings_table.php @@ -0,0 +1,31 @@ +id(); + $table->json('steps')->nullable(); + $table->json('meta_data')->nullable(); + $table->longText('secrets')->nullable(); + $table->foreignIdFor(\App\Models\User::class)->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('settings'); + } +}; diff --git a/resources/js/Components/ActionMessage.vue b/resources/js/Components/ActionMessage.vue index 59741485..87d1d758 100644 --- a/resources/js/Components/ActionMessage.vue +++ b/resources/js/Components/ActionMessage.vue @@ -7,7 +7,7 @@ defineProps({