Найдите исполнителя для вашего проекта прямо сейчас!
Разместите заказ на фриланс-бирже и предложения поступят уже через несколько минут.

Нужно написать на node.js бекенд для вот такого дашборда https://bit.ly/3n7MP1x

Работа состоит из двух частей:

1. Парсер, который будет периодически забирать из ftp csv и xml файлы, разбирать их и складывать в БД (postgresql)

2. API, которое будет отдавать данные фронтенду.

Ниже текстовое ТЗ, а вот здесь красивое ТЗ с картинками: https://living-pentagon-5f4.notion.site/b84bc8af445c4f45923f5d77e35509e0

Часть 1.1: Парсинг csv

Раз в сутки скачать zip-архив с файлами CSV вот такого вида: https://www.dropbox.com/s/gukumii5lavcb87/Simplewealth_AG_Inception_December_21_2021.csv?dl=0

Нужно скачать свежий zip, разложить содержимое csv по таблицам в БД (если таблицы нет или какого-то поля в ней нет - создать)

Названия таблиц предлагаю формировать так:

- префикс: IbImport

- название: первый столбец + SubSection (если есть), пробелы убираем

Пример: https://monosnap.com/file/92XRfdNex2PlTgGxUlSJjkNEWfCJk3

Названия полей внутри таблиц предлагаю формировать исходя из полей Header, например: https://monosnap.com/file/LbXyEpMrkpFpasdglwD8xPdwyWT19j

Дополнительно:

- в каждой таблице должно быть поле id

- в каждой таблице должно быть поле IntroductionID - ссылка (внешний ключ) на запись в таблице IbImportIntroduction

- если в таблице есть MetaInfo - должно быть поле MetaInfoID, ссылка на таблицу IbImportMetaInfo

Все данные импортируем как строки, т.е. “как есть”. Исключение только для IbImportMetainfo.AnalysisPeriod - тут нужно сохранить “как есть” + распарсить даты и сохранить AnalysisPeriodBegin и AnalysisPeriodEnd

Дополнительно в поля IbImportIntroduction: ImportFile, ImportDate, ImportIBUID записываем имя импортируемого файла, дату импорта и ID аккаунта (он есть в названии файла)

Часть 1.2: Парсинг xml

Раз в сутки скачать из ftp xml-файл вот такого вида: https://www.dropbox.com/s/4wr928qhdfmb11c/clientonly.xml?dl=0

Нужно скачать свежий файл и разложить содержимое по таблицам в БД (если таблицы нет или какого-то поля в ней нет - создать. НО! Если внутри тега нет данных - пустую таблицу создавать не нужно)

Названия таблиц предлагаю формировать так:

- префикс: IbImport

- название: Названия тегов внутри

Названия полей внутри таблицы - по названию атрибутов

Пример: https://monosnap.com/file/OeXuVe8jFXeRUhhZBbyys6AFMrmdOp

Дополнительно:

- в каждой таблице должно быть поле id

- нужно сохранить данные из тега в таблицу FlexStatement

- данные из AccountInformation нужно сохранять только если они поменялись, и в этом случае нужно создавать новую запись а не обновлять старую.

- в каждой таблице должны быть поля FlexStatementID и AccountInformatinID - ссылки на соотв. таблицы

Часть 2: API

Нужны три endpoint’а:

1) POST /clientAuth

Принимает email и пароль, сравнивает с данными в таблице Users, возвращает "result": true/false и ставит сессионную куку

2) GET /table?name={TableName}&fields={FieldName1},{FieldName2},{FieldName3},...

Возвращает запрашиваемые поля указанной таблицы:

- из последнего импорта (определяем по IbImportIntroduction.ImportDate)

- для текущего пользователя (из cookies получаем имя сессии, по ней находим пользователя, получаем его IBUID)

- Если поля не перечислены - возвращает все поля таблицы

3) POST /table?name={Table}

Пример:

curl -X POST "https://api.service.com/table?name=Users" \

-d '{

"set": {"portfolio": "3", "duration": "5 years"},

"where": {"id": "123"}

}'

- По сессии проверяем что текущий пользователь - админ (Users.role=admin)

- исполнить UPDATE Users SET portfolio="3", duration="5 years" WHERE id="123"

- Перед исполнением проверить, - если запрос затронет больше одной записи, то вернуть ошибку

Формат ответа:

{

"result": {

"id":"2d4d028de3015345da9420df5514dad0",

"name":"blog.example.com",

"content":"2.6.4.5"

},

"success": true,

"errors": [],

"messages": [],

"result_info": {

"page": 1,

"per_page": 20,

"count": 1,

"total_count": 200

}

}

{

"result": null,

"success": false,

"errors": [{"code":1003,"message":"Invalid or missing id."}],

"messages": []

}

Пагинация:

curl "https://api.service.com/zones?page=3&per_page=20&order=type&direction=asc"

По умолчанию: page=1, per_page=100, order=id, direction=ASC

HTTP response codes:

- 200 OK request successful

- 400 Bad Request request was invalid

- 401 Unauthorized user does not have permission

- 403 Forbidden request not authenticated

- 405 Method Not Allowed incorrect HTTP method provided

Предлодите цену и сроки.

2 года назад
dtx
41 годУкраина
16 лет в сервисе
Был
месяц назад