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

143 lines
4.2 KiB
PHP
Raw Normal View History

2025-08-02 15:20:09 +02:00
<?php
namespace App\Http\Controllers\Api\V1;
use App\Http\Requests\StoreFeedRequest;
use App\Http\Requests\UpdateFeedRequest;
use App\Http\Resources\FeedResource;
use App\Models\Feed;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;
class FeedsController extends BaseController
{
/**
* Display a listing of feeds
*/
public function index(Request $request): JsonResponse
{
2025-08-06 20:01:28 +02:00
$perPage = min($request->get('per_page', 15), 100);
$feeds = Feed::with(['language'])
->withCount('articles')
->orderBy('is_active', 'desc')
2025-08-02 15:20:09 +02:00
->orderBy('name')
2025-08-06 20:01:28 +02:00
->paginate($perPage);
2025-08-02 15:20:09 +02:00
2025-08-06 20:01:28 +02:00
return $this->sendResponse([
'feeds' => FeedResource::collection($feeds->items()),
'pagination' => [
'current_page' => $feeds->currentPage(),
'last_page' => $feeds->lastPage(),
'per_page' => $feeds->perPage(),
'total' => $feeds->total(),
'from' => $feeds->firstItem(),
'to' => $feeds->lastItem(),
]
], 'Feeds retrieved successfully.');
2025-08-02 15:20:09 +02:00
}
/**
* Store a newly created feed
*/
public function store(StoreFeedRequest $request): JsonResponse
{
try {
$validated = $request->validated();
$validated['is_active'] = $validated['is_active'] ?? true;
// Map provider to URL and set type
$providers = [
'vrt' => new \App\Services\Parsers\VrtHomepageParserAdapter(),
'belga' => new \App\Services\Parsers\BelgaHomepageParserAdapter(),
];
$adapter = $providers[$validated['provider']];
$validated['url'] = $adapter->getHomepageUrl();
$validated['type'] = 'website';
2025-08-02 15:20:09 +02:00
$feed = Feed::create($validated);
return $this->sendResponse(
new FeedResource($feed),
'Feed created successfully!',
201
);
} catch (ValidationException $e) {
return $this->sendValidationError($e->errors());
} catch (\Exception $e) {
return $this->sendError('Failed to create feed: ' . $e->getMessage(), [], 500);
}
}
/**
* Display the specified feed
*/
public function show(Feed $feed): JsonResponse
{
return $this->sendResponse(
new FeedResource($feed),
'Feed retrieved successfully.'
);
}
/**
* Update the specified feed
*/
public function update(UpdateFeedRequest $request, Feed $feed): JsonResponse
{
try {
$validated = $request->validated();
$validated['is_active'] = $validated['is_active'] ?? $feed->is_active;
$feed->update($validated);
return $this->sendResponse(
new FeedResource($feed->fresh()),
'Feed updated successfully!'
);
} catch (ValidationException $e) {
return $this->sendValidationError($e->errors());
} catch (\Exception $e) {
return $this->sendError('Failed to update feed: ' . $e->getMessage(), [], 500);
}
}
/**
* Remove the specified feed
*/
public function destroy(Feed $feed): JsonResponse
{
try {
$feed->delete();
return $this->sendResponse(
null,
'Feed deleted successfully!'
);
} catch (\Exception $e) {
return $this->sendError('Failed to delete feed: ' . $e->getMessage(), [], 500);
}
}
/**
* Toggle feed active status
*/
public function toggle(Feed $feed): JsonResponse
{
try {
$newStatus = !$feed->is_active;
$feed->update(['is_active' => $newStatus]);
$status = $newStatus ? 'activated' : 'deactivated';
return $this->sendResponse(
new FeedResource($feed->fresh()),
"Feed {$status} successfully!"
);
} catch (\Exception $e) {
return $this->sendError('Failed to toggle feed status: ' . $e->getMessage(), [], 500);
}
}
}