felt/mongodb/adapter.go

77 lines
1.9 KiB
Go
Raw Normal View History

package dbengine
import (
"context"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"nilfm.cc/git/felt/models"
)
interface DbAdapter {
Init(mongoUri: string): error
CreateTable(table: models.TableKey): error
DestroyTable(table: models.TableKey): error
InsertDiceRoll(table: models.TableKey, diceRoll: models.DiceRoll): error
GetDiceRolls(table: models.TableKey): models.DiceRoll[], error
SetMapImageUrl(table: models.TableKey, url: string): error
GetMapImageUrl(table: models.TableKey): string, error
AddToken(table: models.TableKey, token: models.Token): error
RemoveToken(table: models.TableKey, tokenId: string): error
ModifyToken(table: models.TableKey, token: models.Token): error
GetTokens(table: models.TableKey): models.Token[], error
}
type DbEngine struct {
client: mongo.Client
}
func (self *DbEngine) Init(mongoUri: string) error {
client, err := mongo.NewClient(options.Client().ApplyURI(mongoUri))
if err != nil {
return err
}
self.client = client
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
err = client.Connect(ctx)
if err != nil {
return err
}
defer client.Disconnect(ctx)
db := client.Database("felt")
err = self.ensureCollections(db)
return err
}
func (self *DbEngine) ensureCollections(db: mongo.Database) error {
tables := db.Collection("tables")
if tables == nil {
createCmd := bson.D{
{"create", "tables"},
{"clusteredIndex", {
{"key", {"name"}},
{"unique", true},
{"name", "idx_tables_unique_names"}
}}
}
var createResult bson.M
err := db.RunCommand(
context.WithTimeout(context.Background(), 10*time.Second),
createCmd).Decode(&createResult)
if err != nil {
return err
}
}
return nil
}