Что я могу использовать помимо сессий, чтобы использовать следующий метод в качестве метода API? - PullRequest
0 голосов
/ 27 мая 2019

У меня есть приложение для викторины с интерфейсом Laravel и интерфейсом Vue. Я работаю над разработкой API для этого приложения. Однако проблема, с которой я столкнулся, заключается в том, что мне нужна конечная точка API, которая: возвращает вопрос из таблицы вопросов, но для этого необходимо:

  1. Возвращать вопрос в случайном порядке каждый раз, когда вызывается метод
  2. Не быть вопросом, который пользователь уже видел (если не были просмотрены все вопросы)

До сих пор я рандомизировал коллекцию вопросов, используя метод случайного выбора и полагаясь на сеансы для хранения идентификаторов невидимых вопросов.

Однако, поскольку вызовы API не сохраняют состояние, сеансы работать не будут. Мне было интересно, каким образом я мог обойти это?

public function random(Module $module, $category){
    // Get question ids in randomised order (for a given module + category)
    $questions =  Question::CategoryForModule(1, $module->id)->shuffle()->pluck('id');

    // Name and Get unseenQuestions
    $sessionName = 'unseenQuestions_' . $category .  strval($module->id); //unseenQuestions_anatomy_2

    if (session()->has($sessionName)) {
        $unseenQuestions = session()->get($sessionName);

    } else {
        $unseenQuestions = collect($questions);

    }
    // Pop new Question
    $newQuestionID = $unseenQuestions->shift();;

    // Store unseenQuestions OR remove unseenQuestions (if it has no items);
    if ($unseenQuestions->count() == 0) {
        session()->forget($sessionName);
    } else {
        session()->put($sessionName, $unseenQuestions);
    }

    return new QuestionResource(Question::find($newQuestionID));
}

1 Ответ

0 голосов
/ 27 мая 2019

Вы можете использовать один из этих подходов, чтобы сделать это

  • Аутентификация вызовов API: у каждого пользователя есть токен, который будет аутентифицировать вызов. Затем, когда вы извлекаете вопрос из БД, вы сохраняете (в БД) вопрос как seen пользователем
  • Отправьте вместе с вашим API массив seen вопросов. ИМХО такого подхода следует избегать, поскольку он пригоден для использования, и вы делегируете клиенту решение, был ли вопрос замечен или нет.

Я бы выбрал первый вариант.

...