Backend PHP | Full stack dev test task v2

Перед началом выполнения задания внимательно прочтите этот текст!

Структура

В папке system находится наше модифицированное ядро CodeIgniter v3. Некоторая информация находится в папке system/README.MD

В папке application реализован полный пример приложения-инстаграма. Main_page - контроллер, где есть готовые Endpoints. В нем существуют пути-методы: инициализация объекта, получение данных, препарация данных и передача на фронт. Там же есть пример класса комментариев, поста, пользователя. После установки вы увидите главную страницу с информацией которая поможет сделать задание.

Мы работаем всегда с моделями Emerald_model - наши ORM-OOP модели для работы с базой, связями. Они представляют базу данных и работу с ней. Вся логика также хранится в них.

Инициализация

PHP

Версии PHP 7.1+ . Составлялось и проверялось на 7.3

NGinx

nginx/test_task.conf - в nginx conf.d или sites_available укажите ваш домен CI_DOMAIN, к примеру sometestworkspace.com

Приложение

Изменить на ваши пути public/index.php - $application_folder

config/database.php - параметры базы

MySQL

mysql/dump.sql - залить дамп

Какие то мелочи могут не работать, например php - short_open_tags -> on. Фиксим вручную :)

После сделаного тестового.

Заливайте пожалуйста новый дамп базы, config файл nginx, если надо собрать фронт - прям тут напишите инструкцию! Спасибо за понимание!


ЗАДАЧИ

Задачи идут по возрастанию сложности кроме "задачи со звездочкой". Не обязательно выполнять все до единой, но каждая задача показывает Ваш уровень разработки по-своему.

У нас в нашем мини-инстаграме уже есть список постов и просмотр информации о посте. Но вот не хватает чуть монетизации и юзабилити.

  1. /main_page/login - Реализовать авторизацию. Login model уже содержит наброски для работы с сессией. Достаточно сделать логин-пароль авторизацию в базе данных. Для удобства пароль можно не шифровать, чтобы при проверке мы могли легко авторизоваться.

  2. /main_page/comment - Реализовать возможность комментирования постов.

Задачка "со звездочкой": Реализовать вложенные комментарии. Количество уровней вложенности не ограничено. Любыми способами на основе нашей текущей структуры переделать/улучшить/расширить возможность комментирования любого поста неограниченное число раз.

  1. /main_page/like - Реализовать возможность лайкнуть пост или комментарий. Число лайков на один пост/комментарий не ограничено (пользователь может лайкать пока у него на балансе еще есть лайки).

  2. /main_page/add_money - Реализовать монетизацию. Есть готовый API-Endpoint для зачисления средств принимающий количество валюты. У юзеров в базе есть столбец wallet_balance отвечающий за баланс. wallet_total_refilled - сумма, на которую юзер пополнил баланс за все время, wallet_total_withdrawn - сумма, которую юзер потратил (превратил в лайки). Эти два поля должны учитывать все действия по счету пользователя (пополнения и траты). Используемая валюта - доллар США.

  3. /main_page/buy_boosterpack - Поскольку сейчас в мире самым популярным способом монетизации игр является покупка "бустерпаков" - сундуков/ящиков/кейсов с предметами/карточками/деньгами, - предлагаем реализовать эту максимально простую функциональность для наших пользователей :)

Нужно создать 3 бустерпака которые будут стоить 5$, 20$ и 50$. В базе для этого присутствует структура, класс также частично реализован. Покупая такой пак пользователь получает случайное количество лайков которые может потратить на "лайкинг" постов и комментариев. Лайки попадают на "лайк-счет" пользователя с которого он их будет тратить, то есть параллельно храним как счет в $, так и отдельный счет числа лайков у юзера.

Логика бустерпака:

С учетом накопленного профитбанка нужно выбрать доступную для выдачи часть бустерпака с учетом его цены.
Основываясь на этом из диапазона от 1 лайка до [цена бустерпака + профитбанк] рандомно нужно выбрать  
получаемое юзером число лайков.  
По результату выполнения нужно уменьшить значение профитбанка на сумму  
[цена бустерпака — стоимость выданных в текущем открытии лайков]

1 лайк эквивалентен 1$.

	Рассмотрим пример бустерпака за 5$:

	Банк равен 0$. Пользователь покупает пак за 5$.

Формула: результат = рандом(от 1 до [цена бустерпака + профитбанк])  == рандом(от 1 до 5). Допустим,  
юзер получил 2 лайка, в банк уходит 5$ - 2 лайка(2$) = 3$

	Банк равен 3$. Пользователь покупает еще один пак за 5$.

Формула: итог = рандом(от 1 до [цена бустерпака + профитбанк])  == рандом(от 1 до 8). Допустим,  
юзер получил 2 лайка, в банк уходит 5$ - 4 лайка(4$) = 1$, итого банк равен $4

	Банк равен 4$. Пользователь покупает еще один пак за 5$.

Формула: итог = рандом(от 1 до [цена бустерпака + профитбанк])  == рандом(от 1 до 9). Допустим,  
юзер получил 8 лайков, в таком случае в банк уходит 5$ - 8 лайка(8$) = -3$, итого банк равен $1

Таким образом разность между результатом юзера и ценой бустерпака которую мы не выдали ему используется в будущих открытиях и выдается кому-то из следующих юзеров.

  1. Обеспечение максимальной безопасности. Думаю тут не нужно объснять, что мы должны логировать все действия с балансом? :)

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

Ожидаемый результат по тестовому заданию для проверки: работоспособность через HTTP-запрос методов.

Дополнительная задача Vue.js | Frontend - Fullstack

Реализовать описанную в задачах выше функциональность на фронте. Вот требования к реализации фронта по каждой из них:

  1. Авторизация, обновление страницы после отправки данных.

  2. Комментирование, вложенность комментариев (если реализована на беке).

  3. Возможность на фронте лайкать посты и комментарии (в том числе вложенные если вложенность реализована).

  4. Отображение баланса пользователя в $ и лайках. В отдельной мочалке реализовать через запрос на бек отображение истории пополнений и расходов, в отдельном табе модалки показать общую пополненную сумму юзером, общую потраченную сумму, текущий баланс.

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

  6. По связи безопасности и фронта конкретных требований нет но Вы можете проявить креативность.

Удачи Вам! ;)