RateLimitProfiles.java

package se.jobtechdev.personaldatagateway.api.ratelimit;

import io.github.bucket4j.Bucket;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Component
public class RateLimitProfiles {
  private static final Map<String, Bucket> quotaByClient = new ConcurrentHashMap<>();
  private final Map<String, RateLimitProfile> rateLimitProfileMap;

  public RateLimitProfiles(
      @Value("${rate.limit.consumer.bucket.size:#{'1800'}}") int consumerBucketSize,
      @Value("${rate.limit.consumer.quota:#{'1800'}}") int consumerQuota,
      @Value("${rate.limit.consumer.window:#{'1800'}}") int consumerWindow,
      @Value("${rate.limit.frontend.bucket.size:#{'10000'}}") int frontendBucketSize,
      @Value("${rate.limit.frontend.quota:#{'10000'}}") int frontendQuota,
      @Value("${rate.limit.frontend.window:#{'60'}}") int frontendWindow,
      @Value("${rate.limit.admin.bucket.size:#{'1000'}}") int adminBucketSize,
      @Value("${rate.limit.admin.quota:#{'1000'}}") int adminQuota,
      @Value("${rate.limit.admin.window:#{'60'}}") int adminWindow,
      @Value("${rate.limit.default.bucket.size:#{'60'}}") int defaultBucketSize,
      @Value("${rate.limit.default.quota:#{'60'}}") int defaultQuota,
      @Value("${rate.limit.default.window:#{'60'}}") int defaultWindow) {
    this.rateLimitProfileMap = new HashMap<>(4);
    rateLimitProfileMap.put(
        "consumer",
        new RateLimitProfile(
            quotaByClient, "consumer", consumerBucketSize, consumerQuota, consumerWindow));
    rateLimitProfileMap.put(
        "frontend",
        new RateLimitProfile(
            quotaByClient, "frontend", frontendBucketSize, frontendQuota, frontendWindow));
    rateLimitProfileMap.put(
        "admin",
        new RateLimitProfile(quotaByClient, "admin", adminBucketSize, adminQuota, adminWindow));
    rateLimitProfileMap.put(
        "default",
        new RateLimitProfile(
            quotaByClient, "default", defaultBucketSize, defaultQuota, defaultWindow));
  }

  public RateLimitProfile getRateLimitProfile(String profileName) {
    return rateLimitProfileMap.get(profileName);
  }
}