ShortDragon/internal/database/database.go

63 lines
1.3 KiB
Go

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)
}
}