package com.rsscripting.rswarehouse.dao; import com.rsscripting.rswarehouse.RSWarehouse; import com.rsscripting.rswarehouse.database.DatabaseManager; import com.rsscripting.rswarehouse.model.WarehouseItem; import com.rsscripting.rswarehouse.utils.ItemStackUtils; import org.bukkit.inventory.ItemStack; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; public class ItemDAO { public static void addItem( String discovererUuid, String discovererName, ItemStack item, long quantity, Integer inventoryId ) { item = ItemStackUtils.normalizeSpecialItems(item); String serializedItem = ItemStackUtils.serialize( item ); if (serializedItem == null) { return; } boolean enableUncategorized = RSWarehouse.getInstance() .getConfig() .getBoolean( "allow-uncategorized-item-creation", true ); if ( inventoryId == null && !enableUncategorized ) { return; } if (inventoryId != null) { long previousQuantity = InventoryQuantityDAO.getInventoryQuantity( inventoryId ); InventoryQuantityDAO.updateInventoryQuantity( inventoryId, quantity ); if (previousQuantity == 0) { DiscoveryDAO.assignDiscovererIfNull( inventoryId, discovererUuid, discovererName ); } return; } inventoryId = InventoryCreationDAO.createInventoryItem( item, quantity, discovererUuid, discovererName ); if (inventoryId == -1) { return; } WarehouseReferenceDAO.createWarehouseItemReference( item, inventoryId ); } public static WarehouseItem getItemById( int itemId ) { try ( Connection connection = DatabaseManager.getConnection() ) { PreparedStatement statement = connection.prepareStatement( """ SELECT wi.*, inv.quantity, inv.discoverer_uuid, inv.discoverer_name, inv.discovered_date FROM warehouse_items wi LEFT JOIN warehouse_inventory inv ON wi.inventory_id = inv.id WHERE wi.id = ? """ ); statement.setInt( 1, itemId ); ResultSet resultSet = statement.executeQuery(); if (resultSet.next()) { return new WarehouseItem( resultSet.getInt("id"), resultSet.getInt("category_id"), resultSet.getString("serialized_item"), resultSet.getString("default_lore"), resultSet.getObject("inventory_id") == null ? null : resultSet.getInt("inventory_id"), resultSet.getObject("subcategory_id") == null ? null : resultSet.getInt("subcategory_id"), resultSet.getLong("quantity"), resultSet.getString("discoverer_uuid"), resultSet.getString("discoverer_name"), resultSet.getString("discovered_date"), resultSet.getObject("page") == null ? null : resultSet.getInt("page"), resultSet.getObject("slot") == null ? null : resultSet.getInt("slot") ); } } catch (Exception e) { e.printStackTrace(); } return null; } public static List getItemsForCategory( int categoryId ) { List items = new ArrayList<>(); try ( Connection connection = DatabaseManager.getConnection() ) { PreparedStatement statement = connection.prepareStatement( """ SELECT wi.*, inv.quantity, inv.discoverer_uuid, inv.discoverer_name, inv.discovered_date FROM warehouse_items wi LEFT JOIN warehouse_inventory inv ON wi.inventory_id = inv.id WHERE wi.category_id = ? ORDER BY wi.id """ ); statement.setInt( 1, categoryId ); ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { items.add( new WarehouseItem( resultSet.getInt("id"), resultSet.getInt("category_id"), resultSet.getString("serialized_item"), resultSet.getString("default_lore"), resultSet.getObject("inventory_id") == null ? null : resultSet.getInt("inventory_id"), resultSet.getObject("subcategory_id") == null ? null : resultSet.getInt("subcategory_id"), resultSet.getLong("quantity"), resultSet.getString("discoverer_uuid"), resultSet.getString("discoverer_name"), resultSet.getString("discovered_date"), resultSet.getObject("page") == null ? null : resultSet.getInt("page"), resultSet.getObject("slot") == null ? null : resultSet.getInt("slot") ) ); } } catch (Exception e) { e.printStackTrace(); } return items; } public static void removeItem( ItemStack item, long quantity ) { Integer inventoryId = InventoryLookupDAO.findInventoryId( item ); if (inventoryId == null) { return; } InventoryQuantityDAO.removeInventoryQuantity( inventoryId, quantity ); } public static void addItem( String discovererUuid, String discovererName, ItemStack item, long quantity ) { addItem( discovererUuid, discovererName, item, quantity, InventoryLookupDAO.findInventoryId( item ) ); } public static boolean categoryHasItems( int categoryId ) { try ( Connection connection = DatabaseManager.getConnection(); PreparedStatement statement = connection.prepareStatement( """ SELECT COUNT(*) FROM warehouse_items WHERE category_id = ? """ ) ) { statement.setInt( 1, categoryId ); ResultSet resultSet = statement.executeQuery(); if (resultSet.next()) { return resultSet.getInt( 1 ) > 0; } } catch (Exception exception) { exception.printStackTrace(); } return false; } }