diff options
author | 2021-05-28 19:57:04 +0200 | |
---|---|---|
committer | 2021-05-28 19:57:04 +0200 | |
commit | 87177d840b9703f572392ef4bd0f5013fd5c3a77 (patch) | |
tree | c59388998d5defd5ec3577483f70736238953f72 /internal/federation/federatingdb | |
parent | Notifications (#34) (diff) | |
download | gotosocial-87177d840b9703f572392ef4bd0f5013fd5c3a77.tar.xz |
Announce/boost (#35)
Remote boosts incoming/outgoing now working.
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 |