partitioning, db changes + fetchers

This commit is contained in:
zibthedog 2024-07-28 17:17:59 -04:00
parent eafdd75221
commit 5c8b07138e
4 changed files with 144 additions and 2 deletions

44
api/featureflags.go Normal file
View File

@ -0,0 +1,44 @@
/*
Copyright (C) 2024 Pagefault Games
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package api
import (
"hash/crc32"
"math"
)
func CheckFeatureFlagEnabled(accountId []byte, flag string, percent int) bool {
if percent <= 0 {
return false
} else if percent >= 100 {
return true
}
pct := math.Max(0, math.Min(100, float64(percent)))
flagBytes := []byte(flag)
// hash key is [...accountId, ...flagBytes]
hashKey := make([]byte, len(accountId)+len(flagBytes))
copy(hashKey, accountId)
copy(hashKey[len(accountId):], flagBytes)
boundary := float64(math.MaxUint32) * (pct / float64(100))
hash := float64(crc32.ChecksumIEEE(hashKey))
return hash >= boundary
}

View File

@ -106,8 +106,8 @@ func setupDb(tx *sql.Tx) error {
// ----------------------------------
// MIGRATION 004
`CREATE TABLE IF NOT EXISTS featureFlags (id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(64) UNIQUE NOT NULL, enabled TINYINT(1) NOT NULL, percentage TINYINT(3) NOT NULL DEFAULT 0)`
`CREATE TABLE IF NOT EXISTS accountFeatureFlagOverrides (accountId BINARY(16) NOT_NULL, flagId INT(11) NOT NULL, PRIMARY KEY (accountId, flagId), FOREIGN KEY (accountId) REFERENCES accounts (uuid) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (flagId) REFERENCES featureFlags (id) ON DELETE CASCADE ON UPDATE CASCADE)`
`CREATE TABLE IF NOT EXISTS featureFlags (id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(64) UNIQUE NOT NULL, enabled TINYINT(1) NOT NULL, percentage TINYINT(3) NOT NULL DEFAULT 0, CONSTRAINT chk_featureFlagsPercentage_withinRange CHECK(percentage >= 0 AND percentage <= 100))`,
`CREATE TABLE IF NOT EXISTS accountFeatureFlagOverrides (accountId BINARY(16) NOT NULL, flagId INT(11) NOT NULL, enabled TINYINT(1) NOT NULL, PRIMARY KEY (accountId, flagId), FOREIGN KEY (accountId) REFERENCES accounts (uuid) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (flagId) REFERENCES featureFlags (id) ON DELETE CASCADE ON UPDATE CASCADE)`,
}
for _, q := range queries {

70
db/featureflags.go Normal file
View File

@ -0,0 +1,70 @@
/*
Copyright (C) 2024 Pagefault Games
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package db
import "github.com/pagefaultgames/rogueserver/defs"
func GetEnabledFeatureFlags() ([]defs.FeatureFlag, error) {
var activeFlags []defs.FeatureFlag
results, err := handle.Query("SELECT name, percentage FROM featureFlags WHERE enabled = 1")
if err != nil {
return activeFlags, err
}
defer results.Close()
for results.Next() {
var flag defs.FeatureFlag
err = results.Scan(&flag.Name, &flag.Percentage)
if err != nil {
return activeFlags, err
}
activeFlags = append(activeFlags, flag)
}
return activeFlags, nil
}
func GetFeatureFlagOverrides(accountId []byte) ([]defs.FeatureFlagOverride, error) {
var overrides []defs.FeatureFlagOverride
results, err := handle.Query("SELECT ff.name, o.enabled FROM accoutFeatureFlagOverrides o JOIN featureFlags ff ON o.flagId = ff.id WHERE accountId = ?", accountId)
if err != nil {
return overrides, err
}
defer results.Close()
for results.Next() {
var override defs.FeatureFlagOverride
err = results.Scan(&override.FlagName, &override.Enabled)
if err != nil {
return overrides, err
}
overrides = append(overrides, override)
}
return overrides, nil
}

28
defs/featureflags.go Normal file
View File

@ -0,0 +1,28 @@
/*
Copyright (C) 2024 Pagefault Games
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package defs
type FeatureFlag struct {
Name string
Percentage int
}
type FeatureFlagOverride struct {
FlagName string
Enabled bool
}