MIF_E31222379_BE/internal/repositories/article.go

99 lines
2.0 KiB
Go

package repositories
import (
"encoding/json"
"time"
"github.com/pahmiudahgede/senggoldong/config"
"github.com/pahmiudahgede/senggoldong/domain"
"golang.org/x/net/context"
)
var ctx = context.Background()
func CreateArticle(article *domain.Article) error {
err := config.DB.Create(article).Error
if err != nil {
return err
}
config.RedisClient.Del(ctx, "articles")
return nil
}
func GetArticles() ([]domain.Article, error) {
var articles []domain.Article
cachedArticles, err := config.RedisClient.Get(ctx, "articles").Result()
if err == nil {
err := json.Unmarshal([]byte(cachedArticles), &articles)
if err != nil {
return nil, err
}
return articles, nil
}
err = config.DB.Find(&articles).Error
if err != nil {
return nil, err
}
articlesJSON, _ := json.Marshal(articles)
config.RedisClient.Set(ctx, "articles", articlesJSON, 10*time.Minute)
return articles, nil
}
func GetArticleByID(id string) (domain.Article, error) {
var article domain.Article
cachedArticle, err := config.RedisClient.Get(ctx, "article:"+id).Result()
if err == nil {
err := json.Unmarshal([]byte(cachedArticle), &article)
if err != nil {
return article, err
}
return article, nil
}
err = config.DB.Where("id = ?", id).First(&article).Error
if err != nil {
return article, err
}
articleJSON, _ := json.Marshal(article)
config.RedisClient.Set(ctx, "article:"+id, articleJSON, 10*time.Minute)
return article, nil
}
func UpdateArticle(article *domain.Article) error {
err := config.DB.Save(article).Error
if err != nil {
return err
}
config.RedisClient.Del(ctx, "article:"+article.ID)
config.RedisClient.Del(ctx, "articles")
return nil
}
func DeleteArticle(id string) error {
var article domain.Article
err := config.DB.Where("id = ?", id).First(&article).Error
if err != nil {
return err
}
err = config.DB.Delete(&article).Error
if err != nil {
return err
}
config.RedisClient.Del(ctx, "article:"+id)
config.RedisClient.Del(ctx, "articles")
return nil
}