Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: implement program message filtering based on orgUnit[DHIS2-17837] #18358

Open
wants to merge 41 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
e1663a5
refactor: remove unused code from program message service/store
zubaira Aug 2, 2024
8216dd6
remove method
zubaira Aug 2, 2024
3a1ce4e
fix compile
zubaira Aug 2, 2024
0bd6971
Merge branch 'DHIS2-17759-service' into DHIS2-17759-export
zubaira Aug 2, 2024
7b58faf
refactor: use tracker-export pattern for program message
zubaira Aug 2, 2024
225bb93
minor
zubaira Aug 2, 2024
b09f610
fix unreported exception
zubaira Aug 2, 2024
797f792
fix unreported exception
zubaira Aug 2, 2024
cc0c6bb
fix unreported exception
zubaira Aug 2, 2024
78031d8
fix test compile
zubaira Aug 2, 2024
d58269c
Merge branch 'master' into DHIS2-17759-export
zubaira Aug 2, 2024
91bf3a3
unused fields
zubaira Aug 2, 2024
4df5805
indentation
zubaira Aug 2, 2024
51759aa
add ProgramMessageRequestParamsMapperTest
zubaira Aug 3, 2024
18be5b7
ProgramMessageOperationParamsMapper test
zubaira Aug 3, 2024
260a6ca
change exception message to contain user and program information
zubaira Aug 3, 2024
33c5278
use StringBuilder instead of string concatination
zubaira Aug 3, 2024
7bfbb00
correct test method name
zubaira Aug 4, 2024
739477e
Merge branch 'DHIS2-17759-export' into DHIS2-17759-web
zubaira Aug 5, 2024
8daf694
refactor: extend read only crud controller
zubaira Aug 5, 2024
f3b1a9e
fix test
zubaira Aug 5, 2024
2d00bfe
minor
zubaira Aug 5, 2024
39e3675
Merge branch 'master' into DHIS2-17759-web
zubaira Aug 8, 2024
773f23e
Merge branch 'DHIS2-17759-web' of https://github.com/dhis2/dhis2-core…
zubaira Aug 8, 2024
5765fd0
Merge branch 'master' into DHIS2-17759-web
zubaira Aug 8, 2024
f289357
Merge branch 'DHIS2-17759-web' into DHIS2-17837
zubaira Aug 12, 2024
ba9e137
add orgUnit check in store
zubaira Aug 12, 2024
50b1ff9
Merge branch 'master' into DHIS2-17837
zubaira Aug 16, 2024
6b4d730
fix test
zubaira Aug 16, 2024
a416392
fix test
zubaira Aug 16, 2024
c0605ab
Merge branch 'master' into DHIS2-17837
zubaira Aug 23, 2024
b587cf9
Merge branch 'master' into DHIS2-17837
zubaira Sep 3, 2024
6b6ba70
Merge branch 'master' into DHIS2-17837
zubaira Sep 5, 2024
8f5848d
tests
zubaira Sep 5, 2024
8529ec8
add assertion for orgUnit
zubaira Sep 5, 2024
df887e4
use verify
zubaira Sep 5, 2024
74dc95c
Merge branch 'master' into DHIS2-17837
zubaira Sep 5, 2024
d13a153
Merge branch 'master' into DHIS2-17837
zubaira Sep 9, 2024
4b5468a
sonar cloud fix
zubaira Sep 9, 2024
d090688
Merge branch 'DHIS2-17837' of https://github.com/dhis2/dhis2-core int…
zubaira Sep 9, 2024
157b208
Merge branch 'master' into DHIS2-17837
zubaira Sep 30, 2024
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
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
package org.hisp.dhis.program.message;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -37,9 +38,9 @@
* @author Zubair Asghar
*/
@Getter
@Builder
@Builder(toBuilder = true)
public class ProgramMessageOperationParams {
private Set<String> ou;
@Builder.Default private Set<UID> organisationUnits = new HashSet<>();

private UID enrollment;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@
package org.hisp.dhis.program.message;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import lombok.Builder;
import lombok.Data;
import org.hisp.dhis.organisationunit.OrganisationUnit;
import org.hisp.dhis.program.Enrollment;
import org.hisp.dhis.program.Event;

Expand All @@ -40,7 +42,7 @@
@Data
@Builder
public class ProgramMessageQueryParams {
private Set<String> organisationUnit;
@Builder.Default private Set<OrganisationUnit> organisationUnits = new HashSet<>();

private ProgramMessageStatus messageStatus;

Expand All @@ -61,7 +63,7 @@ public class ProgramMessageQueryParams {
// -------------------------------------------------------------------------

public boolean hasOrganisationUnit() {
return organisationUnit != null;
return organisationUnits != null && !organisationUnits.isEmpty();
}

public boolean hasEnrollment() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@

import java.util.List;
import org.hisp.dhis.common.DeliveryChannel;
import org.hisp.dhis.common.UID;
import org.hisp.dhis.feedback.BadRequestException;
import org.hisp.dhis.feedback.NotFoundException;
import org.hisp.dhis.outboundmessage.BatchResponseStatus;

Expand Down Expand Up @@ -67,7 +69,7 @@ public interface ProgramMessageService {
List<ProgramMessage> getAllProgramMessages();

List<ProgramMessage> getProgramMessages(ProgramMessageOperationParams params)
throws NotFoundException;
throws NotFoundException, BadRequestException;

// -------------------------------------------------------------------------
// Save OR Update
Expand All @@ -77,9 +79,13 @@ List<ProgramMessage> getProgramMessages(ProgramMessageOperationParams params)

void updateProgramMessage(ProgramMessage programMessage);

void updateProgramMessage(UID uid, ProgramMessageStatus status) throws NotFoundException;

// -------------------------------------------------------------------------
// Delete
// -------------------------------------------------------------------------

void deleteProgramMessage(ProgramMessage programMessage);

void deleteProgramMessage(UID uid) throws NotFoundException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,13 @@ private Query<ProgramMessage> getHqlQuery(ProgramMessageQueryParams params) {
hql.append(helper.whereAnd()).append("pm.messageStatus = :messageStatus");
}
if (params.getAfterDate() != null) {
hql.append(helper.whereAnd()).append("pm.processeddate > :afterDate");
hql.append(helper.whereAnd()).append("pm.processedDate > :afterDate");
}
if (params.getBeforeDate() != null) {
hql.append(helper.whereAnd()).append("pm.processeddate < :beforeDate");
hql.append(helper.whereAnd()).append("pm.processedDate < :beforeDate");
}
if (params.hasOrganisationUnit()) {
hql.append(helper.whereAnd()).append("pm.recipients.organisationUnit = :orgUnits");
}

Query<ProgramMessage> query = getQuery(hql.toString());
Expand All @@ -118,6 +121,9 @@ private Query<ProgramMessage> getHqlQuery(ProgramMessageQueryParams params) {
if (params.getBeforeDate() != null) {
query.setParameter("beforeDate", params.getBeforeDate());
}
if (params.hasOrganisationUnit()) {
query.setParameter("orgUnits", params.getOrganisationUnits());
}

return query;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,15 @@
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.hisp.dhis.common.BaseIdentifiableObject;
import org.hisp.dhis.common.DeliveryChannel;
import org.hisp.dhis.common.IdentifiableObject;
import org.hisp.dhis.common.IdentifiableObjectManager;
import org.hisp.dhis.common.IllegalQueryException;
import org.hisp.dhis.common.UID;
import org.hisp.dhis.feedback.BadRequestException;
import org.hisp.dhis.feedback.NotFoundException;
import org.hisp.dhis.organisationunit.OrganisationUnitService;
import org.hisp.dhis.outboundmessage.BatchResponseStatus;
Expand Down Expand Up @@ -106,7 +107,7 @@ public List<ProgramMessage> getAllProgramMessages() {
@Override
@Transactional(readOnly = true)
public List<ProgramMessage> getProgramMessages(ProgramMessageOperationParams params)
throws NotFoundException {
throws NotFoundException, BadRequestException {
ProgramMessageQueryParams queryParams = operationParamMapper.map(params);

return programMessageStore.getProgramMessages(queryParams);
Expand All @@ -119,6 +120,28 @@ public long saveProgramMessage(ProgramMessage programMessage) {
return programMessage.getId();
}

@Override
@Transactional
public void updateProgramMessage(UID uid, ProgramMessageStatus status) throws NotFoundException {
ProgramMessage persisted = programMessageStore.getByUid(uid.getValue());
if (persisted == null) {
throw new NotFoundException(ProgramMessage.class, uid.getValue());
}

persisted.setMessageStatus(status);
programMessageStore.update(persisted);
}

@Override
@Transactional
public void deleteProgramMessage(UID uid) throws NotFoundException {
ProgramMessage persisted = programMessageStore.getByUid(uid.getValue());
if (persisted == null) {
throw new NotFoundException(ProgramMessage.class, uid.getValue());
}
programMessageStore.delete(persisted);
}

@Override
@Transactional
public void updateProgramMessage(ProgramMessage programMessage) {
Expand All @@ -137,7 +160,7 @@ public BatchResponseStatus sendMessages(List<ProgramMessage> programMessages) {
programMessages.stream()
.filter(this::hasDataWriteAccess)
.map(this::setAttributesBasedOnStrategy)
.collect(Collectors.toList());
.toList();

List<OutboundMessageBatch> batches = createBatches(populatedProgramMessages);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,19 @@
*/
package org.hisp.dhis.program.message;

import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import lombok.RequiredArgsConstructor;
import org.hisp.dhis.common.BaseIdentifiableObject;
import org.hisp.dhis.common.IdentifiableObjectManager;
import org.hisp.dhis.common.IllegalQueryException;
import org.hisp.dhis.common.UID;
import org.hisp.dhis.feedback.BadRequestException;
import org.hisp.dhis.feedback.NotFoundException;
import org.hisp.dhis.organisationunit.OrganisationUnit;
import org.hisp.dhis.organisationunit.OrganisationUnitService;
import org.hisp.dhis.program.Enrollment;
import org.hisp.dhis.program.Event;
import org.hisp.dhis.program.Program;
Expand All @@ -53,13 +58,23 @@ public class ProgramMessageOperationParamMapper {
private final IdentifiableObjectManager manager;

private final ProgramService programService;
private final OrganisationUnitService organisationUnitService;

@Transactional(readOnly = true)
public ProgramMessageQueryParams map(ProgramMessageOperationParams operationParams)
throws NotFoundException {
throws NotFoundException, BadRequestException {
Enrollment enrollment = getEntity(operationParams.getEnrollment(), Enrollment.class);
Event event = getEntity(operationParams.getEvent(), Event.class);

Set<OrganisationUnit> ous = new HashSet<>();
for (UID orgUnitUid : operationParams.getOrganisationUnits()) {
OrganisationUnit orgUnit = organisationUnitService.getOrganisationUnit(orgUnitUid.getValue());
if (orgUnit == null) {
throw new BadRequestException("Organisation unit does not exist: " + orgUnitUid);
}
ous.add(orgUnit);
}

currentUserHasAccess(enrollment, event);

return ProgramMessageQueryParams.builder()
Expand All @@ -70,7 +85,7 @@ public ProgramMessageQueryParams map(ProgramMessageOperationParams operationPara
.beforeDate(operationParams.getBeforeDate())
.page(operationParams.getPage())
.pageSize(operationParams.getPageSize())
.organisationUnit(operationParams.getOu())
.organisationUnits(ous)
.build();
}

Expand Down Expand Up @@ -98,6 +113,7 @@ private void currentUserHasAccess(Enrollment enrollment, Event event) {
}

List<Program> programs = programService.getCurrentUserPrograms();

String currentUser = CurrentUserUtil.getCurrentUsername();

if (!programs.contains(entity.getProgram())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,16 @@
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;

import java.util.List;
import org.hisp.dhis.common.CodeGenerator;
import org.hisp.dhis.common.IdentifiableObjectManager;
import org.hisp.dhis.common.IllegalQueryException;
import org.hisp.dhis.common.UID;
import org.hisp.dhis.feedback.BadRequestException;
import org.hisp.dhis.feedback.NotFoundException;
import org.hisp.dhis.program.Enrollment;
import org.hisp.dhis.program.Event;
Expand All @@ -56,13 +59,10 @@
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;

/**
* @author Zubair Asghar
*/
@MockitoSettings(strictness = Strictness.LENIENT)
@ExtendWith(MockitoExtension.class)
class ProgramMessageOperationParamsMapperTest {
private static UID ENROLLMENT = UID.of(CodeGenerator.generateUid());
Expand Down Expand Up @@ -95,26 +95,32 @@ void setUp() {
event = new Event();
event.setUid(EVENT.getValue());
event.setEnrollment(enrollment);

when(manager.get(eq(Enrollment.class), anyString())).thenReturn(enrollment);
when(manager.get(eq(Event.class), anyString())).thenReturn(event);
when(programService.getCurrentUserPrograms()).thenReturn(List.of(program));
}

@Test
void shouldMapEnrollmentUIDToEnrollmentObject() throws NotFoundException {
void shouldMapEnrollmentUIDToEnrollmentObject() throws NotFoundException, BadRequestException {
when(programService.getCurrentUserPrograms()).thenReturn(List.of(program));
when(manager.get(eq(Enrollment.class), anyString())).thenReturn(enrollment);

ProgramMessageQueryParams queryParams =
subject.map(ProgramMessageOperationParams.builder().enrollment(ENROLLMENT).build());

assertEquals(enrollment, queryParams.getEnrollment());
verify(manager).get(Enrollment.class, ENROLLMENT.getValue());
verifyNoMoreInteractions(manager);
}

@Test
void shouldMapEventUIDToEnrollmentObject() throws NotFoundException {
void shouldMapEventUIDToEnrollmentObject() throws NotFoundException, BadRequestException {
when(programService.getCurrentUserPrograms()).thenReturn(List.of(program));
when(manager.get(eq(Event.class), anyString())).thenReturn(event);

ProgramMessageQueryParams queryParams =
subject.map(ProgramMessageOperationParams.builder().event(EVENT).build());

assertEquals(event, queryParams.getEvent());
verify(manager).get(Event.class, EVENT.getValue());
verifyNoMoreInteractions(manager);
}

@Test
Expand All @@ -133,6 +139,8 @@ void shouldFailWhenEnrollmentNotFound() {
String.format(
"%s: %s does not exist.", Enrollment.class.getSimpleName(), invalidEnrollment),
exception.getMessage());
verify(manager).get(Enrollment.class, invalidEnrollment.getValue());
verifyNoMoreInteractions(manager);
}

@Test
Expand All @@ -148,10 +156,13 @@ void shouldFailWhenEventNotFound() {
assertStartsWith(
String.format("%s: %s does not exist.", Event.class.getSimpleName(), invalidEvent),
exception.getMessage());
verify(manager).get(Event.class, invalidEvent.getValue());
verifyNoMoreInteractions(manager);
}

@Test
void shouldFailWhenUserHasNoAccessToProgram() {
when(manager.get(eq(Enrollment.class), anyString())).thenReturn(enrollment);
when(programService.getCurrentUserPrograms()).thenReturn(List.of());

IllegalQueryException exception =
Expand All @@ -166,5 +177,8 @@ void shouldFailWhenUserHasNoAccessToProgram() {
"User:%s does not have access to the required program:%s",
user.getUsername(), program.getName()),
exception.getMessage());

verify(programService).getCurrentUserPrograms();
verifyNoMoreInteractions(programService);
}
}
Loading
Loading