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 интуитивно удобным.
⚠️ **GitHub.com Fallback** ⚠️