Files
dockerank2/app/Http/Controllers/SuperAdmin/SystemController.php
T
2026-09-01 07:49:48 -03:00

211 lines
7.3 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers\SuperAdmin;
use App\Http\Controllers\Controller;
use App\Models\Subject;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class SystemController extends Controller
{
public function index()
{
$stats = [
"total_users" => \App\Models\User::count(),
"active_users" => \App\Models\User::where("is_active", true)->count(),
"pending_users" => \App\Models\User::where("is_approved", false)->count(),
"total_subjects" => Subject::count(),
"total_insights" => \App\Models\Insight::count(),
];
$subjects = Subject::all();
$aiDefaultProvider = \App\Models\Setting::where('key', 'ai_default_provider')->value('value');
$aiDefaultModel = \App\Models\Setting::where('key', 'ai_default_model')->value('value');
if (!$aiDefaultProvider) {
$aiDefaultProvider = config('services.ai.default_provider', 'openrouter');
}
if (!$aiDefaultModel) {
$aiDefaultModel = config('services.ai.providers.'.$aiDefaultProvider.'.model', 'inclusionai/ling-3.0-tiny:free');
}
$chatDefaultProvider = \App\Models\Setting::where('key', 'chat_default_provider')->value('value');
$chatDefaultModel = \App\Models\Setting::where('key', 'chat_default_model')->value('value');
if (!$chatDefaultProvider) {
$chatDefaultProvider = config('services.ai.default_provider', 'openrouter');
}
if (!$chatDefaultModel) {
$chatDefaultModel = config('services.ai.providers.'.$chatDefaultProvider.'.model', 'inclusionai/ling-3.0-tiny:free');
}
return view("superadmin.system.index", compact(
"stats",
"subjects",
"aiDefaultProvider",
"aiDefaultModel",
"chatDefaultProvider",
"chatDefaultModel"
));
}
public function updateAiSettings(Request $request): RedirectResponse
{
$request->validate([
"ai_default_provider" => ["required", "string", "max:50"],
"ai_default_model" => ["required", "string", "max:255"],
]);
$provider = $request->input("ai_default_provider");
$model = $request->input("ai_default_model");
\App\Models\Setting::updateOrCreate(
["key" => "ai_default_provider"],
["value" => $provider, "type" => "string"]
);
\App\Models\Setting::updateOrCreate(
["key" => "ai_default_model"],
["value" => $model, "type" => "string"]
);
return back()->with("success", __("AI settings updated successfully."));
}
public function updateChatSettings(Request $request): RedirectResponse
{
$request->validate([
"chat_default_provider" => ["required", "string", "max:50"],
"chat_default_model" => ["required", "string", "max:255"],
]);
$provider = $request->input("chat_default_provider");
$model = $request->input("chat_default_model");
\App\Models\Setting::updateOrCreate(
["key" => "chat_default_provider"],
["value" => $provider, "type" => "string"]
);
\App\Models\Setting::updateOrCreate(
["key" => "chat_default_model"],
["value" => $model, "type" => "string"]
);
return back()->with("success", __("Chat AI settings updated successfully."));
}
public function createSubject(Request $request)
{
$request->validate([
"name" => ["required", "string", "max:255"],
"description" => ["nullable", "string"],
"introduction" => ["nullable", "string"],
]);
Subject::create([
"user_id" => null,
"name" => $request->name,
"description" => $request->description,
"introduction" => $request->introduction,
"is_system" => true,
"is_active" => true,
]);
return back()->with("success", "System subject created successfully.");
}
public function updateSubject(Request $request, Subject $subject)
{
$request->validate([
"name" => ["required", "string", "max:255"],
"description" => ["nullable", "string"],
"introduction" => ["nullable", "string"],
"is_active" => ["boolean"],
]);
$subject->update($request->only("name", "description", "introduction", "is_active"));
return back()->with("success", "System subject updated successfully.");
}
public function destroySubject(Subject $subject)
{
$subject->delete();
return back()->with("success", "System subject deleted successfully.");
}
public function generateAiSubject(Request $request): RedirectResponse
{
$request->validate([
"theme" => ["required", "string", "max:255"],
]);
$theme = $request->input("theme");
$prompt = "Crie um assunto de aprendizado e treinamento sobre o tema: {$theme}. Retorne APENAS um objeto JSON válido (sem texto adicional, sem markdown, sem code blocks) com os campos: name (string, máximo 255 caracteres, formato: 'Aprendizado e Treinamento de [Tema]'), description (string, máximo 1000 caracteres), introduction (string, máximo 5000 caracteres). Todo o conteúdo deve estar em Português do Brasil. O assunto deve ser educativo, prático e adequado para geração de insights de aprendizagem pela IA.";
/** @var \App\Services\AIService $ai */
$ai = app(\App\Services\AIService::class);
$result = $ai->generateInsight($theme, $prompt, ["language" => "pt_BR"]);
if (!$result["success"]) {
return back()->with("error", __("Failed to generate subject: :error", ["error" => $result["error"] ?? __("Unknown error")]));
}
$content = $result["content"];
$data = $this->extractJsonFromAiResponse($content);
if (!$data || !isset($data["name"])) {
$data = [
"name" => "Aprendizado e Treinamento de {$theme}",
"description" => $theme,
"introduction" => $content,
];
}
Subject::create([
"user_id" => null,
"name" => $data["name"],
"description" => $data["description"] ?? null,
"introduction" => $data["introduction"] ?? null,
"is_system" => true,
"is_active" => true,
]);
return back()->with("success", __("System subject generated successfully."));
}
private function extractJsonFromAiResponse(string $content): ?array
{
$content = trim($content);
if (str_starts_with($content, "```")) {
$content = preg_replace("/^```(?:json)?\s*/", "", $content);
$content = preg_replace("/\s*```$/", "", $content);
}
$data = json_decode($content, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($data)) {
return $data;
}
if (preg_match("/\{.*\}/s", $content, $matches)) {
$data = json_decode($matches[0], true);
if (json_last_error() === JSON_ERROR_NONE && is_array($data)) {
return $data;
}
}
return null;
}
}