5. Слой источников данных - gilgenbergg/green_office GitHub Wiki
На первом этапе при проектировании для отладки бизнес-логики в качестве промежуточного слоя хранения использовался паттерн репозиторий. Для хранения элементов каждой сущности заводились коллекции (ArrayList) и были определены основные операции работы с данными, аналогичные используемым при работе с базой данных. Для генерации валидного идентификатора был определен класс IDGenerator, основной метод генерации которого принимал на вход сущность, в коллекцию которой добавляется новый элемент и учитывающий пропущенные численные значения id и в случае их отсутствия берущий в качестве кода следующий за последним занятым.
Все классы репозитория сгруппированы в один пакет “repo”:
Для реализации слоя данных было принято решение использовать реляционную СУБД PostgreSQL. Подключение реализовано в синглтон-классе DBinit, который реализовывал единую точку подключения к БД посредством соединения при помощи JDBC драйвера, тем самым предоставляя единые данные для всех преобразователей (паттерн “Data Mapper” для каждого класса бизнес-логики).
Все классы источника данных расположены в пакете data:
Для отображения объектов из системы в базу данных использовался паттерн Identity Field, представляющий собой id внутри каждой таблицы, генерируемое автоматически. Для отображения внешних ключей с целью сохранения связей используется Foreign Key Mapping паттерн. Каждая сущность имеет собственный маппер и отображается в соответствующую таблицу. В результате был сформирован следующий вид базы данных:
Класс для обмена данными с таблицей auth_data - AuthMapper
- ArrayList allItems() - получение всех авторизационных записей зарегистрированных пользователей.
- boolean addAuthData(AuthData item) - добавление новой записи (при регистрации).
- AuthData findItemByUID(Integer receivedUID) - поиск авторизационных данных для пользователя по его идентификационному номеру.
- AuthData findItemByLogin(String login) - поиск пары значений “логин-пароль” по логину (для проверки корректности введенных данных). Класс для обмена данными с таблицей creq - CReqsMapper
- ArrayList filterByStatus(ClientRequest.Status status) - фильтрация клиентских заявок по конкретному статусу.
- ArrayList filterByType(ClientRequest.Type type) - фильтрация заявок по типу.
- ClientRequest addCReq(ClientRequest item) - добавление заявки в БД.
- Integer assignAdmin() - случайный идентификатор админа для закрепления за ним заявки.
- boolean updateStatus(Integer cReqID, ClientRequest.Status status) - перевод заявки в другой статус.
- boolean updateType(Integer cReqID, ClientRequest.Type type) - изменение типа заявки.
- boolean updateAdminID(Integer cReqID, Integer adminID) - изменение ответственного за обработку заявки админа.
- boolean updateLandscaperID(Integer cReqID, Integer landscaperID) - изменение ответственного за выполнение заявки садовника.
- ArrayList allItems() - получение списка всех заявок.
- List filterByUID(Integer uid) - получение всех заявок конкретного клиента.
- List filterByAdminID(Integer uid) - получения всех заявок, над которыми работает конкретный админ.
- List filterByLandscaperID(Integer uid) - получение всех заявок, над которыми работает конкретный садовник.
- ClientRequest findItemByID(Integer cReqID) - получение заявки по идентификационному номеру.
- boolean updatePlant(Integer plantID, ClientRequest itemByID) - изменить привязанное к заявке растение.
- List filterByPlantID(Integer plantID) - получить все заявки, с которыми связано данное растение. Помимо этих методов непосредственно взаимодействующих с БД в классе есть два дополнительных метода парсинга статуса и типа заявки из строкового представления в базе данных в объект соответствующего типа на уровне бизнес-логики сущности ClientRequest. Класс для обмена данными с таблицей preq - PReqsMapper
- ArrayList allItems() - получение всех заявок.
- PurchaseRequest findItemByID(Integer pReqID) - получение заявки по идентификационному номеру.
- Integer addPReq(PurchaseRequest item) - возвращает идентификатор созданной заявки на закупку;
- ArrayList filterByStatus(ClientRequest.Status status) - фильтрация заявок по статусу.
- boolean updateStatus(Integer pReqID, PurchaseRequest.Status status) - перевести заявку в другой статус.
- boolean updateAdminID(Integer pReqID, Integer adminID) - изменить ответственного за обработку заявки админа.
- boolean updateLandscaperID(Integer pReqID, Integer landscaperID) - изменить ответственного за проверку закупки садовника.
- Integer assignLandscaper() - получение случайного идентификатора садовника для закрепления за ним заявки.
- List filterByUserID(Integer uid) - получение закупок конкретного админа.
- List filterByLandscaperID(Integer uid) - получение заявок, которые закреплены за конкретным садовником для проверки. Предусмотрена возможность парсинга статуса заявки из строки в БД в поле сущности PurchaseRequest. Класс для обмена данными с таблицей plants - PlantsMapper
- Plant findItemByPlantID(Integer receivedPlantID) - поиск растения по идентификатору.
- List findResources(Integer plantID) - поиск ресурсов, купленных для данного растения.
- Plant addNewPlant(Plant item) - добавление нового растения.
- ArrayList allPlants() - получение всех растений в базе.
- boolean setDateOfLastVisit(Integer plantID, String lastInspection) - установка даты последней инспекции.
- boolean setDateOfNextVisit(Integer plantID, String nextInspection) - установка даты следующей инспекции.
- List filterPlantsByUserID(Integer uid) - получение списка растений клиента. Класс для обмена данными с таблицей required_resource - RequiredResMapper
- ArrayList findRequiredByPlantType(String plantType) - получение списка ресурсов, необходимых для работы над заявкой в соответствии с названием растения (его типом). Класс для обмена данными с таблицей resource - ResourcesMapper
- ArrayList findResourcesByPlantID(Integer receivedPlantID) - получение всех ресурсов, купленных для работы над данным растением.
- Resource getResourceByID(Integer resourceID) - получение ресурса по его идентификатору.
- ArrayList allItems() - получение списка всех ресурсов.
- Resource addNewItem(Resource newResource) - добавление нового ресурса в базу.
- ArrayList getTypesByPlantID(Integer plantID) - получение списка названий ресурсов, связанных с конкретным растением. Класс для обмена данными с таблицей user_iufo - UsersMapper
- ArrayList allItems() - получение всех пользователей.
- User findItemByUID(Integer receivedUID) - поиск пользователя по идентификатору в БД.
- User findItemByAuthID(Integer receivedAuthID) - поиск пользователя по его паре значений “логин-пароль”.
- ArrayList filterByRole(Role role) - получить список всех пользователей конкретной роли.
- ArrayList allClients() - получить всех клиентов.
- ArrayList allAdmins() - получить список всех админов.
- List allLandscapers() - получить список всех садовников.
- Client getClientByUserID(Integer uID) - получить клиента (в соответствии с его сущностью в рамках бизнеслогики) по идентификатору.
- Admin getAdminByUserID(Integer uID) - получить админа (в соответствии с его сущностью в рамках бизнеслогики) по идентификатору.
- Landscaper getLandscaperByUserID(Integer uID) - получить садовника (в соответствии с его сущностью в рамках бизнеслогики) по идентификатору.
- boolean addUser(User item) - добавить пользователя. В данном классе также предусмотрен метод парсинга строки с ролью пользователя в роль в рамках бизнес-логики. Обширное количество специфичных по поиску и обновлению данных в соответствии с конкретным полем позволяет производить выборочный update данных, а доступ к базе из каждого маппера через единственный экземпляр класса, осуществляющего конфигурацию подключения делает работу с БД более оптимальной, а использование методов преобразователей в контроллерах UI интуитивно удобным.