mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 14:42:26 -05:00 
			
		
		
		
	mess about with some structure to help w/ deref
This commit is contained in:
		
					parent
					
						
							
								18c39ad23d
							
						
					
				
			
			
				commit
				
					
						f2041f9be3
					
				
			
		
					 13 changed files with 594 additions and 402 deletions
				
			
		
							
								
								
									
										151
									
								
								internal/federation/dereference.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								internal/federation/dereference.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,151 @@ | |||
| package federation | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"net/url" | ||||
| 
 | ||||
| 	"github.com/go-fed/activity/streams" | ||||
| 	"github.com/go-fed/activity/streams/vocab" | ||||
| 	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" | ||||
| 	"github.com/superseriousbusiness/gotosocial/internal/typeutils" | ||||
| ) | ||||
| 
 | ||||
| func (f *federator) DereferenceRemoteAccount(username string, remoteAccountID *url.URL) (typeutils.Accountable, error) { | ||||
| 
 | ||||
| 	transport, err := f.GetTransportForUser(username) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("transport err: %s", err) | ||||
| 	} | ||||
| 
 | ||||
| 	b, err := transport.Dereference(context.Background(), remoteAccountID) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("error deferencing %s: %s", remoteAccountID.String(), err) | ||||
| 	} | ||||
| 
 | ||||
| 	m := make(map[string]interface{}) | ||||
| 	if err := json.Unmarshal(b, &m); err != nil { | ||||
| 		return nil, fmt.Errorf("error unmarshalling bytes into json: %s", err) | ||||
| 	} | ||||
| 
 | ||||
| 	t, err := streams.ToType(context.Background(), m) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("error resolving json into ap vocab type: %s", err) | ||||
| 	} | ||||
| 
 | ||||
| 	switch t.GetTypeName() { | ||||
| 	case string(gtsmodel.ActivityStreamsPerson): | ||||
| 		p, ok := t.(vocab.ActivityStreamsPerson) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("error resolving type as activitystreams person") | ||||
| 		} | ||||
| 		return p, nil | ||||
| 	case string(gtsmodel.ActivityStreamsApplication): | ||||
| 		p, ok := t.(vocab.ActivityStreamsApplication) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("error resolving type as activitystreams application") | ||||
| 		} | ||||
| 		return p, nil | ||||
| 	case string(gtsmodel.ActivityStreamsService): | ||||
| 		p, ok := t.(vocab.ActivityStreamsService) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("error resolving type as activitystreams service") | ||||
| 		} | ||||
| 		return p, nil | ||||
| 	} | ||||
| 
 | ||||
| 	return nil, fmt.Errorf("type name %s not supported", t.GetTypeName()) | ||||
| } | ||||
| 
 | ||||
| func (f *federator) DereferenceRemoteStatus(username string, remoteStatusID *url.URL) (typeutils.Statusable, error) { | ||||
| 	transport, err := f.GetTransportForUser(username) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("transport err: %s", err) | ||||
| 	} | ||||
| 
 | ||||
| 	b, err := transport.Dereference(context.Background(), remoteStatusID) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("error deferencing %s: %s", remoteStatusID.String(), err) | ||||
| 	} | ||||
| 
 | ||||
| 	m := make(map[string]interface{}) | ||||
| 	if err := json.Unmarshal(b, &m); err != nil { | ||||
| 		return nil, fmt.Errorf("error unmarshalling bytes into json: %s", err) | ||||
| 	} | ||||
| 
 | ||||
| 	t, err := streams.ToType(context.Background(), m) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("error resolving json into ap vocab type: %s", err) | ||||
| 	} | ||||
| 
 | ||||
| 	// Article, Document, Image, Video, Note, Page, Event, Place, Mention, Profile | ||||
| 	switch t.GetTypeName() { | ||||
| 	case gtsmodel.ActivityStreamsArticle: | ||||
| 		p, ok := t.(vocab.ActivityStreamsArticle) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("error resolving type as ActivityStreamsArticle") | ||||
| 		} | ||||
| 		return p, nil | ||||
| 	case gtsmodel.ActivityStreamsDocument: | ||||
| 		p, ok := t.(vocab.ActivityStreamsDocument) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("error resolving type as ActivityStreamsDocument") | ||||
| 		} | ||||
| 		return p, nil | ||||
| 	case gtsmodel.ActivityStreamsImage: | ||||
| 		p, ok := t.(vocab.ActivityStreamsImage) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("error resolving type as ActivityStreamsImage") | ||||
| 		} | ||||
| 		return p, nil | ||||
| 	case gtsmodel.ActivityStreamsVideo: | ||||
| 		p, ok := t.(vocab.ActivityStreamsVideo) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("error resolving type as ActivityStreamsVideo") | ||||
| 		} | ||||
| 		return p, nil | ||||
| 	case gtsmodel.ActivityStreamsNote: | ||||
| 		p, ok := t.(vocab.ActivityStreamsNote) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("error resolving type as ActivityStreamsNote") | ||||
| 		} | ||||
| 		return p, nil | ||||
| 	case gtsmodel.ActivityStreamsPage: | ||||
| 		p, ok := t.(vocab.ActivityStreamsPage) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("error resolving type as ActivityStreamsPage") | ||||
| 		} | ||||
| 		return p, nil | ||||
| 	case gtsmodel.ActivityStreamsEvent: | ||||
| 		p, ok := t.(vocab.ActivityStreamsEvent) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("error resolving type as ActivityStreamsEvent") | ||||
| 		} | ||||
| 		return p, nil | ||||
| 	case gtsmodel.ActivityStreamsPlace: | ||||
| 		p, ok := t.(vocab.ActivityStreamsPlace) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("error resolving type as ActivityStreamsPlace") | ||||
| 		} | ||||
| 		return p, nil | ||||
| 	case gtsmodel.ActivityStreamsProfile: | ||||
| 		p, ok := t.(vocab.ActivityStreamsProfile) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("error resolving type as ActivityStreamsProfile") | ||||
| 		} | ||||
| 		return p, nil | ||||
| 	} | ||||
| 
 | ||||
| 	return nil, fmt.Errorf("type name %s not supported", t.GetTypeName()) | ||||
| } | ||||
| 
 | ||||
| func (f *federator) DereferenceRemoteInstance(username string, remoteInstanceURI *url.URL) (*gtsmodel.Instance, error) { | ||||
| 	transport, err := f.GetTransportForUser(username) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("transport err: %s", err) | ||||
| 	} | ||||
| 
 | ||||
| 	return transport.DereferenceInstance(context.Background(), remoteInstanceURI) | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue