@@ -313,7 +313,7 @@ func serve(cctx *cli.Context) error {
313
313
e .GET ("/profile/:handleOrDID/known-followers" , server .WebGeneric )
314
314
e .GET ("/profile/:handleOrDID/search" , server .WebGeneric )
315
315
e .GET ("/profile/:handleOrDID/lists/:rkey" , server .WebGeneric )
316
- e .GET ("/profile/:handleOrDID/feed/:rkey" , server .WebGeneric )
316
+ e .GET ("/profile/:handleOrDID/feed/:rkey" , server .WebFeed )
317
317
e .GET ("/profile/:handleOrDID/feed/:rkey/liked-by" , server .WebGeneric )
318
318
e .GET ("/profile/:handleOrDID/labeler/liked-by" , server .WebGeneric )
319
319
@@ -603,6 +603,57 @@ func (srv *Server) WebProfile(c echo.Context) error {
603
603
return c .Render (http .StatusOK , "profile.html" , data )
604
604
}
605
605
606
+ func (srv * Server ) WebFeed (c echo.Context ) error {
607
+ ctx := c .Request ().Context ()
608
+ data := srv .NewTemplateContext ()
609
+
610
+ // sanity check arguments. don't 4xx, just let app handle if not expected format
611
+ rkeyParam := c .Param ("rkey" )
612
+ rkey , err := syntax .ParseRecordKey (rkeyParam )
613
+ if err != nil {
614
+ return c .Render (http .StatusOK , "feed.html" , data )
615
+ }
616
+ handleOrDIDParam := c .Param ("handleOrDID" )
617
+ handleOrDID , err := syntax .ParseAtIdentifier (handleOrDIDParam )
618
+ if err != nil {
619
+ return c .Render (http .StatusOK , "feed.html" , data )
620
+ }
621
+
622
+ identifier := handleOrDID .Normalize ().String ()
623
+
624
+ // requires two fetches: first fetch profile to get DID
625
+ pv , err := appbsky .ActorGetProfile (ctx , srv .xrpcc , identifier )
626
+ if err != nil {
627
+ log .Warnf ("failed to fetch profile for: %s\t %v" , identifier , err )
628
+ return c .Render (http .StatusOK , "feed.html" , data )
629
+ }
630
+ unauthedViewingOkay := true
631
+ for _ , label := range pv .Labels {
632
+ if label .Src == pv .Did && label .Val == "!no-unauthenticated" {
633
+ unauthedViewingOkay = false
634
+ }
635
+ }
636
+
637
+ if ! unauthedViewingOkay {
638
+ return c .Render (http .StatusOK , "feed.html" , data )
639
+ }
640
+ did := pv .Did
641
+ data ["did" ] = did
642
+
643
+ // then fetch the feed generator
644
+ feedURI := fmt .Sprintf ("at://%s/app.bsky.feed.generator/%s" , did , rkey )
645
+ fgv , err := appbsky .FeedGetFeedGenerator (ctx , srv .xrpcc , feedURI )
646
+ if err != nil {
647
+ log .Warnf ("failed to fetch feed generator: %s\t %v" , feedURI , err )
648
+ return c .Render (http .StatusOK , "feed.html" , data )
649
+ }
650
+ req := c .Request ()
651
+ data ["feedView" ] = fgv .View
652
+ data ["requestURI" ] = fmt .Sprintf ("https://%s%s" , req .Host , req .URL .Path )
653
+
654
+ return c .Render (http .StatusOK , "feed.html" , data )
655
+ }
656
+
606
657
type IPCCRequest struct {
607
658
IP string `json:"ip"`
608
659
}
0 commit comments