First Commit
This commit is contained in:
+210
@@ -0,0 +1,210 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user