github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/store/sqlstore/track_point_store.go (about) 1 package sqlstore 2 3 import ( 4 "database/sql" 5 6 sq "github.com/Masterminds/squirrel" 7 "github.com/masterhung0112/hk_server/v5/model" 8 "github.com/masterhung0112/hk_server/v5/store" 9 "github.com/pkg/errors" 10 ) 11 12 type SqlTrackPointStore struct { 13 *SqlStore 14 } 15 16 type TrackPoint struct { 17 Id string 18 TargetId string 19 Lat float64 20 Lng float64 21 CreateAt int64 22 DeviceId string 23 } 24 25 func NewTrackPointFromModel(trackPointModel *model.TrackPoint) *TrackPoint { 26 return &TrackPoint{ 27 Id: trackPointModel.Id, 28 TargetId: trackPointModel.TargetId, 29 Lat: trackPointModel.Point.Lat, 30 Lng: trackPointModel.Point.Lng, 31 CreateAt: trackPointModel.CreateAt, 32 DeviceId: trackPointModel.DeviceId, 33 } 34 } 35 36 func (trackPoint TrackPoint) ToModel() *model.TrackPoint { 37 return &model.TrackPoint{ 38 Id: trackPoint.Id, 39 TargetId: trackPoint.TargetId, 40 Point: model.GeoPoint{ 41 Lat: trackPoint.Lat, 42 Lng: trackPoint.Lng, 43 }, 44 CreateAt: trackPoint.CreateAt, 45 DeviceId: trackPoint.DeviceId, 46 } 47 } 48 49 func newSqlTrackPointStore(sqlStore *SqlStore) store.TrackPointStore { 50 s := &SqlTrackPointStore{ 51 SqlStore: sqlStore, 52 } 53 54 for _, db := range sqlStore.GetAllConns() { 55 table := db.AddTableWithName(TrackPoint{}, "TrackPoints").SetKeys(false, "Id") 56 table.ColMap("Id").SetMaxSize(26) 57 } 58 return s 59 } 60 61 func (s *SqlTrackPointStore) Save(trackPoint *model.TrackPoint) (*model.TrackPoint, error) { 62 if len(trackPoint.Id) > 0 { 63 return nil, store.NewErrInvalidInput("TrackPoint", "Id", trackPoint.Id) 64 } 65 66 trackPoint.PreSave() 67 // Check the track point is valid before proceeding. 68 if err := trackPoint.IsValidWithoutId(); err != nil { 69 return nil, err 70 } 71 72 dbTrackPoint := NewTrackPointFromModel(trackPoint) 73 if err := s.GetMaster().Insert(dbTrackPoint); err != nil { 74 return nil, errors.Wrap(err, "failed to insert TrackPoint") 75 } 76 77 return dbTrackPoint.ToModel(), nil 78 } 79 80 func (s *SqlTrackPointStore) Get(trackPointId string) (*model.TrackPoint, error) { 81 var dbTrackPoint TrackPoint 82 83 if err := s.GetReplica().SelectOne(&dbTrackPoint, "SELECT * from TrackPoints WHERE Id = :Id", map[string]interface{}{"Id": trackPointId}); err != nil { 84 if err == sql.ErrNoRows { 85 return nil, store.NewErrNotFound("TrackPoint", trackPointId) 86 } 87 return nil, errors.Wrap(err, "failed to get TrackPoint") 88 } 89 90 return dbTrackPoint.ToModel(), nil 91 } 92 93 func (s *SqlTrackPointStore) GetByTargetId(targetId string) ([]*model.TrackPoint, error) { 94 query, args, _ := s.getQueryBuilder(). 95 Select("*"). 96 Where(sq.Eq{"TargetId": targetId}). 97 ToSql() 98 var result []*model.TrackPoint 99 if _, err := s.GetReplica().Select(&result, query, args...); err != nil { 100 return nil, errors.Wrap(err, "failed to fetch track points for target id") 101 } 102 return result, nil 103 }