From f6ad0602c252b6e19b5a18da2e9c07fe58d30440 Mon Sep 17 00:00:00 2001 From: Gisle Aune Date: Sun, 16 Jun 2019 11:39:33 +0200 Subject: [PATCH] Replaced repositories.Bundle with a database interface. --- .idea/inspectionProfiles/Project_Default.xml | 15 ++++++ cmd/rpdata-server/main.go | 10 ++-- database/database.go | 13 ++++- database/mongodb/db.go | 51 ++++++++++++++------ repositories/repository.go | 7 --- services/services.go | 12 ++--- 6 files changed, 73 insertions(+), 35 deletions(-) diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 1b22473..3d76ca0 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -2,5 +2,20 @@ \ No newline at end of file diff --git a/cmd/rpdata-server/main.go b/cmd/rpdata-server/main.go index e235cb6..888ddbc 100644 --- a/cmd/rpdata-server/main.go +++ b/cmd/rpdata-server/main.go @@ -28,17 +28,17 @@ func main() { log.Fatalln("Failed to init store:", err) } - repos, stopFn, err := database.Init(config.Global().Database) + db, err := database.Init(config.Global().Database) if err != nil { log.Fatalln("Failed to init db:", err) } - defer stopFn() - services := services.NewBundle(repos) + defer db.Close(context.Background()) + serviceBundle := services.NewBundle(db) instrumentation.Register() http.Handle("/", handler.Playground("RPData API", "/graphql")) - http.Handle("/graphql", queryHandler(services)) + http.Handle("/graphql", queryHandler(serviceBundle)) http.Handle("/metrics", promhttp.Handler()) @@ -51,7 +51,7 @@ func main() { log.Println("Characters updated") }() - go logListedChanges(services.Changes) + go logListedChanges(serviceBundle.Changes) log.Fatal(http.ListenAndServe(":8081", nil)) } diff --git a/database/database.go b/database/database.go index 8aea3d5..3fddf49 100644 --- a/database/database.go +++ b/database/database.go @@ -1,6 +1,7 @@ package database import ( + "context" "errors" "git.aiterp.net/rpdata/api/database/mongodb" @@ -11,12 +12,20 @@ import ( // ErrDriverUnrecognized is returned if the driver is not recognized var ErrDriverUnrecognized = errors.New("Driver not recognized, check your config or update rpdata") +type Database interface { + Changes() repositories.ChangeRepository + Characters() repositories.CharacterRepository + Tags() repositories.TagRepository + + Close(ctx context.Context) error +} + // Init sets up the database. -func Init(config config.Database) (bundle *repositories.Bundle, closeFn func() error, err error) { +func Init(config config.Database) (Database, error) { switch config.Driver { case "mongo", "mgo", "mongodb": return mongodb.Init(config) default: - return nil, nil, ErrDriverUnrecognized + return nil, ErrDriverUnrecognized } } diff --git a/database/mongodb/db.go b/database/mongodb/db.go index 5a19e03..647df3a 100644 --- a/database/mongodb/db.go +++ b/database/mongodb/db.go @@ -1,6 +1,7 @@ package mongodb import ( + "context" "fmt" "github.com/globalsign/mgo/bson" "time" @@ -10,8 +11,33 @@ import ( "github.com/globalsign/mgo" ) +type MongoDB struct { + session *mgo.Session + + changes repositories.ChangeRepository + characters repositories.CharacterRepository + tags repositories.TagRepository +} + +func (m *MongoDB) Changes() repositories.ChangeRepository { + return m.changes +} + +func (m *MongoDB) Characters() repositories.CharacterRepository { + return m.characters +} + +func (m *MongoDB) Tags() repositories.TagRepository { + return m.tags +} + +func (m *MongoDB) Close(ctx context.Context) error { + m.session.Close() + return nil +} + // Init initializes the mongodb database -func Init(cfg config.Database) (bundle *repositories.Bundle, closeFn func() error, err error) { +func Init(cfg config.Database) (*MongoDB, error) { port := cfg.Port if port <= 0 { port = 27017 @@ -27,7 +53,7 @@ func Init(cfg config.Database) (bundle *repositories.Bundle, closeFn func() erro Source: cfg.Db, }) if err != nil { - return + return nil, err } db := session.DB(cfg.Db) @@ -35,27 +61,22 @@ func Init(cfg config.Database) (bundle *repositories.Bundle, closeFn func() erro characters, err := newCharacterRepository(db) if err != nil { session.Close() - return nil, nil, err + return nil, err } changes, err := newChangeRepository(db) if err != nil { session.Close() - return nil, nil, err + return nil, err } - bundle = &repositories.Bundle{ - Characters: characters, - Changes: changes, - Tags: newTagRepository(db), - } - - closeFn = func() error { - session.Close() - return nil - } + return &MongoDB{ + session: session, - return + changes: changes, + characters: characters, + tags: newTagRepository(db), + }, nil } type counter struct { diff --git a/repositories/repository.go b/repositories/repository.go index 1005c9a..8290aea 100644 --- a/repositories/repository.go +++ b/repositories/repository.go @@ -2,12 +2,5 @@ package repositories import "errors" -// A Bundle is a set of repositories. -type Bundle struct { - Characters CharacterRepository - Changes ChangeRepository - Tags TagRepository -} - // ErrNotFound should be returned instead of any database-specific not found error. var ErrNotFound = errors.New("Resource not found") diff --git a/services/services.go b/services/services.go index 23173c7..9d816dd 100644 --- a/services/services.go +++ b/services/services.go @@ -1,7 +1,7 @@ package services import ( - "git.aiterp.net/rpdata/api/repositories" + "git.aiterp.net/rpdata/api/database" "git.aiterp.net/rpdata/api/services/loaders" ) @@ -13,16 +13,16 @@ type Bundle struct { } // NewBundle creates a new bundle. -func NewBundle(repos *repositories.Bundle) *Bundle { +func NewBundle(db database.Database) *Bundle { bundle := &Bundle{} bundle.Changes = &ChangeService{ - changes: repos.Changes, + changes: db.Changes(), } - bundle.Tags = &TagService{tags: repos.Tags} + bundle.Tags = &TagService{tags: db.Tags()} bundle.Characters = &CharacterService{ - characters: repos.Characters, - loader: loaders.CharacterLoaderFromRepository(repos.Characters), + characters: db.Characters(), + loader: loaders.CharacterLoaderFromRepository(db.Characters()), changeService: bundle.Changes, }