105 lines
2.5 KiB
Go
105 lines
2.5 KiB
Go
package repositories
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
|
|
"rijig/model"
|
|
|
|
"github.com/go-redis/redis/v8"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type UserRepository interface {
|
|
SaveUser(user *model.User) (*model.User, error)
|
|
FindByPhone(phone string) (*model.User, error)
|
|
}
|
|
|
|
type userRepository struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewUserRepository(db *gorm.DB) UserRepository {
|
|
return &userRepository{db: db}
|
|
}
|
|
|
|
func (r *userRepository) SaveUser(user *model.User) (*model.User, error) {
|
|
if err := r.db.Create(user).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return user, nil
|
|
}
|
|
|
|
func (r *userRepository) FindByPhone(phone string) (*model.User, error) {
|
|
var user model.User
|
|
if err := r.db.Where("phone = ?", phone).First(&user).Error; err != nil {
|
|
if err == gorm.ErrRecordNotFound {
|
|
return nil, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
return &user, nil
|
|
}
|
|
|
|
type RedisRepository interface {
|
|
StoreData(key string, data interface{}, expiration time.Duration) error
|
|
GetData(key string) (interface{}, error) // Mengembalikan interface{}
|
|
DeleteData(key string) error
|
|
}
|
|
|
|
type redisRepository struct {
|
|
client *redis.Client
|
|
ctx context.Context
|
|
}
|
|
|
|
// NewRedisRepository membuat instance baru dari redisRepository
|
|
func NewRedisRepository(client *redis.Client) RedisRepository {
|
|
return &redisRepository{
|
|
client: client,
|
|
ctx: context.Background(),
|
|
}
|
|
}
|
|
|
|
// StoreData menyimpan data ke dalam Redis (dalam format JSON)
|
|
func (r *redisRepository) StoreData(key string, data interface{}, expiration time.Duration) error {
|
|
// Marshaling data ke JSON
|
|
jsonData, err := json.Marshal(data)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to marshal data: %v", err)
|
|
}
|
|
|
|
// Simpan JSON ke Redis
|
|
err = r.client.Set(r.ctx, key, jsonData, expiration).Err()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to store data in Redis: %v", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GetData mengambil data dari Redis berdasarkan key
|
|
func (r *redisRepository) GetData(key string) (interface{}, error) {
|
|
val, err := r.client.Get(r.ctx, key).Result()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to get data from Redis: %v", err)
|
|
}
|
|
|
|
// Unmarshal data JSON kembali ke objek
|
|
var data interface{}
|
|
err = json.Unmarshal([]byte(val), &data)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to unmarshal data: %v", err)
|
|
}
|
|
return data, nil
|
|
}
|
|
|
|
// DeleteData menghapus data di Redis berdasarkan key
|
|
func (r *redisRepository) DeleteData(key string) error {
|
|
err := r.client.Del(r.ctx, key).Err()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to delete data from Redis: %v", err)
|
|
}
|
|
return nil
|
|
}
|