Обязанности

  • Разработка серверной части web-приложений (NestJS, Node.js, PostgreSQL)
  • Разработка клиентских частей приложения на TypeScript, Vue.js, Quasar.

Требования

  • Базовые знания JavaScript. Хорошо, если знаком также TypeScript.
  • Теоретические знания хотя бы одного из фреймворков для разработки веб-приложений (можно не на JS).
  • Готовность к изучению множества технологий разработки одновременно в свое личное время.
  • Приветствуется владение чем-нибудь из перечисленного: SQL, HTML, CSS (также lesscss, sass), Linux CLI, Docker, git, WebStorm (или другие IDE/редакторы).
  • Приветствуется базовая грамотность в Computer Science, включая базы данных, сетевые технологии, технологические стеки построения веб-приложений, устройства операционных систем (в первую очередь семейства Linux). Ориентиры: https://yollection.ru/road/backend, https://yollection.ru/road/frontend.

Задание 1. Разработать функцию определения счета в игре

Задача

В примере кода ниже генерируется список фиксаций состояния счета игры в течение матча.
Разработайте функцию getScore(gameStamps, offset), которая вернет счет на момент offset в списке gameStamps.
Нужно суметь понять суть написанного кода, заметить нюансы, разработать функцию вписывающуюся стилем в существующий код, желательно адекватной алгоритмической сложности.

const TIMESTAMPS_COUNT = 50000;

const PROBABILITY_SCORE_CHANGED = 0.0001;

const PROBABILITY_HOME_SCORE = 0.45;

const OFFSET_MAX_STEP = 3;

type Score = {
home: number;
away: number;
};

type Stamp = {
offset: number;
score: Score;
};

const emptyScoreStamp: Stamp = {
offset: 0,
score: {
home: 0,
away: 0,
},
};

export const generateStamps = (): Stamp[] => {
const scoreStamps = Array(TIMESTAMPS_COUNT)
.fill(emptyScoreStamp)
.map(
((acc) => () => {
const scoreChanged =
Math.random() > 1 - PROBABILITY_SCORE_CHANGED;
const homeScoreChange =
scoreChanged && Math.random() < PROBABILITY_HOME_SCORE
? 1
: 0;
const awayScoreChange =
scoreChanged && !homeScoreChange ? 1 : 0;
return {
offset: (acc.offset +=
Math.floor(Math.random() * OFFSET_MAX_STEP) + 1),
score: {
home: (acc.score.home += homeScoreChange),
away: (acc.score.away += awayScoreChange),
},
};
})(emptyScoreStamp)
);

return scoreStamps;
};

export const getScore = (gameStamps: Stamp[], offset: number): Score => {
// continue the function's implementation
};

Результат

  1. Ссылка на gist с исходным кодом функции.

Задание 2. Разработать тесты для функции определения счета в игре

Задача

Для разработанной в предыдущем задании функции getScore(gameStamps, offset) разработайте unit-тесты на базе библиотеки jest.
Тесты должны учитывать все возможные случаи использования функции, концентрироваться на проверке одного случая, не повторяться, название тестов должно отражать суть выполняемой проверки.

Результат

  1. Ссылка на gist с исходным кодом тестов.

Задание 3. Разработать серверную и клиентскую части реализующие JWT аутентификацию

Задача

Должны быть разработаны следующие возможности:
Регистрация нового пользователя, email в качестве login, задаваемый пользователем пароль. Подтверждение email’а не требуется.
Вход (logging in) пользователя в систему.
Выход (logging out) пользователя из системы.
Создание, получение, редактирование, удаление (CRUD) пользователем информации о себе: Имя, Телефон, Адрес, Информация о себе.
Серверная часть реализует соответствующие эндпоинты, клиентская часть реализует пользовательский интерфейс и передачу данных из него на сервер.

Замечания к реализации

Для разработки серверной части следует использовать TypeScript, Nest.js.
Работа с JWT: https://docs.nestjs.com/security/authentication#jwt-functionality
Для разработки клиентской части следует использовать Quasar, для взаимодействия с API axios (предусмотреть сценарии истечения access token’а с помощью axios interceptors).

Результат

  1. Ссылка на развернутое приложение, в котором можно проверить описанный в задании функционал.
  2. Ссылки на git-репозитории с исходными кодами решения.