🏗️ Created site HTTP delivery

This commit is contained in:
Maxim Lebedev 2024-02-14 23:43:35 +06:00
parent 8a9c78d431
commit 8437b57c73
Signed by: toby3d
GPG Key ID: 1F14E25B7C119FC5
1 changed files with 54 additions and 0 deletions

View File

@ -0,0 +1,54 @@
package http
import (
"context"
"fmt"
"net/http"
"golang.org/x/text/language"
"source.toby3d.me/toby3d/home/internal/common"
"source.toby3d.me/toby3d/home/internal/domain"
"source.toby3d.me/toby3d/home/internal/site"
)
type Handler struct {
sites site.UseCase
}
func NewHandler(sites site.UseCase) *Handler {
return &Handler{sites: sites}
}
func (h *Handler) Handle(ctx context.Context, head string) (*domain.Site, http.Handler, error) {
lang := domain.NewLanguage(head)
site, err := h.sites.Do(ctx, lang)
if err != nil {
return nil, nil, fmt.Errorf("cannot handle site: %w", err)
}
if !site.IsMultiLingual() || head != "" {
return site, nil, nil
}
supported := make([]language.Tag, len(site.Languages))
for i := range site.Languages {
supported[i] = language.Make(site.Languages[i].Lang())
}
if site.DefaultLanguage != domain.LanguageUnd {
supported = append([]language.Tag{language.Make(site.DefaultLanguage.Code())}, supported...)
}
return site, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
requested, _, _ := language.ParseAcceptLanguage(r.Header.Get(common.HeaderAcceptLanguage))
if len(requested) == 0 {
requested = append(requested, language.English)
}
matched, _, _ := language.NewMatcher(supported).Match(requested...)
http.Redirect(w, r, "/"+domain.NewLanguage(matched.String()).Lang()+"/", http.StatusSeeOther)
}), nil
}