MIF_E31222379_BE/internal/services/initialcoint_service.go

300 lines
8.7 KiB
Go

package services
import (
"fmt"
"time"
"rijig/dto"
"rijig/internal/repositories"
"rijig/model"
"rijig/utils"
)
type InitialCointService interface {
CreateInitialCoint(request dto.RequestInitialCointDTO) (*dto.ReponseInitialCointDTO, error)
GetAllInitialCoints() ([]dto.ReponseInitialCointDTO, error)
GetInitialCointByID(id string) (*dto.ReponseInitialCointDTO, error)
UpdateInitialCoint(id string, request dto.RequestInitialCointDTO) (*dto.ReponseInitialCointDTO, error)
DeleteInitialCoint(id string) error
}
type initialCointService struct {
InitialCointRepo repositories.InitialCointRepository
}
func NewInitialCointService(repo repositories.InitialCointRepository) InitialCointService {
return &initialCointService{InitialCointRepo: repo}
}
func (s *initialCointService) CreateInitialCoint(request dto.RequestInitialCointDTO) (*dto.ReponseInitialCointDTO, error) {
errors, valid := request.ValidateCointInput()
if !valid {
return nil, fmt.Errorf("validation error: %v", errors)
}
coint := model.InitialCoint{
CoinName: request.CoinName,
ValuePerUnit: request.ValuePerUnit,
}
if err := s.InitialCointRepo.CreateInitialCoint(&coint); err != nil {
return nil, fmt.Errorf("failed to create initial coint: %v", err)
}
createdAt, _ := utils.FormatDateToIndonesianFormat(coint.CreatedAt)
updatedAt, _ := utils.FormatDateToIndonesianFormat(coint.UpdatedAt)
responseDTO := &dto.ReponseInitialCointDTO{
ID: coint.ID,
CoinName: coint.CoinName,
ValuePerUnit: coint.ValuePerUnit,
CreatedAt: createdAt,
UpdatedAt: updatedAt,
}
cacheKey := fmt.Sprintf("initialcoint:%s", coint.ID)
cacheData := map[string]interface{}{
"data": responseDTO,
}
if err := utils.SetJSONData(cacheKey, cacheData, time.Hour*24); err != nil {
fmt.Printf("Error caching new initial coint: %v\n", err)
}
err := s.updateAllCointCache()
if err != nil {
return nil, fmt.Errorf("error updating all initial coint cache: %v", err)
}
return responseDTO, nil
}
func (s *initialCointService) GetAllInitialCoints() ([]dto.ReponseInitialCointDTO, error) {
var cointsDTO []dto.ReponseInitialCointDTO
cacheKey := "initialcoints:all"
cachedData, err := utils.GetJSONData(cacheKey)
if err != nil {
fmt.Printf("Error fetching cache for initialcoints: %v\n", err)
}
if cachedData != nil {
if data, ok := cachedData["data"].([]interface{}); ok {
for _, item := range data {
if cointData, ok := item.(map[string]interface{}); ok {
if coinID, ok := cointData["coin_id"].(string); ok {
if coinName, ok := cointData["coin_name"].(string); ok {
if valuePerUnit, ok := cointData["value_perunit"].(float64); ok {
if createdAt, ok := cointData["createdAt"].(string); ok {
if updatedAt, ok := cointData["updatedAt"].(string); ok {
cointsDTO = append(cointsDTO, dto.ReponseInitialCointDTO{
ID: coinID,
CoinName: coinName,
ValuePerUnit: valuePerUnit,
CreatedAt: createdAt,
UpdatedAt: updatedAt,
})
}
}
}
}
}
}
}
return cointsDTO, nil
}
}
records, err := s.InitialCointRepo.FindAllInitialCoints()
if err != nil {
return nil, fmt.Errorf("failed to fetch initial coints from database: %v", err)
}
if len(records) == 0 {
return cointsDTO, nil
}
for _, record := range records {
createdAt, _ := utils.FormatDateToIndonesianFormat(record.CreatedAt)
updatedAt, _ := utils.FormatDateToIndonesianFormat(record.UpdatedAt)
cointsDTO = append(cointsDTO, dto.ReponseInitialCointDTO{
ID: record.ID,
CoinName: record.CoinName,
ValuePerUnit: record.ValuePerUnit,
CreatedAt: createdAt,
UpdatedAt: updatedAt,
})
}
cacheData := map[string]interface{}{
"data": cointsDTO,
}
if err := utils.SetJSONData(cacheKey, cacheData, time.Hour*24); err != nil {
fmt.Printf("Error caching all initial coints: %v\n", err)
}
return cointsDTO, nil
}
func (s *initialCointService) GetInitialCointByID(id string) (*dto.ReponseInitialCointDTO, error) {
cacheKey := fmt.Sprintf("initialcoint:%s", id)
cachedData, err := utils.GetJSONData(cacheKey)
if err == nil && cachedData != nil {
if data, ok := cachedData["data"].(map[string]interface{}); ok {
return &dto.ReponseInitialCointDTO{
ID: data["coin_id"].(string),
CoinName: data["coin_name"].(string),
ValuePerUnit: data["value_perunit"].(float64),
CreatedAt: data["createdAt"].(string),
UpdatedAt: data["updatedAt"].(string),
}, nil
} else {
return nil, fmt.Errorf("error: cache data is not in the expected format for coin ID %s", id)
}
}
coint, err := s.InitialCointRepo.FindInitialCointByID(id)
if err != nil {
return nil, fmt.Errorf("failed to fetch initial coint by ID %s: %v", id, err)
}
createdAt, _ := utils.FormatDateToIndonesianFormat(coint.CreatedAt)
updatedAt, _ := utils.FormatDateToIndonesianFormat(coint.UpdatedAt)
cointDTO := &dto.ReponseInitialCointDTO{
ID: coint.ID,
CoinName: coint.CoinName,
ValuePerUnit: coint.ValuePerUnit,
CreatedAt: createdAt,
UpdatedAt: updatedAt,
}
cacheData := map[string]interface{}{
"data": cointDTO,
}
if err := utils.SetJSONData(cacheKey, cacheData, time.Hour*24); err != nil {
fmt.Printf("Error caching initial coint by ID: %v\n", err)
}
return cointDTO, nil
}
func (s *initialCointService) UpdateInitialCoint(id string, request dto.RequestInitialCointDTO) (*dto.ReponseInitialCointDTO, error) {
coint, err := s.InitialCointRepo.FindInitialCointByID(id)
if err != nil {
return nil, fmt.Errorf("initial coint with ID %s not found", id)
}
coint.CoinName = request.CoinName
coint.ValuePerUnit = request.ValuePerUnit
if err := s.InitialCointRepo.UpdateInitialCoint(id, coint); err != nil {
return nil, fmt.Errorf("failed to update initial coint: %v", err)
}
createdAt, _ := utils.FormatDateToIndonesianFormat(coint.CreatedAt)
updatedAt, _ := utils.FormatDateToIndonesianFormat(coint.UpdatedAt)
cointDTO := &dto.ReponseInitialCointDTO{
ID: coint.ID,
CoinName: coint.CoinName,
ValuePerUnit: coint.ValuePerUnit,
CreatedAt: createdAt,
UpdatedAt: updatedAt,
}
cacheKey := fmt.Sprintf("initialcoint:%s", id)
cacheData := map[string]interface{}{
"data": cointDTO,
}
if err := utils.SetJSONData(cacheKey, cacheData, time.Hour*24); err != nil {
fmt.Printf("Error caching updated initial coint: %v\n", err)
}
allCoints, err := s.InitialCointRepo.FindAllInitialCoints()
if err != nil {
return nil, fmt.Errorf("failed to fetch all initial coints from database: %v", err)
}
var cointsDTO []dto.ReponseInitialCointDTO
for _, record := range allCoints {
createdAt, _ := utils.FormatDateToIndonesianFormat(record.CreatedAt)
updatedAt, _ := utils.FormatDateToIndonesianFormat(record.UpdatedAt)
cointsDTO = append(cointsDTO, dto.ReponseInitialCointDTO{
ID: record.ID,
CoinName: record.CoinName,
ValuePerUnit: record.ValuePerUnit,
CreatedAt: createdAt,
UpdatedAt: updatedAt,
})
}
cacheAllKey := "initialcoints:all"
cacheAllData := map[string]interface{}{
"data": cointsDTO,
}
if err := utils.SetJSONData(cacheAllKey, cacheAllData, time.Hour*24); err != nil {
fmt.Printf("Error caching all initial coints: %v\n", err)
}
return cointDTO, nil
}
func (s *initialCointService) DeleteInitialCoint(id string) error {
coint, err := s.InitialCointRepo.FindInitialCointByID(id)
if err != nil {
return fmt.Errorf("initial coint with ID %s not found", id)
}
if err := s.InitialCointRepo.DeleteInitialCoint(id); err != nil {
return fmt.Errorf("failed to delete initial coint: %v", err)
}
cacheKey := fmt.Sprintf("initialcoint:%s", coint.ID)
if err := utils.DeleteData(cacheKey); err != nil {
fmt.Printf("Error deleting cache for initial coint: %v\n", err)
}
return s.updateAllCointCache()
}
func (s *initialCointService) updateAllCointCache() error {
records, err := s.InitialCointRepo.FindAllInitialCoints()
if err != nil {
return fmt.Errorf("failed to fetch all initial coints from database: %v", err)
}
var cointsDTO []dto.ReponseInitialCointDTO
for _, record := range records {
createdAt, _ := utils.FormatDateToIndonesianFormat(record.CreatedAt)
updatedAt, _ := utils.FormatDateToIndonesianFormat(record.UpdatedAt)
cointsDTO = append(cointsDTO, dto.ReponseInitialCointDTO{
ID: record.ID,
CoinName: record.CoinName,
ValuePerUnit: record.ValuePerUnit,
CreatedAt: createdAt,
UpdatedAt: updatedAt,
})
}
cacheAllKey := "initialcoints:all"
cacheAllData := map[string]interface{}{
"data": cointsDTO,
}
if err := utils.SetJSONData(cacheAllKey, cacheAllData, time.Hour*24); err != nil {
fmt.Printf("Error caching all initial coints: %v\n", err)
return err
}
return nil
}