| 
									
										
											  
											
												[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
										 |  |  | // 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/>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package gtscontext | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 16:45:21 +01:00
										 |  |  | import ( | 
					
						
							|  |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2024-04-02 12:12:26 +01:00
										 |  |  | 	"net/http" | 
					
						
							| 
									
										
										
										
											2023-06-13 16:47:56 +02:00
										 |  |  | 	"net/url" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-24 22:50:16 +02:00
										 |  |  | 	"code.superseriousbusiness.org/httpsig" | 
					
						
							| 
									
										
										
										
											2023-06-13 16:47:56 +02:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" | 
					
						
							| 
									
										
										
										
											2023-04-28 16:45:21 +01:00
										 |  |  | ) | 
					
						
							| 
									
										
											  
											
												[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
										 |  |  | 
 | 
					
						
							|  |  |  | // package private context key type. | 
					
						
							|  |  |  | type ctxkey uint | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							|  |  |  | 	// context keys. | 
					
						
							|  |  |  | 	_ ctxkey = iota | 
					
						
							|  |  |  | 	barebonesKey | 
					
						
							| 
									
										
										
										
											2023-04-28 16:45:21 +01:00
										 |  |  | 	fastFailKey | 
					
						
							| 
									
										
										
										
											2023-06-13 16:47:56 +02:00
										 |  |  | 	outgoingPubKeyIDKey | 
					
						
							| 
									
										
										
										
											2023-04-28 16:45:21 +01:00
										 |  |  | 	requestIDKey | 
					
						
							| 
									
										
										
										
											2023-06-13 16:47:56 +02:00
										 |  |  | 	receivingAccountKey | 
					
						
							|  |  |  | 	requestingAccountKey | 
					
						
							|  |  |  | 	otherIRIsKey | 
					
						
							|  |  |  | 	httpSigVerifierKey | 
					
						
							|  |  |  | 	httpSigKey | 
					
						
							|  |  |  | 	httpSigPubKeyIDKey | 
					
						
							| 
									
										
										
										
											2023-06-22 20:46:36 +01:00
										 |  |  | 	dryRunKey | 
					
						
							| 
									
										
										
										
											2024-04-02 12:12:26 +01:00
										 |  |  | 	httpClientSignFnKey | 
					
						
							| 
									
										
											  
											
												[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
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-22 20:46:36 +01:00
										 |  |  | // DryRun returns whether the "dryrun" context key has been set. This can be | 
					
						
							|  |  |  | // used to indicate to functions, (that support it), that only a dry-run of | 
					
						
							|  |  |  | // the operation should be performed. As opposed to making any permanent changes. | 
					
						
							|  |  |  | func DryRun(ctx context.Context) bool { | 
					
						
							|  |  |  | 	_, ok := ctx.Value(dryRunKey).(struct{}) | 
					
						
							|  |  |  | 	return ok | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SetDryRun sets the "dryrun" context flag and returns this wrapped context. | 
					
						
							|  |  |  | // See DryRun() for further information on the "dryrun" context flag. | 
					
						
							|  |  |  | func SetDryRun(ctx context.Context) context.Context { | 
					
						
							|  |  |  | 	return context.WithValue(ctx, dryRunKey, struct{}{}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 16:45:21 +01:00
										 |  |  | // RequestID returns the request ID associated with context. This value will usually | 
					
						
							|  |  |  | // be set by the request ID middleware handler, either pulling an existing supplied | 
					
						
							|  |  |  | // value from request headers, or generating a unique new entry. This is useful for | 
					
						
							|  |  |  | // tying together log entries associated with an original incoming request. | 
					
						
							|  |  |  | func RequestID(ctx context.Context) string { | 
					
						
							|  |  |  | 	id, _ := ctx.Value(requestIDKey).(string) | 
					
						
							|  |  |  | 	return id | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SetRequestID stores the given request ID value and returns the wrapped | 
					
						
							|  |  |  | // context. See RequestID() for further information on the request ID value. | 
					
						
							|  |  |  | func SetRequestID(ctx context.Context, id string) context.Context { | 
					
						
							|  |  |  | 	return context.WithValue(ctx, requestIDKey, id) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-13 16:47:56 +02:00
										 |  |  | // OutgoingPublicKeyID returns the public key ID (URI) associated with context. This | 
					
						
							| 
									
										
										
										
											2023-04-28 16:45:21 +01:00
										 |  |  | // value is useful for logging situations in which a given public key URI is | 
					
						
							|  |  |  | // relevant, e.g. for outgoing requests being signed by the given key. | 
					
						
							| 
									
										
										
										
											2023-06-13 16:47:56 +02:00
										 |  |  | func OutgoingPublicKeyID(ctx context.Context) string { | 
					
						
							|  |  |  | 	id, _ := ctx.Value(outgoingPubKeyIDKey).(string) | 
					
						
							| 
									
										
										
										
											2023-04-28 16:45:21 +01:00
										 |  |  | 	return id | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-13 16:47:56 +02:00
										 |  |  | // SetOutgoingPublicKeyID stores the given public key ID value and returns the wrapped | 
					
						
							| 
									
										
										
										
											2023-04-28 16:45:21 +01:00
										 |  |  | // context. See PublicKeyID() for further information on the public key ID value. | 
					
						
							| 
									
										
										
										
											2023-06-13 16:47:56 +02:00
										 |  |  | func SetOutgoingPublicKeyID(ctx context.Context, id string) context.Context { | 
					
						
							|  |  |  | 	return context.WithValue(ctx, outgoingPubKeyIDKey, id) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // ReceivingAccount returns the local account who owns the resource being | 
					
						
							|  |  |  | // interacted with (inbox, uri, etc) in the current ActivityPub request chain. | 
					
						
							|  |  |  | func ReceivingAccount(ctx context.Context) *gtsmodel.Account { | 
					
						
							|  |  |  | 	acct, _ := ctx.Value(receivingAccountKey).(*gtsmodel.Account) | 
					
						
							|  |  |  | 	return acct | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SetReceivingAccount stores the given receiving account value and returns the wrapped | 
					
						
							|  |  |  | // context. See ReceivingAccount() for further information on the receiving account value. | 
					
						
							|  |  |  | func SetReceivingAccount(ctx context.Context, acct *gtsmodel.Account) context.Context { | 
					
						
							|  |  |  | 	return context.WithValue(ctx, receivingAccountKey, acct) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // RequestingAccount returns the remote account interacting with a local | 
					
						
							|  |  |  | // resource (inbox, uri, etc) in the current ActivityPub request chain. | 
					
						
							|  |  |  | func RequestingAccount(ctx context.Context) *gtsmodel.Account { | 
					
						
							|  |  |  | 	acct, _ := ctx.Value(requestingAccountKey).(*gtsmodel.Account) | 
					
						
							|  |  |  | 	return acct | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SetRequestingAccount stores the given requesting account value and returns the wrapped | 
					
						
							|  |  |  | // context. See RequestingAccount() for further information on the requesting account value. | 
					
						
							|  |  |  | func SetRequestingAccount(ctx context.Context, acct *gtsmodel.Account) context.Context { | 
					
						
							|  |  |  | 	return context.WithValue(ctx, requestingAccountKey, acct) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // OtherIRIs returns other IRIs which are involved in the current ActivityPub request | 
					
						
							|  |  |  | // chain. This usually means: other accounts who are mentioned, CC'd, TO'd, or boosted | 
					
						
							|  |  |  | // by the current inbox POST request. | 
					
						
							|  |  |  | func OtherIRIs(ctx context.Context) []*url.URL { | 
					
						
							|  |  |  | 	iris, _ := ctx.Value(otherIRIsKey).([]*url.URL) | 
					
						
							|  |  |  | 	return iris | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SetOtherIRIs stores the given IRIs slice and returns the wrapped context. | 
					
						
							|  |  |  | // See OtherIRIs() for further information on the IRIs slice value. | 
					
						
							|  |  |  | func SetOtherIRIs(ctx context.Context, iris []*url.URL) context.Context { | 
					
						
							|  |  |  | 	return context.WithValue(ctx, otherIRIsKey, iris) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-02 12:12:26 +01:00
										 |  |  | // HTTPClientSignFunc returns an httpclient signing function for the current client | 
					
						
							|  |  |  | // request context. This can be used to resign a request as calling transport's user. | 
					
						
							|  |  |  | func HTTPClientSignFunc(ctx context.Context) func(*http.Request) error { | 
					
						
							|  |  |  | 	fn, _ := ctx.Value(httpClientSignFnKey).(func(*http.Request) error) | 
					
						
							|  |  |  | 	return fn | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SetHTTPClientSignFunc stores the given httpclient signing function and returns the wrapped | 
					
						
							|  |  |  | // context. See HTTPClientSignFunc() for further information on the signing function value. | 
					
						
							|  |  |  | func SetHTTPClientSignFunc(ctx context.Context, fn func(*http.Request) error) context.Context { | 
					
						
							|  |  |  | 	return context.WithValue(ctx, httpClientSignFnKey, fn) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-13 16:47:56 +02:00
										 |  |  | // HTTPSignatureVerifier returns an http signature verifier for the current ActivityPub | 
					
						
							|  |  |  | // request chain. This verifier can be called to authenticate the current request. | 
					
						
							| 
									
										
										
										
											2024-01-31 15:15:28 +01:00
										 |  |  | func HTTPSignatureVerifier(ctx context.Context) httpsig.VerifierWithOptions { | 
					
						
							|  |  |  | 	verifier, _ := ctx.Value(httpSigVerifierKey).(httpsig.VerifierWithOptions) | 
					
						
							| 
									
										
										
										
											2023-06-13 16:47:56 +02:00
										 |  |  | 	return verifier | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SetHTTPSignatureVerifier stores the given http signature verifier and returns the | 
					
						
							|  |  |  | // wrapped context. See HTTPSignatureVerifier() for further information on the verifier value. | 
					
						
							| 
									
										
										
										
											2024-02-19 05:18:17 -05:00
										 |  |  | func SetHTTPSignatureVerifier(ctx context.Context, verifier httpsig.VerifierWithOptions) context.Context { | 
					
						
							| 
									
										
										
										
											2023-06-13 16:47:56 +02:00
										 |  |  | 	return context.WithValue(ctx, httpSigVerifierKey, verifier) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // HTTPSignature returns the http signature string | 
					
						
							|  |  |  | // value for the current ActivityPub request chain. | 
					
						
							|  |  |  | func HTTPSignature(ctx context.Context) string { | 
					
						
							|  |  |  | 	signature, _ := ctx.Value(httpSigKey).(string) | 
					
						
							|  |  |  | 	return signature | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SetHTTPSignature stores the given http signature string and returns the wrapped | 
					
						
							|  |  |  | // context. See HTTPSignature() for further information on the verifier value. | 
					
						
							|  |  |  | func SetHTTPSignature(ctx context.Context, signature string) context.Context { | 
					
						
							|  |  |  | 	return context.WithValue(ctx, httpSigKey, signature) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // HTTPSignaturePubKeyID returns the public key id of the http signature | 
					
						
							|  |  |  | // for the current ActivityPub request chain. | 
					
						
							|  |  |  | func HTTPSignaturePubKeyID(ctx context.Context) *url.URL { | 
					
						
							|  |  |  | 	pubKeyID, _ := ctx.Value(httpSigPubKeyIDKey).(*url.URL) | 
					
						
							|  |  |  | 	return pubKeyID | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SetHTTPSignaturePubKeyID stores the given http signature public key id and returns | 
					
						
							|  |  |  | // the wrapped context. See HTTPSignaturePubKeyID() for further information on the value. | 
					
						
							|  |  |  | func SetHTTPSignaturePubKeyID(ctx context.Context, pubKeyID *url.URL) context.Context { | 
					
						
							|  |  |  | 	return context.WithValue(ctx, httpSigPubKeyIDKey, pubKeyID) | 
					
						
							| 
									
										
										
										
											2023-04-28 16:45:21 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // IsFastFail returns whether the "fastfail" context key has been set. This | 
					
						
							|  |  |  | // can be used to indicate to an http client, for example, that the result | 
					
						
							|  |  |  | // of an outgoing request is time sensitive and so not to bother with retries. | 
					
						
							|  |  |  | func IsFastfail(ctx context.Context) bool { | 
					
						
							|  |  |  | 	_, ok := ctx.Value(fastFailKey).(struct{}) | 
					
						
							|  |  |  | 	return ok | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SetFastFail sets the "fastfail" context flag and returns this wrapped context. | 
					
						
							|  |  |  | // See IsFastFail() for further information on the "fastfail" context flag. | 
					
						
							|  |  |  | func SetFastFail(ctx context.Context) context.Context { | 
					
						
							|  |  |  | 	return context.WithValue(ctx, fastFailKey, struct{}{}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												[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
										 |  |  | // Barebones returns whether the "barebones" context key has been set. This | 
					
						
							|  |  |  | // can be used to indicate to the database, for example, that only a barebones | 
					
						
							|  |  |  | // model need be returned, Allowing it to skip populating sub models. | 
					
						
							|  |  |  | func Barebones(ctx context.Context) bool { | 
					
						
							|  |  |  | 	_, ok := ctx.Value(barebonesKey).(struct{}) | 
					
						
							|  |  |  | 	return ok | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SetBarebones sets the "barebones" context flag and returns this wrapped context. | 
					
						
							| 
									
										
										
										
											2023-04-28 16:45:21 +01:00
										 |  |  | // See Barebones() for further information on the "barebones" context flag. | 
					
						
							| 
									
										
											  
											
												[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 SetBarebones(ctx context.Context) context.Context { | 
					
						
							|  |  |  | 	return context.WithValue(ctx, barebonesKey, struct{}{}) | 
					
						
							|  |  |  | } |