Skip to content

Commit

Permalink
Merge default Range.
Browse files Browse the repository at this point in the history
  • Loading branch information
ejholmes committed Jul 24, 2015
1 parent abf75f6 commit be7a437
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 19 deletions.
24 changes: 24 additions & 0 deletions pkg/headerutil/headerutil.go
Expand Up @@ -46,3 +46,27 @@ func ParseRange(header string) (*Range, error) {

return &rangeHeader, nil
}

// WithDefaults returns a new Range instance with the defaults taken from d.
func (r *Range) WithDefaults(d Range) Range {
if r == nil {
return d
}

// Make a copy.
c := *r

if c.Max == nil {
c.Max = d.Max
}

if c.Sort == nil {
c.Sort = d.Sort
}

if c.Order == nil {
c.Order = d.Order
}

return c
}
18 changes: 12 additions & 6 deletions releases.go
Expand Up @@ -57,7 +57,7 @@ type ReleasesQuery struct {
Version *int

// If provided, uses the limit and sorting parameters specified in the range.
Range *headerutil.Range
Range headerutil.Range
}

// Scope implements the Scope interface.
Expand All @@ -72,18 +72,24 @@ func (q ReleasesQuery) Scope(db *gorm.DB) *gorm.DB {
scope = append(scope, FieldEquals("version", *version))
}

if r := q.Range; r != nil {
scope = append(scope, Range(r))
} else {
scope = append(scope, Order("version desc"))
}
scope = append(scope, Range(q.Range.WithDefaults(q.DefaultRange())))

// Preload all the things.
scope = append(scope, Preload("App", "Config", "Slug", "Processes"))

return scope.Scope(db)
}

// DefaultRange returns the default headerutil.Range used if values aren't
// provided.
func (q ReleasesQuery) DefaultRange() headerutil.Range {
sort, order := "version", "desc"
return headerutil.Range{
Sort: &sort,
Order: &order,
}
}

// ReleasesFirst returns the first matching release.
func (s *store) ReleasesFirst(scope Scope) (*Release, error) {
var release Release
Expand Down
2 changes: 1 addition & 1 deletion releases_test.go
Expand Up @@ -15,7 +15,7 @@ func TestReleasesQuery(t *testing.T) {
order = "desc"
)

rangeHeader := &headerutil.Range{
rangeHeader := headerutil.Range{
Sort: &sort,
Max: &max,
Order: &order,
Expand Down
15 changes: 15 additions & 0 deletions server/heroku/heroku.go
Expand Up @@ -5,6 +5,7 @@ import (
"net/http"

"github.com/remind101/empire"
"github.com/remind101/empire/pkg/headerutil"
"github.com/remind101/empire/server/authorization"
"github.com/remind101/pkg/httpx"
"github.com/remind101/pkg/httpx/middleware"
Expand Down Expand Up @@ -119,3 +120,17 @@ func NoContent(w http.ResponseWriter) error {
w.WriteHeader(http.StatusNoContent)
return nil
}

// RangeHeader parses the Range header and returns an headerutil.Range.
func RangeHeader(r *http.Request) (headerutil.Range, error) {
header := r.Header.Get("Range")
if header == "" {
return headerutil.Range{}, nil
}

rangeHeader, err := headerutil.ParseRange(header)
if err != nil {
return headerutil.Range{}, err
}
return *rangeHeader, nil
}
10 changes: 3 additions & 7 deletions server/heroku/releases.go
Expand Up @@ -6,7 +6,6 @@ import (

"github.com/bgentry/heroku-go"
"github.com/remind101/empire"
"github.com/remind101/empire/pkg/headerutil"
"github.com/remind101/pkg/httpx"
"golang.org/x/net/context"
)
Expand Down Expand Up @@ -72,12 +71,9 @@ func (h *GetReleases) ServeHTTPContext(ctx context.Context, w http.ResponseWrite
return err
}

var rangeHeader *headerutil.Range
if header := r.Header.Get("Range"); header != "" {
rangeHeader, err = headerutil.ParseRange(header)
if err != nil {
return err
}
rangeHeader, err := RangeHeader(r)
if err != nil {
return err
}

rels, err := h.Releases(empire.ReleasesQuery{App: a, Range: rangeHeader})
Expand Down
10 changes: 5 additions & 5 deletions store.go
Expand Up @@ -85,15 +85,15 @@ func Limit(limit int) Scope {
}

// Range returns a Scope that limits and orders the results.
func Range(r *headerutil.Range) Scope {
func Range(r headerutil.Range) Scope {
var scope ComposedScope

if max := r.Max; max != nil {
scope = append(scope, Limit(*max))
if r.Max != nil {
scope = append(scope, Limit(*r.Max))
}

if sort := r.Sort; sort != nil {
order := fmt.Sprintf("%s %s", *sort, *(r.Order))
if r.Sort != nil && r.Order != nil {
order := fmt.Sprintf("%s %s", *r.Sort, *r.Order)
scope = append(scope, Order(order))
}

Expand Down

0 comments on commit be7a437

Please sign in to comment.