diff --git a/pkg/server/api/complianceportal/v1/auth_resolvers.go b/pkg/server/api/complianceportal/v1/auth_resolvers.go index 35fbcaa89..b484307ae 100644 --- a/pkg/server/api/complianceportal/v1/auth_resolvers.go +++ b/pkg/server/api/complianceportal/v1/auth_resolvers.go @@ -117,6 +117,7 @@ func (r *mutationResolver) UpdateLocale(ctx context.Context, input types.UpdateL } r.logger.ErrorCtx(ctx, "cannot update identity locale", log.Error(err)) + return nil, gqlutils.Internal(ctx) } diff --git a/pkg/server/api/complianceportal/v1/seo.go b/pkg/server/api/complianceportal/v1/seo.go index 6a2140063..7399bcc0d 100644 --- a/pkg/server/api/complianceportal/v1/seo.go +++ b/pkg/server/api/complianceportal/v1/seo.go @@ -23,6 +23,7 @@ package complianceportal_v1 import ( "net/http" "net/url" + "slices" "strings" "go.probo.inc/probo/pkg/iam" @@ -39,12 +40,14 @@ func SEOFromRequest(r *http.Request, pageBaseURL string) (htmlLang, canonical st if pathname == "" { pathname = "/" } + locale, rest := splitLocaleFromAppPath(pathname) htmlLang = locale canonical = localizedPageURL(pageBaseURL, locale, rest) locales := iam.SupportedIdentityLocales + hreflang = make([]HreflangLink, 0, len(locales)+1) for _, loc := range locales { hreflang = append(hreflang, HreflangLink{ @@ -52,6 +55,7 @@ func SEOFromRequest(r *http.Request, pageBaseURL string) (htmlLang, canonical st Href: localizedPageURL(pageBaseURL, loc, rest), }) } + hreflang = append(hreflang, HreflangLink{ Lang: "x-default", Href: localizedPageURL(pageBaseURL, defaultCompliancePortalLocale, rest), @@ -71,6 +75,7 @@ func splitLocaleFromAppPath(appPath string) (locale, rest string) { if len(segments) == 1 { return locale, "/" } + return locale, "/" + strings.Join(segments[1:], "/") } @@ -79,17 +84,13 @@ func splitLocaleFromAppPath(appPath string) (locale, rest string) { } func isCompliancePortalLocale(value string) bool { - for _, locale := range iam.SupportedIdentityLocales { - if locale == value { - return true - } - } - return false + return slices.Contains(iam.SupportedIdentityLocales, value) } func localizedPageURL(pageBaseURL, locale, rest string) string { base := strings.TrimRight(pageBaseURL, "/") segments := []string{locale} + if rest != "/" && rest != "" { trimmed := strings.Trim(rest, "/") if trimmed != "" { @@ -106,5 +107,6 @@ func localizedPageURL(pageBaseURL, locale, rest string) string { if err != nil { return base + "/" + strings.Join(escaped, "/") } + return joined } diff --git a/pkg/server/api/complianceportal/v1/seo_test.go b/pkg/server/api/complianceportal/v1/seo_test.go index a12e9e896..4995d112c 100644 --- a/pkg/server/api/complianceportal/v1/seo_test.go +++ b/pkg/server/api/complianceportal/v1/seo_test.go @@ -47,16 +47,21 @@ func TestSEOFromRequest(t *testing.T) { assert.Equal(t, "https://acme.probopage.localhost/fr/documents", canonical) require.NotEmpty(t, hreflang) - var xDefault string - var enHref string + var ( + xDefault string + enHref string + ) + for _, link := range hreflang { if link.Lang == "x-default" { xDefault = link.Href } + if link.Lang == "en" { enHref = link.Href } } + assert.Equal(t, "https://acme.probopage.localhost/en/documents", enHref) assert.Equal(t, enHref, xDefault) }