fedi-feed-router/backend/app/Http/Controllers/Api/V1/LanguagesController.php

147 lines
4.1 KiB
PHP
Raw Normal View History

2025-08-16 10:09:38 +02:00
<?php
namespace App\Http\Controllers\Api\V1;
use Domains\Settings\Models\Language;
2025-08-16 10:47:50 +02:00
use Domains\Settings\Services\LanguageService;
2025-08-16 10:09:38 +02:00
use Illuminate\Http\JsonResponse;
2025-08-16 10:47:50 +02:00
use Illuminate\Http\Request;
2025-08-16 10:09:38 +02:00
class LanguagesController extends BaseController
{
2025-08-16 10:47:50 +02:00
public function __construct(
private LanguageService $languageService
) {}
2025-08-16 10:09:38 +02:00
/**
* Get languages available for route creation
* Returns languages that have both active feeds and active channels
*/
public function availableForRoutes(): JsonResponse
{
2025-08-16 10:47:50 +02:00
$languages = $this->languageService->getAvailableForRoutes();
2025-08-16 10:09:38 +02:00
return $this->sendResponse(
$languages,
'Available languages for routes retrieved successfully.'
);
}
/**
* Get feeds filtered by language
*/
2025-08-16 10:47:50 +02:00
public function feedsByLanguage(Request $request, int $languageId): JsonResponse
2025-08-16 10:09:38 +02:00
{
2025-08-16 10:47:50 +02:00
$fields = $this->parseFields($request->get('fields'), [
'feeds.id', 'feeds.name', 'feeds.url', 'feeds.type', 'feeds.provider'
]);
2025-08-16 10:09:38 +02:00
2025-08-16 10:47:50 +02:00
$feeds = $this->languageService->getFeedsByLanguage(
$languageId,
$request->get('search'),
(int) $request->get('per_page', 15),
$fields
);
$language = Language::select(['name'])->findOrFail($languageId);
2025-08-16 10:09:38 +02:00
return $this->sendResponse(
$feeds,
"Feeds for language '{$language->name}' retrieved successfully."
);
}
/**
* Get channels filtered by language
*/
2025-08-16 10:47:50 +02:00
public function channelsByLanguage(Request $request, int $languageId): JsonResponse
2025-08-16 10:09:38 +02:00
{
2025-08-16 10:47:50 +02:00
$fields = $this->parseFields($request->get('fields'), [
'id', 'platform_instance_id', 'name', 'display_name', 'description', 'language_id'
]);
2025-08-16 10:09:38 +02:00
2025-08-16 10:47:50 +02:00
$channels = $this->languageService->getChannelsByLanguage(
$languageId,
$request->get('search'),
(int) $request->get('per_page', 15),
$fields
);
$language = Language::select(['name'])->findOrFail($languageId);
2025-08-16 10:09:38 +02:00
return $this->sendResponse(
$channels,
"Channels for language '{$language->name}' retrieved successfully."
);
}
2025-08-16 10:47:50 +02:00
/**
* Get language statistics
*/
public function statistics(int $languageId): JsonResponse
{
$stats = $this->languageService->getLanguageStatistics($languageId);
$language = Language::select(['name'])->findOrFail($languageId);
return $this->sendResponse(
$stats,
"Statistics for language '{$language->name}' retrieved successfully."
);
}
/**
* Get usage summary for all languages
*/
public function usageSummary(): JsonResponse
{
$summary = $this->languageService->getLanguageUsageSummary();
return $this->sendResponse(
$summary,
'Language usage summary retrieved successfully.'
);
}
/**
* Get common languages between feed and channel
*/
public function commonLanguages(Request $request): JsonResponse
{
$request->validate([
'feed_id' => 'required|exists:feeds,id',
'channel_id' => 'required|exists:platform_channels,id'
]);
$commonLanguages = $this->languageService->getCommonLanguages(
$request->get('feed_id'),
$request->get('channel_id')
);
return $this->sendResponse(
$commonLanguages,
'Common languages retrieved successfully.'
);
}
/**
* Parse field selection from request
*/
private function parseFields(?string $fieldsParam, array $defaultFields): array
{
if (!$fieldsParam) {
return $defaultFields;
}
$requestedFields = array_map('trim', explode(',', $fieldsParam));
$validFields = [];
foreach ($requestedFields as $field) {
if (in_array($field, $defaultFields) || str_contains($field, '.')) {
$validFields[] = $field;
}
}
return empty($validFields) ? $defaultFields : $validFields;
}
2025-08-16 10:09:38 +02:00
}