You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
1.5 KiB
Go

package api
import (
"errors"
"fmt"
"net/http"
"time"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
"github.com/gofiber/fiber/v2/middleware/favicon"
"github.com/gofiber/fiber/v2/middleware/logger"
recover "github.com/gofiber/fiber/v2/middleware/recover"
"prayertimes/pkg/prayer"
)
type httpError struct {
Message string `json:"message"`
}
type Services struct {
PrayerTimesProvider prayer.TimesProvider
}
func New(services Services) *fiber.App {
app := fiber.New(fiber.Config{
Immutable: true,
DisableStartupMessage: false,
ReadTimeout: time.Second * 10,
WriteTimeout: time.Second * 30,
ErrorHandler: func(ctx *fiber.Ctx, err error) error {
if errors.Is(err, prayer.ErrInvalidLocation) {
return ctx.Status(http.StatusUnprocessableEntity).JSON(httpError{
Message: err.Error(),
})
}
return fiber.DefaultErrorHandler(ctx, err)
},
})
app.Use(
favicon.New(),
recover.New(recover.Config{
EnableStackTrace: true,
}),
logger.New(),
cors.New(),
)
cacheHeader := fmt.Sprintf("max-age=%0f", (time.Hour * 24).Seconds())
app.Get("/healthz", func(ctx *fiber.Ctx) error {
return ctx.SendString("OK")
})
app.Get("/diyanet/prayertimes", func(ctx *fiber.Ctx) error {
locationID := ctx.Query("location_id")
times, err := services.PrayerTimesProvider.Get(ctx.Context(), locationID)
if err != nil {
return err
}
ctx.Response().Header.Add(fiber.HeaderCacheControl, cacheHeader)
return ctx.JSON(times)
})
return app
}