mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-29 04:22:24 -05:00 
			
		
		
		
	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
This commit is contained in:
		
					parent
					
						
							
								aa9ce272dc
							
						
					
				
			
			
				commit
				
					
						71a49e2b43
					
				
			
		
					 94 changed files with 6585 additions and 955 deletions
				
			
		
							
								
								
									
										96
									
								
								internal/distributor/distributor.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								internal/distributor/distributor.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 <http://www.gnu.org/licenses/>. | ||||
| */ | ||||
| 
 | ||||
| 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 | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue