// Copyright (C) 2018 Marius Schellenberger package db import ( "git.giftfish.de/ston1th/godrop/v2" "git.giftfish.de/ston1th/gowiki/pkg/cache" "git.giftfish.de/ston1th/gowiki/pkg/core" "git.giftfish.de/ston1th/gowiki/pkg/index" "git.giftfish.de/ston1th/gowiki/pkg/render" "git.giftfish.de/ston1th/gowiki/pkg/store" "io" "path/filepath" ) const ( defUser = "admin" defPassword = "gowiki" storeFile = "store.db" bcryptCost = 13 welcome = `# Welcome to GoWiki This is the [Index](/wiki/Index) page. You can customize it how you like.` ) const blevePath = "bleve" type DB struct { admin bool store store.Store cache *cache.Cache Index *index.Index } func New(cfg core.Config) (db *DB, err error) { db = &DB{admin: cfg.Admin, cache: cache.NewCache()} dbFile := filepath.Join(cfg.DataDir, storeFile) err = godrop.Unveil(dbFile, "rwc") if err != nil { return } db.store, err = store.NewBoltStore(dbFile, nil) if err != nil { return } db.Index, err = index.NewIndex(filepath.Join(cfg.DataDir, blevePath)) if err != nil { return } if db.UserExists(defUser) != nil { err = db.CreateUser(defUser, defPassword, true) if err != nil { return } } err = db.UnlockUser(defUser) if err != nil { return } _, err = db.CreatePage(core.IndexPage, core.WikiSection, welcome, defUser, core.Public) return } func (db *DB) Dump(w io.Writer) error { return db.store.Dump(w) } func (db *DB) Restore(r io.Reader) (err error) { err = db.store.Restore(r) if err != nil { return } err = db.store.ForEach(func(k string, _ []byte) error { if trim, ok := hasTrimPrefix(k, pagePrefix); ok { p := new(core.Page) db.store.Get(pagePrefix+trim, p) db.Index.Add(p.Title, p.StoreTitle, render.Render(p)) } return nil }) return } func (db *DB) Close() (err error) { err = db.store.Close() if err != nil { return } return db.Index.Close() }