Backend rest api в виде отдельного модуля в yii2

Цена договорная
18 июня 2019, 12:02 • 5 откликов • 50 просмотров
День добрый

Ищем специалиста способного помочь разработкой модуля для специализированного ГЕО ПО. ПО собственной разработки, им занимается отдельная команда. Эти же коллеги будут прикручивать модуль к ПО и отвечать на ваши вопросы в ходе разработки.
С очень высокой вероятностью дальнейшая поддержка и развитие модуля также будет на вашей стороне, поэтому для продуктивности желателен весь набор самых лучших человеческих черт и знание того на чем мы работаем:
Постоянно используем
• Php
• yii2 (или другой фреймворк, с пониманием чем он лучше под задачу )
• js
• sql (join, вложенные запросы)

Временами используем
• Vue (или любой js фреймворк)
• postgre
• postgis
• vagrant

Наш стек
• Php
• Yii2
• Vue
• Vuex
• Vuetify
• vagrant
• leaflet
• yandex maps api
• postgre
• postgis

Собственно задание на модуль. От вас прошу оценку срока и стоимости. Ну и также насколько имеет возможность далее поддерживать и докручивать.
Спасибо.
Ps Ниже прилеплены файлы еще - там сэмплы данных (формат txt иначе прикрепить не мог, но по сути это csv).

PPs у нас два модуля на разработку второй тоже разместил как заказ отдельный.



++++++++++++++
в yii2
в виде отдельного модуля в yii2 (https://www.yiiframework.com/doc/api/2.0/yii-base-module).
Надо сделать несколько endpoint для работы с таблицей бд.

в базе на postgresql есть таблица с данными, с произвольными колонками
типы данных: int, float, varchar, boolean, date. В процессе еще может добавиться что угодно.

1 endpoint – получение информации о колонках таблицы.
Надо сделать endpoint, который отдает информацию о колонках в таблице
примерно в таком виде:

columns: [
{
“title”: “Название”,
“type”: “string”,
“column”: “title” ,
},
{
“title”: “Номер”,
“type”: “int”,
“column”: “number”,
“min”: 1,
“max”: 126
},
...
]

title - Название колонки, которое будет выводиться в интерфейсе. Должно браться из комментария колонки в таблице.
type – унифицированный тип данных. Например если в базе int или bigint, надо выводить как int. Тип данных колонки должен браться из базы.
Унифицированные типы данных:
• int,
• float,
• data,
• string,
• text
• boolean

column – название колонки, как она называется в базе
min, max – цифр и дат, надо считать минимальное и максимальное значение

Т.к. база меняется не часто, результат надо кэшировать через
https://www.yiiframework.com/doc/api/2.0/yii-cachi...
Надо сделать абстракцию, над Yii2 кэшированием, и обращаться к ней.

Получение информации о колонках в базе, надо сделать универсально. Отдельным классом, которому как свойства задаются название схемы и таблицы бд. И метод run(), который возвращает массив с данными по колонкам.
Пример:
$form = new TableColumnsInfo(‘public’, ‘data’);
$columns = $form→run()

Для выполнения запросов в виде простого sql надо сделать класс, с свойством $sql
и методами queryAll, queryOne, execute. Абстракция над createCommand (https://www.yiiframework.com/doc/api/2.0/yii-db-connection)


2 endpoint – фильтрация данных в таблице, подсчет строк
Должна быть модель (https://www.yiframework.com/doc/api/2.0/yii-db-activerecord) привязанная к нужной таблице.
Нужен класс, которому как, свойства будут задаваться объект запроса (https://www.yiiframework.com/doc/api/2.0/yii-db-query)
И массив с условиями фильтрации. Метод run, возвращающий объект запроса с навешанными условиями с помощью методов andFilterWhere и andWhere (https://www.yiiframework.com/doc/api/2.0/yii-db-querytrait#andFilterWhere()-detail).
$form = new QueryFilter(Query $query, Array $filters);
$query = $form→run();

пример массива условий:
[
{
“column”: “title”,
“condition”: “like”,
“value”: [“a”, “b”, “c”],
“not”: false
},
{
“column”: “number”,
“condition”: “between”,
“value”: {“min”: 11, “max”: “22”},
“not”: false
}
]

column – название колонки в базе
condition – тип условия. Одно из equal, like, between, greater_than, lower_than
not – префик not

в результате должен получиться объект запроса, с условием:
WHERE ( column LIKE ‘%a%’ OR column LIKE %b%’ OR olumn LIKE ‘%c%’) AND ( number BETWEEN 11 AND 22 )

На вход в endpoint будут подаваться 2 массива из условий
надо посчитать количество строк, отфильтрованных по 1 массиву.
Надо посчитать количество строк, отфильтрованных по 2 массиву, но считать надо из данных отфильтированных первым массивом.

Как вариант можно сделать вложенными запросами. Сгенерить объекты запросов и получить код sql запроса https://www.yiiframework.com/wiki/857/show-raw-sql...
и собрать обычный запрос в виде текста.


3 endpoint
Надо генерить и отдавать эксель из отфильтрованных данных.
Если на вход подается 1 массив с условиями, выгружать данные по нему.
Если на вход подаются 2 массива. Выгружать данные отфильтрованные сначала 1, потом 2 условиями




Файлы