diff options
Diffstat (limited to 'internal/api/client')
| -rw-r--r-- | internal/api/client/admin/admin.go | 7 | ||||
| -rw-r--r-- | internal/api/client/admin/admin_test.go | 2 | ||||
| -rw-r--r-- | internal/api/client/admin/debug_off.go | 32 | ||||
| -rw-r--r-- | internal/api/client/admin/debug_on.go | 24 | 
4 files changed, 63 insertions, 2 deletions
diff --git a/internal/api/client/admin/admin.go b/internal/api/client/admin/admin.go index e898bca46..ef54f0b50 100644 --- a/internal/api/client/admin/admin.go +++ b/internal/api/client/admin/admin.go @@ -23,6 +23,7 @@ import (  	"codeberg.org/gruf/go-debug"  	"github.com/gin-gonic/gin"  	"github.com/superseriousbusiness/gotosocial/internal/processing" +	"github.com/superseriousbusiness/gotosocial/internal/state"  )  const ( @@ -56,6 +57,7 @@ const (  	InstanceRulesPathWithID = InstanceRulesPath + "/:" + IDKey  	DebugPath               = BasePath + "/debug"  	DebugAPUrlPath          = DebugPath + "/apurl" +	DebugClearCachesPath    = DebugPath + "/caches/clear"  	IDKey                 = "id"  	FilterQueryKey        = "filter" @@ -73,11 +75,13 @@ const (  type Module struct {  	processor *processing.Processor +	state     *state.State  } -func New(processor *processing.Processor) *Module { +func New(state *state.State, processor *processing.Processor) *Module {  	return &Module{  		processor: processor, +		state:     state,  	}  } @@ -145,5 +149,6 @@ func (m *Module) Route(attachHandler func(method string, path string, f ...gin.H  	// debug stuff  	if debug.DEBUG {  		attachHandler(http.MethodGet, DebugAPUrlPath, m.DebugAPUrlHandler) +		attachHandler(http.MethodPost, DebugClearCachesPath, m.DebugClearCachesHandler)  	}  } diff --git a/internal/api/client/admin/admin_test.go b/internal/api/client/admin/admin_test.go index 4a429e57a..962ec3872 100644 --- a/internal/api/client/admin/admin_test.go +++ b/internal/api/client/admin/admin_test.go @@ -105,7 +105,7 @@ func (suite *AdminStandardTestSuite) SetupTest() {  	suite.sentEmails = make(map[string]string)  	suite.emailSender = testrig.NewEmailSender("../../../../web/template/", suite.sentEmails)  	suite.processor = testrig.NewTestProcessor(&suite.state, suite.federator, suite.emailSender, suite.mediaManager) -	suite.adminModule = admin.New(suite.processor) +	suite.adminModule = admin.New(&suite.state, suite.processor)  	testrig.StandardDBSetup(suite.db, nil)  	testrig.StandardStorageSetup(suite.storage, "../../../../testrig/media")  } diff --git a/internal/api/client/admin/debug_off.go b/internal/api/client/admin/debug_off.go index bc6e4001c..a43326f02 100644 --- a/internal/api/client/admin/debug_off.go +++ b/internal/api/client/admin/debug_off.go @@ -73,3 +73,35 @@ import (  //		'500':  //			description: internal server error  func (m *Module) DebugAPUrlHandler(c *gin.Context) {} + +// DebugClearCachesHandler swagger:operation POST /api/v1/admin/debug/caches/clear debugClearCaches +// +// Sweep/clear all in-memory caches. +// +// Only enabled / exposed if GoToSocial was built and is running with flag DEBUG=1. +// +//	--- +//	tags: +//	- debug +// +//	produces: +//	- application/json +// +//	security: +//	- OAuth2 Bearer: +//		- admin +// +//	responses: +//		'200': +//			description: All good baby! +//		'400': +//			description: bad request +//		'401': +//			description: unauthorized +//		'404': +//			description: not found +//		'406': +//			description: not acceptable +//		'500': +//			description: internal server error +func (m *Module) DebugClearCachesHandler(c *gin.Context) {} diff --git a/internal/api/client/admin/debug_on.go b/internal/api/client/admin/debug_on.go index c6dfa11ff..ea42206f8 100644 --- a/internal/api/client/admin/debug_on.go +++ b/internal/api/client/admin/debug_on.go @@ -56,3 +56,27 @@ func (m *Module) DebugAPUrlHandler(c *gin.Context) {  	c.JSON(http.StatusOK, resp)  } + +func (m *Module) DebugClearCachesHandler(c *gin.Context) { +	authed, err := oauth.Authed(c, true, true, true, true) +	if err != nil { +		apiutil.ErrorHandler(c, gtserror.NewErrorUnauthorized(err, err.Error()), m.processor.InstanceGetV1) +		return +	} + +	if !*authed.User.Admin { +		err := fmt.Errorf("user %s not an admin", authed.User.ID) +		apiutil.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGetV1) +		return +	} + +	if _, err := apiutil.NegotiateAccept(c, apiutil.JSONAcceptHeaders...); err != nil { +		apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1) +		return +	} + +	// Sweep all caches down to 0 (empty). +	m.state.Caches.Sweep(0) + +	c.JSON(http.StatusOK, gin.H{"status": "OK"}) +}  | 
