mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-11-26 11:23:32 -06:00
[chore] The Big Middleware and API Refactor (tm) (#1250)
* interim commit: start refactoring middlewares into package under router * another interim commit, this is becoming a big job * another fucking massive interim commit * refactor bookmarks to new style * ambassador, wiz zeze commits you are spoiling uz * she compiles, we're getting there * we're just normal men; we're just innocent men * apiutil * whoopsie * i'm glad noone reads commit msgs haha :blob_sweat: * use that weirdo go-bytesize library for maxMultipartMemory * fix media module paths
This commit is contained in:
parent
560ff1209d
commit
941893a774
228 changed files with 3188 additions and 3047 deletions
|
|
@ -21,6 +21,7 @@ package testrig
|
|||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
|
|
@ -28,35 +29,17 @@ import (
|
|||
"os/signal"
|
||||
"syscall"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/superseriousbusiness/gotosocial/cmd/gotosocial/action"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/account"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/admin"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/app"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/auth"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/blocks"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/emoji"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/favourites"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/fileserver"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/filter"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/followrequest"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/instance"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/list"
|
||||
mediaModule "github.com/superseriousbusiness/gotosocial/internal/api/client/media"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/notification"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/search"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/status"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/streaming"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/client/timeline"
|
||||
userClient "github.com/superseriousbusiness/gotosocial/internal/api/client/user"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/s2s/nodeinfo"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/s2s/user"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/s2s/webfinger"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/api/security"
|
||||
apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/concurrency"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/config"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/gotosocial"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/log"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/messages"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/middleware"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/oidc"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/storage"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/web"
|
||||
|
|
@ -70,7 +53,6 @@ var Start action.GTSAction = func(ctx context.Context) error {
|
|||
|
||||
dbService := testrig.NewTestDB()
|
||||
testrig.StandardDBSetup(dbService, nil)
|
||||
router := testrig.NewTestRouter(dbService)
|
||||
var storageBackend *storage.Driver
|
||||
if os.Getenv("GTS_STORAGE_BACKEND") == "s3" {
|
||||
storageBackend, _ = storage.NewS3Storage()
|
||||
|
|
@ -84,7 +66,6 @@ var Start action.GTSAction = func(ctx context.Context) error {
|
|||
fedWorker := concurrency.NewWorkerPool[messages.FromFederator](-1, -1)
|
||||
|
||||
// build backend handlers
|
||||
oauthServer := testrig.NewTestOauthServer(dbService)
|
||||
transportController := testrig.NewTestTransportController(testrig.NewMockHTTPClient(func(req *http.Request) (*http.Response, error) {
|
||||
r := io.NopCloser(bytes.NewReader([]byte{}))
|
||||
return &http.Response{
|
||||
|
|
@ -102,77 +83,64 @@ var Start action.GTSAction = func(ctx context.Context) error {
|
|||
return fmt.Errorf("error starting processor: %s", err)
|
||||
}
|
||||
|
||||
idp, err := oidc.NewIDP(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error creating oidc idp: %s", err)
|
||||
}
|
||||
/*
|
||||
HTTP router initialization
|
||||
*/
|
||||
|
||||
// build web module
|
||||
webModule := web.New(processor)
|
||||
router := testrig.NewTestRouter(dbService)
|
||||
|
||||
// build client api modules
|
||||
authModule := auth.New(dbService, idp, processor)
|
||||
accountModule := account.New(processor)
|
||||
instanceModule := instance.New(processor)
|
||||
appsModule := app.New(processor)
|
||||
followRequestsModule := followrequest.New(processor)
|
||||
webfingerModule := webfinger.New(processor)
|
||||
nodeInfoModule := nodeinfo.New(processor)
|
||||
usersModule := user.New(processor)
|
||||
timelineModule := timeline.New(processor)
|
||||
notificationModule := notification.New(processor)
|
||||
searchModule := search.New(processor)
|
||||
filtersModule := filter.New(processor)
|
||||
emojiModule := emoji.New(processor)
|
||||
listsModule := list.New(processor)
|
||||
mm := mediaModule.New(processor)
|
||||
fileServerModule := fileserver.New(processor)
|
||||
adminModule := admin.New(processor)
|
||||
statusModule := status.New(processor)
|
||||
securityModule := security.New(dbService, oauthServer)
|
||||
streamingModule := streaming.New(processor)
|
||||
favouritesModule := favourites.New(processor)
|
||||
blocksModule := blocks.New(processor)
|
||||
userClientModule := userClient.New(processor)
|
||||
// attach global middlewares which are used for every request
|
||||
router.AttachGlobalMiddleware(
|
||||
middleware.Logger(),
|
||||
middleware.UserAgent(),
|
||||
middleware.CORS(),
|
||||
middleware.ExtraHeaders(),
|
||||
)
|
||||
|
||||
apis := []api.ClientModule{
|
||||
// modules with middleware go first
|
||||
securityModule,
|
||||
authModule,
|
||||
// attach global no route / 404 handler to the router
|
||||
router.AttachNoRouteHandler(func(c *gin.Context) {
|
||||
apiutil.ErrorHandler(c, gtserror.NewErrorNotFound(errors.New(http.StatusText(http.StatusNotFound))), processor.InstanceGet)
|
||||
})
|
||||
|
||||
// now the web module
|
||||
webModule,
|
||||
|
||||
// now everything else
|
||||
accountModule,
|
||||
instanceModule,
|
||||
appsModule,
|
||||
followRequestsModule,
|
||||
mm,
|
||||
fileServerModule,
|
||||
adminModule,
|
||||
statusModule,
|
||||
webfingerModule,
|
||||
nodeInfoModule,
|
||||
usersModule,
|
||||
timelineModule,
|
||||
notificationModule,
|
||||
searchModule,
|
||||
filtersModule,
|
||||
emojiModule,
|
||||
listsModule,
|
||||
streamingModule,
|
||||
favouritesModule,
|
||||
blocksModule,
|
||||
userClientModule,
|
||||
}
|
||||
|
||||
for _, m := range apis {
|
||||
if err := m.Route(router); err != nil {
|
||||
return fmt.Errorf("routing error: %s", err)
|
||||
// build router modules
|
||||
var idp oidc.IDP
|
||||
var err error
|
||||
if config.GetOIDCEnabled() {
|
||||
idp, err = oidc.NewIDP(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error creating oidc idp: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
routerSession, err := dbService.GetSession(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error retrieving router session for session middleware: %w", err)
|
||||
}
|
||||
|
||||
sessionName, err := middleware.SessionName()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error generating session name for session middleware: %w", err)
|
||||
}
|
||||
|
||||
var (
|
||||
authModule = api.NewAuth(dbService, processor, idp, routerSession, sessionName) // auth/oauth paths
|
||||
clientModule = api.NewClient(dbService, processor) // api client endpoints
|
||||
fileserverModule = api.NewFileserver(processor) // fileserver endpoints
|
||||
wellKnownModule = api.NewWellKnown(processor) // .well-known endpoints
|
||||
nodeInfoModule = api.NewNodeInfo(processor) // nodeinfo endpoint
|
||||
activityPubModule = api.NewActivityPub(dbService, processor) // ActivityPub endpoints
|
||||
webModule = web.New(processor) // web pages + user profiles + settings panels etc
|
||||
)
|
||||
|
||||
// these should be routed in order
|
||||
authModule.Route(router)
|
||||
clientModule.Route(router)
|
||||
fileserverModule.Route(router)
|
||||
wellKnownModule.Route(router)
|
||||
nodeInfoModule.Route(router)
|
||||
activityPubModule.Route(router)
|
||||
webModule.Route(router)
|
||||
|
||||
gts, err := gotosocial.NewServer(dbService, router, federator, mediaManager)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error creating gotosocial service: %s", err)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue