2021-06-04 12:16:29 +00:00
package status
import (
"errors"
"fmt"
apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model"
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
)
func ( p * processor ) FavedBy ( account * gtsmodel . Account , targetStatusID string ) ( [ ] * apimodel . Account , gtserror . WithCode ) {
l := p . log . WithField ( "func" , "StatusFavedBy" )
l . Tracef ( "going to search for target status %s" , targetStatusID )
targetStatus := & gtsmodel . Status { }
if err := p . db . GetByID ( targetStatusID , targetStatus ) ; err != nil {
return nil , gtserror . NewErrorNotFound ( fmt . Errorf ( "error fetching status %s: %s" , targetStatusID , err ) )
}
l . Tracef ( "going to search for target account %s" , targetStatus . AccountID )
targetAccount := & gtsmodel . Account { }
if err := p . db . GetByID ( targetStatus . AccountID , targetAccount ) ; err != nil {
return nil , gtserror . NewErrorNotFound ( fmt . Errorf ( "error fetching target account %s: %s" , targetStatus . AccountID , err ) )
}
l . Trace ( "going to get relevant accounts" )
relevantAccounts , err := p . db . PullRelevantAccountsFromStatus ( targetStatus )
if err != nil {
return nil , gtserror . NewErrorNotFound ( fmt . Errorf ( "error fetching related accounts for status %s: %s" , targetStatusID , err ) )
}
l . Trace ( "going to see if status is visible" )
2021-06-04 14:35:58 +00:00
visible , err := p . db . StatusVisible ( targetStatus , account , relevantAccounts ) // requestingAccount might well be nil here, but StatusVisible knows how to take care of that
2021-06-04 12:16:29 +00:00
if err != nil {
return nil , gtserror . NewErrorNotFound ( fmt . Errorf ( "error seeing if status %s is visible: %s" , targetStatus . ID , err ) )
}
if ! visible {
return nil , gtserror . NewErrorNotFound ( errors . New ( "status is not visible" ) )
}
// get ALL accounts that faved a status -- doesn't take account of blocks and mutes and stuff
favingAccounts , err := p . db . WhoFavedStatus ( targetStatus )
if err != nil {
return nil , gtserror . NewErrorNotFound ( fmt . Errorf ( "error seeing who faved status: %s" , err ) )
}
// filter the list so the user doesn't see accounts they blocked or which blocked them
filteredAccounts := [ ] * gtsmodel . Account { }
for _ , acc := range favingAccounts {
blocked , err := p . db . Blocked ( account . ID , acc . ID )
if err != nil {
return nil , gtserror . NewErrorInternalError ( fmt . Errorf ( "error checking blocks: %s" , err ) )
}
if ! blocked {
filteredAccounts = append ( filteredAccounts , acc )
}
}
// TODO: filter other things here? suspended? muted? silenced?
// now we can return the masto representation of those accounts
mastoAccounts := [ ] * apimodel . Account { }
for _ , acc := range filteredAccounts {
mastoAccount , err := p . tc . AccountToMastoPublic ( acc )
if err != nil {
return nil , gtserror . NewErrorInternalError ( fmt . Errorf ( "error converting status %s to frontend representation: %s" , targetStatus . ID , err ) )
}
mastoAccounts = append ( mastoAccounts , mastoAccount )
}
return mastoAccounts , nil
}