unstable: initial tags
This commit is contained in:
parent
2e71b60248
commit
b3b62af3a4
28 changed files with 503 additions and 91 deletions
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
69
pkg/db/tags.go
Normal 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)
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue