Skip to content

Commit 4c99ec1

Browse files
committed
chore: update routes, factories, tests, and settings controllers
1 parent 937dc14 commit 4c99ec1

16 files changed

Lines changed: 1246 additions & 14 deletions

app/Http/Controllers/Settings/AiSettingsController.php

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public function testProvider(Request $request): JsonResponse
7070
if (! $config || empty($config->api_key)) {
7171
return response()->json([
7272
'success' => false,
73-
'message' => 'No API key configured for this provider. Save a key first.',
73+
'message' => 'No hay una clave API configurada para este proveedor. Guarda una clave primero.',
7474
], 422);
7575
}
7676

@@ -89,13 +89,13 @@ public function testProvider(Request $request): JsonResponse
8989

9090
return response()->json([
9191
'success' => true,
92-
'message' => "Connected successfully in {$duration}ms using {$model}.",
92+
'message' => "Conexión exitosa en {$duration}ms usando {$model}.",
9393
'duration_ms' => $duration,
9494
]);
9595
} catch (Throwable $throwable) {
9696
return response()->json([
9797
'success' => false,
98-
'message' => 'Connection failed: '.$throwable->getMessage(),
98+
'message' => 'Conexión fallida: '.$throwable->getMessage(),
9999
]);
100100
}
101101
}
@@ -141,7 +141,9 @@ public function updateProviders(Request $request): RedirectResponse
141141

142142
Cache::forget('ai_provider_keys');
143143

144-
return back()->with('toast', ['type' => 'success', 'message' => __('AI provider configs updated.')]);
144+
return back()->with('flash', [
145+
'toast' => ['type' => 'success', 'message' => __('Configuración de proveedores IA actualizada.')],
146+
]);
145147
}
146148

147149
public function editPrompt(): Response
@@ -152,7 +154,7 @@ public function editPrompt(): Response
152154
'prompt' => [
153155
'key' => 'sql_assistant',
154156
'content' => $prompt?->content ?? $this->defaultPrompt(),
155-
'description' => 'This prompt instructs the AI on how to generate SQL. Variables: {question} = user question, {tables} = allowed tables.',
157+
'description' => 'Este prompt le indica a la IA cómo generar SQL. Variables: {question} = pregunta del usuario, {tables} = tablas permitidas.',
156158
],
157159
]);
158160
}
@@ -167,13 +169,15 @@ public function updatePrompt(Request $request): RedirectResponse
167169
['key' => 'sql_assistant'],
168170
[
169171
'content' => $data['content'],
170-
'description' => 'SQL query assistant base system prompt.',
172+
'description' => 'Prompt base del sistema para el asistente de consultas SQL.',
171173
],
172174
);
173175

174176
Cache::forget('system_prompt.sql_assistant');
175177

176-
return back()->with('toast', ['type' => 'success', 'message' => __('System prompt updated.')]);
178+
return back()->with('flash', [
179+
'toast' => ['type' => 'success', 'message' => __('Prompt del sistema actualizado.')],
180+
]);
177181
}
178182

179183
private function defaultPrompt(): string
@@ -186,6 +190,7 @@ private function defaultPrompt(): string
186190
- Never generate INSERT, UPDATE, DELETE, DROP, ALTER, TRUNCATE, CREATE, REPLACE, GRANT, REVOKE, EXEC, EXECUTE, CALL, MERGE, or UPSERT.
187191
- Use only tables and columns available in the provided schema context.
188192
- Never invent tables, columns, or joins.
193+
- When joining tables, use the "Foreign keys (to allowed tables)" section in the schema context to determine correct JOIN conditions.
189194
- If context is insufficient, return a safe fallback SQL that selects from one allowed table with LIMIT.
190195
- Add LIMIT to row-level queries.
191196
- Return only valid structured output and keep explanations concise.

app/Http/Controllers/Settings/ProfileController.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public function update(ProfileUpdateRequest $request): RedirectResponse
3838

3939
$request->user()->save();
4040

41-
Inertia::flash('toast', ['type' => 'success', 'message' => __('Profile updated.')]);
41+
Inertia::flash('toast', ['type' => 'success', 'message' => __('Perfil actualizado correctamente.')]);
4242

4343
return to_route('profile.edit');
4444
}
@@ -57,6 +57,11 @@ public function destroy(ProfileDeleteRequest $request): RedirectResponse
5757
$request->session()->invalidate();
5858
$request->session()->regenerateToken();
5959

60-
return redirect('/');
60+
return redirect('/')->with('flash', [
61+
'toast' => [
62+
'type' => 'success',
63+
'message' => __('Cuenta eliminada correctamente.'),
64+
],
65+
]);
6166
}
6267
}

app/Http/Controllers/Settings/SecurityController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public function update(PasswordUpdateRequest $request): RedirectResponse
5555
'password' => $request->password,
5656
]);
5757

58-
Inertia::flash('toast', ['type' => 'success', 'message' => __('Password updated.')]);
58+
Inertia::flash('toast', ['type' => 'success', 'message' => __('Contraseña actualizada correctamente.')]);
5959

6060
return back();
6161
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace Database\Factories;
4+
5+
use App\Models\DatabaseConnection;
6+
use Illuminate\Database\Eloquent\Factories\Factory;
7+
8+
/**
9+
* @extends Factory<DatabaseConnection>
10+
*/
11+
class DatabaseConnectionFactory extends Factory
12+
{
13+
protected $model = DatabaseConnection::class;
14+
15+
public function definition(): array
16+
{
17+
return [
18+
'name' => fake()->unique()->word(),
19+
'driver' => 'pgsql',
20+
'host' => 'localhost',
21+
'port' => 5432,
22+
'database' => fake()->word(),
23+
'username' => 'postgres',
24+
'password' => 'secret',
25+
'ssl_enabled' => false,
26+
'is_active' => true,
27+
'max_rows' => 1000,
28+
'query_timeout_seconds' => 30,
29+
'last_tested_at' => null,
30+
'created_by' => null,
31+
];
32+
}
33+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace Database\Factories;
4+
5+
use App\Models\Permission;
6+
use Illuminate\Database\Eloquent\Factories\Factory;
7+
8+
/**
9+
* @extends Factory<Permission>
10+
*/
11+
class PermissionFactory extends Factory
12+
{
13+
protected $model = Permission::class;
14+
15+
public function definition(): array
16+
{
17+
return [
18+
'name' => fake()->unique()->word(),
19+
'key' => fake()->unique()->word(),
20+
];
21+
}
22+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
namespace Database\Factories;
4+
5+
use App\Models\QueryRun;
6+
use Illuminate\Database\Eloquent\Factories\Factory;
7+
8+
/**
9+
* @extends Factory<QueryRun>
10+
*/
11+
class QueryRunFactory extends Factory
12+
{
13+
protected $model = QueryRun::class;
14+
15+
public function definition(): array
16+
{
17+
return [
18+
'user_id' => null,
19+
'connection_id' => null,
20+
'sql' => fake()->sentence(),
21+
'normalized_sql' => null,
22+
'sql_hash' => null,
23+
'status' => 'success',
24+
'category' => null,
25+
'tags' => null,
26+
'note' => null,
27+
'is_favorite' => false,
28+
'duration_ms' => fake()->numberBetween(0, 5000),
29+
'rows_returned' => fake()->numberBetween(0, 100),
30+
'is_ai_generated' => false,
31+
'error_message' => null,
32+
'meta' => null,
33+
];
34+
}
35+
}

database/factories/RoleFactory.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace Database\Factories;
4+
5+
use App\Models\Role;
6+
use Illuminate\Database\Eloquent\Factories\Factory;
7+
8+
/**
9+
* @extends Factory<Role>
10+
*/
11+
class RoleFactory extends Factory
12+
{
13+
protected $model = Role::class;
14+
15+
public function definition(): array
16+
{
17+
return [
18+
'name' => fake()->unique()->word(),
19+
'key' => fake()->unique()->word(),
20+
];
21+
}
22+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace Database\Factories;
4+
5+
use App\Models\SavedQuery;
6+
use Illuminate\Database\Eloquent\Factories\Factory;
7+
8+
/**
9+
* @extends Factory<SavedQuery>
10+
*/
11+
class SavedQueryFactory extends Factory
12+
{
13+
protected $model = SavedQuery::class;
14+
15+
public function definition(): array
16+
{
17+
return [
18+
'user_id' => null,
19+
'connection_id' => null,
20+
'name' => fake()->words(3, true),
21+
'sql' => 'SELECT * FROM '.fake()->word(),
22+
'is_favorite' => false,
23+
'category' => null,
24+
'tags' => null,
25+
'note' => null,
26+
];
27+
}
28+
}

routes/web.php

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
<?php
22

33
use App\Http\Controllers\AccessControlController;
4+
use App\Http\Controllers\AiMemoryController;
45
use App\Http\Controllers\AuditController;
56
use App\Http\Controllers\BackupController;
67
use App\Http\Controllers\ChatController;
78
use App\Http\Controllers\ConnectionController;
9+
use App\Http\Controllers\ConversationController;
810
use App\Http\Controllers\ExportController;
911
use App\Http\Controllers\ExportQueueController;
1012
use App\Http\Controllers\QueryController;
13+
use App\Http\Controllers\QueryHistoryController;
14+
use App\Http\Controllers\SavedQueryController;
1115
use Illuminate\Support\Facades\Auth;
1216
use Illuminate\Support\Facades\Route;
1317

@@ -64,13 +68,59 @@
6468
Route::post('queries/ai-generate', [QueryController::class, 'aiGenerate'])
6569
->middleware(['monitor.permission:queries.ai_generate', 'throttle:monitor-sql-ai-generate'])
6670
->name('queries.ai-generate');
67-
Route::get('queries/history', [QueryController::class, 'history'])
68-
->middleware('monitor.permission:queries.execute')
69-
->name('queries.history');
7071
Route::post('queries/save', [QueryController::class, 'save'])
7172
->middleware('monitor.permission:queries.execute')
7273
->name('queries.save');
7374

75+
Route::get('queries/history', [QueryHistoryController::class, 'index'])
76+
->middleware('monitor.permission:queries.execute')
77+
->name('queries.history.index');
78+
Route::get('queries/history/{id}', [QueryHistoryController::class, 'show'])
79+
->middleware('monitor.permission:queries.execute')
80+
->name('queries.history.show');
81+
Route::put('queries/history/{id}', [QueryHistoryController::class, 'update'])
82+
->middleware('monitor.permission:queries.execute')
83+
->name('queries.history.update');
84+
Route::delete('queries/history/{id}', [QueryHistoryController::class, 'destroy'])
85+
->middleware('monitor.permission:queries.execute')
86+
->name('queries.history.destroy');
87+
88+
Route::get('queries/saved', [SavedQueryController::class, 'index'])
89+
->middleware('monitor.permission:queries.execute')
90+
->name('queries.saved.index');
91+
Route::post('queries/saved', [SavedQueryController::class, 'store'])
92+
->middleware('monitor.permission:queries.execute')
93+
->name('queries.saved.store');
94+
Route::put('queries/saved/{id}', [SavedQueryController::class, 'update'])
95+
->middleware('monitor.permission:queries.execute')
96+
->name('queries.saved.update');
97+
Route::delete('queries/saved/{id}', [SavedQueryController::class, 'destroy'])
98+
->middleware('monitor.permission:queries.execute')
99+
->name('queries.saved.destroy');
100+
101+
Route::get('conversations', [ConversationController::class, 'index'])
102+
->middleware('monitor.permission:queries.ai_generate')
103+
->name('conversations.index');
104+
Route::get('conversations/{id}', [ConversationController::class, 'show'])
105+
->middleware('monitor.permission:queries.ai_generate')
106+
->name('conversations.show');
107+
Route::put('conversations/{id}', [ConversationController::class, 'update'])
108+
->middleware('monitor.permission:queries.ai_generate')
109+
->name('conversations.update');
110+
Route::delete('conversations/{id}', [ConversationController::class, 'destroy'])
111+
->middleware('monitor.permission:queries.ai_generate')
112+
->name('conversations.destroy');
113+
114+
Route::get('ai-memory', [AiMemoryController::class, 'index'])
115+
->middleware('monitor.permission:queries.ai_generate')
116+
->name('ai-memory.index');
117+
Route::delete('ai-memory/{id}', [AiMemoryController::class, 'destroy'])
118+
->middleware('monitor.permission:queries.ai_generate')
119+
->name('ai-memory.destroy');
120+
Route::post('ai-memory/clear-all', [AiMemoryController::class, 'clearAll'])
121+
->middleware('monitor.permission:queries.ai_generate')
122+
->name('ai-memory.clear-all');
123+
74124
Route::post('exports', [ExportController::class, 'store'])
75125
->middleware('monitor.permission:queries.export')
76126
->name('exports.store');

0 commit comments

Comments
 (0)