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  }