From 71a49e2b43218d34f97b2276c43bdeb2df4a53d2 Mon Sep 17 00:00:00 2001 From: Tobi Smethurst <31960611+tsmethurst@users.noreply.github.com> Date: Thu, 1 Apr 2021 20:46:45 +0200 Subject: Api/v1/accounts (#8) * start work on accounts module * plodding away on the accounts endpoint * groundwork for other account routes * add password validator * validation utils * require account approval flags * comments * comments * go fmt * comments * add distributor stub * rename api to federator * tidy a bit * validate new account requests * rename r router * comments * add domain blocks * add some more shortcuts * add some more shortcuts * check email + username availability * email block checking for signups * chunking away at it * tick off a few more things * some fiddling with tests * add mock package * relocate repo * move mocks around * set app id on new signups * initialize oauth server properly * rename oauth server * proper mocking tests * go fmt ./... * add required fields * change name of func * move validation to account.go * more tests! * add some file utility tools * add mediaconfig * new shortcut * add some more fields * add followrequest model * add notify * update mastotypes * mock out storage interface * start building media interface * start on update credentials * mess about with media a bit more * test image manipulation * media more or less working * account update nearly working * rearranging my package ;) ;) ;) * phew big stuff!!!! * fix type checking * *fiddles* * Add CreateTables func * account registration flow working * tidy * script to step through auth flow * add a lil helper for generating user uris * fiddling with federation a bit * update progress * Tidying and linting --- internal/distributor/distributor.go | 96 ++++++++++++++++++++++++++++++++ internal/distributor/mock_Distributor.go | 70 +++++++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 internal/distributor/distributor.go create mode 100644 internal/distributor/mock_Distributor.go (limited to 'internal/distributor') diff --git a/internal/distributor/distributor.go b/internal/distributor/distributor.go new file mode 100644 index 000000000..ab092907f --- /dev/null +++ b/internal/distributor/distributor.go @@ -0,0 +1,96 @@ +/* + 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 . +*/ + +package distributor + +import ( + "github.com/go-fed/activity/pub" + "github.com/sirupsen/logrus" +) + +// Distributor should be passed to api modules (see internal/apimodule/...). It is used for +// passing messages back and forth from the client API and the federating interface, via channels. +// It also contains logic for filtering which messages should end up where. +// It is designed to be used asynchronously: the client API and the federating API should just be able to +// fire messages into the distributor and not wait for a reply before proceeding with other work. This allows +// for clean distribution of messages without slowing down the client API and harming the user experience. +type Distributor interface { + // ClientAPIIn returns a channel for accepting messages that come from the gts client API. + ClientAPIIn() chan interface{} + // ClientAPIOut returns a channel for putting in messages that need to go to the gts client API. + ClientAPIOut() chan interface{} + // Start starts the Distributor, reading from its channels and passing messages back and forth. + Start() error + // Stop stops the distributor cleanly, finishing handling any remaining messages before closing down. + Stop() error +} + +// distributor just implements the Distributor interface +type distributor struct { + federator pub.FederatingActor + clientAPIIn chan interface{} + clientAPIOut chan interface{} + stop chan interface{} + log *logrus.Logger +} + +// New returns a new Distributor that uses the given federator and logger +func New(federator pub.FederatingActor, log *logrus.Logger) Distributor { + return &distributor{ + federator: federator, + clientAPIIn: make(chan interface{}, 100), + clientAPIOut: make(chan interface{}, 100), + stop: make(chan interface{}), + log: log, + } +} + +// ClientAPIIn returns a channel for accepting messages that come from the gts client API. +func (d *distributor) ClientAPIIn() chan interface{} { + return d.clientAPIIn +} + +// ClientAPIOut returns a channel for putting in messages that need to go to the gts client API. +func (d *distributor) ClientAPIOut() chan interface{} { + return d.clientAPIOut +} + +// Start starts the Distributor, reading from its channels and passing messages back and forth. +func (d *distributor) Start() error { + go func() { + DistLoop: + for { + select { + case clientMsgIn := <-d.clientAPIIn: + d.log.Infof("received clientMsgIn: %+v", clientMsgIn) + case clientMsgOut := <-d.clientAPIOut: + d.log.Infof("received clientMsgOut: %+v", clientMsgOut) + case <-d.stop: + break DistLoop + } + } + }() + return nil +} + +// Stop stops the distributor cleanly, finishing handling any remaining messages before closing down. +// TODO: empty message buffer properly before stopping otherwise we'll lose federating messages. +func (d *distributor) Stop() error { + close(d.stop) + return nil +} diff --git a/internal/distributor/mock_Distributor.go b/internal/distributor/mock_Distributor.go new file mode 100644 index 000000000..93d7dd8d2 --- /dev/null +++ b/internal/distributor/mock_Distributor.go @@ -0,0 +1,70 @@ +// Code generated by mockery v2.7.4. DO NOT EDIT. + +package distributor + +import mock "github.com/stretchr/testify/mock" + +// MockDistributor is an autogenerated mock type for the Distributor type +type MockDistributor struct { + mock.Mock +} + +// ClientAPIIn provides a mock function with given fields: +func (_m *MockDistributor) ClientAPIIn() chan interface{} { + ret := _m.Called() + + var r0 chan interface{} + if rf, ok := ret.Get(0).(func() chan interface{}); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(chan interface{}) + } + } + + return r0 +} + +// ClientAPIOut provides a mock function with given fields: +func (_m *MockDistributor) ClientAPIOut() chan interface{} { + ret := _m.Called() + + var r0 chan interface{} + if rf, ok := ret.Get(0).(func() chan interface{}); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(chan interface{}) + } + } + + return r0 +} + +// Start provides a mock function with given fields: +func (_m *MockDistributor) Start() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Stop provides a mock function with given fields: +func (_m *MockDistributor) Stop() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} -- cgit v1.3