cite_clasify/app/Http/Controllers/AnalysisController.php

236 lines
6.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\AnalysisResult;
use App\Models\Library;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Http;
class AnalysisController extends Controller
{
//
public function index()
{
$analisis = AnalysisResult::all();
return view("dashboard.analisis.index");
}
public function getData()
{
$user = Auth::user();
$results = [];
if ($user->role == 'admin') {
$results = AnalysisResult::with('user')->get();
} else {
$results = AnalysisResult::where('user_id', $user->id)->get();
}
return response()->json(
[
'data' => $results
]
);
}
public function save(Request $request)
{
$userId = Auth::user()->id;
AnalysisResult::create(
[
'user_id' => $userId,
'text' => $request->text,
'accuracy' => $request->accuracy,
'prediction' => $request->prediction
]
);
return response()->json(
[
'message' => 'Hasil analisis berhasil disimpan.',
'status' => 'success',
'data' => [
'user_id' => $userId,
'text' => $request->text,
'accuracy' => $request->accuracy,
'prediction' => $request->prediction
]
]
);
}
public function destroy(Request $request, $id)
{
AnalysisResult::where('id', $id)->delete();
return response()->json(
[
'success' => true,
'message' => 'berhasil menghapus data riwayat klasifikasi'
]
);
}
public function searchScopus(Request $request)
{
$results = collect();
$totalResults = 0;
$perPage = 10;
$currentPage = $request->get('page', 1);
$keyword = $request->get('keyword');
if ($keyword) {
$token = config('services.scopus.token');
$startIndex = ($currentPage - 1) * $perPage;
// Query gabungkan keyword dan bahasa Indonesia
$query = "KEY($keyword)+AND+language(indonesian)";
// Tambahkan sorting dari tahun terbaru (coverDate descending)
$url = "https://api.elsevier.com/content/search/scopus?query={$query}&apiKey={$token}&start={$startIndex}&count={$perPage}&sort=-coverDate";
$response = Http::withHeaders([
'Accept' => 'application/json',
'X-ELS-APIKey' => $token,
])->get($url);
if ($response->successful()) {
$data = $response->json();
$entries = $data['search-results']['entry'] ?? [];
$totalResults = (int) ($data['search-results']['opensearch:totalResults'] ?? 0);
$results = new LengthAwarePaginator(
$entries,
$totalResults,
$perPage,
$currentPage,
['path' => route('dashboard.scopus.search'), 'query' => ['keyword' => $keyword]]
);
}
}
return view('dashboard.scopus.index', compact('results', 'keyword'));
}
public function store(Request $request)
{
$doi = $request->input('doi');
if ($doi && Library::where('doi', $doi)->exists()) {
return back()->with('error', 'Artikel dengan DOI tersebut sudah ada di library.');
}
$data = $request->only([
'title',
'creator',
'journal',
'volume',
'issue',
'date',
'doi',
'citedby',
'affiliation_name',
'affiliation_city',
'affiliation_country',
'scopus_link',
]);
$data['user_id'] = Auth::id();
Library::create($data);
return back()->with('success', 'Artikel berhasil ditambahkan ke Library!');
}
public function entryJournal()
{
return view('dashboard.entry.index');
}
public function extractKeywords(Request $request)
{
if (!$request->hasFile('file')) {
return response()->json(['error' => 'No file uploaded'], 400);
}
$file = $request->file('file');
$filename = time() . '_' . $file->getClientOriginalName();
// Simpan file ke public/uploads
$file->move(public_path('uploads'), $filename);
$fullPath = public_path('uploads/' . $filename);
if (!file_exists($fullPath)) {
return response()->json(['error' => "File tidak ditemukan di $fullPath"], 500);
}
$extractResponse = Http::attach(
'file',
file_get_contents($fullPath),
$filename
)->post(env('BACKEND_URL') . '/extract-keywords');
if (!$extractResponse->successful()) {
return response()->json(['error' => 'Failed to extract keywords'], 500);
}
$keywords = $extractResponse->json('keywords');
if (empty($keywords)) {
return response()->json(['error' => 'No keywords found in document'], 404);
}
$query = implode(' OR ', array_map(function ($kw) {
return "\"$kw\"";
}, $keywords));
$token = config('services.scopus.token');
$perPage = 10;
$currentPage = $request->get('page', 1);
$startIndex = ($currentPage - 1) * $perPage;
$scopusQuery = "KEY($query)+AND+language(indonesian)";
$url = "https://api.elsevier.com/content/search/scopus?query={$scopusQuery}&apiKey={$token}&start={$startIndex}&count={$perPage}&sort=-coverDate";
$response = Http::withHeaders([
'Accept' => 'application/json',
'X-ELS-APIKey' => $token,
])->get($url);
if (!$response->successful()) {
return response()->json(['error' => 'Failed to fetch Scopus data'], 500);
}
$data = $response->json();
$entries = $data['search-results']['entry'] ?? [];
$totalResults = (int) ($data['search-results']['opensearch:totalResults'] ?? 0);
return response()->json([
'keywords' => $keywords,
'results' => $entries,
'totalResults' => $totalResults,
'perPage' => $perPage,
'currentPage' => $currentPage,
'data' => $data
]);
}
}