diff --git a/core/store.go b/core/store.go index 1bf6fa4..b4c300f 100644 --- a/core/store.go +++ b/core/store.go @@ -1,7 +1,9 @@ package core import ( + "encoding/json" "fmt" + "reflect" "strconv" "github.com/boltdb/bolt" @@ -118,3 +120,45 @@ var Int = func(s string) int { i, _ := strconv.Atoi(s) return i } + +func (bucket Bucket) Create(i interface{}) error { + s := reflect.ValueOf(i).Elem() + id := s.FieldByName("ID") + return db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte(bucket)) + if b == nil { + b, _ = tx.CreateBucket([]byte(bucket)) + } + sq, _ := b.NextSequence() + id.SetInt(int64(sq)) + buf, err := json.Marshal(i) + if err != nil { + return err + } + return b.Put(itob(sq), buf) + }) +} + +func itob(i uint64) []byte { + return []byte(fmt.Sprint(i)) +} + +func (bucket Bucket) First(i interface{}) { + id := reflect.ValueOf(i).Elem().FieldByName("ID").Int() + db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte(bucket)) + if b == nil { + return nil + } + data := b.Get(itob(uint64(id))) + if len(data) == 0 { + return nil + } + json.Unmarshal(data, i) + return nil + }) +} + +// func (bucket Bucket) Find(o interface{}) { + +// } diff --git a/develop/dwz/init.go b/develop/dwz/init.go index 977e51a..d3ab160 100644 --- a/develop/dwz/init.go +++ b/develop/dwz/init.go @@ -1,13 +1,52 @@ package dwz import ( + "fmt" + "net/http" + "github.com/cdle/sillyGirl/core" "github.com/gin-gonic/gin" ) +var dwz = core.NewBucket("dwz") + func init() { core.Server.GET("/dwz", func(c *gin.Context) { - addr := c.Param("addr") - c.String(200, addr) + url := c.Query("url") + dwz := getDwz(url) + c.String(200, dwz) + }) + core.Server.GET("/d:id", func(c *gin.Context) { + id := c.Param("id") + c.Redirect(http.StatusMovedPermanently, getWz(id)) + }) + core.AddCommand("", []core.Function{ + { + Rules: []string{"dwz ?"}, + Handle: func(s core.Sender) interface{} { + return getDwz(s.Get()) + }, + }, }) } + +type ShortUrl struct { + ID int + Url string +} + +func getDwz(url string) string { + su := &ShortUrl{ + Url: url, + } + dwz.Create(su) + return dwz.Get("address", "https://4co.cc"+"/d"+fmt.Sprint(su.ID)) +} + +func getWz(id string) string { + su := &ShortUrl{ + ID: core.Int(id), + } + dwz.First(su) + return fmt.Sprint(su.Url) +}