moved app types to appContext.go and added some methods

moved piwigo login from app.go to piwigoContext.go
Updated visibility of some types
Added first elements of the local data store including configuration on startup and flag
yea yea... I know, the commit contains to many changes ;-)
This commit is contained in:
Philipp Häfelfinger 2019-03-12 23:44:05 +01:00
parent eae6db1683
commit 5a4c133f27
7 changed files with 138 additions and 63 deletions

View File

@ -1,7 +1,6 @@
package app package app
import ( import (
"errors"
"flag" "flag"
"git.haefelfinger.net/piwigo/PiwigoDirectoryUploader/internal/pkg/localFileStructure" "git.haefelfinger.net/piwigo/PiwigoDirectoryUploader/internal/pkg/localFileStructure"
"git.haefelfinger.net/piwigo/PiwigoDirectoryUploader/internal/pkg/piwigo" "git.haefelfinger.net/piwigo/PiwigoDirectoryUploader/internal/pkg/piwigo"
@ -11,6 +10,7 @@ import (
var ( var (
imagesRootPath = flag.String("imagesRootPath", "", "This is the images root path that should be mirrored to piwigo.") imagesRootPath = flag.String("imagesRootPath", "", "This is the images root path that should be mirrored to piwigo.")
sqliteDb = flag.String("sqliteDb", "", "The connection string to the sql lite database file.")
piwigoUrl = flag.String("piwigoUrl", "", "The root url without tailing slash to your piwigo installation.") piwigoUrl = flag.String("piwigoUrl", "", "The root url without tailing slash to your piwigo installation.")
piwigoUser = flag.String("piwigoUser", "", "The username to use during sync.") piwigoUser = flag.String("piwigoUser", "", "The username to use during sync.")
piwigoPassword = flag.String("piwigoPassword", "", "This is password to the given username.") piwigoPassword = flag.String("piwigoPassword", "", "This is password to the given username.")
@ -18,17 +18,17 @@ var (
) )
func Run() { func Run() {
context, err := configureContext() context, err := createAppContext()
if err != nil { if err != nil {
logErrorAndExit(err, 1) logErrorAndExit(err, 1)
} }
err = loginToPiwigoAndConfigureContext(context) err = context.piwigo.LoginToPiwigoAndConfigureContext()
if err != nil { if err != nil {
logErrorAndExit(err, 2) logErrorAndExit(err, 2)
} }
filesystemNodes, err := localFileStructure.ScanLocalFileStructure(context.LocalRootPath) filesystemNodes, err := localFileStructure.ScanLocalFileStructure(context.localRootPath)
if err != nil { if err != nil {
logErrorAndExit(err, 3) logErrorAndExit(err, 3)
} }
@ -48,49 +48,7 @@ func Run() {
logErrorAndExit(err, 6) logErrorAndExit(err, 6)
} }
_ = piwigo.Logout(context.Piwigo) _ = piwigo.Logout(context.piwigo)
}
func configureContext() (*appContext, error) {
logrus.Infoln("Preparing application context and configuration")
if *piwigoUrl == "" {
return nil, errors.New("missing piwigo url!")
}
if *piwigoUser == "" {
return nil, errors.New("missing piwigo user!")
}
if *piwigoPassword == "" {
return nil, errors.New("missing piwigo password!")
}
context := new(appContext)
context.LocalRootPath = *imagesRootPath
context.Piwigo = new(piwigo.PiwigoContext)
err := context.Piwigo.Initialize(*piwigoUrl, *piwigoUser, *piwigoPassword, *piwigoUploadChunkSizeInKB)
return context, err
}
func loginToPiwigoAndConfigureContext(context *appContext) error {
logrus.Infoln("Logging in to piwigo and getting chunk size configuration for uploads")
err := piwigo.Login(context.Piwigo)
if err != nil {
return err
}
return initializeUploadChunkSize(context)
}
func initializeUploadChunkSize(context *appContext) error {
userStatus, err := piwigo.GetStatus(context.Piwigo)
if err != nil {
return err
}
context.ChunkSizeBytes = userStatus.Result.UploadFormChunkSize * 1024
logrus.Debugln(context.ChunkSizeBytes)
return nil
} }
func logErrorAndExit(err error, exitCode int) { func logErrorAndExit(err error, exitCode int) {

View File

@ -0,0 +1,63 @@
package app
import (
"errors"
"git.haefelfinger.net/piwigo/PiwigoDirectoryUploader/internal/pkg/piwigo"
"github.com/sirupsen/logrus"
)
type appContext struct {
piwigo *piwigo.PiwigoContext
sessionId string
localRootPath string
dataStore localDataStore
}
func (c *appContext) UseMetadataStore(connectionString string) error {
if connectionString == "" {
return errors.New("missing connectionString to use metadata store!")
}
logrus.Infof("Using SQL Lite data store with '%s'", connectionString)
c.dataStore = localDataStore{}
err := c.dataStore.Open(connectionString)
return err
}
func (c *appContext) UsePiwigo(url string, user string, password string) error {
if url == "" {
return errors.New("missing piwigo url!")
}
if user == "" {
return errors.New("missing piwigo user!")
}
if password == "" {
return errors.New("missing piwigo password!")
}
c.piwigo = new(piwigo.PiwigoContext)
return c.piwigo.Initialize(*piwigoUrl, *piwigoUser, *piwigoPassword, *piwigoUploadChunkSizeInKB)
}
func createAppContext() (*appContext, error) {
logrus.Infoln("Preparing application context and configuration")
context := new(appContext)
context.localRootPath = *imagesRootPath
if *sqliteDb != "" {
err := context.UseMetadataStore(*sqliteDb)
if err != nil {
return nil, err
}
} else {
logrus.Warnln("No persistence configured. Skipping metadata storage. This might affect performance on large collections!")
}
err := context.UsePiwigo(*piwigoUrl, *piwigoUser, *piwigoPassword)
return context, err
}

View File

@ -12,7 +12,7 @@ import (
func getAllCategoriesFromServer(context *appContext) (map[string]*piwigo.PiwigoCategory, error) { func getAllCategoriesFromServer(context *appContext) (map[string]*piwigo.PiwigoCategory, error) {
logrus.Debugln("Starting GetAllCategories") logrus.Debugln("Starting GetAllCategories")
categories, err := piwigo.GetAllCategories(context.Piwigo) categories, err := piwigo.GetAllCategories(context.piwigo)
return categories, err return categories, err
} }
@ -66,7 +66,7 @@ func createMissingCategories(context *appContext, missingCategories []string, ex
} }
// create category on piwigo // create category on piwigo
id, err := piwigo.CreateCategory(context.Piwigo, parentId, name) id, err := piwigo.CreateCategory(context.piwigo, parentId, name)
if err != nil { if err != nil {
return errors.New(fmt.Sprintf("Could not create category on piwigo: %s", err)) return errors.New(fmt.Sprintf("Could not create category on piwigo: %s", err))
} }

47
internal/app/datastore.go Normal file
View File

@ -0,0 +1,47 @@
package app
import (
"errors"
"time"
)
type ImageMetaData struct {
ImageId int
RelativeImagePath string
Filename string
Md5Sum string
LastChange time.Time
CategoryPath string
CategoryId int
}
type ImageMetadataLoader interface {
GetImageMetadata(relativePath string) (ImageMetaData, error)
}
type ImageMetadataSaver interface {
SaveImageMetadata(m ImageMetaData) error
}
type localDataStore struct {
connectionString string
}
func (d *localDataStore) Open(connectionString string) error {
if connectionString == "" {
return errors.New("connection string could not be empty.")
}
d.connectionString = connectionString
//TODO: open and test connection
return nil
}
func (d *localDataStore) GetImageMetadata(relativePath string) (ImageMetaData, error) {
return ImageMetaData{}, nil
}
func (d *localDataStore) SaveImageMetadata(m ImageMetaData) error {
return nil
}

View File

@ -40,7 +40,7 @@ func findMissingImages(context *appContext, imageFiles []*localFileStructure.Ima
files = append(files, file.Md5Sum) files = append(files, file.Md5Sum)
} }
misingSums, err := piwigo.ImageUploadRequired(context.Piwigo, files) misingSums, err := piwigo.ImageUploadRequired(context.piwigo, files)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -67,7 +67,7 @@ func uploadImages(context *appContext, missingFiles []*localFileStructure.ImageN
for _, file := range missingFiles { for _, file := range missingFiles {
categoryId := existingCategories[file.CategoryName].Id categoryId := existingCategories[file.CategoryName].Id
imageId, err := piwigo.UploadImage(context.Piwigo, file.Path, file.Md5Sum, categoryId) imageId, err := piwigo.UploadImage(context.piwigo, file.Path, file.Md5Sum, categoryId)
if err != nil { if err != nil {
return err return err
} }

View File

@ -1,12 +0,0 @@
package app
import (
"git.haefelfinger.net/piwigo/PiwigoDirectoryUploader/internal/pkg/piwigo"
)
type appContext struct {
Piwigo *piwigo.PiwigoContext
SessionId string
LocalRootPath string
ChunkSizeBytes int
}

View File

@ -47,6 +47,15 @@ func (context *PiwigoContext) Initialize(baseUrl string, username string, passwo
return nil return nil
} }
func (context *PiwigoContext) LoginToPiwigoAndConfigureContext() error {
logrus.Infoln("Logging in to piwigo and getting chunk size configuration for uploads")
err := Login(context)
if err != nil {
return err
}
return initializeUploadChunkSize(context)
}
func (context *PiwigoContext) getChunkSizeInKB() int { func (context *PiwigoContext) getChunkSizeInKB() int {
return context.chunkSizeInKB return context.chunkSizeInKB
} }
@ -72,3 +81,13 @@ func (context *PiwigoContext) initializeCookieJarIfRequired() {
jar, _ := cookiejar.New(&options) jar, _ := cookiejar.New(&options)
context.Cookies = jar context.Cookies = jar
} }
func initializeUploadChunkSize(context *PiwigoContext) error {
userStatus, err := GetStatus(context)
if err != nil {
return err
}
context.chunkSizeInKB = userStatus.Result.UploadFormChunkSize * 1024
logrus.Debugf("Got chunksize of %d KB from server.", context.chunkSizeInKB)
return nil
}