package valkey import ( "context" "strconv" "git.tek.govt.hu/dowerx/chat/server/config" "git.tek.govt.hu/dowerx/chat/server/util" ) const SESSION_PREFIX string = "session:" type SessionDAOVK struct { vkDAO } func (d SessionDAOVK) Set(token string, id int) *util.ChatError { cmd := (*d.vk).B().Set().Key(SESSION_PREFIX + token).Value(strconv.Itoa(id)).ExSeconds(int64(config.GetConfig().API.TokenLife)).Build() return util.MakeError((*d.vk).Do(context.Background(), cmd).Error(), util.DATABASE_QUERY_FAULT) } func (d SessionDAOVK) Get(token string) (int, *util.ChatError) { cmd := (*d.vk).B().Get().Key(SESSION_PREFIX + token).Build() result := (*d.vk).Do(context.Background(), cmd) if err := result.Error(); err != nil { return 0, util.MakeError(err, util.DATABASE_QUERY_FAULT) } id, err := result.AsInt64() return int(id), util.MakeError(err, util.DATABASE_QUERY_FAULT) } func (d SessionDAOVK) Delete(token string) *util.ChatError { cmd := (*d.vk).B().Del().Key(SESSION_PREFIX + token).Build() return util.MakeError((*d.vk).Do(context.Background(), cmd).Error(), util.DATABASE_QUERY_FAULT) } func (d SessionDAOVK) DeleteAllByID(id int) *util.ChatError { // iterate all session keys var cursor uint64 = 0 pattern := SESSION_PREFIX + "*" for { cmd := (*d.vk).B().Scan().Cursor(cursor).Match(pattern).Build() result := (*d.vk).Do(context.Background(), cmd) if err := result.Error(); err != nil { return util.MakeError(err, util.DATABASE_QUERY_FAULT) } entry, err := result.AsScanEntry() if err != nil { return util.MakeError(err, util.DATABASE_QUERY_FAULT) } for _, key := range entry.Elements { // get the value of the key cmd = (*d.vk).B().Get().Key(key).Build() result := (*d.vk).Do(context.Background(), cmd) if err := result.Error(); err != nil { return util.MakeError(err, util.DATABASE_QUERY_FAULT) } value, err := result.AsInt64() if err != nil { return util.MakeError(err, util.DATABASE_QUERY_FAULT) } // check if the value is the same as our id if value == int64(id) { // if so, delete it cmd = (*d.vk).B().Del().Key(key).Build() result := (*d.vk).Do(context.Background(), cmd) if err := result.Error(); err != nil { return util.MakeError(err, util.DATABASE_QUERY_FAULT) } } } if cursor = entry.Cursor; cursor == 0 { break } } return nil } func (d SessionDAOVK) Bump(token string, time int) *util.ChatError { cmd := (*d.vk).B().Expire().Key(SESSION_PREFIX + token).Seconds(int64(time)).Build() return util.MakeError((*d.vk).Do(context.Background(), cmd).Error(), util.DATABASE_QUERY_FAULT) }