diff --git a/app/Http/Controllers/App/FeedController.php b/app/Http/Controllers/App/FeedController.php
new file mode 100644
index 00000000..8171c06d
--- /dev/null
+++ b/app/Http/Controllers/App/FeedController.php
@@ -0,0 +1,61 @@
+with('user')->get();
+ $meta = [
+ 'title' => 'LinkAce Links',
+ 'link' => $request->fullUrl(),
+ 'updated' => now()->toRfc3339String(),
+ 'id' => $request->fullUrl(),
+ ];
+
+ return new Response(view('actions.feed.links', [
+ 'meta' => $meta,
+ 'links' => $links,
+ ]), 200, ['Content-Type' => 'application/xml']);
+ }
+
+ public function lists(Request $request)
+ {
+ $lists = LinkList::latest()->with('user')->get();
+ $meta = [
+ 'title' => 'LinkAce Lists',
+ 'link' => $request->fullUrl(),
+ 'updated' => now()->toRfc3339String(),
+ 'id' => $request->fullUrl(),
+ ];
+
+ return new Response(view('actions.feed.lists', [
+ 'meta' => $meta,
+ 'lists' => $lists,
+ ]), 200, ['Content-Type' => 'application/xml']);
+ }
+
+ public function tags(Request $request)
+ {
+ $tags = Tag::latest()->with('user')->get();
+ $meta = [
+ 'title' => 'LinkAce Links',
+ 'link' => $request->fullUrl(),
+ 'updated' => now()->toRfc3339String(),
+ 'id' => $request->fullUrl(),
+ ];
+
+ return new Response(view('actions.feed.tags', [
+ 'meta' => $meta,
+ 'tags' => $tags,
+ ]), 200, ['Content-Type' => 'application/xml']);
+ }
+}
diff --git a/app/Http/Controllers/Guest/FeedController.php b/app/Http/Controllers/Guest/FeedController.php
index 3a45affc..00ed6542 100644
--- a/app/Http/Controllers/Guest/FeedController.php
+++ b/app/Http/Controllers/Guest/FeedController.php
@@ -21,7 +21,7 @@ class FeedController extends Controller
'id' => $request->fullUrl(),
];
- return new Response(view('guest.links.feed', [
+ return new Response(view('actions.feed.links', [
'meta' => $meta,
'links' => $links,
]), 200, ['Content-Type' => 'application/xml']);
@@ -37,7 +37,7 @@ class FeedController extends Controller
'id' => $request->fullUrl(),
];
- return new Response(view('guest.lists.feed', [
+ return new Response(view('actions.feed.lists', [
'meta' => $meta,
'lists' => $lists,
]), 200, ['Content-Type' => 'application/xml']);
@@ -53,7 +53,7 @@ class FeedController extends Controller
'id' => $request->fullUrl(),
];
- return new Response(view('guest.tags.feed', [
+ return new Response(view('actions.feed.tags', [
'meta' => $meta,
'tags' => $tags,
]), 200, ['Content-Type' => 'application/xml']);
diff --git a/resources/views/guest/links/feed.blade.php b/resources/views/actions/feed/links.blade.php
similarity index 89%
rename from resources/views/guest/links/feed.blade.php
rename to resources/views/actions/feed/links.blade.php
index 0b7e8171..02b91130 100644
--- a/resources/views/guest/links/feed.blade.php
+++ b/resources/views/actions/feed/links.blade.php
@@ -6,8 +6,9 @@
{{ $meta['id'] }}
@foreach($links as $link)
- title }}]]>
{{ $link->url }}
+ title }}]]>
+
user->name }}]]>
diff --git a/resources/views/guest/lists/feed.blade.php b/resources/views/actions/feed/lists.blade.php
similarity index 81%
rename from resources/views/guest/lists/feed.blade.php
rename to resources/views/actions/feed/lists.blade.php
index 2d872167..53e37063 100644
--- a/resources/views/guest/lists/feed.blade.php
+++ b/resources/views/actions/feed/lists.blade.php
@@ -6,9 +6,9 @@
{{ $meta['id'] }}
@foreach($lists as $list)
+ {{ route('lists.show', ['list' => $list]) }}
name }}]]>
-
- {{ url($list->id) }}
+
user->name }}]]>
diff --git a/resources/views/guest/tags/feed.blade.php b/resources/views/actions/feed/tags.blade.php
similarity index 88%
rename from resources/views/guest/tags/feed.blade.php
rename to resources/views/actions/feed/tags.blade.php
index 5a490a94..4b9d87e4 100644
--- a/resources/views/guest/tags/feed.blade.php
+++ b/resources/views/actions/feed/tags.blade.php
@@ -6,8 +6,9 @@
{{ $meta['id'] }}
@foreach($tags as $tag)
- name }}]]>
{{ route('tags.show', ['tag' => $tag]) }}
+ name }}]]>
+
user->name }}]]>
diff --git a/routes/web.php b/routes/web.php
index 49984202..952ae121 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -3,6 +3,7 @@
use App\Http\Controllers\App\BookmarkletController;
use App\Http\Controllers\App\DashboardController;
use App\Http\Controllers\App\ExportController;
+use App\Http\Controllers\App\FeedController;
use App\Http\Controllers\App\ImportController;
use App\Http\Controllers\App\SearchController;
use App\Http\Controllers\App\SystemSettingsController;
@@ -11,7 +12,7 @@ use App\Http\Controllers\App\UserSettingsController;
use App\Http\Controllers\CronController;
use App\Http\Controllers\FetchController;
use App\Http\Controllers\FrontController;
-use App\Http\Controllers\Guest\FeedController;
+use App\Http\Controllers\Guest\FeedController as GuestFeedController;
use App\Http\Controllers\Guest\LinkController as GuestLinkController;
use App\Http\Controllers\Guest\ListController as GuestListController;
use App\Http\Controllers\Guest\TagController as GuestTagController;
@@ -54,6 +55,12 @@ Route::prefix('bookmarklet')->group(function () {
Route::get('cron/{token}', CronController::class)->name('cron');
+Route::group(['middleware' => 'auth:api'], function () {
+ Route::get('links/feed', [FeedController::class, 'links'])->name('links.feed');
+ Route::get('lists/feed', [FeedController::class, 'lists'])->name('lists.feed');
+ Route::get('tags/feed', [FeedController::class, 'tags'])->name('tags.feed');
+});
+
// Model routes
Route::group(['middleware' => ['auth']], function () {
Route::get('dashboard', [DashboardController::class, 'index'])
@@ -130,9 +137,9 @@ Route::group(['middleware' => ['auth']], function () {
// Guest access routes
Route::prefix('guest')->middleware(['guestaccess'])->group(function () {
- Route::get('links/feed', [FeedController::class, 'links'])->name('guest.links.feed');
- Route::get('lists/feed', [FeedController::class, 'lists'])->name('guest.lists.feed');
- Route::get('tags/feed', [FeedController::class, 'tags'])->name('guest.tags.feed');
+ Route::get('links/feed', [GuestFeedController::class, 'links'])->name('guest.links.feed');
+ Route::get('lists/feed', [GuestFeedController::class, 'lists'])->name('guest.lists.feed');
+ Route::get('tags/feed', [GuestFeedController::class, 'tags'])->name('guest.tags.feed');
Route::resource('links', GuestLinkController::class)
->only(['index'])
diff --git a/tests/Controller/App/FeedControllerTest.php b/tests/Controller/App/FeedControllerTest.php
new file mode 100644
index 00000000..867b69bc
--- /dev/null
+++ b/tests/Controller/App/FeedControllerTest.php
@@ -0,0 +1,75 @@
+user = User::factory()->create();
+ }
+
+ public function testUnauthorizedRequest(): void
+ {
+ $response = $this->get('links/feed');
+
+ $response->assertRedirect('login');
+ }
+
+ public function testLinksFeed(): void
+ {
+ $link = Link::factory()->create();
+
+ $response = $this->getAuthorized('links/feed');
+
+ $response->assertOk()
+ ->assertSee($link->url);
+ }
+
+ public function testListsFeed(): void
+ {
+ $list = LinkList::factory()->create();
+
+ $response = $this->getAuthorized('lists/feed');
+
+ $response->assertOk()
+ ->assertSee($list->name);
+ }
+
+ public function testTagsFeed(): void
+ {
+ $tag = Tag::factory()->create();
+
+ $response = $this->getAuthorized('tags/feed');
+
+ $response->assertOk()
+ ->assertSee($tag->name);
+ }
+
+ /**
+ * Send an authorized request for the GET method.
+ *
+ * @param string $uri
+ * @param array $headers
+ * @return TestResponse
+ */
+ public function getAuthorized(string $uri, array $headers = []): TestResponse
+ {
+ $headers['Authorization'] = 'Bearer ' . $this->user->api_token;
+ return $this->get($uri, $headers);
+ }
+}