Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions apps/backend/src/datasources/ReviewDataSource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,16 @@ export interface ReviewDataSource {
userId?: number,
callId?: number,
instrumentId?: number,
submitted?: number
submitted?: number,
active?: boolean
): Promise<Review[]>;
getAllUsersReviews(
fapIds: number[],
userId?: number,
callId?: number,
instrumentId?: number,
submitted?: number
submitted?: number,
active?: boolean
): Promise<Review[]>;
getAssignmentReview(
fapId: number,
Expand Down
26 changes: 24 additions & 2 deletions apps/backend/src/datasources/postgres/ReviewDataSource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,8 @@ export default class PostgresReviewDataSource implements ReviewDataSource {
userId?: number,
callId?: number,
instrumentId?: number,
status?: ReviewStatus
status?: ReviewStatus,
active?: boolean
): Promise<Review[]> {
return database
.select()
Expand Down Expand Up @@ -378,6 +379,16 @@ export default class PostgresReviewDataSource implements ReviewDataSource {
if (status !== undefined && status !== null) {
qb.where('fap_reviews.status', status);
}

if (active) {
qb.join('proposals', {
'proposals.proposal_pk': 'fap_reviews.proposal_pk',
});
qb.join('call', {
'call.call_id': 'proposals.call_id',
});
qb.where('call.call_fap_review_ended', false);
}
})
.whereIn('fap_id', fapIds)
.distinctOn('fap_reviews.proposal_pk')
Expand Down Expand Up @@ -414,7 +425,8 @@ export default class PostgresReviewDataSource implements ReviewDataSource {
userId?: number,
callId?: number,
instrumentId?: number,
status?: ReviewStatus
status?: ReviewStatus,
active?: boolean
): Promise<Review[]> {
return database
.select('fapReviewsTemp.*')
Expand All @@ -440,6 +452,16 @@ export default class PostgresReviewDataSource implements ReviewDataSource {
if (status !== null && status !== undefined) {
qb.where('fap_reviews.status', status);
}

if (active) {
qb.join('proposals', {
'proposals.proposal_pk': 'fap_reviews.proposal_pk',
});
qb.join('call', {
'call.call_id': 'proposals.call_id',
});
qb.where('call.call_fap_review_ended', false);
}
})
.whereIn('fap_id', fapIds)
.as('fapReviewsTemp')
Expand Down
13 changes: 8 additions & 5 deletions apps/backend/src/resolvers/types/User.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,10 @@ export class UserResolver {
@Arg('callId', () => Int, { nullable: true }) callId: number,
@Arg('instrumentId', () => Int, { nullable: true }) instrumentId: number,
@Arg('status', () => ReviewStatus, { nullable: true }) status: number,
@Arg('reviewer', () => ReviewerFilter, { nullable: true })
reviewer: number,
@Ctx() context: ResolverContext
@Arg('reviewer', () => ReviewerFilter, { nullable: true }) reviewer: number,
@Arg('active', () => Boolean, { nullable: true }) active: boolean,
@Ctx()
context: ResolverContext
) {
if (!context.user || !context.user.currentRole) {
return [];
Expand All @@ -136,15 +137,17 @@ export class UserResolver {
user.id,
callId,
instrumentId,
status
status,
active
);
} else {
return context.queries.review.dataSource.getAllUsersReviews(
fapsUserIsMemberOf.map((faps) => faps.id),
user.id,
callId,
instrumentId,
status
status,
active
);
}
}
Expand Down
26 changes: 25 additions & 1 deletion apps/e2e/cypress/e2e/FAPs.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1816,6 +1816,31 @@ context('Fap reviews tests', () => {
cy.contains(proposal1.title);
cy.contains(proposal3.title);
});
it('Fap Reviewer should only be able to see proposals from calls with active fap review periods', () => {
cy.get('#reviewer-selection', { timeout: 5000 })
.parent()
.should('be.visible')
.click();
cy.get('[role="presentation"]').contains('My proposals').click();
cy.finishedLoading();
cy.contains(proposal1.title);

cy.updateCall({
id: initialDBData.call.id,
callFapReviewEnded: true,
});
cy.reload();

cy.get('#reviewer-selection', { timeout: 5000 })
.parent()
.should('be.visible')
.click();
cy.get('[role="presentation"]').contains('My proposals').click();
cy.finishedLoading();

cy.contains(proposal1.title).should('not.exist');
});

it('Fap Reviewer should not be able to submit a grade for proposals on which they are not reviewer, they should only able to view them', () => {
cy.get('#reviewer-selection', { timeout: 5000 })
.parent()
Expand Down Expand Up @@ -3836,7 +3861,6 @@ context('Fap meeting components tests', () => {
cy.visit('/');
cy.get('main table tbody').contains('No records to display');
});

it('Fap Reviewer should be able to give review', () => {
cy.login(fapMembers.reviewer);
cy.visit('/');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ const ProposalTableReviewer = ({ confirm }: { confirm: WithConfirmType }) => {
instrumentId: selectedInstrumentId,
status: getFilterStatus(reviewStatus),
reviewer: getFilterReviewer(reviewer),
active: true,
});

useEffect(() => {
Expand Down
2 changes: 2 additions & 0 deletions apps/frontend/src/graphql/review/userWithReviews.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ query userWithReviews(
$instrumentId: Int
$status: ReviewStatus
$reviewer: ReviewerFilter
$active: Boolean
) {
me {
id
Expand All @@ -14,6 +15,7 @@ query userWithReviews(
instrumentId: $instrumentId
status: $status
reviewer: $reviewer
active: $active
) {
id
grade
Expand Down
1 change: 1 addition & 0 deletions apps/frontend/src/hooks/user/useUserData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ export function useUserWithReviewsData(filters?: {
instrumentId?: number | null;
status?: ReviewStatus;
reviewer?: ReviewerFilter;
active?: boolean;
}) {
const api = useDataApi();
const [userWithReviewsFilter, setUserWithReviewsFilter] = useState(filters);
Expand Down
Loading