@@ -3,6 +3,8 @@ package db
33import (
44 "fleet-telemetry-consumer/models"
55 "fmt"
6+ "log"
7+
68 // "log"
79
810 "gorm.io/driver/postgres"
@@ -28,48 +30,29 @@ func InitDB(host, user, password, dbname string, port int) error {
2830 // log.Printf("Warning: Failed to drop tables: %v", err)
2931 // }
3032
31- // Create tables with new schema
32- err = DB .AutoMigrate (& models.TeslaAccount {}, & models.TeslaVehicle {})
33+ // Auto migrate the schemas
34+ err = DB .AutoMigrate (
35+ & models.TeslaAccount {},
36+ & models.TeslaVehicle {},
37+ & models.TelemetryData {},
38+ )
3339 if err != nil {
3440 return fmt .Errorf ("failed to migrate database: %v" , err )
3541 }
3642
43+ log .Println ("Database initialized successfully" )
3744 return nil
3845}
3946
4047// CreateOrUpdateTeslaAccount creates or updates a Tesla account in the database
4148func CreateOrUpdateTeslaAccount (account * models.TeslaAccount ) error {
42- // Try to find an existing account with the same UserID
43- var existingAccount models.TeslaAccount
44- result := DB .Where ("user_id = ?" , account .UserID ).First (& existingAccount )
45-
46- if result .Error == nil {
47- // Update existing account
48- account .ID = existingAccount .ID
49- return DB .Save (account ).Error
50- } else if result .Error == gorm .ErrRecordNotFound {
51- // Create new account
52- return DB .Create (account ).Error
53- }
54-
49+ result := DB .Save (account )
5550 return result .Error
5651}
5752
5853// CreateOrUpdateTeslaVehicle creates or updates a Tesla vehicle in the database
5954func CreateOrUpdateTeslaVehicle (vehicle * models.TeslaVehicle ) error {
60- // Try to find an existing vehicle with the same VIN
61- var existingVehicle models.TeslaVehicle
62- result := DB .Where ("vin = ?" , vehicle .VIN ).First (& existingVehicle )
63-
64- if result .Error == nil {
65- // Update existing vehicle
66- vehicle .ID = existingVehicle .ID
67- return DB .Save (vehicle ).Error
68- } else if result .Error == gorm .ErrRecordNotFound {
69- // Create new vehicle
70- return DB .Create (vehicle ).Error
71- }
72-
55+ result := DB .Save (vehicle )
7356 return result .Error
7457}
7558
@@ -103,3 +86,39 @@ func GetAccountByAccessToken(accessToken string) (*models.TeslaAccount, error) {
10386 }
10487 return & account , nil
10588}
89+
90+ // StoreTelemetryData stores a telemetry data point in the database
91+ func StoreTelemetryData (data * models.TelemetryData ) error {
92+ result := DB .Create (data )
93+ return result .Error
94+ }
95+
96+ // GetTelemetryDataForVehicle retrieves telemetry data for a specific vehicle and key
97+ func GetTelemetryDataForVehicle (vin string , key string , limit int ) ([]models.TelemetryData , error ) {
98+ var data []models.TelemetryData
99+ result := DB .Where ("vin = ? AND key = ?" , vin , key ).
100+ Order ("created_at DESC" ).
101+ Limit (limit ).
102+ Find (& data )
103+ return data , result .Error
104+ }
105+
106+ // GetLatestTelemetryDataForVehicle retrieves the latest telemetry data points for a vehicle
107+ func GetLatestTelemetryDataForVehicle (vin string ) (map [string ]models.TelemetryData , error ) {
108+ var data []models.TelemetryData
109+ subQuery := DB .Model (& models.TelemetryData {}).
110+ Select ("DISTINCT ON (key) *" ).
111+ Where ("vin = ?" , vin ).
112+ Order ("key, created_at DESC" )
113+
114+ result := DB .Table ("(?) as sub" , subQuery ).
115+ Find (& data )
116+
117+ // Convert to map for easier access
118+ dataMap := make (map [string ]models.TelemetryData )
119+ for _ , d := range data {
120+ dataMap [d .Key ] = d
121+ }
122+
123+ return dataMap , result .Error
124+ }
0 commit comments