90 lines
2.0 KiB
Go
90 lines
2.0 KiB
Go
package role
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"rijig/utils"
|
|
)
|
|
|
|
type RoleService interface {
|
|
GetRoles(ctx context.Context) ([]RoleResponseDTO, error)
|
|
GetRoleByID(ctx context.Context, roleID string) (*RoleResponseDTO, error)
|
|
}
|
|
|
|
type roleService struct {
|
|
RoleRepo RoleRepository
|
|
}
|
|
|
|
func NewRoleService(roleRepo RoleRepository) RoleService {
|
|
return &roleService{roleRepo}
|
|
}
|
|
|
|
func (s *roleService) GetRoles(ctx context.Context) ([]RoleResponseDTO, error) {
|
|
cacheKey := "roles_list"
|
|
|
|
var cachedRoles []RoleResponseDTO
|
|
err := utils.GetCache(cacheKey, &cachedRoles)
|
|
if err == nil {
|
|
return cachedRoles, nil
|
|
}
|
|
|
|
roles, err := s.RoleRepo.FindAll(ctx)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to fetch roles: %v", err)
|
|
}
|
|
|
|
var roleDTOs []RoleResponseDTO
|
|
for _, role := range roles {
|
|
createdAt, _ := utils.FormatDateToIndonesianFormat(role.CreatedAt)
|
|
updatedAt, _ := utils.FormatDateToIndonesianFormat(role.UpdatedAt)
|
|
|
|
roleDTOs = append(roleDTOs, RoleResponseDTO{
|
|
ID: role.ID,
|
|
RoleName: role.RoleName,
|
|
CreatedAt: createdAt,
|
|
UpdatedAt: updatedAt,
|
|
})
|
|
}
|
|
|
|
err = utils.SetCache(cacheKey, roleDTOs, time.Hour*24)
|
|
if err != nil {
|
|
fmt.Printf("Error caching roles data to Redis: %v\n", err)
|
|
}
|
|
|
|
return roleDTOs, nil
|
|
}
|
|
|
|
func (s *roleService) GetRoleByID(ctx context.Context, roleID string) (*RoleResponseDTO, error) {
|
|
cacheKey := fmt.Sprintf("role:%s", roleID)
|
|
|
|
var cachedRole RoleResponseDTO
|
|
err := utils.GetCache(cacheKey, &cachedRole)
|
|
if err == nil {
|
|
return &cachedRole, nil
|
|
}
|
|
|
|
role, err := s.RoleRepo.FindByID(ctx, roleID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("role not found: %v", err)
|
|
}
|
|
|
|
createdAt, _ := utils.FormatDateToIndonesianFormat(role.CreatedAt)
|
|
updatedAt, _ := utils.FormatDateToIndonesianFormat(role.UpdatedAt)
|
|
|
|
roleDTO := &RoleResponseDTO{
|
|
ID: role.ID,
|
|
RoleName: role.RoleName,
|
|
CreatedAt: createdAt,
|
|
UpdatedAt: updatedAt,
|
|
}
|
|
|
|
err = utils.SetCache(cacheKey, roleDTO, time.Hour*24)
|
|
if err != nil {
|
|
fmt.Printf("Error caching role data to Redis: %v\n", err)
|
|
}
|
|
|
|
return roleDTO, nil
|
|
}
|