package server import ( "strings" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" "github.com/gofiber/fiber/v2/middleware/idempotency" "github.com/gofiber/fiber/v2/middleware/logger" jsoniter "github.com/json-iterator/go" "github.com/rs/zerolog/log" "github.com/spf13/viper" ) var A *fiber.App func NewServer() { A = fiber.New(fiber.Config{ DisableStartupMessage: true, EnableIPValidation: true, ServerHeader: "Hydrogen.Paperclip", AppName: "Hydrogen.Paperclip", ProxyHeader: fiber.HeaderXForwardedFor, JSONEncoder: jsoniter.ConfigCompatibleWithStandardLibrary.Marshal, JSONDecoder: jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal, BodyLimit: 512 * 1024 * 1024 * 1024, // 512 TiB EnablePrintRoutes: viper.GetBool("debug.print_routes"), }) A.Use(idempotency.New()) A.Use(cors.New(cors.Config{ AllowCredentials: true, AllowMethods: strings.Join([]string{ fiber.MethodGet, fiber.MethodPost, fiber.MethodHead, fiber.MethodOptions, fiber.MethodPut, fiber.MethodDelete, fiber.MethodPatch, }, ","), AllowOriginsFunc: func(origin string) bool { return true }, })) A.Use(logger.New(logger.Config{ Format: "${status} | ${latency} | ${method} ${path}\n", Output: log.Logger, })) A.Get("/.well-known", getMetadata) A.Get("/.well-known/destinations", getDestinations) api := A.Group("/api").Name("API") { api.Get("/attachments/:id/meta", getAttachmentMeta) api.Get("/attachments/:id", openAttachment) api.Post("/attachments", authMiddleware, createAttachment) api.Put("/attachments/:id", authMiddleware, updateAttachmentMeta) api.Delete("/attachments/:id", authMiddleware, deleteAttachment) } } func Listen() { if err := A.Listen(viper.GetString("bind")); err != nil { log.Fatal().Err(err).Msg("An error occurred when starting server...") } }