feat: Initial prototype
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/cache"
|
||||
"github.com/gofiber/fiber/v2/middleware/cors"
|
||||
"github.com/gofiber/fiber/v2/middleware/favicon"
|
||||
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(
|
||||
recover.New(recover.Config{
|
||||
EnableStackTrace: true,
|
||||
}),
|
||||
favicon.New(),
|
||||
cors.New(),
|
||||
)
|
||||
|
||||
app.Get("/diyanet/prayertimes", cache.New(), func(ctx *fiber.Ctx) error {
|
||||
locationID := ctx.Query("location_id")
|
||||
|
||||
times, err := services.PrayerTimesProvider.Get(ctx.Context(), locationID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return ctx.JSON(times)
|
||||
})
|
||||
|
||||
return app
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package scrapeutils
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/PuerkitoBio/goquery"
|
||||
"github.com/imroc/req/v3"
|
||||
)
|
||||
|
||||
const userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.0.0"
|
||||
|
||||
var ReqClient = req.NewClient().
|
||||
DisableAutoReadResponse().
|
||||
EnableInsecureSkipVerify().
|
||||
SetUserAgent(userAgent)
|
||||
|
||||
func GetHTML(ctx context.Context, url string) (string, error) {
|
||||
res, err := ReqClient.R().SetContext(ctx).SetRetryCount(3).Get(url)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to get url: %w", err)
|
||||
}
|
||||
html, err := res.ToString()
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to read response body: %w", err)
|
||||
}
|
||||
return html, nil
|
||||
}
|
||||
|
||||
func GetParsed(ctx context.Context, url string) (*goquery.Document, error) {
|
||||
html, err := GetHTML(ctx, url)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get html: %w", err)
|
||||
}
|
||||
doc, err := goquery.NewDocumentFromReader(strings.NewReader(html))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to parse html: %w", err)
|
||||
}
|
||||
return doc, nil
|
||||
}
|
||||
|
||||
type Fetcher struct {
|
||||
}
|
||||
Reference in New Issue
Block a user