diff --git a/met-api/src/met_api/models/feedback.py b/met-api/src/met_api/models/feedback.py index 74de759d0..62aeb1a22 100644 --- a/met-api/src/met_api/models/feedback.py +++ b/met-api/src/met_api/models/feedback.py @@ -29,10 +29,16 @@ class Feedback(BaseModel): db.Integer, db.ForeignKey('tenant.id'), nullable=True) @classmethod - def get_all_paginated(cls, pagination_options: PaginationOptions, search_text=''): + def get_all_paginated(cls, + pagination_options: PaginationOptions, + status: FeedbackStatusType, + search_text='', + ): """Get feedback paginated.""" query = db.session.query(Feedback) + query = query.filter_by(status=status) + if search_text: # Remove all non-digit characters from search text query = query.filter( diff --git a/met-api/src/met_api/resources/feedback.py b/met-api/src/met_api/resources/feedback.py index d9e12c608..c3b7fae52 100644 --- a/met-api/src/met_api/resources/feedback.py +++ b/met-api/src/met_api/resources/feedback.py @@ -25,6 +25,7 @@ from met_api.schemas import utils as schema_utils from met_api.models.pagination_options import PaginationOptions from met_api.services.feedback_service import FeedbackService +from met_api.constants.feedback import FeedbackStatusType from met_api.utils.token_info import TokenInfo from met_api.utils.util import allowedorigins, cors_preflight @@ -53,8 +54,11 @@ def get(): sort_key=args.get('sort_key', 'name', str), sort_order=args.get('sort_order', 'asc', str), ) + status_int = args.get( + 'status', FeedbackStatusType.Unreviewed.value, int) + status = FeedbackStatusType(status_int) feedback_records = FeedbackService().get_feedback_paginated( - pagination_options, search_text) + pagination_options, search_text, status,) return feedback_records, HTTPStatus.OK except ValueError as err: diff --git a/met-api/src/met_api/services/feedback_service.py b/met-api/src/met_api/services/feedback_service.py index bbc2b5034..68cc6c76d 100644 --- a/met-api/src/met_api/services/feedback_service.py +++ b/met-api/src/met_api/services/feedback_service.py @@ -1,6 +1,6 @@ """Service for feedback management.""" -from met_api.constants.feedback import FeedbackSourceType +from met_api.constants.feedback import FeedbackSourceType, FeedbackStatusType from met_api.models.feedback import Feedback from met_api.models.pagination_options import PaginationOptions from met_api.schemas.feedback import FeedbackSchema @@ -17,12 +17,16 @@ def get_feedback(feedback_id): return feedback_schema.dump(feedback) @classmethod - def get_feedback_paginated(cls, pagination_options: PaginationOptions, search_text=''): + def get_feedback_paginated(cls, pagination_options: PaginationOptions, + status: FeedbackStatusType, + search_text='', + ): """Get feedbacks paginated.""" feedback_schema = FeedbackSchema(many=True) items, total = Feedback.get_all_paginated( pagination_options, search_text, + status, ) return { 'items': feedback_schema.dump(items), diff --git a/met-api/tests/unit/models/test_feedback.py b/met-api/tests/unit/models/test_feedback.py index d6642c9d9..12daac82f 100644 --- a/met-api/tests/unit/models/test_feedback.py +++ b/met-api/tests/unit/models/test_feedback.py @@ -48,7 +48,8 @@ def test_get_feedbacks_paginated(session): sort_key='comment', sort_order='' ) + status = FeedbackStatusType.Unreviewed # verify name search - result, count = FeedbackModel.get_all_paginated(pagination_options) + _, count = FeedbackModel.get_all_paginated(pagination_options, status) assert count == 11 diff --git a/met-web/src/components/feedback/listing.tsx b/met-web/src/components/feedback/listing.tsx index f26389e70..ff3d987fa 100644 --- a/met-web/src/components/feedback/listing.tsx +++ b/met-web/src/components/feedback/listing.tsx @@ -54,11 +54,11 @@ const FeedbackListing = () => { size, sort_key: nested_sort_key || sort_key, sort_order, + status: statusFilter, }); - const filteredFeedbacks = response.items.filter((feedback) => feedback.status == statusFilter); - setFeedbacks(filteredFeedbacks); + setFeedbacks(response.items); setPageInfo({ - total: filteredFeedbacks.length, + total: response.total, }); setTableLoading(false); } catch (error) { diff --git a/met-web/src/services/feedbackService/index.tsx b/met-web/src/services/feedbackService/index.tsx index 1ac03f28c..7f1fcb17d 100644 --- a/met-web/src/services/feedbackService/index.tsx +++ b/met-web/src/services/feedbackService/index.tsx @@ -10,6 +10,7 @@ export const getFeedbacksPage = async ({ sort_key, sort_order, search_text, + status, }: GetFeedbackRequest): Promise> => { const url = Endpoints.Feedback.GET_LIST; const response = await http.GetRequest>(url, { @@ -18,6 +19,7 @@ export const getFeedbacksPage = async ({ sort_key, sort_order, search_text, + status, }); if (response.data) { return response.data; diff --git a/met-web/src/services/feedbackService/types.ts b/met-web/src/services/feedbackService/types.ts index 1d5183356..2d47f1fd0 100644 --- a/met-web/src/services/feedbackService/types.ts +++ b/met-web/src/services/feedbackService/types.ts @@ -6,6 +6,7 @@ export interface GetFeedbackRequest { sort_key?: string; sort_order?: 'asc' | 'desc'; search_text?: string; + status?: FeedbackStatusEnum; } export interface PostFeedbackRequest { diff --git a/met-web/tests/unit/components/feedback/feedbackListing.test.tsx b/met-web/tests/unit/components/feedback/feedbackListing.test.tsx index 223b7db6c..9ddb928f6 100644 --- a/met-web/tests/unit/components/feedback/feedbackListing.test.tsx +++ b/met-web/tests/unit/components/feedback/feedbackListing.test.tsx @@ -5,7 +5,7 @@ import { setupEnv } from '../setEnvVars'; import * as reactRedux from 'react-redux'; import * as feedbackService from 'services/feedbackService/index'; import * as notificationSlice from 'services/notificationService/notificationSlice'; -import { createDefaultFeedback, CommentTypeEnum, SourceTypeEnum } from 'models/feedback'; +import { createDefaultFeedback, CommentTypeEnum, SourceTypeEnum, FeedbackStatusEnum } from 'models/feedback'; import FeedbackListing from 'components/feedback/listing'; import { USER_ROLES } from 'services/userService/constants'; @@ -27,7 +27,7 @@ const mockFeedbackTwo = { source: SourceTypeEnum.Public, }; -jest.mock('axios') +jest.mock('axios'); jest.mock('@mui/material', () => ({ ...jest.requireActual('@mui/material'), @@ -123,6 +123,7 @@ describe('Feedback Listing tests', () => { size: 10, sort_key: 'rating', sort_order: 'asc', + status: FeedbackStatusEnum.NotReviewed, }); }); }); @@ -150,6 +151,7 @@ describe('Feedback Listing tests', () => { size: 10, sort_key: 'rating', sort_order: 'asc', + status: FeedbackStatusEnum.NotReviewed, }); }); });