Task Livecoding Token Limited Usage

9. Реализовать сервис для работы с токенами с ограничением на количество использований? #

Спойлеры к решению
Подсказки
  • Для реализации сервиса с токенами нужно создать структуру данных, которая будет отслеживать количество использований токенов.
  • Можно использовать HashMap или Redis для хранения токенов с их статусами.
  • Нужно хранить:
    • Токен (например, строка).
    • Количество оставшихся использований для этого токена.
  • После использования токена количество оставшихся использований уменьшается.
  • Если количество использований исчерпано, токен становится невалидным.
  • Пример ограничения использования токенов:
    • Токен может быть использован 5 раз.
    • После пятого использования токен становится недействительным.
Решение

Пример реализации сервиса для работы с токенами:

import java.util.HashMap;
import java.util.Map;

@Service
public class TokenService {

    private final Map<String, Token> tokenStorage = new HashMap<>();
    private final int maxUses = 5; // Максимальное количество использований токена

    // Метод для создания токена
    public String generateToken() {
        String token = "token-" + System.currentTimeMillis();
        tokenStorage.put(token, new Token(token, maxUses));
        return token;
    }

    // Метод для использования токена
    public boolean useToken(String token) {
        Token tokenData = tokenStorage.get(token);
        if (tokenData == null || tokenData.getRemainingUses() <= 0) {
            return false; // Токен не существует или исчерпано количество использований
        }
        
        // Уменьшаем количество оставшихся использований
        tokenData.decreaseRemainingUses();
        return true;
    }

    // Метод для проверки количества оставшихся использований
    public int getRemainingUses(String token) {
        Token tokenData = tokenStorage.get(token);
        if (tokenData == null) {
            return 0; // Токен не найден
        }
        return tokenData.getRemainingUses();
    }

    // Вспомогательный класс для представления токена
    private static class Token {
        private final String token;
        private int remainingUses;

        public Token(String token, int remainingUses) {
            this.token = token;
            this.remainingUses = remainingUses;
        }

        public String getToken() {
            return token;
        }

        public int getRemainingUses() {
            return remainingUses;
        }

        public void decreaseRemainingUses() {
            this.remainingUses--;
        }
    }
}

Описание работы:

  • В TokenService используется Map для хранения токенов, где ключом является сам токен, а значением — объект Token, который содержит информацию о токене и количестве оставшихся использований.
  • Метод generateToken() генерирует новый токен с максимальным количеством использований.
  • Метод useToken(String token) проверяет, был ли токен использован меньше максимального числа раз, и если да, то уменьшает оставшееся количество использований. Если токен исчерпан или не существует, метод возвращает false.
  • Метод getRemainingUses(String token) возвращает количество оставшихся использований для токена.
  • Вспомогательный класс Token инкапсулирует данные о токене и реализует логику уменьшения оставшихся использований.

Пример использования:

public class Main {
    public static void main(String[] args) {
        TokenService tokenService = new TokenService();
        
        // Генерация токена
        String token = tokenService.generateToken();
        System.out.println("Generated token: " + token);

        // Проверка оставшихся использований
        System.out.println("Remaining uses: " + tokenService.getRemainingUses(token));

        // Использование токена несколько раз
        for (int i = 0; i < 6; i++) {
            boolean result = tokenService.useToken(token);
            System.out.println("Use token " + (i+1) + ": " + result);
        }

        // Проверка оставшихся использований после исчерпания
        System.out.println("Remaining uses after attempts: " + tokenService.getRemainingUses(token));
    }
}

Ключевые моменты:

  • HashMap используется для хранения токенов и их состояний (сколько раз их можно использовать).
  • При каждом использовании токена уменьшается его количество использований.
  • Token — это вспомогательный класс, который инкапсулирует логику работы с токенами.
  • Если количество использований токена исчерпано, токен становится невалидным.
  • Можно добавить дополнительную логику для удаления неактивных токенов по истечении срока действия или по количеству использований.