91 lines
2.6 KiB
Go
91 lines
2.6 KiB
Go
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)
|
|
}
|