134 lines
3.2 KiB
Go
134 lines
3.2 KiB
Go
package db
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"path"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
// "gorm.io/gorm/logger"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
|
|
"reichard.io/imagini/graph/model"
|
|
"reichard.io/imagini/internal/config"
|
|
)
|
|
|
|
type DBManager struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewMgr(c *config.Config) *DBManager {
|
|
gormConfig := &gorm.Config{
|
|
PrepareStmt: true,
|
|
// Logger: logger.Default.LogMode(logger.Silent),
|
|
}
|
|
|
|
// Create manager
|
|
dbm := &DBManager{}
|
|
|
|
if c.DBType == "SQLite" {
|
|
dbLocation := path.Join(c.ConfigPath, "imagini.db")
|
|
dbm.db, _ = gorm.Open(sqlite.Open(dbLocation), gormConfig)
|
|
} else {
|
|
log.Fatal("Unsupported Database")
|
|
}
|
|
|
|
// Initialize database
|
|
dbm.db.AutoMigrate(&model.Device{})
|
|
dbm.db.AutoMigrate(&model.User{})
|
|
dbm.db.AutoMigrate(&model.MediaItem{})
|
|
dbm.db.AutoMigrate(&model.Tag{})
|
|
dbm.db.AutoMigrate(&model.Album{})
|
|
|
|
// Determine whether to bootstrap
|
|
var count int64
|
|
dbm.db.Model(&model.User{}).Count(&count)
|
|
if count == 0 {
|
|
dbm.bootstrapDatabase()
|
|
}
|
|
|
|
dbm.testFeatures()
|
|
|
|
return dbm
|
|
}
|
|
|
|
func (dbm *DBManager) testFeatures() {
|
|
|
|
// Get Devices By UserID
|
|
// var myDevices []model.Device
|
|
// dbm.db.Debug().Where(&model.Device{UserID: "97589354-cd42-40e2-bc5e-7ba6badf89fa"}).Find(&myDevices)
|
|
// fmt.Printf("Devices: %+v\n", myDevices)
|
|
|
|
// Get User by DeviceID
|
|
// var myUser []model.User
|
|
// dbm.db.Debug().Model(&model.User{}).
|
|
// Select("users.*").
|
|
// Joins("left join devices on users.id = devices.user_id").
|
|
// Where("devices.id = ?", "4e9aa851-f25b-4330-91dc-c0f975e56fa1").
|
|
// Find(&myUser)
|
|
// fmt.Printf("User: %+v\n", myUser)
|
|
}
|
|
|
|
func (dbm *DBManager) bootstrapDatabase() {
|
|
log.Info("[query] Bootstrapping database.")
|
|
|
|
password := "admin"
|
|
user := &model.User{
|
|
Username: "admin",
|
|
AuthType: "Local",
|
|
Password: &password,
|
|
Role: model.RoleAdmin,
|
|
}
|
|
|
|
err := dbm.CreateUser(user)
|
|
|
|
if err != nil {
|
|
log.Fatal("[query] Unable to bootstrap database.")
|
|
}
|
|
}
|
|
|
|
// TODO
|
|
func (dbm *DBManager) QueryBuilder(dest interface{}, params []byte) (int64, error) {
|
|
// TODO:
|
|
// - Where Filters
|
|
// - Sort Filters
|
|
// - Paging Filters
|
|
|
|
objType := fmt.Sprintf("%T", dest)
|
|
if objType == "*[]model.MediaItem" {
|
|
// TODO: Validate MediaItem Type
|
|
} else {
|
|
// Return Error
|
|
return 0, errors.New("Invalid type")
|
|
}
|
|
|
|
var count int64
|
|
err := dbm.db.Find(dest).Count(&count).Error
|
|
return count, err
|
|
|
|
// Paging:
|
|
// - Regular Pagination:
|
|
// - /api/v1/MediaItems?page[limit]=50&page=2
|
|
// - Meta Count Only
|
|
// - /api/v1/MediaItems?page[limit]=0
|
|
|
|
// Sorting:
|
|
// - Ascending Sort:
|
|
// - /api/v1/MediaItems?sort=created_at
|
|
// - Descending Sort:
|
|
// - /api/v1/MediaItems?sort=-created_at
|
|
|
|
// Filters:
|
|
// - Greater Than / Less Than (created_at, updated_at, exif_date)
|
|
// - /api/v1/MediaItems?filter[created_at]>=2020-01-01&filter[created_at]<=2021-01-01
|
|
// - Long / Lat Range (latitude, longitude)
|
|
// - /api/v1/MediaItems?filter[latitude]>=71.1827&filter[latitude]<=72.0000&filter[longitude]>=100.000&filter[longitude]<=101.0000
|
|
// - Image / Video (media_type)
|
|
// - /api/v1/MediaItems?filter[media_type]=Image
|
|
// - Tags (tags)
|
|
// - /api/v1/MediaItems?filter[tags]=id1,id2,id3
|
|
// - Albums (albums)
|
|
// - /api/v1/MediaItems?filter[albums]=id1
|
|
}
|