package crmdna.inventory; import com.google.appengine.api.memcache.MemcacheServiceFactory; import com.googlecode.objectify.Key; import crmdna.client.Client; import crmdna.common.Utils; import crmdna.common.api.APIException; import crmdna.common.api.APIResponse.Status; import crmdna.sequence.Sequence; import crmdna.sequence.Sequence.SequenceType; import crmdna.user.User; import crmdna.user.User.ClientLevelPrivilege; import java.util.ArrayList; import java.util.List; import java.util.Map; import static crmdna.common.AssertUtils.ensureNotNull; import static crmdna.common.OfyService.ofy; public class InventoryItemType { public static InventoryItemTypeProp create(String client, String displayName, String login) { Client.ensureValid(client); User.ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_INVENTORY_ITEM_TYPE); String name = Utils.removeSpaceUnderscoreBracketAndHyphen(displayName.toLowerCase()); List<Key<InventoryItemTypeEntity>> keys = ofy(client).load().type(InventoryItemTypeEntity.class).filter("name", name).keys().list(); if (keys.size() != 0) throw new APIException().status(Status.ERROR_RESOURCE_ALREADY_EXISTS).message( "There is already a inventory item type with name [" + displayName + "]"); String key = getUniqueKey(client, name); long val = MemcacheServiceFactory.getMemcacheService().increment(key, 1, (long) 0); if (val != 1) throw new APIException().status(Status.ERROR_RESOURCE_ALREADY_EXISTS).message( "There is already a inventory item type with name [" + displayName + "]"); InventoryItemTypeEntity entity = new InventoryItemTypeEntity(); entity.inventoryItemTypeId = Sequence.getNext(client, SequenceType.INVENTORY_ITEM_TYPE); entity.name = name; entity.displayName = displayName; ofy(client).save().entity(entity).now(); return entity.toProp(); } private static String getUniqueKey(String namespace, String name) { return namespace + "_" + SequenceType.INVENTORY_ITEM_TYPE + "_" + name; } public static InventoryItemTypeEntity safeGet(String client, long inventoryItemTypeId) { Client.ensureValid(client); InventoryItemTypeEntity entity = ofy(client).load().type(InventoryItemTypeEntity.class).id(inventoryItemTypeId).now(); if (null == entity) throw new APIException().status(Status.ERROR_RESOURCE_NOT_FOUND).message( "Inventory item type id [" + inventoryItemTypeId + "] does not exist"); return entity; } public static InventoryItemTypeEntity safeGetByName(String client, String name) { Client.ensureValid(client); ensureNotNull(name); name = Utils.removeSpaceUnderscoreBracketAndHyphen(name.toLowerCase()); List<InventoryItemTypeEntity> entities = ofy(client).load().type(InventoryItemTypeEntity.class).filter("name", name).list(); if (entities.size() == 0) throw new APIException().status(Status.ERROR_RESOURCE_NOT_FOUND).message( "Inventory item type [" + name + "] does not exist"); if (entities.size() > 1) // should never come here throw new APIException().status(Status.ERROR_RESOURCE_INCORRECT).message( "Found [" + entities.size() + "] matches for inventory item type [" + name + "]. Please specify Id"); return entities.get(0); } public static InventoryItemTypeProp rename(String client, long inventoryItemTypeId, String newDisplayName, String login) { Client.ensureValid(client); User.ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_INVENTORY_ITEM_TYPE); InventoryItemTypeEntity entity = safeGet(client, inventoryItemTypeId); String newName = newDisplayName.toLowerCase(); if (entity.name.equals(newName)) { // ideally should be inside a transaction entity.displayName = newDisplayName; ofy(client).save().entity(entity).now(); return entity.toProp(); } List<Key<InventoryItemTypeEntity>> keys = ofy(client).load().type(InventoryItemTypeEntity.class).filter("name", newName).keys() .list(); if (keys.size() != 0) throw new APIException().status(Status.ERROR_RESOURCE_ALREADY_EXISTS).message( "There is already a inventory item type with name [" + newDisplayName + "]"); String key = getUniqueKey(client, newDisplayName); long val = MemcacheServiceFactory.getMemcacheService().increment(key, 1, (long) 0); if (val != 1) throw new APIException().status(Status.ERROR_RESOURCE_ALREADY_EXISTS).message( "There is already a inventory item type with name [" + newDisplayName + "]"); // ideally should be inside a transaction entity.name = newName; entity.displayName = newDisplayName; ofy(client).save().entity(entity).now(); return entity.toProp(); } public static List<InventoryItemTypeProp> getAll(String client) { Client.ensureValid(client); List<InventoryItemTypeEntity> entities = ofy(client).load().type(InventoryItemTypeEntity.class).order("name").list(); List<InventoryItemTypeProp> props = new ArrayList<>(); for (InventoryItemTypeEntity entity : entities) props.add(entity.toProp()); return props; } public static Map<Long, InventoryItemTypeEntity> get(String client, Iterable<Long> ids) { Map<Long, InventoryItemTypeEntity> map = ofy(client).load().type(InventoryItemTypeEntity.class).ids(ids); return map; } public static void delete(String client, long groupId, String login) { throw new APIException().status(Status.ERROR_NOT_IMPLEMENTED).message( "This functionality is not implemented yet"); // GroupEntity groupEntity = safeGet(client, groupId); // ofy(client).delete().entity(groupEntity).now(); } }