Refactored database/IPFS code, fixed issues

pull/17/head
マリウス 3 years ago
parent 0a536393e5
commit a064e2fae0
No known key found for this signature in database
GPG Key ID: 272ED814BF63261F

1
.gitignore vendored

@ -1,3 +1,4 @@
/superhighway84
/*.log
/orbit*.db

@ -2,7 +2,6 @@ package database
import (
"context"
"log"
"sync"
orbitdb "berty.tech/go-orbit-db"
@ -57,38 +56,15 @@ func (db *Database)init() (error) {
return err
}
addr, err := db.OrbitDB.DetermineAddress(db.ctx, db.Name, "docstore", &orbitdb.DetermineAddressOptions{})
if err != nil {
return err
}
db.URI = addr.String()
// addr, err := db.OrbitDB.DetermineAddress(db.ctx, db.Name, "docstore", &orbitdb.DetermineAddressOptions{})
// if err != nil {
// return err
// }
// db.URI = addr.String()
storetype := "docstore"
db.Store, err = db.OrbitDB.Docs(db.ctx, db.Name, &orbitdb.CreateDBOptions{
AccessController: ac,
StoreSpecificOpts: documentstore.DefaultStoreOptsForMap("id"),
})
if err != nil {
return err
}
db.StoreEventChan = db.Store.Subscribe(db.ctx)
return nil
}
func (db *Database)open() (error) {
var err error
db.OrbitDB, err = orbitdb.NewOrbitDB(db.ctx, db.IPFSNode, &orbitdb.NewOrbitDBOptions{
Directory: &db.Cache,
})
if err != nil {
return err
}
create := false
storetype := "docstore"
dbstore, err := db.OrbitDB.Open(db.ctx, db.URI, &orbitdb.CreateDBOptions{
Create: &create,
StoreType: &storetype,
StoreSpecificOpts: documentstore.DefaultStoreOptsForMap("id"),
})
@ -96,12 +72,47 @@ func (db *Database)open() (error) {
return err
}
db.Store = dbstore.(orbitdb.DocumentStore)
db.StoreEventChan = db.Store.Subscribe(db.ctx)
return nil
}
// func (db *Database)open() (error) {
// var err error
//
// db.OrbitDB, err = orbitdb.NewOrbitDB(db.ctx, db.IPFSNode, &orbitdb.NewOrbitDBOptions{
// Directory: &db.Cache,
// Logger: db.Logger,
// })
// if err != nil {
// return err
// }
//
// ac := &accesscontroller.CreateAccessControllerOptions{
// Access: map[string][]string{
// "write": {
// "*",
// },
// },
// }
//
// // create := false
// storetype := "docstore"
// dbstore, err := db.OrbitDB.Docs(db.ctx, db.URI, &orbitdb.CreateDBOptions{
// AccessController: ac,
// // Create: &create,
// StoreType: &storetype,
// StoreSpecificOpts: documentstore.DefaultStoreOptsForMap("id"),
// })
// if err != nil {
// return err
// }
//
// db.Store = dbstore.(orbitdb.DocumentStore)
//
// db.StoreEventChan = db.Store.Subscribe(db.ctx)
// return nil
// }
func(db *Database) connectToPeers() error {
var wg sync.WaitGroup
@ -131,13 +142,14 @@ func NewDatabase(
dbURI string,
dbCache string,
dbInit bool,
dbName string,
logger *zap.Logger,
) (*Database, error) {
var err error
db := new(Database)
db.ctx = ctx
db.Name = "sync-test"
db.Name = dbName
db.Init = dbInit
db.URI = dbURI
db.Cache = dbCache
@ -160,26 +172,20 @@ func NewDatabase(
return db, nil
}
func (db *Database) Connect(onReady func()) (error) {
func (db *Database) Connect(onReady func(address string)) (error) {
var err error
if db.Init {
// if db.Init {
err = db.init()
if err != nil {
return err
}
} else {
err = db.open()
if err != nil {
return err
}
}
// log.Println(db.Store.ReplicationStatus().GetBuffered())
// log.Println(db.Store.ReplicationStatus().GetQueued())
// log.Println(db.Store.ReplicationStatus().GetProgress())
db.Logger.Info("running ...")
// } else {
// err = db.open()
// if err != nil {
// return err
// }
// }
// go func() {
err = db.connectToPeers()
@ -190,13 +196,20 @@ func (db *Database) Connect(onReady func()) (error) {
}
// }()
// log.Println(db.Store.ReplicationStatus().GetBuffered())
// log.Println(db.Store.ReplicationStatus().GetQueued())
// log.Println(db.Store.ReplicationStatus().GetProgress())
db.Logger.Info("running ...")
go func() {
for {
for ev := range db.StoreEventChan {
log.Printf("GOT EVENT %+v\n", ev)
db.Logger.Debug("got event", zap.Any("event", ev))
switch ev.(type) {
case *stores.EventReady:
onReady()
onReady(db.Store.Address().String())
}
}
}

@ -1,24 +1,34 @@
package main
import (
"context"
"embed"
"fmt"
"math/rand"
"time"
"log"
"os"
"github.com/mrusme/superhighway84/database"
"github.com/mrusme/superhighway84/models"
"github.com/mrusme/superhighway84/tui"
"go.uber.org/zap"
)
//go:embed superhighway84.jpeg
var EMBEDFS embed.FS
func NewLogger(filename string) (*zap.Logger, error) {
cfg := zap.NewProductionConfig()
cfg.OutputPaths = []string{
fmt.Sprintf("%s.log", filename),
}
return cfg.Build()
}
func main() {
// ctx, cancel := context.WithCancel(context.Background())
// defer cancel()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
dbInit := false
dbInitValue := os.Getenv("SUPERHIGHWAY84_DB_INIT")
@ -26,6 +36,11 @@ func main() {
dbInit = true
}
dbName := os.Getenv("SUPERHIGHWAY84_DB_NAME")
if dbInit == true && dbName == "" {
log.Panicln("SUPERHIGHWAY84_DB_NAME missing!")
}
dbURI := os.Getenv("SUPERHIGHWAY84_DB_URI")
if dbInit == false && dbURI == "" {
log.Panicln("SUPERHIGHWAY84_DB_URI missing!")
@ -36,59 +51,74 @@ func main() {
log.Panicln("SUPERHIGHWAY84_DB_CACHE missing!")
}
// logger, err := zap.NewDevelopment()
// if err != nil {
// log.Panicln(err)
// }
//
//
// db, err := database.NewDatabase(ctx, dbURI, dbCache, dbInit, logger)
// if err != nil {
// log.Panicln(err)
// }
// defer db.Disconnect()
// db.Connect(func() {
// //TUI.App.Stop()
// })
//
// articles, _ := db.ListArticles()
logger, err := NewLogger(os.Getenv("LOGFILE"))
if err != nil {
log.Panicln(err)
}
var articles []models.Article
mockGroups := []string{
"comp.test",
"news.conspiracy",
"sci.physics",
"talk.lolz",
"sci.chemistry",
"talk.random",
"alt.anarchism",
"alt.tv.simpsons",
TUI := tui.Init(&EMBEDFS)
TUI.ArticlesDatasource = &articles
db, err := database.NewDatabase(ctx, dbURI, dbCache, dbInit, dbName, logger)
if err != nil {
log.Panicln(err)
}
defer db.Disconnect()
err = db.Connect(func(address string) {
//TUI.App.Stop()
TUI.Views["mainscreen"].(*tui.Mainscreen).SetFooter(address)
articles, _ = db.ListArticles()
})
if err != nil {
log.Panicln(err)
}
// ======================== TESTING ===============================
go func() {
for i := 0; i < 100; i++ {
grp := mockGroups[(rand.Intn(len(mockGroups) - 1))]
time.Sleep(time.Millisecond * 250)
art1 := *models.NewArticle()
art1.Subject = fmt.Sprintf("A test in %s", grp)
art1.Body = "This is just a test article\nWhat's up there?"
art1.From = "test@example.com"
art1.Newsgroup = grp
articles = append(articles, art1)
}
}()
// var articles []models.Article
// mockGroups := []string{
// "comp.test",
// "news.conspiracy",
// "sci.physics",
// "talk.lolz",
// "sci.chemistry",
// "talk.random",
// "alt.anarchism",
// "alt.tv.simpsons",
// }
//
// go func() {
// var prev models.Article
// for i := 0; i < 100; i++ {
// grp := mockGroups[(rand.Intn(len(mockGroups) - 1))]
//
// time.Sleep(time.Millisecond * 250)
// art1 := *models.NewArticle()
// art1.Subject = fmt.Sprintf("A test in %s", grp)
// art1.Body = "This is just a test article\nWhat's up there?"
// art1.From = "test@example.com"
// art1.Newsgroup = grp
//
// if prev.Newsgroup == art1.Newsgroup {
// art1.InReplyToID = prev.ID
// art1.Subject = fmt.Sprintf("Re: %s", prev.Subject)
// }
//
// articles = append(articles, art1)
// prev = art1
// }
// }()
// ======================== /TESTING ==============================
TUI := tui.Init(&EMBEDFS, &articles)
// TUI.CallbackRefreshArticles = func() (error) {
// articles, err := db.ListArticles()
// return err
// }
TUI.CallbackRefreshArticles = func() (error) {
articles, err = db.ListArticles()
return err
}
TUI.CallbackSubmitArticle = func(article *models.Article) (error) {
// return db.SubmitArticle(article)
return nil
return db.SubmitArticle(article)
// return nil
}
go func() {

@ -39,16 +39,13 @@ type Mainscreen struct {
GroupsMap map[string]GroupMapEntry
GroupsList []string
ArticlesDatasource *[]models.Article
ArticlesList []*models.Article
}
func(t *TUI) NewMainscreen(articlesDatasource *[]models.Article) (*Mainscreen) {
func(t *TUI) NewMainscreen() (*Mainscreen) {
mainscreen := new(Mainscreen)
mainscreen.T = t
mainscreen.ArticlesDatasource = articlesDatasource
mainscreen.Groups = tview.NewList().
SetWrapAround(false).
ShowSecondaryText(false).
@ -132,7 +129,7 @@ func(mainscreen *Mainscreen) Refresh() {
Index: 0,
}
for _, article := range *mainscreen.ArticlesDatasource {
for _, article := range *mainscreen.T.ArticlesDatasource {
if selectedGroup == 0 ||
(selectedGroup != 0 &&
article.Newsgroup == previousGroupsList[selectedGroup]) {
@ -163,10 +160,10 @@ func(mainscreen *Mainscreen) Refresh() {
func (mainscreen *Mainscreen) HandleInput(event *tcell.EventKey) (*tcell.EventKey) {
switch event.Key() {
case tcell.KeyCtrlG:
case tcell.KeyCtrlG, tcell.KeyLeft:
mainscreen.T.App.SetFocus(mainscreen.Groups)
return nil
case tcell.KeyCtrlL:
case tcell.KeyCtrlL, tcell.KeyRight:
mainscreen.T.App.SetFocus(mainscreen.Articles)
return nil
case tcell.KeyRune:

@ -20,6 +20,8 @@ type TUI struct {
ModalVisible bool
ModalButtons map[string]ModalButton
ArticlesDatasource *[]models.Article
CallbackRefreshArticles func() (error)
CallbackSubmitArticle func(article *models.Article) (error)
}
@ -38,7 +40,7 @@ type ModalButton struct {
Callback func()
}
func Init(embedfs *embed.FS, articlesDatasource *[]models.Article) (*TUI) {
func Init(embedfs *embed.FS) (*TUI) {
t := new(TUI)
tview.Styles = tview.Theme{
@ -64,7 +66,7 @@ func Init(embedfs *embed.FS, articlesDatasource *[]models.Article) (*TUI) {
t.Views = make(map[string]View)
t.Views["splashscreen"] = t.NewSplashscreen(&logoBytes)
t.Views["mainscreen"] = t.NewMainscreen(articlesDatasource)
t.Views["mainscreen"] = t.NewMainscreen()
t.ModalVisible = false

Loading…
Cancel
Save