@RestResource(urlMapping='/shopifyconfiguration/*') global class ShopifyConfigurationResource { @HttpPost global static ResponseWrapper createConfiguration() { ResponseWrapper response = new ResponseWrapper(); try { // Get request body RestRequest req = RestContext.request; Map requestBody = (Map) JSON.deserializeUntyped(req.requestBody.toString()); // Extract input parameters from UI String storeName = (String) requestBody.get('storeName'); String accessToken = (String) requestBody.get('accessToken'); String siteUrl = (String) requestBody.get('siteUrl'); // From UI dropdown // Validate inputs if (String.isBlank(storeName) || String.isBlank(accessToken)) { response.success = false; response.message = 'storeName and accessToken are required'; response.statusCode = 400; RestContext.response.statusCode = 400; return response; } // Clean store name (remove .myshopify.com if included) storeName = storeName.replace('.myshopify.com', '').trim(); // Get Default configuration record with all fields String query = 'SELECT '; Map fieldMap = Schema.SObjectType.HIC_ShopifySync__HIC_Configuration__c.fields.getMap(); for (String fieldName : fieldMap.keySet()) { // Skip system fields that can't be cloned if (!fieldName.equalsIgnoreCase('id') && !fieldName.equalsIgnoreCase('createddate') && !fieldName.equalsIgnoreCase('createdbyid') && !fieldName.equalsIgnoreCase('lastmodifieddate') && !fieldName.equalsIgnoreCase('lastmodifiedbyid') && !fieldName.equalsIgnoreCase('systemmodstamp') && !fieldName.equalsIgnoreCase('isdeleted')) { query += fieldName + ', '; } } query = query.removeEnd(', '); query += ' FROM HIC_ShopifySync__HIC_Configuration__c WHERE HIC_ShopifySync__Store__c = \'Default\' LIMIT 1'; List defaultConfigs = Database.query(query); if (defaultConfigs.isEmpty()) { response.success = false; response.message = 'Default configuration not found'; response.statusCode = 404; RestContext.response.statusCode = 404; return response; } HIC_ShopifySync__HIC_Configuration__c defaultConfig = defaultConfigs[0]; // Clone the record HIC_ShopifySync__HIC_Configuration__c newConfig = defaultConfig.clone(false, true, false, false); // Update the 3 specific fields newConfig.Name = storeName; newConfig.HIC_ShopifySync__Store__c = storeName; newConfig.HIC_ShopifySync__Private_Key_Password__c = accessToken; // Optionally update Site URL if provided if (String.isNotBlank(siteUrl)) { newConfig.HIC_ShopifySync__Salesforce_Site_URL__c = siteUrl; // Adjust field name as per your object } // Insert the new record insert newConfig; // Return success response response.success = true; response.message = 'Configuration created successfully'; response.recordId = newConfig.Id; response.storeName = storeName; response.statusCode = 201; RestContext.response.statusCode = 201; } catch (DmlException e) { response.success = false; response.message = 'Database error: ' + e.getDmlMessage(0); response.statusCode = 400; RestContext.response.statusCode = 400; } catch (Exception e) { response.success = false; response.message = 'Error: ' + e.getMessage(); response.statusCode = 500; RestContext.response.statusCode = 500; } return response; } // Wrapper class for response global class ResponseWrapper { global Boolean success; global String message; global String recordId; global String storeName; global Integer statusCode; public ResponseWrapper() { this.success = false; this.statusCode = 200; } } }