From e6faf9478aab0e9958e43b5b0a2987698cdba480 Mon Sep 17 00:00:00 2001 From: Derek Stevens Date: Tue, 15 Nov 2022 20:43:09 -0700 Subject: [PATCH] models: add Table model; mongodb/adapter: finish implementing adapter --- models/models.go | 10 +++ mongodb/adapter.go | 148 ++++++++++++++++++++++++++++++++++----------- 2 files changed, 123 insertions(+), 35 deletions(-) diff --git a/models/models.go b/models/models.go index d8ec063..912c890 100644 --- a/models/models.go +++ b/models/models.go @@ -19,7 +19,17 @@ type DiceRoll struct { type Token struct { Id string + Name string SpriteUri string X int Y int } + +type Table struct { + Name string + Passcode string + MapImageUrl string + DiceRolls []DiceRoll + Tokens []Token + AvailableTokens []Token +} diff --git a/mongodb/adapter.go b/mongodb/adapter.go index e84eb5d..afd7a3f 100644 --- a/mongodb/adapter.go +++ b/mongodb/adapter.go @@ -26,14 +26,15 @@ type DbAdapter interface { 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) + AddToken(table models.TableKey, token models.Token, active boolean) error + RemoveToken(table models.TableKey, tokenId string, active boolean) error + ModifyToken(table models.TableKey, token models.Token, active boolean) error + GetTokens(table models.TableKey, active boolean) ([]models.Token, error) } type DbEngine struct { client mongo.Client + db mongo.Database } func (self *DbEngine) mkCtx(timeoutSec int) context.Context { @@ -52,9 +53,9 @@ func (self *DbEngine) Init(mongoUri string) error { if err != nil { return err } - defer client.Disconnect(ctx) db := client.Database("felt") + self.db = db err = self.ensureCollections(db) return err @@ -90,9 +91,10 @@ func (self *DbEngine) CreateTable(table models.TableKey) error { _, err := tables.InsertOne(self.mkCtx(10), bson.D{ {"name", table.Name}, {"passcode", table.Passcode}, - {"mapUri", ""}, + {"mapImageUrl", ""}, {"diceRolls", bson.A{}}, {"tokens", bson.A{}}, + {"availableTokens", bson.A{}}, }) return err } @@ -115,7 +117,7 @@ func (self *DbEngine) DestroyTable(table models.TableKey) error { func (self *DbEngine) InsertDiceRoll(table models.TableKey, diceRoll models.DiceRoll) error { tables := self.db.Collection("tables") if tables != nil { - var result bson.D + var result models.Table err := tables.FindOneAndUpdate( self.mkCtx(10), bson.D{ @@ -139,19 +141,15 @@ func (self *DbEngine) InsertDiceRoll(table models.TableKey, diceRoll models.Dice func (self *DbEngine) GetDiceRolls(table models.TableKey) ([]models.DiceRoll, error) { tables := self.db.Colletion("tables") if tables != nil { - fromDb := tables.findOne( + var result models.Table + err := tables.findOne( self.mkCtx(10), bson.D{ {"name", table.Name}, {"passcode", table.Passcode}, - }) - if fromDb != nil { - rolls, ok := fromDb.Lookup("diceRolls").ArrayOK() - if ok { - return rolls, nil - } else { - return "", errors.New(fmt.Sprintf(errNoArray, "tables", table.Name, "diceRolls")) - } + }).Decode(&result) + if err == nil { + return result.DiceRolls, nil } else { return "", errors.New(fmt.Sprintf(errNoDocument, table.Name, "tables")) } @@ -162,7 +160,7 @@ func (self *DbEngine) GetDiceRolls(table models.TableKey) ([]models.DiceRoll, er func (self *DbEngine) SetMapImageUrl(table models.TableKey, url string) error { tables := self.db.Collection("tables") if tables != nil { - var result bson.D + var result models.Table err := tables.FindOneAndUpdate( self.mkCtx(10), bson.D{ @@ -183,19 +181,15 @@ func (self *DbEngine) SetMapImageUrl(table models.TableKey, url string) error { func (self *DbEngine) GetMapImageUrl(table models.TableKey) (string, error) { tables := self.db.Collection("tables") if tables != nil { - fromDb := tables.FindOne( + var result models.Table + err := tables.FindOne( self.mkCtx(10), bson.D{ {"name", table.Name}, {"passcode", table.Passcode}, - }) - if fromDb != nil { - url, ok := fromDb.Lookup("mapUri").StringValueOK() - if ok { - return url, nil - } else { - return "", errors.New(fmt.Sprintf(errNotAString, "table", table.Name, "mapUri")) - } + }).Decode(&result) + if err == nil { + return result.MapImageUrl, nil } else { return "", errors.New(fmt.Sprintf(errNoDocument, table.Name, "tables")) } @@ -204,17 +198,101 @@ func (self *DbEngine) GetMapImageUrl(table models.TableKey) (string, error) { return "", errors.New(fmt.Sprintf(errNoCollection, "tables")) } -func (self *DbEngine) AddToken(table models.TableKey, token models.Token) error { - return nil +func (self *DbEngine) AddToken(table models.TableKey, token models.Token, active boolean) error { + tables := self.db.Collection("tables") + if tables != nil { + tokenArrKey := "tokens" + if !active { + tokenArrKey = "availableTokens" + } + var result models.Table + err := tables.FindOneAndUpdate( + self.mkCtx(10), + bson.D{ + {"name", table.Name}, + {"passcode", table.Passcode}, + }, + bson.D{ + {"$push", bson.D{tokenArrKey, token}}, + }, + ).Decode(&result) + return err + } + return errors.New(fmt.Sprintf(errNoCollection, "tables")) } -func (self *DbEngine) RemoveToken(table models.TableKey, tokenId string) error { - return nil -} -func (self *DbEngine) ModifyToken(table models.TableKey, token models.Token) error { - return nil +func (self *DbEngine) RemoveToken(table models.TableKey, tokenId string, active boolean) error { + tables := self.db.Collection("tables") + if tables != nil { + tokenArrKey := "tokens" + if !active { + tokenArrKey = "availableTokens" + } + var result models.Table + err := tables.FindOneAndUpdate( + self.mkCtx(10), + bson.D{ + {"name", table.Name}, + {"passcode", table.Passcode}, + }, + bson.D{ + {"$pull", bson.D{tokenArrKey, bson.D{"_id", tokenId}}}, + }, + ).Decode(&result) + return err + } + return errors.New(fmt.Sprintf(errNoCollection, "tables")) } -func (self *DbEngine) GetTokens(table models.TableKey) ([]models.Token, error) { - return []models.Token{}, nil +func (self *DbEngine) ModifyToken(table models.TableKey, token models.Token, active boolean) error { + tables := self.db.Collection("tables") + if tables != nil { + tokenArrKey := "tokens" + if !active { + tokenArrKey = "availableTokens" + } + var result models.Table + err := tables.FindOneAndUpdate( + self.mkCtx(10), + bson.D{ + {"name", table.Name}, + {"passcode", table.Passcode}, + {tokenArrKey, bson.D{"_id", tokenId}}, + }, + bson.D{ + {"$set", bson.D{tokenArrKey + ".$", bson.D{ + {"name", token.Name}, + {"spriteUri", token.SpriteUri}, + {"x", token.X}, + {"y", token.Y}, + }}}, + }, + ).Decode(&result) + return err + } + return errors.New(fmt.Sprintf(errNoCollection, "tables")) +} + +func (self *DbEngine) GetTokens(table models.TableKey, active boolean) ([]models.Token, error) { + tables := self.db.Collection("tables") + if tables != nil { + var result models.Table + err := tables.FindOne( + self.mkCtx(10), + bson.D{ + {"name", table.Name}, + {"passcode", table.Passcode}, + }).Decode(&result) + if err == nil { + if active { + return result.Tokens + } else { + return result.AvailableTokens + } + } else { + return nil, errors.New(fmt.Sprintf(errNoDocument, table.Name, "tables")) + } + } + + return nil, errors.New(fmt.Sprintf(errNoCollection, "tables")) }