all repos — felt @ e6faf9478aab0e9958e43b5b0a2987698cdba480

virtual tabletop for dungeons and dragons (and similar) using Go, MongoDB, and websockets

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-----
commit

e6faf9478aab0e9958e43b5b0a2987698cdba480

parent

298022e4e9ab2a339b71691db945382103447d84

2 files changed, 122 insertions(+), 34 deletions(-)

jump to
M models/models.gomodels/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.gomongodb/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")) }