Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
b673399
fix: add required appointment params to track the appointment on the …
LiamStanziani Jan 24, 2026
434d9b8
Update src/main/webapp/casemgmt/forward.jsp
LiamStanziani Jan 24, 2026
c7de4bc
fix: added URL encoding to OscarMsgType and MsgType
LiamStanziani Jan 24, 2026
a3abb05
fix: correct inverted logic in lab E-Chart button redirect
D3V41 Jan 25, 2026
d07609b
- Extract duplicate URL to PATIENT_SEARCH_URL constant
D3V41 Jan 25, 2026
f66cdc5
fix: updated ordering for prevention search to reverse the current be…
LiamStanziani Jan 25, 2026
fdda1be
fix: updated query to explicitly set ascending instead of using default
LiamStanziani Jan 25, 2026
12148fc
fix: reverse flowsheets prevention order, now descending instead of a…
LiamStanziani Jan 26, 2026
5e6a620
fix: use batch loading for tickler models
LiamStanziani Jan 26, 2026
1f1fd55
fix: added tickler index SQL update script
LiamStanziani Jan 26, 2026
95bc942
fix: added indexing to oscarinit SQL file, from new indexing update s…
LiamStanziani Jan 26, 2026
b64eab9
fix: removed changes to oscarinit indexes
LiamStanziani Jan 26, 2026
69c7ec0
fix: removed last added index to oscarinit
LiamStanziani Jan 26, 2026
9118039
fix: removed leading comma connected to nothing in oscarinit
LiamStanziani Jan 26, 2026
ae5f33f
fix: added missing composite index for tickler
LiamStanziani Jan 26, 2026
0fed2b1
fix: added IF NOT EXISTS in index update
LiamStanziani Jan 26, 2026
2a2f284
fix: resolve 404 errors on calculator page links with OWASP encoding
D3V41 Jan 27, 2026
08eafb6
Update src/main/webapp/oscarEncounter/calculators.jsp
yingbull Jan 27, 2026
ad7268b
fix: use correct OWASP encoding method and fix CSS path
github-actions[bot] Jan 27, 2026
95fb497
cubic changes
Jan 27, 2026
185d0f4
Minor changes
D3V41 Jan 27, 2026
77b67ba
fix: legacy documents and doc types not display correctly, added logi…
LiamStanziani Jan 28, 2026
ed4a2f9
fix: added module normilization to avoid capitals in database, added …
LiamStanziani Jan 28, 2026
cb5669e
fix: added better java doc comments, added exception throw if module …
LiamStanziani Jan 28, 2026
98b8325
fix: added OWASP encoding to values with it missing, updated conditio…
LiamStanziani Jan 28, 2026
162feb3
fix: added local root to the toLowerCase calls, added null checking f…
LiamStanziani Jan 28, 2026
f2e7499
fix: removed toLowerCase on query list utility method so that if ther…
LiamStanziani Jan 28, 2026
2320607
fix: resolve MCEDT/HCV keystore race condition by making clientKeysto…
D3V41 Jan 29, 2026
18f8ff3
docs: add comprehensive JavaDoc to keystore configuration methods
D3V41 Jan 29, 2026
94cebab
docs: correct @since dates from 2025-08-26 to 2026-01-29
github-actions[bot] Jan 29, 2026
8b6c0bd
fix: treat empty/blank keystore paths like null to prevent misconfigu…
github-actions[bot] Jan 29, 2026
f2de883
test: add regression test for keystore configuration isolation
github-actions[bot] Jan 29, 2026
73efa77
test: add coverage for null and non-existent keystore path handling
github-actions[bot] Jan 29, 2026
22851fc
fix: DTO projection through tickler DAO objects, seems we need to app…
LiamStanziani Jan 30, 2026
2251ac5
WIP: update tickler list to fix N+1 issue, use DTO projection there a…
LiamStanziani Jan 30, 2026
0cbd84c
refactor: remove multiple path ticklerMain towards DTO only
LiamStanziani Jan 30, 2026
29e9183
fix: dynamic encryption action count for MCEDT multiple file downloads
D3V41 Jan 30, 2026
cfc4b03
fix: updated since tags to 2026
LiamStanziani Jan 30, 2026
9f5a47b
fix: accidental commit of testing config changes for javaMelody dev env
LiamStanziani Jan 30, 2026
c045357
Update src/main/java/ca/openosp/openo/tickler/dto/TicklerListDTO.java
LiamStanziani Jan 30, 2026
da875e7
docs: document hasAttachmentEncryption field retention for diagnostics
D3V41 Jan 30, 2026
e49a9a4
fix: add diagnostic logging for encryption detection edge case
D3V41 Jan 30, 2026
1d8151e
test: add comprehensive unit tests for DynamicWSS4JInInterceptor
D3V41 Jan 30, 2026
1b0df52
fix: AI review comments
LiamStanziani Jan 30, 2026
726df6f
Merge branch 'performance/dto-projection-tickler' of https://github.c…
LiamStanziani Jan 30, 2026
b78221d
docs: document string matching assumption for EncryptedKey counting
D3V41 Jan 30, 2026
f01652a
fix: updated for copilot review again
LiamStanziani Jan 30, 2026
c86ea68
fix: correct @since date to match git history
D3V41 Jan 30, 2026
8bd1377
security: add DoS protection for EncryptedKey counting
D3V41 Jan 30, 2026
d0611d8
fix: implement fail-fast error handling in encryption detection
D3V41 Jan 30, 2026
f2c2289
fix: add input validation to countOccurrences method
D3V41 Jan 30, 2026
932a806
fix: additional updates to clean up code
LiamStanziani Jan 30, 2026
fdfdd04
refactor: replace string matching with robust XML/XPath parsing
D3V41 Jan 30, 2026
eddce81
Revert "refactor: replace string matching with robust XML/XPath parsing"
D3V41 Jan 30, 2026
4edd62d
fix: added descending to ids for ordering to match previous behaviour
LiamStanziani Jan 31, 2026
61d8389
fix: tests, add new tests
LiamStanziani Jan 31, 2026
6fafed4
fix: added missing hidden input values for ViewConsultationRequests.j…
LiamStanziani Feb 5, 2026
f9762b4
security: added OWASP endoding to the ViewConsultationRequests.jsp page
LiamStanziani Feb 5, 2026
5d28858
security: added OWASP endoding to offset and limit
LiamStanziani Feb 5, 2026
ecdbdf3
security: added OWASP encoding to requestId params in ViewRequest path
LiamStanziani Feb 5, 2026
944b618
security: added encoding to date outputs
LiamStanziani Feb 5, 2026
a999458
Test codes with leading dashes (e.g., '-HBAIC') were not displaying b…
D3V41 Feb 9, 2026
8f69f84
Update comments to accurately reflect that testCode no longer contain…
D3V41 Feb 9, 2026
7aa9682
fix: missing textbox to edit signature in preferences when no signatu…
LiamStanziani Feb 9, 2026
cf8b7c5
fix: normalize MDS lab test codes with leading dashes
D3V41 Feb 9, 2026
346771e
fix: added label to fmt messages for editing signatures
LiamStanziani Feb 9, 2026
fa1e517
align ZMN code extraction with MDSHandler parser logic for test codes…
D3V41 Feb 9, 2026
92ce70b
fix: preventions not being included in flowsheet printing due to miss…
LiamStanziani Feb 10, 2026
50ae0cb
fix: added explicit null check for fallback
LiamStanziani Feb 10, 2026
60db89a
chore: add JSP comment block explaining the functionality of the JSP …
LiamStanziani Feb 10, 2026
71574a6
Merge remote-tracking branch 'openo-beta/bug/tmp-notes-missing-calend…
lacarmen Feb 11, 2026
cc3ae02
Merge remote-tracking branch 'openo-beta/fix/issue-2059-lab-echart-in…
lacarmen Feb 11, 2026
d284a4f
Merge remote-tracking branch 'openo-beta/bug/preventions-order-by-las…
lacarmen Feb 11, 2026
3952edf
Merge remote-tracking branch 'openo-beta/bug/reverse-flowsheets-preve…
lacarmen Feb 11, 2026
e96676e
Merge remote-tracking branch 'openo-beta/bug/fix-slow-tickler-load-ti…
lacarmen Feb 11, 2026
6a17aed
Merge remote-tracking branch 'openo-beta/fix/calculator-links-404-owa…
lacarmen Feb 11, 2026
474cb66
Merge remote-tracking branch 'openo-beta/bug/legacy-documents-and-typ…
lacarmen Feb 11, 2026
835bc7c
Merge remote-tracking branch 'openo-beta/fix/mcedt-hcv-keystore-race-…
lacarmen Feb 11, 2026
68ea12f
Merge remote-tracking branch 'openo-beta/fix/mcedt-multiple-file-down…
lacarmen Feb 11, 2026
2390673
Merge remote-tracking branch 'openo-beta/performance/dto-projection-t…
lacarmen Feb 11, 2026
15a81a5
Merge remote-tracking branch 'openo-beta/bug/consultation-sorting-iss…
lacarmen Feb 11, 2026
874891b
Merge remote-tracking branch 'openo-beta/bug/missing-textbox-preferen…
lacarmen Feb 11, 2026
d58cdd6
Merge remote-tracking branch 'openo-beta/fix/mds-lab-test-codes-with-…
lacarmen Feb 11, 2026
7515d7c
Merge remote-tracking branch 'openo-beta/bug/preventions-not-printing…
lacarmen Feb 11, 2026
e8b02fd
chore: remove added file headers in pulled commits
LiamStanziani Feb 24, 2026
eb3e512
Merge remote-tracking branch 'open-osp/main' into hotfix-package
lacarmen Feb 25, 2026
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
2 changes: 1 addition & 1 deletion database/mysql/oscarinit.sql
Original file line number Diff line number Diff line change
Expand Up @@ -13206,4 +13206,4 @@ CREATE TABLE IF NOT EXISTS specialty (
region varchar(5) default '',
specialty char(2) default '',
specialtydesc varchar(100) default ''
);
);
14 changes: 14 additions & 0 deletions database/mysql/updates/update-2026-01-26-tickler-indexes.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
-- Performance indexes for tickler queries
-- These indexes support common filter operations and batch fetching

-- Index for batch fetching tickler links
CREATE INDEX IF NOT EXISTS `idx_tickler_link_tickler_no` ON `tickler_link` (`tickler_no`);

-- Index for composite key
CREATE INDEX IF NOT EXISTS `idx_tickler_status_service_date` ON `tickler` (`status`, `service_date`);

-- Index for "assigned to" filter queries
CREATE INDEX IF NOT EXISTS `idx_tickler_task_assigned_to` ON `tickler` (`task_assigned_to`);

-- Index for "created by" filter queries
CREATE INDEX IF NOT EXISTS `idx_tickler_creator` ON `tickler` (`creator`);
22 changes: 15 additions & 7 deletions src/main/java/ca/openosp/openo/commn/dao/CtlDocTypeDaoImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,12 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import javax.persistence.Query;

import ca.openosp.openo.commn.model.CtlDocType;
import ca.openosp.openo.documentManager.EDocUtil;
import org.springframework.stereotype.Repository;

@Repository
Expand All @@ -43,10 +45,11 @@ public CtlDocTypeDaoImpl() {
}

public void changeDocType(String docType, String module, String status) {
String sql = "UPDATE CtlDocType SET status =?1 WHERE module =?2 AND doctype =?3";
List<String> modules = EDocUtil.getModulesForQuery(module);
String sql = "UPDATE CtlDocType SET status =?1 WHERE module in (?2) AND doctype =?3";
Query query = entityManager.createQuery(sql);
query.setParameter(1, status);
query.setParameter(2, module);
query.setParameter(2, modules);
query.setParameter(3, docType);

query.executeUpdate();
Expand All @@ -61,27 +64,32 @@ public List<CtlDocType> findByStatusAndModule(String[] status, String module) {
}

public List<CtlDocType> findByStatusAndModule(List<String> status, String module) {
Query query = entityManager.createQuery("select c from CtlDocType c where c.status in (?1) and c.module=?2");
List<String> modules = EDocUtil.getModulesForQuery(module);
Query query = entityManager.createQuery("select c from CtlDocType c where c.status in (?1) and c.module in (?2)");
query.setParameter(1, status);
query.setParameter(2, module);
query.setParameter(2, modules);
@SuppressWarnings("unchecked")
List<CtlDocType> results = query.getResultList();
return results;
}

public List<CtlDocType> findByDocTypeAndModule(String docType, String module) {
Query query = entityManager.createQuery("select c from CtlDocType c where c.docType=?1 and c.module=?2");
List<String> modules = EDocUtil.getModulesForQuery(module);
Query query = entityManager.createQuery("select c from CtlDocType c where c.docType=?1 and c.module in (?2)");
query.setParameter(1, docType);
query.setParameter(2, module);
query.setParameter(2, modules);
@SuppressWarnings("unchecked")
List<CtlDocType> results = query.getResultList();
return results;
}

public void addDocType(String docType, String module) {
if (module == null) {
throw new IllegalArgumentException("module cannot be null");
}
CtlDocType d = new CtlDocType();
d.setDocType(docType);
d.setModule(module);
d.setModule(module.toLowerCase(Locale.ROOT));
d.setStatus("A");
entityManager.persist(d);
}
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/ca/openosp/openo/commn/dao/DocumentDaoImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import ca.openosp.openo.commn.model.EFormDocs;
import org.springframework.stereotype.Repository;

import ca.openosp.openo.documentManager.EDocUtil;
import ca.openosp.openo.documentManager.EDocUtil.EDocSort;

@Repository
Expand Down Expand Up @@ -325,10 +326,11 @@ public List<Object[]> findDocuments(String module, String moduleid, String docTy
throw new IllegalArgumentException("moduleid must be a valid integer, but got:" + moduleid, e);
}

List<String> modules = EDocUtil.getModulesForQuery(module);
StringBuilder buf = new StringBuilder("SELECT DISTINCT c, d " +
"FROM Document d, CtlDocument c " +
"WHERE c.id.documentNo = d.id AND c.id.module = :module");
params.put("module", module);
"WHERE c.id.documentNo = d.id AND c.id.module IN :modules");
params.put("modules", modules);

boolean isShowingAllDocuments = docType == null || docType.equals("all") || docType.length() == 0;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ public List<Prevention> findByTypeAndDate(String preventionType, Date startDate,

@Override
public List<Prevention> findByTypeAndDemoNo(String preventionType, Integer demoNo) {
String sqlCommand = "select x from " + modelClass.getSimpleName() + " x where preventionType=?1 and demographicId=?2 and deleted='0' order by preventionDate desc";
String sqlCommand = "select x from " + modelClass.getSimpleName() + " x where preventionType=?1 and demographicId=?2 and deleted='0' order by preventionDate asc";

Query query = entityManager.createQuery(sqlCommand);
query.setParameter(1, preventionType);
Expand Down
34 changes: 34 additions & 0 deletions src/main/java/ca/openosp/openo/commn/dao/TicklerDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@

import ca.openosp.openo.commn.model.CustomFilter;
import ca.openosp.openo.commn.model.Tickler;
import ca.openosp.openo.tickler.dto.TicklerListDTO;

public interface TicklerDao extends AbstractDao<Tickler> {

Expand Down Expand Up @@ -68,4 +69,37 @@ public List<Tickler> findByDemographicIdTaskAssignedToAndMessage(Integer demogra
public List<Tickler> getTicklers(CustomFilter filter);

public int getNumTicklers(CustomFilter filter);

/**
* Returns a list of TicklerListDTOs matching the filter criteria with pagination.
* <p>
* This method uses JPQL constructor expressions to fetch only the fields needed
* for display, reducing database queries from ~25 per page load to a small fixed set
* of queries. Comments and links are each batch-loaded in separate queries.
* </p>
*
* @param filter CustomFilter the filter criteria including status, provider, date range, etc.
* @param offset int the starting position for pagination (0-based)
* @param limit int the maximum number of results to return
* @return List&lt;TicklerListDTO&gt; matching the filter with comments and links populated,
* or empty list if no matches found
* @since 2026-01-30
*/
List<TicklerListDTO> getTicklerDTOs(CustomFilter filter, int offset, int limit);

/**
* Returns a list of TicklerListDTOs matching the filter criteria.
* <p>
* This method uses JPQL constructor expressions to fetch only the fields needed
* for display, reducing database queries from ~25 per page load to a small fixed set
* of queries. Comments and links are each batch-loaded in separate queries.
* Uses default pagination with MAX_LIST_RETURN_SIZE limit.
* </p>
*
* @param filter CustomFilter the filter criteria including status, provider, date range, etc.
* @return List&lt;TicklerListDTO&gt; matching the filter with comments and links populated,
* or empty list if no matches found
* @since 2026-01-30
*/
List<TicklerListDTO> getTicklerDTOs(CustomFilter filter);
}
Loading
Loading