LP1845240 Migrate survey create API to cstore
authorBill Erickson <berickxx@gmail.com>
Wed, 2 Oct 2019 20:28:01 +0000 (16:28 -0400)
committerBill Erickson <berickxx@gmail.com>
Mon, 14 Oct 2019 22:02:23 +0000 (18:02 -0400)
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 <berickxx@gmail.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Survey.pm

index 3b83e36..c5b7818 100644 (file)
@@ -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) = @_;