package http import ( "encoding/json" "fmt" "net/http" "github.com/go-chi/chi/v5" chimiddleware "github.com/go-chi/chi/v5/middleware" "github.com/go-chi/render" "github.com/opencloud-eu/opencloud/pkg/account" "github.com/opencloud-eu/opencloud/pkg/cors" "github.com/opencloud-eu/opencloud/pkg/middleware" ohttp "github.com/opencloud-eu/opencloud/pkg/service/http" "github.com/opencloud-eu/opencloud/pkg/version" "github.com/opencloud-eu/opencloud/services/graph/pkg/errorcode" "github.com/opencloud-eu/opencloud/services/invitations/pkg/invitations" svc "github.com/opencloud-eu/opencloud/services/invitations/pkg/service/v0" "go-micro.dev/v4" ) // Server initializes the http service and server. func Server(opts ...Option) (ohttp.Service, error) { options := newOptions(opts...) service := options.Service svc, err := ohttp.NewService( ohttp.TLSConfig(options.Config.HTTP.TLS), ohttp.Logger(options.Logger), ohttp.Namespace(options.Config.HTTP.Namespace), ohttp.Name(options.Config.Service.Name), ohttp.Version(version.GetString()), ohttp.Address(options.Config.HTTP.Addr), ohttp.Context(options.Context), ohttp.Flags(options.Flags...), ) if err != nil { options.Logger.Error(). Err(err). Msg("Error initializing http service") return ohttp.Service{}, err } mux := chi.NewMux() mux.Use(chimiddleware.RealIP) mux.Use(chimiddleware.RequestID) mux.Use(middleware.TraceContext) mux.Use(middleware.NoCache) mux.Use( middleware.Cors( cors.Logger(options.Logger), cors.AllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), cors.AllowedMethods(options.Config.HTTP.CORS.AllowedMethods), cors.AllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), cors.AllowCredentials(options.Config.HTTP.CORS.AllowCredentials), )) mux.Use(middleware.Version( options.Name, version.String, )) mux.Use(middleware.ExtractAccountUUID( account.Logger(options.Logger), account.JWTSecret(options.Config.TokenManager.JWTSecret), )) // this logs http request related data mux.Use(middleware.Logger( options.Logger, )) mux.Route(options.Config.HTTP.Root, func(r chi.Router) { r.Post("/invitations", InvitationHandler(service)) }) err = micro.RegisterHandler(svc.Server(), mux) if err != nil { options.Logger.Fatal().Err(err).Msg("failed to register the handler") } svc.Init() return svc, nil } func InvitationHandler(service svc.Service) func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() i := &invitations.Invitation{} err := json.NewDecoder(r.Body).Decode(i) if err != nil { errorcode.InvalidRequest.Render(w, r, http.StatusBadRequest, fmt.Sprintf("invalid request body: %v", err.Error())) return } res, err := service.Invite(ctx, i) if err != nil { render.Status(r, http.StatusInternalServerError) render.PlainText(w, r, err.Error()) return } render.Status(r, http.StatusCreated) render.JSON(w, r, res) } }