# Техническая спецификация (руководство администратора) мобильного приложения PhageView
## Архитектура приложения
Из каких компонентов состоит, как они взаимодействуют между собой
Графическая схема компонентов и связей (в визио)
## Структура БД
В виде графической схемы и в виде текстового описания (в виде таблицы с названиями полей, их типами данных и описанием)

### Справочник бактерий
Имя таблицы - Bacteria
| Имя поля | Тип данных | Назначение |
| -------- | -------- | -------- |
| id| int (auto increment)|уникальный код, первичный ключ|
| name|character varying(255)| наименование бактерии
| createdAt| datetime| дата и время создания записи|
| updatedAt| datetime| дата и время редактирования записи|
### Справочник бактериафагов
Имя таблицы - Bacteria
| Имя поля | Тип данных | Назначение |
| -------- | -------- | -------- |
| id| int (auto increment)|уникальный код, первичный ключ|
| name|character varying(255)| наименование бактериофага
| letter|character varying(255)| буква номера серии
| createdAt| datetime| дата и время создания записи|
| updatedAt| datetime| дата и время редактирования записи|
### Справочник лабораторий
Имя таблицы - Laboratory
| Имя поля | Тип данных | Назначение |
| -------- | -------- | -------- |
| id| int (auto increment) | уникальный код, первичный ключ |
| name|character varying(255)| наименование лаборатории |
| city| character varying(255)| город|
| createdAt| datetime| дата и время создания записи|
| updatedAt| datetime| дата и время редактирования записи|
### Справочник медицинских организаций
Имя таблицы - Bacteria
| Имя поля | Тип данных | Назначение |
| -------- | -------- | -------- |
| id| int (auto increment)|уникальный код, первичный ключ|
| name|character varying(255)| наименование медицинской организации
| createdAt| datetime| дата и время создания записи|
| updatedAt| datetime| дата и время редактирования записи|
### Отчеты
Имя таблицы - Reports
| Имя поля | Тип данных | Назначение |
| -------- | -------- | -------- |
| id| int (auto increment)|уникальный код, первичный ключ|
| creatorId| int (auto increment)|ссылка на уникальный ключ|
| executorId| int (auto increment)|ссылка на уникальный ключ|
| managerId| int (auto increment)|ссылка на уникальный ключ|
| bactId| int (auto increment)|ссылка на уникальный ключ|
| drugId| int (auto increment)|ссылка на уникальный ключ|
| medOrgId| int (auto increment)|ссылка на уникальный ключ|
| number|character varying(255)|номер отчета |
| sensivity|"enum_Reports_sensitivity"|чувствительность|
| date|datetime|дата формарования отчета|
| statusId| int (auto increment)|ссылка на уникальный ключ|
| managerStatusId|int (auto increment)|ссылка на уникальный ключ|
| createdAt| datetime| дата и время создания записи|
| updatedAt| datetime| дата и время редактирования записи|
### Комментарии отчета
Имя таблицы - ReportComments
| Имя поля | Тип данных | Назначение |
| -------- | -------- | -------- |
| id| int (auto increment)|уникальный код, первичный ключ|
| userId| int (auto increment)|ссылка на уникальный ключ|
| reportId| int (auto increment)|ссылка на уникальный ключ|
| text|character varying(255)|текст отчета|
| createdAt| datetime| дата и время создания записи|
| updatedAt| datetime| дата и время редактирования записи|
### История просмотров комментарий к отчету*
Имя таблицы - ReportShowComments
| Имя поля | Тип данных | Назначение |
| -------- | -------- | -------- |
| id| int (auto increment)|уникальный код, первичный ключ|
| userId| int (auto increment)|ссылка на уникальный ключ|
| reportId| int (auto increment)|ссылка на уникальный ключ|
| lastReadComId | int (auto increment)|ссылка на уникальный ключ|
| createdAt| datetime| дата и время создания записи|
| updatedAt| datetime| дата и время редактирования записи|
### Статусы отчета
Имя таблицы - ReportStatuses
| Имя поля | Тип данных | Назначение |
| -------- | -------- | -------- |
| id| int (auto increment)|уникальный код, первичный ключ|
| name|character varying(255)|название|
| description|character varying(255)|описание|
| createdAt| datetime| дата и время создания записи|
| updatedAt| datetime| дата и время редактирования записи|
### История статусов отчета
Имя таблицы - ReportStatusHistories
| Имя поля | Тип данных | Назначение |
| -------- | -------- | -------- |
| id| int (auto increment)|уникальный код, первичный ключ|
| userId| int (auto increment)|ссылка на уникальный ключ|
| reportId| int (auto increment)|ссылка на уникальный ключ|
| oldStatusId| int (auto increment)|ссылка на уникальный ключ|
| newStatusId| int (auto increment)|ссылка на уникальный ключ|
| name|character varying(255)|название|
| description|character varying(255)|описание|
| createdAt| datetime| дата и время создания записи|
| updatedAt| datetime| дата и время редактирования записи|
### Вложения отчета
Имя таблицы - ReportAttachments
| Имя поля | Тип данных | Назначение |
| -------- | -------- | -------- |
| id| int (auto increment)|уникальный код, первичный ключ|
| reportId| int (auto increment)|ссылка на уникальный ключ|
| photoPath|character varying(255)|фотография|
| thumbnailPath |character varying(255)|путь фотографии|
| width| int (auto increment)|ширина|
| height| int (auto increment)|высота|
| createdAt| datetime| дата и время создания записи|
| updatedAt| datetime| дата и время редактирования записи|
### Пользователи
Имя таблицы - Users
| Имя поля | Тип данных | Назначение |
| -------- | -------- | -------- |
| id| int (auto increment)|уникальный код, первичный ключ|
| labId| int (auto increment)|ссылка на уникальный код|
| number|character varying(255)|номер|
| userName |character varying(255)| имя пользователь|
| login |character varying(255)|логин|
| password |character varying(255)|пароль|
| typeUser |"enum_Users_typeUser"|тип пользователя|
| creatorId| int (auto increment)|ссылка на уникальный код|
| creatorIp|character varying(255)|ip создателя|
| updaterId| int (auto increment)|ссылка на уникальный код|
| updaterIp|character varying(255)|ip редактора|
| createdAt| datetime| дата и время создания записи|
| updatedAt| datetime| дата и время редактирования записи|
### Токен пользователя
Имя таблицы - UserTokens
| Имя поля | Тип данных | Назначение |
| -------- | -------- | -------- |
| id| int (auto increment)|уникальный код, первичный ключ|
| userId| int (auto increment)|ссылка на уникальный код|
| accessToken|character varying(255)|токен доступа|
| notificationToken|character varying(255)|токен уведомления|
| createdAt| datetime| дата и время создания записи|
| updatedAt| datetime| дата и время редактирования записи|
## Запросы API и структуры данных
документация в swagger
## Описание модулей исходного кода backend
На чём написан (язык, фреймворк, ключевые библиотеки, используемая IDE)
Как склонировать проект, открыть его в IDE, установить зависимости и запустить
Основные модули (классы) и взаимодействие между ними (вкратце)
Основные настройки в исходном коде (ключевые константы)
## Описание модулей исходного кода frontent интерфейса администратора
На чём написан (язык, фреймворк, ключевые библиотеки, используемая IDE)
Как склонировать проект, открыть его в IDE, установить зависимости и запустить
Основные модули (классы) и взаимодействие между ними (вкратце)
Основные настройки в исходном коде (ключевые константы)
## Описание модулей исходного кода мобильного приложения
На чём написан (язык, фреймворк, ключевые библиотеки, используемая IDE)
Как склонировать проект, открыть его в IDE, установить зависимости и запустить
Основные модули (классы) и взаимодействие между ними (вкратце)
Основные настройки в исходном коде (ключевые константы)
## Развёртывание на сервере
Для развертывания приложения необходимы ПО: PostgreSQL, Nginx, pm2, git, nodejs.
Установка git:
1. git --version - Чаще всего гит уже установлен, поэтому следует сперва проверить его наличие.
2. sudo apt-get update - обновление информации репозиториев
3. sudo apt-get install git - установка гит
4. git --version - проверка в правильности установки
Установка PostgreSql:
1. Выбрать сервер PostgreSQL определенной версии;
2. apt-get update - Обновить информацию репозиториев;
3. apt-get install postgresql"номер версии"-server - установка Postgresql;
4. service postgresql start - запуск службы;
Установка Nginx:
1. sudo apt-get update - Обновление информации репозиториев;
2. sudo apt-get install nginx - Установка nginx;
3. systemctl status nginx - Проверка статуса nginx
Установка nodejs:
1. sudo apt-get dist-upgrade
2. sudo apt-get install node python gcc++ wget make
3. sudo npm install npm -g
Установка pm2:
1. sudo npm install pm2@latest -g
2. pm2 start app.js
Настройка сервера.
Скачиваем backend на сервер:
1. Заходим в настройки аккаунта GitHub 
2. Переходим в настройки разработчика и создаем токен личного доступа: 
3. После создания возвращаемся в консоль сервера и скачиваем репозиторий командой :
git pull https://github.com/"login"/"name_project".git
4. В появившихся полях ввода следует вписать сперва username GitHub, а в поле ввода пароля - сгенерированный токен.
После установки backend следует настроить nginx:
1. sudo nano /etc/nginx/sites-available/default.conf - Открываем конфиг
2. Дальше следует дописать недостающиеся строки 
3. Сохраняем конфиг и закрываем его Ctrl + S, Ctrl + X
4. sudo nginx -t - проверяем на наличие ошибок синтаксиса в файлах nginx
6. sudo systemctl restart nginx - перезапускаем Веб-сервер
Следующий этап - создание базы данных:
1. psql -U postgres - осуществляем вход под администратором;
2. createuser -U postgres --no-superuser --no-createdb --no-createrole --encrypted --pwprompt ПОЛЬЗОВАТЕЛЬ - Создание пользователя;
3. createdb -U postgres -O [ПОЛЬЗОВАТЕЛЬ] [БАЗА] - Создание базы данных;
4. exit - выходим из postgreSQL
5. sudo systemctl restart postgreSQL - перезапускаем службу
6. sudo systemctl status postgreSQL - проверяем на наличие ошибок и активность postgreSQL
Последний этап - запуск приложения
1. pm2 start app.js - Производит запуск backend
2. pm2 startup systemd - Генерирует и настраивает скрипт запуска pm2
3. sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u server_name --hp /home/'server_name' - команда, которую нужно запустить с привилегиями суперпользователя для настройки запуска PM2 при загрузке.
4. pm2 save - сохранение процессов pm2 и соотвествующей среды.
5. sudo systemctl start pm2-"server_name" - запускает службу
Перечень необходимого ПО (веб-сервер, СУБД и др.), его установка и настройка (кратко)
### Миграции БД
npm i - установка всех модулей
npx seqeulize db:create - Создание миграций
npx seqeulize db:migrate - миграция БД
npx seqeulize db:migrate:undo - отмена последней миграции
npx seqeulize db:migrate:undo:all - отмена всех миграций
npx seqeulize db:drop - удаление миграции
npm run dev - запуск в тестовом режиме
### Настройка межсетевого экрана
Какие порты нужно открыть для нормальной работы приложения и как это сделать
В случае если SSL-сертификат еще не настроен, в файерволе требуется включить Nginx HTTP который открывает 80 порт - незашифрованный веб-трафик.
После настройки SSL-сертификата следует включить Nginx HTTPS, который откроет 443 порт с защищенным веб-трафиком
### Управление приложением
Запуск, остановка, перезапуск модулей (бэк, фронт) и ПО (веб-сервер).
sudo systemctl start "модуль";
sudo systemctl stop "модуль";
sudo systemctl restart "модуль";
Как убедиться, что все сервисы работают
sudo systemctl status postgreSQL;
sudo systemctl status Nginx;
sudo systemctl status git;
## Мониторинг работы и отладка приложения
Где и как смотреть логи, как в них увидеть журнал событий и причины возникших ошибок
Что делать в случае возникновения ошибок - имеется ввиду в каком лог-файле смотреть сообщение об ошибке (исключительной ситуации).
В случае ошибок со стороны приложения или сайта требуется посмотреть лог pm2. Для этого в консоль нужно ввести pm2 monit, после которой откроется таблица с процессами, логами, метаданными и метрикой.
Если же приложение полностью легло, то нужно посмотреть логи и статусы Nginx и PostgreSQL, введя команды:
sudo systemctl status postgreSQL;
sudo systemctl status Nginx;
## Управление публикацией мобильного приложения
Ключевые параметры и настройки публикации приложения в магазинах
### AppStore
#### Изменение названия и описания приложения
Если вы уже создали новую версию в ITC, вы можете изменить название и описание своих приложений, выполнив следующие действия:
В iTunes Connect щелкните ваше приложение, и вы увидите версии внизу страницы, нажмите "Просмотреть сведения" о вашей обновленной версии (например, 1.1).
Затем нажмите "Редактировать" рядом с "Метаданными и загрузками"

Во всплывающем окне измените текст в полях "Название приложения" и "Описание"

После отправить на проверку.
#### Изменение иконки и онбординг приложения
Загрузите маркетинговые материалы
Загрузите до 5-ти скриншотов на каждое разрешение экрана. Скриншоты не должны содержать прозрачность.
Параметры разрешения должны быть следующими:
1242х2208, 2208х1242
и
1242х2688, 2688х1242 1284х2778 или 2778х1284
Загрузите иконки приложения. Иконка должна быть без скруглений и прозрачности. Для каждого девайса, существуют разные параметры:
— iPhone: 180×180 пикселей или 120×120 пикселей. Формат PNG или JPEG;
— iPad Pro: 167 пикселей;
— iPad, iPad mini: 152x152 пикселей;
— App Store: 1024x1024 пикселей.
### Google Play
#### Изменение названия и описания приложения
Откройте учетную запись разработчика
Выберите приложение, для которого вы хотите изменить имя приложения в магазине игр. После выбора приложения отображается этот диалог.
Затем прокрутите немного вниз, вы увидите опцию « Список магазинов ». Нажмите на нее. справа вы можете увидеть поля заголовка, краткого и полного описания. Измените поля и отправьте на проверку.
