public class GuestReviewProcessor {
@InvocableMethod(
label='Process Guest Reviews',
description='Creates a new Guest Review record from chat input using contact, experience, review, and rating.'
)
public static List<GuestReviewResponse> processReviews(List<GuestReviewRequest> requests) {
List<GuestReviewResponse> responses = new List<GuestReviewResponse>();
List<Guest_Review__c> reviewsToInsert = new List<Guest_Review__c>();
try {
for (GuestReviewRequest request : requests) {
Guest_Review__c review = new Guest_Review__c(
Contact__c = request.contact.Id,
Experience__c = request.experience.Id,
Comments__c = request.review,
Rating__c = request.rating
);
reviewsToInsert.add(review);
}
if (!reviewsToInsert.isEmpty()) {
insert reviewsToInsert;
}
for (GuestReviewRequest request : requests) {
GuestReviewResponse response = new GuestReviewResponse();
response.message = 'Guest review submitted successfully for Contact ID: ' + request.contact.Id;
responses.add(response);
}
} catch (Exception e) {
for (GuestReviewRequest request : requests) {
GuestReviewResponse response = new GuestReviewResponse();
response.message = 'Failed to submit guest review for Contact ID: ' + request.contact.Id + '. Error: ' + e.getMessage();
responses.add(response);
}
}
return responses;
}
// Wrapper class for input (do not mark static)
public class GuestReviewRequest {
@InvocableVariable(
required=true,
label='Contact',
description='The Contact record associated with the guest submitting the review.'
)
public Contact contact;
@InvocableVariable(
required=true,
label='Experience',
description='The Experience record that the guest is providing feedback on.'
)
public Experience__c experience;
@InvocableVariable(
required=true,
label='Review',
description='The written feedback or comments from the guest.'
)
public String review;
@InvocableVariable(
required=true,
label='Rating',
description='The rating (e.g., 1-5) given by the guest for their experience.'
)
public String rating;
}
// Wrapper class for output (do not mark static)
public class GuestReviewResponse {
@InvocableVariable(
label='Status',
description='A message indicating whether the guest review was processed successfully or failed.'
)
public String message;
}
}
cHVibGljIGNsYXNzIEd1ZXN0UmV2aWV3UHJvY2Vzc29yIHsKCiAgICBASW52b2NhYmxlTWV0aG9kKAogICAgICAgIGxhYmVsPSdQcm9jZXNzIEd1ZXN0IFJldmlld3MnLCAKICAgICAgICBkZXNjcmlwdGlvbj0nQ3JlYXRlcyBhIG5ldyBHdWVzdCBSZXZpZXcgcmVjb3JkIGZyb20gY2hhdCBpbnB1dCB1c2luZyBjb250YWN0LCBleHBlcmllbmNlLCByZXZpZXcsIGFuZCByYXRpbmcuJwogICAgKQogICAgcHVibGljIHN0YXRpYyBMaXN0PEd1ZXN0UmV2aWV3UmVzcG9uc2U+IHByb2Nlc3NSZXZpZXdzKExpc3Q8R3Vlc3RSZXZpZXdSZXF1ZXN0PiByZXF1ZXN0cykgewogICAgICAgIExpc3Q8R3Vlc3RSZXZpZXdSZXNwb25zZT4gcmVzcG9uc2VzID0gbmV3IExpc3Q8R3Vlc3RSZXZpZXdSZXNwb25zZT4oKTsKICAgICAgICBMaXN0PEd1ZXN0X1Jldmlld19fYz4gcmV2aWV3c1RvSW5zZXJ0ID0gbmV3IExpc3Q8R3Vlc3RfUmV2aWV3X19jPigpOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBmb3IgKEd1ZXN0UmV2aWV3UmVxdWVzdCByZXF1ZXN0IDogcmVxdWVzdHMpIHsKICAgICAgICAgICAgICAgIEd1ZXN0X1Jldmlld19fYyByZXZpZXcgPSBuZXcgR3Vlc3RfUmV2aWV3X19jKAogICAgICAgICAgICAgICAgICAgIENvbnRhY3RfX2MgPSByZXF1ZXN0LmNvbnRhY3QuSWQsCiAgICAgICAgICAgICAgICAgICAgRXhwZXJpZW5jZV9fYyA9IHJlcXVlc3QuZXhwZXJpZW5jZS5JZCwKICAgICAgICAgICAgICAgICAgICBDb21tZW50c19fYyA9IHJlcXVlc3QucmV2aWV3LAogICAgICAgICAgICAgICAgICAgIFJhdGluZ19fYyA9IHJlcXVlc3QucmF0aW5nCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV2aWV3c1RvSW5zZXJ0LmFkZChyZXZpZXcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXJldmlld3NUb0luc2VydC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgIGluc2VydCByZXZpZXdzVG9JbnNlcnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoR3Vlc3RSZXZpZXdSZXF1ZXN0IHJlcXVlc3QgOiByZXF1ZXN0cykgewogICAgICAgICAgICAgICAgR3Vlc3RSZXZpZXdSZXNwb25zZSByZXNwb25zZSA9IG5ldyBHdWVzdFJldmlld1Jlc3BvbnNlKCk7CiAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gJ0d1ZXN0IHJldmlldyBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5IGZvciBDb250YWN0IElEOiAnICsgcmVxdWVzdC5jb250YWN0LklkOwogICAgICAgICAgICAgICAgcmVzcG9uc2VzLmFkZChyZXNwb25zZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZm9yIChHdWVzdFJldmlld1JlcXVlc3QgcmVxdWVzdCA6IHJlcXVlc3RzKSB7CiAgICAgICAgICAgICAgICBHdWVzdFJldmlld1Jlc3BvbnNlIHJlc3BvbnNlID0gbmV3IEd1ZXN0UmV2aWV3UmVzcG9uc2UoKTsKICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSAnRmFpbGVkIHRvIHN1Ym1pdCBndWVzdCByZXZpZXcgZm9yIENvbnRhY3QgSUQ6ICcgKyByZXF1ZXN0LmNvbnRhY3QuSWQgKyAnLiBFcnJvcjogJyArIGUuZ2V0TWVzc2FnZSgpOwogICAgICAgICAgICAgICAgcmVzcG9uc2VzLmFkZChyZXNwb25zZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiByZXNwb25zZXM7CiAgICB9CgogICAgLy8gV3JhcHBlciBjbGFzcyBmb3IgaW5wdXQgKGRvIG5vdCBtYXJrIHN0YXRpYykKICAgIHB1YmxpYyBjbGFzcyBHdWVzdFJldmlld1JlcXVlc3QgewogICAgICAgIEBJbnZvY2FibGVWYXJpYWJsZSgKICAgICAgICAgICAgcmVxdWlyZWQ9dHJ1ZSwgCiAgICAgICAgICAgIGxhYmVsPSdDb250YWN0JywgCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPSdUaGUgQ29udGFjdCByZWNvcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBndWVzdCBzdWJtaXR0aW5nIHRoZSByZXZpZXcuJwogICAgICAgICkKICAgICAgICBwdWJsaWMgQ29udGFjdCBjb250YWN0OwoKICAgICAgICBASW52b2NhYmxlVmFyaWFibGUoCiAgICAgICAgICAgIHJlcXVpcmVkPXRydWUsIAogICAgICAgICAgICBsYWJlbD0nRXhwZXJpZW5jZScsIAogICAgICAgICAgICBkZXNjcmlwdGlvbj0nVGhlIEV4cGVyaWVuY2UgcmVjb3JkIHRoYXQgdGhlIGd1ZXN0IGlzIHByb3ZpZGluZyBmZWVkYmFjayBvbi4nCiAgICAgICAgKQogICAgICAgIHB1YmxpYyBFeHBlcmllbmNlX19jIGV4cGVyaWVuY2U7CgogICAgICAgIEBJbnZvY2FibGVWYXJpYWJsZSgKICAgICAgICAgICAgcmVxdWlyZWQ9dHJ1ZSwgCiAgICAgICAgICAgIGxhYmVsPSdSZXZpZXcnLCAKICAgICAgICAgICAgZGVzY3JpcHRpb249J1RoZSB3cml0dGVuIGZlZWRiYWNrIG9yIGNvbW1lbnRzIGZyb20gdGhlIGd1ZXN0LicKICAgICAgICApCiAgICAgICAgcHVibGljIFN0cmluZyByZXZpZXc7CgogICAgICAgIEBJbnZvY2FibGVWYXJpYWJsZSgKICAgICAgICAgICAgcmVxdWlyZWQ9dHJ1ZSwgCiAgICAgICAgICAgIGxhYmVsPSdSYXRpbmcnLCAKICAgICAgICAgICAgZGVzY3JpcHRpb249J1RoZSByYXRpbmcgKGUuZy4sIDEtNSkgZ2l2ZW4gYnkgdGhlIGd1ZXN0IGZvciB0aGVpciBleHBlcmllbmNlLicKICAgICAgICApCiAgICAgICAgcHVibGljIFN0cmluZyByYXRpbmc7CiAgICB9CgogICAgLy8gV3JhcHBlciBjbGFzcyBmb3Igb3V0cHV0IChkbyBub3QgbWFyayBzdGF0aWMpCiAgICBwdWJsaWMgY2xhc3MgR3Vlc3RSZXZpZXdSZXNwb25zZSB7CiAgICAgICAgQEludm9jYWJsZVZhcmlhYmxlKAogICAgICAgICAgICBsYWJlbD0nU3RhdHVzJywgCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPSdBIG1lc3NhZ2UgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBndWVzdCByZXZpZXcgd2FzIHByb2Nlc3NlZCBzdWNjZXNzZnVsbHkgb3IgZmFpbGVkLicKICAgICAgICApCiAgICAgICAgcHVibGljIFN0cmluZyBtZXNzYWdlOwogICAgfQp9Cg==