From 8437b57c738f1ad70edb3e3355d102edeff2ad95 Mon Sep 17 00:00:00 2001 From: Maxim Lebedev Date: Wed, 14 Feb 2024 23:43:35 +0600 Subject: [PATCH] :building_construction: Created site HTTP delivery --- internal/site/delivery/http/site_http.go | 54 ++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 internal/site/delivery/http/site_http.go diff --git a/internal/site/delivery/http/site_http.go b/internal/site/delivery/http/site_http.go new file mode 100644 index 0000000..9f43111 --- /dev/null +++ b/internal/site/delivery/http/site_http.go @@ -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 +}