github.com/yusys-cloud/go-jsonstore-rest@v0.0.0-20230228115429-0a54aa4a27a6/rest/storage_rest.go (about) 1 // Author: yangzq80@gmail.com 2 // Date: 2021-03-25 3 package rest 4 5 import ( 6 "github.com/gin-gonic/gin" 7 "github.com/sirupsen/logrus" 8 "github.com/yusys-cloud/go-jsonstore-rest/model" 9 "net/http" 10 "strconv" 11 ) 12 13 type JsonStoreRest struct { 14 D *Storage 15 //gin *gin.Context 16 } 17 18 func NewJsonStoreRest(dir string, r *gin.Engine) *JsonStoreRest { 19 20 s := NewStorage(dir) 21 22 s.ConfigHandles(r) 23 24 return &JsonStoreRest{s} 25 } 26 27 func (s *Storage) ConfigHandles(r *gin.Engine) { 28 rg := r.Group("/api/kv") 29 rg.POST("/:b/:k", s.create) 30 rg.GET("/:b/:k", s.readAll) 31 rg.GET("/:b/:k/:kid", s.read) 32 rg.PUT("/:b/:k/:kid", s.update) 33 rg.PUT("/:b/:k/:kid/weight", s.updateWeight) 34 rg.DELETE("/:b/:k/:kid", s.delete) 35 rg.DELETE("/:b/:k", s.deleteAll) 36 //Search 37 r.GET("/api/search", s.search) 38 r.DELETE("/api/search", s.deleteSearch) 39 //通用缓存 40 r.POST("/api/cache", s.cache) 41 r.GET("/api/cache/:key", s.cacheGet) 42 r.POST("/api/fifo", s.fifo) 43 } 44 45 func (s *Storage) create(c *gin.Context) { 46 47 var data interface{} 48 if err := c.ShouldBindJSON(&data); err != nil { 49 logrus.Error(err) 50 c.JSON(http.StatusOK, model.ResponseError("BindError:"+err.Error())) 51 return 52 } 53 54 c.JSON(http.StatusOK, model.ResponseOne(s.Create(c.Param("b"), c.Param("k"), data))) 55 } 56 57 func (s *Storage) update(c *gin.Context) { 58 var data interface{} 59 resp := model.NewResponse() 60 61 if err := c.ShouldBindJSON(&data); err != nil { 62 logrus.Error(err) 63 resp.Code = http.StatusBadRequest 64 resp.Data.Items = err.Error() 65 c.JSON(http.StatusOK, resp) 66 return 67 } 68 69 resp.Data.Total = 1 70 resp.Data.Items = s.Update(c.Param("b"), c.Param("kid"), data) 71 c.JSON(http.StatusOK, resp) 72 } 73 74 func (s *Storage) readAll(c *gin.Context) { 75 b := s.ReadAllSort(c.Param("b"), c.Param("k")) 76 c.JSON(http.StatusOK, b) 77 } 78 79 func (s *Storage) search(c *gin.Context) { 80 var search Search 81 c.ShouldBind(&search) 82 c.JSON(http.StatusOK, s.Search(search)) 83 } 84 85 // 根据搜索内容删除 86 func (s *Storage) deleteSearch(c *gin.Context) { 87 var search Search 88 c.ShouldBind(&search) 89 c.JSON(http.StatusOK, model.NewResponseData(s.DeleteList(search.B, s.Search(search).Data.Items, false))) 90 } 91 92 func (s *Storage) updateWeight(c *gin.Context) { 93 c.JSON(http.StatusOK, model.NewResponseData(s.UpdateWeight(c.Param("b"), c.Param("kid")))) 94 } 95 96 func (s *Storage) read(c *gin.Context) { 97 98 c.JSON(http.StatusOK, model.NewResponseData(s.Read(c.Param("b"), c.Param("kid")))) 99 } 100 101 func (s *Storage) delete(c *gin.Context) { 102 103 s.Delete(c.Param("b"), c.Param("kid")) 104 105 c.JSON(http.StatusOK, model.NewResponseData("success")) 106 } 107 func (s *Storage) deleteAll(c *gin.Context) { 108 109 i := s.DeleteAll(c.Param("b"), c.Param("k")) 110 111 resp := model.NewResponseData("success") 112 resp.Data.Total = i 113 114 c.JSON(http.StatusOK, resp) 115 } 116 117 // 通用全局key value 缓存到bucket=meta中 118 func (s *Storage) cache(c *gin.Context) { 119 var data model.Data 120 if err := c.ShouldBindJSON(&data); err != nil { 121 c.JSON(http.StatusOK, model.ResponseError("BindError:"+err.Error())) 122 return 123 } 124 125 s.CachePut(data.K, data.V) 126 127 c.JSON(http.StatusOK, model.ResponseOne(data)) 128 } 129 func (s *Storage) cacheGet(c *gin.Context) { 130 var b interface{} 131 s.CacheGet(c.Param("key"), &b) 132 c.JSON(http.StatusOK, model.NewResponseData(b)) 133 } 134 135 func (s *Storage) fifo(c *gin.Context) { 136 var data model.Data 137 if err := c.ShouldBindJSON(&data); err != nil { 138 c.JSON(http.StatusOK, model.ResponseError("BindError:"+err.Error())) 139 return 140 } 141 142 size, _ := strconv.Atoi(c.DefaultQuery("size", "10")) 143 144 s.FIFO(data.K, data.V, size) 145 146 c.JSON(http.StatusOK, model.ResponseOne(data)) 147 }