225 lines
5.7 KiB
Go
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
|
|
}
|