diff --git a/internal/cmd/home/home.go b/internal/cmd/home/home.go index 391ac58..4e5c600 100644 --- a/internal/cmd/home/home.go +++ b/internal/cmd/home/home.go @@ -152,7 +152,9 @@ func NewApp(logger *log.Logger, config *domain.Config) (*App, error) { // NOTE(toby3d): client request '/:lang/...', try to // understand which language code in subdir is requested. - lang = domain.NewLanguage(head) + if lang = domain.NewLanguage(head); lang != domain.LanguageUnd { + r.URL.Path = tail + } // NOTE(toby3d): get localized site config for requested // subdir if exists. @@ -165,9 +167,9 @@ func NewApp(logger *log.Logger, config *domain.Config) (*App, error) { if res, err := resourcer.Do(r.Context(), r.URL.Path); err == nil { // TODO(toby3d) : ugly workaround, must be refactored - resFile, err := contentDir.Open(res.File.Path()) + resFile, err := contentDir.Open(res.File.Filename()) if err != nil { - http.Error(w, "cannot open: "+err.Error(), http.StatusInternalServerError) + http.Error(w, "cannot open resource: "+err.Error(), http.StatusInternalServerError) return } @@ -175,7 +177,7 @@ func NewApp(logger *log.Logger, config *domain.Config) (*App, error) { resBytes, err := io.ReadAll(resFile) if err != nil { - http.Error(w, "cannot read all: "+err.Error(), http.StatusInternalServerError) + http.Error(w, "cannot read resource: "+err.Error(), http.StatusInternalServerError) return } diff --git a/internal/resource/repository.go b/internal/resource/repository.go index 8258f13..7368052 100644 --- a/internal/resource/repository.go +++ b/internal/resource/repository.go @@ -2,6 +2,7 @@ package resource import ( "context" + "errors" "source.toby3d.me/toby3d/home/internal/domain" ) @@ -13,3 +14,5 @@ type Repository interface { // Fetch returns all resources from dir recursevly. Fetch(ctx context.Context, pattern string) (domain.Resources, int, error) } + +var ErrIsDir error = errors.New("resource is a directory") diff --git a/internal/resource/repository/fs/fs_resource.go b/internal/resource/repository/fs/fs_resource.go index ab25d3d..506847e 100644 --- a/internal/resource/repository/fs/fs_resource.go +++ b/internal/resource/repository/fs/fs_resource.go @@ -25,6 +25,10 @@ func (repo *fileServerResourceRepository) Get(ctx context.Context, p string) (*d return nil, fmt.Errorf("cannot stat resource on path '%s': %w", p, err) } + if info.IsDir() { + return nil, fmt.Errorf("cannot open resource on path '%s': %w", p, resource.ErrIsDir) + } + f, err := repo.root.Open(p) if err != nil { return nil, fmt.Errorf("cannot open resource on path '%s': %w", p, err) diff --git a/internal/resource/usecase/resource_ucase.go b/internal/resource/usecase/resource_ucase.go index 649a5d9..5a8e4a9 100644 --- a/internal/resource/usecase/resource_ucase.go +++ b/internal/resource/usecase/resource_ucase.go @@ -21,9 +21,7 @@ func NewResourceUseCase(resources resource.Repository) resource.UseCase { } func (ucase *resourceUseCase) Do(ctx context.Context, p string) (*domain.Resource, error) { - p = strings.TrimPrefix(path.Clean(p), "/") - - r, err := ucase.resources.Get(ctx, p) + r, err := ucase.resources.Get(ctx, strings.TrimPrefix(path.Clean(p), "/")) if err != nil { return nil, fmt.Errorf("cannot get resource file: %w", err) }