travebing/backend/controller/way/way.go

116 lines
2.2 KiB
Go

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
}