Перейти к содержанию

🗒 Задача

Реализуй механизм авторизации в интернет-магазине и получения сохраненного ранее списка товаров.

Метод авторизации принимает логин и пароль, верифицирует пользователя. Креды (credentials) для входа сохрани в константы.

При успешной авторизации – метод генерирует и возвращает токен доступа. Токен - текстовая строка, генерируемая методом авторизации (32 символа, которые включают цифры и буквы англ. алфавита – специальные библиотеки использовать не нужно).

При неудачной авторизации метод возвращает null.

Метод получения корзины должен принимать токен и возвращать список товаров (содержимое переменной корзины, произвольный тип данных).

Распечатай содержимое корзины или, если вернется null, оповести пользователя о неудачной авторизации. Переменные логин и пароль для корректной авторизации проинициализированы заранее и неизменяемы.

❌ Ошибки

  • метод получения корзины возвращает не только содержимое корзины

  • нейминг функций не в инфинитиве

  • функции не разделяются пустыми строками

✏️ Комментарии

Если хочешь объявить константу, то используется ключевое слово `const val`. Константа может хранить только примитивные типы данных, например, string, int. Так же данная переменная не является константой и вынесена за пределы основного метода `fun main()`.
Выбрасывать ошибку авторизации необходимо сразу после вызова метода авторизации.
Согласно ТЗ, метод принимает ненулябельный токен, и возвращает только корзину.
Почти хорошо) У тебя прослеживается паттерн - все символы строго чередуются. Это может повлиять на уникальность и возможность скомпроментировать токен. Предлагаю из трех диапазонов сделать одну строку и генерить полностью рандомную строку.
Все таки тут уже последовательность предсказуема, а значит менее секьюрна. Я бы тут сделал один интервал из разных типов чаров и из него уже брал рандомные символы
Числа и символы - это все можно представить в виде последовательностей (диапазонов). Обрати внимание на вот эту [табличку](https://www.industrialnets.ru/files/misc/ascii.pdf)
`readln()` всегда будет возвращать строку. Это ее поведение по умолчанию. Если провалиться в декларацию, видно, что вся цепочка работает исключительно со строками (нулябельными, но к readln это не относится)
Зачем создавать tokenList и рейнжы всегда. Ведь если пароль или логин не корректны, мы зря потратим процессорное время. Лучше делать это внутри if.
Вообще нет такого условия, чтобы токен обязательно содержал и строку и число. Поэтому можно в целом упростить код. Можно заранее объединить range
Можно использовать обычный StringBuilder. Или даже еще проще: `token+= tokenRange.random()`. Так как под капотом при конкатенации строк для оптимизации будет использоваться StringBuilder
Здесь можно вызвать метод `generateToken()`, в который соответствующую логику можно вынести

🧾 Решение

const val CORRECT_LOGIN = "user@example.com"
const val CORRECT_PASSWORD = "securePassword123"

fun main() {
    val login = "user@example.com"
    val password = "securePassword123"

    val token = authenticateUser(login, password)
    if (token == null) {
        println("Authentication failed.")
    } else {
        val cartContents = fetchCartContents(token)
        println("Cart contents: $cartContents")
    }
}

fun authenticateUser(login: String, password: String): String? {
    return if (login == CORRECT_LOGIN && password == CORRECT_PASSWORD) {
        generateToken()
    } else {
        null
    }
}

fun generateToken(): String {
    val number = '0'..'9'
    val symbolsUpper = 'a'..'z'
    val symbolsLower = 'A'..'Z'
    val allowedChars = number + symbolsLower + symbolsUpper
    return (1..32).map { allowedChars.random() }.joinToString("")
}

fun fetchCartContents(token: String): List<String> {
    return listOf("Apple", "Banana", "Carrot")
}