From c00b690bd6f600554a1404e692bd9e4373325d27 Mon Sep 17 00:00:00 2001 From: Leonardo Bishop Date: Fri, 17 Jan 2025 13:21:24 +0000 Subject: Initial commit --- api/router.go | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 api/router.go (limited to 'api/router.go') diff --git a/api/router.go b/api/router.go new file mode 100644 index 0000000..82a29b1 --- /dev/null +++ b/api/router.go @@ -0,0 +1,67 @@ +package api + +import ( + "errors" + "log/slog" + "time" + + "github.com/LMBishop/confplanner/api/dto" + "github.com/LMBishop/confplanner/api/handlers" + "github.com/LMBishop/confplanner/api/middleware" + "github.com/LMBishop/confplanner/pkg/favourites" + "github.com/LMBishop/confplanner/pkg/schedule" + "github.com/LMBishop/confplanner/pkg/user" + "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/session" +) + +type ApiServices struct { + UserService user.Service + FavouritesService favourites.Service + ScheduleService schedule.Service +} + +func NewServer(apiServices ApiServices) *fiber.App { + sessionStore := session.New(session.Config{ + Expiration: 24 * time.Hour, + KeyLookup: "cookie:confplanner_session", + CookieSameSite: "None", + }) + + app := fiber.New(fiber.Config{ + ErrorHandler: func(ctx *fiber.Ctx, err error) error { + var ok *dto.OkResponse + if errors.As(err, &ok) { + return ctx.Status(ok.Code).JSON(ok) + } + + var e *dto.ErrorResponse + if errors.As(err, &e) { + return ctx.Status(e.Code).JSON(e) + } + + slog.Error("fiber runtime error", "error", err, "URL", ctx.OriginalURL()) + return ctx.Status(500).JSON(dto.ErrorResponse{ + Code: 500, + Message: "Internal Server Error", + }) + }, + AppName: "confplanner", + }) + + // app.Use(cors.New()) + + requireAuthenticated := middleware.RequireAuthenticated(apiServices.UserService, sessionStore) + + app.Post("/register", handlers.Register(apiServices.UserService)) + app.Post("/login", handlers.Login(apiServices.UserService, sessionStore)) + app.Post("/logout", requireAuthenticated, handlers.Logout(sessionStore)) + + app.Get("/favourites", requireAuthenticated, handlers.GetFavourites(apiServices.FavouritesService)) + app.Post("/favourites", requireAuthenticated, handlers.CreateFavourite(apiServices.FavouritesService)) + app.Delete("/favourites", requireAuthenticated, handlers.DeleteFavourite(apiServices.FavouritesService)) + + app.Get("/schedule", requireAuthenticated, handlers.GetSchedule(apiServices.ScheduleService)) + + return app +} -- cgit v1.2.3-70-g09d2