Files
hammond/server/db/clarkson.go
2021-07-14 06:47:16 +05:30

225 lines
5.7 KiB
Go

package db
import (
"time"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func CanMigrate(connectionString string) (bool, interface{}, error) {
canInitialize, err := CanInitializeSystem()
if !canInitialize {
return canInitialize, nil, err
}
cdb, err := gorm.Open(mysql.Open(connectionString), &gorm.Config{})
if err != nil {
return false, nil, err
}
var usersCount, vehiclesCount, fuelCount int64
tx := cdb.Table("Users").Count(&usersCount)
if tx.Error != nil {
return false, nil, tx.Error
}
tx = cdb.Table("Vehicles").Count(&vehiclesCount)
if tx.Error != nil {
return false, nil, tx.Error
}
tx = cdb.Table("Fuel").Count(&fuelCount)
if tx.Error != nil {
return false, nil, tx.Error
}
data := struct {
Users int64 `json:"users"`
Vehicles int64 `json:"vehicles"`
Fillups int64 `json:"fillups"`
}{
Vehicles: vehiclesCount,
Users: usersCount,
Fillups: fuelCount,
}
return true, data, nil
}
func MigrateClarkson(connectionString string) (bool, error) {
canInitialize, err := CanInitializeSystem()
if !canInitialize {
return canInitialize, err
}
//dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
cdb, err := gorm.Open(mysql.Open(connectionString), &gorm.Config{})
if err != nil {
return false, nil
}
/////Models
type CUser struct {
ID string `gorm:"column:id"`
Email string `gorm:"column:email"`
Username string `gorm:"column:username"`
Password string `gorm:"column:password"`
Admin bool `gorm:"column:admin"`
FuelUnit int `gorm:"column:fuelUnit"`
DistanceUnit int `gorm:"column:distanceUnit"`
FuelConsumptionUnit int `gorm:"column:fuelConsumptionUnit"`
CurrencyUnit int `gorm:"column:currencyUnit"`
}
type CVehicle struct {
ID string `gorm:"column:id"`
User string
Name string
Registration string
Make string
Model string
YearOfManufacture int `gorm:"column:yearOfManufacture"`
Vin string
EngineSizeCC int `gorm:"column:engineSizeCC"`
FuelType int `gorm:"column:fuelType"`
}
type CFuel struct {
ID string `gorm:"column:id"`
Vehicle string `gorm:"column:vehicle"`
Date time.Time `gorm:"column:date"`
FuelAmount float32 `gorm:"column:fuelAmount"`
TotalCost float32 `gorm:"column:totalCost"`
FuelUnitCost float32 `gorm:"column:fuelUnitCost"`
OdometerReading int `gorm:"column:odometerReading"`
Notes string `gorm:"column:notes"`
FullTank bool `gorm:"column:fullTank"`
MissedFillup bool `gorm:"column:missedFillUp"`
}
distanceUnitMap := map[int]DistanceUnit{
1: MILES,
2: KILOMETERS,
}
fuelTypeMap := map[int]FuelType{
1: PETROL,
2: DIESEL,
3: ETHANOL,
4: LPG,
}
fuelUnitsMap := map[int]FuelUnit{
1: LITRE,
2: GALLON,
3: US_GALLON,
}
currencyMap := map[int]string{
1: "GBP",
2: "USD",
3: "EUR",
4: "AUD",
5: "CAD",
}
newUserIdsMap := make(map[string]User)
oldUserIdsMap := make(map[string]CUser)
var allUsers []CUser
cdb.Table("Users").Find(&allUsers)
for _, v := range allUsers {
role := USER
if v.Admin {
role = ADMIN
}
user := User{
Email: v.Email,
Currency: currencyMap[v.CurrencyUnit],
DistanceUnit: distanceUnitMap[v.DistanceUnit],
Role: role,
Name: v.Username,
DateFormat: "MM/dd/yyyy",
}
user.SetPassword("hammond")
err = CreateUser(&user)
if err != nil {
return false, err
}
newUserIdsMap[v.ID] = user
oldUserIdsMap[v.ID] = v
if v.Admin {
setting := GetOrCreateSetting()
setting.Currency = user.Currency
setting.DistanceUnit = user.DistanceUnit
UpdateSettings(setting)
}
}
newVehicleIdsMap := make(map[string]Vehicle)
oldVehicleIdsMap := make(map[string]CVehicle)
vehicleUserMap := make(map[string]User)
var allVehicles []CVehicle
cdb.Table("Vehicles").Find(&allVehicles)
for _, model := range allVehicles {
vehicle := Vehicle{
Nickname: model.Name,
Registration: model.Registration,
Model: model.Model,
Make: model.Make,
YearOfManufacture: model.YearOfManufacture,
EngineSize: float32(model.EngineSizeCC),
FuelUnit: fuelUnitsMap[oldUserIdsMap[model.User].FuelUnit],
FuelType: fuelTypeMap[model.FuelType],
}
tx := DB.Create(&vehicle)
if tx.Error != nil {
return false, tx.Error
}
association := UserVehicle{
UserID: newUserIdsMap[model.User].ID,
VehicleID: vehicle.ID,
IsOwner: true,
}
vehicleUserMap[vehicle.ID] = newUserIdsMap[model.User]
tx = DB.Create(&association)
if tx.Error != nil {
return false, err
}
newVehicleIdsMap[model.ID] = vehicle
oldVehicleIdsMap[model.ID] = model
}
var allFillups []CFuel
cdb.Table("Fuel").Find(&allFillups)
for _, model := range allFillups {
fillup := Fillup{
VehicleID: newVehicleIdsMap[model.Vehicle].ID,
FuelUnit: newVehicleIdsMap[model.Vehicle].FuelUnit,
FuelQuantity: model.FuelAmount,
PerUnitPrice: model.FuelUnitCost,
TotalAmount: model.TotalCost,
OdoReading: model.OdometerReading,
IsTankFull: &model.FullTank,
HasMissedFillup: &model.MissedFillup,
Comments: model.Notes,
UserID: vehicleUserMap[newVehicleIdsMap[model.Vehicle].ID].ID,
Date: model.Date,
Currency: vehicleUserMap[newVehicleIdsMap[model.Vehicle].ID].Currency,
DistanceUnit: vehicleUserMap[newVehicleIdsMap[model.Vehicle].ID].DistanceUnit,
}
tx := DB.Create(&fillup)
if tx.Error != nil {
return false, tx.Error
}
}
return true, nil
}