diff options
Diffstat (limited to 'internal/federation/federatingdb')
| -rw-r--r-- | internal/federation/federatingdb/announce.go | 73 | ||||
| -rw-r--r-- | internal/federation/federatingdb/db.go | 1 | ||||
| -rw-r--r-- | internal/federation/federatingdb/federating_db_test.go | 21 | ||||
| -rw-r--r-- | internal/federation/federatingdb/util.go | 13 | 
4 files changed, 108 insertions, 0 deletions
| diff --git a/internal/federation/federatingdb/announce.go b/internal/federation/federatingdb/announce.go new file mode 100644 index 000000000..322a4838f --- /dev/null +++ b/internal/federation/federatingdb/announce.go @@ -0,0 +1,73 @@ +package federatingdb + +import ( +	"context" +	"encoding/json" +	"fmt" + +	"github.com/go-fed/activity/streams" +	"github.com/go-fed/activity/streams/vocab" +	"github.com/sirupsen/logrus" +	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +	"github.com/superseriousbusiness/gotosocial/internal/util" +) + +func (f *federatingDB) Announce(ctx context.Context, announce vocab.ActivityStreamsAnnounce) error { +	l := f.log.WithFields( +		logrus.Fields{ +			"func": "Announce", +		}, +	) +	m, err := streams.Serialize(announce) +	if err != nil { +		return err +	} +	b, err := json.Marshal(m) +	if err != nil { +		return err +	} + +	l.Debugf("received ANNOUNCE %s", string(b)) + +	targetAcctI := ctx.Value(util.APAccount) +	if targetAcctI == nil { +		l.Error("target account wasn't set on context") +		return nil +	} +	targetAcct, ok := targetAcctI.(*gtsmodel.Account) +	if !ok { +		l.Error("target account was set on context but couldn't be parsed") +		return nil +	} + +	fromFederatorChanI := ctx.Value(util.APFromFederatorChanKey) +	if fromFederatorChanI == nil { +		l.Error("from federator channel wasn't set on context") +		return nil +	} +	fromFederatorChan, ok := fromFederatorChanI.(chan gtsmodel.FromFederator) +	if !ok { +		l.Error("from federator channel was set on context but couldn't be parsed") +		return nil +	} + +	boost, isNew, err := f.typeConverter.ASAnnounceToStatus(announce) +	if err != nil { +		return fmt.Errorf("Announce: error converting announce to boost: %s", err) +	} + +	if !isNew { +		// nothing to do here if this isn't a new announce +		return nil +	} + +	// it's a new announce so pass it back to the processor async for dereferencing etc +	fromFederatorChan <- gtsmodel.FromFederator{ +		APObjectType:     gtsmodel.ActivityStreamsAnnounce, +		APActivityType:   gtsmodel.ActivityStreamsCreate, +		GTSModel:         boost, +		ReceivingAccount: targetAcct, +	} + +	return nil +} diff --git a/internal/federation/federatingdb/db.go b/internal/federation/federatingdb/db.go index b5207fc34..f6587a1b7 100644 --- a/internal/federation/federatingdb/db.go +++ b/internal/federation/federatingdb/db.go @@ -35,6 +35,7 @@ type DB interface {  	pub.Database  	Undo(ctx context.Context, undo vocab.ActivityStreamsUndo) error  	Accept(ctx context.Context, accept vocab.ActivityStreamsAccept) error +	Announce(ctx context.Context, announce vocab.ActivityStreamsAnnounce) error  }  // FederatingDB uses the underlying DB interface to implement the go-fed pub.Database interface. diff --git a/internal/federation/federatingdb/federating_db_test.go b/internal/federation/federatingdb/federating_db_test.go new file mode 100644 index 000000000..f32314b10 --- /dev/null +++ b/internal/federation/federatingdb/federating_db_test.go @@ -0,0 +1,21 @@ +/* +   GoToSocial +   Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org + +   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/>. +*/ + +package federatingdb_test + +// TODO: write tests for pgfed diff --git a/internal/federation/federatingdb/util.go b/internal/federation/federatingdb/util.go index be3cff944..53fe194a7 100644 --- a/internal/federation/federatingdb/util.go +++ b/internal/federation/federatingdb/util.go @@ -130,6 +130,19 @@ func (f *federatingDB) NewID(c context.Context, t vocab.Type) (id *url.URL, err  				return idProp.GetIRI(), nil  			}  		} +	case gtsmodel.ActivityStreamsAnnounce: +		// ANNOUNCE aka BOOST +		// ID might already be set on an announce we've created, so check it here and return it if it is +		announce, ok := t.(vocab.ActivityStreamsAnnounce) +		if !ok { +			return nil, errors.New("newid: fave couldn't be parsed into vocab.ActivityStreamsAnnounce") +		} +		idProp := announce.GetJSONLDId() +		if idProp != nil { +			if idProp.IsIRI() { +				return idProp.GetIRI(), nil +			} +		}  	}  	// fallback default behavior: just return a random UUID after our protocol and host | 
