models: add Table model; mongodb/adapter: finish implementing adapter
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEkFh6dA+k/6CXFXU4O3+8IhROY5gFAmN0XE0ACgkQO3+8IhRO Y5gx6w/8Dri57dzw7hUyevqpvrp5x8IF9EeMUWX7MFEOQCrIjD+ftn4/0ilbiBMV 0pVdAle4fx9O6WnWLuV/zcZ7PfQpydj1oygf5ILTnAeK//U4MBRNgo/Ztqc+BbPn SUPb5opljeDLb92YFKVa9dIW3OWM67o5TtuSKnYESYaHELuEvoKy9iunf4PIFK2r Tu7MKAEZP7a1b/nvtd0J9SA4MMl1YsrazzxpTCk9xH/EI1G9JRR2KlVKGjGKloVV d6mFXoHNl34GdxyioBo0aXQhExUVKnjNIE0iyooeeot8UbjgsIEk++Jqi7PsCzF8 Sh+ulUyBeuvbWKxsv/QjyhVg/lORbh5pwNQ2/OWC2cOitAkHyhTCm5efo0GHrVSR XjH5m3y/PpxfyXArNH4D2Tt+VPRkXKrKn7a8/sVQJ0SzMMeN8n9XJEcUcDuaHWSe 6iJm9f1gMEgZVoTT7wNtO7sk7U59tdAHyQeR2dEZlo6FLClLTwBXDMWXN55v36Zn J7sPJxiWuwBU05guPQQOf/eL+5LmTk8LMZ5+6xAUQHB4eG8G1P07belrSWToEWuY yIA5gx8lV1ULaw4zRMyQ01w0oK1dXtMdMplPbJZDGmrBVA6iXl09hhU+uevX+Y6A NOBStv8RSER+LZ/ZF4hSGrcO3yhrQwJK+Jti9dEOIEpzB2pGfuA= =WsGx -----END PGP SIGNATURE-----
2 files changed,
122 insertions(+),
34 deletions(-)
M
models/models.go
→
models/models.go
@@ -19,7 +19,17 @@ }
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 +}
M
mongodb/adapter.go
→
mongodb/adapter.go
@@ -26,14 +26,15 @@
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 @@ err = client.Connect(ctx)
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 @@ if tables != nil {
_, 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) 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) 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) 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) 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 @@
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) 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) ModifyToken(table models.TableKey, token models.Token) error { - return 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) ([]models.Token, error) { - return []models.Token{}, nil +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")) }