Bug 30663: Implement overrides handling in POST /suggestions
authorTomas Cohen Arazi <tomascohen@theke.io>
Tue, 3 May 2022 14:23:23 +0000 (11:23 -0300)
committerVictor Grousset/tuxayo <victor@tuxayo.net>
Sat, 25 Jun 2022 02:50:55 +0000 (04:50 +0200)
This patch implements the override checks in the controller as expected
by the previous patch.

To test:
1. Apply this bug patches up to 'Add x-koha-override options...'
2. Run:
   $ kshell
  k$ prove t/db_dependent/api/v1/suggestions.t
=> FAIL: Tests fail! The controller doesn't care about overrides or
         sysprefs about suggestions limits.
3. Apply this patch
4. Repeat 2
=> SUCCESS: Things work!
5. Sign off :-D

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
(cherry picked from commit ce9664e1b01e9f3dc807855d76927b9184453aee)
Signed-off-by: Victor Grousset/tuxayo <victor@tuxayo.net>
Koha/REST/V1/Suggestions.pm

index 1c0532c..cb716eb 100644 (file)
@@ -98,6 +98,55 @@ sub add {
     $body->{'status'} = 'ASKED'
         unless defined $body->{'status'};
 
+    my $overrides = $c->stash('koha.overrides');
+
+    unless ( $overrides->{any} ) {
+
+        unless ( $overrides->{max_total} ) {
+
+            if (   C4::Context->preference('MaxTotalSuggestions') ne ''
+                && C4::Context->preference('NumberOfSuggestionDays') ne '' )
+            {
+                my $max_total = C4::Context->preference('MaxTotalSuggestions');
+                my $days_range = C4::Context->preference('NumberOfSuggestionDays');
+
+                if ( $max_total and $days_range ) {
+
+                    my $total = Koha::Suggestions->search({ suggestedby => $body->{suggested_by} })
+                                                 ->filter_by_suggested_days_range( $days_range )
+                                                 ->count;
+
+                    if ( $total >= $max_total ) {
+                        return $c->render(
+                            status  => 400,
+                            openapi => {
+                                error       => "Reached the maximum suggestions limit",
+                                error_code  => 'max_total_reached'
+                            }
+                        );
+                    }
+                }
+            }
+        }
+
+        unless ( $overrides->{max_pending} ) {
+            if ( C4::Context->preference('MaxOpenSuggestions') ne '' ) {
+                my $total_pending = Koha::Suggestions->search({ suggestedby => $body->{suggested_by} })
+                                                  ->filter_by_pending
+                                                  ->count;
+                if ( $total_pending >= C4::Context->preference('MaxOpenSuggestions') ) {
+                    return $c->render(
+                        status  => 400,
+                        openapi => {
+                            error       => "Reached the maximum pending suggestions limit",
+                            error_code  => 'max_pending_reached'
+                        }
+                    );
+                }
+            }
+        }
+    }
+
     return try {
         my $suggestion = Koha::Suggestion->new_from_api( $body )->store;
         $suggestion->discard_changes;