2023-03-12 16:00:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// GoToSocial  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Copyright (C) GoToSocial Authors admin@gotosocial.org  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// SPDX-License-Identifier: AGPL-3.0-or-later  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// 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/>.  
						 
					
						
							
								
									
										
										
										
											2021-03-05 18:31:12 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-04-19 19:42:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Package gtsmodel contains types used *internally* by GoToSocial and added/removed/selected from the database.  
						 
					
						
							
								
									
										
										
										
											2021-03-15 16:15:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// These types should never be serialized and/or sent out via public APIs, as they contain sensitive information.  
						 
					
						
							
								
									
										
										
										
											2021-08-25 15:34:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// The annotation used on these structs is for handling them via the bun-db ORM.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// See here for more info on bun model annotations: https://bun.uptrace.dev/guide/models.html  
						 
					
						
							
								
									
										
										
										
											2021-04-19 19:42:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								package  gtsmodel  
						 
					
						
							
								
									
										
										
										
											2021-03-05 18:31:12 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"crypto/rsa" 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-03 20:03:05 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"strings" 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-05 18:31:12 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"time" 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-03 20:03:05 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/config" 
							 
						 
					
						
							
								
									
										
											 
										
											
												[performance] refactoring + add fave / follow / request / visibility caching (#1607)
* refactor visibility checking, add caching for visibility
* invalidate visibility cache items on account / status deletes
* fix requester ID passed to visibility cache nil ptr
* de-interface caches, fix home / public timeline caching + visibility
* finish adding code comments for visibility filter
* fix angry goconst linter warnings
* actually finish adding filter visibility code comments for timeline functions
* move home timeline status author check to after visibility
* remove now-unused code
* add more code comments
* add TODO code comment, update printed cache start names
* update printed cache names on stop
* start adding separate follow(request) delete db functions, add specific visibility cache tests
* add relationship type caching
* fix getting local account follows / followed-bys, other small codebase improvements
* simplify invalidation using cache hooks, add more GetAccountBy___() functions
* fix boosting to return 404 if not boostable but no error (to not leak status ID)
* remove dead code
* improved placement of cache invalidation
* update license headers
* add example follow, follow-request config entries
* add example visibility cache configuration to config file
* use specific PutFollowRequest() instead of just Put()
* add tests for all GetAccountBy()
* add GetBlockBy() tests
* update block to check primitive fields
* update and finish adding Get{Account,Block,Follow,FollowRequest}By() tests
* fix copy-pasted code
* update envparsing test
* whitespace
* fix bun struct tag
* add license header to gtscontext
* fix old license header
* improved error creation to not use fmt.Errorf() when not needed
* fix various rebase conflicts, fix account test
* remove commented-out code, fix-up mention caching
* fix mention select bun statement
* ensure mention target account populated, pass in context to customrenderer logging
* remove more uncommented code, fix typeutil test
* add statusfave database model caching
* add status fave cache configuration
* add status fave cache example config
* woops, catch missed error. nice catch linter!
* add back testrig panic on nil db
* update example configuration to match defaults, slight tweak to cache configuration defaults
* update envparsing test with new defaults
* fetch followingget to use the follow target account
* use accounnt.IsLocal() instead of empty domain check
* use constants for the cache visibility type check
* use bun.In() for notification type restriction in db query
* include replies when fetching PublicTimeline() (to account for single-author threads in Visibility{}.StatusPublicTimelineable())
* use bun query building for nested select statements to ensure working with postgres
* update public timeline future status checks to match visibility filter
* same as previous, for home timeline
* update public timeline tests to dynamically check for appropriate statuses
* migrate accounts to allow unique constraint on public_key
* provide minimal account with publicKey
---------
Signed-off-by: kim <grufwub@gmail.com>
Co-authored-by: tsmethurst <tobi.smethurst@protonmail.com>
											 
										 
										
											2023-03-28 14:03:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/log" 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-05 18:31:12 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 19:27:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Account represents either a local or a remote fediverse account, gotosocial or otherwise (mastodon, pleroma, etc).  
						 
					
						
							
								
									
										
										
										
											2021-03-15 23:05:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								type  Account  struct  {  
						 
					
						
							
								
									
										
										
										
											2021-09-02 12:10:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ID                       string            ` validate:"required,ulid" bun:"type:CHAR(26),pk,nullzero,notnull,unique" `                                                // id of this item in the database 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-03 20:03:05 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									CreatedAt                time . Time         ` validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp" `                                         // when was item created. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									UpdatedAt                time . Time         ` validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp" `                                         // when was item was last updated. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									FetchedAt                time . Time         ` validate:"required_with=Domain" bun:"type:timestamptz,nullzero" `                                                        // when was item (remote) last fetched. 
							 
						 
					
						
							
								
									
										
											 
										
											
												[performance] refactoring + add fave / follow / request / visibility caching (#1607)
* refactor visibility checking, add caching for visibility
* invalidate visibility cache items on account / status deletes
* fix requester ID passed to visibility cache nil ptr
* de-interface caches, fix home / public timeline caching + visibility
* finish adding code comments for visibility filter
* fix angry goconst linter warnings
* actually finish adding filter visibility code comments for timeline functions
* move home timeline status author check to after visibility
* remove now-unused code
* add more code comments
* add TODO code comment, update printed cache start names
* update printed cache names on stop
* start adding separate follow(request) delete db functions, add specific visibility cache tests
* add relationship type caching
* fix getting local account follows / followed-bys, other small codebase improvements
* simplify invalidation using cache hooks, add more GetAccountBy___() functions
* fix boosting to return 404 if not boostable but no error (to not leak status ID)
* remove dead code
* improved placement of cache invalidation
* update license headers
* add example follow, follow-request config entries
* add example visibility cache configuration to config file
* use specific PutFollowRequest() instead of just Put()
* add tests for all GetAccountBy()
* add GetBlockBy() tests
* update block to check primitive fields
* update and finish adding Get{Account,Block,Follow,FollowRequest}By() tests
* fix copy-pasted code
* update envparsing test
* whitespace
* fix bun struct tag
* add license header to gtscontext
* fix old license header
* improved error creation to not use fmt.Errorf() when not needed
* fix various rebase conflicts, fix account test
* remove commented-out code, fix-up mention caching
* fix mention select bun statement
* ensure mention target account populated, pass in context to customrenderer logging
* remove more uncommented code, fix typeutil test
* add statusfave database model caching
* add status fave cache configuration
* add status fave cache example config
* woops, catch missed error. nice catch linter!
* add back testrig panic on nil db
* update example configuration to match defaults, slight tweak to cache configuration defaults
* update envparsing test with new defaults
* fetch followingget to use the follow target account
* use accounnt.IsLocal() instead of empty domain check
* use constants for the cache visibility type check
* use bun.In() for notification type restriction in db query
* include replies when fetching PublicTimeline() (to account for single-author threads in Visibility{}.StatusPublicTimelineable())
* use bun query building for nested select statements to ensure working with postgres
* update public timeline future status checks to match visibility filter
* same as previous, for home timeline
* update public timeline tests to dynamically check for appropriate statuses
* migrate accounts to allow unique constraint on public_key
* provide minimal account with publicKey
---------
Signed-off-by: kim <grufwub@gmail.com>
Co-authored-by: tsmethurst <tobi.smethurst@protonmail.com>
											 
										 
										
											2023-03-28 14:03:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Username                 string            ` validate:"required" bun:",nullzero,notnull,unique:usernamedomain" `                                                      // Username of the account, should just be a string of [a-zA-Z0-9_]. Can be added to domain to create the full username in the form ``[username]@[domain]`` eg., ``user_96@example.org``. Username and domain should be unique *with* each other 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Domain                   string            ` validate:"omitempty,fqdn" bun:",nullzero,unique:usernamedomain" `                                                        // Domain of the account, will be null if this is a local account, otherwise something like ``example.org``. Should be unique with username. 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 12:10:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									AvatarMediaAttachmentID  string            ` validate:"omitempty,ulid" bun:"type:CHAR(26),nullzero" `                                                                 // Database ID of the media attachment, if present 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									AvatarMediaAttachment    * MediaAttachment  ` validate:"-" bun:"rel:belongs-to" `                                                                                      // MediaAttachment corresponding to avatarMediaAttachmentID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									AvatarRemoteURL          string            ` validate:"omitempty,url" bun:",nullzero" `                                                                               // For a non-local account, where can the header be fetched? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HeaderMediaAttachmentID  string            ` validate:"omitempty,ulid" bun:"type:CHAR(26),nullzero" `                                                                 // Database ID of the media attachment, if present 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HeaderMediaAttachment    * MediaAttachment  ` validate:"-" bun:"rel:belongs-to" `                                                                                      // MediaAttachment corresponding to headerMediaAttachmentID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HeaderRemoteURL          string            ` validate:"omitempty,url" bun:",nullzero" `                                                                               // For a non-local account, where can the header be fetched? 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-10 09:08:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DisplayName              string            ` validate:"-" bun:"" `                                                                                                    // DisplayName for this account. Can be empty, then just the Username will be used for display purposes. 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 11:56:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EmojiIDs                 [ ] string          ` validate:"dive,ulid" bun:"emojis,array" `                                                                                // Database IDs of any emojis used in this account's bio, display name, etc 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Emojis                   [ ] * Emoji          ` validate:"-" bun:"attached_emojis,m2m:account_to_emojis" `                                                               // Emojis corresponding to emojiIDs. https://bun.uptrace.dev/guide/relations.html#many-to-many-relation 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 12:10:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Fields                   [ ] Field           ` validate:"-" `                                                                                                           // a key/value map of fields that this account has added to their profile 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-10 09:08:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Note                     string            ` validate:"-" bun:"" `                                                                                                    // A note that this account has on their profile (ie., the account's bio/description of themselves) 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-07 16:55:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									NoteRaw                  string            ` validate:"-" bun:"" `                                                                                                    // The raw contents of .Note without conversion to HTML, only available when requester = target 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 12:35:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Memorial                 * bool             ` validate:"-" bun:",default:false" `                                                                                      // Is this a memorial account, ie., has the user passed away? 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-10 09:08:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									AlsoKnownAs              string            ` validate:"omitempty,ulid" bun:"type:CHAR(26),nullzero" `                                                                 // This account is associated with x account id (TODO: migrate to be AlsoKnownAsID) 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 12:10:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									MovedToAccountID         string            ` validate:"omitempty,ulid" bun:"type:CHAR(26),nullzero" `                                                                 // This account has moved this account id in the database 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 12:35:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Bot                      * bool             ` validate:"-" bun:",default:false" `                                                                                      // Does this account identify itself as a bot? 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-10 09:08:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Reason                   string            ` validate:"-" bun:"" `                                                                                                    // What reason was given for signing up when this account was created? 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 12:35:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Locked                   * bool             ` validate:"-" bun:",default:true" `                                                                                       // Does this account need an approval for new followers? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Discoverable             * bool             ` validate:"-" bun:",default:false" `                                                                                      // Should this account be shown in the instance's profile directory? 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 12:10:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Privacy                  Visibility        ` validate:"required_without=Domain,omitempty,oneof=public unlocked followers_only mutuals_only direct" bun:",nullzero" `  // Default post privacy for this account 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 12:35:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Sensitive                * bool             ` validate:"-" bun:",default:false" `                                                                                      // Set posts from this account to sensitive by default? 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 12:10:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Language                 string            ` validate:"omitempty,bcp47_language_tag" bun:",nullzero,notnull,default:'en'" `                                           // What language does this account post in? 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-02 03:06:40 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									StatusContentType        string            ` validate:"required_without=Domain,omitempty,oneof=text/plain text/markdown" bun:",nullzero" `                            // What is the default format for statuses posted by this account (only for local accounts). 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-12 13:14:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									CustomCSS                string            ` validate:"-" bun:",nullzero" `                                                                                           // Custom CSS that should be displayed for this Account's profile and statuses. 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 12:10:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									URI                      string            ` validate:"required,url" bun:",nullzero,notnull,unique" `                                                                 // ActivityPub URI for this account. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									URL                      string            ` validate:"required_without=Domain,omitempty,url" bun:",nullzero,unique" `                                                // Web URL for this account's profile 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									InboxURI                 string            ` validate:"required_without=Domain,omitempty,url" bun:",nullzero,unique" `                                                // Address of this account's ActivityPub inbox, for sending activity to 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 21:27:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									SharedInboxURI           * string           ` validate:"-" bun:"" `                                                                                                    // Address of this account's ActivityPub sharedInbox. Gotcha warning: this is a string pointer because it has three possible states: 1. We don't know yet if the account has a shared inbox -- null. 2. We know it doesn't have a shared inbox -- empty string. 3. We know it does have a shared inbox -- url string. 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 12:10:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									OutboxURI                string            ` validate:"required_without=Domain,omitempty,url" bun:",nullzero,unique" `                                                // Address of this account's activitypub outbox 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									FollowingURI             string            ` validate:"required_without=Domain,omitempty,url" bun:",nullzero,unique" `                                                // URI for getting the following list of this account 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									FollowersURI             string            ` validate:"required_without=Domain,omitempty,url" bun:",nullzero,unique" `                                                // URI for getting the followers list of this account 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									FeaturedCollectionURI    string            ` validate:"required_without=Domain,omitempty,url" bun:",nullzero,unique" `                                                // URL for getting the featured collection list of this account 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ActorType                string            ` validate:"oneof=Application Group Organization Person Service" bun:",nullzero,notnull" `                                 // What type of activitypub actor is this account? 
							 
						 
					
						
							
								
									
										
											 
										
											
												[performance] refactoring + add fave / follow / request / visibility caching (#1607)
* refactor visibility checking, add caching for visibility
* invalidate visibility cache items on account / status deletes
* fix requester ID passed to visibility cache nil ptr
* de-interface caches, fix home / public timeline caching + visibility
* finish adding code comments for visibility filter
* fix angry goconst linter warnings
* actually finish adding filter visibility code comments for timeline functions
* move home timeline status author check to after visibility
* remove now-unused code
* add more code comments
* add TODO code comment, update printed cache start names
* update printed cache names on stop
* start adding separate follow(request) delete db functions, add specific visibility cache tests
* add relationship type caching
* fix getting local account follows / followed-bys, other small codebase improvements
* simplify invalidation using cache hooks, add more GetAccountBy___() functions
* fix boosting to return 404 if not boostable but no error (to not leak status ID)
* remove dead code
* improved placement of cache invalidation
* update license headers
* add example follow, follow-request config entries
* add example visibility cache configuration to config file
* use specific PutFollowRequest() instead of just Put()
* add tests for all GetAccountBy()
* add GetBlockBy() tests
* update block to check primitive fields
* update and finish adding Get{Account,Block,Follow,FollowRequest}By() tests
* fix copy-pasted code
* update envparsing test
* whitespace
* fix bun struct tag
* add license header to gtscontext
* fix old license header
* improved error creation to not use fmt.Errorf() when not needed
* fix various rebase conflicts, fix account test
* remove commented-out code, fix-up mention caching
* fix mention select bun statement
* ensure mention target account populated, pass in context to customrenderer logging
* remove more uncommented code, fix typeutil test
* add statusfave database model caching
* add status fave cache configuration
* add status fave cache example config
* woops, catch missed error. nice catch linter!
* add back testrig panic on nil db
* update example configuration to match defaults, slight tweak to cache configuration defaults
* update envparsing test with new defaults
* fetch followingget to use the follow target account
* use accounnt.IsLocal() instead of empty domain check
* use constants for the cache visibility type check
* use bun.In() for notification type restriction in db query
* include replies when fetching PublicTimeline() (to account for single-author threads in Visibility{}.StatusPublicTimelineable())
* use bun query building for nested select statements to ensure working with postgres
* update public timeline future status checks to match visibility filter
* same as previous, for home timeline
* update public timeline tests to dynamically check for appropriate statuses
* migrate accounts to allow unique constraint on public_key
* provide minimal account with publicKey
---------
Signed-off-by: kim <grufwub@gmail.com>
Co-authored-by: tsmethurst <tobi.smethurst@protonmail.com>
											 
										 
										
											2023-03-28 14:03:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									PrivateKey               * rsa . PrivateKey   ` validate:"required_without=Domain" bun:"" `                                                                              // Privatekey for validating activitypub requests, will only be defined for local accounts 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									PublicKey                * rsa . PublicKey    ` validate:"required" bun:",notnull,unique" `                                                                              // Publickey for encoding activitypub requests, will be defined for both local and remote accounts 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 12:10:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									PublicKeyURI             string            ` validate:"required,url" bun:",nullzero,notnull,unique" `                                                                 // Web-reachable location of this account's public key 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-20 17:41:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									SensitizedAt             time . Time         ` validate:"-" bun:"type:timestamptz,nullzero" `                                                                           // When was this account set to have all its media shown as sensitive? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									SilencedAt               time . Time         ` validate:"-" bun:"type:timestamptz,nullzero" `                                                                           // When was this account silenced (eg., statuses only visible to followers, not public)? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									SuspendedAt              time . Time         ` validate:"-" bun:"type:timestamptz,nullzero" `                                                                           // When was this account suspended (eg., don't allow it to log in/post, don't accept media/posts from this account) 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 12:35:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HideCollections          * bool             ` validate:"-" bun:",default:false" `                                                                                      // Hide this account's collections 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 12:10:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									SuspensionOrigin         string            ` validate:"omitempty,ulid" bun:"type:CHAR(26),nullzero" `                                                                 // id of the database entry that caused this account to become suspended -- can be an account ID or a domain block ID 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-08 14:00:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EnableRSS                * bool             ` validate:"-" bun:",default:false" `                                                                                      // enable RSS feed subscription for this account's public posts at [URL]/feed 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-05 18:31:12 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-02-03 20:03:05 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// IsLocal returns whether account is a local user account.  
						 
					
						
							
								
									
										
											 
										
											
												[performance] refactoring + add fave / follow / request / visibility caching (#1607)
* refactor visibility checking, add caching for visibility
* invalidate visibility cache items on account / status deletes
* fix requester ID passed to visibility cache nil ptr
* de-interface caches, fix home / public timeline caching + visibility
* finish adding code comments for visibility filter
* fix angry goconst linter warnings
* actually finish adding filter visibility code comments for timeline functions
* move home timeline status author check to after visibility
* remove now-unused code
* add more code comments
* add TODO code comment, update printed cache start names
* update printed cache names on stop
* start adding separate follow(request) delete db functions, add specific visibility cache tests
* add relationship type caching
* fix getting local account follows / followed-bys, other small codebase improvements
* simplify invalidation using cache hooks, add more GetAccountBy___() functions
* fix boosting to return 404 if not boostable but no error (to not leak status ID)
* remove dead code
* improved placement of cache invalidation
* update license headers
* add example follow, follow-request config entries
* add example visibility cache configuration to config file
* use specific PutFollowRequest() instead of just Put()
* add tests for all GetAccountBy()
* add GetBlockBy() tests
* update block to check primitive fields
* update and finish adding Get{Account,Block,Follow,FollowRequest}By() tests
* fix copy-pasted code
* update envparsing test
* whitespace
* fix bun struct tag
* add license header to gtscontext
* fix old license header
* improved error creation to not use fmt.Errorf() when not needed
* fix various rebase conflicts, fix account test
* remove commented-out code, fix-up mention caching
* fix mention select bun statement
* ensure mention target account populated, pass in context to customrenderer logging
* remove more uncommented code, fix typeutil test
* add statusfave database model caching
* add status fave cache configuration
* add status fave cache example config
* woops, catch missed error. nice catch linter!
* add back testrig panic on nil db
* update example configuration to match defaults, slight tweak to cache configuration defaults
* update envparsing test with new defaults
* fetch followingget to use the follow target account
* use accounnt.IsLocal() instead of empty domain check
* use constants for the cache visibility type check
* use bun.In() for notification type restriction in db query
* include replies when fetching PublicTimeline() (to account for single-author threads in Visibility{}.StatusPublicTimelineable())
* use bun query building for nested select statements to ensure working with postgres
* update public timeline future status checks to match visibility filter
* same as previous, for home timeline
* update public timeline tests to dynamically check for appropriate statuses
* migrate accounts to allow unique constraint on public_key
* provide minimal account with publicKey
---------
Signed-off-by: kim <grufwub@gmail.com>
Co-authored-by: tsmethurst <tobi.smethurst@protonmail.com>
											 
										 
										
											2023-03-28 14:03:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( a  * Account )  IsLocal ( )  bool  {  
						 
					
						
							
								
									
										
										
										
											2023-02-03 20:03:05 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  a . Domain  ==  ""  ||  a . Domain  ==  config . GetHost ( )  ||  a . Domain  ==  config . GetAccountDomain ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// IsRemote returns whether account is a remote user account.  
						 
					
						
							
								
									
										
											 
										
											
												[performance] refactoring + add fave / follow / request / visibility caching (#1607)
* refactor visibility checking, add caching for visibility
* invalidate visibility cache items on account / status deletes
* fix requester ID passed to visibility cache nil ptr
* de-interface caches, fix home / public timeline caching + visibility
* finish adding code comments for visibility filter
* fix angry goconst linter warnings
* actually finish adding filter visibility code comments for timeline functions
* move home timeline status author check to after visibility
* remove now-unused code
* add more code comments
* add TODO code comment, update printed cache start names
* update printed cache names on stop
* start adding separate follow(request) delete db functions, add specific visibility cache tests
* add relationship type caching
* fix getting local account follows / followed-bys, other small codebase improvements
* simplify invalidation using cache hooks, add more GetAccountBy___() functions
* fix boosting to return 404 if not boostable but no error (to not leak status ID)
* remove dead code
* improved placement of cache invalidation
* update license headers
* add example follow, follow-request config entries
* add example visibility cache configuration to config file
* use specific PutFollowRequest() instead of just Put()
* add tests for all GetAccountBy()
* add GetBlockBy() tests
* update block to check primitive fields
* update and finish adding Get{Account,Block,Follow,FollowRequest}By() tests
* fix copy-pasted code
* update envparsing test
* whitespace
* fix bun struct tag
* add license header to gtscontext
* fix old license header
* improved error creation to not use fmt.Errorf() when not needed
* fix various rebase conflicts, fix account test
* remove commented-out code, fix-up mention caching
* fix mention select bun statement
* ensure mention target account populated, pass in context to customrenderer logging
* remove more uncommented code, fix typeutil test
* add statusfave database model caching
* add status fave cache configuration
* add status fave cache example config
* woops, catch missed error. nice catch linter!
* add back testrig panic on nil db
* update example configuration to match defaults, slight tweak to cache configuration defaults
* update envparsing test with new defaults
* fetch followingget to use the follow target account
* use accounnt.IsLocal() instead of empty domain check
* use constants for the cache visibility type check
* use bun.In() for notification type restriction in db query
* include replies when fetching PublicTimeline() (to account for single-author threads in Visibility{}.StatusPublicTimelineable())
* use bun query building for nested select statements to ensure working with postgres
* update public timeline future status checks to match visibility filter
* same as previous, for home timeline
* update public timeline tests to dynamically check for appropriate statuses
* migrate accounts to allow unique constraint on public_key
* provide minimal account with publicKey
---------
Signed-off-by: kim <grufwub@gmail.com>
Co-authored-by: tsmethurst <tobi.smethurst@protonmail.com>
											 
										 
										
											2023-03-28 14:03:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( a  * Account )  IsRemote ( )  bool  {  
						 
					
						
							
								
									
										
										
										
											2023-02-03 20:03:05 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  ! a . IsLocal ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// IsInstance returns whether account is an instance internal actor account.  
						 
					
						
							
								
									
										
											 
										
											
												[performance] refactoring + add fave / follow / request / visibility caching (#1607)
* refactor visibility checking, add caching for visibility
* invalidate visibility cache items on account / status deletes
* fix requester ID passed to visibility cache nil ptr
* de-interface caches, fix home / public timeline caching + visibility
* finish adding code comments for visibility filter
* fix angry goconst linter warnings
* actually finish adding filter visibility code comments for timeline functions
* move home timeline status author check to after visibility
* remove now-unused code
* add more code comments
* add TODO code comment, update printed cache start names
* update printed cache names on stop
* start adding separate follow(request) delete db functions, add specific visibility cache tests
* add relationship type caching
* fix getting local account follows / followed-bys, other small codebase improvements
* simplify invalidation using cache hooks, add more GetAccountBy___() functions
* fix boosting to return 404 if not boostable but no error (to not leak status ID)
* remove dead code
* improved placement of cache invalidation
* update license headers
* add example follow, follow-request config entries
* add example visibility cache configuration to config file
* use specific PutFollowRequest() instead of just Put()
* add tests for all GetAccountBy()
* add GetBlockBy() tests
* update block to check primitive fields
* update and finish adding Get{Account,Block,Follow,FollowRequest}By() tests
* fix copy-pasted code
* update envparsing test
* whitespace
* fix bun struct tag
* add license header to gtscontext
* fix old license header
* improved error creation to not use fmt.Errorf() when not needed
* fix various rebase conflicts, fix account test
* remove commented-out code, fix-up mention caching
* fix mention select bun statement
* ensure mention target account populated, pass in context to customrenderer logging
* remove more uncommented code, fix typeutil test
* add statusfave database model caching
* add status fave cache configuration
* add status fave cache example config
* woops, catch missed error. nice catch linter!
* add back testrig panic on nil db
* update example configuration to match defaults, slight tweak to cache configuration defaults
* update envparsing test with new defaults
* fetch followingget to use the follow target account
* use accounnt.IsLocal() instead of empty domain check
* use constants for the cache visibility type check
* use bun.In() for notification type restriction in db query
* include replies when fetching PublicTimeline() (to account for single-author threads in Visibility{}.StatusPublicTimelineable())
* use bun query building for nested select statements to ensure working with postgres
* update public timeline future status checks to match visibility filter
* same as previous, for home timeline
* update public timeline tests to dynamically check for appropriate statuses
* migrate accounts to allow unique constraint on public_key
* provide minimal account with publicKey
---------
Signed-off-by: kim <grufwub@gmail.com>
Co-authored-by: tsmethurst <tobi.smethurst@protonmail.com>
											 
										 
										
											2023-03-28 14:03:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( a  * Account )  IsInstance ( )  bool  {  
						 
					
						
							
								
									
										
										
										
											2023-02-03 20:03:05 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  a . Username  ==  a . Domain  || 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										a . FollowersURI  ==  ""  || 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										a . FollowingURI  ==  ""  || 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										( a . Username  ==  "internal.fetch"  &&  strings . Contains ( a . Note ,  "internal service actor" ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												[performance] refactoring + add fave / follow / request / visibility caching (#1607)
* refactor visibility checking, add caching for visibility
* invalidate visibility cache items on account / status deletes
* fix requester ID passed to visibility cache nil ptr
* de-interface caches, fix home / public timeline caching + visibility
* finish adding code comments for visibility filter
* fix angry goconst linter warnings
* actually finish adding filter visibility code comments for timeline functions
* move home timeline status author check to after visibility
* remove now-unused code
* add more code comments
* add TODO code comment, update printed cache start names
* update printed cache names on stop
* start adding separate follow(request) delete db functions, add specific visibility cache tests
* add relationship type caching
* fix getting local account follows / followed-bys, other small codebase improvements
* simplify invalidation using cache hooks, add more GetAccountBy___() functions
* fix boosting to return 404 if not boostable but no error (to not leak status ID)
* remove dead code
* improved placement of cache invalidation
* update license headers
* add example follow, follow-request config entries
* add example visibility cache configuration to config file
* use specific PutFollowRequest() instead of just Put()
* add tests for all GetAccountBy()
* add GetBlockBy() tests
* update block to check primitive fields
* update and finish adding Get{Account,Block,Follow,FollowRequest}By() tests
* fix copy-pasted code
* update envparsing test
* whitespace
* fix bun struct tag
* add license header to gtscontext
* fix old license header
* improved error creation to not use fmt.Errorf() when not needed
* fix various rebase conflicts, fix account test
* remove commented-out code, fix-up mention caching
* fix mention select bun statement
* ensure mention target account populated, pass in context to customrenderer logging
* remove more uncommented code, fix typeutil test
* add statusfave database model caching
* add status fave cache configuration
* add status fave cache example config
* woops, catch missed error. nice catch linter!
* add back testrig panic on nil db
* update example configuration to match defaults, slight tweak to cache configuration defaults
* update envparsing test with new defaults
* fetch followingget to use the follow target account
* use accounnt.IsLocal() instead of empty domain check
* use constants for the cache visibility type check
* use bun.In() for notification type restriction in db query
* include replies when fetching PublicTimeline() (to account for single-author threads in Visibility{}.StatusPublicTimelineable())
* use bun query building for nested select statements to ensure working with postgres
* update public timeline future status checks to match visibility filter
* same as previous, for home timeline
* update public timeline tests to dynamically check for appropriate statuses
* migrate accounts to allow unique constraint on public_key
* provide minimal account with publicKey
---------
Signed-off-by: kim <grufwub@gmail.com>
Co-authored-by: tsmethurst <tobi.smethurst@protonmail.com>
											 
										 
										
											2023-03-28 14:03:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// EmojisPopulated returns whether emojis are populated according to current EmojiIDs.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( a  * Account )  EmojisPopulated ( )  bool  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  len ( a . EmojiIDs )  !=  len ( a . Emojis )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// this is the quickest indicator. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Emojis must be in same order. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  i ,  id  :=  range  a . EmojiIDs  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  a . Emojis [ i ]  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											log . Warnf ( nil ,  "nil emoji in slice for account %s" ,  a . URI ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  a . Emojis [ i ] . ID  !=  id  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 11:56:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// AccountToEmoji is an intermediate struct to facilitate the many2many relationship between an account and one or more emojis.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  AccountToEmoji  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									AccountID  string    ` validate:"ulid,required" bun:"type:CHAR(26),unique:accountemoji,nullzero,notnull" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Account    * Account  ` validate:"-" bun:"rel:belongs-to" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EmojiID    string    ` validate:"ulid,required" bun:"type:CHAR(26),unique:accountemoji,nullzero,notnull" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Emoji      * Emoji    ` validate:"-" bun:"rel:belongs-to" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Field represents a key value field on an account, for things like pronouns, website, etc.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// VerifiedAt is optional, to be used only if Value is a URL to a webpage that contains the  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// username of the user.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  Field  struct  {  
						 
					
						
							
								
									
										
										
										
											2021-08-31 19:27:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Name        string     ` validate:"required" `           // Name of this field. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Value       string     ` validate:"required" `           // Value of this field. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									VerifiedAt  time . Time  ` validate:"-" bun:",nullzero" `  // This field was verified at (optional). 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-07 13:05:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Relationship describes a requester's relationship with another account.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  Relationship  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ID                   string  // The account id. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Following            bool    // Are you following this user? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ShowingReblogs       bool    // Are you receiving this user's boosts in your home timeline? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Notifying            bool    // Have you enabled notifications for this user? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									FollowedBy           bool    // Are you followed by this user? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Blocking             bool    // Are you blocking this user? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BlockedBy            bool    // Is this user blocking you? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Muting               bool    // Are you muting this user? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									MutingNotifications  bool    // Are you muting notifications from this user? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Requested            bool    // Do you have a pending follow request for this user? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DomainBlocking       bool    // Are you blocking this user's domain? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Endorsed             bool    // Are you featuring this user on your profile? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Note                 string  // Your note on this account. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}