diff --git a/casdoor/permission_adapter.go b/casdoor/permission_adapter.go index 0498bca..ce4ccee 100644 --- a/casdoor/permission_adapter.go +++ b/casdoor/permission_adapter.go @@ -28,68 +28,71 @@ type Permission struct { State string `xorm:"varchar(100)" json:"state"` } -func GetPermissions(owner string) []*Permission { +func GetPermissions(owner string) ([]*Permission, error) { permissions := []*Permission{} err := adapter.Engine.Desc("created_time").Find(&permissions, &Permission{Owner: owner}) if err != nil { - panic(err) + return permissions, err } - return permissions + return permissions, nil } -func getPermission(owner string, name string) *Permission { +func getPermission(owner string, name string) (*Permission, error) { if owner == "" || name == "" { - return nil + return nil, nil } permission := Permission{Owner: owner, Name: name} existed, err := adapter.Engine.Get(&permission) if err != nil { - panic(err) + return &permission, err } if existed { - return &permission + return &permission, nil } else { - return nil + return nil, nil } } -func GetPermission(id string) *Permission { +func GetPermission(id string) (*Permission, error) { owner, name := util.GetOwnerAndNameFromId(id) return getPermission(owner, name) } -func UpdatePermission(id string, permission *Permission) bool { +func UpdatePermission(id string, permission *Permission) (bool, error) { owner, name := util.GetOwnerAndNameFromId(id) - oldPermission := getPermission(owner, name) + oldPermission, err := getPermission(owner, name) + if err != nil { + return false, err + } if oldPermission == nil { - return false + return false, nil } affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(permission) if err != nil { - panic(err) + return false, err } - return affected != 0 + return affected != 0, nil } -func AddPermission(permission *Permission) bool { +func AddPermission(permission *Permission) (bool, error) { affected, err := adapter.Engine.Insert(permission) if err != nil { - panic(err) + return false, err } - return affected != 0 + return affected != 0, nil } -func DeletePermission(permission *Permission) bool { +func DeletePermission(permission *Permission) (bool, error) { affected, err := adapter.Engine.ID(core.PK{permission.Owner, permission.Name}).Delete(&Permission{}) if err != nil { - panic(err) + return false, err } - return affected != 0 + return affected != 0, nil } diff --git a/controllers/file.go b/controllers/file.go index fd68840..a720015 100644 --- a/controllers/file.go +++ b/controllers/file.go @@ -19,7 +19,8 @@ func (c *ApiController) UpdateFile() { var file object.File err := json.Unmarshal(c.Ctx.Input.RequestBody, &file) if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } res := object.UpdateFile(storeId, key, &file) @@ -27,8 +28,7 @@ func (c *ApiController) UpdateFile() { addRecordForFile(c, userName, "Update", storeId, key, "", true) } - c.Data["json"] = res - c.ServeJSON() + c.ResponseOk(res) } func (c *ApiController) AddFile() { @@ -53,14 +53,18 @@ func (c *ApiController) AddFile() { defer file.Close() } - res, bs := object.AddFile(storeId, key, isLeaf, filename, file) + res, bs, err := object.AddFile(storeId, key, isLeaf, filename, file) + if err != nil { + c.ResponseError(err.Error()) + return + } + if res { addFileToCache(key, filename, bs) addRecordForFile(c, userName, "Add", storeId, key, filename, isLeaf) } - c.Data["json"] = res - c.ServeJSON() + c.ResponseOk(res) } func (c *ApiController) DeleteFile() { @@ -73,11 +77,15 @@ func (c *ApiController) DeleteFile() { key := c.Input().Get("key") isLeaf := c.Input().Get("isLeaf") == "1" - res := object.DeleteFile(storeId, key, isLeaf) + res, err := object.DeleteFile(storeId, key, isLeaf) + if err != nil { + c.ResponseError(err.Error()) + return + } + if res { addRecordForFile(c, userName, "Delete", storeId, key, "", isLeaf) } - c.Data["json"] = res - c.ServeJSON() + c.ResponseOk(res) } diff --git a/controllers/file_cache.go b/controllers/file_cache.go index 6b62358..22988f1 100644 --- a/controllers/file_cache.go +++ b/controllers/file_cache.go @@ -53,8 +53,7 @@ func (c *ApiController) ActivateFile() { prefix := getCachePrefix(filename) if prefix == "" { - c.Data["json"] = false - c.ServeJSON() + c.ResponseOk(false) return } @@ -66,8 +65,7 @@ func (c *ApiController) ActivateFile() { util.CopyFile(getAppPath(filename), getAppPath(prefix)) } - c.Data["json"] = true - c.ServeJSON() + c.ResponseOk(true) } func (c *ApiController) GetActiveFile() { @@ -78,6 +76,5 @@ func (c *ApiController) GetActiveFile() { res = v } - c.Data["json"] = res - c.ServeJSON() + c.ResponseOk(res) } diff --git a/controllers/permission.go b/controllers/permission.go index 27d1509..65c652c 100644 --- a/controllers/permission.go +++ b/controllers/permission.go @@ -9,15 +9,25 @@ import ( func (c *ApiController) GetPermissions() { owner := c.Input().Get("owner") - c.Data["json"] = casdoor.GetPermissions(owner) - c.ServeJSON() + permissions, err := casdoor.GetPermissions(owner) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(permissions) } func (c *ApiController) GetPermission() { id := c.Input().Get("id") - c.Data["json"] = casdoor.GetPermission(id) - c.ServeJSON() + permission, err := casdoor.GetPermission(id) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(permission) } func (c *ApiController) UpdatePermission() { @@ -29,28 +39,45 @@ func (c *ApiController) UpdatePermission() { panic(err) } - c.Data["json"] = casdoor.UpdatePermission(id, &permission) - c.ServeJSON() + success, err := casdoor.UpdatePermission(id, &permission) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(success) } func (c *ApiController) AddPermission() { var permission casdoor.Permission err := json.Unmarshal(c.Ctx.Input.RequestBody, &permission) if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } - c.Data["json"] = casdoor.AddPermission(&permission) - c.ServeJSON() + success, err := casdoor.AddPermission(&permission) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(success) } func (c *ApiController) DeletePermission() { var permission casdoor.Permission err := json.Unmarshal(c.Ctx.Input.RequestBody, &permission) if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } - c.Data["json"] = casdoor.DeletePermission(&permission) - c.ServeJSON() + success, err := casdoor.DeletePermission(&permission) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(success) } diff --git a/controllers/store.go b/controllers/store.go index 9698283..8a8a799 100644 --- a/controllers/store.go +++ b/controllers/store.go @@ -7,30 +7,42 @@ import ( ) func (c *ApiController) GetGlobalStores() { - c.Data["json"] = object.GetGlobalStores() - c.ServeJSON() + stores, err := object.GetGlobalStores() + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(stores) } func (c *ApiController) GetStores() { owner := c.Input().Get("owner") - c.Data["json"] = object.GetStores(owner) - c.ServeJSON() + stores, err := object.GetStores(owner) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(stores) } func (c *ApiController) GetStore() { id := c.Input().Get("id") - store := object.GetStore(id) + store, err := object.GetStore(id) + if err != nil { + c.ResponseError(err.Error()) + return + } if store == nil { c.ResponseError("store is empty") return } store.Populate() - - c.Data["json"] = store - c.ServeJSON() + c.ResponseOk(store) } func (c *ApiController) UpdateStore() { @@ -39,31 +51,49 @@ func (c *ApiController) UpdateStore() { var store object.Store err := json.Unmarshal(c.Ctx.Input.RequestBody, &store) if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } - c.Data["json"] = object.UpdateStore(id, &store) - c.ServeJSON() + success, err := object.UpdateStore(id, &store) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(success) } func (c *ApiController) AddStore() { var store object.Store err := json.Unmarshal(c.Ctx.Input.RequestBody, &store) if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } - c.Data["json"] = object.AddStore(&store) - c.ServeJSON() + sucess, err := object.AddStore(&store) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(sucess) } func (c *ApiController) DeleteStore() { var store object.Store err := json.Unmarshal(c.Ctx.Input.RequestBody, &store) if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } - c.Data["json"] = object.DeleteStore(&store) - c.ServeJSON() + sucess, err := object.DeleteStore(&store) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(sucess) } diff --git a/controllers/vectorset.go b/controllers/vectorset.go index dc2765b..3ffd4bb 100644 --- a/controllers/vectorset.go +++ b/controllers/vectorset.go @@ -7,22 +7,37 @@ import ( ) func (c *ApiController) GetGlobalVectorsets() { - c.Data["json"] = object.GetGlobalVectorsets() - c.ServeJSON() + vectorsets, err := object.GetGlobalVectorsets() + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(vectorsets) } func (c *ApiController) GetVectorsets() { owner := c.Input().Get("owner") - c.Data["json"] = object.GetVectorsets(owner) - c.ServeJSON() + vectorsets, err := object.GetVectorsets(owner) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(vectorsets) } func (c *ApiController) GetVectorset() { id := c.Input().Get("id") - c.Data["json"] = object.GetVectorset(id) - c.ServeJSON() + vectorset, err := object.GetVectorset(id) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(vectorset) } func (c *ApiController) UpdateVectorset() { @@ -31,31 +46,49 @@ func (c *ApiController) UpdateVectorset() { var vectorset object.Vectorset err := json.Unmarshal(c.Ctx.Input.RequestBody, &vectorset) if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } - c.Data["json"] = object.UpdateVectorset(id, &vectorset) - c.ServeJSON() + success, err := object.UpdateVectorset(id, &vectorset) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(success) } func (c *ApiController) AddVectorset() { var vectorset object.Vectorset err := json.Unmarshal(c.Ctx.Input.RequestBody, &vectorset) if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } - c.Data["json"] = object.AddVectorset(&vectorset) - c.ServeJSON() + success, err := object.AddVectorset(&vectorset) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(success) } func (c *ApiController) DeleteVectorset() { var vectorset object.Vectorset err := json.Unmarshal(c.Ctx.Input.RequestBody, &vectorset) if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } - c.Data["json"] = object.DeleteVectorset(&vectorset) - c.ServeJSON() + success, err := object.DeleteVectorset(&vectorset) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(success) } diff --git a/controllers/video.go b/controllers/video.go index 8f5e05b..12b9816 100644 --- a/controllers/video.go +++ b/controllers/video.go @@ -13,25 +13,38 @@ import ( ) func (c *ApiController) GetGlobalVideos() { - c.Data["json"] = object.GetGlobalVideos() - c.ServeJSON() + videos, err := object.GetGlobalVideos() + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(videos) } func (c *ApiController) GetVideos() { owner := c.Input().Get("owner") - c.Data["json"] = object.GetVideos(owner) - c.ServeJSON() + videos, err := object.GetVideos(owner) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(videos) } func (c *ApiController) GetVideo() { id := c.Input().Get("id") - video := object.GetVideo(id) + video, err := object.GetVideo(id) video.Populate() + if err != nil { + c.ResponseError(err.Error()) + return + } - c.Data["json"] = video - c.ServeJSON() + c.ResponseOk(video) } func (c *ApiController) UpdateVideo() { @@ -40,33 +53,51 @@ func (c *ApiController) UpdateVideo() { var video object.Video err := json.Unmarshal(c.Ctx.Input.RequestBody, &video) if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } - c.Data["json"] = object.UpdateVideo(id, &video) - c.ServeJSON() + success, err := object.UpdateVideo(id, &video) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(success) } func (c *ApiController) AddVideo() { var video object.Video err := json.Unmarshal(c.Ctx.Input.RequestBody, &video) if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } - c.Data["json"] = object.AddVideo(&video) - c.ServeJSON() + success, err := object.AddVideo(&video) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(success) } func (c *ApiController) DeleteVideo() { var video object.Video err := json.Unmarshal(c.Ctx.Input.RequestBody, &video) if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } - c.Data["json"] = object.DeleteVideo(&video) - c.ServeJSON() + success, err := object.DeleteVideo(&video) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(success) } func startCoverUrlJob(owner string, name string, videoId string) { @@ -74,7 +105,7 @@ func startCoverUrlJob(owner string, name string, videoId string) { for i := 0; i < 20; i++ { coverUrl := video.GetVideoCoverUrl(videoId) if coverUrl != "" { - video := object.GetVideo(util.GetIdFromOwnerAndName(owner, name)) + video, _ := object.GetVideo(util.GetIdFromOwnerAndName(owner, name)) if video.CoverUrl != "" { break } @@ -94,7 +125,8 @@ func (c *ApiController) UploadVideo() { file, header, err := c.GetFile("file") if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } defer file.Close() diff --git a/controllers/wordset.go b/controllers/wordset.go index 21a401f..34f6574 100644 --- a/controllers/wordset.go +++ b/controllers/wordset.go @@ -8,22 +8,34 @@ import ( ) func (c *ApiController) GetGlobalWordsets() { - c.Data["json"] = object.GetGlobalWordsets() - c.ServeJSON() + wordsets, err := object.GetGlobalWordsets() + if err != nil { + c.ResponseError(err.Error()) + return + } + c.ResponseOk(wordsets) } func (c *ApiController) GetWordsets() { owner := c.Input().Get("owner") - c.Data["json"] = object.GetWordsets(owner) - c.ServeJSON() + wordsets, err := object.GetWordsets(owner) + if err != nil { + c.ResponseError(err.Error()) + return + } + c.ResponseOk(wordsets) } func (c *ApiController) GetWordset() { id := c.Input().Get("id") - c.Data["json"] = object.GetWordset(id) - c.ServeJSON() + wordset, err := object.GetWordset(id) + if err != nil { + c.ResponseError(err.Error()) + return + } + c.ResponseOk(wordset) } func (c *ApiController) GetWordsetGraph() { @@ -31,15 +43,23 @@ func (c *ApiController) GetWordsetGraph() { clusterNumber := util.ParseInt(c.Input().Get("clusterNumber")) distanceLimit := util.ParseInt(c.Input().Get("distanceLimit")) - c.Data["json"] = object.GetWordsetGraph(id, clusterNumber, distanceLimit) - c.ServeJSON() + g, err := object.GetWordsetGraph(id, clusterNumber, distanceLimit) + if err != nil { + c.ResponseError(err.Error()) + return + } + c.ResponseOk(g) } func (c *ApiController) GetWordsetMatch() { id := c.Input().Get("id") - c.Data["json"] = object.GetWordsetMatch(id) - c.ServeJSON() + wordset, err := object.GetWordsetMatch(id) + if err != nil { + c.ResponseError(err.Error()) + return + } + c.ResponseOk(wordset) } func (c *ApiController) UpdateWordset() { @@ -48,31 +68,46 @@ func (c *ApiController) UpdateWordset() { var wordset object.Wordset err := json.Unmarshal(c.Ctx.Input.RequestBody, &wordset) if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } - c.Data["json"] = object.UpdateWordset(id, &wordset) - c.ServeJSON() + success, err := object.UpdateWordset(id, &wordset) + if err != nil { + c.ResponseError(err.Error()) + return + } + c.ResponseOk(success) } func (c *ApiController) AddWordset() { var wordset object.Wordset err := json.Unmarshal(c.Ctx.Input.RequestBody, &wordset) if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } - c.Data["json"] = object.AddWordset(&wordset) - c.ServeJSON() + success, err := object.AddWordset(&wordset) + if err != nil { + c.ResponseError(err.Error()) + return + } + c.ResponseOk(success) } func (c *ApiController) DeleteWordset() { var wordset object.Wordset err := json.Unmarshal(c.Ctx.Input.RequestBody, &wordset) if err != nil { - panic(err) + c.ResponseError(err.Error()) + return } - c.Data["json"] = object.DeleteWordset(&wordset) - c.ServeJSON() + success, err := object.DeleteWordset(&wordset) + if err != nil { + c.ResponseError(err.Error()) + return + } + c.ResponseOk(success) } diff --git a/object/adapter.go b/object/adapter.go index de61ae6..f5ada4e 100644 --- a/object/adapter.go +++ b/object/adapter.go @@ -62,7 +62,11 @@ func (a *Adapter) createDatabase() error { defer engine.Close() _, err = engine.Exec(fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s default charset utf8 COLLATE utf8_general_ci", beego.AppConfig.String("dbName"))) - return err + if err != nil { + return err + } + + return nil } func (a *Adapter) open() { diff --git a/object/file.go b/object/file.go index 0fca7d5..9d205a4 100644 --- a/object/file.go +++ b/object/file.go @@ -14,10 +14,13 @@ func UpdateFile(storeId string, key string, file *File) bool { return true } -func AddFile(storeId string, key string, isLeaf bool, filename string, file multipart.File) (bool, []byte) { - store := GetStore(storeId) +func AddFile(storeId string, key string, isLeaf bool, filename string, file multipart.File) (bool, []byte, error) { + store, err := GetStore(storeId) + if err != nil { + return false, nil, err + } if store == nil { - return false, nil + return false, nil, nil } var objectKey string @@ -26,24 +29,30 @@ func AddFile(storeId string, key string, isLeaf bool, filename string, file mult objectKey = fmt.Sprintf("%s/%s", key, filename) objectKey = strings.TrimLeft(objectKey, "/") fileBuffer = bytes.NewBuffer(nil) - if _, err := io.Copy(fileBuffer, file); err != nil { - panic(err) + _, err = io.Copy(fileBuffer, file) + if err != nil { + return false, nil, err } + bs := fileBuffer.Bytes() + storage.PutObject(store.Bucket, objectKey, fileBuffer) + return true, bs, nil } else { objectKey = fmt.Sprintf("%s/%s/_hidden.ini", key, filename) objectKey = strings.TrimLeft(objectKey, "/") fileBuffer = bytes.NewBuffer(nil) + bs := fileBuffer.Bytes() + storage.PutObject(store.Bucket, objectKey, fileBuffer) + return true, bs, nil } - - bs := fileBuffer.Bytes() - storage.PutObject(store.Bucket, objectKey, fileBuffer) - return true, bs } -func DeleteFile(storeId string, key string, isLeaf bool) bool { - store := GetStore(storeId) +func DeleteFile(storeId string, key string, isLeaf bool) (bool, error) { + store, err := GetStore(storeId) + if err != nil { + return false, err + } if store == nil { - return false + return false, nil } if isLeaf { @@ -54,5 +63,5 @@ func DeleteFile(storeId string, key string, isLeaf bool) bool { storage.DeleteObject(store.Bucket, object.Key) } } - return true + return true, nil } diff --git a/object/kmeans.go b/object/kmeans.go index 7ca8b46..8fb2b55 100644 --- a/object/kmeans.go +++ b/object/kmeans.go @@ -59,7 +59,7 @@ func runKmeans(vectors []*Vector, clusterNumber int) { } func updateWordsetVectorCategories(owner string, wordsetName string) { - wordset := getWordset(owner, wordsetName) + wordset, _ := getWordset(owner, wordsetName) runKmeans(wordset.Vectors, 100) diff --git a/object/store.go b/object/store.go index 72f969b..c18f168 100644 --- a/object/store.go +++ b/object/store.go @@ -36,76 +36,80 @@ type Store struct { PropertiesMap map[string]*Properties `xorm:"mediumtext" json:"propertiesMap"` } -func GetGlobalStores() []*Store { +func GetGlobalStores() ([]*Store, error) { stores := []*Store{} err := adapter.engine.Asc("owner").Desc("created_time").Find(&stores) if err != nil { - panic(err) + return stores, err } - return stores + return stores, nil } -func GetStores(owner string) []*Store { +func GetStores(owner string) ([]*Store, error) { stores := []*Store{} err := adapter.engine.Desc("created_time").Find(&stores, &Store{Owner: owner}) if err != nil { - panic(err) + return stores, err } - return stores + return stores, nil } -func getStore(owner string, name string) *Store { +func getStore(owner string, name string) (*Store, error) { store := Store{Owner: owner, Name: name} existed, err := adapter.engine.Get(&store) if err != nil { - panic(err) + return &store, err } if existed { - return &store + return &store, nil } else { - return nil + return nil, nil } } -func GetStore(id string) *Store { +func GetStore(id string) (*Store, error) { owner, name := util.GetOwnerAndNameFromId(id) return getStore(owner, name) } -func UpdateStore(id string, store *Store) bool { +func UpdateStore(id string, store *Store) (bool, error) { owner, name := util.GetOwnerAndNameFromId(id) - if getStore(owner, name) == nil { - return false + _, err := getStore(owner, name) + if err != nil { + return false, err + } + if store == nil { + return false, nil } - _, err := adapter.engine.ID(core.PK{owner, name}).AllCols().Update(store) + _, err = adapter.engine.ID(core.PK{owner, name}).AllCols().Update(store) if err != nil { - panic(err) + return false, err } //return affected != 0 - return true + return true, nil } -func AddStore(store *Store) bool { +func AddStore(store *Store) (bool, error) { affected, err := adapter.engine.Insert(store) if err != nil { - panic(err) + return false, err } - return affected != 0 + return affected != 0, nil } -func DeleteStore(store *Store) bool { +func DeleteStore(store *Store) (bool, error) { affected, err := adapter.engine.ID(core.PK{store.Owner, store.Name}).Delete(&Store{}) if err != nil { - panic(err) + return false, err } - return affected != 0 + return affected != 0, nil } func (store *Store) GetId() string { diff --git a/object/store_test.go b/object/store_test.go index 3444887..168adcc 100644 --- a/object/store_test.go +++ b/object/store_test.go @@ -5,7 +5,7 @@ import "testing" func TestUpdateStoreFolders(t *testing.T) { InitConfig() - store := getStore("admin", "default") + store, _ := getStore("admin", "default") //store.Populate() store.GetVideoData() } diff --git a/object/vectorset.go b/object/vectorset.go index 9899111..21c494f 100644 --- a/object/vectorset.go +++ b/object/vectorset.go @@ -24,76 +24,80 @@ type Vectorset struct { VectorMap map[string]*Vector `xorm:"-" json:"vectorMap"` } -func GetGlobalVectorsets() []*Vectorset { +func GetGlobalVectorsets() ([]*Vectorset, error) { vectorsets := []*Vectorset{} err := adapter.engine.Asc("owner").Desc("created_time").Find(&vectorsets) if err != nil { - panic(err) + return vectorsets, err } - return vectorsets + return vectorsets, nil } -func GetVectorsets(owner string) []*Vectorset { +func GetVectorsets(owner string) ([]*Vectorset, error) { vectorsets := []*Vectorset{} err := adapter.engine.Desc("created_time").Find(&vectorsets, &Vectorset{Owner: owner}) if err != nil { - panic(err) + return vectorsets, err } - return vectorsets + return vectorsets, nil } -func getVectorset(owner string, name string) *Vectorset { +func getVectorset(owner string, name string) (*Vectorset, error) { vectorset := Vectorset{Owner: owner, Name: name} existed, err := adapter.engine.Get(&vectorset) if err != nil { - panic(err) + return &vectorset, err } if existed { - return &vectorset + return &vectorset, nil } else { - return nil + return nil, nil } } -func GetVectorset(id string) *Vectorset { +func GetVectorset(id string) (*Vectorset, error) { owner, name := util.GetOwnerAndNameFromId(id) return getVectorset(owner, name) } -func UpdateVectorset(id string, vectorset *Vectorset) bool { +func UpdateVectorset(id string, vectorset *Vectorset) (bool, error) { owner, name := util.GetOwnerAndNameFromId(id) - if getVectorset(owner, name) == nil { - return false + _, err := getVectorset(owner, name) + if err != nil { + return false, err + } + if vectorset == nil { + return false, nil } - _, err := adapter.engine.ID(core.PK{owner, name}).AllCols().Update(vectorset) + _, err = adapter.engine.ID(core.PK{owner, name}).AllCols().Update(vectorset) if err != nil { - panic(err) + return false, err } //return affected != 0 - return true + return true, nil } -func AddVectorset(vectorset *Vectorset) bool { +func AddVectorset(vectorset *Vectorset) (bool, error) { affected, err := adapter.engine.Insert(vectorset) if err != nil { - panic(err) + return false, err } - return affected != 0 + return affected != 0, nil } -func DeleteVectorset(vectorset *Vectorset) bool { +func DeleteVectorset(vectorset *Vectorset) (bool, error) { affected, err := adapter.engine.ID(core.PK{vectorset.Owner, vectorset.Name}).Delete(&Vectorset{}) if err != nil { - panic(err) + return false, err } - return affected != 0 + return affected != 0, nil } func (vectorset *Vectorset) GetId() string { diff --git a/object/vectorset_tsne_test.go b/object/vectorset_tsne_test.go index b3035be..afadbae 100644 --- a/object/vectorset_tsne_test.go +++ b/object/vectorset_tsne_test.go @@ -11,7 +11,7 @@ func TestDoVectorsetTsne(t *testing.T) { dimension := 50 //vectorset := getVectorset("admin", "wikipedia") - vectorset := getVectorset("admin", "wordVector_utf-8") + vectorset, _ := getVectorset("admin", "wordVector_utf-8") vectorset.LoadVectors("../../tmpFiles/") vectorset.DoTsne(dimension) diff --git a/object/vectorset_upload_test.go b/object/vectorset_upload_test.go index e565b42..20fdeeb 100644 --- a/object/vectorset_upload_test.go +++ b/object/vectorset_upload_test.go @@ -6,7 +6,7 @@ func TestUpdateVectorsetVectors(t *testing.T) { InitConfig() //vectorset := getVectorset("admin", "wikipedia") - vectorset := getVectorset("admin", "wordVector_utf-8") + vectorset, _ := getVectorset("admin", "wordVector_utf-8") vectorset.LoadVectors("../../tmpFiles/") UpdateVectorset(vectorset.GetId(), vectorset) } diff --git a/object/video.go b/object/video.go index f089a9f..689e857 100644 --- a/object/video.go +++ b/object/video.go @@ -31,79 +31,83 @@ type Video struct { PlayAuth string `xorm:"-" json:"playAuth"` } -func GetGlobalVideos() []*Video { +func GetGlobalVideos() ([]*Video, error) { videos := []*Video{} err := adapter.engine.Asc("owner").Desc("created_time").Find(&videos) if err != nil { - panic(err) + return videos, err } - return videos + return videos, nil } -func GetVideos(owner string) []*Video { +func GetVideos(owner string) ([]*Video, error) { videos := []*Video{} err := adapter.engine.Desc("created_time").Find(&videos, &Video{Owner: owner}) if err != nil { - panic(err) + return videos, err } - return videos + return videos, nil } -func getVideo(owner string, name string) *Video { +func getVideo(owner string, name string) (*Video, error) { v := Video{Owner: owner, Name: name} existed, err := adapter.engine.Get(&v) if err != nil { - panic(err) + return &v, err } if existed { if v.VideoId != "" { v.PlayAuth = video.GetVideoPlayAuth(v.VideoId) } - return &v + return &v, nil } else { - return nil + return nil, nil } } -func GetVideo(id string) *Video { +func GetVideo(id string) (*Video, error) { owner, name := util.GetOwnerAndNameFromId(id) return getVideo(owner, name) } -func UpdateVideo(id string, video *Video) bool { +func UpdateVideo(id string, video *Video) (bool, error) { owner, name := util.GetOwnerAndNameFromId(id) - if getVideo(owner, name) == nil { - return false + _, err := getVideo(owner, name) + if err != nil { + return false, err + } + if video == nil { + return false, nil } - _, err := adapter.engine.ID(core.PK{owner, name}).AllCols().Update(video) + _, err = adapter.engine.ID(core.PK{owner, name}).AllCols().Update(video) if err != nil { - panic(err) + return false, err } //return affected != 0 - return true + return true, nil } -func AddVideo(video *Video) bool { +func AddVideo(video *Video) (bool, error) { affected, err := adapter.engine.Insert(video) if err != nil { - panic(err) + return false, err } - return affected != 0 + return affected != 0, nil } -func DeleteVideo(video *Video) bool { +func DeleteVideo(video *Video) (bool, error) { affected, err := adapter.engine.ID(core.PK{video.Owner, video.Name}).Delete(&Video{}) if err != nil { - panic(err) + return false, err } - return affected != 0 + return affected != 0, nil } func (video *Video) GetId() string { @@ -111,6 +115,6 @@ func (video *Video) GetId() string { } func (video *Video) Populate() { - store := getStore("admin", "default") + store, _ := getStore("admin", "default") video.DataUrls = store.GetVideoData() } diff --git a/object/wordset.go b/object/wordset.go index 4174d46..70f36ca 100644 --- a/object/wordset.go +++ b/object/wordset.go @@ -19,76 +19,80 @@ type Wordset struct { Vectors []*Vector `xorm:"mediumtext" json:"vectors"` } -func GetGlobalWordsets() []*Wordset { +func GetGlobalWordsets() ([]*Wordset, error) { wordsets := []*Wordset{} err := adapter.engine.Asc("owner").Desc("created_time").Find(&wordsets) if err != nil { - panic(err) + return wordsets, err } - return wordsets + return wordsets, nil } -func GetWordsets(owner string) []*Wordset { +func GetWordsets(owner string) ([]*Wordset, error) { wordsets := []*Wordset{} err := adapter.engine.Desc("created_time").Find(&wordsets, &Wordset{Owner: owner}) if err != nil { - panic(err) + return wordsets, err } - return wordsets + return wordsets, nil } -func getWordset(owner string, name string) *Wordset { +func getWordset(owner string, name string) (*Wordset, error) { wordset := Wordset{Owner: owner, Name: name} existed, err := adapter.engine.Get(&wordset) if err != nil { - panic(err) + return &wordset, err } if existed { - return &wordset + return &wordset, nil } else { - return nil + return nil, nil } } -func GetWordset(id string) *Wordset { +func GetWordset(id string) (*Wordset, error) { owner, name := util.GetOwnerAndNameFromId(id) return getWordset(owner, name) } -func UpdateWordset(id string, wordset *Wordset) bool { +func UpdateWordset(id string, wordset *Wordset) (bool, error) { owner, name := util.GetOwnerAndNameFromId(id) - if getWordset(owner, name) == nil { - return false + _, err := getWordset(owner, name) + if err != nil { + return false, err + } + if wordset == nil { + return false, nil } - _, err := adapter.engine.ID(core.PK{owner, name}).AllCols().Update(wordset) + _, err = adapter.engine.ID(core.PK{owner, name}).AllCols().Update(wordset) if err != nil { - panic(err) + return false, err } //return affected != 0 - return true + return true, nil } -func AddWordset(wordset *Wordset) bool { +func AddWordset(wordset *Wordset) (bool, error) { affected, err := adapter.engine.Insert(wordset) if err != nil { - panic(err) + return false, err } - return affected != 0 + return affected != 0, nil } -func DeleteWordset(wordset *Wordset) bool { +func DeleteWordset(wordset *Wordset) (bool, error) { affected, err := adapter.engine.ID(core.PK{wordset.Owner, wordset.Name}).Delete(&Wordset{}) if err != nil { - panic(err) + return false, err } - return affected != 0 + return affected != 0, nil } func (wordset *Wordset) GetId() string { diff --git a/object/wordset_graph.go b/object/wordset_graph.go index 70ad3b3..6c2de7b 100644 --- a/object/wordset_graph.go +++ b/object/wordset_graph.go @@ -15,21 +15,24 @@ func init() { graphCache = map[string]*Graph{} } -func GetWordsetGraph(id string, clusterNumber int, distanceLimit int) *Graph { +func GetWordsetGraph(id string, clusterNumber int, distanceLimit int) (*Graph, error) { cacheId := fmt.Sprintf("%s|%d|%d", id, clusterNumber, distanceLimit) g, ok := graphCache[cacheId] if ok { - return g + return g, nil } - wordset := GetWordset(id) + wordset, err := GetWordset(id) + if err != nil { + return nil, err + } if wordset == nil { - return nil + return nil, nil } if len(wordset.Vectors) == 0 { - return nil + return nil, nil } allZero := true @@ -40,14 +43,14 @@ func GetWordsetGraph(id string, clusterNumber int, distanceLimit int) *Graph { } } if allZero { - return nil + return nil, nil } runKmeans(wordset.Vectors, clusterNumber) g = generateGraph(wordset.Vectors, distanceLimit) //graphCache[cacheId] = g - return g + return g, nil } func getDistance(v1 *Vector, v2 *Vector) float64 { diff --git a/object/wordset_match.go b/object/wordset_match.go index 15ae174..9abd04f 100644 --- a/object/wordset_match.go +++ b/object/wordset_match.go @@ -1,14 +1,20 @@ package object -func GetWordsetMatch(id string) *Wordset { - wordset := GetWordset(id) +func GetWordsetMatch(id string) (*Wordset, error) { + wordset, err := GetWordset(id) + if err != nil { + return nil, err + } if wordset == nil { - return nil + return nil, nil } - vectorset := getVectorset(wordset.Owner, wordset.Vectorset) + vectorset, err := getVectorset(wordset.Owner, wordset.Vectorset) + if err != nil { + return nil, err + } if vectorset == nil { - return nil + return nil, nil } vectorset.LoadVectors("") @@ -22,5 +28,5 @@ func GetWordsetMatch(id string) *Wordset { } UpdateWordset(wordset.GetId(), wordset) - return wordset + return wordset, nil } diff --git a/object/wordset_upload.go b/object/wordset_upload.go index 520acc8..60fca66 100644 --- a/object/wordset_upload.go +++ b/object/wordset_upload.go @@ -5,7 +5,7 @@ import ( "github.com/casbin/casibase/xlsx" ) -func uploadVectorNames(owner string, fileId string) bool { +func uploadVectorNames(owner string, fileId string) (bool, error) { table := xlsx.ReadXlsxFile(fileId) vectorMap := map[string]int{} diff --git a/web/src/App.js b/web/src/App.js index 224c025..2f84651 100644 --- a/web/src/App.js +++ b/web/src/App.js @@ -95,14 +95,18 @@ class App extends Component { getAccount() { AccountBackend.getAccount() .then((res) => { - const account = res.data; - if (account !== null) { - this.setLanguage(account); + if (res.status === "ok") { + const account = res.data; + if (account !== null) { + this.setLanguage(account); + } + this.setState({ + account: account, + }); + } else { + Setting.showMessage("error", `Failed to get account: ${res.msg}`); + Setting.goToLink("/signin"); } - - this.setState({ - account: account, - }); }); } diff --git a/web/src/ClusteringPage.js b/web/src/ClusteringPage.js index 659c586..502e210 100644 --- a/web/src/ClusteringPage.js +++ b/web/src/ClusteringPage.js @@ -2,6 +2,7 @@ import React from "react"; import * as Conf from "./Conf"; import * as WordsetBackend from "./backend/WordsetBackend"; import WordsetGraph from "./WordsetGraph"; +import * as Setting from "./Setting"; class ClusteringPage extends React.Component { constructor(props) { @@ -19,9 +20,11 @@ class ClusteringPage extends React.Component { getWordset() { WordsetBackend.getWordset(Conf.DefaultOwner, Conf.DefaultWordsetName) .then((wordset) => { - this.setState({ - wordset: wordset, - }); + if (wordset.status === "ok") { + this.setState({wordset: wordset.data}); + } else { + Setting.showMessage("error", `Failed to get wordset: ${wordset.msg}`); + } }); } diff --git a/web/src/FileTable.js b/web/src/FileTable.js index 6ae9b65..4c14d3b 100644 --- a/web/src/FileTable.js +++ b/web/src/FileTable.js @@ -65,11 +65,15 @@ class FileTable extends React.Component { const storeId = `${this.props.store.owner}/${this.props.store.name}`; FileBackend.deleteFile(storeId, file.key, isLeaf) .then((res) => { - if (res === true) { - Setting.showMessage("success", "File deleted successfully"); - this.props.onRefresh(); + if (res.status === "ok") { + if (res.data === true) { + Setting.showMessage("success", "File deleted successfully"); + this.props.onRefresh(); + } else { + Setting.showMessage("error", `File failed to delete: ${res.msg}`); + } } else { - Setting.showMessage("error", `File failed to delete: ${res}`); + Setting.showMessage("error", `File failed to delete: ${res.msg}`); } }) .catch(error => { diff --git a/web/src/FileTree.js b/web/src/FileTree.js index a15d505..86debe2 100644 --- a/web/src/FileTree.js +++ b/web/src/FileTree.js @@ -68,11 +68,15 @@ class FileTree extends React.Component { getPermissions() { PermissionBackend.getPermissions(Conf.AuthConfig.organizationName) .then((permissions) => { - permissions = permissions.filter(permission => (permission.domains[0] === this.props.store.name) && permission.users.length !== 0); - this.setState({ - permissions: permissions, - permissionMap: this.getPermissionMap(permissions), - }); + if (permissions.status === "ok") { + permissions = permissions.filter(permission => (permission.domains[0] === this.props.store.name) && permission.users.length !== 0); + this.setState({ + permissions: permissions, + permissionMap: this.getPermissionMap(permissions), + }); + } else { + Setting.showMessage("error", `Failed to get permissions: ${permissions.msg}`); + } }); } @@ -164,8 +168,12 @@ class FileTree extends React.Component { const storeId = `${this.props.store.owner}/${this.props.store.name}`; FileBackend.addFile(storeId, file.key, false, newFolder, null) .then((res) => { - Setting.showMessage("success", "File added successfully"); - this.props.onRefresh(); + if (res.status === "ok") { + Setting.showMessage("success", "File added successfully"); + this.props.onRefresh(); + } else { + Setting.showMessage("error", `File failed to add: ${res.msg}`); + } }) .catch(error => { Setting.showMessage("error", `File failed to add: ${error}`); @@ -176,11 +184,15 @@ class FileTree extends React.Component { const storeId = `${this.props.store.owner}/${this.props.store.name}`; FileBackend.deleteFile(storeId, file.key, isLeaf) .then((res) => { - if (res === true) { - Setting.showMessage("success", "File deleted successfully"); - this.props.onRefresh(); + if (res.status === "ok") { + if (res.data === true) { + Setting.showMessage("success", "File deleted successfully"); + this.props.onRefresh(); + } else { + Setting.showMessage("error", "File failed to delete:server side failure"); + } } else { - Setting.showMessage("error", `File failed to delete: ${res}`); + Setting.showMessage("error", `File failed to delete: ${res.msg}`); } }) .catch(error => { @@ -334,11 +346,15 @@ class FileTree extends React.Component { if (this.getCacheApp(filename) !== "") { FileBackend.activateFile(key, filename) .then((res) => { - if (res === true) { - // Setting.showMessage("success", `File activated successfully`); - fetchFile(); + if (res.status === "ok") { + if (res.data === true) { + // Setting.showMessage("success", `File activated successfully`); + fetchFile(); + } else { + Setting.showMessage("error", "File failed to activate: server side failure"); + } } else { - Setting.showMessage("error", `File failed to activate: ${res}`); + Setting.showMessage("error", `File failed to activate: ${res.msg}`); } }) .catch(error => { diff --git a/web/src/FileTreePage.js b/web/src/FileTreePage.js index 43b2691..bbd7912 100644 --- a/web/src/FileTreePage.js +++ b/web/src/FileTreePage.js @@ -25,7 +25,7 @@ class FileTreePage extends React.Component { .then((res) => { if (res?.status !== "error") { this.setState({ - store: res, + store: res.data, }); } else { Setting.showMessage("error", res.msg); diff --git a/web/src/LabelTable.js b/web/src/LabelTable.js index 4f545bb..9a9a33f 100644 --- a/web/src/LabelTable.js +++ b/web/src/LabelTable.js @@ -3,8 +3,6 @@ import {DeleteOutlined} from "@ant-design/icons"; import {Button, Col, Input, InputNumber, Row, Table, Tooltip} from "antd"; import * as Setting from "./Setting"; import i18next from "i18next"; -import FileSaver from "file-saver"; -import XLSX from "xlsx"; class LabelTable extends React.Component { constructor(props) { @@ -73,23 +71,6 @@ class LabelTable extends React.Component { this.updateTable(table); } - downloadLabels(table) { - const data = []; - table.forEach((label, i) => { - const row = {}; - - row[0] = label.startTime; - row[1] = label.endTime; - row[2] = label.text; - data.push(row); - }); - - const sheet = XLSX.utils.json_to_sheet(data, {skipHeader: true}); - const blob = Setting.sheet2blob(sheet, "labels"); - const fileName = `labels-${this.props.video.name}-${table.length}.xlsx`; - FileSaver.saveAs(blob, fileName); - } - renderTable(table) { const columns = [ { @@ -194,7 +175,7 @@ class LabelTable extends React.Component { { table.length === 0 ? null : ( - + ) } diff --git a/web/src/PermissionUtil.js b/web/src/PermissionUtil.js index d17bfe7..f4d260d 100644 --- a/web/src/PermissionUtil.js +++ b/web/src/PermissionUtil.js @@ -35,9 +35,12 @@ export function addPermission(account, store, file = null, fileKeys = null) { PermissionBackend.addPermission(newPermission) .then((res) => { - Setting.openLink(Setting.getMyProfileUrl(account).replace("/account", `/permissions/${newPermission.owner}/${newPermission.name}`)); - } - ) + if (res.status === "ok") { + Setting.openLink(Setting.getMyProfileUrl(account).replace("/account", `/permissions/${newPermission.owner}/${newPermission.name}`)); + } else { + Setting.showMessage("error", `Permission failed to add: ${res.msg}`); + } + }) .catch(error => { Setting.showMessage("error", `Permission failed to add: ${error}`); }); diff --git a/web/src/Setting.js b/web/src/Setting.js index 7a17a0f..3def12f 100644 --- a/web/src/Setting.js +++ b/web/src/Setting.js @@ -102,6 +102,9 @@ export function isLocalAdminUser(account) { } export function deepCopy(obj) { + if (obj === null) { + showMessage("error", "deepCopy obj is null."); + } return Object.assign({}, obj); } @@ -371,11 +374,50 @@ export function downloadXlsx(wordset) { // { wch: 7 }, // ]; - const blob = sheet2blob(sheet, "vectors"); - const fileName = `vectors-${wordset.name}.xlsx`; - FileSaver.saveAs(blob, fileName); + try { + const blob = sheet2blob(sheet, "vectors"); + const fileName = `vectors-${wordset.name}.xlsx`; + FileSaver.saveAs(blob, fileName); + } catch (error) { + showMessage("error", `failed to download: ${error.message}`); + } } +export function downloadLabels(table) { + const data = []; + table.forEach((label, i) => { + const row = {}; + + row[0] = label.startTime; + row[1] = label.endTime; + row[2] = label.text; + data.push(row); + }); + + const sheet = XLSX.utils.json_to_sheet(data, {skipHeader: true}); + try { + const blob = sheet2blob(sheet, "labels"); + const fileName = `labels-${this.props.video.name}-${table.length}.xlsx`; + FileSaver.saveAs(blob, fileName); + } catch (error) { + showMessage("error", `failed to download: ${error.message}`); + } +} + +export const redirectCatchJsonError = async(url) => { + try { + const response = await fetch(url); + const msg = await response.json(); + if (response.ok) { + this.props.history.push(url); + } else { + showMessage("error", `error in redirect: ${msg}`); + } + } catch (error) { + showMessage("error", `failed to redirect: ${error.message}`); + } +}; + export function toFixed(f, n) { return parseFloat(f.toFixed(n)); } @@ -498,10 +540,14 @@ export function submitStoreEdit(storeObj) { store.fileTree = undefined; StoreBackend.updateStore(storeObj.owner, storeObj.name, store) .then((res) => { - if (res) { - showMessage("success", "Successfully saved"); + if (res.status === "ok") { + if (res.data) { + showMessage("success", "Successfully saved"); + } else { + showMessage("error", "failed to save: server side failure"); + } } else { - showMessage("error", "failed to save: server side failure"); + showMessage("error", `failed to save: ${res.msg}`); } }) .catch(error => { diff --git a/web/src/StoreEditPage.js b/web/src/StoreEditPage.js index 8833928..d3938a9 100644 --- a/web/src/StoreEditPage.js +++ b/web/src/StoreEditPage.js @@ -24,9 +24,13 @@ class StoreEditPage extends React.Component { getStore() { StoreBackend.getStore(this.state.owner, this.state.storeName) .then((store) => { - this.setState({ - store: store, - }); + if (store.status === "ok") { + this.setState({ + store: store.data, + }); + } else { + Setting.showMessage("error", `Failed to get store: ${store.msg}`); + } }); } @@ -117,15 +121,19 @@ class StoreEditPage extends React.Component { store.fileTree = undefined; StoreBackend.updateStore(this.state.store.owner, this.state.storeName, store) .then((res) => { - if (res) { - Setting.showMessage("success", "Successfully saved"); - this.setState({ - storeName: this.state.store.name, - }); - this.props.history.push(`/stores/${this.state.store.owner}/${this.state.store.name}`); + if (res.status === "ok") { + if (res.data) { + Setting.showMessage("success", "Successfully saved"); + this.setState({ + storeName: this.state.store.name, + }); + this.props.history.push(`/stores/${this.state.store.owner}/${this.state.store.name}`); + } else { + Setting.showMessage("error", "failed to save: server side failure"); + this.updateStoreField("name", this.state.storeName); + } } else { - Setting.showMessage("error", "failed to save: server side failure"); - this.updateStoreField("name", this.state.storeName); + Setting.showMessage("error", `failed to save: ${res.msg}`); } }) .catch(error => { diff --git a/web/src/StoreListPage.js b/web/src/StoreListPage.js index f35184c..a14573b 100644 --- a/web/src/StoreListPage.js +++ b/web/src/StoreListPage.js @@ -22,9 +22,13 @@ class StoreListPage extends React.Component { getStores() { StoreBackend.getGlobalStores() .then((res) => { - this.setState({ - stores: res, - }); + if (res.status === "ok") { + this.setState({ + stores: res.data, + }); + } else { + Setting.showMessage("error", `Failed to get stores: ${res.msg}`); + } }); } @@ -44,10 +48,14 @@ class StoreListPage extends React.Component { const newStore = this.newStore(); StoreBackend.addStore(newStore) .then((res) => { - Setting.showMessage("success", "Store added successfully"); - this.setState({ - stores: Setting.prependRow(this.state.stores, newStore), - }); + if (res.status === "ok") { + Setting.showMessage("success", "Store added successfully"); + this.setState({ + stores: Setting.prependRow(this.state.stores, newStore), + }); + } else { + Setting.showMessage("error", `Store failed to add: ${res.msg}`); + } }) .catch(error => { Setting.showMessage("error", `Store failed to add: ${error}`); @@ -57,10 +65,14 @@ class StoreListPage extends React.Component { deleteStore(i) { StoreBackend.deleteStore(this.state.stores[i]) .then((res) => { - Setting.showMessage("success", "Store deleted successfully"); - this.setState({ - stores: Setting.deleteRow(this.state.stores, i), - }); + if (res.status === "ok") { + Setting.showMessage("success", "Store deleted successfully"); + this.setState({ + stores: Setting.deleteRow(this.state.stores, i), + }); + } else { + Setting.showMessage("error", `Store failed to delete: ${res.msg}`); + } }) .catch(error => { Setting.showMessage("error", `Store failed to delete: ${error}`); @@ -98,12 +110,19 @@ class StoreListPage extends React.Component { render: (text, record, index) => { return (
- + { !Setting.isLocalAdminUser(this.props.account) ? null : ( - - Setting.redirectCatchJsonError(`/stores/${record.owner}/${record.name}`)} + >{i18next.t("general:Edit")} + this.deleteStore(index)} okText="OK" diff --git a/web/src/VectorsetEditPage.js b/web/src/VectorsetEditPage.js index 6809841..92b2417 100644 --- a/web/src/VectorsetEditPage.js +++ b/web/src/VectorsetEditPage.js @@ -23,9 +23,13 @@ class VectorsetEditPage extends React.Component { getVectorset() { VectorsetBackend.getVectorset(this.props.account.name, this.state.vectorsetName) .then((vectorset) => { - this.setState({ - vectorset: vectorset, - }); + if (vectorset.status === "ok") { + this.setState({ + vectorset: vectorset.data, + }); + } else { + Setting.showMessage("error", `Failed to get vectorset: ${vectorset.msg}`); + } }); } @@ -144,15 +148,19 @@ class VectorsetEditPage extends React.Component { const vectorset = Setting.deepCopy(this.state.vectorset); VectorsetBackend.updateVectorset(this.state.vectorset.owner, this.state.vectorsetName, vectorset) .then((res) => { - if (res) { - Setting.showMessage("success", "Successfully saved"); - this.setState({ - vectorsetName: this.state.vectorset.name, - }); - this.props.history.push(`/vectorsets/${this.state.vectorset.name}`); + if (res.status === "ok") { + if (res.data) { + Setting.showMessage("success", "Successfully saved"); + this.setState({ + vectorsetName: this.state.vectorset.name, + }); + this.props.history.push(`/vectorsets/${this.state.vectorset.name}`); + } else { + Setting.showMessage("error", "failed to save: server side failure"); + this.updateVectorsetField("name", this.state.vectorsetName); + } } else { - Setting.showMessage("error", "failed to save: server side failure"); - this.updateVectorsetField("name", this.state.vectorsetName); + Setting.showMessage("error", `failed to save: ${res.msg}`); } }) .catch(error => { diff --git a/web/src/VectorsetListPage.js b/web/src/VectorsetListPage.js index 49efe16..72c5c49 100644 --- a/web/src/VectorsetListPage.js +++ b/web/src/VectorsetListPage.js @@ -22,9 +22,13 @@ class VectorsetListPage extends React.Component { getVectorsets() { VectorsetBackend.getVectorsets(this.props.account.name) .then((res) => { - this.setState({ - vectorsets: res, - }); + if (res.status === "ok") { + this.setState({ + vectorsets: res.data, + }); + } else { + Setting.showMessage("error", `Failed to get vectorsets: ${res.msg}`); + } }); } @@ -47,10 +51,14 @@ class VectorsetListPage extends React.Component { const newVectorset = this.newVectorset(); VectorsetBackend.addVectorset(newVectorset) .then((res) => { - Setting.showMessage("success", "Vectorset added successfully"); - this.setState({ - vectorsets: Setting.prependRow(this.state.vectorsets, newVectorset), - }); + if (res.status === "ok") { + Setting.showMessage("success", "Vectorset added successfully"); + this.setState({ + vectorsets: Setting.prependRow(this.state.vectorsets, newVectorset), + }); + } else { + Setting.showMessage("error", `Failed to add vectorset: ${res.msg}`); + } }) .catch(error => { Setting.showMessage("error", `Vectorset failed to add: ${error}`); @@ -60,10 +68,14 @@ class VectorsetListPage extends React.Component { deleteVectorset(i) { VectorsetBackend.deleteVectorset(this.state.vectorsets[i]) .then((res) => { - Setting.showMessage("success", "Vectorset deleted successfully"); - this.setState({ - vectorsets: Setting.deleteRow(this.state.vectorsets, i), - }); + if (res.status === "ok") { + Setting.showMessage("success", "Vectorset deleted successfully"); + this.setState({ + vectorsets: Setting.deleteRow(this.state.vectorsets, i), + }); + } else { + Setting.showMessage("error", `Vectorset failed to delete: ${res.msg}`); + } }) .catch(error => { Setting.showMessage("error", `Vectorset failed to delete: ${error}`); diff --git a/web/src/VideoEditPage.js b/web/src/VideoEditPage.js index 2b787c9..a6f4ce2 100644 --- a/web/src/VideoEditPage.js +++ b/web/src/VideoEditPage.js @@ -34,13 +34,17 @@ class VideoEditPage extends React.Component { getVideo() { VideoBackend.getVideo(this.props.account.name, this.state.videoName) .then((video) => { - this.setState({ - video: video, - currentTime: 0, - }); + if (video.status === "ok") { + this.setState({ + video: video.data, + currentTime: 0, + }); - if (video.dataUrl !== "") { - this.getDataAndParse(video.dataUrl); + if (video.dataUrl !== "") { + this.getDataAndParse(video.dataUrl); + } + } else { + Setting.showMessage("error", `Failed to get video: ${video.msg}`); } }); } @@ -265,15 +269,19 @@ class VideoEditPage extends React.Component { const video = Setting.deepCopy(this.state.video); VideoBackend.updateVideo(this.state.video.owner, this.state.videoName, video) .then((res) => { - if (res) { - Setting.showMessage("success", "Successfully saved"); - this.setState({ - videoName: this.state.video.name, - }); - this.props.history.push(`/videos/${this.state.video.name}`); + if (res.status === "ok") { + if (res.data) { + Setting.showMessage("success", "Successfully saved"); + this.setState({ + videoName: this.state.video.name, + }); + this.props.history.push(`/videos/${this.state.video.name}`); + } else { + Setting.showMessage("error", "failed to save: server side failure"); + this.updateVideoField("name", this.state.videoName); + } } else { - Setting.showMessage("error", "failed to save: server side failure"); - this.updateVideoField("name", this.state.videoName); + Setting.showMessage("error", `failed to save: ${res.msg}`); } }) .catch(error => { diff --git a/web/src/VideoListPage.js b/web/src/VideoListPage.js index 864d95a..881decf 100644 --- a/web/src/VideoListPage.js +++ b/web/src/VideoListPage.js @@ -23,9 +23,13 @@ class VideoListPage extends React.Component { getVideos() { VideoBackend.getVideos(this.props.account.name) .then((res) => { - this.setState({ - videos: res, - }); + if (res.status === "ok") { + this.setState({ + videos: res.data, + }); + } else { + Setting.showMessage("error", `Failed to get videos: ${res.msg}`); + } }); } @@ -48,10 +52,14 @@ class VideoListPage extends React.Component { const newVideo = this.newVideo(); VideoBackend.addVideo(newVideo) .then((res) => { - Setting.showMessage("success", "Video added successfully"); - this.setState({ - videos: Setting.prependRow(this.state.videos, newVideo), - }); + if (res.status === "ok") { + Setting.showMessage("success", "Video added successfully"); + this.setState({ + videos: Setting.prependRow(this.state.videos, newVideo), + }); + } else { + Setting.showMessage("error", `Video failed to add: ${res.msg}`); + } }) .catch(error => { Setting.showMessage("error", `Video failed to add: ${error}`); @@ -61,10 +69,14 @@ class VideoListPage extends React.Component { deleteVideo(i) { VideoBackend.deleteVideo(this.state.videos[i]) .then((res) => { - Setting.showMessage("success", "Video deleted successfully"); - this.setState({ - videos: Setting.deleteRow(this.state.videos, i), - }); + if (res.status === "ok") { + Setting.showMessage("success", "Video deleted successfully"); + this.setState({ + videos: Setting.deleteRow(this.state.videos, i), + }); + } else { + Setting.showMessage("error", `Video failed to delete: ${res.msg}`); + } }) .catch(error => { Setting.showMessage("error", `Video failed to delete: ${error}`); diff --git a/web/src/WordsetEditPage.js b/web/src/WordsetEditPage.js index 76be2ff..4c10748 100644 --- a/web/src/WordsetEditPage.js +++ b/web/src/WordsetEditPage.js @@ -29,18 +29,26 @@ class WordsetEditPage extends React.Component { getWordset() { WordsetBackend.getWordset(this.props.account.name, this.state.wordsetName) .then((wordset) => { - this.setState({ - wordset: wordset, - }); + if (wordset.status === "ok") { + this.setState({ + wordset: wordset.data, + }); + } else { + Setting.showMessage("error", `Failed to get wordset: ${wordset.msg}`); + } }); } getVectorsets() { VectorsetBackend.getVectorsets(this.props.account.name) .then((res) => { - this.setState({ - vectorsets: res, - }); + if (res.status === "ok") { + this.setState({ + vectorsets: res.data, + }); + } else { + Setting.showMessage("error", `Failed to get vectorsets: ${res.msg}`); + } }); } @@ -115,10 +123,14 @@ class WordsetEditPage extends React.Component { }); WordsetBackend.getWordsetMatch(this.props.account.name, this.state.wordsetName) .then((wordset) => { - this.setState({ - wordset: wordset, - matchLoading: false, - }); + if (wordset.status === "ok") { + this.setState({ + wordset: wordset.data, + matchLoading: false, + }); + } else { + Setting.showMessage("error", `Failed to get wordset: ${wordset.msg}`); + } }); }}>{i18next.t("wordset:Match")} @@ -170,15 +182,19 @@ class WordsetEditPage extends React.Component { const wordset = Setting.deepCopy(this.state.wordset); WordsetBackend.updateWordset(this.state.wordset.owner, this.state.wordsetName, wordset) .then((res) => { - if (res) { - Setting.showMessage("success", "Successfully saved"); - this.setState({ - wordsetName: this.state.wordset.name, - }); - this.props.history.push(`/wordsets/${this.state.wordset.name}`); + if (res.status === "ok") { + if (res.data) { + Setting.showMessage("success", "Successfully saved"); + this.setState({ + wordsetName: this.state.wordset.name, + }); + this.props.history.push(`/wordsets/${this.state.wordset.name}`); + } else { + Setting.showMessage("error", "failed to save: server side failure"); + this.updateWordsetField("name", this.state.wordsetName); + } } else { - Setting.showMessage("error", "failed to save: server side failure"); - this.updateWordsetField("name", this.state.wordsetName); + Setting.showMessage("error", `failed to save: ${res.msg}`); } }) .catch(error => { diff --git a/web/src/WordsetGraph.js b/web/src/WordsetGraph.js index 831617a..7817020 100644 --- a/web/src/WordsetGraph.js +++ b/web/src/WordsetGraph.js @@ -71,13 +71,17 @@ class WordsetGraph extends React.Component { }); WordsetBackend.getWordsetGraph("admin", this.state.wordsetName, this.state.clusterNumber, this.state.distanceLimit) .then((graph) => { - this.setState({ - graph: graph, - loading: false, - selectedType: null, - selectedId: null, - selectedIds: [], - }); + if (graph.status === "ok") { + this.setState({ + graph: graph.data, + loading: false, + selectedType: null, + selectedId: null, + selectedIds: [], + }); + } else { + Setting.showMessage("error", `Failed to get wordset graph: ${graph.msg}`); + } }); } diff --git a/web/src/WordsetGraphPage.js b/web/src/WordsetGraphPage.js index 1aa974c..bdba751 100644 --- a/web/src/WordsetGraphPage.js +++ b/web/src/WordsetGraphPage.js @@ -1,6 +1,7 @@ import React from "react"; import * as WordsetBackend from "./backend/WordsetBackend"; import WordsetGraph from "./WordsetGraph"; +import * as Setting from "./Setting"; class WordsetGraphPage extends React.Component { constructor(props) { @@ -19,9 +20,13 @@ class WordsetGraphPage extends React.Component { getWordset() { WordsetBackend.getWordset(this.props.account.name, this.state.wordsetName) .then((wordset) => { - this.setState({ - wordset: wordset, - }); + if (wordset.status === "ok") { + this.setState({ + wordset: wordset.data, + }); + } else { + Setting.showMessage("error", `Failed to get wordset: ${wordset.msg}`); + } }); } diff --git a/web/src/WordsetListPage.js b/web/src/WordsetListPage.js index 3ec7c78..811d894 100644 --- a/web/src/WordsetListPage.js +++ b/web/src/WordsetListPage.js @@ -22,9 +22,13 @@ class WordsetListPage extends React.Component { getWordsets() { WordsetBackend.getWordsets(this.props.account.name) .then((res) => { - this.setState({ - wordsets: res, - }); + if (res.status === "ok") { + this.setState({ + wordsets: res.data, + }); + } else { + Setting.showMessage("error", `Failed to get wordsets: ${res.msg}`); + } }); } @@ -44,10 +48,14 @@ class WordsetListPage extends React.Component { const newWordset = this.newWordset(); WordsetBackend.addWordset(newWordset) .then((res) => { - Setting.showMessage("success", "Wordset added successfully"); - this.setState({ - wordsets: Setting.prependRow(this.state.wordsets, newWordset), - }); + if (res.status === "ok") { + Setting.showMessage("success", "Wordset added successfully"); + this.setState({ + wordsets: Setting.prependRow(this.state.wordsets, newWordset), + }); + } else { + Setting.showMessage("error", `Failed to add wordset: ${res.msg}`); + } }) .catch(error => { Setting.showMessage("error", `Wordset failed to add: ${error}`); @@ -57,10 +65,14 @@ class WordsetListPage extends React.Component { deleteWordset(i) { WordsetBackend.deleteWordset(this.state.wordsets[i]) .then((res) => { - Setting.showMessage("success", "Wordset deleted successfully"); - this.setState({ - wordsets: Setting.deleteRow(this.state.wordsets, i), - }); + if (res.status === "ok") { + Setting.showMessage("success", "Wordset deleted successfully"); + this.setState({ + wordsets: Setting.deleteRow(this.state.wordsets, i), + }); + } else { + Setting.showMessage("error", `Failed to delete wordset: ${res.msg}`); + } }) .catch(error => { Setting.showMessage("error", `Wordset failed to delete: ${error}`);