Нужно написать на 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
- название: Названия тегов внутри <FlexStatement>
Названия полей внутри таблицы - по названию атрибутов
Пример: https://monosnap.com/file/OeXuVe8jFXeRUhhZBbyys6AFMrmdOp
Дополнительно:
- в каждой таблице должно быть поле id
- нужно сохранить данные из тега <FlexStatement> в таблицу 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"
- Перед исполнением проверить, - если запрос затронет больше одной записи, то вернуть ошибку
Пагинация:
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