init redis
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
package redis
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/redis/go-redis/v9"
|
||||
)
|
||||
|
||||
func NewRedis() (*redis.Client, error) {
|
||||
addr := os.Getenv("REDIS_ADDR")
|
||||
if addr == "" {
|
||||
addr = "localhost:6379"
|
||||
}
|
||||
|
||||
rdb := redis.NewClient(&redis.Options{
|
||||
Addr: addr,
|
||||
})
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer cancel()
|
||||
|
||||
// cek koneksi saat startup
|
||||
if err := rdb.Ping(ctx).Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return rdb, nil
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
package redis
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"satusehat-rssa/internal/model"
|
||||
"strings"
|
||||
|
||||
"github.com/redis/go-redis/v9"
|
||||
)
|
||||
|
||||
type RedisAkses struct {
|
||||
akses *model.Akses
|
||||
}
|
||||
|
||||
type RedisInterface interface {
|
||||
GetOrCreateTokenSS(ctx context.Context) (string, error)
|
||||
}
|
||||
|
||||
func NewRedisAuth(akses *model.Akses) RedisInterface {
|
||||
return &RedisAkses{
|
||||
akses: akses,
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (s *RedisAkses) GetOrCreateTokenSS(ctx context.Context) (string, error) {
|
||||
const redisKey = "token-ss"
|
||||
|
||||
// 1️⃣ ambil dari redis
|
||||
token, err := s.akses.Redis.Get(ctx, redisKey).Result()
|
||||
if err == nil && token != "" {
|
||||
return token, nil
|
||||
}
|
||||
|
||||
// redis error selain key not found
|
||||
if err != nil && err != redis.Nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// 2️⃣ generate token baru
|
||||
oauth := model.OauthRequest{
|
||||
ClientId: s.akses.ClientId,
|
||||
ClientSecret: s.akses.ClientSecret,
|
||||
}
|
||||
|
||||
obj_token, err := s.GenerateToken(oauth)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// 3️⃣ simpan ke redis (opsional TTL)
|
||||
if err := s.akses.Redis.Set(ctx, redisKey, obj_token.AccessToken, 0).Err(); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return obj_token.AccessToken, nil
|
||||
}
|
||||
|
||||
func (o *RedisAkses) GenerateToken(req model.OauthRequest) (*model.OauthResponse, error) {
|
||||
var (
|
||||
data *model.OauthResponse
|
||||
)
|
||||
url := o.akses.AuthUrl + "/accesstoken?grant_type=client_credentials"
|
||||
method := "POST"
|
||||
|
||||
req_data := "client_id=" + req.ClientId + "&client_secret=" + req.ClientSecret
|
||||
payload := strings.NewReader(req_data)
|
||||
|
||||
client := &http.Client{}
|
||||
request, err := http.NewRequest(method, url, payload)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
request.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
||||
|
||||
res, err := client.Do(request)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer res.Body.Close()
|
||||
|
||||
err = json.NewDecoder(res.Body).Decode(&data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return data, nil
|
||||
}
|
||||
Reference in New Issue
Block a user