Skip to content

Feature/mesenko

Дмитрий Месенко requested to merge feature/mesenko into main

Изменения:

Изменения в запросах:

Таблица User:

  • Добавлено поле deleted_at
  • Реализованы запросы:
    • Выборка всех пользователей, которые не удалены
    • Удаление пользователя и удаление всех заказов этого пользователя(Изменение поля deleted_at, сделано чтобы сохранить данные в БД)
    • Изменение пользователя, имя и возраст
    • Выборка всех заказов пользователя по id, если он не удалён
select o.* from users u join orders o on u.id = o.userid where u.id = ? and o.deleted_at is null

Реализована таблица Orders(заказы):

  • Поля таблицы:
id serial primary key,
userId int references users(id) not null,
amount int not null,
status order_status default 'Создан',
deleted_at timestamp
  • Реализован дополнительный тип(Enum):
create type order_status as enum('Создан', 'В работе', 'Закрыт');
  • Реализованы запросы:
    • Создание заказа
    • Выборка всех заказов, если он не удалён
    • Изменение статуса заказа
    • Удаление заказа (Изменение поля deleted_at, сделано чтобы сохранить данные в БД)
    • Выборка товаров в заказе по id, если заказ не удалён
select i.name, io.cost, io.amountitems
from orders o
join items_orders io on o.id = io.orderid
join items i on i.id = io.itemid
where o.id = ? and o.deleted_at is null

Реализована таблица Items(Товары):

  • Поля таблицы:
id serial primary key,
name varchar(100) not null,
cost int not null,
deleted_at timestamp
  • Реализованы запросы:
    • Сохранение товара
    • Выборка всего товара, если он не удалён
    • Выборка товара по id, он не удалён
    • Изменение товара(Наименование, цена)
    • Удаление в товара(Изменение поля deleted_at, сделано чтобы сохранить данные в БД)

Реализована таблица ItemsOrders(Техническая таблица для реализации связи многие ко многим):

  • Поля таблицы:
id serial primary key,
orderId int references orders(id),
itemId int references items(id),
cost int not null,
amountItems int not null
  • Реализован запрос на вставку

Изменения в DatabaseManager

  • Добавлена функция executeQuery с параметрами
fun <T> executeQueryWithParams(
            query: String,
            params: List<Any> = emptyList(),
            blockToExecute: (ResultSet) -> T,
        ): T =
            getConnection()
                .prepareStatement(query)
                .use { ps ->
                    params.forEachIndexed { index, param ->
                        ps.setObject(index + 1, param)
                    }
                    ps.executeQuery().use { blockToExecute(it) }
                }

Изменения в репозиториях

  • Добавлены репозитории ко всем новым таблицам и прописана реализация всех запросов
  • Функция создания заказа:
fun insertData(
        order: Order,
        items: Map<Int, Pair<Item, Int>>,
    ) {
        DatabaseManager.transaction { con ->
            val orderQuery = OrdersQuery.insertData
            val itemsOrderQuery = ItemsOrdersQuery.insertQuery
            val id: Int =
                DatabaseManager.executeQueryWithParams(orderQuery, listOf(order.userId, order.amount)) {
                    it.next()
                    return@executeQueryWithParams it.getInt("id")
                }
            items.forEach { (itemId, item) ->
                DatabaseManager.executeUpdate(itemsOrderQuery) {
                    it.setInt(1, id)
                    it.setInt(2, itemId)
                    it.setInt(3, item.first.cost)
                    it.setInt(4, item.second)
                }
            }
        }
    }

Изменения в сервисах

  • Добавлены сервисы ко всем репозиториям и прописана реализация всех функций
  • Добавлен ServiceManager для удобного обращения ко всем сервисам и инициализации всех репозиториев и сервисов

Меню

  • Реализовано меню для более удобного ввода и просмотра данных
Плохая реализация

Из-за отсутствия знаний о стейтмашине меню реализовано путём замкнутого вызова объектов

Merge request reports