2023-03-12 16:00:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// GoToSocial  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Copyright (C) GoToSocial Authors admin@gotosocial.org  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// SPDX-License-Identifier: AGPL-3.0-or-later  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// This program is free software: you can redistribute it and/or modify  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// it under the terms of the GNU Affero General Public License as published by  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// the Free Software Foundation, either version 3 of the License, or  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// (at your option) any later version.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// This program is distributed in the hope that it will be useful,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// but WITHOUT ANY WARRANTY; without even the implied warranty of  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// GNU Affero General Public License for more details.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// You should have received a copy of the GNU Affero General Public License  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// along with this program.  If not, see <http://www.gnu.org/licenses/>.  
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								package  fedi  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"context" 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:52:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"errors" 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"net/http" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"net/url" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-03-02 12:48:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"codeberg.org/superseriousbusiness/activity/streams/vocab" 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-06 13:16:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/ap" 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/db" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/gtserror" 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/log" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/paging" 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/typeutils" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/util" 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:52:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// InboxPost handles POST requests to a user's inbox for new activitypub messages.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// InboxPost returns true if the request was handled as an ActivityPub POST to an actor's inbox.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// If false, the request was not an ActivityPub request and may still be handled by the caller in another way, such as serving a web page.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// If the error is nil, then the ResponseWriter's headers and response has already been written. If a non-nil error is returned, then no response has been written.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// If the Actor was constructed with the Federated Protocol enabled, side effects will occur.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// If the Federated Protocol is not enabled, writes the http.StatusMethodNotAllowed status code in the response. No side effects occur.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( p  * Processor )  InboxPost ( ctx  context . Context ,  w  http . ResponseWriter ,  r  * http . Request )  ( bool ,  error )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  p . federator . FederatingActor ( ) . PostInbox ( ctx ,  w ,  r ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// OutboxGet returns the serialized ActivityPub  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// collection of a local account's outbox, which  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// contains links to PUBLIC posts by this account.  
						 
					
						
							
								
									
										
										
										
											2023-11-20 12:22:28 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( p  * Processor )  OutboxGet (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx  context . Context , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									requestedUser  string , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									page  * paging . Page , 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 12:22:28 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								)  ( interface { } ,  gtserror . WithCode )  {  
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Authenticate incoming request, getting related accounts. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									auth ,  errWithCode  :=  p . authenticate ( ctx ,  requestedUser ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  errWithCode  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil ,  errWithCode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									receivingAcct  :=  auth . receivingAcct 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Parse the collection ID object from account's followers URI. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									collectionID ,  err  :=  url . Parse ( receivingAcct . OutboxURI ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err  :=  gtserror . Newf ( "error parsing account outbox uri %s: %w" ,  receivingAcct . OutboxURI ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Ensure we have stats for this account. 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-02 12:15:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  err  :=  p . state . DB . PopulateAccountStats ( ctx ,  receivingAcct ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err  :=  gtserror . Newf ( "error getting stats for account %s: %w" ,  receivingAcct . ID ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:52:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									var  obj  vocab . Type 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Start the AS collection params. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  params  ap . CollectionParams 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									params . ID  =  collectionID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  * receivingAcct . Settings . HideCollections  || 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										receivingAcct . IsInstance ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// If account that hides collections, or instance 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// account (ie., can't post / have relationships), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// just return barest stub of collection. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										obj  =  ap . NewASOrderedCollection ( params ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  page  ==  nil  ||  auth . handshakingURI  !=  nil : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// If paging disabled, or we're currently handshaking 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// the requester, just return collection that links 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// to first page (i.e. path below), with no items. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										params . Total  =  util . Ptr ( * receivingAcct . Stats . StatusesCount ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										params . First  =  new ( paging . Page ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										params . Query  =  make ( url . Values ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										params . Query . Set ( "limit" ,  "40" )  // enables paging 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										obj  =  ap . NewASOrderedCollection ( params ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Paging enabled. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Get page of full public statuses. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										statuses ,  err  :=  p . state . DB . GetAccountStatuses ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ctx , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											receivingAcct . ID , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											page . GetLimit ( ) ,  // limit 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											true ,             // excludeReplies 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											true ,             // excludeReblogs 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											page . GetMax ( ) ,    // maxID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											page . GetMin ( ) ,    // minID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											false ,            // mediaOnly 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											true ,             // publicOnly 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  err  !=  nil  &&  ! errors . Is ( err ,  db . ErrNoEntries )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											err  :=  gtserror . Newf ( "error getting statuses: %w" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:52:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// page ID values. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										var  lo ,  hi  string 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  len ( statuses )  >  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Get the lowest and highest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// ID values, used for paging. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											lo  =  statuses [ len ( statuses ) - 1 ] . ID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											hi  =  statuses [ 0 ] . ID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:52:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-22 19:47:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Reslice statuses dropping all those invisible to requester 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// (eg., local-only statuses, if the requester is remote). 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										statuses ,  err  =  p . visFilter . StatusesVisible ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ctx , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											auth . requestingAcct , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											statuses , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											err  :=  gtserror . Newf ( "error filtering statuses: %w" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Start building AS collection page params. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										params . Total  =  util . Ptr ( * receivingAcct . Stats . StatusesCount ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										var  pageParams  ap . CollectionPageParams 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . CollectionParams  =  params 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Current page details. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . Current  =  page 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . Count  =  len ( statuses ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Set linked next/prev parameters. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . Next  =  page . Next ( lo ,  hi ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . Prev  =  page . Prev ( lo ,  hi ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Set the collection item property builder function. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . Append  =  func ( i  int ,  itemsProp  ap . ItemsPropertyBuilder )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Get status at index. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											status  :=  statuses [ i ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Derive statusable from status. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											statusable ,  err  :=  p . converter . StatusToAS ( ctx ,  status ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												log . Errorf ( ctx ,  "error converting %s to statusable: %v" ,  status . URI ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Derive create from statusable, using the IRI only. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											create  :=  typeutils . WrapStatusableInCreate ( statusable ,  true ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Add to item property. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											itemsProp . AppendActivityStreamsCreate ( create ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Build AS collection page object from params. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										obj  =  ap . NewASOrderedCollectionPage ( pageParams ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 12:22:28 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Serialize the prepared object. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									data ,  err  :=  ap . Serialize ( obj ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:52:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										err  :=  gtserror . Newf ( "error serializing: %w" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:52:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  data ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// FollowersGet returns the serialized ActivityPub  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// collection of a local account's followers collection,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// which contains links to accounts following this account.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( p  * Processor )  FollowersGet (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx  context . Context , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									requestedUser  string , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									page  * paging . Page , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  ( interface { } ,  gtserror . WithCode )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Authenticate incoming request, getting related accounts. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									auth ,  errWithCode  :=  p . authenticate ( ctx ,  requestedUser ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:52:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  errWithCode  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil ,  errWithCode 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									receivingAcct  :=  auth . receivingAcct 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Parse the collection ID object from account's followers URI. 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									collectionID ,  err  :=  url . Parse ( receivingAcct . FollowersURI ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										err  :=  gtserror . Newf ( "error parsing account followers uri %s: %w" ,  receivingAcct . FollowersURI ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-16 13:10:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Ensure we have stats for this account. 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-02 12:15:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  err  :=  p . state . DB . PopulateAccountStats ( ctx ,  receivingAcct ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err  :=  gtserror . Newf ( "error getting stats for account %s: %w" ,  receivingAcct . ID ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  obj  vocab . Type 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 12:22:28 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Start the AS collection params. 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									var  params  ap . CollectionParams 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									params . ID  =  collectionID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 11:42:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  receivingAcct . IsInstance ( )  || 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* receivingAcct . Settings . HideCollections : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// If account that hides collections, or instance 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// account (ie., can't post / have relationships), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// just return barest stub of collection. 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 11:42:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										obj  =  ap . NewASOrderedCollection ( params ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  page  ==  nil  ||  auth . handshakingURI  !=  nil : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// If paging disabled, or we're currently handshaking 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// the requester, just return collection that links 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// to first page (i.e. path below), with no items. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										params . Total  =  util . Ptr ( * receivingAcct . Stats . FollowersCount ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 11:42:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										params . First  =  new ( paging . Page ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 12:22:28 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										params . Query  =  make ( url . Values ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										params . Query . Set ( "limit" ,  "40" )  // enables paging 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										obj  =  ap . NewASOrderedCollection ( params ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 11:42:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Paging enabled. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Get page of full follower objects with attached accounts. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										followers ,  err  :=  p . state . DB . GetAccountFollowers ( ctx ,  receivingAcct . ID ,  page ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											err  :=  gtserror . Newf ( "error getting followers: %w" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 12:22:28 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// page ID values. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										var  lo ,  hi  string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  len ( followers )  >  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Get the lowest and highest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// ID values, used for paging. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											lo  =  followers [ len ( followers ) - 1 ] . ID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											hi  =  followers [ 0 ] . ID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Start building AS collection page params. 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										params . Total  =  util . Ptr ( * receivingAcct . Stats . FollowersCount ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										var  pageParams  ap . CollectionPageParams 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . CollectionParams  =  params 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Current page details. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . Current  =  page 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . Count  =  len ( followers ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Set linked next/prev parameters. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . Next  =  page . Next ( lo ,  hi ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . Prev  =  page . Prev ( lo ,  hi ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Set the collection item property builder function. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . Append  =  func ( i  int ,  itemsProp  ap . ItemsPropertyBuilder )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Get follower URI at index. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											follow  :=  followers [ i ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											accURI  :=  follow . Account . URI 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Parse URL object from URI. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											iri ,  err  :=  url . Parse ( accURI ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												log . Errorf ( ctx ,  "error parsing account uri %s: %v" ,  accURI ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Add to item property. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											itemsProp . AppendIRI ( iri ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Build AS collection page object from params. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										obj  =  ap . NewASOrderedCollectionPage ( pageParams ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Serialize the prepared object. 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									data ,  err  :=  ap . Serialize ( obj ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										err  :=  gtserror . Newf ( "error serializing: %w" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  data ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// FollowingGet returns the serialized ActivityPub  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// collection of a local account's following collection,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// which contains links to accounts followed by this account.  
						 
					
						
							
								
									
										
										
										
											2023-11-20 12:22:28 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( p  * Processor )  FollowingGet ( ctx  context . Context ,  requestedUser  string ,  page  * paging . Page )  ( interface { } ,  gtserror . WithCode )  {  
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Authenticate incoming request, getting related accounts. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									auth ,  errWithCode  :=  p . authenticate ( ctx ,  requestedUser ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  errWithCode  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil ,  errWithCode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									receivingAcct  :=  auth . receivingAcct 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 12:22:28 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Parse collection ID from account's following URI. 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									collectionID ,  err  :=  url . Parse ( receivingAcct . FollowingURI ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										err  :=  gtserror . Newf ( "error parsing account following uri %s: %w" ,  receivingAcct . FollowingURI ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-16 13:10:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Ensure we have stats for this account. 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-02 12:15:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  err  :=  p . state . DB . PopulateAccountStats ( ctx ,  receivingAcct ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err  :=  gtserror . Newf ( "error getting stats for account %s: %w" ,  receivingAcct . ID ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  obj  vocab . Type 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 12:22:28 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Start AS collection params. 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									var  params  ap . CollectionParams 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									params . ID  =  collectionID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 11:42:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  receivingAcct . IsInstance ( )  || 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* receivingAcct . Settings . HideCollections : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// If account that hides collections, or instance 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// account (ie., can't post / have relationships), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// just return barest stub of collection. 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 11:42:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										obj  =  ap . NewASOrderedCollection ( params ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  page  ==  nil  ||  auth . handshakingURI  !=  nil : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// If paging disabled, or we're currently handshaking 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// the requester, just return collection that links 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// to first page (i.e. path below), with no items. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										params . Total  =  util . Ptr ( * receivingAcct . Stats . FollowingCount ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 11:42:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										params . First  =  new ( paging . Page ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 12:22:28 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										params . Query  =  make ( url . Values ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										params . Query . Set ( "limit" ,  "40" )  // enables paging 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										obj  =  ap . NewASOrderedCollection ( params ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 11:42:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Paging enabled. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Get page of full follower objects with attached accounts. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										follows ,  err  :=  p . state . DB . GetAccountFollows ( ctx ,  receivingAcct . ID ,  page ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											err  :=  gtserror . Newf ( "error getting follows: %w" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 12:22:28 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// page ID values. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										var  lo ,  hi  string 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 12:22:28 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  len ( follows )  >  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Get the lowest and highest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// ID values, used for paging. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											lo  =  follows [ len ( follows ) - 1 ] . ID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											hi  =  follows [ 0 ] . ID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Start AS collection page params. 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										params . Total  =  util . Ptr ( * receivingAcct . Stats . FollowingCount ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										var  pageParams  ap . CollectionPageParams 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . CollectionParams  =  params 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Current page details. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . Current  =  page 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . Count  =  len ( follows ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Set linked next/prev parameters. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . Next  =  page . Next ( lo ,  hi ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . Prev  =  page . Prev ( lo ,  hi ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Set the collection item property builder function. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pageParams . Append  =  func ( i  int ,  itemsProp  ap . ItemsPropertyBuilder )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 12:10:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Get followed URI at index. 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											follow  :=  follows [ i ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 12:10:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											accURI  :=  follow . TargetAccount . URI 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Parse URL object from URI. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											iri ,  err  :=  url . Parse ( accURI ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												log . Errorf ( ctx ,  "error parsing account uri %s: %v" ,  accURI ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Add to item property. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											itemsProp . AppendIRI ( iri ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Build AS collection page object from params. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										obj  =  ap . NewASOrderedCollectionPage ( pageParams ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Serialize the prepared object. 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									data ,  err  :=  ap . Serialize ( obj ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-20 16:49:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										err  :=  gtserror . Newf ( "error serializing: %w" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  data ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:52:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// FeaturedCollectionGet returns an ordered collection of the requested username's Pinned posts.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// The returned collection have an `items` property which contains an ordered list of status URIs.  
						 
					
						
							
								
									
										
										
										
											2023-11-20 12:22:28 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( p  * Processor )  FeaturedCollectionGet ( ctx  context . Context ,  requestedUser  string )  ( interface { } ,  gtserror . WithCode )  {  
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Authenticate incoming request, getting related accounts. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									auth ,  errWithCode  :=  p . authenticate ( ctx ,  requestedUser ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  errWithCode  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil ,  errWithCode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									receivingAcct  :=  auth . receivingAcct 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									statuses ,  err  :=  p . state . DB . GetAccountPinnedStatuses ( ctx ,  receivingAcct . ID ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:52:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ! errors . Is ( err ,  db . ErrNoEntries )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 11:54:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									collection ,  err  :=  p . converter . StatusesToASFeaturedCollection ( ctx ,  receivingAcct . FeaturedCollectionURI ,  statuses ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:52:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-09 12:16:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									data ,  err  :=  ap . Serialize ( collection ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil ,  gtserror . NewErrorInternalError ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  data ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}