CacheService.java

package com.distasilucas.cryptobalancetracker.service;

import com.distasilucas.cryptobalancetracker.model.CacheType;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.CacheManager;
import org.springframework.stereotype.Service;

import static com.distasilucas.cryptobalancetracker.constants.Constants.ALL_PLATFORMS_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.CRYPTOS_BALANCES_INSIGHTS_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.CRYPTOS_CRYPTOS_IDS_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.CRYPTO_INSIGHTS_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.DATES_BALANCES_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.GOAL_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.PAGE_GOALS_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.PLATFORMS_BALANCES_INSIGHTS_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.PLATFORMS_PLATFORMS_IDS_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.PLATFORM_INSIGHTS_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.PLATFORM_PLATFORM_ID_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.PRICE_TARGET_ID_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.PRICE_TARGET_PAGE_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.TOTAL_BALANCES_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.USER_CRYPTOS_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.USER_CRYPTOS_COINGECKO_CRYPTO_ID_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.USER_CRYPTOS_PLATFORM_ID_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.USER_CRYPTOS_PAGE_CACHE;
import static com.distasilucas.cryptobalancetracker.constants.Constants.USER_CRYPTO_ID_CACHE;

@Slf4j
@Service
@RequiredArgsConstructor
public class CacheService {

    private final CacheManager cacheManager;

    public void invalidate(CacheType firstCache, CacheType ...caches) {
        invalidate(firstCache);

        for (CacheType cache : caches) {
            invalidate(cache);
        }
    }

    private void invalidate(CacheType cache) {
        switch (cache) {
            case USER_CRYPTOS_CACHES -> invalidateUserCryptosCaches();
            case CRYPTOS_CACHES -> invalidateCryptosCache();
            case PLATFORMS_CACHES -> invalidatePlatformsCaches();
            case GOALS_CACHES -> invalidateGoalsCaches();
            case PRICE_TARGETS_CACHES -> invalidatePriceTargetCaches();
            case INSIGHTS_CACHES -> invalidateInsightsCache();
        }
    }

    private void invalidateUserCryptosCaches() {
        log.info("Invalidating user cryptos cache");

        cacheManager.getCache(USER_CRYPTOS_CACHE).invalidate();
        cacheManager.getCache(USER_CRYPTOS_PLATFORM_ID_CACHE).invalidate();
        cacheManager.getCache(USER_CRYPTOS_COINGECKO_CRYPTO_ID_CACHE).invalidate();
        cacheManager.getCache(USER_CRYPTO_ID_CACHE).invalidate();
        cacheManager.getCache(USER_CRYPTOS_PAGE_CACHE).invalidate();
    }

    private void invalidatePlatformsCaches() {
        log.info("Invalidating platforms cache");

        cacheManager.getCache(PLATFORMS_PLATFORMS_IDS_CACHE).invalidate();
        cacheManager.getCache(ALL_PLATFORMS_CACHE).invalidate();
        cacheManager.getCache(PLATFORM_PLATFORM_ID_CACHE).invalidate();
    }

    private void invalidateCryptosCache() {
        log.info("Invalidating cryptos cache");

        cacheManager.getCache(CRYPTOS_CRYPTOS_IDS_CACHE).invalidate();
    }

    private void invalidateGoalsCaches() {
        log.info("Invalidating goals cache");

        cacheManager.getCache(GOAL_CACHE).invalidate();
        cacheManager.getCache(PAGE_GOALS_CACHE).invalidate();
    }

    private void invalidatePriceTargetCaches() {
        log.info("Invalidating price target caches");

        cacheManager.getCache(PRICE_TARGET_ID_CACHE).invalidate();
        cacheManager.getCache(PRICE_TARGET_PAGE_CACHE).invalidate();
    }

    private void invalidateInsightsCache() {
        log.info("Invalidating insights caches");

        cacheManager.getCache(TOTAL_BALANCES_CACHE).invalidate();
        cacheManager.getCache(DATES_BALANCES_CACHE).invalidate();
        cacheManager.getCache(PLATFORM_INSIGHTS_CACHE).invalidate();
        cacheManager.getCache(CRYPTO_INSIGHTS_CACHE).invalidate();
        cacheManager.getCache(PLATFORMS_BALANCES_INSIGHTS_CACHE).invalidate();
        cacheManager.getCache(CRYPTOS_BALANCES_INSIGHTS_CACHE).invalidate();
    }
}