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
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("/api/v1/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
|
|
}
|