diff --git a/cmd/server.go b/cmd/server.go index 97d391a0..d16b57b0 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -56,11 +56,11 @@ func Start(cfg *model.StartConfig) { watchExit(instance) - result, start, err := api.ListenHttp(cfg.DownloadConfig.Http, instance) + port, start, err := api.ListenHttp(cfg.DownloadConfig.Http, instance) if err != nil { panic(err) } - fmt.Printf("Server start success on http://%s:%d\n", cfg.DownloadConfig.Http.Host, result) + fmt.Printf("Server start success on http://%s:%d\n", cfg.DownloadConfig.Http.Host, port) start() } diff --git a/pkg/api/api.go b/pkg/api/api.go index fa47bf0f..af6aeacb 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -54,29 +54,34 @@ func Create(startCfg *model.StartConfig) (*Instance, error) { return i, nil } -func (i *Instance) StartHttp() *model.Result[any] { +func (i *Instance) Listener(listener download.Listener) *model.Result[any] { + i.downloader.Listener(listener) + return model.NewNilResult() +} + +func (i *Instance) StartHttp() *model.Result[int] { i.httpLock.Lock() defer i.httpLock.Unlock() return i.startHttp() } -func (i *Instance) startHttp() *model.Result[any] { +func (i *Instance) startHttp() *model.Result[int] { httpCfg := i.getHttpConfig() if httpCfg == nil || !httpCfg.Enable { - return model.NewErrorResult[any]("HTTP API server not enabled") + return model.NewErrorResult[int]("HTTP API server not enabled") } if i.srv != nil { - return model.NewErrorResult[any]("HTTP API server already started") + return model.NewErrorResult[int]("HTTP API server already started") } port, start, err := ListenHttp(httpCfg, i) if err != nil { - return model.NewErrorResult[any](err.Error()) + return model.NewErrorResult[int](err.Error()) } httpCfg.RunningPort = port go start() - return model.NewNilResult() + return model.NewOkResult(port) } func (i *Instance) getHttpConfig() *base.DownloaderHttpConfig { @@ -112,7 +117,7 @@ func (i *Instance) stopHttp() *model.Result[any] { return model.NewNilResult() } -func (i *Instance) RestartHttp() *model.Result[any] { +func (i *Instance) RestartHttp() *model.Result[int] { i.httpLock.Lock() defer i.httpLock.Unlock() @@ -169,7 +174,7 @@ func (i *Instance) CreateTaskBatch(req *model.CreateTaskBatch) *model.Result[[]s func (i *Instance) PauseTask(taskId string) *model.Result[any] { err := i.downloader.Pause(&download.TaskFilter{ - IDs: []string{taskId}, + ID: []string{taskId}, }) if err != nil { return model.NewErrorResult[any](err.Error()) @@ -187,7 +192,7 @@ func (i *Instance) PauseTasks(filter *download.TaskFilter) *model.Result[any] { func (i *Instance) ContinueTask(taskId string) *model.Result[any] { err := i.downloader.Continue(&download.TaskFilter{ - IDs: []string{taskId}, + ID: []string{taskId}, }) if err != nil { return model.NewErrorResult[any](err.Error()) @@ -205,7 +210,7 @@ func (i *Instance) ContinueTasks(filter *download.TaskFilter) *model.Result[any] func (i *Instance) DeleteTask(taskId string, force bool) *model.Result[any] { err := i.downloader.Delete(&download.TaskFilter{ - IDs: []string{taskId}, + ID: []string{taskId}, }, force) if err != nil { return model.NewErrorResult[any](err.Error()) @@ -344,6 +349,13 @@ func (i *Instance) Close() *model.Result[any] { return model.NewNilResult() } +func (i *Instance) Clear() *model.Result[any] { + if err := i.downloader.Clear(); err != nil { + return model.NewErrorResult[any](err.Error()) + } + return model.NewNilResult() +} + type Request struct { Method string `json:"method"` Params []any `json:"params"` diff --git a/pkg/api/api_test.go b/pkg/api/api_test.go index 3bc46865..97f691b3 100644 --- a/pkg/api/api_test.go +++ b/pkg/api/api_test.go @@ -7,8 +7,6 @@ import ( "testing" ) -var instance, _ = Create(nil) - func TestInvoke(t *testing.T) { doTestInvoke(t, "Info", []any{}, model.CodeOk) doTestInvoke(t, "Info1", []any{}, model.CodeError) @@ -21,6 +19,9 @@ func TestInvoke(t *testing.T) { } func doTestInvoke(t *testing.T, method string, params []any, expectCode model.RespCode) { + instance, _ := Create(nil) + defer instance.Close() + result := Invoke(instance, &Request{ Method: method, Params: params, diff --git a/pkg/api/http.go b/pkg/api/http.go index 373c938f..87b4706e 100644 --- a/pkg/api/http.go +++ b/pkg/api/http.go @@ -47,8 +47,8 @@ func ListenHttp(httpCfg *base.DownloaderHttpConfig, ai *Instance) (int, func(), r.Methods(http.MethodDelete).Path("/api/v1/extensions/{identity}").HandlerFunc(DeleteExtension) r.Methods(http.MethodGet).Path("/api/v1/extensions/{identity}/upgrade").HandlerFunc(UpgradeCheckExtension) r.Methods(http.MethodPost).Path("/api/v1/extensions/{identity}/upgrade").HandlerFunc(UpgradeExtension) - r.Path("/api/v1/proxy").HandlerFunc(DoProxy) if ai.startCfg.WebEnable { + r.Path("/api/v1/proxy").HandlerFunc(DoProxy) r.PathPrefix("/fs/tasks").Handler(http.FileServer(&taskFileSystem{ downloader: ai.downloader, })) @@ -359,9 +359,9 @@ func parseFilter(r *http.Request, w http.ResponseWriter, filter *download.TaskFi return false } - filter.IDs = r.Form["id"] - filter.Statuses = convertStatues(r.Form["status"]) - filter.NotStatuses = convertStatues(r.Form["notStatus"]) + filter.ID = r.Form["id"] + filter.Status = convertStatues(r.Form["status"]) + filter.NotStatus = convertStatues(r.Form["notStatus"]) return true } diff --git a/pkg/api/api_test.go.bak b/pkg/api/http_test.go similarity index 91% rename from pkg/api/api_test.go.bak rename to pkg/api/http_test.go index 645a527d..74f2551c 100644 --- a/pkg/api/api_test.go.bak +++ b/pkg/api/http_test.go @@ -21,8 +21,8 @@ import ( ) var ( - instance, _ = Create(nil) - restPort int + httpInstance *Instance + restPort int taskReq = &base.Request{ Extra: map[string]any{ @@ -91,7 +91,7 @@ func TestCreateTask(t *testing.T) { var wg sync.WaitGroup wg.Add(1) - Downloader.Listener(func(event *download.Event) { + httpInstance.Listener(func(event *download.Event) { if event.Key == download.EventKeyFinally { wg.Done() } @@ -118,7 +118,7 @@ func TestCreateDirectTask(t *testing.T) { doTest(func() { var wg sync.WaitGroup wg.Add(1) - Downloader.Listener(func(event *download.Event) { + httpInstance.Listener(func(event *download.Event) { if event.Key == download.EventKeyFinally { wg.Done() } @@ -157,7 +157,7 @@ func TestCreateDirectTaskWithResoled(t *testing.T) { doTest(func() { var wg sync.WaitGroup wg.Add(1) - Downloader.Listener(func(event *download.Event) { + httpInstance.Listener(func(event *download.Event) { if event.Key == download.EventKeyFinally { wg.Done() } @@ -181,7 +181,7 @@ func TestPauseAndContinueTask(t *testing.T) { doTest(func() { var wg sync.WaitGroup wg.Add(1) - Downloader.Listener(func(event *download.Event) { + httpInstance.Listener(func(event *download.Event) { switch event.Key { case download.EventKeyFinally: wg.Done() @@ -215,10 +215,7 @@ func TestPauseAndContinueTask(t *testing.T) { func TestPauseAllAndContinueALLTasks(t *testing.T) { doTest(func() { - cfg, err := Downloader.GetConfig() - if err != nil { - t.Fatal(err) - } + cfg := UnwrapResult(httpInstance.GetConfig()) createAndPause := func() { taskId := httpRequestCheckOk[string](http.MethodPost, "/api/v1/tasks", createReq) @@ -276,7 +273,7 @@ func TestDeleteAllTasks(t *testing.T) { var wg sync.WaitGroup wg.Add(taskCount) - Downloader.Listener(func(event *download.Event) { + httpInstance.Listener(func(event *download.Event) { if event.Key == download.EventKeyFinally { wg.Done() } @@ -302,7 +299,7 @@ func TestDeleteTasksByStatues(t *testing.T) { var wg sync.WaitGroup wg.Add(taskCount) - Downloader.Listener(func(event *download.Event) { + httpInstance.Listener(func(event *download.Event) { if event.Key == download.EventKeyFinally { wg.Done() } @@ -326,7 +323,7 @@ func TestGetTasks(t *testing.T) { doTest(func() { var wg sync.WaitGroup wg.Add(1) - Downloader.Listener(func(event *download.Event) { + httpInstance.Listener(func(event *download.Event) { if event.Key == download.EventKeyFinally { wg.Done() } @@ -450,16 +447,16 @@ func TestDeleteExtension(t *testing.T) { }) } -func TestUpdateCheckExtension(t *testing.T) { +func TestUpgradeCheckExtension(t *testing.T) { doTest(func() { identity := httpRequestCheckOk[string](http.MethodPost, "/api/v1/extensions", installExtensionReq) - resp := httpRequestCheckOk[*model.UpgradeCheckExtensionResp](http.MethodGet, "/api/v1/extensions/"+identity+"/update", nil) + resp := httpRequestCheckOk[*model.UpgradeCheckExtensionResp](http.MethodGet, "/api/v1/extensions/"+identity+"/upgrade", nil) // no new version if resp.NewVersion != "" { t.Errorf("UpgradeCheckExtension() got = %v, want %v", resp.NewVersion, "") } // force update - httpRequestCheckOk[any](http.MethodPost, "/api/v1/extensions/"+identity+"/update", nil) + httpRequestCheckOk[any](http.MethodPost, "/api/v1/extensions/"+identity+"/upgrade", nil) }) } @@ -510,13 +507,19 @@ func TestDoProxy(t *testing.T) { func TestApiToken(t *testing.T) { var cfg = &model.StartConfig{} cfg.Init() - cfg.ApiToken = "123456" - fileListener := doStart(cfg) + cfg.DownloadConfig = &base.DownloaderStoreConfig{ + Http: &base.DownloaderHttpConfig{ + Enable: true, + ApiToken: "123456", + }, + } + httpInstance, _ = Create(cfg) + fileListener := doStart() defer func() { if err := fileListener.Close(); err != nil { panic(err) } - Stop() + httpInstance.Close() }() status, _ := doHttpRequest0(http.MethodGet, "/api/v1/config", nil, nil) @@ -525,7 +528,7 @@ func TestApiToken(t *testing.T) { } status, _ = doHttpRequest0(http.MethodGet, "/api/v1/config", map[string]string{ - "X-Api-Token": cfg.ApiToken, + "X-Api-Token": cfg.DownloadConfig.Http.ApiToken, }, nil) if status != http.StatusOK { t.Errorf("TestApiToken() got = %v, want %v", status, http.StatusOK) @@ -536,18 +539,24 @@ func TestApiToken(t *testing.T) { func TestAuthorization(t *testing.T) { var cfg = &model.StartConfig{} cfg.Init() - cfg.ApiToken = "123456" + cfg.DownloadConfig = &base.DownloaderStoreConfig{ + Http: &base.DownloaderHttpConfig{ + Enable: true, + ApiToken: "123456", + }, + } cfg.WebEnable = true cfg.WebBasicAuth = &model.WebBasicAuth{ Username: "admin", Password: "123456", } - fileListener := doStart(cfg) + httpInstance, _ = Create(cfg) + fileListener := doStart() defer func() { if err := fileListener.Close(); err != nil { panic(err) } - Stop() + httpInstance.Close() }() status, _ := doHttpRequest0(http.MethodGet, "/api/v1/config", nil, nil) @@ -563,7 +572,7 @@ func TestAuthorization(t *testing.T) { } status, _ = doHttpRequest0(http.MethodGet, "/api/v1/config", map[string]string{ - "X-Api-Token": cfg.ApiToken, + "X-Api-Token": cfg.DownloadConfig.Http.ApiToken, }, nil) if status != http.StatusOK { t.Errorf("TestAuthorization() got = %v, want %v", status, http.StatusOK) @@ -577,17 +586,23 @@ func doTest(handler func()) { cfg.Storage = storage cfg.StorageDir = ".test_storage" cfg.WebEnable = true - fileListener := doStart(cfg) + cfg.DownloadConfig = &base.DownloaderStoreConfig{ + Http: &base.DownloaderHttpConfig{ + Enable: true, + }, + } + httpInstance, _ = Create(cfg) + fileListener := doStart() defer func() { if err := fileListener.Close(); err != nil { panic(err) } - Stop() - Downloader.Clear() + httpInstance.StopHttp() + httpInstance.Clear() }() defer func() { - Downloader.Pause(nil) - Downloader.Delete(nil, true) + httpInstance.PauseTasks(nil) + httpInstance.DeleteTasks(nil, true) os.RemoveAll(cfg.StorageDir) }() taskReq.URL = "http://" + fileListener.Addr().String() + "/" + test.BuildName @@ -597,15 +612,19 @@ func doTest(handler func()) { testFunc(model.StorageBolt) } -func doStart(cfg *model.StartConfig) net.Listener { - port, err := Start(cfg) - if err != nil { - panic(err) - } +func doStart() net.Listener { + port := UnwrapResult(httpInstance.StartHttp()) restPort = port return test.StartTestFileServer() } +func UnwrapResult[T any](result *model.Result[T]) T { + if result.HasError() { + panic(result.Msg) + } + return result.Data +} + func doHttpRequest0(method string, path string, headers map[string]string, body any) (int, []byte) { var reader io.Reader if body != nil { diff --git a/pkg/download/downloader.go b/pkg/download/downloader.go index b2634f75..ff7b003b 100644 --- a/pkg/download/downloader.go +++ b/pkg/download/downloader.go @@ -377,7 +377,7 @@ func (d *Downloader) Pause(filter *TaskFilter) (err error) { return d.pauseAll() } - filter.NotStatuses = []base.Status{base.DownloadStatusPause, base.DownloadStatusError, base.DownloadStatusDone} + filter.NotStatus = []base.Status{base.DownloadStatusPause, base.DownloadStatusError, base.DownloadStatusDone} pauseTasks := d.GetTasksByFilter(filter) if len(pauseTasks) == 0 { return ErrTaskNotFound @@ -417,7 +417,7 @@ func (d *Downloader) Continue(filter *TaskFilter) (err error) { return d.continueAll() } - filter.NotStatuses = []base.Status{base.DownloadStatusRunning, base.DownloadStatusDone} + filter.NotStatus = []base.Status{base.DownloadStatusRunning, base.DownloadStatusDone} continueTasks := d.GetTasksByFilter(filter) if len(continueTasks) == 0 { return ErrTaskNotFound @@ -514,7 +514,7 @@ func (d *Downloader) ContinueBatch(filter *TaskFilter) (err error) { func (d *Downloader) Delete(filter *TaskFilter, force bool) (err error) { if filter == nil || filter.IsEmpty() { - return d.deleteAll() + return d.deleteAll(force) } deleteTasks := d.GetTasksByFilter(filter) @@ -559,17 +559,20 @@ func (d *Downloader) Delete(filter *TaskFilter, force bool) (err error) { return } -func (d *Downloader) deleteAll() (err error) { +func (d *Downloader) deleteAll(force bool) (err error) { + deleteTasksPtr := make([]*Task, 0) + func() { d.lock.Lock() defer d.lock.Unlock() + deleteTasksPtr = append(deleteTasksPtr, d.tasks...) d.tasks = make([]*Task, 0) d.waitTasks = make([]*Task, 0) }() - for _, task := range d.tasks { - if err = d.doDelete(task, true); err != nil { + for _, task := range deleteTasksPtr { + if err = d.doDelete(task, force); err != nil { return } } @@ -706,10 +709,10 @@ func (d *Downloader) GetTasksByFilter(filter *TaskFilter) []*Task { } idMatch := func(task *Task) bool { - if len(filter.IDs) == 0 { + if len(filter.ID) == 0 { return true } - for _, id := range filter.IDs { + for _, id := range filter.ID { if task.ID == id { return true } @@ -717,10 +720,10 @@ func (d *Downloader) GetTasksByFilter(filter *TaskFilter) []*Task { return false } statusMatch := func(task *Task) bool { - if len(filter.Statuses) == 0 { + if len(filter.Status) == 0 { return true } - for _, status := range filter.Statuses { + for _, status := range filter.Status { if task.Status == status { return true } @@ -728,10 +731,10 @@ func (d *Downloader) GetTasksByFilter(filter *TaskFilter) []*Task { return false } notStatusMatch := func(task *Task) bool { - if len(filter.NotStatuses) == 0 { + if len(filter.NotStatus) == 0 { return true } - for _, status := range filter.NotStatuses { + for _, status := range filter.NotStatus { if task.Status == status { return false } diff --git a/pkg/download/downloader_test.go b/pkg/download/downloader_test.go index a7cfd10c..710da432 100644 --- a/pkg/download/downloader_test.go +++ b/pkg/download/downloader_test.go @@ -400,7 +400,7 @@ func TestDownloader_StoreAndRestore(t *testing.T) { t.Fatal(err) } time.Sleep(time.Millisecond * 1001) - err = downloader.Pause(&TaskFilter{IDs: []string{id}}) + err = downloader.Pause(&TaskFilter{ID: []string{id}}) if err != nil { t.Fatal(err) } @@ -424,7 +424,7 @@ func TestDownloader_StoreAndRestore(t *testing.T) { wg.Done() } }) - err = downloader.Continue(&TaskFilter{IDs: []string{id}}) + err = downloader.Continue(&TaskFilter{ID: []string{id}}) wg.Wait() if err != nil { t.Fatal(err) @@ -551,7 +551,7 @@ func TestDownloader_GetTasksByFilter(t *testing.T) { t.Run("GetTasksByFilter ids", func(t *testing.T) { tasks := downloader.GetTasksByFilter(&TaskFilter{ - IDs: taskIds, + ID: taskIds, }) if len(tasks) != len(reqs) { t.Errorf("GetTasksByFilter ids task got = %v, want %v", len(tasks), len(reqs)) @@ -560,7 +560,7 @@ func TestDownloader_GetTasksByFilter(t *testing.T) { t.Run("GetTasksByFilter match ids", func(t *testing.T) { tasks := downloader.GetTasksByFilter(&TaskFilter{ - IDs: []string{taskIds[0]}, + ID: []string{taskIds[0]}, }) if len(tasks) != 1 { t.Errorf("GetTasksByFilter ids task got = %v, want %v", len(tasks), 1) @@ -569,7 +569,7 @@ func TestDownloader_GetTasksByFilter(t *testing.T) { t.Run("GetTasksByFilter not match ids", func(t *testing.T) { tasks := downloader.GetTasksByFilter(&TaskFilter{ - IDs: []string{"xxx"}, + ID: []string{"xxx"}, }) if len(tasks) != 0 { t.Errorf("GetTasksByFilter ids task got = %v, want %v", len(tasks), 0) @@ -578,7 +578,7 @@ func TestDownloader_GetTasksByFilter(t *testing.T) { t.Run("GetTasksByFilter status", func(t *testing.T) { tasks := downloader.GetTasksByFilter(&TaskFilter{ - Statuses: []base.Status{base.DownloadStatusDone}, + Status: []base.Status{base.DownloadStatusDone}, }) if len(tasks) != len(reqs) { t.Errorf("GetTasksByFilter status task got = %v, want %v", len(tasks), len(reqs)) @@ -587,7 +587,7 @@ func TestDownloader_GetTasksByFilter(t *testing.T) { t.Run("GetTasksByFilter not match status", func(t *testing.T) { tasks := downloader.GetTasksByFilter(&TaskFilter{ - Statuses: []base.Status{base.DownloadStatusError}, + Status: []base.Status{base.DownloadStatusError}, }) if len(tasks) != 0 { t.Errorf("GetTasksByFilter status task got = %v, want %v", len(tasks), 0) @@ -596,7 +596,7 @@ func TestDownloader_GetTasksByFilter(t *testing.T) { t.Run("GetTasksByFilter match notStatus", func(t *testing.T) { tasks := downloader.GetTasksByFilter(&TaskFilter{ - NotStatuses: []base.Status{base.DownloadStatusRunning, base.DownloadStatusPause}, + NotStatus: []base.Status{base.DownloadStatusRunning, base.DownloadStatusPause}, }) if len(tasks) != len(reqs) { t.Errorf("GetTasksByFilter match notStatus task got = %v, want %v", len(tasks), len(reqs)) @@ -605,7 +605,7 @@ func TestDownloader_GetTasksByFilter(t *testing.T) { t.Run("GetTasksByFilter not match notStatus", func(t *testing.T) { tasks := downloader.GetTasksByFilter(&TaskFilter{ - NotStatuses: []base.Status{base.DownloadStatusDone}, + NotStatus: []base.Status{base.DownloadStatusDone}, }) if len(tasks) != 0 { t.Errorf("GetTasksByFilter not match notStatus task got = %v, want %v", len(tasks), 0) @@ -614,8 +614,8 @@ func TestDownloader_GetTasksByFilter(t *testing.T) { t.Run("GetTasksByFilter match ids and status", func(t *testing.T) { tasks := downloader.GetTasksByFilter(&TaskFilter{ - IDs: []string{taskIds[0]}, - Statuses: []base.Status{base.DownloadStatusDone}, + ID: []string{taskIds[0]}, + Status: []base.Status{base.DownloadStatusDone}, }) if len(tasks) != 1 { t.Errorf("GetTasksByFilter match ids and status task got = %v, want %v", len(tasks), 1) @@ -624,8 +624,8 @@ func TestDownloader_GetTasksByFilter(t *testing.T) { t.Run("GetTasksByFilter not match ids and status", func(t *testing.T) { tasks := downloader.GetTasksByFilter(&TaskFilter{ - IDs: []string{taskIds[0]}, - Statuses: []base.Status{base.DownloadStatusError}, + ID: []string{taskIds[0]}, + Status: []base.Status{base.DownloadStatusError}, }) if len(tasks) != 0 { t.Errorf("GetTasksByFilter not match ids and status task got = %v, want %v", len(tasks), 0) diff --git a/pkg/download/extension.go b/pkg/download/extension.go index 5a64920f..67362f65 100644 --- a/pkg/download/extension.go +++ b/pkg/download/extension.go @@ -721,13 +721,13 @@ func NewExtensionTask(download *Downloader, task *Task) *ExtensionTask { func (t *ExtensionTask) Continue() error { return t.download.Continue(&TaskFilter{ - IDs: []string{t.ID}, + ID: []string{t.ID}, }) } func (t *ExtensionTask) Pause() error { return t.download.Pause(&TaskFilter{ - IDs: []string{t.ID}, + ID: []string{t.ID}, }) } diff --git a/pkg/download/model.go b/pkg/download/model.go index b6af700a..17d374f8 100644 --- a/pkg/download/model.go +++ b/pkg/download/model.go @@ -113,13 +113,13 @@ func (t *Task) calcSpeed(speedArr []int64, downloaded int64, usedTime float64) i } type TaskFilter struct { - IDs []string `json:"ids"` - Statuses []base.Status `json:"statuses"` - NotStatuses []base.Status `json:"notStatuses"` + ID []string `json:"id"` + Status []base.Status `json:"status"` + NotStatus []base.Status `json:"notStatus"` } func (f *TaskFilter) IsEmpty() bool { - return len(f.IDs) == 0 && len(f.Statuses) == 0 && len(f.NotStatuses) == 0 + return len(f.ID) == 0 && len(f.Status) == 0 && len(f.NotStatus) == 0 } type DownloaderConfig struct { diff --git a/ui/flutter/lib/api/entry/libgopeed_boot_web.dart b/ui/flutter/lib/api/entry/libgopeed_boot_web.dart index 942e90e7..9e881422 100644 --- a/ui/flutter/lib/api/entry/libgopeed_boot_web.dart +++ b/ui/flutter/lib/api/entry/libgopeed_boot_web.dart @@ -59,14 +59,14 @@ class LibgopeedBootWeb } Map params = {}; - if (filter.ids != null) { - params['ids'] = filter.ids; + if (filter.id != null) { + params['id'] = filter.id; } - if (filter.statuses != null) { - params['statuses'] = filter.statuses; + if (filter.status != null) { + params['status'] = filter.status; } - if (filter.notStatuses != null) { - params['notStatuses'] = filter.notStatuses; + if (filter.notStatus != null) { + params['notStatus'] = filter.notStatus; } if (params.isEmpty) { return null; diff --git a/ui/flutter/lib/api/model/task_filter.dart b/ui/flutter/lib/api/model/task_filter.dart index 75400d9b..387af91b 100644 --- a/ui/flutter/lib/api/model/task_filter.dart +++ b/ui/flutter/lib/api/model/task_filter.dart @@ -5,11 +5,11 @@ part 'task_filter.g.dart'; @JsonSerializable() class TaskFilter { - List? ids; - List? statuses; - List? notStatuses; + List? id; + List? status; + List? notStatus; - TaskFilter({this.ids, this.statuses, this.notStatuses}); + TaskFilter({this.id, this.status, this.notStatus}); factory TaskFilter.fromJson(Map json) => _$TaskFilterFromJson(json); diff --git a/ui/flutter/lib/api/model/task_filter.g.dart b/ui/flutter/lib/api/model/task_filter.g.dart index c3f8a0c6..b391c82d 100644 --- a/ui/flutter/lib/api/model/task_filter.g.dart +++ b/ui/flutter/lib/api/model/task_filter.g.dart @@ -7,11 +7,11 @@ part of 'task_filter.dart'; // ************************************************************************** TaskFilter _$TaskFilterFromJson(Map json) => TaskFilter( - ids: (json['ids'] as List?)?.map((e) => e as String).toList(), - statuses: (json['statuses'] as List?) + id: (json['ids'] as List?)?.map((e) => e as String).toList(), + status: (json['statuses'] as List?) ?.map((e) => $enumDecode(_$StatusEnumMap, e)) .toList(), - notStatuses: (json['notStatuses'] as List?) + notStatus: (json['notStatuses'] as List?) ?.map((e) => $enumDecode(_$StatusEnumMap, e)) .toList(), ); @@ -25,11 +25,11 @@ Map _$TaskFilterToJson(TaskFilter instance) { } } - writeNotNull('ids', instance.ids); + writeNotNull('ids', instance.id); writeNotNull( - 'statuses', instance.statuses?.map((e) => _$StatusEnumMap[e]!).toList()); + 'statuses', instance.status?.map((e) => _$StatusEnumMap[e]!).toList()); writeNotNull('notStatuses', - instance.notStatuses?.map((e) => _$StatusEnumMap[e]!).toList()); + instance.notStatus?.map((e) => _$StatusEnumMap[e]!).toList()); return val; } diff --git a/ui/flutter/lib/app/modules/task/controllers/task_list_controller.dart b/ui/flutter/lib/app/modules/task/controllers/task_list_controller.dart index 883b790d..8d0da35a 100644 --- a/ui/flutter/lib/app/modules/task/controllers/task_list_controller.dart +++ b/ui/flutter/lib/app/modules/task/controllers/task_list_controller.dart @@ -46,7 +46,7 @@ abstract class TaskListController extends GetxController { getTasksState() async { final tasks = - await LibgopeedBoot.instance.getTasks(TaskFilter(statuses: statuses)); + await LibgopeedBoot.instance.getTasks(TaskFilter(status: statuses)); // sort tasks by create time tasks.sort(compare); this.tasks.value = tasks;