From 0eefb438a6d316e5ca54d884d4aa4b904ac8319d Mon Sep 17 00:00:00 2001 From: mountain Date: Mon, 4 Sep 2023 11:56:56 +0900 Subject: [PATCH] =?UTF-8?q?session=20provider=EC=97=90=EB=8F=84=20touch=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- session/common.go | 1 + session/impl_mongo.go | 18 ++++++++++++++++++ session/impl_redis.go | 14 ++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/session/common.go b/session/common.go index ddd8c21..16eddf3 100644 --- a/session/common.go +++ b/session/common.go @@ -31,6 +31,7 @@ type Provider interface { New(*Authorization) (string, error) Delete(primitive.ObjectID) error Query(string) (*Authorization, error) + Touch(string) (bool, error) } type Consumer interface { diff --git a/session/impl_mongo.go b/session/impl_mongo.go index 8ecc1d7..d85d05f 100644 --- a/session/impl_mongo.go +++ b/session/impl_mongo.go @@ -77,6 +77,24 @@ func (p *provider_mongo) Query(pk string) (*Authorization, error) { return &auth, err } +func (p *provider_mongo) Touch(pk string) (bool, error) { + sk := publickey_to_storagekey(publickey(pk)) + worked, _, err := p.mongoClient.Update(session_collection_name, bson.M{ + "key": sk, + }, bson.M{ + "$currentDate": bson.M{ + "_ts": bson.M{"$type": "date"}, + }, + }, options.Update().SetUpsert(false)) + + if err != nil { + logger.Println("provider Touch :", err) + return false, err + } + + return worked, nil +} + type consumer_mongo struct { consumer_common[*sessionMongo] ids map[primitive.ObjectID]storagekey diff --git a/session/impl_redis.go b/session/impl_redis.go index c533dcc..9c03c50 100644 --- a/session/impl_redis.go +++ b/session/impl_redis.go @@ -87,6 +87,20 @@ func (p *provider_redis) Query(pk string) (*Authorization, error) { return &auth, nil } +func (p *provider_redis) Touch(pk string) (bool, error) { + sk := publickey_to_storagekey(publickey(pk)) + ok, err := p.redisClient.Expire(p.ctx, string(sk), p.ttl).Result() + if err == redis.Nil { + // 이미 만료됨 + return false, nil + } else if err != nil { + logger.Println("consumer Touch :", err) + return false, err + } + + return ok, nil +} + type consumer_redis struct { consumer_common[*sessionRedis] redisClient *redis.Client