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 }