first commit
This commit is contained in:
304
server/db/dbfunctions.go
Normal file
304
server/db/dbfunctions.go
Normal file
@@ -0,0 +1,304 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
)
|
||||
|
||||
func CanInitializeSystem() (bool, error) {
|
||||
users, _ := GetAllUsers()
|
||||
if len(*users) != 0 {
|
||||
// db.MigrateClarkson("root:password@tcp(192.168.0.117:3306)/clarkson?charset=utf8mb4&parseTime=True&loc=Local")
|
||||
return false,
|
||||
fmt.Errorf("there are already users in the database. Migration can only be done on an empty database")
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func CreateUser(user *User) error {
|
||||
tx := DB.Create(&user)
|
||||
return tx.Error
|
||||
}
|
||||
func UpdateUser(user *User) error {
|
||||
tx := DB.Omit(clause.Associations).Save(&user)
|
||||
return tx.Error
|
||||
}
|
||||
func FindOneUser(condition interface{}) (User, error) {
|
||||
|
||||
var model User
|
||||
err := DB.Where(condition).First(&model).Error
|
||||
return model, err
|
||||
}
|
||||
func GetAllUsers() (*[]User, error) {
|
||||
|
||||
sorting := "created_at desc"
|
||||
var users []User
|
||||
result := DB.Order(sorting).Find(&users)
|
||||
return &users, result.Error
|
||||
}
|
||||
|
||||
func GetAllVehicles(sorting string) (*[]Vehicle, error) {
|
||||
if sorting == "" {
|
||||
sorting = "created_at desc"
|
||||
}
|
||||
var vehicles []Vehicle
|
||||
result := DB.Preload("Fillups", func(db *gorm.DB) *gorm.DB {
|
||||
return db.Order("fillups.date DESC")
|
||||
}).Preload("Expenses", func(db *gorm.DB) *gorm.DB {
|
||||
return db.Order("expenses.date DESC")
|
||||
}).Order(sorting).Find(&vehicles)
|
||||
return &vehicles, result.Error
|
||||
}
|
||||
|
||||
func GetVehicleOwner(vehicleId string) (string, error) {
|
||||
var mapping UserVehicle
|
||||
|
||||
tx := DB.Where("vehicle_id = ? AND is_owner = 1", vehicleId).First(&mapping)
|
||||
|
||||
if tx.Error != nil {
|
||||
return "", tx.Error
|
||||
}
|
||||
return mapping.ID, nil
|
||||
}
|
||||
|
||||
func GetVehicleUsers(vehicleId string) (*[]UserVehicle, error) {
|
||||
var mapping []UserVehicle
|
||||
|
||||
tx := DB.Debug().Preload("User").Where("vehicle_id = ?", vehicleId).Find(&mapping)
|
||||
|
||||
if tx.Error != nil {
|
||||
return nil, tx.Error
|
||||
}
|
||||
return &mapping, nil
|
||||
}
|
||||
|
||||
func ShareVehicle(vehicleId, userId string) error {
|
||||
var mapping UserVehicle
|
||||
|
||||
tx := DB.Where("vehicle_id = ? AND user_id = ?", vehicleId, userId).First(&mapping)
|
||||
|
||||
if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
|
||||
newMapping := UserVehicle{
|
||||
UserID: userId,
|
||||
VehicleID: vehicleId,
|
||||
IsOwner: false,
|
||||
}
|
||||
tx = DB.Create(&newMapping)
|
||||
return tx.Error
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func UnshareVehicle(vehicleId, userId string) error {
|
||||
var mapping UserVehicle
|
||||
|
||||
tx := DB.Where("vehicle_id = ? AND user_id = ?", vehicleId, userId).First(&mapping)
|
||||
|
||||
if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
|
||||
return nil
|
||||
}
|
||||
if mapping.IsOwner {
|
||||
return fmt.Errorf("Cannot unshare owner")
|
||||
}
|
||||
result := DB.Where("id=?", mapping.ID).Delete(&UserVehicle{})
|
||||
return result.Error
|
||||
}
|
||||
|
||||
func GetUserVehicles(id string) (*[]Vehicle, error) {
|
||||
var toReturn []Vehicle
|
||||
user, err := GetUserById(id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = DB.Preload("Fillups", func(db *gorm.DB) *gorm.DB {
|
||||
return db.Order("fillups.date DESC")
|
||||
}).Preload("Expenses", func(db *gorm.DB) *gorm.DB {
|
||||
return db.Order("expenses.date DESC")
|
||||
}).Model(user).Select("vehicles.*,user_vehicles.is_owner").Association("Vehicles").Find(&toReturn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &toReturn, nil
|
||||
}
|
||||
func GetUserById(id string) (*User, error) {
|
||||
var data User
|
||||
result := DB.Preload(clause.Associations).First(&data, "id=?", id)
|
||||
return &data, result.Error
|
||||
}
|
||||
func GetVehicleById(id string) (*Vehicle, error) {
|
||||
var vehicle Vehicle
|
||||
result := DB.Preload(clause.Associations).First(&vehicle, "id=?", id)
|
||||
return &vehicle, result.Error
|
||||
}
|
||||
func GetFillupById(id string) (*Fillup, error) {
|
||||
var obj Fillup
|
||||
result := DB.Preload(clause.Associations).First(&obj, "id=?", id)
|
||||
return &obj, result.Error
|
||||
}
|
||||
|
||||
func GetFillupsByVehicleId(id string) (*[]Fillup, error) {
|
||||
var obj []Fillup
|
||||
result := DB.Preload(clause.Associations).Order("date desc").Find(&obj, &Fillup{VehicleID: id})
|
||||
return &obj, result.Error
|
||||
}
|
||||
func FindFillups(condition interface{}) (*[]Fillup, error) {
|
||||
|
||||
var model []Fillup
|
||||
err := DB.Where(condition).Find(&model).Error
|
||||
return &model, err
|
||||
}
|
||||
|
||||
func FindFillupsForDateRange(vehicleIds []string, start, end time.Time) (*[]Fillup, error) {
|
||||
|
||||
var model []Fillup
|
||||
err := DB.Where("date <= ? AND date >= ? AND vehicle_id in ?", end, start, vehicleIds).Find(&model).Error
|
||||
return &model, err
|
||||
}
|
||||
func FindExpensesForDateRange(vehicleIds []string, start, end time.Time) (*[]Expense, error) {
|
||||
|
||||
var model []Expense
|
||||
err := DB.Where("date <= ? AND date >= ? AND vehicle_id in ?", end, start, vehicleIds).Find(&model).Error
|
||||
return &model, err
|
||||
}
|
||||
|
||||
func GetExpensesByVehicleId(id string) (*[]Expense, error) {
|
||||
var obj []Expense
|
||||
result := DB.Preload(clause.Associations).Order("date desc").Find(&obj, &Expense{VehicleID: id})
|
||||
return &obj, result.Error
|
||||
}
|
||||
func GetExpenseById(id string) (*Expense, error) {
|
||||
var obj Expense
|
||||
result := DB.Preload(clause.Associations).First(&obj, "id=?", id)
|
||||
return &obj, result.Error
|
||||
}
|
||||
|
||||
func DeleteFillupById(id string) error {
|
||||
|
||||
result := DB.Where("id=?", id).Delete(&Fillup{})
|
||||
return result.Error
|
||||
}
|
||||
func DeleteExpenseById(id string) error {
|
||||
result := DB.Where("id=?", id).Delete(&Expense{})
|
||||
return result.Error
|
||||
}
|
||||
|
||||
func GetAllQuickEntries(sorting string) (*[]QuickEntry, error) {
|
||||
if sorting == "" {
|
||||
sorting = "created_at desc"
|
||||
}
|
||||
var quickEntries []QuickEntry
|
||||
result := DB.Preload(clause.Associations).Order(sorting).Find(&quickEntries)
|
||||
return &quickEntries, result.Error
|
||||
}
|
||||
func GetQuickEntriesForUser(userId, sorting string) (*[]QuickEntry, error) {
|
||||
if sorting == "" {
|
||||
sorting = "created_at desc"
|
||||
}
|
||||
var quickEntries []QuickEntry
|
||||
result := DB.Preload(clause.Associations).Where("user_id = ?", userId).Order(sorting).Find(&quickEntries)
|
||||
return &quickEntries, result.Error
|
||||
}
|
||||
func GetQuickEntryById(id string) (*QuickEntry, error) {
|
||||
var quickEntry QuickEntry
|
||||
result := DB.Preload(clause.Associations).First(&quickEntry, "id=?", id)
|
||||
return &quickEntry, result.Error
|
||||
}
|
||||
func UpdateQuickEntry(entry *QuickEntry) error {
|
||||
return DB.Save(entry).Error
|
||||
}
|
||||
func SetQuickEntryAsProcessed(id string, processDate time.Time) error {
|
||||
result := DB.Model(QuickEntry{}).Where("id=?", id).Update("process_date", processDate)
|
||||
return result.Error
|
||||
}
|
||||
|
||||
func GetAttachmentById(id string) (*Attachment, error) {
|
||||
var entry Attachment
|
||||
result := DB.Preload(clause.Associations).First(&entry, "id=?", id)
|
||||
return &entry, result.Error
|
||||
}
|
||||
func GetVehicleAttachments(vehicleId string) (*[]Attachment, error) {
|
||||
var attachments []Attachment
|
||||
vehicle, err := GetVehicleById(vehicleId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = DB.Debug().Model(vehicle).Select("attachments.*,vehicle_attachments.title").Preload("User").Association("Attachments").Find(&attachments)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &attachments, nil
|
||||
}
|
||||
|
||||
func UpdateSettings(setting *Setting) error {
|
||||
tx := DB.Save(&setting)
|
||||
return tx.Error
|
||||
}
|
||||
func GetOrCreateSetting() *Setting {
|
||||
var setting Setting
|
||||
result := DB.First(&setting)
|
||||
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
|
||||
DB.Save(&Setting{})
|
||||
DB.First(&setting)
|
||||
}
|
||||
return &setting
|
||||
}
|
||||
|
||||
func GetLock(name string) *JobLock {
|
||||
var jobLock JobLock
|
||||
result := DB.Where("name = ?", name).First(&jobLock)
|
||||
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
|
||||
return &JobLock{
|
||||
Name: name,
|
||||
}
|
||||
}
|
||||
return &jobLock
|
||||
}
|
||||
func Lock(name string, duration int) {
|
||||
jobLock := GetLock(name)
|
||||
if jobLock == nil {
|
||||
jobLock = &JobLock{
|
||||
Name: name,
|
||||
}
|
||||
}
|
||||
jobLock.Duration = duration
|
||||
jobLock.Date = time.Now()
|
||||
if jobLock.ID == "" {
|
||||
DB.Create(&jobLock)
|
||||
} else {
|
||||
DB.Save(&jobLock)
|
||||
}
|
||||
}
|
||||
func Unlock(name string) {
|
||||
jobLock := GetLock(name)
|
||||
if jobLock == nil {
|
||||
return
|
||||
}
|
||||
jobLock.Duration = 0
|
||||
jobLock.Date = time.Time{}
|
||||
DB.Save(&jobLock)
|
||||
}
|
||||
|
||||
func UnlockMissedJobs() {
|
||||
var jobLocks []JobLock
|
||||
|
||||
result := DB.Find(&jobLocks)
|
||||
if result.Error != nil {
|
||||
return
|
||||
}
|
||||
for _, job := range jobLocks {
|
||||
if (job.Date == time.Time{}) {
|
||||
continue
|
||||
}
|
||||
var duration time.Duration
|
||||
duration = time.Duration(job.Duration)
|
||||
d := job.Date.Add(time.Minute * duration)
|
||||
if d.Before(time.Now()) {
|
||||
fmt.Println(job.Name + " is unlocked")
|
||||
Unlock(job.Name)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user