mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2024-10-31 22:40:01 +00:00
federating db updates (#118)
This commit is contained in:
parent
a04888e9a6
commit
2c2dbe318e
8 changed files with 92 additions and 79 deletions
|
@ -31,6 +31,19 @@ func (f *federatingDB) Accept(ctx context.Context, accept vocab.ActivityStreamsA
|
||||||
}
|
}
|
||||||
l.Debugf("received ACCEPT asType %s", string(b))
|
l.Debugf("received ACCEPT asType %s", string(b))
|
||||||
|
|
||||||
|
targetAcctI := ctx.Value(util.APAccount)
|
||||||
|
if targetAcctI == nil {
|
||||||
|
// If the target account wasn't set on the context, that means this request didn't pass through the
|
||||||
|
// API, but came from inside GtS as the result of another activity on this instance. That being so,
|
||||||
|
// we can safely just ignore this activity, since we know we've already processed it elsewhere.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
targetAcct, ok := targetAcctI.(*gtsmodel.Account)
|
||||||
|
if !ok {
|
||||||
|
l.Error("ACCEPT: target account was set on context but couldn't be parsed")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
fromFederatorChanI := ctx.Value(util.APFromFederatorChanKey)
|
fromFederatorChanI := ctx.Value(util.APFromFederatorChanKey)
|
||||||
if fromFederatorChanI == nil {
|
if fromFederatorChanI == nil {
|
||||||
l.Error("ACCEPT: from federator channel wasn't set on context")
|
l.Error("ACCEPT: from federator channel wasn't set on context")
|
||||||
|
@ -42,17 +55,6 @@ func (f *federatingDB) Accept(ctx context.Context, accept vocab.ActivityStreamsA
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
inboxAcctI := ctx.Value(util.APAccount)
|
|
||||||
if inboxAcctI == nil {
|
|
||||||
l.Error("ACCEPT: inbox account wasn't set on context")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
inboxAcct, ok := inboxAcctI.(*gtsmodel.Account)
|
|
||||||
if !ok {
|
|
||||||
l.Error("ACCEPT: inbox account was set on context but couldn't be parsed")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
acceptObject := accept.GetActivityStreamsObject()
|
acceptObject := accept.GetActivityStreamsObject()
|
||||||
if acceptObject == nil {
|
if acceptObject == nil {
|
||||||
return errors.New("ACCEPT: no object set on vocab.ActivityStreamsAccept")
|
return errors.New("ACCEPT: no object set on vocab.ActivityStreamsAccept")
|
||||||
|
@ -71,7 +73,7 @@ func (f *federatingDB) Accept(ctx context.Context, accept vocab.ActivityStreamsA
|
||||||
}
|
}
|
||||||
|
|
||||||
// make sure the addressee of the original follow is the same as whatever inbox this landed in
|
// make sure the addressee of the original follow is the same as whatever inbox this landed in
|
||||||
if gtsFollowRequest.AccountID != inboxAcct.ID {
|
if gtsFollowRequest.AccountID != targetAcct.ID {
|
||||||
return errors.New("ACCEPT: follow object account and inbox account were not the same")
|
return errors.New("ACCEPT: follow object account and inbox account were not the same")
|
||||||
}
|
}
|
||||||
follow, err := f.db.AcceptFollowRequest(gtsFollowRequest.AccountID, gtsFollowRequest.TargetAccountID)
|
follow, err := f.db.AcceptFollowRequest(gtsFollowRequest.AccountID, gtsFollowRequest.TargetAccountID)
|
||||||
|
@ -83,7 +85,7 @@ func (f *federatingDB) Accept(ctx context.Context, accept vocab.ActivityStreamsA
|
||||||
APObjectType: gtsmodel.ActivityStreamsFollow,
|
APObjectType: gtsmodel.ActivityStreamsFollow,
|
||||||
APActivityType: gtsmodel.ActivityStreamsAccept,
|
APActivityType: gtsmodel.ActivityStreamsAccept,
|
||||||
GTSModel: follow,
|
GTSModel: follow,
|
||||||
ReceivingAccount: inboxAcct,
|
ReceivingAccount: targetAcct,
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -108,7 +110,7 @@ func (f *federatingDB) Accept(ctx context.Context, accept vocab.ActivityStreamsA
|
||||||
return fmt.Errorf("ACCEPT: error converting asfollow to gtsfollow: %s", err)
|
return fmt.Errorf("ACCEPT: error converting asfollow to gtsfollow: %s", err)
|
||||||
}
|
}
|
||||||
// make sure the addressee of the original follow is the same as whatever inbox this landed in
|
// make sure the addressee of the original follow is the same as whatever inbox this landed in
|
||||||
if gtsFollow.AccountID != inboxAcct.ID {
|
if gtsFollow.AccountID != targetAcct.ID {
|
||||||
return errors.New("ACCEPT: follow object account and inbox account were not the same")
|
return errors.New("ACCEPT: follow object account and inbox account were not the same")
|
||||||
}
|
}
|
||||||
follow, err := f.db.AcceptFollowRequest(gtsFollow.AccountID, gtsFollow.TargetAccountID)
|
follow, err := f.db.AcceptFollowRequest(gtsFollow.AccountID, gtsFollow.TargetAccountID)
|
||||||
|
@ -120,7 +122,7 @@ func (f *federatingDB) Accept(ctx context.Context, accept vocab.ActivityStreamsA
|
||||||
APObjectType: gtsmodel.ActivityStreamsFollow,
|
APObjectType: gtsmodel.ActivityStreamsFollow,
|
||||||
APActivityType: gtsmodel.ActivityStreamsAccept,
|
APActivityType: gtsmodel.ActivityStreamsAccept,
|
||||||
GTSModel: follow,
|
GTSModel: follow,
|
||||||
ReceivingAccount: inboxAcct,
|
ReceivingAccount: targetAcct,
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -31,29 +31,31 @@ func (f *federatingDB) Announce(ctx context.Context, announce vocab.ActivityStre
|
||||||
|
|
||||||
targetAcctI := ctx.Value(util.APAccount)
|
targetAcctI := ctx.Value(util.APAccount)
|
||||||
if targetAcctI == nil {
|
if targetAcctI == nil {
|
||||||
l.Error("target account wasn't set on context")
|
// If the target account wasn't set on the context, that means this request didn't pass through the
|
||||||
|
// API, but came from inside GtS as the result of another activity on this instance. That being so,
|
||||||
|
// we can safely just ignore this activity, since we know we've already processed it elsewhere.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
targetAcct, ok := targetAcctI.(*gtsmodel.Account)
|
targetAcct, ok := targetAcctI.(*gtsmodel.Account)
|
||||||
if !ok {
|
if !ok {
|
||||||
l.Error("target account was set on context but couldn't be parsed")
|
l.Error("ANNOUNCE: target account was set on context but couldn't be parsed")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
fromFederatorChanI := ctx.Value(util.APFromFederatorChanKey)
|
fromFederatorChanI := ctx.Value(util.APFromFederatorChanKey)
|
||||||
if fromFederatorChanI == nil {
|
if fromFederatorChanI == nil {
|
||||||
l.Error("from federator channel wasn't set on context")
|
l.Error("ANNOUNCE: from federator channel wasn't set on context")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
fromFederatorChan, ok := fromFederatorChanI.(chan gtsmodel.FromFederator)
|
fromFederatorChan, ok := fromFederatorChanI.(chan gtsmodel.FromFederator)
|
||||||
if !ok {
|
if !ok {
|
||||||
l.Error("from federator channel was set on context but couldn't be parsed")
|
l.Error("ANNOUNCE: from federator channel was set on context but couldn't be parsed")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
boost, isNew, err := f.typeConverter.ASAnnounceToStatus(announce)
|
boost, isNew, err := f.typeConverter.ASAnnounceToStatus(announce)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Announce: error converting announce to boost: %s", err)
|
return fmt.Errorf("ANNOUNCE: error converting announce to boost: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !isNew {
|
if !isNew {
|
||||||
|
|
|
@ -65,23 +65,25 @@ func (f *federatingDB) Create(ctx context.Context, asType vocab.Type) error {
|
||||||
|
|
||||||
targetAcctI := ctx.Value(util.APAccount)
|
targetAcctI := ctx.Value(util.APAccount)
|
||||||
if targetAcctI == nil {
|
if targetAcctI == nil {
|
||||||
l.Error("target account wasn't set on context")
|
// If the target account wasn't set on the context, that means this request didn't pass through the
|
||||||
|
// API, but came from inside GtS as the result of another activity on this instance. That being so,
|
||||||
|
// we can safely just ignore this activity, since we know we've already processed it elsewhere.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
targetAcct, ok := targetAcctI.(*gtsmodel.Account)
|
targetAcct, ok := targetAcctI.(*gtsmodel.Account)
|
||||||
if !ok {
|
if !ok {
|
||||||
l.Error("target account was set on context but couldn't be parsed")
|
l.Error("CREATE: target account was set on context but couldn't be parsed")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
fromFederatorChanI := ctx.Value(util.APFromFederatorChanKey)
|
fromFederatorChanI := ctx.Value(util.APFromFederatorChanKey)
|
||||||
if fromFederatorChanI == nil {
|
if fromFederatorChanI == nil {
|
||||||
l.Error("from federator channel wasn't set on context")
|
l.Error("CREATE: from federator channel wasn't set on context")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
fromFederatorChan, ok := fromFederatorChanI.(chan gtsmodel.FromFederator)
|
fromFederatorChan, ok := fromFederatorChanI.(chan gtsmodel.FromFederator)
|
||||||
if !ok {
|
if !ok {
|
||||||
l.Error("from federator channel was set on context but couldn't be parsed")
|
l.Error("CREATE: from federator channel was set on context but couldn't be parsed")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +92,7 @@ func (f *federatingDB) Create(ctx context.Context, asType vocab.Type) error {
|
||||||
// CREATE SOMETHING
|
// CREATE SOMETHING
|
||||||
create, ok := asType.(vocab.ActivityStreamsCreate)
|
create, ok := asType.(vocab.ActivityStreamsCreate)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("could not convert type to create")
|
return errors.New("CREATE: could not convert type to create")
|
||||||
}
|
}
|
||||||
object := create.GetActivityStreamsObject()
|
object := create.GetActivityStreamsObject()
|
||||||
for objectIter := object.Begin(); objectIter != object.End(); objectIter = objectIter.Next() {
|
for objectIter := object.Begin(); objectIter != object.End(); objectIter = objectIter.Next() {
|
||||||
|
@ -100,7 +102,7 @@ func (f *federatingDB) Create(ctx context.Context, asType vocab.Type) error {
|
||||||
note := objectIter.GetActivityStreamsNote()
|
note := objectIter.GetActivityStreamsNote()
|
||||||
status, err := f.typeConverter.ASStatusToStatus(note)
|
status, err := f.typeConverter.ASStatusToStatus(note)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error converting note to status: %s", err)
|
return fmt.Errorf("CREATE: error converting note to status: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// id the status based on the time it was created
|
// id the status based on the time it was created
|
||||||
|
@ -117,7 +119,7 @@ func (f *federatingDB) Create(ctx context.Context, asType vocab.Type) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// an actual error has happened
|
// an actual error has happened
|
||||||
return fmt.Errorf("database error inserting status: %s", err)
|
return fmt.Errorf("CREATE: database error inserting status: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fromFederatorChan <- gtsmodel.FromFederator{
|
fromFederatorChan <- gtsmodel.FromFederator{
|
||||||
|
@ -132,12 +134,12 @@ func (f *federatingDB) Create(ctx context.Context, asType vocab.Type) error {
|
||||||
// FOLLOW SOMETHING
|
// FOLLOW SOMETHING
|
||||||
follow, ok := asType.(vocab.ActivityStreamsFollow)
|
follow, ok := asType.(vocab.ActivityStreamsFollow)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("could not convert type to follow")
|
return errors.New("CREATE: could not convert type to follow")
|
||||||
}
|
}
|
||||||
|
|
||||||
followRequest, err := f.typeConverter.ASFollowToFollowRequest(follow)
|
followRequest, err := f.typeConverter.ASFollowToFollowRequest(follow)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not convert Follow to follow request: %s", err)
|
return fmt.Errorf("CREATE: could not convert Follow to follow request: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
newID, err := id.NewULID()
|
newID, err := id.NewULID()
|
||||||
|
@ -147,7 +149,7 @@ func (f *federatingDB) Create(ctx context.Context, asType vocab.Type) error {
|
||||||
followRequest.ID = newID
|
followRequest.ID = newID
|
||||||
|
|
||||||
if err := f.db.Put(followRequest); err != nil {
|
if err := f.db.Put(followRequest); err != nil {
|
||||||
return fmt.Errorf("database error inserting follow request: %s", err)
|
return fmt.Errorf("CREATE: database error inserting follow request: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fromFederatorChan <- gtsmodel.FromFederator{
|
fromFederatorChan <- gtsmodel.FromFederator{
|
||||||
|
@ -160,12 +162,12 @@ func (f *federatingDB) Create(ctx context.Context, asType vocab.Type) error {
|
||||||
// LIKE SOMETHING
|
// LIKE SOMETHING
|
||||||
like, ok := asType.(vocab.ActivityStreamsLike)
|
like, ok := asType.(vocab.ActivityStreamsLike)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("could not convert type to like")
|
return errors.New("CREATE: could not convert type to like")
|
||||||
}
|
}
|
||||||
|
|
||||||
fave, err := f.typeConverter.ASLikeToFave(like)
|
fave, err := f.typeConverter.ASLikeToFave(like)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not convert Like to fave: %s", err)
|
return fmt.Errorf("CREATE: could not convert Like to fave: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
newID, err := id.NewULID()
|
newID, err := id.NewULID()
|
||||||
|
@ -175,7 +177,7 @@ func (f *federatingDB) Create(ctx context.Context, asType vocab.Type) error {
|
||||||
fave.ID = newID
|
fave.ID = newID
|
||||||
|
|
||||||
if err := f.db.Put(fave); err != nil {
|
if err := f.db.Put(fave); err != nil {
|
||||||
return fmt.Errorf("database error inserting fave: %s", err)
|
return fmt.Errorf("CREATE: database error inserting fave: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fromFederatorChan <- gtsmodel.FromFederator{
|
fromFederatorChan <- gtsmodel.FromFederator{
|
||||||
|
@ -188,12 +190,12 @@ func (f *federatingDB) Create(ctx context.Context, asType vocab.Type) error {
|
||||||
// BLOCK SOMETHING
|
// BLOCK SOMETHING
|
||||||
blockable, ok := asType.(vocab.ActivityStreamsBlock)
|
blockable, ok := asType.(vocab.ActivityStreamsBlock)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("could not convert type to block")
|
return errors.New("CREATE: could not convert type to block")
|
||||||
}
|
}
|
||||||
|
|
||||||
block, err := f.typeConverter.ASBlockToBlock(blockable)
|
block, err := f.typeConverter.ASBlockToBlock(blockable)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not convert Block to gts model block")
|
return fmt.Errorf("CREATE: could not convert Block to gts model block")
|
||||||
}
|
}
|
||||||
|
|
||||||
newID, err := id.NewULID()
|
newID, err := id.NewULID()
|
||||||
|
@ -203,7 +205,7 @@ func (f *federatingDB) Create(ctx context.Context, asType vocab.Type) error {
|
||||||
block.ID = newID
|
block.ID = newID
|
||||||
|
|
||||||
if err := f.db.Put(block); err != nil {
|
if err := f.db.Put(block); err != nil {
|
||||||
return fmt.Errorf("database error inserting block: %s", err)
|
return fmt.Errorf("CREATE: database error inserting block: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fromFederatorChan <- gtsmodel.FromFederator{
|
fromFederatorChan <- gtsmodel.FromFederator{
|
||||||
|
|
|
@ -26,25 +26,27 @@ func (f *federatingDB) Delete(ctx context.Context, id *url.URL) error {
|
||||||
)
|
)
|
||||||
l.Debugf("received DELETE id %s", id.String())
|
l.Debugf("received DELETE id %s", id.String())
|
||||||
|
|
||||||
inboxAcctI := ctx.Value(util.APAccount)
|
targetAcctI := ctx.Value(util.APAccount)
|
||||||
if inboxAcctI == nil {
|
if targetAcctI == nil {
|
||||||
l.Error("inbox account wasn't set on context")
|
// If the target account wasn't set on the context, that means this request didn't pass through the
|
||||||
|
// API, but came from inside GtS as the result of another activity on this instance. That being so,
|
||||||
|
// we can safely just ignore this activity, since we know we've already processed it elsewhere.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
inboxAcct, ok := inboxAcctI.(*gtsmodel.Account)
|
targetAcct, ok := targetAcctI.(*gtsmodel.Account)
|
||||||
if !ok {
|
if !ok {
|
||||||
l.Error("inbox account was set on context but couldn't be parsed")
|
l.Error("DELETE: target account was set on context but couldn't be parsed")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
fromFederatorChanI := ctx.Value(util.APFromFederatorChanKey)
|
fromFederatorChanI := ctx.Value(util.APFromFederatorChanKey)
|
||||||
if fromFederatorChanI == nil {
|
if fromFederatorChanI == nil {
|
||||||
l.Error("from federator channel wasn't set on context")
|
l.Error("DELETE: from federator channel wasn't set on context")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
fromFederatorChan, ok := fromFederatorChanI.(chan gtsmodel.FromFederator)
|
fromFederatorChan, ok := fromFederatorChanI.(chan gtsmodel.FromFederator)
|
||||||
if !ok {
|
if !ok {
|
||||||
l.Error("from federator channel was set on context but couldn't be parsed")
|
l.Error("DELETE: from federator channel was set on context but couldn't be parsed")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,13 +59,13 @@ func (f *federatingDB) Delete(ctx context.Context, id *url.URL) error {
|
||||||
// it's a status
|
// it's a status
|
||||||
l.Debugf("uri is for status with id: %s", s.ID)
|
l.Debugf("uri is for status with id: %s", s.ID)
|
||||||
if err := f.db.DeleteByID(s.ID, >smodel.Status{}); err != nil {
|
if err := f.db.DeleteByID(s.ID, >smodel.Status{}); err != nil {
|
||||||
return fmt.Errorf("Delete: err deleting status: %s", err)
|
return fmt.Errorf("DELETE: err deleting status: %s", err)
|
||||||
}
|
}
|
||||||
fromFederatorChan <- gtsmodel.FromFederator{
|
fromFederatorChan <- gtsmodel.FromFederator{
|
||||||
APObjectType: gtsmodel.ActivityStreamsNote,
|
APObjectType: gtsmodel.ActivityStreamsNote,
|
||||||
APActivityType: gtsmodel.ActivityStreamsDelete,
|
APActivityType: gtsmodel.ActivityStreamsDelete,
|
||||||
GTSModel: s,
|
GTSModel: s,
|
||||||
ReceivingAccount: inboxAcct,
|
ReceivingAccount: targetAcct,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,13 +74,13 @@ func (f *federatingDB) Delete(ctx context.Context, id *url.URL) error {
|
||||||
// it's an account
|
// it's an account
|
||||||
l.Debugf("uri is for an account with id: %s", s.ID)
|
l.Debugf("uri is for an account with id: %s", s.ID)
|
||||||
if err := f.db.DeleteByID(a.ID, >smodel.Account{}); err != nil {
|
if err := f.db.DeleteByID(a.ID, >smodel.Account{}); err != nil {
|
||||||
return fmt.Errorf("Delete: err deleting account: %s", err)
|
return fmt.Errorf("DELETE: err deleting account: %s", err)
|
||||||
}
|
}
|
||||||
fromFederatorChan <- gtsmodel.FromFederator{
|
fromFederatorChan <- gtsmodel.FromFederator{
|
||||||
APObjectType: gtsmodel.ActivityStreamsProfile,
|
APObjectType: gtsmodel.ActivityStreamsProfile,
|
||||||
APActivityType: gtsmodel.ActivityStreamsDelete,
|
APActivityType: gtsmodel.ActivityStreamsDelete,
|
||||||
GTSModel: a,
|
GTSModel: a,
|
||||||
ReceivingAccount: inboxAcct,
|
ReceivingAccount: targetAcct,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,19 +32,19 @@ func (f *federatingDB) Followers(c context.Context, actorIRI *url.URL) (follower
|
||||||
|
|
||||||
if util.IsUserPath(actorIRI) {
|
if util.IsUserPath(actorIRI) {
|
||||||
if err := f.db.GetWhere([]db.Where{{Key: "uri", Value: actorIRI.String()}}, acct); err != nil {
|
if err := f.db.GetWhere([]db.Where{{Key: "uri", Value: actorIRI.String()}}, acct); err != nil {
|
||||||
return nil, fmt.Errorf("db error getting account with uri %s: %s", actorIRI.String(), err)
|
return nil, fmt.Errorf("FOLLOWERS: db error getting account with uri %s: %s", actorIRI.String(), err)
|
||||||
}
|
}
|
||||||
} else if util.IsFollowersPath(actorIRI) {
|
} else if util.IsFollowersPath(actorIRI) {
|
||||||
if err := f.db.GetWhere([]db.Where{{Key: "followers_uri", Value: actorIRI.String()}}, acct); err != nil {
|
if err := f.db.GetWhere([]db.Where{{Key: "followers_uri", Value: actorIRI.String()}}, acct); err != nil {
|
||||||
return nil, fmt.Errorf("db error getting account with followers uri %s: %s", actorIRI.String(), err)
|
return nil, fmt.Errorf("FOLLOWERS: db error getting account with followers uri %s: %s", actorIRI.String(), err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf("could not parse actor IRI %s as users or followers path", actorIRI.String())
|
return nil, fmt.Errorf("FOLLOWERS: could not parse actor IRI %s as users or followers path", actorIRI.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
acctFollowers := []gtsmodel.Follow{}
|
acctFollowers := []gtsmodel.Follow{}
|
||||||
if err := f.db.GetFollowersByAccountID(acct.ID, &acctFollowers, false); err != nil {
|
if err := f.db.GetFollowersByAccountID(acct.ID, &acctFollowers, false); err != nil {
|
||||||
return nil, fmt.Errorf("db error getting followers for account id %s: %s", acct.ID, err)
|
return nil, fmt.Errorf("FOLLOWERS: db error getting followers for account id %s: %s", acct.ID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
followers = streams.NewActivityStreamsCollection()
|
followers = streams.NewActivityStreamsCollection()
|
||||||
|
@ -52,11 +52,11 @@ func (f *federatingDB) Followers(c context.Context, actorIRI *url.URL) (follower
|
||||||
for _, follow := range acctFollowers {
|
for _, follow := range acctFollowers {
|
||||||
gtsFollower := >smodel.Account{}
|
gtsFollower := >smodel.Account{}
|
||||||
if err := f.db.GetByID(follow.AccountID, gtsFollower); err != nil {
|
if err := f.db.GetByID(follow.AccountID, gtsFollower); err != nil {
|
||||||
return nil, fmt.Errorf("db error getting account id %s: %s", follow.AccountID, err)
|
return nil, fmt.Errorf("FOLLOWERS: db error getting account id %s: %s", follow.AccountID, err)
|
||||||
}
|
}
|
||||||
uri, err := url.Parse(gtsFollower.URI)
|
uri, err := url.Parse(gtsFollower.URI)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error parsing %s as url: %s", gtsFollower.URI, err)
|
return nil, fmt.Errorf("FOLLOWERS: error parsing %s as url: %s", gtsFollower.URI, err)
|
||||||
}
|
}
|
||||||
items.AppendIRI(uri)
|
items.AppendIRI(uri)
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,19 +31,19 @@ func (f *federatingDB) Following(c context.Context, actorIRI *url.URL) (followin
|
||||||
acct := >smodel.Account{}
|
acct := >smodel.Account{}
|
||||||
if util.IsUserPath(actorIRI) {
|
if util.IsUserPath(actorIRI) {
|
||||||
if err := f.db.GetWhere([]db.Where{{Key: "uri", Value: actorIRI.String()}}, acct); err != nil {
|
if err := f.db.GetWhere([]db.Where{{Key: "uri", Value: actorIRI.String()}}, acct); err != nil {
|
||||||
return nil, fmt.Errorf("db error getting account with uri %s: %s", actorIRI.String(), err)
|
return nil, fmt.Errorf("FOLLOWING: db error getting account with uri %s: %s", actorIRI.String(), err)
|
||||||
}
|
}
|
||||||
} else if util.IsFollowingPath(actorIRI) {
|
} else if util.IsFollowingPath(actorIRI) {
|
||||||
if err := f.db.GetWhere([]db.Where{{Key: "following_uri", Value: actorIRI.String()}}, acct); err != nil {
|
if err := f.db.GetWhere([]db.Where{{Key: "following_uri", Value: actorIRI.String()}}, acct); err != nil {
|
||||||
return nil, fmt.Errorf("db error getting account with following uri %s: %s", actorIRI.String(), err)
|
return nil, fmt.Errorf("FOLLOWING: db error getting account with following uri %s: %s", actorIRI.String(), err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf("could not parse actor IRI %s as users or following path", actorIRI.String())
|
return nil, fmt.Errorf("FOLLOWING: could not parse actor IRI %s as users or following path", actorIRI.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
acctFollowing := []gtsmodel.Follow{}
|
acctFollowing := []gtsmodel.Follow{}
|
||||||
if err := f.db.GetFollowingByAccountID(acct.ID, &acctFollowing); err != nil {
|
if err := f.db.GetFollowingByAccountID(acct.ID, &acctFollowing); err != nil {
|
||||||
return nil, fmt.Errorf("db error getting following for account id %s: %s", acct.ID, err)
|
return nil, fmt.Errorf("FOLLOWING: db error getting following for account id %s: %s", acct.ID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
following = streams.NewActivityStreamsCollection()
|
following = streams.NewActivityStreamsCollection()
|
||||||
|
@ -51,11 +51,11 @@ func (f *federatingDB) Following(c context.Context, actorIRI *url.URL) (followin
|
||||||
for _, follow := range acctFollowing {
|
for _, follow := range acctFollowing {
|
||||||
gtsFollowing := >smodel.Account{}
|
gtsFollowing := >smodel.Account{}
|
||||||
if err := f.db.GetByID(follow.AccountID, gtsFollowing); err != nil {
|
if err := f.db.GetByID(follow.AccountID, gtsFollowing); err != nil {
|
||||||
return nil, fmt.Errorf("db error getting account id %s: %s", follow.AccountID, err)
|
return nil, fmt.Errorf("FOLLOWING: db error getting account id %s: %s", follow.AccountID, err)
|
||||||
}
|
}
|
||||||
uri, err := url.Parse(gtsFollowing.URI)
|
uri, err := url.Parse(gtsFollowing.URI)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error parsing %s as url: %s", gtsFollowing.URI, err)
|
return nil, fmt.Errorf("FOLLOWING: error parsing %s as url: %s", gtsFollowing.URI, err)
|
||||||
}
|
}
|
||||||
items.AppendIRI(uri)
|
items.AppendIRI(uri)
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,9 @@ func (f *federatingDB) Undo(ctx context.Context, undo vocab.ActivityStreamsUndo)
|
||||||
|
|
||||||
targetAcctI := ctx.Value(util.APAccount)
|
targetAcctI := ctx.Value(util.APAccount)
|
||||||
if targetAcctI == nil {
|
if targetAcctI == nil {
|
||||||
l.Error("UNDO: target account wasn't set on context")
|
// If the target account wasn't set on the context, that means this request didn't pass through the
|
||||||
|
// API, but came from inside GtS as the result of another activity on this instance. That being so,
|
||||||
|
// we can safely just ignore this activity, since we know we've already processed it elsewhere.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
targetAcct, ok := targetAcctI.(*gtsmodel.Account)
|
targetAcct, ok := targetAcctI.(*gtsmodel.Account)
|
||||||
|
|
|
@ -41,31 +41,34 @@ func (f *federatingDB) Update(ctx context.Context, asType vocab.Type) error {
|
||||||
|
|
||||||
l.Debugf("received UPDATE asType %s", string(b))
|
l.Debugf("received UPDATE asType %s", string(b))
|
||||||
|
|
||||||
receivingAcctI := ctx.Value(util.APAccount)
|
targetAcctI := ctx.Value(util.APAccount)
|
||||||
if receivingAcctI == nil {
|
if targetAcctI == nil {
|
||||||
l.Error("receiving account wasn't set on context")
|
// If the target account wasn't set on the context, that means this request didn't pass through the
|
||||||
|
// API, but came from inside GtS as the result of another activity on this instance. That being so,
|
||||||
|
// we can safely just ignore this activity, since we know we've already processed it elsewhere.
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
receivingAcct, ok := receivingAcctI.(*gtsmodel.Account)
|
targetAcct, ok := targetAcctI.(*gtsmodel.Account)
|
||||||
if !ok {
|
if !ok {
|
||||||
l.Error("receiving account was set on context but couldn't be parsed")
|
l.Error("UPDATE: target account was set on context but couldn't be parsed")
|
||||||
}
|
}
|
||||||
|
|
||||||
requestingAcctI := ctx.Value(util.APRequestingAccount)
|
requestingAcctI := ctx.Value(util.APRequestingAccount)
|
||||||
if receivingAcctI == nil {
|
if targetAcctI == nil {
|
||||||
l.Error("requesting account wasn't set on context")
|
l.Error("UPDATE: requesting account wasn't set on context")
|
||||||
}
|
}
|
||||||
requestingAcct, ok := requestingAcctI.(*gtsmodel.Account)
|
requestingAcct, ok := requestingAcctI.(*gtsmodel.Account)
|
||||||
if !ok {
|
if !ok {
|
||||||
l.Error("requesting account was set on context but couldn't be parsed")
|
l.Error("UPDATE: requesting account was set on context but couldn't be parsed")
|
||||||
}
|
}
|
||||||
|
|
||||||
fromFederatorChanI := ctx.Value(util.APFromFederatorChanKey)
|
fromFederatorChanI := ctx.Value(util.APFromFederatorChanKey)
|
||||||
if fromFederatorChanI == nil {
|
if fromFederatorChanI == nil {
|
||||||
l.Error("from federator channel wasn't set on context")
|
l.Error("UPDATE: from federator channel wasn't set on context")
|
||||||
}
|
}
|
||||||
fromFederatorChan, ok := fromFederatorChanI.(chan gtsmodel.FromFederator)
|
fromFederatorChan, ok := fromFederatorChanI.(chan gtsmodel.FromFederator)
|
||||||
if !ok {
|
if !ok {
|
||||||
l.Error("from federator channel was set on context but couldn't be parsed")
|
l.Error("UPDATE: from federator channel was set on context but couldn't be parsed")
|
||||||
}
|
}
|
||||||
|
|
||||||
typeName := asType.GetTypeName()
|
typeName := asType.GetTypeName()
|
||||||
|
@ -82,42 +85,42 @@ func (f *federatingDB) Update(ctx context.Context, asType vocab.Type) error {
|
||||||
l.Debug("got update for APPLICATION")
|
l.Debug("got update for APPLICATION")
|
||||||
i, ok := asType.(vocab.ActivityStreamsApplication)
|
i, ok := asType.(vocab.ActivityStreamsApplication)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("could not convert type to application")
|
return errors.New("UPDATE: could not convert type to application")
|
||||||
}
|
}
|
||||||
accountable = i
|
accountable = i
|
||||||
case gtsmodel.ActivityStreamsGroup:
|
case gtsmodel.ActivityStreamsGroup:
|
||||||
l.Debug("got update for GROUP")
|
l.Debug("got update for GROUP")
|
||||||
i, ok := asType.(vocab.ActivityStreamsGroup)
|
i, ok := asType.(vocab.ActivityStreamsGroup)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("could not convert type to group")
|
return errors.New("UPDATE: could not convert type to group")
|
||||||
}
|
}
|
||||||
accountable = i
|
accountable = i
|
||||||
case gtsmodel.ActivityStreamsOrganization:
|
case gtsmodel.ActivityStreamsOrganization:
|
||||||
l.Debug("got update for ORGANIZATION")
|
l.Debug("got update for ORGANIZATION")
|
||||||
i, ok := asType.(vocab.ActivityStreamsOrganization)
|
i, ok := asType.(vocab.ActivityStreamsOrganization)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("could not convert type to organization")
|
return errors.New("UPDATE: could not convert type to organization")
|
||||||
}
|
}
|
||||||
accountable = i
|
accountable = i
|
||||||
case gtsmodel.ActivityStreamsPerson:
|
case gtsmodel.ActivityStreamsPerson:
|
||||||
l.Debug("got update for PERSON")
|
l.Debug("got update for PERSON")
|
||||||
i, ok := asType.(vocab.ActivityStreamsPerson)
|
i, ok := asType.(vocab.ActivityStreamsPerson)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("could not convert type to person")
|
return errors.New("UPDATE: could not convert type to person")
|
||||||
}
|
}
|
||||||
accountable = i
|
accountable = i
|
||||||
case gtsmodel.ActivityStreamsService:
|
case gtsmodel.ActivityStreamsService:
|
||||||
l.Debug("got update for SERVICE")
|
l.Debug("got update for SERVICE")
|
||||||
i, ok := asType.(vocab.ActivityStreamsService)
|
i, ok := asType.(vocab.ActivityStreamsService)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("could not convert type to service")
|
return errors.New("UPDATE: could not convert type to service")
|
||||||
}
|
}
|
||||||
accountable = i
|
accountable = i
|
||||||
}
|
}
|
||||||
|
|
||||||
updatedAcct, err := f.typeConverter.ASRepresentationToAccount(accountable, true)
|
updatedAcct, err := f.typeConverter.ASRepresentationToAccount(accountable, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error converting to account: %s", err)
|
return fmt.Errorf("UPDATE: error converting to account: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if updatedAcct.Domain == f.config.Host {
|
if updatedAcct.Domain == f.config.Host {
|
||||||
|
@ -127,19 +130,19 @@ func (f *federatingDB) Update(ctx context.Context, asType vocab.Type) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if requestingAcct.URI != updatedAcct.URI {
|
if requestingAcct.URI != updatedAcct.URI {
|
||||||
return fmt.Errorf("update for account %s was requested by account %s, this is not valid", updatedAcct.URI, requestingAcct.URI)
|
return fmt.Errorf("UPDATE: update for account %s was requested by account %s, this is not valid", updatedAcct.URI, requestingAcct.URI)
|
||||||
}
|
}
|
||||||
|
|
||||||
updatedAcct.ID = requestingAcct.ID // set this here so the db will update properly instead of trying to PUT this and getting constraint issues
|
updatedAcct.ID = requestingAcct.ID // set this here so the db will update properly instead of trying to PUT this and getting constraint issues
|
||||||
if err := f.db.UpdateByID(requestingAcct.ID, updatedAcct); err != nil {
|
if err := f.db.UpdateByID(requestingAcct.ID, updatedAcct); err != nil {
|
||||||
return fmt.Errorf("database error inserting updated account: %s", err)
|
return fmt.Errorf("UPDATE: database error inserting updated account: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fromFederatorChan <- gtsmodel.FromFederator{
|
fromFederatorChan <- gtsmodel.FromFederator{
|
||||||
APObjectType: gtsmodel.ActivityStreamsProfile,
|
APObjectType: gtsmodel.ActivityStreamsProfile,
|
||||||
APActivityType: gtsmodel.ActivityStreamsUpdate,
|
APActivityType: gtsmodel.ActivityStreamsUpdate,
|
||||||
GTSModel: updatedAcct,
|
GTSModel: updatedAcct,
|
||||||
ReceivingAccount: receivingAcct,
|
ReceivingAccount: targetAcct,
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue