Initial cloud-services repo - gateway service + pkg modules

This commit is contained in:
Chris Rai
2026-01-30 23:14:52 -05:00
commit fbb820d7b3
1037 changed files with 171318 additions and 0 deletions

View File

@@ -0,0 +1,207 @@
package immobilizershared
import (
"context"
"encoding/json"
"time"
"fiskerinc.com/modules/logger"
"fiskerinc.com/modules/redisv2"
)
// Grabs all the vehicle statuses from redis
func ReadVehicleStatuses(connection *redisv2.Connection) (results map[string]ImmobilizeTrack, err error) {
res := connection.HGetAll(context.Background(), IMMOBILIZER_HASHSET_NAME)
tempMap, err := res.Result()
if err != nil {
logger.Err(err).Stack().Str("function", "ReadVehicleStatuses").Msg("Immobilizer Error")
return
}
results = make(map[string]ImmobilizeTrack)
for key, value := range tempMap {
tempTrack := ImmobilizeTrack{}
err = json.Unmarshal([]byte(value), &tempTrack)
if err != nil {
logger.Err(err).Stack().Str("function", "ReadVehicleStatuses").Msg("Immobilizer Error")
continue
}
results[key] = tempTrack
}
return
}
// WE want to update redis with the fact a car is immobilized, so start with modifying redis, then sending a publish event
// This kind of specification per function is sort of silly, probably will want to change in the future
func UpdateCarImmobilized(vin string, connection *redisv2.Connection) (err error) {
err = SetVehicleImmobilized(vin, connection)
if err != nil {
logger.Err(err).Stack().Str("function", "UpdateCarImmobilized").Msg("Immobilizer Error")
return
}
err = PublishVehicleImmobilized(vin, connection)
if err != nil {
logger.Err(err).Stack().Str("function", "UpdateCarImmobilized").Msg("Immobilizer Error")
return
}
return
}
func UpdateCarImmobilizing(vin string, connection *redisv2.Connection) (err error) {
err = SetVehicleImmobilizing(vin, connection)
if err != nil {
logger.Err(err).Stack().Str("function", "UpdateCarImmobilizing").Msg("Immobilizer Error")
return
}
err = PublishVehicleImmobilizing(vin, connection)
if err != nil {
logger.Err(err).Stack().Str("function", "UpdateCarImmobilizing").Msg("Immobilizer Error")
return
}
return
}
func UpdateCarMobilized(vin string, connection *redisv2.Connection) (err error) {
err = SetVehicleMobilized(vin, connection)
if err != nil {
logger.Err(err).Stack().Str("function", "UpdateCarMobilized").Msg("Immobilizer Error")
return
}
err = PublishVehicleMobilized(vin, connection)
if err != nil {
logger.Err(err).Stack().Str("function", "UpdateCarMobilized").Msg("Immobilizer Error")
return
}
return
}
func UpdateCarMobilizing(vin string, connection *redisv2.Connection) (err error) {
err = SetVehicleMobilizing(vin, connection)
if err != nil {
logger.Err(err).Stack().Str("function", "UpdateCarMobilizing").Msg("Immobilizer Error")
return
}
err = PublishVehicleMobilizing(vin, connection)
if err != nil {
logger.Err(err).Stack().Str("function", "UpdateCarMobilizing").Msg("Immobilizer Error")
return
}
return
}
// Might not need to call these directly
// Publishing the fact the car is now mobilized. Ditto's will remove the car from their containers
func PublishVehicleMobilized(vin string, connection *redisv2.Connection) (err error) {
return PublishVehicleMobilizationChange(RedisImmobilizerMsg{VIN: vin, State: STATE_MOBILIZED}, connection)
}
func PublishVehicleMobilizing(vin string, connection *redisv2.Connection) (err error) {
return PublishVehicleMobilizationChange(RedisImmobilizerMsg{VIN: vin, State: STATE_MOBILIZING}, connection)
}
func PublishVehicleImmobilized(vin string, connection *redisv2.Connection) (err error) {
return PublishVehicleMobilizationChange(RedisImmobilizerMsg{VIN: vin, State: STATE_IMMOBILIZED}, connection)
}
// Publish the fact we are trying to immobile the vehicle
func PublishVehicleImmobilizing(vin string, connection *redisv2.Connection) (err error) {
return PublishVehicleMobilizationChange(RedisImmobilizerMsg{VIN: vin, State: STATE_IMMOBILIZING}, connection)
}
func PublishVehicleMobilizationChange(msg RedisImmobilizerMsg, connection *redisv2.Connection) (err error) {
// I think the int that is returned is the number of subscribers
res := connection.Publish(context.Background(), IMMOBILIZER_PUBSUB_CHANNEL, msg)
err = res.Err()
return
}
// These all modify the redis data store, which acts as a database for the cars that are immobilized
func SetVehicleMobilized(vin string, connection *redisv2.Connection) (err error) {
// Instead of using HSET, we are deleting the car from the immobilized stats line. Keeps the redis store smaller
res := connection.HDel(context.Background(), IMMOBILIZER_HASHSET_NAME, vin)
err = res.Err()
if err != nil {
logger.Err(err).Stack().Str("function", "SetVehicleMobilized").Msg("Immobilizer Error")
}
return
}
func SetVehicleMobilizing(vin string, connection *redisv2.Connection) (err error) {
return setVehicleMobilizationChange(vin, ImmobilizeTrack{State: STATE_MOBILIZING}, connection)
}
func SetVehicleImmobilized(vin string, connection *redisv2.Connection) (err error) {
return setVehicleMobilizationChange(vin, ImmobilizeTrack{State: STATE_IMMOBILIZED}, connection)
}
// Set the fact we are trying to immobile the vehicle
func SetVehicleImmobilizing(vin string, connection *redisv2.Connection) (err error) {
return setVehicleMobilizationChange(vin, ImmobilizeTrack{State: STATE_IMMOBILIZING}, connection)
}
// CHANGE
func setVehicleMobilizationChange(vin string, msg ImmobilizeTrack, connection *redisv2.Connection) (err error) {
// I think the int that is returned is the number of subscribers
res := connection.HSet(context.Background(), IMMOBILIZER_HASHSET_NAME, vin, msg)
err = res.Err()
if err != nil {
logger.Err(err).Stack().Str("function", "setVehicleMobilizationChange").Msg("Immobilizer Error")
return
}
return
}
const IMMOBILIZER_PUBSUB_CHANNEL = "immobilizer"
const IMMOBILIZER_HASHSET_NAME = "immobilizer"
type ImmobilizeTrack struct {
State ImmobilizeState
// IDK, do we need the time we tried? We probably need a timer thing
CreatedAt *time.Time
UpdatedAt *time.Time
}
// For redis serialization
func (it ImmobilizeTrack) MarshalBinary() ([]byte, error) {
return json.Marshal(it)
}
func (it ImmobilizeTrack) UnmarshalBinary(data []byte) error {
return json.Unmarshal(data, &it)
}
type ImmobilizeState int
var (
STATE_IMMOBILIZED ImmobilizeState = 0 // Car officially immobilized
STATE_IMMOBILIZING ImmobilizeState = 1 // Trying to immobilize car
STATE_MOBILIZING ImmobilizeState = 2 // Trying to mobilize the car
STATE_MOBILIZED ImmobilizeState = 3 // Car is mobilized, although not stored in redis or ditto, is used to communicate the change has been made
)
func (i ImmobilizeState) String()(string){
switch i{
case STATE_IMMOBILIZED:
return "STATE_IMMOBILIZED"
case STATE_IMMOBILIZING:
return "STATE_IMMOBILIZING"
case STATE_MOBILIZING:
return "STATE_MOBILIZING"
case STATE_MOBILIZED:
return "STATE_MOBILIZED"
}
return "missing"
}
type RedisImmobilizerMsg struct {
VIN string // VIN that we are modifying
State ImmobilizeState // How we are changing said state, which will affect how listening ditto's will manage
}
func (rim RedisImmobilizerMsg) MarshalBinary() ([]byte, error) {
return json.Marshal(rim)
}
func (rim RedisImmobilizerMsg) UnmarshalBinary(data []byte) error {
return json.Unmarshal(data, &rim)
}