diff options
Diffstat (limited to 'internal/api/client/admin')
| -rw-r--r-- | internal/api/client/admin/accountaction.go | 40 | ||||
| -rw-r--r-- | internal/api/client/admin/domainblockcreate.go | 72 | ||||
| -rw-r--r-- | internal/api/client/admin/domainblockdelete.go | 38 | ||||
| -rw-r--r-- | internal/api/client/admin/domainblockget.go | 46 | ||||
| -rw-r--r-- | internal/api/client/admin/domainblocksget.go | 50 | ||||
| -rw-r--r-- | internal/api/client/admin/emojicreate.go | 48 | ||||
| -rw-r--r-- | internal/api/client/admin/emojicreate_test.go | 2 | ||||
| -rw-r--r-- | internal/api/client/admin/mediacleanup.go | 39 | 
8 files changed, 159 insertions, 176 deletions
| diff --git a/internal/api/client/admin/accountaction.go b/internal/api/client/admin/accountaction.go index 46473fa73..072a60a9d 100644 --- a/internal/api/client/admin/accountaction.go +++ b/internal/api/client/admin/accountaction.go @@ -19,12 +19,14 @@  package admin  import ( +	"errors"  	"fmt"  	"net/http"  	"github.com/gin-gonic/gin" -	"github.com/sirupsen/logrus" +	"github.com/superseriousbusiness/gotosocial/internal/api"  	"github.com/superseriousbusiness/gotosocial/internal/api/model" +	"github.com/superseriousbusiness/gotosocial/internal/gtserror"  	"github.com/superseriousbusiness/gotosocial/internal/oauth"  ) @@ -72,53 +74,47 @@ import (  //      description: unauthorized  //   '403':  //      description: forbidden +//   '404': +//      description: not found +//   '406': +//      description: not acceptable +//   '500': +//      description: internal server error  func (m *Module) AccountActionPOSTHandler(c *gin.Context) { -	l := logrus.WithFields(logrus.Fields{ -		"func":        "AccountActionPOSTHandler", -		"request_uri": c.Request.RequestURI, -		"user_agent":  c.Request.UserAgent(), -		"origin_ip":   c.ClientIP(), -	}) - -	// make sure we're authed...  	authed, err := oauth.Authed(c, true, true, true, true)  	if err != nil { -		l.Debugf("couldn't auth: %s", err) -		c.JSON(http.StatusUnauthorized, gin.H{"error": err.Error()}) +		api.ErrorHandler(c, gtserror.NewErrorUnauthorized(err, err.Error()), m.processor.InstanceGet)  		return  	} -	// with an admin account  	if !authed.User.Admin { -		l.Debugf("user %s not an admin", authed.User.ID) -		c.JSON(http.StatusForbidden, gin.H{"error": "not an admin"}) +		err := fmt.Errorf("user %s not an admin", authed.User.ID) +		api.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGet)  		return  	} -	// extract the form from the request context -	l.Tracef("parsing request form: %+v", c.Request.Form)  	form := &model.AdminAccountActionRequest{}  	if err := c.ShouldBind(form); err != nil { -		l.Debugf("error parsing form %+v: %s", c.Request.Form, err) -		c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("could not parse form: %s", err)}) +		api.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGet)  		return  	}  	if form.Type == "" { -		c.JSON(http.StatusBadRequest, gin.H{"error": "no type specified"}) +		err := errors.New("no type specified") +		api.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGet)  		return  	}  	targetAcctID := c.Param(IDKey)  	if targetAcctID == "" { -		c.JSON(http.StatusBadRequest, gin.H{"error": "no account id specified"}) +		err := errors.New("no account id specified") +		api.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGet)  		return  	}  	form.TargetAccountID = targetAcctID  	if errWithCode := m.processor.AdminAccountAction(c.Request.Context(), authed, form); errWithCode != nil { -		l.Debugf("error performing account action: %s", errWithCode.Error()) -		c.JSON(errWithCode.Code(), gin.H{"error": errWithCode.Safe()}) +		api.ErrorHandler(c, errWithCode, m.processor.InstanceGet)  		return  	} diff --git a/internal/api/client/admin/domainblockcreate.go b/internal/api/client/admin/domainblockcreate.go index dd5623a1c..e23376a91 100644 --- a/internal/api/client/admin/domainblockcreate.go +++ b/internal/api/client/admin/domainblockcreate.go @@ -7,9 +7,9 @@ import (  	"strconv"  	"github.com/gin-gonic/gin" -	"github.com/sirupsen/logrus"  	"github.com/superseriousbusiness/gotosocial/internal/api"  	"github.com/superseriousbusiness/gotosocial/internal/api/model" +	"github.com/superseriousbusiness/gotosocial/internal/gtserror"  	"github.com/superseriousbusiness/gotosocial/internal/oauth"  ) @@ -86,33 +86,33 @@ import (  //       Note that if a list has been imported, then an `array` of newly created domain blocks will be returned instead.  //     schema:  //       "$ref": "#/definitions/domainBlock" -//   '403': -//      description: forbidden  //   '400':  //      description: bad request +//   '401': +//      description: unauthorized +//   '403': +//      description: forbidden +//   '404': +//      description: not found +//   '406': +//      description: not acceptable +//   '500': +//      description: internal server error  func (m *Module) DomainBlocksPOSTHandler(c *gin.Context) { -	l := logrus.WithFields(logrus.Fields{ -		"func":        "DomainBlocksPOSTHandler", -		"request_uri": c.Request.RequestURI, -		"user_agent":  c.Request.UserAgent(), -		"origin_ip":   c.ClientIP(), -	}) - -	// make sure we're authed with an admin account  	authed, err := oauth.Authed(c, true, true, true, true)  	if err != nil { -		l.Debugf("couldn't auth: %s", err) -		c.JSON(http.StatusForbidden, gin.H{"error": err.Error()}) +		api.ErrorHandler(c, gtserror.NewErrorUnauthorized(err, err.Error()), m.processor.InstanceGet)  		return  	} +  	if !authed.User.Admin { -		l.Debugf("user %s not an admin", authed.User.ID) -		c.JSON(http.StatusForbidden, gin.H{"error": "not an admin"}) +		err := fmt.Errorf("user %s not an admin", authed.User.ID) +		api.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGet)  		return  	}  	if _, err := api.NegotiateAccept(c, api.JSONAcceptHeaders...); err != nil { -		c.JSON(http.StatusNotAcceptable, gin.H{"error": err.Error()}) +		api.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGet)  		return  	} @@ -121,49 +121,43 @@ func (m *Module) DomainBlocksPOSTHandler(c *gin.Context) {  	if importString != "" {  		i, err := strconv.ParseBool(importString)  		if err != nil { -			l.Debugf("error parsing import string: %s", err) -			c.JSON(http.StatusBadRequest, gin.H{"error": "couldn't parse import query param"}) +			err := fmt.Errorf("error parsing %s: %s", ImportQueryKey, err) +			api.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGet)  			return  		}  		imp = i  	} -	// extract the media create form from the request context -	l.Tracef("parsing request form: %+v", c.Request.Form)  	form := &model.DomainBlockCreateRequest{}  	if err := c.ShouldBind(form); err != nil { -		l.Debugf("error parsing form %+v: %s", c.Request.Form, err) -		c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("could not parse form: %s", err)}) +		api.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGet)  		return  	} -	// Give the fields on the request form a first pass to make sure the request is superficially valid. -	l.Tracef("validating form %+v", form)  	if err := validateCreateDomainBlock(form, imp); err != nil { -		l.Debugf("error validating form: %s", err) -		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) +		err := fmt.Errorf("error validating form: %s", err) +		api.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGet)  		return  	}  	if imp {  		// we're importing multiple blocks -		domainBlocks, err := m.processor.AdminDomainBlocksImport(c.Request.Context(), authed, form) -		if err != nil { -			l.Debugf("error importing domain blocks: %s", err) -			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) +		domainBlocks, errWithCode := m.processor.AdminDomainBlocksImport(c.Request.Context(), authed, form) +		if errWithCode != nil { +			api.ErrorHandler(c, errWithCode, m.processor.InstanceGet)  			return  		}  		c.JSON(http.StatusOK, domainBlocks) -	} else { -		// we're just creating one block -		domainBlock, err := m.processor.AdminDomainBlockCreate(c.Request.Context(), authed, form) -		if err != nil { -			l.Debugf("error creating domain block: %s", err) -			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) -			return -		} -		c.JSON(http.StatusOK, domainBlock) +		return +	} + +	// we're just creating one block +	domainBlock, errWithCode := m.processor.AdminDomainBlockCreate(c.Request.Context(), authed, form) +	if errWithCode != nil { +		api.ErrorHandler(c, errWithCode, m.processor.InstanceGet) +		return  	} +	c.JSON(http.StatusOK, domainBlock)  }  func validateCreateDomainBlock(form *model.DomainBlockCreateRequest, imp bool) error { diff --git a/internal/api/client/admin/domainblockdelete.go b/internal/api/client/admin/domainblockdelete.go index 8d41ec072..416db002b 100644 --- a/internal/api/client/admin/domainblockdelete.go +++ b/internal/api/client/admin/domainblockdelete.go @@ -1,11 +1,13 @@  package admin  import ( +	"errors" +	"fmt"  	"net/http"  	"github.com/gin-gonic/gin" -	"github.com/sirupsen/logrus"  	"github.com/superseriousbusiness/gotosocial/internal/api" +	"github.com/superseriousbusiness/gotosocial/internal/gtserror"  	"github.com/superseriousbusiness/gotosocial/internal/oauth"  ) @@ -36,48 +38,46 @@ import (  //     description: The domain block that was just deleted.  //     schema:  //       "$ref": "#/definitions/domainBlock" -//   '403': -//      description: forbidden  //   '400':  //      description: bad request +//   '401': +//      description: unauthorized +//   '403': +//      description: forbidden  //   '404':  //      description: not found +//   '406': +//      description: not acceptable +//   '500': +//      description: internal server error  func (m *Module) DomainBlockDELETEHandler(c *gin.Context) { -	l := logrus.WithFields(logrus.Fields{ -		"func":        "DomainBlockDELETEHandler", -		"request_uri": c.Request.RequestURI, -		"user_agent":  c.Request.UserAgent(), -		"origin_ip":   c.ClientIP(), -	}) - -	// make sure we're authed with an admin account  	authed, err := oauth.Authed(c, true, true, true, true)  	if err != nil { -		l.Debugf("couldn't auth: %s", err) -		c.JSON(http.StatusForbidden, gin.H{"error": err.Error()}) +		api.ErrorHandler(c, gtserror.NewErrorUnauthorized(err, err.Error()), m.processor.InstanceGet)  		return  	} +  	if !authed.User.Admin { -		l.Debugf("user %s not an admin", authed.User.ID) -		c.JSON(http.StatusForbidden, gin.H{"error": "not an admin"}) +		err := fmt.Errorf("user %s not an admin", authed.User.ID) +		api.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGet)  		return  	}  	if _, err := api.NegotiateAccept(c, api.JSONAcceptHeaders...); err != nil { -		c.JSON(http.StatusNotAcceptable, gin.H{"error": err.Error()}) +		api.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGet)  		return  	}  	domainBlockID := c.Param(IDKey)  	if domainBlockID == "" { -		c.JSON(http.StatusBadRequest, gin.H{"error": "no domain block id provided"}) +		err := errors.New("no domain block id specified") +		api.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGet)  		return  	}  	domainBlock, errWithCode := m.processor.AdminDomainBlockDelete(c.Request.Context(), authed, domainBlockID)  	if errWithCode != nil { -		l.Debugf("error deleting domain block: %s", errWithCode.Error()) -		c.JSON(errWithCode.Code(), gin.H{"error": errWithCode.Safe()}) +		api.ErrorHandler(c, errWithCode, m.processor.InstanceGet)  		return  	} diff --git a/internal/api/client/admin/domainblockget.go b/internal/api/client/admin/domainblockget.go index 49a0795d7..15456242c 100644 --- a/internal/api/client/admin/domainblockget.go +++ b/internal/api/client/admin/domainblockget.go @@ -1,12 +1,14 @@  package admin  import ( +	"errors" +	"fmt"  	"net/http"  	"strconv"  	"github.com/gin-gonic/gin" -	"github.com/sirupsen/logrus"  	"github.com/superseriousbusiness/gotosocial/internal/api" +	"github.com/superseriousbusiness/gotosocial/internal/gtserror"  	"github.com/superseriousbusiness/gotosocial/internal/oauth"  ) @@ -37,41 +39,40 @@ import (  //     description: The requested domain block.  //     schema:  //       "$ref": "#/definitions/domainBlock" -//   '403': -//      description: forbidden  //   '400':  //      description: bad request +//   '401': +//      description: unauthorized +//   '403': +//      description: forbidden  //   '404':  //      description: not found +//   '406': +//      description: not acceptable +//   '500': +//      description: internal server error  func (m *Module) DomainBlockGETHandler(c *gin.Context) { -	l := logrus.WithFields(logrus.Fields{ -		"func":        "DomainBlockGETHandler", -		"request_uri": c.Request.RequestURI, -		"user_agent":  c.Request.UserAgent(), -		"origin_ip":   c.ClientIP(), -	}) - -	// make sure we're authed with an admin account  	authed, err := oauth.Authed(c, true, true, true, true)  	if err != nil { -		l.Debugf("couldn't auth: %s", err) -		c.JSON(http.StatusForbidden, gin.H{"error": err.Error()}) +		api.ErrorHandler(c, gtserror.NewErrorUnauthorized(err, err.Error()), m.processor.InstanceGet)  		return  	} +  	if !authed.User.Admin { -		l.Debugf("user %s not an admin", authed.User.ID) -		c.JSON(http.StatusForbidden, gin.H{"error": "not an admin"}) +		err := fmt.Errorf("user %s not an admin", authed.User.ID) +		api.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGet)  		return  	}  	if _, err := api.NegotiateAccept(c, api.JSONAcceptHeaders...); err != nil { -		c.JSON(http.StatusNotAcceptable, gin.H{"error": err.Error()}) +		api.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGet)  		return  	}  	domainBlockID := c.Param(IDKey)  	if domainBlockID == "" { -		c.JSON(http.StatusBadRequest, gin.H{"error": "no domain block id provided"}) +		err := errors.New("no domain block id specified") +		api.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGet)  		return  	} @@ -80,17 +81,16 @@ func (m *Module) DomainBlockGETHandler(c *gin.Context) {  	if exportString != "" {  		i, err := strconv.ParseBool(exportString)  		if err != nil { -			l.Debugf("error parsing export string: %s", err) -			c.JSON(http.StatusBadRequest, gin.H{"error": "couldn't parse export query param"}) +			err := fmt.Errorf("error parsing %s: %s", ExportQueryKey, err) +			api.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGet)  			return  		}  		export = i  	} -	domainBlock, err := m.processor.AdminDomainBlockGet(c.Request.Context(), authed, domainBlockID, export) -	if err != nil { -		l.Debugf("error getting domain block: %s", err) -		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) +	domainBlock, errWithCode := m.processor.AdminDomainBlockGet(c.Request.Context(), authed, domainBlockID, export) +	if errWithCode != nil { +		api.ErrorHandler(c, errWithCode, m.processor.InstanceGet)  		return  	} diff --git a/internal/api/client/admin/domainblocksget.go b/internal/api/client/admin/domainblocksget.go index 94b1c89ce..d585e837d 100644 --- a/internal/api/client/admin/domainblocksget.go +++ b/internal/api/client/admin/domainblocksget.go @@ -1,12 +1,14 @@  package admin  import ( +	"errors" +	"fmt"  	"net/http"  	"strconv"  	"github.com/gin-gonic/gin" -	"github.com/sirupsen/logrus"  	"github.com/superseriousbusiness/gotosocial/internal/api" +	"github.com/superseriousbusiness/gotosocial/internal/gtserror"  	"github.com/superseriousbusiness/gotosocial/internal/oauth"  ) @@ -43,35 +45,40 @@ import (  //       type: array  //       items:  //         "$ref": "#/definitions/domainBlock" -//   '403': -//      description: forbidden  //   '400':  //      description: bad request +//   '401': +//      description: unauthorized +//   '403': +//      description: forbidden  //   '404':  //      description: not found +//   '406': +//      description: not acceptable +//   '500': +//      description: internal server error  func (m *Module) DomainBlocksGETHandler(c *gin.Context) { -	l := logrus.WithFields(logrus.Fields{ -		"func":        "DomainBlocksGETHandler", -		"request_uri": c.Request.RequestURI, -		"user_agent":  c.Request.UserAgent(), -		"origin_ip":   c.ClientIP(), -	}) - -	// make sure we're authed with an admin account  	authed, err := oauth.Authed(c, true, true, true, true)  	if err != nil { -		l.Debugf("couldn't auth: %s", err) -		c.JSON(http.StatusForbidden, gin.H{"error": err.Error()}) +		api.ErrorHandler(c, gtserror.NewErrorUnauthorized(err, err.Error()), m.processor.InstanceGet)  		return  	} +  	if !authed.User.Admin { -		l.Debugf("user %s not an admin", authed.User.ID) -		c.JSON(http.StatusForbidden, gin.H{"error": "not an admin"}) +		err := fmt.Errorf("user %s not an admin", authed.User.ID) +		api.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGet)  		return  	}  	if _, err := api.NegotiateAccept(c, api.JSONAcceptHeaders...); err != nil { -		c.JSON(http.StatusNotAcceptable, gin.H{"error": err.Error()}) +		api.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGet) +		return +	} + +	domainBlockID := c.Param(IDKey) +	if domainBlockID == "" { +		err := errors.New("no domain block id specified") +		api.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGet)  		return  	} @@ -80,17 +87,16 @@ func (m *Module) DomainBlocksGETHandler(c *gin.Context) {  	if exportString != "" {  		i, err := strconv.ParseBool(exportString)  		if err != nil { -			l.Debugf("error parsing export string: %s", err) -			c.JSON(http.StatusBadRequest, gin.H{"error": "couldn't parse export query param"}) +			err := fmt.Errorf("error parsing %s: %s", ExportQueryKey, err) +			api.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGet)  			return  		}  		export = i  	} -	domainBlocks, err := m.processor.AdminDomainBlocksGet(c.Request.Context(), authed, export) -	if err != nil { -		l.Debugf("error getting domain blocks: %s", err) -		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) +	domainBlocks, errWithCode := m.processor.AdminDomainBlocksGet(c.Request.Context(), authed, export) +	if errWithCode != nil { +		api.ErrorHandler(c, errWithCode, m.processor.InstanceGet)  		return  	} diff --git a/internal/api/client/admin/emojicreate.go b/internal/api/client/admin/emojicreate.go index ef42d0a13..c5d613312 100644 --- a/internal/api/client/admin/emojicreate.go +++ b/internal/api/client/admin/emojicreate.go @@ -24,9 +24,9 @@ import (  	"net/http"  	"github.com/gin-gonic/gin" -	"github.com/sirupsen/logrus"  	"github.com/superseriousbusiness/gotosocial/internal/api"  	"github.com/superseriousbusiness/gotosocial/internal/api/model" +	"github.com/superseriousbusiness/gotosocial/internal/gtserror"  	"github.com/superseriousbusiness/gotosocial/internal/oauth"  	"github.com/superseriousbusiness/gotosocial/internal/validate"  ) @@ -69,59 +69,52 @@ import (  //     description: The newly-created emoji.  //     schema:  //       "$ref": "#/definitions/emoji" -//   '403': -//      description: forbidden  //   '400':  //      description: bad request +//   '401': +//      description: unauthorized +//   '403': +//      description: forbidden +//   '404': +//      description: not found +//   '406': +//      description: not acceptable  //   '409':  //      description: conflict -- domain/shortcode combo for emoji already exists +//   '500': +//      description: internal server error  func (m *Module) EmojiCreatePOSTHandler(c *gin.Context) { -	l := logrus.WithFields(logrus.Fields{ -		"func":        "emojiCreatePOSTHandler", -		"request_uri": c.Request.RequestURI, -		"user_agent":  c.Request.UserAgent(), -		"origin_ip":   c.ClientIP(), -	}) - -	// make sure we're authed with an admin account -	authed, err := oauth.Authed(c, true, true, true, true) // posting a status is serious business so we want *everything* +	authed, err := oauth.Authed(c, true, true, true, true)  	if err != nil { -		l.Debugf("couldn't auth: %s", err) -		c.JSON(http.StatusForbidden, gin.H{"error": err.Error()}) +		api.ErrorHandler(c, gtserror.NewErrorUnauthorized(err, err.Error()), m.processor.InstanceGet)  		return  	} +  	if !authed.User.Admin { -		l.Debugf("user %s not an admin", authed.User.ID) -		c.JSON(http.StatusForbidden, gin.H{"error": "not an admin"}) +		err := fmt.Errorf("user %s not an admin", authed.User.ID) +		api.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGet)  		return  	}  	if _, err := api.NegotiateAccept(c, api.JSONAcceptHeaders...); err != nil { -		c.JSON(http.StatusNotAcceptable, gin.H{"error": err.Error()}) +		api.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGet)  		return  	} -	// extract the media create form from the request context -	l.Tracef("parsing request form: %+v", c.Request.Form)  	form := &model.EmojiCreateRequest{}  	if err := c.ShouldBind(form); err != nil { -		l.Debugf("error parsing form %+v: %s", c.Request.Form, err) -		c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("could not parse form: %s", err)}) +		api.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGet)  		return  	} -	// Give the fields on the request form a first pass to make sure the request is superficially valid. -	l.Tracef("validating form %+v", form)  	if err := validateCreateEmoji(form); err != nil { -		l.Debugf("error validating form: %s", err) -		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) +		api.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGet)  		return  	}  	apiEmoji, errWithCode := m.processor.AdminEmojiCreate(c.Request.Context(), authed, form)  	if errWithCode != nil { -		l.Debugf("error creating emoji: %s", errWithCode.Error()) -		c.JSON(errWithCode.Code(), gin.H{"error": errWithCode.Safe()}) +		api.ErrorHandler(c, errWithCode, m.processor.InstanceGet)  		return  	} @@ -129,7 +122,6 @@ func (m *Module) EmojiCreatePOSTHandler(c *gin.Context) {  }  func validateCreateEmoji(form *model.EmojiCreateRequest) error { -	// check there actually is an image attached and it's not size 0  	if form.Image == nil || form.Image.Size == 0 {  		return errors.New("no emoji given")  	} diff --git a/internal/api/client/admin/emojicreate_test.go b/internal/api/client/admin/emojicreate_test.go index 2b7476da1..1b6ddf96f 100644 --- a/internal/api/client/admin/emojicreate_test.go +++ b/internal/api/client/admin/emojicreate_test.go @@ -120,7 +120,7 @@ func (suite *EmojiCreateTestSuite) TestEmojiCreateAlreadyExists() {  	suite.NoError(err)  	suite.NotEmpty(b) -	suite.Equal(`{"error":"conflict: emoji with shortcode rainbow already exists"}`, string(b)) +	suite.Equal(`{"error":"Conflict: emoji with shortcode rainbow already exists"}`, string(b))  }  func TestEmojiCreateTestSuite(t *testing.T) { diff --git a/internal/api/client/admin/mediacleanup.go b/internal/api/client/admin/mediacleanup.go index 02eec82f3..6065acd3b 100644 --- a/internal/api/client/admin/mediacleanup.go +++ b/internal/api/client/admin/mediacleanup.go @@ -23,9 +23,10 @@ import (  	"net/http"  	"github.com/gin-gonic/gin" -	"github.com/sirupsen/logrus" +	"github.com/superseriousbusiness/gotosocial/internal/api"  	"github.com/superseriousbusiness/gotosocial/internal/api/model"  	"github.com/superseriousbusiness/gotosocial/internal/config" +	"github.com/superseriousbusiness/gotosocial/internal/gtserror"  	"github.com/superseriousbusiness/gotosocial/internal/oauth"  ) @@ -54,39 +55,34 @@ import (  //   '200':  //     description: |-  //      Echos the number of days requested. The cleanup is performed asynchronously after the request completes. -//   '403': -//      description: forbidden  //   '400':  //      description: bad request +//   '401': +//      description: unauthorized +//   '403': +//      description: forbidden +//   '404': +//      description: not found +//   '406': +//      description: not acceptable +//   '500': +//      description: internal server error  func (m *Module) MediaCleanupPOSTHandler(c *gin.Context) { -	l := logrus.WithFields(logrus.Fields{ -		"func":        "MediaCleanupPOSTHandler", -		"request_uri": c.Request.RequestURI, -		"user_agent":  c.Request.UserAgent(), -		"origin_ip":   c.ClientIP(), -	}) - -	// make sure we're authed...  	authed, err := oauth.Authed(c, true, true, true, true)  	if err != nil { -		l.Debugf("couldn't auth: %s", err) -		c.JSON(http.StatusUnauthorized, gin.H{"error": err.Error()}) +		api.ErrorHandler(c, gtserror.NewErrorUnauthorized(err, err.Error()), m.processor.InstanceGet)  		return  	} -	// with an admin account  	if !authed.User.Admin { -		l.Debugf("user %s not an admin", authed.User.ID) -		c.JSON(http.StatusForbidden, gin.H{"error": "not an admin"}) +		err := fmt.Errorf("user %s not an admin", authed.User.ID) +		api.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGet)  		return  	} -	// extract the form from the request context -	l.Tracef("parsing request form: %+v", c.Request.Form)  	form := &model.MediaCleanupRequest{}  	if err := c.ShouldBind(form); err != nil { -		l.Debugf("error parsing form %+v: %s", c.Request.Form, err) -		c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("could not parse form: %s", err)}) +		api.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGet)  		return  	} @@ -101,8 +97,7 @@ func (m *Module) MediaCleanupPOSTHandler(c *gin.Context) {  	}  	if errWithCode := m.processor.AdminMediaPrune(c.Request.Context(), remoteCacheDays); errWithCode != nil { -		l.Debugf("error starting prune of remote media: %s", errWithCode.Error()) -		c.JSON(errWithCode.Code(), gin.H{"error": errWithCode.Safe()}) +		api.ErrorHandler(c, errWithCode, m.processor.InstanceGet)  		return  	} | 
