From: Bill Erickson Date: Wed, 2 Oct 2019 20:28:01 +0000 (-0400) Subject: LP1845240 Migrate survey create API to cstore X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=2cfd4bb59514a6c8edb9d5709c406d0e6e6ebf25;p=working%2FEvergreen.git LP1845240 Migrate survey create API to cstore Modernize the survey create API by migrating it to cstore. New API supports full range of isnew / ischanged / isdeleted actions on the survey, questions, and answers. Signed-off-by: Bill Erickson --- diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Survey.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Survey.pm index 3b83e36a2b..c5b781846c 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Survey.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Survey.pm @@ -22,9 +22,147 @@ use Data::Dumper; use OpenILS::Event; use Time::HiRes qw(time); use OpenILS::Utils::CStoreEditor qw/:funcs/; +use OpenSRF::Utils::Logger qw/$logger/; my $apputils = "OpenILS::Application::AppUtils"; +__PACKAGE__->register_method( + method => "update_survey", + api_name => "open-ils.circ.survey.update", + signature => { + desc => q/Create, update, delete surveys, survey questions, and + survey answers. Relies on isnew ; isnchanged ; isdeleted + attributes of provided objects to determine outcome. + /, + params => [ + {desc => 'Authtoken', type => 'string'}, + {desc => 'Fleshed survey (asv) object', type => 'object'} + ], + return => '1 on success, event on error' + } +); + + +sub update_survey { + my ($self, $client, $auth, $survey) = @_; + + my $e = new_editor(authtoken => $auth, xact => 1); + return $e->die_event unless $e->checkauth; + return $e->die_event unless $e->allowed('ADMIN_SURVEY', $survey->owner); + + my $questions = $survey->questions || []; + + if ($survey->isdeleted) { + + # Remove questions and dependent data first. + $_->isdeleted(1) for @$questions; + return $e->die_event unless update_questions($e, $survey); + + return $e->die_event unless $e->delete_action_survey($survey); + + } else { + + if ($survey->isnew) { + + $survey->clear_id; + return $e->die_event unless $e->create_action_survey($survey); + + $_->isnew(1) for @$questions; + + } elsif ($survey->ischanged) { + + return $e->die_event unless $e->update_action_survey($survey); + } + + return $e->die_event if update_questions($e, $survey); + } + + $e->commit; + + return 1; +} + +# returns undef on success, event on error +sub update_questions { + my ($e, $survey) = @_; + + for my $question (@{$survey->questions}) { + + if ($question->isdeleted) { + + # delete all of the linked data first. + + my $responses = $e->search_action_survey_response({question => $question->id}); + for my $response (@$responses) { + return $e->die_event unless $e->delete_action_survey_response($response); + } + + my $answers = $e->search_action_survey_answer({question => $question->id}); + for my $answer (@$answers) { + return $e->die_event unless $e->delete_action_survey_answer($answer); + } + + return $e->die_event unless $e->delete_action_survey_question($question); + + } else { + + if ($question->ischanged) { + + return $e->die_event + unless $e->update_action_survey_question($question); + + } elsif ($question->isnew) { + + $question->survey($survey->id); + $question->clear_id; + + return $e->die_event unless $e->create_action_survey_question($question); + } + + return 1 if update_answers($e, $question); + } + } + + return undef; +} + +sub update_answers { + my ($e, $question) = @_; + + return undef unless $question->answers; + + for my $answer (@{$question->answers}) { + + if ($answer->isdeleted) { + my $responses = + $e->search_action_survey_response({answer => $answer->id}); + + for my $response (@$responses) { + return $e->die_event unless + $e->delete_action_survey_response($response); + } + + return $e->die_event unless $e->delete_action_survey_answer($answer); + + } elsif ($answer->isnew) { + + $answer->clear_id; + $answer->question($question->id); + + return $e->die_event + unless $e->create_action_survey_answer($answer); + + } elsif ($answer->ischanged) { + return $e->die_event + unless $e->update_action_survey_answer($answer); + } + } + + return undef; +} + + + # - creates a new survey # expects a survey complete with questions and answers __PACKAGE__->register_method( @@ -78,10 +216,6 @@ sub _add_survey { return $survey; } -sub _update_survey { - my($session, $survey) = @_; -} - sub _add_questions { my($session, $survey) = @_;