| 301 | } |
| 302 | |
| 303 | func handleTracks(dp *DataProvider) http.HandlerFunc { |
| 304 | return func(w http.ResponseWriter, r *http.Request) { |
| 305 | dp := effectiveDP(r, dp) |
| 306 | tasks, err := getFilteredTasks(dp, r) |
| 307 | if err != nil { |
| 308 | http.Error(w, err.Error(), http.StatusInternalServerError) |
| 309 | return |
| 310 | } |
| 311 | |
| 312 | archivedTasks, err := dp.GetArchivedTasks() |
| 313 | if err != nil { |
| 314 | http.Error(w, err.Error(), http.StatusInternalServerError) |
| 315 | return |
| 316 | } |
| 317 | |
| 318 | filters := r.URL.Query()["filter"] |
| 319 | scope := r.URL.Query().Get("scope") |
| 320 | |
| 321 | result, err := tracks.Assign(tasks, tracks.Options{ |
| 322 | Filters: filters, |
| 323 | ArchivedTasks: archivedTasks, |
| 324 | Scope: scope, |
| 325 | }) |
| 326 | if err != nil { |
| 327 | http.Error(w, err.Error(), http.StatusBadRequest) |
| 328 | return |
| 329 | } |
| 330 | |
| 331 | if v := r.URL.Query().Get("limit"); v != "" { |
| 332 | if n, parseErr := strconv.Atoi(v); parseErr == nil && n > 0 && n < len(result.Tracks) { |
| 333 | result.Tracks = result.Tracks[:n] |
| 334 | } |
| 335 | } |
| 336 | |
| 337 | writeJSON(w, result) |
| 338 | } |
| 339 | } |
| 340 | |
| 341 | func handleValidate(dp *DataProvider) http.HandlerFunc { |
| 342 | return func(w http.ResponseWriter, r *http.Request) { |