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 zcmb1E6ldr;wC(0+qmFhDq4t9XMv;D-S1mP}q<(+1NBGwpkv!rCg594NM(mjOuUF~b z?59tnzlAi=)kkfL?D&Fk3;7Ce2<$=iSG#m*I%FE8n9s|_mp!*WQ~f|>8?8~4N9 zdKdi?zKA*e;bVC)ZMn_!Y0D2pnq*!*`FqalZAFuk8_yUpS=xzC;+XR9s3vztY2c%; z!po%%IS*X1NNp|Nb?>9dPMth|J@y#xDjBtQLE9d;>a8r-j_~Ywf4us6n{h!<)$Av1 ziC?cJF1Y+#nD6mTt8jkrYxjNQFDF>{ZT%sYZKYGzpcHgiF|WL6V%duSt3OvyjoaDR ze(mAL@QRon5hlwxL$VrkoDa$U+-2Q8ZFwWx??s{C`|iKL$S12d)#2b;_xqUvmj8S@ ze(U)0?SJUGU5?}D+w6r#7F=7!CV!mSrWDj0Gui4~DDRT1jV!UxSao07{BvsVzT%J@ zpWhm=U4Ff5e9y@W?L9f)7ERdD@pRfdS@`-Oc6Q}fW-yySaTa4Gg7Lfe3 zYk8Zi{+S)t;%16V>|TY)hkx23m)G-k#aG73p8f@MCz>q!J@uBk;tjPgzR5igE*$=! z^RnWX)81f*TOH!@N0Jqt10T$FQH$M@GjG}KHml|~uPq0r?fRMfe?zs`x08yN^A2*x zY>BCAx*v9AtKsSZr=xpLEYy~Lvu*Fm|8ZUKyR6#04&E0(`s|$B5(DSmN*zEsNJx;@c#GvSKRbZDDO0z z9FREaCkLC~)AWKPS2;O%n|~@e^F?IU8o5umm-uUO#yl}!BAd@p^ykfuIXcR7-$$NG zxn$8C8oOfR^2DNs8L~$6ZT@Wh$?r4mf>BEQf9APs{6B3x8J&DWXwAWW(H=KEow?U= zHD|Lf3>08|)z6@2Bwa3*y=k}d%6$RW+S_{ z!KV4si+A#0r^c&ATKsMCHVf6+wINdI<*F&FAN?0SZ)mWa|F0-@`YXe|3-h$)|1YgQ z_vYZydxw-<+@CSV%h%URR8*HNS?1Qc_v)48i*~YqPkqt$zGQS_>m}<4x8ASVTV2e} zX+6(=>!kwWO=Z>f;Sz_%r{90Meb?4Q9LAr5d<~Os@w|5uU-e<~o#>^1Y*$=4v-fAY z#00g%n2j+Pnd&djpSE1|=*eJb&e|@u#{TpRTDdhW?)7%36a3R0HG;Z!Olh6?U-i+p zMbAGyIVsP&VU1Rrk=^9OM_)Eg-n@0svG@rYc3IaxK3Vkqi}AHSdG03r7{>{3Crv+l z@oRVU=e>NLt4ljy&n@Z6`ez*|a(M1ieWxSV%>}L93l%dw4n0}0#vnB1=XHVSi%O;} z`*HkL;hJcHS28{;lx`i`?(yr~H2)8*p+`)oU$f^3aI~N2^tb+IyQf`LuGOqFdC88i z4ZPUizPb^1ekl)|=V8;e<2*FFDfW}w1wjXOp1(VxFb^^2@Y>epxgt_LlsEfh2=Qub+KHPV~ZvRnFw2s;xc}!jR8yN1LI@rJOndB3dSzDfcpRRxFRA(KF@j{Nf zA9r>zH!c#D+_Yf5p7)-b7Z1IB7!#MQ7k}vbc(J|nob>DI9M%zBl`?AWg0@|4N>Yug zhRk`NPX1`}xA)!pzss?@nF*7Bcnlq_4p%uCQi*3*8_Zw&e4#rO&#n zLYKJvZ9c{3vs*52`kCi5%}sK-Q`xz4aj3v*O%7y z%lxmc_^!~v=!RofaJ0hSocWK>B=i^iN&Pa?3Yw7gMCR!{G1Cue%t|J!j!rtV<9y7V z$x{xL-e1u<;rjb^Rr(r}KSf1c%W;)iD3{#3Z0Gmlb84!E*|U^AzDjc45q@!M-kvkX zJpFP>DdF|v454`rR<0hEcUGjGOQ|#Vv3$KSth(p<|M>4oEv4`NJzjA0OVDK|kChdl zT8)_`mE_i|yt&f3^wo-$yPnDzX->Rd~~b*&G+lfmM{3GsPW_Uf*S!hdk*$q=8+F=CLg^_+HoV_^D_6ck!JW|du*O~rXrT5{>j}w-@LeZ*3&C2cH&1($n%KkN%d0BAX;jmZdcJrBiAvR{G$~u+r ze*XV&t-Nw%>W^xP32HBQBrT0P_u=fHlb_be%xPA8P_grkU($2otZcnYr_>AnEKiqw zqbSy*v~-4dq(r5>>h@6M!;`Pq$XuATXvWDO9_M(M8~dKT_DQN#24>{_no1eo&!v{hSD^Wvl*W2c5oGDkQFOqw@KKa|K2wEc~7; ztSz+fXdC@cwqlob6+UXu)BpICQ^4~CC&7ul`s?R zr&}j@iFwa+IKro;)Z$d>wd{my?f#Cr0-H>(OB{Q + @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(); + } }