in server/src/main/java/com/epam/aidial/core/server/limiter/RateLimiter.java [216:254]
private Limit getLimitByUser(ProxyContext context, RoleBasedEntity roleBasedEntity) {
String name = roleBasedEntity.getName();
List<String> userRoles;
if (roleBasedEntity.getUserRoles() == null) {
// find limits for all user roles
userRoles = context.getUserRoles();
} else {
// find limits for user roles which match to required roles
userRoles = context.getUserRoles().stream().filter(role -> roleBasedEntity.getUserRoles().contains(role)).toList();
}
Map<String, Role> roles = context.getConfig().getRoles();
Limit defaultUserLimit = getLimit(roles, DEFAULT_USER_ROLE, name, DEFAULT_LIMIT);
if (userRoles.isEmpty()) {
return defaultUserLimit;
}
Limit limit = null;
for (String userRole : userRoles) {
Limit candidate = getLimit(roles, userRole, name, null);
if (candidate != null) {
if (limit == null) {
limit = new Limit();
limit.setMinute(candidate.getMinute());
limit.setRequestHour(candidate.getRequestHour());
limit.setRequestDay(candidate.getRequestDay());
limit.setDay(candidate.getDay());
limit.setWeek(candidate.getWeek());
limit.setMonth(candidate.getMonth());
} else {
limit.setMinute(Math.max(candidate.getMinute(), limit.getMinute()));
limit.setDay(Math.max(candidate.getDay(), limit.getDay()));
limit.setRequestDay(Math.max(candidate.getRequestDay(), limit.getRequestDay()));
limit.setRequestHour(Math.max(candidate.getRequestHour(), limit.getRequestHour()));
limit.setWeek(Math.max(candidate.getWeek(), limit.getWeek()));
limit.setMonth(Math.max(candidate.getMonth(), limit.getMonth()));
}
}
}
return limit == null ? defaultUserLimit : limit;
}