PiwigoDirectoryUploader/internal/app/category.go

101 lines
3.1 KiB
Go
Raw Normal View History

package app
import (
2019-02-25 23:51:18 +01:00
"errors"
2019-02-26 22:50:33 +01:00
"fmt"
"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"
"sort"
)
func getAllCategoriesFromServer(piwigoApi piwigo.PiwigoCategoryApi) (map[string]*piwigo.PiwigoCategory, error) {
logrus.Debugln("Starting GetAllCategories")
categories, err := piwigoApi.GetAllCategories()
return categories, err
}
func synchronizeCategories(piwigoApi piwigo.PiwigoCategoryApi, filesystemNodes map[string]*localFileStructure.FilesystemNode, existingCategories map[string]*piwigo.PiwigoCategory) error {
logrus.Infoln("Synchronizing categories...")
missingCategories := findMissingCategories(filesystemNodes, existingCategories)
if len(missingCategories) == 0 {
logrus.Infof("No categories missing!")
return nil
}
return createMissingCategories(piwigoApi, missingCategories, existingCategories)
}
2019-03-11 21:45:46 +01:00
func findMissingCategories(fileSystem map[string]*localFileStructure.FilesystemNode, existingCategories map[string]*piwigo.PiwigoCategory) []string {
2019-02-27 23:26:18 +01:00
missingCategories := make([]string, 0, len(fileSystem))
for _, file := range fileSystem {
if !file.IsDir {
continue
}
_, exists := existingCategories[file.Key]
2019-02-26 00:00:21 +01:00
if exists {
logrus.Debugf("Found existing category %s", file.Key)
} else {
logrus.Infof("Missing category detected %s", file.Key)
missingCategories = append(missingCategories, file.Key)
}
}
return missingCategories
}
func createMissingCategories(piwigoApi piwigo.PiwigoCategoryApi, missingCategories []string, existingCategories map[string]*piwigo.PiwigoCategory) error {
// we sort them to make sure the categories gets created
// in the right order and we have the parent available while creating the children
sort.Strings(missingCategories)
logrus.Infof("Creating %d categories", len(missingCategories))
2019-02-26 22:50:33 +01:00
for _, categoryKey := range missingCategories {
logrus.Infof("Creating category %s", categoryKey)
name, parentId, err := getNameAndParentId(categoryKey, existingCategories)
if err != nil {
return err
}
2019-02-25 23:51:18 +01:00
// create category on piwigo
id, err := piwigoApi.CreateCategory(parentId, 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
2019-03-11 21:45:46 +01:00
newCategory := piwigo.PiwigoCategory{Id: id, Name: name, ParentId: parentId, Key: categoryKey}
2019-02-26 22:50:33 +01:00
logrus.Println(newCategory)
existingCategories[newCategory.Key] = &newCategory
}
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
2019-03-11 21:45:46 +01:00
func getNameAndParentId(category string, categories map[string]*piwigo.PiwigoCategory) (string, int, error) {
2019-02-26 22:50:33 +01:00
parentKey := filepath.Dir(category)
_, name := filepath.Split(category)
if name == category {
logrus.Debugf("The category %s is a root category, there is no parent", name)
return name, 0, nil
}
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)
parent, exists := categories[parentKey]
if !exists {
return "", 0, errors.New(fmt.Sprintf("could not find parent with key %s", parentKey))
}
2019-02-26 22:50:33 +01:00
parentId := parent.Id
logrus.Debugf("Found parent %s with id %d", parentKey, parentId)
return name, parentId, nil
}