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  }