package database import ( "database/sql" "log" "os" "path" "time" "github.com/jinzhu/gorm" "github.com/robfig/cron/v3" "github.com/spf13/viper" // Dialects for gorm _ "github.com/jinzhu/gorm/dialects/postgres" _ "github.com/jinzhu/gorm/dialects/sqlite" ) // Db is the open Database var Db *gorm.DB // URL defines the structure of a shortened URL type URL struct { CreatedAt time.Time UpdatedAt time.Time Short sql.NullString `gorm:"primary_key;unique_index:short_url;not null"` Long sql.NullString `gorm:"unique"` Hits sql.NullInt64 FileName sql.NullString `gorm:"default:NULL"` FileSize sql.NullInt64 `gorm:"default:NULL"` FileHash sql.NullString `gorm:"default:NULL"` FileDelete *time.Time `gorm:"default:NULL"` } // InitDb opens a database connection and runs the auto migration func InitDb() { var err error Db, err = gorm.Open(viper.GetString("DBType"), viper.GetString("DBConnection")) if err != nil { log.Fatal("Could not open database:", err) } if os.Getenv("GIN_MODE") != "release" { Db.LogMode(true) } Db.AutoMigrate(&URL{}) c := cron.New() c.AddFunc("@daily", deleteOldFiles) } func deleteOldFiles() { var URLs []URL Db.Find(&URLs, "file_delete < NOW()") for _, URL := range URLs { file := path.Join(viper.GetString("FileFolder"), URL.FileName.String) os.Remove(file) Db.Delete(&URL) } }