unstable: initial tags

This commit is contained in:
ston1th 2019-08-20 23:57:43 +02:00
commit b3b62af3a4
28 changed files with 503 additions and 91 deletions

View file

@ -37,7 +37,14 @@ func New(cfg core.Config) (db *DB, err error) {
if err != nil && err != store.ErrKeyNotFound {
return
}
err = db.RunMigrations()
err = db.store.Get(versionKey, nil)
if err == store.ErrKeyNotFound {
err = db.addDefaultTags()
if err != nil {
return
}
}
err = db.runMigrations()
return
}

View file

@ -2,7 +2,12 @@
package db
import "crypto/sha256"
import (
"crypto/sha256"
"regexp"
)
var nameRe = regexp.MustCompile("[^a-zA-Z0-9]+")
// Parts taken from strings.TrimPrefix
func hasTrimPrefix(s, prefix string) (string, bool) {

View file

@ -49,24 +49,35 @@ func (db *DB) DeleteID(path string) error {
return db.store.Delete(idPrefix + path)
}
func (db *DB) NewFile(id, path string) (err error) {
func (db *DB) NewFile(id, path string, tags []string) (err error) {
err = db.store.Set(idPrefix+path, id)
if err != nil {
return
}
err = db.store.Set(pathPrefix+id, path)
return
if err != nil {
return
}
return db.SetTag(path, tags)
}
func (db *DB) MoveFile(op, np string) error {
func (db *DB) MoveFile(op, np string) (err error) {
if !db.IsIndexed(op) {
return nil
}
id, err := db.DeleteFile(op)
if err != nil {
return err
return
}
return db.NewFile(id, np)
tags, err := db.GetTag(op)
if err != nil {
return
}
err = db.NewFile(id, np, tags)
if err != nil {
return
}
return db.UnsetTag(op)
}
func (db *DB) DeleteFile(path string) (id string, err error) {
@ -81,6 +92,10 @@ func (db *DB) DeleteFile(path string) (id string, err error) {
if err != nil {
return
}
err = db.UnsetTag(path)
if err != nil {
return
}
err = db.DeletePath(id)
return
}

View file

@ -9,18 +9,25 @@ import (
const (
versionKey = "version/version"
currentVersion = 1
currentVersion = 2
)
type migrator func(*DB) (int, error)
type migrator func(*DB) error
var migrators = []migrator{
func(db *DB) (int, error) {
return 0, nil
func(db *DB) error {
return nil
},
func(db *DB) error {
// dummy placeholder
return nil
},
func(db *DB) error {
return db.addDefaultTags()
},
}
func (db *DB) RunMigrations() (err error) {
func (db *DB) runMigrations() (err error) {
var version int
err = db.store.Get(versionKey, &version)
if err == store.ErrKeyNotFound {
@ -37,11 +44,11 @@ func (db *DB) RunMigrations() (err error) {
for version < currentVersion {
v := version + 1
log.Printf("db: running migration %d", v)
version, err = migrators[v](db)
err = migrators[v](db)
if err != nil {
return
}
err = db.store.Set(versionKey, version)
err = db.store.Set(versionKey, v)
if err != nil {
return
}

69
pkg/db/tags.go Normal file
View file

@ -0,0 +1,69 @@
// Copyright (C) 2019 Marius Schellenberger
package db
import (
"git.giftfish.de/ston1th/docstore/pkg/core"
"regexp"
)
const (
tagsPrefix = "tags/"
tagPrefix = "tag/"
)
var defaultTags = []core.Tag{
{"invoice", `(?i)[^e]rechnung|quittung|beleg|invoice|bill|check`},
{"tax", `(?i)steuer|lohn|tax|salary`},
{"contract", `(?i)vertrag|kündigung|vereinbarung|contract|termination|agreement`},
{"insurance", `(?i)versicherung|versichert|insurance|insured`},
}
func (db *DB) addDefaultTags() (err error) {
for _, t := range defaultTags {
err = db.NewTag(t.Name, t.Regex)
if err != nil {
return
}
}
return
}
func (db *DB) GetAllTags() (tags []core.Tag, err error) {
err = db.store.ForEachPrefix(tagsPrefix, func(k string, _ []byte) error {
var t core.Tag
err := db.store.Get(tagsPrefix+k, &t)
if err == nil {
tags = append(tags, t)
}
return nil
})
return
}
func (db *DB) DeleteTag(name string) error {
return db.store.Delete(tagsPrefix + name)
}
func (db *DB) NewTag(name, regex string) (err error) {
_, err = regexp.Compile(regex)
if err != nil {
return
}
name = nameRe.ReplaceAllString(name, "")
err = db.store.Set(tagsPrefix+name, core.Tag{name, regex})
return
}
func (db *DB) GetTag(path string) (tags []string, err error) {
err = db.store.Get(tagPrefix+path, &tags)
return
}
func (db *DB) SetTag(path string, tags []string) error {
return db.store.Set(tagPrefix+path, tags)
}
func (db *DB) UnsetTag(path string) error {
return db.store.Delete(tagPrefix + path)
}

View file

@ -7,7 +7,6 @@ import (
"git.giftfish.de/ston1th/docstore/pkg/core"
"git.giftfish.de/ston1th/docstore/pkg/otp"
"golang.org/x/crypto/bcrypt"
"regexp"
"strings"
)
@ -20,8 +19,6 @@ var (
errWrongLogin = errors.New("db: wrong login")
errLocked = errors.New("db: user locked")
errUserExists = errors.New("db: user already exist")
userRe = regexp.MustCompile("[^a-zA-Z0-9]+")
)
func (db *DB) UserExists() (b bool) {
@ -53,7 +50,7 @@ func (db *DB) GetUser() (u core.User, err error) {
}
func (db *DB) CreateUser(username, password string) error {
username = userRe.ReplaceAllString(username, "")
username = nameRe.ReplaceAllString(username, "")
if db.UserExists() {
return errUserExists
}