PiwigoDirectoryUploader/internal/pkg/category/category.go

173 lines
4.6 KiB
Go
Raw Normal View History

/*
* Copyright (C) 2019 Philipp Haefelfinger (http://www.haefelfinger.ch/). All Rights Reserved.
* This application is licensed under GPLv2. See the LICENSE file in the root directory of the project.
*/
2019-04-02 21:58:54 +02:00
package category
import (
2019-02-25 23:51:18 +01:00
"errors"
2019-02-26 22:50:33 +01:00
"fmt"
2019-04-02 23:26:55 +02:00
"git.haefelfinger.net/piwigo/PiwigoDirectoryUploader/internal/pkg/datastore"
"git.haefelfinger.net/piwigo/PiwigoDirectoryUploader/internal/pkg/localFileStructure"
2019-03-11 21:45:46 +01:00
"git.haefelfinger.net/piwigo/PiwigoDirectoryUploader/internal/pkg/piwigo"
2019-03-02 00:21:01 +01:00
"github.com/sirupsen/logrus"
2019-02-26 22:50:33 +01:00
"path/filepath"
)
func SynchronizeCategories(filesystemNodes map[string]*localFileStructure.FilesystemNode, piwigoApi piwigo.PiwigoCategoryApi, db datastore.CategoryProvider) error {
logrus.Debug("Entering SynchronizeCategories...")
defer logrus.Debug("Leaving SynchronizeCategories...")
err := updatePiwigoCategoriesFromServer(piwigoApi, db)
if err != nil {
return err
}
logrus.Infoln("Adding missing categories to local db...")
err = addMissingPiwigoCategoriesToLocalDb(db, filesystemNodes)
if err != nil {
return err
}
return createMissingCategories(piwigoApi, db)
}
func addMissingPiwigoCategoriesToLocalDb(db datastore.CategoryProvider, fileSystemNodes map[string]*localFileStructure.FilesystemNode) error {
logrus.Debug("Entering addMissingPiwigoCategoriesToLocalDb...")
defer logrus.Debug("Leave addMissingPiwigoCategoriesToLocalDb...")
for _, file := range fileSystemNodes {
if !file.IsDir {
logrus.Tracef("%s: Skipping as no directory", file.Key)
continue
}
_, err := db.GetCategoryByKey(file.Key)
if err == nil {
logrus.Debugf("%s already exists.", file.Key)
continue
}
if err != datastore.ErrorRecordNotFound {
return err
}
logrus.Debugf("Creating missing category %s", file.Key)
category := datastore.CategoryData{
Key: file.Key,
Name: file.Name,
PiwigoParentId: 0,
PiwigoId: 0,
}
err = db.SaveCategory(category)
if err != nil {
return err
}
}
return nil
}
func updatePiwigoCategoriesFromServer(piwigoApi piwigo.PiwigoCategoryApi, db datastore.CategoryProvider) error {
logrus.Debug("Entering updatePiwigoCategoriesFromServer")
defer logrus.Debug("Leaving updatePiwigoCategoriesFromServer")
2019-04-04 08:54:35 +02:00
categories, err := piwigoApi.GetAllCategories()
if err != nil {
return err
}
2019-04-06 00:00:01 +02:00
for _, pwgCat := range categories {
dbCat, err := db.GetCategoryByPiwigoId(pwgCat.Id)
if err == datastore.ErrorRecordNotFound {
2019-04-06 00:00:01 +02:00
logrus.Debugf("Adding category %s", pwgCat.Key)
dbCat = datastore.CategoryData{
PiwigoId: pwgCat.Id,
}
} else if err != nil {
return err
2019-04-04 08:54:35 +02:00
}
2019-04-06 00:00:01 +02:00
if dbCat.Name == pwgCat.Name && dbCat.Key == pwgCat.Key && dbCat.PiwigoParentId == pwgCat.ParentId {
logrus.Debugf("No changes for category %s", dbCat.Key)
continue
}
2019-04-06 00:00:01 +02:00
dbCat.Name = pwgCat.Name
dbCat.Key = pwgCat.Key
dbCat.PiwigoParentId = pwgCat.ParentId
2019-04-06 00:00:01 +02:00
err = db.SaveCategory(dbCat)
2019-04-04 08:54:35 +02:00
if err != nil {
return err
}
}
return nil
2019-04-02 23:26:55 +02:00
}
func createMissingCategories(piwigoApi piwigo.PiwigoCategoryApi, db datastore.CategoryProvider) error {
logrus.Debug("Entering createMissingCategories...")
defer logrus.Debug("Leaving createMissingCategories...")
missingCategories, err := db.GetCategoriesToCreate()
if err != nil {
return err
}
if len(missingCategories) == 0 {
logrus.Info("No categories missing on piwigo.")
return nil
}
logrus.Infof("Creating %d categories", len(missingCategories))
for _, category := range missingCategories {
logrus.Infof("Creating category %s", category.Key)
2019-02-26 22:50:33 +01:00
parentId, err := getParentId(category, db)
2019-02-26 22:50:33 +01:00
if err != nil {
return err
}
2019-02-25 23:51:18 +01:00
// create category on piwigo
id, err := piwigoApi.CreateCategory(parentId, category.Name)
2019-02-26 22:50:33 +01:00
if err != nil {
return errors.New(fmt.Sprintf("Could not create category on piwigo: %s", err))
}
2019-02-25 23:51:18 +01:00
// update local category information
category.PiwigoId = id
category.PiwigoParentId = parentId
err = db.SaveCategory(category)
if err != nil {
return err
}
2019-02-26 22:50:33 +01:00
}
2019-02-25 23:51:18 +01:00
2019-02-26 22:51:42 +01:00
return nil
2019-02-26 22:50:33 +01:00
}
2019-02-25 23:51:18 +01:00
func getParentId(category datastore.CategoryData, db datastore.CategoryProvider) (int, error) {
if category.Key == "" || category.Key == "." {
msg := fmt.Sprintf("Category with id %d has a invalid value in the keyfield!", category.CategoryId)
logrus.Warnf(msg)
return 0, errors.New(msg)
}
parentKey := filepath.Dir(category.Key)
if category.Name == parentKey || parentKey == "." || parentKey == "" {
logrus.Debugf("The category %s is a root category, there is no parent", category.Name)
return 0, nil
2019-02-26 22:50:33 +01:00
}
2019-02-25 23:51:18 +01:00
2019-02-26 22:50:33 +01:00
logrus.Debugf("Looking up parent with key %s", parentKey)
parentCategory, err := db.GetCategoryByKey(parentKey)
if err != nil {
return 0, err
}
return parentCategory.PiwigoId, nil
}