package datastore import ( "errors" "log" "math" "math/rand" "strconv" "time" "gorm.io/gorm" ) type OneHubDB struct { storage *gorm.DB MaxPageSize int } type GenId struct { Class string `gorm:"primaryKey"` Id string `gorm:"primaryKey"` CreatedAt time.Time } var InvalidIDError = errors.New("ID is invalid or empty") var MessageUpdateFailed = errors.New("Update failed concurrency check") var TopicUpdateFailed = errors.New("Update failed concurrency check") var UserUpdateFailed = errors.New("Update failed concurrency check") func NewOneHubDB(gormdb *gorm.DB) *OneHubDB { gormdb.AutoMigrate(&GenId{}) gormdb.AutoMigrate(&User{}) gormdb.AutoMigrate(&Topic{}) gormdb.AutoMigrate(&Message{}) return &OneHubDB{ storage: gormdb, MaxPageSize: 1000, } } func randid() string { max_id := int64(math.Pow(36, 4)) randval := rand.Int63() % max_id return strconv.FormatInt(randval, 36) } func (tdb *OneHubDB) NextId(cls string) string { for { gid := GenId{Id: randid(), Class: cls, CreatedAt: time.Now()} err := tdb.storage.Create(gid).Error log.Println("ID Create Error: ", err) if err == nil { return gid.Id } } }