diff --git a/src/internal/movies/handlers.go b/src/internal/movies/handlers.go index e7ff1e6..8f28f4d 100644 --- a/src/internal/movies/handlers.go +++ b/src/internal/movies/handlers.go @@ -5,6 +5,8 @@ import ( "net" "net/http" "net/url" + "sort" + "strconv" "github.com/odwrtw/papi" polochon "github.com/odwrtw/polochon/lib" @@ -19,6 +21,12 @@ import ( var ErrPolochonUnavailable = fmt.Errorf("Invalid polochon address") +type SortByTitle []*Movie + +func (a SortByTitle) Len() int { return len(a) } +func (a SortByTitle) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a SortByTitle) Less(i, j int) bool { return a[i].Title < a[j].Title } + func getPolochonMovies(user *users.User) ([]*Movie, error) { movies := []*Movie{} @@ -63,6 +71,44 @@ func getPolochonMovies(user *users.User) ([]*Movie, error) { func FromPolochon(env *web.Env, w http.ResponseWriter, r *http.Request) error { v := auth.GetCurrentUser(r, env.Log) + params := struct { + Sort string + Order string + Start int + Limit int + }{ + Sort: "title", + Order: "asc", + Start: 0, + Limit: 50, + } + + err := r.ParseForm() + if err != nil { + return err + } + + if sort := r.FormValue("sort"); sort != "" { + params.Sort = sort + } + + if order := r.FormValue("order"); order != "" { + params.Order = order + } + if start := r.FormValue("start"); start != "" { + n, err := strconv.Atoi(start) + if err != nil { + return err + } + params.Start = n + } + if limit := r.FormValue("limit"); limit != "" { + n, err := strconv.Atoi(limit) + if err != nil { + return err + } + params.Limit = n + } user, ok := v.(*users.User) if !ok { @@ -101,7 +147,27 @@ func FromPolochon(env *web.Env, w http.ResponseWriter, r *http.Request) error { } } - web.SetData(r, "movies", movies) + var smovies sort.Interface + + switch params.Sort { + case "title": + smovies = SortByTitle(movies) + default: + return fmt.Errorf("invalid sort param") + } + + switch params.Order { + case "asc": + break + case "desc": + smovies = sort.Reverse(smovies) + default: + return fmt.Errorf("invalid order param") + } + + sort.Sort(smovies) + + web.SetData(r, "movies", movies[params.Start:params.Start+params.Limit]) return env.Rends(w, r, "movies/library") } diff --git a/src/templates/movies/library.tmpl b/src/templates/movies/library.tmpl index 3005c89..ee7a38b 100644 --- a/src/templates/movies/library.tmpl +++ b/src/templates/movies/library.tmpl @@ -43,7 +43,12 @@
{{ .Plot }}
diff --git a/src/templates/navbar.tmpl b/src/templates/navbar.tmpl index e7df2e9..b5ad630 100644 --- a/src/templates/navbar.tmpl +++ b/src/templates/navbar.tmpl @@ -16,7 +16,7 @@