Функциональные требования

  1. Должна быть возможность "регистрации" (можно упростить процесс до простого сохранения логина в бд без указания/проверки пароля)
  2. Должна быть возможность залогиниться под зарегистрированным пользователем (можно упростить процесс до простого ввода логина при входе), чтобы была возможность работы в системе нескольких пользователей.
  3. Должна быть возможность добавить вопросы и ответы на них.
  4. Вопросы могут быть 2х типов: со свободным вводом ответа, с выбором ответа из 4х вариантов. Количество вопросов - 5 штук.
  5. Должна быть возможность добавить от имени текущего пользователя ответ на вопрос с сохранением ответа в бд.
  6. Система должна проверить введенный пользователем ответ на вопрос и сверить его с правильным ответов на этот вопрос. Результат проверки сохраняется в бд для конкретного пользователя.
  7. Должна быть возможность пользователю посмотреть только свои ответы
  8. (Опциональное требование) Должна быть возможность посмотреть статистику прохождения "тестирования". В статистике должно отображаться:
    1. сколько всего пользователей зарегистрировано в системе
    2. сколько пользователей прошли тестирование
    3. сколько пользователей ответили на все вопросы тестирования
    4. сколько пользователей ответили на все вопросы тестирования правильно.
  9. (Опциональное требование) Должна быть возможность посмотреть статистику по текущему пользователю:
    1. процент прохождения тестирования текущего пользователя (сколько правильных ответов он дал)
    2. сколько процентов людей справилось с тестированием хуже текущего пользователя
    3. сколько процентов людей справилось с тестированием лучше текущего пользователя.

Не функциональные требования:

  1. Код оформить на гитхабе и прислать ссылку на репозиторий.
  2. В поставке должна быть понятная инструкция по запуску сервиса
  3. (Опциональное требование)  Поставка и запуск сервиса должны осуществляться средствами docker
  4. Используемые технологии: Java 8+, Spring 5+, SpringBoot 2+, Maven 3+.  REST архитектура.
  5. Все сервисы в программе должны решать строго определённую задачу (см SOLID).
  6. Все сервисы должны быть определены в конфигурации Spring и инжектится по месту использования.
  7. База данных может быть inmemory.
  8. Для работы с БД желательно использовать Spring JDBC template или Spring Data JDBC или просто JDBC. ( не надо использовать JPA и Hibernate ).
  9. (Опциональное требование) сервис, по возможности, покрыть Unit-тестами.

Примеры запросов

### Регистрация пользователя
POST http://localhost:8080/signup
Content-Type: application/json

{
  "username": "max",
  "password": "1234",
  "passwordConfirm": "1234"
}

### Логин пользователя
POST http://localhost:8080/signin
Content-Type: application/json

{
  "username": "max",
  "password": "1234"
}

### Создать вопросы
POST http://localhost:8080/questions
Content-Type: application/json

[
  {
    "q": "The capital of the Great Britain?",
    "a": ["London"],
    "type": "FREE"
  },
  {
    "q": "What is the best programming language?",
    "a": [
      "Java",
      "C++",
      "Brainfuck",
      "Prolog"
    ],
    "index": 0,
    "type": "CHOICE"
  },
  {
    "q": "Best world's hockey player nickname?",
    "a": ["Ovi"],
    "type": "FREE"
  },
  {
    "q": "public static void ...?",
    "a": [
      "brain",
      "slave",
      "main",
      "crap"
    ],
    "index": 2,
    "type": "CHOICE"
  },
  {
    "q": "GoF?",
    "a": ["Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides"],
    "type": "FREE"
  },
  {
    "q": "calling ... forces the current thread to wait until some other thread invokes notify()",
    "a": [
      "exit(-1)",
      "wait()",
      "System.gc()",
      "main()"
    ],
    "index": 1,
    "type": "CHOICE"
  }
]

### Посмотреть свои ответы
GET http://localhost:8080/snapshot
Content-Type: application/json
Authorization: dffe54ac-dea4-4e0a-9af8-dbdb5f4af29c

### Ответить
POST http://localhost:8080/answer
Content-Type: application/json
Authorization: d4faf6f0-9753-401d-85f7-ad25286d7046

{
  "questionId": 1,
  "userValue": "test"
}