api products without try catch
Wed Jan 08 2025 04:13:24 GMT+0000 (Coordinated Universal Time)
Saved by @rcrespocode
@RestResource(urlMapping='/api/products/*')
global with sharing class ProductApi {
// GET: Recuperar productos por External_ID__c
@HttpGet
global static List<Product2> getProducts() {
RestRequest req = RestContext.request;
String externalId = req.requestURI.substringAfterLast('/');
if (String.isNotBlank(externalId)) {
// Recuperar producto por External_ID__c
return [SELECT Id, Name, ProductCode, Description, IsActive, External_ID__c
FROM Product2 WHERE External_ID__c = :externalId];
} else {
// Si no se proporciona External_ID__c, lanzar excepción
throw new CustomException('Debe proporcionar el External_ID__c para la búsqueda.');
}
}
// PATCH: Crear o actualizar un producto y establecer su precio usando solo External_ID__c
@HttpPatch
global static Product2 upsertProduct(
String externalId,
String name,
String productCode,
String description,
Boolean isActive,
Decimal price
) {
if (String.isBlank(externalId)) {
throw new CustomException('El campo External_ID__c es obligatorio para realizar un upsert.');
}
if (price == null || price < 0) {
throw new CustomException('El precio debe ser un valor positivo.');
}
// Crear o actualizar el producto basado en External_ID__c
Product2 product = [SELECT Id FROM Product2 WHERE External_ID__c = :externalId LIMIT 1];
if (product == null) {
product = new Product2(
External_ID__c = externalId,
Name = name,
ProductCode = productCode,
Description = description,
IsActive = isActive
);
insert product;
} else {
product.Name = name;
product.ProductCode = productCode;
product.Description = description;
product.IsActive = isActive;
update product;
}
// Buscar el Standard Pricebook
List<Pricebook2> standardPricebookList = [SELECT Id FROM Pricebook2 WHERE IsStandard = true LIMIT 1];
if (standardPricebookList.isEmpty()) {
throw new CustomException('No se encontró el Standard Pricebook.');
}
Pricebook2 standardPricebook = standardPricebookList[0];
// Verificar si ya existe un PricebookEntry para este producto
List<PricebookEntry> existingEntries = [
SELECT Id, UnitPrice
FROM PricebookEntry
WHERE Product2Id = :product.Id AND Pricebook2Id = :standardPricebook.Id
];
if (existingEntries.isEmpty()) {
// Crear un nuevo PricebookEntry si no existe
PricebookEntry newEntry = new PricebookEntry(
Pricebook2Id = standardPricebook.Id,
Product2Id = product.Id,
UnitPrice = price,
IsActive = true
);
insert newEntry;
} else {
// Actualizar el PricebookEntry existente
PricebookEntry existingEntry = existingEntries[0];
existingEntry.UnitPrice = price;
update existingEntry;
}
return product;
}
// DELETE: Eliminar un producto por External_ID__c
@HttpDelete
global static void deleteProduct() {
RestRequest req = RestContext.request;
String externalId = req.requestURI.substringAfterLast('/');
if (String.isBlank(externalId)) {
throw new CustomException('Debe proporcionar el External_ID__c para eliminar.');
}
Product2 productToDelete = [SELECT Id FROM Product2 WHERE External_ID__c = :externalId LIMIT 1];
if (productToDelete == null) {
throw new CustomException('No se encontró el producto con el External_ID__c proporcionado.');
}
// Eliminar cualquier PricebookEntry relacionado en el Standard Pricebook
List<Pricebook2> standardPricebookList = [SELECT Id FROM Pricebook2 WHERE IsStandard = true LIMIT 1];
if (!standardPricebookList.isEmpty()) {
Pricebook2 standardPricebook = standardPricebookList[0];
List<PricebookEntry> entriesToDelete = [
SELECT Id
FROM PricebookEntry
WHERE Product2Id = :productToDelete.Id AND Pricebook2Id = :standardPricebook.Id
];
delete entriesToDelete;
}
delete productToDelete;
}
// Clase de excepción personalizada
global class CustomException extends Exception {}
}



Comments