DB & Route Organization

This commit is contained in:
2021-01-09 19:44:02 -05:00
parent 04924ead5c
commit 96b0c888ed
21 changed files with 430 additions and 192 deletions

37
internal/auth/auth.go Normal file
View File

@@ -0,0 +1,37 @@
package auth
import (
"errors"
"gorm.io/gorm"
"reichard.io/imagini/internal/db"
log "github.com/sirupsen/logrus"
)
func AuthenticateUser(userIdentifier string, userPassword string) bool {
// By Username
foundUser, err := db.GetUser(db.User{Username: userIdentifier})
if errors.Is(err, gorm.ErrRecordNotFound) {
foundUser, err = db.GetUser(db.User{Email: userIdentifier})
}
// Error Checking
if errors.Is(err, gorm.ErrRecordNotFound) {
log.Warn("[auth] User not found: ", userIdentifier)
return false
} else if err != nil {
log.Error(err)
return false
}
log.Info("[auth] Authenticating user: ", foundUser.Username)
// Determine Type
switch foundUser.AuthType {
case "Local":
return authenticateLocalUser(foundUser, userPassword)
case "LDAP":
return authenticateLDAPUser(foundUser, userPassword)
default:
return false
}
}

View File

@@ -0,0 +1,9 @@
package auth
import (
"reichard.io/imagini/internal/db"
)
func authenticateLDAPUser(user db.User, pw string) bool {
return false
}

View File

@@ -0,0 +1,37 @@
package auth
import (
"errors"
"gorm.io/gorm"
"golang.org/x/crypto/bcrypt"
log "github.com/sirupsen/logrus"
"reichard.io/imagini/internal/db"
)
func authenticateLocalUser(user db.User, pw string) bool {
bPassword :=[]byte(pw)
err := bcrypt.CompareHashAndPassword([]byte(user.HashedPassword), bPassword)
if err == nil {
log.Info("[local] Authentication successfull: ", user.Username)
return true
}
log.Warn("[local] Authentication failed: ", user.Username)
return false
}
func CreateUser(user db.User, pw string) error {
log.Info("[local] Creating user: ", user.Username)
_, err := db.GetUser(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 db.CreateUser(user)
}

View File

@@ -3,39 +3,41 @@ package db
import (
"log"
"path"
"fmt"
"time"
// "time"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/driver/sqlite"
"reichard.io/imagini/internal/config"
"reichard.io/imagini/internal/models"
)
var db *gorm.DB
func ConnectDB(c *config.Config) {
fmt.Printf("%+v\n", c)
gormConfig := &gorm.Config{
PrepareStmt: true,
Logger: logger.Default.LogMode(logger.Silent),
}
if c.DBType == "SQLite" {
dbLocation := path.Join(c.ConfigPath, "imagini.db")
db, _ = gorm.Open(sqlite.Open(dbLocation), &gorm.Config{
PrepareStmt: true,
})
db, _ = gorm.Open(sqlite.Open(dbLocation), gormConfig)
} else {
log.Fatal("ERROR: Unsupported Database")
}
// Initialize Database
db.AutoMigrate(&ServerSetting{})
db.AutoMigrate(&User{})
db.AutoMigrate(&MediaItem{})
db.AutoMigrate(&Tag{})
db.AutoMigrate(&Album{})
db.AutoMigrate(&models.ServerSetting{})
db.AutoMigrate(&models.User{})
db.AutoMigrate(&models.MediaItem{})
db.AutoMigrate(&models.Tag{})
db.AutoMigrate(&models.Album{})
}
func ItemsFromAlbum(user User, album Album) []MediaItem {
var mediaItems []MediaItem
func ItemsFromAlbum(user models.User, album models.Album) []models.MediaItem {
var mediaItems []models.MediaItem
// db.Table("media_albums").
// Select("media_item.*").
// Joins("INNER JOIN media_items ON media_albums.ID = media_items.Albums").
@@ -63,63 +65,63 @@ func ItemsFromAlbum(user User, album Album) []MediaItem {
// func IndexMediaItems(newItems []MediaItem) {
// }
func PopulateTestData() {
user1 := User{Name: "Evan", Email: "evan@reichard.io", AuthType: "LDAP", Salt: "1234", HashedPWSalt: "1234"}
user2 := User{Name: "Ryan", Email: "ryan@example.com", AuthType: "Local", Salt: "2345", HashedPWSalt: "2345"}
user3 := User{Name: "Bill", Email: "bill@example.com", AuthType: "LDAP", Salt: "3456", HashedPWSalt: "3456"}
mi1 := MediaItem{
User: user1,
EXIFDate: time.Now(),
Latitude: "1234",
Longitude: "1234",
RelPath: "./1234.jpg",
Tags: []Tag{
{Name: "Tag1"},
{Name: "Tag2"},
},
Albums: []Album{
{Name: "Album1"},
{Name: "Album2"},
},
}
mi2 := MediaItem{
User: user2,
EXIFDate: time.Now(),
Latitude: "1234",
Longitude: "1234",
RelPath: "./1234.jpg",
Tags: []Tag{
{Name: "Tag3"},
{Name: "Tag4"},
},
Albums: []Album{
{Name: "Album3"},
{Name: "Album4"},
},
}
mi3 := MediaItem{
User: user3,
EXIFDate: time.Now(),
Latitude: "1234",
Longitude: "1234",
RelPath: "./1234.jpg",
Tags: []Tag{
{Name: "Tag4"},
{Name: "Tag5"},
},
Albums: []Album{
{Name: "Album1"},
{Name: "Album7"},
},
}
// db.Create(&user1)
// db.Create(&user2)
// db.Create(&user3)
db.Create(&mi1)
db.Create(&mi2)
db.Create(&mi3)
}
// func PopulateTestData() {
// user1 := User{Username: "Evan", Email: "evan@reichard.io", FirstName: "Evan", LastName: "Reichard", AuthType: "LDAP", Salt: "1234", HashedPWSalt: "1234"}
// user2 := User{Username: "Ryan", Email: "ryan@example.com", FirstName: "Ryan", LastName: "Dunfrey", AuthType: "Local", Salt: "2345", HashedPWSalt: "2345"}
// user3 := User{Username: "Bill", Email: "bill@example.com", FirstName: "Bill", LastName: "Smith", AuthType: "LDAP", Salt: "3456", HashedPWSalt: "3456"}
//
// mi1 := MediaItem{
// User: user1,
// EXIFDate: time.Now(),
// Latitude: "1234",
// Longitude: "1234",
// RelPath: "./1234.jpg",
// Tags: []Tag{
// {Name: "Tag1"},
// {Name: "Tag2"},
// },
// Albums: []Album{
// {Name: "Album1"},
// {Name: "Album2"},
// },
// }
//
// mi2 := MediaItem{
// User: user2,
// EXIFDate: time.Now(),
// Latitude: "1234",
// Longitude: "1234",
// RelPath: "./1234.jpg",
// Tags: []Tag{
// {Name: "Tag3"},
// {Name: "Tag4"},
// },
// Albums: []Album{
// {Name: "Album3"},
// {Name: "Album4"},
// },
// }
//
// mi3 := MediaItem{
// User: user3,
// EXIFDate: time.Now(),
// Latitude: "1234",
// Longitude: "1234",
// RelPath: "./1234.jpg",
// Tags: []Tag{
// {Name: "Tag4"},
// {Name: "Tag5"},
// },
// Albums: []Album{
// {Name: "Album1"},
// {Name: "Album7"},
// },
// }
//
// // db.Create(&user1)
// // db.Create(&user2)
// // db.Create(&user3)
// db.Create(&mi1)
// db.Create(&mi2)
// db.Create(&mi3)
// }

7
internal/db/errors.go Normal file
View File

@@ -0,0 +1,7 @@
package db
import "errors"
var (
ErrUserAlreadyExists = errors.New("user already exists")
)

25
internal/db/users.go Normal file
View File

@@ -0,0 +1,25 @@
package db
import (
"reichard.io/imagini/internal/models"
)
func CreateUser (user models.User) error {
err := db.Create(&user).Error
return err
}
func User (user models.User) (models.User, error) {
var foundUser models.User
var count int64
err := db.Where(&user).First(&foundUser).Count(&count).Error
return foundUser, err
}
func DeleteUser (user models.User) error {
return nil
}
func UpdatePassword (user models.User, pw string) {
}

View File

@@ -1,4 +1,4 @@
package db
package models
import (
"gorm.io/gorm"
@@ -14,11 +14,12 @@ type ServerSetting struct {
type User struct {
gorm.Model
Name string
Email string
Email string `gorm:"unique;not null"`
Username string `gorm:"unique;not null"`
FirstName string
LastName string
AuthType string
Salt string
HashedPWSalt string
HashedPassword string
}
type MediaItem struct {