diff --git a/actions/app.go b/actions/app.go index 208b7df5..a04fa692 100644 --- a/actions/app.go +++ b/actions/app.go @@ -32,7 +32,10 @@ func init() { log.Fatalf("GOPATH is not set!") } gopath = g - storageReader = &memory.Lister{} + storageReader = storage.Reader{ + Lister: &memory.Lister{}, + Versioner: &memory.Versioner{}, + } storageWriter = &memory.Saver{} } @@ -76,10 +79,10 @@ func App() *buffalo.App { app.GET("/all", allHandler(storageReader)) app.GET("/{base_url:.+}/{module}/@v/list", listHandler(storageReader)) - app.GET("/{base_url:.+}/{module}/@v/{ver}.info", versionInfoHandler) - app.GET("/{base_url:.+}/{module}/@v/{ver}.mod", versionModuleHandler) - app.GET("/{base_url:.+}/{module}/@v/{ver}.zip", versionZipHandler) - app.POST("/admin/upload/{base_url:[a-zA-Z./]+}/{module}/{ver}", uploadHandler(storageWriter)) + app.GET("/{base_url:.+}/{module}/@v/{version}.info", versionInfoHandler(storageReader)) + app.GET("/{base_url:.+}/{module}/@v/{version}.mod", versionModuleHandler) + app.GET("/{base_url:.+}/{module}/@v/{version}.zip", versionZipHandler) + app.POST("/admin/upload/{base_url:[a-zA-Z./]+}/{module}/{version}", uploadHandler(storageWriter)) // serve files from the public directory: app.ServeFiles("/", assetsBox) diff --git a/actions/upload.go b/actions/upload.go index d1799e33..9a646aa7 100644 --- a/actions/upload.go +++ b/actions/upload.go @@ -15,7 +15,7 @@ func uploadHandler(store storage.Saver) func(c buffalo.Context) error { if err != nil { return errors.WithStack(err) } - version := c.Param("ver") + version := c.Param("version") payload := new(payloads.Upload) if c.Bind(payload); err != nil { return errors.WithStack(err) diff --git a/actions/version_info.go b/actions/version_info.go index b0a9d79f..6b11db91 100644 --- a/actions/version_info.go +++ b/actions/version_info.go @@ -1,9 +1,27 @@ package actions import ( + "fmt" + "net/http" + + "github.com/arschles/vgoprox/pkg/storage" "github.com/gobuffalo/buffalo" ) -func versionInfoHandler(c buffalo.Context) error { - return nil +func versionInfoHandler(versioner storage.Versioner) func(c buffalo.Context) error { + return func(c buffalo.Context) error { + stdParams, err := getStandardParams(c) + if err != nil { + return err + } + version := c.Param("version") + if version == "" { + return fmt.Errorf("version not found") + } + revInfo, err := versioner.Info(stdParams.baseURL, stdParams.module, version) + if err != nil { + return err + } + return c.Render(http.StatusOK, r.JSON(revInfo)) + } } diff --git a/pkg/storage/memory/versioner.go b/pkg/storage/memory/versioner.go new file mode 100644 index 00000000..3dc3a2f5 --- /dev/null +++ b/pkg/storage/memory/versioner.go @@ -0,0 +1,27 @@ +package memory + +import ( + "github.com/arschles/vgoprox/pkg/storage" +) + +type Versioner struct{} + +func (v *Versioner) Info(baseURL, module, vsn string) (*storage.RevInfo, error) { + entries.RLock() + defer entries.RUnlock() + key := entries.key(baseURL, module) + versions := entries.versions[key] + for _, version := range versions { + if version.info.Version == vsn { + return &version.info, nil + } + } + return nil, &storage.ErrVersionNotFound{ + NotFoundErr: storage.NotFoundErr{ + BasePath: baseURL, + Module: module, + }, + Version: vsn, + } + +} diff --git a/pkg/storage/not_found_err.go b/pkg/storage/not_found_err.go index aa5bd581..6aa9e93d 100644 --- a/pkg/storage/not_found_err.go +++ b/pkg/storage/not_found_err.go @@ -9,6 +9,11 @@ type NotFoundErr struct { Module string } +type ErrVersionNotFound struct { + NotFoundErr + Version string +} + func (n NotFoundErr) Error() string { return fmt.Sprintf("%s/%s not found", n.BasePath, n.Module) } diff --git a/pkg/storage/reader.go b/pkg/storage/reader.go index b387a7e9..f298066c 100644 --- a/pkg/storage/reader.go +++ b/pkg/storage/reader.go @@ -1,5 +1,6 @@ package storage -type Reader interface { +type Reader struct { Lister + Versioner } diff --git a/pkg/storage/versioner.go b/pkg/storage/versioner.go new file mode 100644 index 00000000..bfc424a7 --- /dev/null +++ b/pkg/storage/versioner.go @@ -0,0 +1,6 @@ +package storage + +type Versioner interface { + // must return NotFoundErr if the coordinates are not found + Info(baseURL, module, version string) (*RevInfo, error) +}