v1.1.0 Priorities 2-5: date seeding, new endpoints, BCC detection
Priority 2 — Date-time seeding:
- fetchFileHistory() for CurseForge, Modrinth, FTB
- seedCurrentVersion() matches release closest to server install date
- Falls back to latest if no history or no install date
Priority 3 — New endpoints:
- GET /servers/{server}/status — zero-click cached status
- GET /servers/{server}/releases — recalibrate dropdown (10 releases)
- POST /servers/{server}/calibrate — save user's version selection
- POST /servers/{server}/ignore — toggle is_ignored flag
Priority 5 — BCC log parsing:
- detectFromBccLog() reads logs/latest.log for BetterCompatibilityChecker
- Extracts modpack name + version from BCC output line
- Skips CHANGE_ME values
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
9991240eab
commit
b84958c0ee
@@ -287,4 +287,144 @@ class ModpackAPIController extends Controller
|
||||
|
||||
return response()->json($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get cached status for a single server (zero-click widget).
|
||||
* Reads from DB only — no external API calls.
|
||||
*/
|
||||
public function serverStatus(Request $request, Server $server): JsonResponse
|
||||
{
|
||||
$cached = DB::table('modpackchecker_servers')
|
||||
->where('server_uuid', $server->uuid)
|
||||
->first();
|
||||
|
||||
if (!$cached || $cached->is_ignored ?? false) {
|
||||
return response()->json([
|
||||
'configured' => false,
|
||||
'is_ignored' => $cached->is_ignored ?? false,
|
||||
]);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'configured' => !empty($cached->platform) && $cached->status !== 'unconfigured',
|
||||
'platform' => $cached->platform,
|
||||
'modpack_name' => $cached->modpack_name,
|
||||
'current_version' => $cached->current_version,
|
||||
'latest_version' => $cached->latest_version,
|
||||
'current_file_id' => $cached->current_file_id ?? null,
|
||||
'latest_file_id' => $cached->latest_file_id ?? null,
|
||||
'update_available' => $cached->status === 'update_available',
|
||||
'last_checked' => $cached->last_checked,
|
||||
'detection_method' => $cached->detection_method ?? 'unknown',
|
||||
'is_ignored' => $cached->is_ignored ?? false,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get release history for recalibrate dropdown.
|
||||
* Makes external API call — rate limited.
|
||||
*/
|
||||
public function releases(Request $request, Server $server): JsonResponse
|
||||
{
|
||||
$limitKey = 'modpack_releases_' . $server->uuid;
|
||||
if (RateLimiter::tooManyAttempts($limitKey, 2)) {
|
||||
$seconds = RateLimiter::availableIn($limitKey);
|
||||
return response()->json(['error' => "Too many requests. Wait {$seconds}s."], 429);
|
||||
}
|
||||
RateLimiter::hit($limitKey, 60);
|
||||
|
||||
$cached = DB::table('modpackchecker_servers')
|
||||
->where('server_uuid', $server->uuid)
|
||||
->first();
|
||||
|
||||
if (!$cached || empty($cached->platform) || empty($cached->modpack_id)) {
|
||||
return response()->json(['releases' => []]);
|
||||
}
|
||||
|
||||
$releases = $this->apiService->fetchFileHistory($cached->platform, $cached->modpack_id, 10);
|
||||
|
||||
return response()->json(['releases' => $releases]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Recalibrate current version (user selects from release list).
|
||||
* Sets is_user_overridden = true.
|
||||
*/
|
||||
public function calibrate(Request $request, Server $server): JsonResponse
|
||||
{
|
||||
$fileId = $request->input('file_id');
|
||||
$version = $request->input('version');
|
||||
|
||||
if (empty($version)) {
|
||||
return response()->json(['error' => 'version is required'], 400);
|
||||
}
|
||||
|
||||
$updated = DB::table('modpackchecker_servers')
|
||||
->where('server_uuid', $server->uuid)
|
||||
->update([
|
||||
'current_version' => $version,
|
||||
'current_file_id' => $fileId,
|
||||
'is_user_overridden' => true,
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
if (!$updated) {
|
||||
return response()->json(['error' => 'Server not found in modpack cache'], 404);
|
||||
}
|
||||
|
||||
// Re-evaluate update status
|
||||
$cached = DB::table('modpackchecker_servers')
|
||||
->where('server_uuid', $server->uuid)
|
||||
->first();
|
||||
|
||||
$updateAvailable = false;
|
||||
if ($cached->latest_file_id && $fileId) {
|
||||
$updateAvailable = $cached->latest_file_id !== $fileId;
|
||||
} else {
|
||||
$updateAvailable = $cached->latest_version !== $version;
|
||||
}
|
||||
|
||||
DB::table('modpackchecker_servers')
|
||||
->where('server_uuid', $server->uuid)
|
||||
->update([
|
||||
'status' => $updateAvailable ? 'update_available' : 'up_to_date',
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'current_version' => $version,
|
||||
'update_available' => $updateAvailable,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggle is_ignored flag for a server.
|
||||
*/
|
||||
public function toggleIgnore(Request $request, Server $server): JsonResponse
|
||||
{
|
||||
$existing = DB::table('modpackchecker_servers')
|
||||
->where('server_uuid', $server->uuid)
|
||||
->first();
|
||||
|
||||
if (!$existing) {
|
||||
// Create a record to track the ignore
|
||||
DB::table('modpackchecker_servers')->insert([
|
||||
'server_uuid' => $server->uuid,
|
||||
'is_ignored' => true,
|
||||
'status' => 'ignored',
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
return response()->json(['is_ignored' => true]);
|
||||
}
|
||||
|
||||
$newState = !($existing->is_ignored ?? false);
|
||||
DB::table('modpackchecker_servers')
|
||||
->where('server_uuid', $server->uuid)
|
||||
->update([
|
||||
'is_ignored' => $newState,
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
return response()->json(['is_ignored' => $newState]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user