Reorganize & Add DB Bootstrapping
This commit is contained in:
parent
bc3b437ebc
commit
fe932de37e
11
cmd/cmd.go
11
cmd/cmd.go
@ -1,11 +1,12 @@
|
|||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
"reichard.io/imagini/routes"
|
"reichard.io/imagini/routes"
|
||||||
"reichard.io/imagini/internal/context"
|
"reichard.io/imagini/internal/context"
|
||||||
|
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
"net/http"
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -16,19 +17,11 @@ var CmdServe = cli.Command{
|
|||||||
Action: serveWeb,
|
Action: serveWeb,
|
||||||
}
|
}
|
||||||
|
|
||||||
// var CmdDBTest = cli.Command{
|
|
||||||
// Name: "test",
|
|
||||||
// Aliases: []string{"t"},
|
|
||||||
// Usage: "test db.",
|
|
||||||
// Action: testDatabase,
|
|
||||||
// }
|
|
||||||
|
|
||||||
func serveWeb(cliCtx *cli.Context) error {
|
func serveWeb(cliCtx *cli.Context) error {
|
||||||
log.Info("Serving Web")
|
log.Info("Serving Web")
|
||||||
|
|
||||||
ctx := context.NewImaginiContext()
|
ctx := context.NewImaginiContext()
|
||||||
routes.RegisterRoutes(ctx)
|
routes.RegisterRoutes(ctx)
|
||||||
//listener, _ := net.Listen("tcp", ctx.Config.ListenPort)
|
|
||||||
|
|
||||||
if err := http.ListenAndServe(":" + ctx.Config.ListenPort, nil); err != nil {
|
if err := http.ListenAndServe(":" + ctx.Config.ListenPort, nil); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
BIN
imagini.db
BIN
imagini.db
Binary file not shown.
@ -1,17 +1,14 @@
|
|||||||
package auth
|
package auth
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"gorm.io/gorm"
|
|
||||||
"golang.org/x/crypto/bcrypt"
|
"golang.org/x/crypto/bcrypt"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"reichard.io/imagini/internal/query"
|
|
||||||
"reichard.io/imagini/internal/models"
|
"reichard.io/imagini/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func authenticateLocalUser(user models.User, pw string) bool {
|
func authenticateLocalUser(user models.User, pw string) bool {
|
||||||
bPassword :=[]byte(pw)
|
bPassword :=[]byte(pw)
|
||||||
err := bcrypt.CompareHashAndPassword([]byte(user.HashedPassword), bPassword)
|
err := bcrypt.CompareHashAndPassword([]byte(user.Password), bPassword)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
log.Info("[auth] Authentication successfull: ", user.Username)
|
log.Info("[auth] Authentication successfull: ", user.Username)
|
||||||
return true
|
return true
|
||||||
@ -19,20 +16,3 @@ func authenticateLocalUser(user models.User, pw string) bool {
|
|||||||
log.Warn("[auth] Authentication failed: ", user.Username)
|
log.Warn("[auth] Authentication failed: ", user.Username)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateUser(db *gorm.DB, user models.User, pw string) error {
|
|
||||||
log.Info("[auth] Creating user: ", user.Username)
|
|
||||||
_, err := query.User(db, user)
|
|
||||||
if !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
||||||
log.Warn("[auth] User already exists: ", user.Username)
|
|
||||||
return errors.New("User already exists")
|
|
||||||
}
|
|
||||||
|
|
||||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(pw), bcrypt.DefaultCost)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
user.HashedPassword = string(hashedPassword)
|
|
||||||
return query.CreateUser(db, user)
|
|
||||||
}
|
|
||||||
|
@ -13,9 +13,9 @@ type ImaginiContext struct {
|
|||||||
|
|
||||||
func NewImaginiContext() *ImaginiContext {
|
func NewImaginiContext() *ImaginiContext {
|
||||||
c := config.NewConfig()
|
c := config.NewConfig()
|
||||||
gormDB := query.NewDB(c)
|
db := query.NewDB(c)
|
||||||
return &ImaginiContext{
|
return &ImaginiContext{
|
||||||
DB: gormDB,
|
DB: db,
|
||||||
Config: c,
|
Config: c,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ type User struct {
|
|||||||
FirstName string `json:"first_name"`
|
FirstName string `json:"first_name"`
|
||||||
LastName string `json:"last_name"`
|
LastName string `json:"last_name"`
|
||||||
AuthType string `json:"auth_type"`
|
AuthType string `json:"auth_type"`
|
||||||
HashedPassword string `json:"hashed_password"`
|
Password string `json:"password"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type MediaItem struct {
|
type MediaItem struct {
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
package query
|
package query
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
|
||||||
"path"
|
"path"
|
||||||
// "time"
|
|
||||||
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"gorm.io/gorm/logger"
|
"gorm.io/gorm/logger"
|
||||||
"gorm.io/driver/sqlite"
|
"gorm.io/driver/sqlite"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
"reichard.io/imagini/internal/config"
|
"reichard.io/imagini/internal/config"
|
||||||
"reichard.io/imagini/internal/models"
|
"reichard.io/imagini/internal/models"
|
||||||
@ -24,18 +23,39 @@ func NewDB(c *config.Config) *gorm.DB {
|
|||||||
dbLocation := path.Join(c.ConfigPath, "imagini.db")
|
dbLocation := path.Join(c.ConfigPath, "imagini.db")
|
||||||
db, _ = gorm.Open(sqlite.Open(dbLocation), gormConfig)
|
db, _ = gorm.Open(sqlite.Open(dbLocation), gormConfig)
|
||||||
} else {
|
} else {
|
||||||
log.Fatal("ERROR: Unsupported Database")
|
log.Fatal("Unsupported Database")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize Database
|
// Initialize database
|
||||||
db.AutoMigrate(&models.ServerSetting{})
|
db.AutoMigrate(&models.ServerSetting{})
|
||||||
db.AutoMigrate(&models.User{})
|
db.AutoMigrate(&models.User{})
|
||||||
db.AutoMigrate(&models.MediaItem{})
|
db.AutoMigrate(&models.MediaItem{})
|
||||||
db.AutoMigrate(&models.Tag{})
|
db.AutoMigrate(&models.Tag{})
|
||||||
db.AutoMigrate(&models.Album{})
|
db.AutoMigrate(&models.Album{})
|
||||||
|
|
||||||
|
// Determine whether to bootstrap
|
||||||
|
var count int64
|
||||||
|
db.Model(&models.User{}).Count(&count)
|
||||||
|
if count == 0 {
|
||||||
|
bootstrapDatabase(db)
|
||||||
|
}
|
||||||
|
|
||||||
return db
|
return db
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func bootstrapDatabase(db *gorm.DB) {
|
||||||
|
log.Info("[query] Bootstrapping database.")
|
||||||
|
err := CreateUser(db, models.User{
|
||||||
|
Username: "admin",
|
||||||
|
Password: "admin",
|
||||||
|
AuthType: "Local",
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("[query] Unable to bootstrap database.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func ItemsFromAlbum(db *gorm.DB, user models.User, album models.Album) []models.MediaItem {
|
func ItemsFromAlbum(db *gorm.DB, user models.User, album models.Album) []models.MediaItem {
|
||||||
var mediaItems []models.MediaItem
|
var mediaItems []models.MediaItem
|
||||||
// db.Table("media_albums").
|
// db.Table("media_albums").
|
@ -1,13 +1,29 @@
|
|||||||
package query
|
package query
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
"reichard.io/imagini/internal/models"
|
"reichard.io/imagini/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func CreateUser (db *gorm.DB, user models.User) error {
|
func CreateUser(db *gorm.DB, user models.User) error {
|
||||||
err := db.Create(&user).Error
|
log.Info("[query] Creating user: ", user.Username)
|
||||||
return err
|
_, err := User(db, user)
|
||||||
|
if !errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
|
log.Warn("[query] User already exists: ", user.Username)
|
||||||
|
return errors.New("User already exists")
|
||||||
|
}
|
||||||
|
|
||||||
|
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
user.Password = string(hashedPassword)
|
||||||
|
return db.Create(&user).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func User (db *gorm.DB, user models.User) (models.User, error) {
|
func User (db *gorm.DB, user models.User) (models.User, error) {
|
||||||
|
Reference in New Issue
Block a user