feat: Add ResponseError to show error message in frontend (#14)

This commit is contained in:
Kelvin Chiu 2023-07-08 11:19:56 +08:00 committed by GitHub
parent 4f2bb85535
commit 98113c7663
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
39 changed files with 775 additions and 411 deletions

View File

@ -28,68 +28,71 @@ type Permission struct {
State string `xorm:"varchar(100)" json:"state"` State string `xorm:"varchar(100)" json:"state"`
} }
func GetPermissions(owner string) []*Permission { func GetPermissions(owner string) ([]*Permission, error) {
permissions := []*Permission{} permissions := []*Permission{}
err := adapter.Engine.Desc("created_time").Find(&permissions, &Permission{Owner: owner}) err := adapter.Engine.Desc("created_time").Find(&permissions, &Permission{Owner: owner})
if err != nil { 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 == "" { if owner == "" || name == "" {
return nil return nil, nil
} }
permission := Permission{Owner: owner, Name: name} permission := Permission{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&permission) existed, err := adapter.Engine.Get(&permission)
if err != nil { if err != nil {
panic(err) return &permission, err
} }
if existed { if existed {
return &permission return &permission, nil
} else { } else {
return nil return nil, nil
} }
} }
func GetPermission(id string) *Permission { func GetPermission(id string) (*Permission, error) {
owner, name := util.GetOwnerAndNameFromId(id) owner, name := util.GetOwnerAndNameFromId(id)
return getPermission(owner, name) return getPermission(owner, name)
} }
func UpdatePermission(id string, permission *Permission) bool { func UpdatePermission(id string, permission *Permission) (bool, error) {
owner, name := util.GetOwnerAndNameFromId(id) owner, name := util.GetOwnerAndNameFromId(id)
oldPermission := getPermission(owner, name) oldPermission, err := getPermission(owner, name)
if err != nil {
return false, err
}
if oldPermission == nil { if oldPermission == nil {
return false return false, nil
} }
affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(permission) affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(permission)
if err != nil { 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) affected, err := adapter.Engine.Insert(permission)
if err != nil { 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{}) affected, err := adapter.Engine.ID(core.PK{permission.Owner, permission.Name}).Delete(&Permission{})
if err != nil { if err != nil {
panic(err) return false, err
} }
return affected != 0 return affected != 0, nil
} }

View File

@ -19,7 +19,8 @@ func (c *ApiController) UpdateFile() {
var file object.File var file object.File
err := json.Unmarshal(c.Ctx.Input.RequestBody, &file) err := json.Unmarshal(c.Ctx.Input.RequestBody, &file)
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
res := object.UpdateFile(storeId, key, &file) res := object.UpdateFile(storeId, key, &file)
@ -27,8 +28,7 @@ func (c *ApiController) UpdateFile() {
addRecordForFile(c, userName, "Update", storeId, key, "", true) addRecordForFile(c, userName, "Update", storeId, key, "", true)
} }
c.Data["json"] = res c.ResponseOk(res)
c.ServeJSON()
} }
func (c *ApiController) AddFile() { func (c *ApiController) AddFile() {
@ -53,14 +53,18 @@ func (c *ApiController) AddFile() {
defer file.Close() 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 { if res {
addFileToCache(key, filename, bs) addFileToCache(key, filename, bs)
addRecordForFile(c, userName, "Add", storeId, key, filename, isLeaf) addRecordForFile(c, userName, "Add", storeId, key, filename, isLeaf)
} }
c.Data["json"] = res c.ResponseOk(res)
c.ServeJSON()
} }
func (c *ApiController) DeleteFile() { func (c *ApiController) DeleteFile() {
@ -73,11 +77,15 @@ func (c *ApiController) DeleteFile() {
key := c.Input().Get("key") key := c.Input().Get("key")
isLeaf := c.Input().Get("isLeaf") == "1" 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 { if res {
addRecordForFile(c, userName, "Delete", storeId, key, "", isLeaf) addRecordForFile(c, userName, "Delete", storeId, key, "", isLeaf)
} }
c.Data["json"] = res c.ResponseOk(res)
c.ServeJSON()
} }

View File

@ -53,8 +53,7 @@ func (c *ApiController) ActivateFile() {
prefix := getCachePrefix(filename) prefix := getCachePrefix(filename)
if prefix == "" { if prefix == "" {
c.Data["json"] = false c.ResponseOk(false)
c.ServeJSON()
return return
} }
@ -66,8 +65,7 @@ func (c *ApiController) ActivateFile() {
util.CopyFile(getAppPath(filename), getAppPath(prefix)) util.CopyFile(getAppPath(filename), getAppPath(prefix))
} }
c.Data["json"] = true c.ResponseOk(true)
c.ServeJSON()
} }
func (c *ApiController) GetActiveFile() { func (c *ApiController) GetActiveFile() {
@ -78,6 +76,5 @@ func (c *ApiController) GetActiveFile() {
res = v res = v
} }
c.Data["json"] = res c.ResponseOk(res)
c.ServeJSON()
} }

View File

@ -9,15 +9,25 @@ import (
func (c *ApiController) GetPermissions() { func (c *ApiController) GetPermissions() {
owner := c.Input().Get("owner") owner := c.Input().Get("owner")
c.Data["json"] = casdoor.GetPermissions(owner) permissions, err := casdoor.GetPermissions(owner)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(permissions)
} }
func (c *ApiController) GetPermission() { func (c *ApiController) GetPermission() {
id := c.Input().Get("id") id := c.Input().Get("id")
c.Data["json"] = casdoor.GetPermission(id) permission, err := casdoor.GetPermission(id)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(permission)
} }
func (c *ApiController) UpdatePermission() { func (c *ApiController) UpdatePermission() {
@ -29,28 +39,45 @@ func (c *ApiController) UpdatePermission() {
panic(err) panic(err)
} }
c.Data["json"] = casdoor.UpdatePermission(id, &permission) success, err := casdoor.UpdatePermission(id, &permission)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(success)
} }
func (c *ApiController) AddPermission() { func (c *ApiController) AddPermission() {
var permission casdoor.Permission var permission casdoor.Permission
err := json.Unmarshal(c.Ctx.Input.RequestBody, &permission) err := json.Unmarshal(c.Ctx.Input.RequestBody, &permission)
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
c.Data["json"] = casdoor.AddPermission(&permission) success, err := casdoor.AddPermission(&permission)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(success)
} }
func (c *ApiController) DeletePermission() { func (c *ApiController) DeletePermission() {
var permission casdoor.Permission var permission casdoor.Permission
err := json.Unmarshal(c.Ctx.Input.RequestBody, &permission) err := json.Unmarshal(c.Ctx.Input.RequestBody, &permission)
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
c.Data["json"] = casdoor.DeletePermission(&permission) success, err := casdoor.DeletePermission(&permission)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(success)
} }

View File

@ -7,30 +7,42 @@ import (
) )
func (c *ApiController) GetGlobalStores() { func (c *ApiController) GetGlobalStores() {
c.Data["json"] = object.GetGlobalStores() stores, err := object.GetGlobalStores()
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(stores)
} }
func (c *ApiController) GetStores() { func (c *ApiController) GetStores() {
owner := c.Input().Get("owner") owner := c.Input().Get("owner")
c.Data["json"] = object.GetStores(owner) stores, err := object.GetStores(owner)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(stores)
} }
func (c *ApiController) GetStore() { func (c *ApiController) GetStore() {
id := c.Input().Get("id") 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 { if store == nil {
c.ResponseError("store is empty") c.ResponseError("store is empty")
return return
} }
store.Populate() store.Populate()
c.ResponseOk(store)
c.Data["json"] = store
c.ServeJSON()
} }
func (c *ApiController) UpdateStore() { func (c *ApiController) UpdateStore() {
@ -39,31 +51,49 @@ func (c *ApiController) UpdateStore() {
var store object.Store var store object.Store
err := json.Unmarshal(c.Ctx.Input.RequestBody, &store) err := json.Unmarshal(c.Ctx.Input.RequestBody, &store)
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
c.Data["json"] = object.UpdateStore(id, &store) success, err := object.UpdateStore(id, &store)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(success)
} }
func (c *ApiController) AddStore() { func (c *ApiController) AddStore() {
var store object.Store var store object.Store
err := json.Unmarshal(c.Ctx.Input.RequestBody, &store) err := json.Unmarshal(c.Ctx.Input.RequestBody, &store)
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
c.Data["json"] = object.AddStore(&store) sucess, err := object.AddStore(&store)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(sucess)
} }
func (c *ApiController) DeleteStore() { func (c *ApiController) DeleteStore() {
var store object.Store var store object.Store
err := json.Unmarshal(c.Ctx.Input.RequestBody, &store) err := json.Unmarshal(c.Ctx.Input.RequestBody, &store)
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
c.Data["json"] = object.DeleteStore(&store) sucess, err := object.DeleteStore(&store)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(sucess)
} }

View File

@ -7,22 +7,37 @@ import (
) )
func (c *ApiController) GetGlobalVectorsets() { func (c *ApiController) GetGlobalVectorsets() {
c.Data["json"] = object.GetGlobalVectorsets() vectorsets, err := object.GetGlobalVectorsets()
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(vectorsets)
} }
func (c *ApiController) GetVectorsets() { func (c *ApiController) GetVectorsets() {
owner := c.Input().Get("owner") owner := c.Input().Get("owner")
c.Data["json"] = object.GetVectorsets(owner) vectorsets, err := object.GetVectorsets(owner)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(vectorsets)
} }
func (c *ApiController) GetVectorset() { func (c *ApiController) GetVectorset() {
id := c.Input().Get("id") id := c.Input().Get("id")
c.Data["json"] = object.GetVectorset(id) vectorset, err := object.GetVectorset(id)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(vectorset)
} }
func (c *ApiController) UpdateVectorset() { func (c *ApiController) UpdateVectorset() {
@ -31,31 +46,49 @@ func (c *ApiController) UpdateVectorset() {
var vectorset object.Vectorset var vectorset object.Vectorset
err := json.Unmarshal(c.Ctx.Input.RequestBody, &vectorset) err := json.Unmarshal(c.Ctx.Input.RequestBody, &vectorset)
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
c.Data["json"] = object.UpdateVectorset(id, &vectorset) success, err := object.UpdateVectorset(id, &vectorset)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(success)
} }
func (c *ApiController) AddVectorset() { func (c *ApiController) AddVectorset() {
var vectorset object.Vectorset var vectorset object.Vectorset
err := json.Unmarshal(c.Ctx.Input.RequestBody, &vectorset) err := json.Unmarshal(c.Ctx.Input.RequestBody, &vectorset)
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
c.Data["json"] = object.AddVectorset(&vectorset) success, err := object.AddVectorset(&vectorset)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(success)
} }
func (c *ApiController) DeleteVectorset() { func (c *ApiController) DeleteVectorset() {
var vectorset object.Vectorset var vectorset object.Vectorset
err := json.Unmarshal(c.Ctx.Input.RequestBody, &vectorset) err := json.Unmarshal(c.Ctx.Input.RequestBody, &vectorset)
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
c.Data["json"] = object.DeleteVectorset(&vectorset) success, err := object.DeleteVectorset(&vectorset)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(success)
} }

View File

@ -13,25 +13,38 @@ import (
) )
func (c *ApiController) GetGlobalVideos() { func (c *ApiController) GetGlobalVideos() {
c.Data["json"] = object.GetGlobalVideos() videos, err := object.GetGlobalVideos()
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(videos)
} }
func (c *ApiController) GetVideos() { func (c *ApiController) GetVideos() {
owner := c.Input().Get("owner") owner := c.Input().Get("owner")
c.Data["json"] = object.GetVideos(owner) videos, err := object.GetVideos(owner)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(videos)
} }
func (c *ApiController) GetVideo() { func (c *ApiController) GetVideo() {
id := c.Input().Get("id") id := c.Input().Get("id")
video := object.GetVideo(id) video, err := object.GetVideo(id)
video.Populate() video.Populate()
if err != nil {
c.ResponseError(err.Error())
return
}
c.Data["json"] = video c.ResponseOk(video)
c.ServeJSON()
} }
func (c *ApiController) UpdateVideo() { func (c *ApiController) UpdateVideo() {
@ -40,33 +53,51 @@ func (c *ApiController) UpdateVideo() {
var video object.Video var video object.Video
err := json.Unmarshal(c.Ctx.Input.RequestBody, &video) err := json.Unmarshal(c.Ctx.Input.RequestBody, &video)
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
c.Data["json"] = object.UpdateVideo(id, &video) success, err := object.UpdateVideo(id, &video)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(success)
} }
func (c *ApiController) AddVideo() { func (c *ApiController) AddVideo() {
var video object.Video var video object.Video
err := json.Unmarshal(c.Ctx.Input.RequestBody, &video) err := json.Unmarshal(c.Ctx.Input.RequestBody, &video)
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
c.Data["json"] = object.AddVideo(&video) success, err := object.AddVideo(&video)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(success)
} }
func (c *ApiController) DeleteVideo() { func (c *ApiController) DeleteVideo() {
var video object.Video var video object.Video
err := json.Unmarshal(c.Ctx.Input.RequestBody, &video) err := json.Unmarshal(c.Ctx.Input.RequestBody, &video)
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
c.Data["json"] = object.DeleteVideo(&video) success, err := object.DeleteVideo(&video)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(success)
} }
func startCoverUrlJob(owner string, name string, videoId string) { 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++ { for i := 0; i < 20; i++ {
coverUrl := video.GetVideoCoverUrl(videoId) coverUrl := video.GetVideoCoverUrl(videoId)
if coverUrl != "" { if coverUrl != "" {
video := object.GetVideo(util.GetIdFromOwnerAndName(owner, name)) video, _ := object.GetVideo(util.GetIdFromOwnerAndName(owner, name))
if video.CoverUrl != "" { if video.CoverUrl != "" {
break break
} }
@ -94,7 +125,8 @@ func (c *ApiController) UploadVideo() {
file, header, err := c.GetFile("file") file, header, err := c.GetFile("file")
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
defer file.Close() defer file.Close()

View File

@ -8,22 +8,34 @@ import (
) )
func (c *ApiController) GetGlobalWordsets() { func (c *ApiController) GetGlobalWordsets() {
c.Data["json"] = object.GetGlobalWordsets() wordsets, err := object.GetGlobalWordsets()
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(wordsets)
} }
func (c *ApiController) GetWordsets() { func (c *ApiController) GetWordsets() {
owner := c.Input().Get("owner") owner := c.Input().Get("owner")
c.Data["json"] = object.GetWordsets(owner) wordsets, err := object.GetWordsets(owner)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(wordsets)
} }
func (c *ApiController) GetWordset() { func (c *ApiController) GetWordset() {
id := c.Input().Get("id") id := c.Input().Get("id")
c.Data["json"] = object.GetWordset(id) wordset, err := object.GetWordset(id)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(wordset)
} }
func (c *ApiController) GetWordsetGraph() { func (c *ApiController) GetWordsetGraph() {
@ -31,15 +43,23 @@ func (c *ApiController) GetWordsetGraph() {
clusterNumber := util.ParseInt(c.Input().Get("clusterNumber")) clusterNumber := util.ParseInt(c.Input().Get("clusterNumber"))
distanceLimit := util.ParseInt(c.Input().Get("distanceLimit")) distanceLimit := util.ParseInt(c.Input().Get("distanceLimit"))
c.Data["json"] = object.GetWordsetGraph(id, clusterNumber, distanceLimit) g, err := object.GetWordsetGraph(id, clusterNumber, distanceLimit)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(g)
} }
func (c *ApiController) GetWordsetMatch() { func (c *ApiController) GetWordsetMatch() {
id := c.Input().Get("id") id := c.Input().Get("id")
c.Data["json"] = object.GetWordsetMatch(id) wordset, err := object.GetWordsetMatch(id)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(wordset)
} }
func (c *ApiController) UpdateWordset() { func (c *ApiController) UpdateWordset() {
@ -48,31 +68,46 @@ func (c *ApiController) UpdateWordset() {
var wordset object.Wordset var wordset object.Wordset
err := json.Unmarshal(c.Ctx.Input.RequestBody, &wordset) err := json.Unmarshal(c.Ctx.Input.RequestBody, &wordset)
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
c.Data["json"] = object.UpdateWordset(id, &wordset) success, err := object.UpdateWordset(id, &wordset)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(success)
} }
func (c *ApiController) AddWordset() { func (c *ApiController) AddWordset() {
var wordset object.Wordset var wordset object.Wordset
err := json.Unmarshal(c.Ctx.Input.RequestBody, &wordset) err := json.Unmarshal(c.Ctx.Input.RequestBody, &wordset)
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
c.Data["json"] = object.AddWordset(&wordset) success, err := object.AddWordset(&wordset)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(success)
} }
func (c *ApiController) DeleteWordset() { func (c *ApiController) DeleteWordset() {
var wordset object.Wordset var wordset object.Wordset
err := json.Unmarshal(c.Ctx.Input.RequestBody, &wordset) err := json.Unmarshal(c.Ctx.Input.RequestBody, &wordset)
if err != nil { if err != nil {
panic(err) c.ResponseError(err.Error())
return
} }
c.Data["json"] = object.DeleteWordset(&wordset) success, err := object.DeleteWordset(&wordset)
c.ServeJSON() if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(success)
} }

View File

@ -62,7 +62,11 @@ func (a *Adapter) createDatabase() error {
defer engine.Close() 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"))) _, 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() { func (a *Adapter) open() {

View File

@ -14,10 +14,13 @@ func UpdateFile(storeId string, key string, file *File) bool {
return true return true
} }
func AddFile(storeId string, key string, isLeaf bool, filename string, file multipart.File) (bool, []byte) { func AddFile(storeId string, key string, isLeaf bool, filename string, file multipart.File) (bool, []byte, error) {
store := GetStore(storeId) store, err := GetStore(storeId)
if err != nil {
return false, nil, err
}
if store == nil { if store == nil {
return false, nil return false, nil, nil
} }
var objectKey string 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 = fmt.Sprintf("%s/%s", key, filename)
objectKey = strings.TrimLeft(objectKey, "/") objectKey = strings.TrimLeft(objectKey, "/")
fileBuffer = bytes.NewBuffer(nil) fileBuffer = bytes.NewBuffer(nil)
if _, err := io.Copy(fileBuffer, file); err != nil { _, err = io.Copy(fileBuffer, file)
panic(err) if err != nil {
return false, nil, err
} }
bs := fileBuffer.Bytes()
storage.PutObject(store.Bucket, objectKey, fileBuffer)
return true, bs, nil
} else { } else {
objectKey = fmt.Sprintf("%s/%s/_hidden.ini", key, filename) objectKey = fmt.Sprintf("%s/%s/_hidden.ini", key, filename)
objectKey = strings.TrimLeft(objectKey, "/") objectKey = strings.TrimLeft(objectKey, "/")
fileBuffer = bytes.NewBuffer(nil) 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 { func DeleteFile(storeId string, key string, isLeaf bool) (bool, error) {
store := GetStore(storeId) store, err := GetStore(storeId)
if err != nil {
return false, err
}
if store == nil { if store == nil {
return false return false, nil
} }
if isLeaf { if isLeaf {
@ -54,5 +63,5 @@ func DeleteFile(storeId string, key string, isLeaf bool) bool {
storage.DeleteObject(store.Bucket, object.Key) storage.DeleteObject(store.Bucket, object.Key)
} }
} }
return true return true, nil
} }

View File

@ -59,7 +59,7 @@ func runKmeans(vectors []*Vector, clusterNumber int) {
} }
func updateWordsetVectorCategories(owner string, wordsetName string) { func updateWordsetVectorCategories(owner string, wordsetName string) {
wordset := getWordset(owner, wordsetName) wordset, _ := getWordset(owner, wordsetName)
runKmeans(wordset.Vectors, 100) runKmeans(wordset.Vectors, 100)

View File

@ -36,76 +36,80 @@ type Store struct {
PropertiesMap map[string]*Properties `xorm:"mediumtext" json:"propertiesMap"` PropertiesMap map[string]*Properties `xorm:"mediumtext" json:"propertiesMap"`
} }
func GetGlobalStores() []*Store { func GetGlobalStores() ([]*Store, error) {
stores := []*Store{} stores := []*Store{}
err := adapter.engine.Asc("owner").Desc("created_time").Find(&stores) err := adapter.engine.Asc("owner").Desc("created_time").Find(&stores)
if err != nil { 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{} stores := []*Store{}
err := adapter.engine.Desc("created_time").Find(&stores, &Store{Owner: owner}) err := adapter.engine.Desc("created_time").Find(&stores, &Store{Owner: owner})
if err != nil { 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} store := Store{Owner: owner, Name: name}
existed, err := adapter.engine.Get(&store) existed, err := adapter.engine.Get(&store)
if err != nil { if err != nil {
panic(err) return &store, err
} }
if existed { if existed {
return &store return &store, nil
} else { } else {
return nil return nil, nil
} }
} }
func GetStore(id string) *Store { func GetStore(id string) (*Store, error) {
owner, name := util.GetOwnerAndNameFromId(id) owner, name := util.GetOwnerAndNameFromId(id)
return getStore(owner, name) return getStore(owner, name)
} }
func UpdateStore(id string, store *Store) bool { func UpdateStore(id string, store *Store) (bool, error) {
owner, name := util.GetOwnerAndNameFromId(id) owner, name := util.GetOwnerAndNameFromId(id)
if getStore(owner, name) == nil { _, err := getStore(owner, name)
return false 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 { if err != nil {
panic(err) return false, err
} }
//return affected != 0 //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) affected, err := adapter.engine.Insert(store)
if err != nil { 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{}) affected, err := adapter.engine.ID(core.PK{store.Owner, store.Name}).Delete(&Store{})
if err != nil { if err != nil {
panic(err) return false, err
} }
return affected != 0 return affected != 0, nil
} }
func (store *Store) GetId() string { func (store *Store) GetId() string {

View File

@ -5,7 +5,7 @@ import "testing"
func TestUpdateStoreFolders(t *testing.T) { func TestUpdateStoreFolders(t *testing.T) {
InitConfig() InitConfig()
store := getStore("admin", "default") store, _ := getStore("admin", "default")
//store.Populate() //store.Populate()
store.GetVideoData() store.GetVideoData()
} }

View File

@ -24,76 +24,80 @@ type Vectorset struct {
VectorMap map[string]*Vector `xorm:"-" json:"vectorMap"` VectorMap map[string]*Vector `xorm:"-" json:"vectorMap"`
} }
func GetGlobalVectorsets() []*Vectorset { func GetGlobalVectorsets() ([]*Vectorset, error) {
vectorsets := []*Vectorset{} vectorsets := []*Vectorset{}
err := adapter.engine.Asc("owner").Desc("created_time").Find(&vectorsets) err := adapter.engine.Asc("owner").Desc("created_time").Find(&vectorsets)
if err != nil { 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{} vectorsets := []*Vectorset{}
err := adapter.engine.Desc("created_time").Find(&vectorsets, &Vectorset{Owner: owner}) err := adapter.engine.Desc("created_time").Find(&vectorsets, &Vectorset{Owner: owner})
if err != nil { 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} vectorset := Vectorset{Owner: owner, Name: name}
existed, err := adapter.engine.Get(&vectorset) existed, err := adapter.engine.Get(&vectorset)
if err != nil { if err != nil {
panic(err) return &vectorset, err
} }
if existed { if existed {
return &vectorset return &vectorset, nil
} else { } else {
return nil return nil, nil
} }
} }
func GetVectorset(id string) *Vectorset { func GetVectorset(id string) (*Vectorset, error) {
owner, name := util.GetOwnerAndNameFromId(id) owner, name := util.GetOwnerAndNameFromId(id)
return getVectorset(owner, name) return getVectorset(owner, name)
} }
func UpdateVectorset(id string, vectorset *Vectorset) bool { func UpdateVectorset(id string, vectorset *Vectorset) (bool, error) {
owner, name := util.GetOwnerAndNameFromId(id) owner, name := util.GetOwnerAndNameFromId(id)
if getVectorset(owner, name) == nil { _, err := getVectorset(owner, name)
return false 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 { if err != nil {
panic(err) return false, err
} }
//return affected != 0 //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) affected, err := adapter.engine.Insert(vectorset)
if err != nil { 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{}) affected, err := adapter.engine.ID(core.PK{vectorset.Owner, vectorset.Name}).Delete(&Vectorset{})
if err != nil { if err != nil {
panic(err) return false, err
} }
return affected != 0 return affected != 0, nil
} }
func (vectorset *Vectorset) GetId() string { func (vectorset *Vectorset) GetId() string {

View File

@ -11,7 +11,7 @@ func TestDoVectorsetTsne(t *testing.T) {
dimension := 50 dimension := 50
//vectorset := getVectorset("admin", "wikipedia") //vectorset := getVectorset("admin", "wikipedia")
vectorset := getVectorset("admin", "wordVector_utf-8") vectorset, _ := getVectorset("admin", "wordVector_utf-8")
vectorset.LoadVectors("../../tmpFiles/") vectorset.LoadVectors("../../tmpFiles/")
vectorset.DoTsne(dimension) vectorset.DoTsne(dimension)

View File

@ -6,7 +6,7 @@ func TestUpdateVectorsetVectors(t *testing.T) {
InitConfig() InitConfig()
//vectorset := getVectorset("admin", "wikipedia") //vectorset := getVectorset("admin", "wikipedia")
vectorset := getVectorset("admin", "wordVector_utf-8") vectorset, _ := getVectorset("admin", "wordVector_utf-8")
vectorset.LoadVectors("../../tmpFiles/") vectorset.LoadVectors("../../tmpFiles/")
UpdateVectorset(vectorset.GetId(), vectorset) UpdateVectorset(vectorset.GetId(), vectorset)
} }

View File

@ -31,79 +31,83 @@ type Video struct {
PlayAuth string `xorm:"-" json:"playAuth"` PlayAuth string `xorm:"-" json:"playAuth"`
} }
func GetGlobalVideos() []*Video { func GetGlobalVideos() ([]*Video, error) {
videos := []*Video{} videos := []*Video{}
err := adapter.engine.Asc("owner").Desc("created_time").Find(&videos) err := adapter.engine.Asc("owner").Desc("created_time").Find(&videos)
if err != nil { 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{} videos := []*Video{}
err := adapter.engine.Desc("created_time").Find(&videos, &Video{Owner: owner}) err := adapter.engine.Desc("created_time").Find(&videos, &Video{Owner: owner})
if err != nil { 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} v := Video{Owner: owner, Name: name}
existed, err := adapter.engine.Get(&v) existed, err := adapter.engine.Get(&v)
if err != nil { if err != nil {
panic(err) return &v, err
} }
if existed { if existed {
if v.VideoId != "" { if v.VideoId != "" {
v.PlayAuth = video.GetVideoPlayAuth(v.VideoId) v.PlayAuth = video.GetVideoPlayAuth(v.VideoId)
} }
return &v return &v, nil
} else { } else {
return nil return nil, nil
} }
} }
func GetVideo(id string) *Video { func GetVideo(id string) (*Video, error) {
owner, name := util.GetOwnerAndNameFromId(id) owner, name := util.GetOwnerAndNameFromId(id)
return getVideo(owner, name) return getVideo(owner, name)
} }
func UpdateVideo(id string, video *Video) bool { func UpdateVideo(id string, video *Video) (bool, error) {
owner, name := util.GetOwnerAndNameFromId(id) owner, name := util.GetOwnerAndNameFromId(id)
if getVideo(owner, name) == nil { _, err := getVideo(owner, name)
return false 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 { if err != nil {
panic(err) return false, err
} }
//return affected != 0 //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) affected, err := adapter.engine.Insert(video)
if err != nil { 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{}) affected, err := adapter.engine.ID(core.PK{video.Owner, video.Name}).Delete(&Video{})
if err != nil { if err != nil {
panic(err) return false, err
} }
return affected != 0 return affected != 0, nil
} }
func (video *Video) GetId() string { func (video *Video) GetId() string {
@ -111,6 +115,6 @@ func (video *Video) GetId() string {
} }
func (video *Video) Populate() { func (video *Video) Populate() {
store := getStore("admin", "default") store, _ := getStore("admin", "default")
video.DataUrls = store.GetVideoData() video.DataUrls = store.GetVideoData()
} }

View File

@ -19,76 +19,80 @@ type Wordset struct {
Vectors []*Vector `xorm:"mediumtext" json:"vectors"` Vectors []*Vector `xorm:"mediumtext" json:"vectors"`
} }
func GetGlobalWordsets() []*Wordset { func GetGlobalWordsets() ([]*Wordset, error) {
wordsets := []*Wordset{} wordsets := []*Wordset{}
err := adapter.engine.Asc("owner").Desc("created_time").Find(&wordsets) err := adapter.engine.Asc("owner").Desc("created_time").Find(&wordsets)
if err != nil { 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{} wordsets := []*Wordset{}
err := adapter.engine.Desc("created_time").Find(&wordsets, &Wordset{Owner: owner}) err := adapter.engine.Desc("created_time").Find(&wordsets, &Wordset{Owner: owner})
if err != nil { 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} wordset := Wordset{Owner: owner, Name: name}
existed, err := adapter.engine.Get(&wordset) existed, err := adapter.engine.Get(&wordset)
if err != nil { if err != nil {
panic(err) return &wordset, err
} }
if existed { if existed {
return &wordset return &wordset, nil
} else { } else {
return nil return nil, nil
} }
} }
func GetWordset(id string) *Wordset { func GetWordset(id string) (*Wordset, error) {
owner, name := util.GetOwnerAndNameFromId(id) owner, name := util.GetOwnerAndNameFromId(id)
return getWordset(owner, name) return getWordset(owner, name)
} }
func UpdateWordset(id string, wordset *Wordset) bool { func UpdateWordset(id string, wordset *Wordset) (bool, error) {
owner, name := util.GetOwnerAndNameFromId(id) owner, name := util.GetOwnerAndNameFromId(id)
if getWordset(owner, name) == nil { _, err := getWordset(owner, name)
return false 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 { if err != nil {
panic(err) return false, err
} }
//return affected != 0 //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) affected, err := adapter.engine.Insert(wordset)
if err != nil { 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{}) affected, err := adapter.engine.ID(core.PK{wordset.Owner, wordset.Name}).Delete(&Wordset{})
if err != nil { if err != nil {
panic(err) return false, err
} }
return affected != 0 return affected != 0, nil
} }
func (wordset *Wordset) GetId() string { func (wordset *Wordset) GetId() string {

View File

@ -15,21 +15,24 @@ func init() {
graphCache = map[string]*Graph{} 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) cacheId := fmt.Sprintf("%s|%d|%d", id, clusterNumber, distanceLimit)
g, ok := graphCache[cacheId] g, ok := graphCache[cacheId]
if ok { if ok {
return g return g, nil
} }
wordset := GetWordset(id) wordset, err := GetWordset(id)
if err != nil {
return nil, err
}
if wordset == nil { if wordset == nil {
return nil return nil, nil
} }
if len(wordset.Vectors) == 0 { if len(wordset.Vectors) == 0 {
return nil return nil, nil
} }
allZero := true allZero := true
@ -40,14 +43,14 @@ func GetWordsetGraph(id string, clusterNumber int, distanceLimit int) *Graph {
} }
} }
if allZero { if allZero {
return nil return nil, nil
} }
runKmeans(wordset.Vectors, clusterNumber) runKmeans(wordset.Vectors, clusterNumber)
g = generateGraph(wordset.Vectors, distanceLimit) g = generateGraph(wordset.Vectors, distanceLimit)
//graphCache[cacheId] = g //graphCache[cacheId] = g
return g return g, nil
} }
func getDistance(v1 *Vector, v2 *Vector) float64 { func getDistance(v1 *Vector, v2 *Vector) float64 {

View File

@ -1,14 +1,20 @@
package object package object
func GetWordsetMatch(id string) *Wordset { func GetWordsetMatch(id string) (*Wordset, error) {
wordset := GetWordset(id) wordset, err := GetWordset(id)
if err != nil {
return nil, err
}
if wordset == nil { 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 { if vectorset == nil {
return nil return nil, nil
} }
vectorset.LoadVectors("") vectorset.LoadVectors("")
@ -22,5 +28,5 @@ func GetWordsetMatch(id string) *Wordset {
} }
UpdateWordset(wordset.GetId(), wordset) UpdateWordset(wordset.GetId(), wordset)
return wordset return wordset, nil
} }

View File

@ -5,7 +5,7 @@ import (
"github.com/casbin/casibase/xlsx" "github.com/casbin/casibase/xlsx"
) )
func uploadVectorNames(owner string, fileId string) bool { func uploadVectorNames(owner string, fileId string) (bool, error) {
table := xlsx.ReadXlsxFile(fileId) table := xlsx.ReadXlsxFile(fileId)
vectorMap := map[string]int{} vectorMap := map[string]int{}

View File

@ -95,14 +95,18 @@ class App extends Component {
getAccount() { getAccount() {
AccountBackend.getAccount() AccountBackend.getAccount()
.then((res) => { .then((res) => {
const account = res.data; if (res.status === "ok") {
if (account !== null) { const account = res.data;
this.setLanguage(account); 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,
});
}); });
} }

View File

@ -2,6 +2,7 @@ import React from "react";
import * as Conf from "./Conf"; import * as Conf from "./Conf";
import * as WordsetBackend from "./backend/WordsetBackend"; import * as WordsetBackend from "./backend/WordsetBackend";
import WordsetGraph from "./WordsetGraph"; import WordsetGraph from "./WordsetGraph";
import * as Setting from "./Setting";
class ClusteringPage extends React.Component { class ClusteringPage extends React.Component {
constructor(props) { constructor(props) {
@ -19,9 +20,11 @@ class ClusteringPage extends React.Component {
getWordset() { getWordset() {
WordsetBackend.getWordset(Conf.DefaultOwner, Conf.DefaultWordsetName) WordsetBackend.getWordset(Conf.DefaultOwner, Conf.DefaultWordsetName)
.then((wordset) => { .then((wordset) => {
this.setState({ if (wordset.status === "ok") {
wordset: wordset, this.setState({wordset: wordset.data});
}); } else {
Setting.showMessage("error", `Failed to get wordset: ${wordset.msg}`);
}
}); });
} }

View File

@ -65,11 +65,15 @@ class FileTable extends React.Component {
const storeId = `${this.props.store.owner}/${this.props.store.name}`; const storeId = `${this.props.store.owner}/${this.props.store.name}`;
FileBackend.deleteFile(storeId, file.key, isLeaf) FileBackend.deleteFile(storeId, file.key, isLeaf)
.then((res) => { .then((res) => {
if (res === true) { if (res.status === "ok") {
Setting.showMessage("success", "File deleted successfully"); if (res.data === true) {
this.props.onRefresh(); Setting.showMessage("success", "File deleted successfully");
this.props.onRefresh();
} else {
Setting.showMessage("error", `File failed to delete: ${res.msg}`);
}
} else { } else {
Setting.showMessage("error", `File failed to delete: ${res}`); Setting.showMessage("error", `File failed to delete: ${res.msg}`);
} }
}) })
.catch(error => { .catch(error => {

View File

@ -68,11 +68,15 @@ class FileTree extends React.Component {
getPermissions() { getPermissions() {
PermissionBackend.getPermissions(Conf.AuthConfig.organizationName) PermissionBackend.getPermissions(Conf.AuthConfig.organizationName)
.then((permissions) => { .then((permissions) => {
permissions = permissions.filter(permission => (permission.domains[0] === this.props.store.name) && permission.users.length !== 0); if (permissions.status === "ok") {
this.setState({ permissions = permissions.filter(permission => (permission.domains[0] === this.props.store.name) && permission.users.length !== 0);
permissions: permissions, this.setState({
permissionMap: this.getPermissionMap(permissions), 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}`; const storeId = `${this.props.store.owner}/${this.props.store.name}`;
FileBackend.addFile(storeId, file.key, false, newFolder, null) FileBackend.addFile(storeId, file.key, false, newFolder, null)
.then((res) => { .then((res) => {
Setting.showMessage("success", "File added successfully"); if (res.status === "ok") {
this.props.onRefresh(); Setting.showMessage("success", "File added successfully");
this.props.onRefresh();
} else {
Setting.showMessage("error", `File failed to add: ${res.msg}`);
}
}) })
.catch(error => { .catch(error => {
Setting.showMessage("error", `File failed to add: ${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}`; const storeId = `${this.props.store.owner}/${this.props.store.name}`;
FileBackend.deleteFile(storeId, file.key, isLeaf) FileBackend.deleteFile(storeId, file.key, isLeaf)
.then((res) => { .then((res) => {
if (res === true) { if (res.status === "ok") {
Setting.showMessage("success", "File deleted successfully"); if (res.data === true) {
this.props.onRefresh(); Setting.showMessage("success", "File deleted successfully");
this.props.onRefresh();
} else {
Setting.showMessage("error", "File failed to deleteserver side failure");
}
} else { } else {
Setting.showMessage("error", `File failed to delete: ${res}`); Setting.showMessage("error", `File failed to delete: ${res.msg}`);
} }
}) })
.catch(error => { .catch(error => {
@ -334,11 +346,15 @@ class FileTree extends React.Component {
if (this.getCacheApp(filename) !== "") { if (this.getCacheApp(filename) !== "") {
FileBackend.activateFile(key, filename) FileBackend.activateFile(key, filename)
.then((res) => { .then((res) => {
if (res === true) { if (res.status === "ok") {
// Setting.showMessage("success", `File activated successfully`); if (res.data === true) {
fetchFile(); // Setting.showMessage("success", `File activated successfully`);
fetchFile();
} else {
Setting.showMessage("error", "File failed to activate: server side failure");
}
} else { } else {
Setting.showMessage("error", `File failed to activate: ${res}`); Setting.showMessage("error", `File failed to activate: ${res.msg}`);
} }
}) })
.catch(error => { .catch(error => {

View File

@ -25,7 +25,7 @@ class FileTreePage extends React.Component {
.then((res) => { .then((res) => {
if (res?.status !== "error") { if (res?.status !== "error") {
this.setState({ this.setState({
store: res, store: res.data,
}); });
} else { } else {
Setting.showMessage("error", res.msg); Setting.showMessage("error", res.msg);

View File

@ -3,8 +3,6 @@ import {DeleteOutlined} from "@ant-design/icons";
import {Button, Col, Input, InputNumber, Row, Table, Tooltip} from "antd"; import {Button, Col, Input, InputNumber, Row, Table, Tooltip} from "antd";
import * as Setting from "./Setting"; import * as Setting from "./Setting";
import i18next from "i18next"; import i18next from "i18next";
import FileSaver from "file-saver";
import XLSX from "xlsx";
class LabelTable extends React.Component { class LabelTable extends React.Component {
constructor(props) { constructor(props) {
@ -73,23 +71,6 @@ class LabelTable extends React.Component {
this.updateTable(table); 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) { renderTable(table) {
const columns = [ const columns = [
{ {
@ -194,7 +175,7 @@ class LabelTable extends React.Component {
<Button style={{marginRight: "5px"}} type="primary" size="small" onClick={() => this.addRow(table)}>{i18next.t("general:Add")}</Button> <Button style={{marginRight: "5px"}} type="primary" size="small" onClick={() => this.addRow(table)}>{i18next.t("general:Add")}</Button>
{ {
table.length === 0 ? null : ( table.length === 0 ? null : (
<Button style={{marginLeft: "5px", marginRight: "5px"}} size="small" onClick={() => this.downloadLabels(table)}>{i18next.t("general:Download")}</Button> <Button style={{marginLeft: "5px", marginRight: "5px"}} size="small" onClick={() => Setting.downloadLabels(table)}>{i18next.t("general:Download")}</Button>
) )
} }
</div> </div>

View File

@ -35,9 +35,12 @@ export function addPermission(account, store, file = null, fileKeys = null) {
PermissionBackend.addPermission(newPermission) PermissionBackend.addPermission(newPermission)
.then((res) => { .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 => { .catch(error => {
Setting.showMessage("error", `Permission failed to add: ${error}`); Setting.showMessage("error", `Permission failed to add: ${error}`);
}); });

View File

@ -102,6 +102,9 @@ export function isLocalAdminUser(account) {
} }
export function deepCopy(obj) { export function deepCopy(obj) {
if (obj === null) {
showMessage("error", "deepCopy obj is null.");
}
return Object.assign({}, obj); return Object.assign({}, obj);
} }
@ -371,11 +374,50 @@ export function downloadXlsx(wordset) {
// { wch: 7 }, // { wch: 7 },
// ]; // ];
const blob = sheet2blob(sheet, "vectors"); try {
const fileName = `vectors-${wordset.name}.xlsx`; const blob = sheet2blob(sheet, "vectors");
FileSaver.saveAs(blob, fileName); 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) { export function toFixed(f, n) {
return parseFloat(f.toFixed(n)); return parseFloat(f.toFixed(n));
} }
@ -498,10 +540,14 @@ export function submitStoreEdit(storeObj) {
store.fileTree = undefined; store.fileTree = undefined;
StoreBackend.updateStore(storeObj.owner, storeObj.name, store) StoreBackend.updateStore(storeObj.owner, storeObj.name, store)
.then((res) => { .then((res) => {
if (res) { if (res.status === "ok") {
showMessage("success", "Successfully saved"); if (res.data) {
showMessage("success", "Successfully saved");
} else {
showMessage("error", "failed to save: server side failure");
}
} else { } else {
showMessage("error", "failed to save: server side failure"); showMessage("error", `failed to save: ${res.msg}`);
} }
}) })
.catch(error => { .catch(error => {

View File

@ -24,9 +24,13 @@ class StoreEditPage extends React.Component {
getStore() { getStore() {
StoreBackend.getStore(this.state.owner, this.state.storeName) StoreBackend.getStore(this.state.owner, this.state.storeName)
.then((store) => { .then((store) => {
this.setState({ if (store.status === "ok") {
store: store, 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; store.fileTree = undefined;
StoreBackend.updateStore(this.state.store.owner, this.state.storeName, store) StoreBackend.updateStore(this.state.store.owner, this.state.storeName, store)
.then((res) => { .then((res) => {
if (res) { if (res.status === "ok") {
Setting.showMessage("success", "Successfully saved"); if (res.data) {
this.setState({ Setting.showMessage("success", "Successfully saved");
storeName: this.state.store.name, this.setState({
}); storeName: this.state.store.name,
this.props.history.push(`/stores/${this.state.store.owner}/${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 { } else {
Setting.showMessage("error", "failed to save: server side failure"); Setting.showMessage("error", `failed to save: ${res.msg}`);
this.updateStoreField("name", this.state.storeName);
} }
}) })
.catch(error => { .catch(error => {

View File

@ -22,9 +22,13 @@ class StoreListPage extends React.Component {
getStores() { getStores() {
StoreBackend.getGlobalStores() StoreBackend.getGlobalStores()
.then((res) => { .then((res) => {
this.setState({ if (res.status === "ok") {
stores: res, 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(); const newStore = this.newStore();
StoreBackend.addStore(newStore) StoreBackend.addStore(newStore)
.then((res) => { .then((res) => {
Setting.showMessage("success", "Store added successfully"); if (res.status === "ok") {
this.setState({ Setting.showMessage("success", "Store added successfully");
stores: Setting.prependRow(this.state.stores, newStore), this.setState({
}); stores: Setting.prependRow(this.state.stores, newStore),
});
} else {
Setting.showMessage("error", `Store failed to add: ${res.msg}`);
}
}) })
.catch(error => { .catch(error => {
Setting.showMessage("error", `Store failed to add: ${error}`); Setting.showMessage("error", `Store failed to add: ${error}`);
@ -57,10 +65,14 @@ class StoreListPage extends React.Component {
deleteStore(i) { deleteStore(i) {
StoreBackend.deleteStore(this.state.stores[i]) StoreBackend.deleteStore(this.state.stores[i])
.then((res) => { .then((res) => {
Setting.showMessage("success", "Store deleted successfully"); if (res.status === "ok") {
this.setState({ Setting.showMessage("success", "Store deleted successfully");
stores: Setting.deleteRow(this.state.stores, i), this.setState({
}); stores: Setting.deleteRow(this.state.stores, i),
});
} else {
Setting.showMessage("error", `Store failed to delete: ${res.msg}`);
}
}) })
.catch(error => { .catch(error => {
Setting.showMessage("error", `Store failed to delete: ${error}`); Setting.showMessage("error", `Store failed to delete: ${error}`);
@ -98,12 +110,19 @@ class StoreListPage extends React.Component {
render: (text, record, index) => { render: (text, record, index) => {
return ( return (
<div> <div>
<Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} onClick={() => this.props.history.push(`/stores/${record.owner}/${record.name}/view`)}>{i18next.t("general:View")}</Button> <Button
style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}}
onClick={() => Setting.redirectCatchJsonError(`/stores/${record.owner}/${record.name}/view`)}
>
{i18next.t("general:View")}
</Button>
{ {
!Setting.isLocalAdminUser(this.props.account) ? null : ( !Setting.isLocalAdminUser(this.props.account) ? null : (
<React.Fragment> <React.Fragment>
<Button style={{marginBottom: "10px", marginRight: "10px"}} type="primary" onClick={() => this.props.history.push(`/stores/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button> <Button style={{marginBottom: "10px", marginRight: "10px"}} type="primary" onClick={
<Popconfirm () => Setting.redirectCatchJsonError(`/stores/${record.owner}/${record.name}`)}
>{i18next.t("general:Edit")}
</Button> <Popconfirm
title={`Sure to delete store: ${record.name} ?`} title={`Sure to delete store: ${record.name} ?`}
onConfirm={() => this.deleteStore(index)} onConfirm={() => this.deleteStore(index)}
okText="OK" okText="OK"

View File

@ -23,9 +23,13 @@ class VectorsetEditPage extends React.Component {
getVectorset() { getVectorset() {
VectorsetBackend.getVectorset(this.props.account.name, this.state.vectorsetName) VectorsetBackend.getVectorset(this.props.account.name, this.state.vectorsetName)
.then((vectorset) => { .then((vectorset) => {
this.setState({ if (vectorset.status === "ok") {
vectorset: vectorset, 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); const vectorset = Setting.deepCopy(this.state.vectorset);
VectorsetBackend.updateVectorset(this.state.vectorset.owner, this.state.vectorsetName, vectorset) VectorsetBackend.updateVectorset(this.state.vectorset.owner, this.state.vectorsetName, vectorset)
.then((res) => { .then((res) => {
if (res) { if (res.status === "ok") {
Setting.showMessage("success", "Successfully saved"); if (res.data) {
this.setState({ Setting.showMessage("success", "Successfully saved");
vectorsetName: this.state.vectorset.name, this.setState({
}); vectorsetName: this.state.vectorset.name,
this.props.history.push(`/vectorsets/${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 { } else {
Setting.showMessage("error", "failed to save: server side failure"); Setting.showMessage("error", `failed to save: ${res.msg}`);
this.updateVectorsetField("name", this.state.vectorsetName);
} }
}) })
.catch(error => { .catch(error => {

View File

@ -22,9 +22,13 @@ class VectorsetListPage extends React.Component {
getVectorsets() { getVectorsets() {
VectorsetBackend.getVectorsets(this.props.account.name) VectorsetBackend.getVectorsets(this.props.account.name)
.then((res) => { .then((res) => {
this.setState({ if (res.status === "ok") {
vectorsets: res, 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(); const newVectorset = this.newVectorset();
VectorsetBackend.addVectorset(newVectorset) VectorsetBackend.addVectorset(newVectorset)
.then((res) => { .then((res) => {
Setting.showMessage("success", "Vectorset added successfully"); if (res.status === "ok") {
this.setState({ Setting.showMessage("success", "Vectorset added successfully");
vectorsets: Setting.prependRow(this.state.vectorsets, newVectorset), this.setState({
}); vectorsets: Setting.prependRow(this.state.vectorsets, newVectorset),
});
} else {
Setting.showMessage("error", `Failed to add vectorset: ${res.msg}`);
}
}) })
.catch(error => { .catch(error => {
Setting.showMessage("error", `Vectorset failed to add: ${error}`); Setting.showMessage("error", `Vectorset failed to add: ${error}`);
@ -60,10 +68,14 @@ class VectorsetListPage extends React.Component {
deleteVectorset(i) { deleteVectorset(i) {
VectorsetBackend.deleteVectorset(this.state.vectorsets[i]) VectorsetBackend.deleteVectorset(this.state.vectorsets[i])
.then((res) => { .then((res) => {
Setting.showMessage("success", "Vectorset deleted successfully"); if (res.status === "ok") {
this.setState({ Setting.showMessage("success", "Vectorset deleted successfully");
vectorsets: Setting.deleteRow(this.state.vectorsets, i), this.setState({
}); vectorsets: Setting.deleteRow(this.state.vectorsets, i),
});
} else {
Setting.showMessage("error", `Vectorset failed to delete: ${res.msg}`);
}
}) })
.catch(error => { .catch(error => {
Setting.showMessage("error", `Vectorset failed to delete: ${error}`); Setting.showMessage("error", `Vectorset failed to delete: ${error}`);

View File

@ -34,13 +34,17 @@ class VideoEditPage extends React.Component {
getVideo() { getVideo() {
VideoBackend.getVideo(this.props.account.name, this.state.videoName) VideoBackend.getVideo(this.props.account.name, this.state.videoName)
.then((video) => { .then((video) => {
this.setState({ if (video.status === "ok") {
video: video, this.setState({
currentTime: 0, video: video.data,
}); currentTime: 0,
});
if (video.dataUrl !== "") { if (video.dataUrl !== "") {
this.getDataAndParse(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); const video = Setting.deepCopy(this.state.video);
VideoBackend.updateVideo(this.state.video.owner, this.state.videoName, video) VideoBackend.updateVideo(this.state.video.owner, this.state.videoName, video)
.then((res) => { .then((res) => {
if (res) { if (res.status === "ok") {
Setting.showMessage("success", "Successfully saved"); if (res.data) {
this.setState({ Setting.showMessage("success", "Successfully saved");
videoName: this.state.video.name, this.setState({
}); videoName: this.state.video.name,
this.props.history.push(`/videos/${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 { } else {
Setting.showMessage("error", "failed to save: server side failure"); Setting.showMessage("error", `failed to save: ${res.msg}`);
this.updateVideoField("name", this.state.videoName);
} }
}) })
.catch(error => { .catch(error => {

View File

@ -23,9 +23,13 @@ class VideoListPage extends React.Component {
getVideos() { getVideos() {
VideoBackend.getVideos(this.props.account.name) VideoBackend.getVideos(this.props.account.name)
.then((res) => { .then((res) => {
this.setState({ if (res.status === "ok") {
videos: res, 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(); const newVideo = this.newVideo();
VideoBackend.addVideo(newVideo) VideoBackend.addVideo(newVideo)
.then((res) => { .then((res) => {
Setting.showMessage("success", "Video added successfully"); if (res.status === "ok") {
this.setState({ Setting.showMessage("success", "Video added successfully");
videos: Setting.prependRow(this.state.videos, newVideo), this.setState({
}); videos: Setting.prependRow(this.state.videos, newVideo),
});
} else {
Setting.showMessage("error", `Video failed to add: ${res.msg}`);
}
}) })
.catch(error => { .catch(error => {
Setting.showMessage("error", `Video failed to add: ${error}`); Setting.showMessage("error", `Video failed to add: ${error}`);
@ -61,10 +69,14 @@ class VideoListPage extends React.Component {
deleteVideo(i) { deleteVideo(i) {
VideoBackend.deleteVideo(this.state.videos[i]) VideoBackend.deleteVideo(this.state.videos[i])
.then((res) => { .then((res) => {
Setting.showMessage("success", "Video deleted successfully"); if (res.status === "ok") {
this.setState({ Setting.showMessage("success", "Video deleted successfully");
videos: Setting.deleteRow(this.state.videos, i), this.setState({
}); videos: Setting.deleteRow(this.state.videos, i),
});
} else {
Setting.showMessage("error", `Video failed to delete: ${res.msg}`);
}
}) })
.catch(error => { .catch(error => {
Setting.showMessage("error", `Video failed to delete: ${error}`); Setting.showMessage("error", `Video failed to delete: ${error}`);

View File

@ -29,18 +29,26 @@ class WordsetEditPage extends React.Component {
getWordset() { getWordset() {
WordsetBackend.getWordset(this.props.account.name, this.state.wordsetName) WordsetBackend.getWordset(this.props.account.name, this.state.wordsetName)
.then((wordset) => { .then((wordset) => {
this.setState({ if (wordset.status === "ok") {
wordset: wordset, this.setState({
}); wordset: wordset.data,
});
} else {
Setting.showMessage("error", `Failed to get wordset: ${wordset.msg}`);
}
}); });
} }
getVectorsets() { getVectorsets() {
VectorsetBackend.getVectorsets(this.props.account.name) VectorsetBackend.getVectorsets(this.props.account.name)
.then((res) => { .then((res) => {
this.setState({ if (res.status === "ok") {
vectorsets: res, 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) WordsetBackend.getWordsetMatch(this.props.account.name, this.state.wordsetName)
.then((wordset) => { .then((wordset) => {
this.setState({ if (wordset.status === "ok") {
wordset: wordset, this.setState({
matchLoading: false, wordset: wordset.data,
}); matchLoading: false,
});
} else {
Setting.showMessage("error", `Failed to get wordset: ${wordset.msg}`);
}
}); });
}}>{i18next.t("wordset:Match")}</Button> }}>{i18next.t("wordset:Match")}</Button>
</Col> </Col>
@ -170,15 +182,19 @@ class WordsetEditPage extends React.Component {
const wordset = Setting.deepCopy(this.state.wordset); const wordset = Setting.deepCopy(this.state.wordset);
WordsetBackend.updateWordset(this.state.wordset.owner, this.state.wordsetName, wordset) WordsetBackend.updateWordset(this.state.wordset.owner, this.state.wordsetName, wordset)
.then((res) => { .then((res) => {
if (res) { if (res.status === "ok") {
Setting.showMessage("success", "Successfully saved"); if (res.data) {
this.setState({ Setting.showMessage("success", "Successfully saved");
wordsetName: this.state.wordset.name, this.setState({
}); wordsetName: this.state.wordset.name,
this.props.history.push(`/wordsets/${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 { } else {
Setting.showMessage("error", "failed to save: server side failure"); Setting.showMessage("error", `failed to save: ${res.msg}`);
this.updateWordsetField("name", this.state.wordsetName);
} }
}) })
.catch(error => { .catch(error => {

View File

@ -71,13 +71,17 @@ class WordsetGraph extends React.Component {
}); });
WordsetBackend.getWordsetGraph("admin", this.state.wordsetName, this.state.clusterNumber, this.state.distanceLimit) WordsetBackend.getWordsetGraph("admin", this.state.wordsetName, this.state.clusterNumber, this.state.distanceLimit)
.then((graph) => { .then((graph) => {
this.setState({ if (graph.status === "ok") {
graph: graph, this.setState({
loading: false, graph: graph.data,
selectedType: null, loading: false,
selectedId: null, selectedType: null,
selectedIds: [], selectedId: null,
}); selectedIds: [],
});
} else {
Setting.showMessage("error", `Failed to get wordset graph: ${graph.msg}`);
}
}); });
} }

View File

@ -1,6 +1,7 @@
import React from "react"; import React from "react";
import * as WordsetBackend from "./backend/WordsetBackend"; import * as WordsetBackend from "./backend/WordsetBackend";
import WordsetGraph from "./WordsetGraph"; import WordsetGraph from "./WordsetGraph";
import * as Setting from "./Setting";
class WordsetGraphPage extends React.Component { class WordsetGraphPage extends React.Component {
constructor(props) { constructor(props) {
@ -19,9 +20,13 @@ class WordsetGraphPage extends React.Component {
getWordset() { getWordset() {
WordsetBackend.getWordset(this.props.account.name, this.state.wordsetName) WordsetBackend.getWordset(this.props.account.name, this.state.wordsetName)
.then((wordset) => { .then((wordset) => {
this.setState({ if (wordset.status === "ok") {
wordset: wordset, this.setState({
}); wordset: wordset.data,
});
} else {
Setting.showMessage("error", `Failed to get wordset: ${wordset.msg}`);
}
}); });
} }

View File

@ -22,9 +22,13 @@ class WordsetListPage extends React.Component {
getWordsets() { getWordsets() {
WordsetBackend.getWordsets(this.props.account.name) WordsetBackend.getWordsets(this.props.account.name)
.then((res) => { .then((res) => {
this.setState({ if (res.status === "ok") {
wordsets: res, 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(); const newWordset = this.newWordset();
WordsetBackend.addWordset(newWordset) WordsetBackend.addWordset(newWordset)
.then((res) => { .then((res) => {
Setting.showMessage("success", "Wordset added successfully"); if (res.status === "ok") {
this.setState({ Setting.showMessage("success", "Wordset added successfully");
wordsets: Setting.prependRow(this.state.wordsets, newWordset), this.setState({
}); wordsets: Setting.prependRow(this.state.wordsets, newWordset),
});
} else {
Setting.showMessage("error", `Failed to add wordset: ${res.msg}`);
}
}) })
.catch(error => { .catch(error => {
Setting.showMessage("error", `Wordset failed to add: ${error}`); Setting.showMessage("error", `Wordset failed to add: ${error}`);
@ -57,10 +65,14 @@ class WordsetListPage extends React.Component {
deleteWordset(i) { deleteWordset(i) {
WordsetBackend.deleteWordset(this.state.wordsets[i]) WordsetBackend.deleteWordset(this.state.wordsets[i])
.then((res) => { .then((res) => {
Setting.showMessage("success", "Wordset deleted successfully"); if (res.status === "ok") {
this.setState({ Setting.showMessage("success", "Wordset deleted successfully");
wordsets: Setting.deleteRow(this.state.wordsets, i), this.setState({
}); wordsets: Setting.deleteRow(this.state.wordsets, i),
});
} else {
Setting.showMessage("error", `Failed to delete wordset: ${res.msg}`);
}
}) })
.catch(error => { .catch(error => {
Setting.showMessage("error", `Wordset failed to delete: ${error}`); Setting.showMessage("error", `Wordset failed to delete: ${error}`);