package way import ( "io" "log" "mime/multipart" "os" "path" "strings" "time" "gorm.io/gorm" v1 "pkg.bing89.com/travebing/api/v1" "pkg.bing89.com/travebing/config" "pkg.bing89.com/travebing/controller/geo" "pkg.bing89.com/travebing/tberror" ) type Controller interface { List() ([]v1.TravelWay, int, error) Create(opt CreateOption) (*v1.TravelWay, int, error) } type way struct { db *gorm.DB cfg *config.Image plan int geoCtrl geo.Controller } func New(plan int, db *gorm.DB, cfg *config.Image, geoCtrl geo.Controller) Controller { c := &way{ db: db, cfg: cfg, plan: plan, geoCtrl: geoCtrl, } return c } func (c *way) List() ([]v1.TravelWay, int, error) { ret := []v1.TravelWay{} err := c.db.Where("plan = ?", c.plan).Find(&ret).Error if err != nil { return ret, tberror.CodeDatabase, err } ways := []v1.TravelWay{} for _, w := range ret { w.Image = w.ImageSrc() ways = append(ways, w) } return ways, 0, nil } func (c *way) checkDir(file string) error { dir := path.Dir(file) _, err := os.ReadDir(dir) if os.IsNotExist(err) { return os.MkdirAll(dir, os.ModeDir|os.ModePerm) } return err } func (c *way) saveFile(file *multipart.FileHeader, dst string) error { if file == nil { return nil } if err := c.checkDir(dst); err != nil { return err } src, err := file.Open() if err != nil { return err } defer src.Close() out, err := os.Create(dst) if err != nil { return err } defer out.Close() _, err = io.Copy(out, src) if err != nil { return err } return nil } func (c *way) Create(opt CreateOption) (*v1.TravelWay, int, error) { ret := &v1.TravelWay{ Plan: c.plan, Lat: opt.Lat, Lon: opt.Lon, CreatedAt: time.Now().Unix(), } addr, err := c.geoCtrl.Address(opt.Lon, opt.Lat) if err != nil { log.Println("===>>>> get address failed:", err) } ret.Address = addr if opt.File != nil { fileExt := strings.ToLower(path.Ext(opt.File.Filename)) ret.Image = fileExt } err = c.db.Create(ret).Error if err != nil { return nil, tberror.CodeDatabase, err } err = c.saveFile(opt.File, ret.ImagePath(c.cfg.Dir)) if err != nil { return ret, tberror.CodeFileSave, err } ret.Image = ret.ImageSrc() return ret, 0, nil }