From ba9330cdf1f3f6b47bf0a1e8e4e5e655b4102c8a Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Tue, 19 Dec 2023 17:12:49 +0000 Subject: [PATCH] Expose RSS feed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Though actually its the json feed 🤫 --- app/Http/Controllers/FeedsController.php | 2 +- public/assets/app.css | 2 +- public/assets/app.css.br | Bin 1333 -> 1365 bytes resources/css/colours.css | 6 ++++++ resources/css/layout.css | 7 +++++++ resources/css/variables.css | 1 + resources/views/icons/rss.blade.php | 13 +++++++++++++ resources/views/master.blade.php | 1 + tests/Feature/FeedsTest.php | 11 +++++++++++ 9 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 resources/views/icons/rss.blade.php diff --git a/app/Http/Controllers/FeedsController.php b/app/Http/Controllers/FeedsController.php index c2738378..5d0aa8d3 100644 --- a/app/Http/Controllers/FeedsController.php +++ b/app/Http/Controllers/FeedsController.php @@ -102,7 +102,7 @@ class FeedsController extends Controller */ public function notesJson(): array { - $notes = Note::latest()->with('media')->take(20)->get(); + $notes = Note::latest()->with('media', 'place')->take(20)->get(); $data = [ 'version' => 'https://jsonfeed.org/version/1', 'title' => 'The JSON Feed for ' . config('user.display_name') . '’s notes', diff --git a/public/assets/app.css b/public/assets/app.css index fc94aaab..600807cc 100644 --- a/public/assets/app.css +++ b/public/assets/app.css @@ -1 +1 @@ -:root{--font-family-headings:"Archer SSm A","Archer SSm B",serif;--font-family-body:"Verlag A","Verlag B",sans-serif;--font-family-monospace:"Operator Mono SSm A","Operator Mono SSm B",monospace;--font-size-sm:0.75rem;--font-size-base:1rem;--font-size-md:1.25rem;--font-size-lg:1.5rem;--font-size-xl:1.75rem;--font-size-xxl:2rem;--font-size-xxxl:2.25rem;--color-primary:#334700;--color-secondary:#e3ffb7;--color-link:#00649e;--color-link-visited:#bc7aff;--color-primary-shadow:rgba(16,25,0,.4)}@supports (color:color(display-p3 0 0 0)){:root{--color-primary:color(display-p3 0.21567 0.27838 0.03615)}}@supports (color:oklab(0% 0 0)){:root{--color-primary:oklch(36.8% 0.1 125.505deg)}}@supports (color:color(display-p3 0 0 0)){:root{--color-secondary:color(display-p3 0.91016 0.99842 0.74082)}}@supports (color:oklab(0% 0 0)){:root{--color-secondary:oklch(96.3% 0.1 125.505deg)}}@supports (color:color(display-p3 0 0 0)){:root{--color-link:color(display-p3 0.01045 0.38351 0.63618)}}@supports (color:oklab(0% 0 0)){:root{--color-link:oklch(48.09% 0.146 241.41deg)}}@supports (color:color(display-p3 0 0 0)){:root{--color-link-visited:color(display-p3 0.70467 0.47549 0.99958)}}@supports (color:oklab(0% 0 0)){:root{--color-link-visited:oklch(70.44% 0.21 304.41deg)}}@supports (color:color(display-p3 0 0 0)){:root{--color-primary-shadow:color(display-p3 0.06762 0.09646 0.00441/0.4)}}@supports (color:oklab(0% 0 0)){:root{--color-primary-shadow:oklch(19.56% 0.054 125.505deg/40%)}}body{background-color:var(--color-secondary);color:var(--color-primary);font-family:var(--font-family-body);font-size:var(--font-size-md)}code{font-family:var(--font-family-monospace)}h1,h2,h3,h4,h5,h6{font-family:var(--font-family-headings)}.grid{display:grid;grid-template-columns:5vw 1fr 5vw;grid-template-rows:-webkit-min-content 1fr -webkit-min-content;grid-template-rows:min-content 1fr min-content;row-gap:1rem}#site-header{grid-column:2/3;grid-row:1/2}main{grid-column:2/3;grid-row:2/3}.h-feed{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:2rem}.h-entry h1:first-of-type,.h-entry p:first-of-type{-webkit-margin-before:0;margin-block-start:0}.pagination{-webkit-margin-before:1rem;margin-block-start:1rem}footer{grid-column:2/3;grid-row:3/4}footer .iwc-logo{max-width:85vw}footer .footer-actions{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;gap:1rem}a{color:var(--color-link)}a:visited{color:var(--color-link-visited)}#site-header a:visited,a.auth:visited{color:var(--color-link)}.hljs{border-radius:.5rem}.h-card .hovercard{background-color:var(--color-secondary);border-radius:1rem;-webkit-box-shadow:0 .5rem .5rem .5rem var(--color-primary-shadow);box-shadow:0 .5rem .5rem .5rem var(--color-primary-shadow);display:none;opacity:0;padding:1rem;position:absolute;-webkit-transition:opacity .5s ease-in-out;transition:opacity .5s ease-in-out;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;z-index:100;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:.5rem}.h-card .hovercard .u-photo{max-width:6rem}.h-card .hovercard .social-icon{height:1rem;width:1rem}.h-card:hover .hovercard{display:-webkit-box;display:-ms-flexbox;display:flex;opacity:1}.h-entry{-webkit-border-start:1px solid var(--color-primary);border-inline-start:1px solid var(--color-primary);-webkit-padding-start:.5rem;padding-inline-start:.5rem}.h-entry .reply-to{font-style:italic}.h-entry .post-info a{text-decoration:none}.h-entry .note-metadata{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;gap:1rem}.h-entry .note-metadata .likes,.h-entry .note-metadata .replies,.h-entry .note-metadata .reposts{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;gap:.5rem;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.h-entry .note-metadata .syndication-links{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.h-entry .note-metadata .syndication-links a{text-decoration:none}.h-entry .note-metadata .syndication-links a svg{height:1rem;width:1rem}.feather{height:24px;width:24px;stroke:currentcolor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;fill:none}.sr-only{clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}main>.u-comment{-webkit-margin-before:2rem;margin-block-start:2rem;-webkit-margin-start:2rem;margin-inline-start:2rem;-webkit-border-start:1px solid var(--color-primary);border-inline-start:1px solid var(--color-primary);-webkit-padding-start:.5rem;padding-inline-start:.5rem}main>.u-comment .mini-h-card{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}main>.u-comment .mini-h-card .u-photo{border-radius:50%;height:2rem;width:2rem;-webkit-margin-after:.5rem;margin-block-end:.5rem}main .notes-subtitle{font-size:1.2rem;font-weight:600}main .webmentions-author-list{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;gap:1rem}main .webmentions-author-list img{border-radius:50%;height:4rem;width:4rem} +:root{--font-family-headings:"Archer SSm A","Archer SSm B",serif;--font-family-body:"Verlag A","Verlag B",sans-serif;--font-family-monospace:"Operator Mono SSm A","Operator Mono SSm B",monospace;--font-size-sm:0.75rem;--font-size-base:1rem;--font-size-md:1.25rem;--font-size-lg:1.5rem;--font-size-xl:1.75rem;--font-size-xxl:2rem;--font-size-xxxl:2.25rem;--color-primary:#334700;--color-secondary:#e3ffb7;--color-link:#00649e;--color-link-visited:#bc7aff;--color-primary-shadow:rgba(16,25,0,.4);--rss-color-link:#f26522}@supports (color:color(display-p3 0 0 0)){:root{--color-primary:color(display-p3 0.21567 0.27838 0.03615)}}@supports (color:oklab(0% 0 0)){:root{--color-primary:oklch(36.8% 0.1 125.505deg)}}@supports (color:color(display-p3 0 0 0)){:root{--color-secondary:color(display-p3 0.91016 0.99842 0.74082)}}@supports (color:oklab(0% 0 0)){:root{--color-secondary:oklch(96.3% 0.1 125.505deg)}}@supports (color:color(display-p3 0 0 0)){:root{--color-link:color(display-p3 0.01045 0.38351 0.63618)}}@supports (color:oklab(0% 0 0)){:root{--color-link:oklch(48.09% 0.146 241.41deg)}}@supports (color:color(display-p3 0 0 0)){:root{--color-link-visited:color(display-p3 0.70466 0.4755 0.99958)}}@supports (color:oklab(0% 0 0)){:root{--color-link-visited:oklch(70.44% 0.21 304.41deg)}}@supports (color:color(display-p3 0 0 0)){:root{--color-primary-shadow:color(display-p3 0.06762 0.09646 0.00441/0.4)}}@supports (color:oklab(0% 0 0)){:root{--color-primary-shadow:oklch(19.56% 0.054 125.505deg/40%);--rss-color-link:oklch(67.59% 0.189 42.04deg)}}body{background-color:var(--color-secondary);color:var(--color-primary);font-family:var(--font-family-body);font-size:var(--font-size-md)}code{font-family:var(--font-family-monospace)}h1,h2,h3,h4,h5,h6{font-family:var(--font-family-headings)}.grid{display:grid;grid-template-columns:5vw 1fr 5vw;grid-template-rows:-webkit-min-content 1fr -webkit-min-content;grid-template-rows:min-content 1fr min-content;row-gap:1rem}#site-header{grid-column:2/3;grid-row:1/2}#site-header .rss-icon svg{color:var(--rss-color-link);height:1rem;width:auto}main{grid-column:2/3;grid-row:2/3}.h-feed{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:2rem}.h-entry h1:first-of-type,.h-entry p:first-of-type{-webkit-margin-before:0;margin-block-start:0}.pagination{-webkit-margin-before:1rem;margin-block-start:1rem}footer{grid-column:2/3;grid-row:3/4}footer .iwc-logo{max-width:85vw}footer .footer-actions{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;gap:1rem}a{color:var(--color-link)}a:visited{color:var(--color-link-visited)}#site-header a:visited,a.auth:visited{color:var(--color-link)}.hljs{border-radius:.5rem}.h-card .hovercard{background-color:var(--color-secondary);border-radius:1rem;-webkit-box-shadow:0 .5rem .5rem .5rem var(--color-primary-shadow);box-shadow:0 .5rem .5rem .5rem var(--color-primary-shadow);display:none;opacity:0;padding:1rem;position:absolute;-webkit-transition:opacity .5s ease-in-out;transition:opacity .5s ease-in-out;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;z-index:100;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:.5rem}.h-card .hovercard .u-photo{max-width:6rem}.h-card .hovercard .social-icon{height:1rem;width:1rem}.h-card:hover .hovercard{display:-webkit-box;display:-ms-flexbox;display:flex;opacity:1}.h-entry{-webkit-border-start:1px solid var(--color-primary);border-inline-start:1px solid var(--color-primary);-webkit-padding-start:.5rem;padding-inline-start:.5rem}.h-entry .reply-to{font-style:italic}.h-entry .post-info a{text-decoration:none}.h-entry .note-metadata{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;gap:1rem}.h-entry .note-metadata .likes,.h-entry .note-metadata .replies,.h-entry .note-metadata .reposts{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;gap:.5rem;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.h-entry .note-metadata .syndication-links{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.h-entry .note-metadata .syndication-links a{text-decoration:none}.h-entry .note-metadata .syndication-links a svg{height:1rem;width:1rem}.feather{height:24px;width:24px;stroke:currentcolor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;fill:none}.sr-only{clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}main>.u-comment{-webkit-margin-before:2rem;margin-block-start:2rem;-webkit-margin-start:2rem;margin-inline-start:2rem;-webkit-border-start:1px solid var(--color-primary);border-inline-start:1px solid var(--color-primary);-webkit-padding-start:.5rem;padding-inline-start:.5rem}main>.u-comment .mini-h-card{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}main>.u-comment .mini-h-card .u-photo{border-radius:50%;height:2rem;width:2rem;-webkit-margin-after:.5rem;margin-block-end:.5rem}main .notes-subtitle{font-size:1.2rem;font-weight:600}main .webmentions-author-list{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;gap:1rem}main .webmentions-author-list img{border-radius:50%;height:4rem;width:4rem} diff --git a/public/assets/app.css.br b/public/assets/app.css.br index 1c6315eb78f45b46b359c40cbcc5272c1e7889e1..6336f875a5afff00865196f0499ab516db244f67 100644 GIT binary patch literal 1365 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 + @if($title){{ $title }}@endif + + + + diff --git a/resources/views/master.blade.php b/resources/views/master.blade.php index b6361cb7..17ffe915 100644 --- a/resources/views/master.blade.php +++ b/resources/views/master.blade.php @@ -47,6 +47,7 @@ Likes Contacts Projects + @include('icons.rss', ['title' => 'RSS Feed']) diff --git a/tests/Feature/FeedsTest.php b/tests/Feature/FeedsTest.php index 4ca49b90..481218b7 100644 --- a/tests/Feature/FeedsTest.php +++ b/tests/Feature/FeedsTest.php @@ -6,6 +6,7 @@ namespace Tests\Feature; use App\Models\Article; use App\Models\Note; +use App\Models\Place; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; @@ -159,4 +160,14 @@ class FeedsTest extends TestCase } } } + + /** @test */ + public function jsonNoteFeedLoadsPlaceDataWithoutLazyLoading(): void + { + $place = Place::factory()->create(); + Note::factory()->create(['note' => null, 'place_id' => $place->id]); + $response = $this->get('/notes/feed.json'); + + $response->assertOk(); + } }