-
Notifications
You must be signed in to change notification settings - Fork 38
Added audit fields created_by, last_modified_by, filled_by across program_encounter and encounter tables #895
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
base: master
Are you sure you want to change the base?
Conversation
WalkthroughAdds createdBy, lastModifiedBy, and filledBy audit fields to encounter and program_encounter: DB migration (columns, indexes, RLS policies), domain model associations, services/controllers populate and serialize these fields from the current user, and tests to validate audit population. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant C as Client
participant EC as EncounterController
participant ES as EncounterService
participant US as UserService
participant DB as Database
rect rgba(230,245,255,0.6)
Note over C,ES: Create Encounter
C->>EC: POST /encounters
EC->>US: getCurrentUser()
US-->>EC: User
EC->>ES: createEncounter(payload)
ES->>ES: set createdBy/lastModifiedBy/filledBy = User
ES->>DB: INSERT encounter(..., created_by_id, last_modified_by_id, filled_by_id)
DB-->>ES: OK
ES-->>EC: Encounter
EC-->>C: JSON (includes createdBy, lastModifiedBy, filledBy)
end
rect rgba(255,245,230,0.6)
Note over C,ES: Update Encounter via VisitSchedule
C->>EC: PUT /encounters/{id}
EC->>US: getCurrentUser()
US-->>EC: User
EC->>ES: updateEncounter(id, changes)
ES->>ES: set lastModifiedBy = User
ES->>DB: UPDATE encounter SET last_modified_by_id=...
DB-->>ES: OK
ES-->>EC: Encounter
EC-->>C: JSON (updated audit fields)
end
Note over DB: RLS enforces created_by_id/last_modified_by_id/filled_by_id policies
sequenceDiagram
autonumber
participant C as Client
participant PC as ProgramEncounterController
participant PS as ProgramEncounterService
participant US as UserService
participant DB as Database
rect rgba(235,255,235,0.6)
Note over C,PS: Save ProgramEncounter
C->>PC: POST /programEncounters
PC->>US: getCurrentUser()
US-->>PC: User
PC->>PS: save(payload)
PS->>PS: associate individual, process observations
PS->>PS: set createdBy/lastModifiedBy/filledBy = User (or filledBy = null for createEmpty)
PS->>DB: INSERT/UPDATE program_encounter(..., audit fields)
DB-->>PS: OK
PS-->>PC: ProgramEncounter
PC-->>C: JSON (includes filledBy, createdBy, lastModifiedBy)
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 8
🧹 Nitpick comments (1)
avni-server-api/src/main/java/org/avni/server/web/ProgramEncounterController.java (1)
187-188
: Guard against null audit users in resource serializationConfirm
addUserFields
is null-safe; otherwise guard to avoid NPEs when these fields are unset.Optionally:
- addUserFields(programEncounter.getLastModifiedBy(), resource, "lastModifiedBy"); - addUserFields(programEncounter.getCreatedBy(), resource, "createdBy"); + if (programEncounter.getLastModifiedBy() != null) + addUserFields(programEncounter.getLastModifiedBy(), resource, "lastModifiedBy"); + if (programEncounter.getCreatedBy() != null) + addUserFields(programEncounter.getCreatedBy(), resource, "createdBy");
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (8)
avni-server-api/src/main/java/org/avni/server/service/EncounterService.java
(2 hunks)avni-server-api/src/main/java/org/avni/server/service/ProgramEncounterService.java
(4 hunks)avni-server-api/src/main/java/org/avni/server/web/EncounterController.java
(2 hunks)avni-server-api/src/main/java/org/avni/server/web/ProgramEncounterController.java
(1 hunks)avni-server-api/src/main/resources/db/migration/V1_353__AddAuditFields.sql
(1 hunks)avni-server-api/src/test/java/org/avni/server/service/ProgramEncounterServiceTest.java
(1 hunks)avni-server-api/src/test/java/org/avni/server/web/ProgramEncounterControllerIntegrationTest.java
(1 hunks)avni-server-data/src/main/java/org/avni/server/domain/AbstractEncounter.java
(2 hunks)
🔇 Additional comments (5)
avni-server-api/src/main/java/org/avni/server/web/EncounterController.java (1)
286-287
: LGTM: expose createdBy/lastModifiedBy in resourceSerialization parity with ProgramEncounter is good. Just ensure
addUserFields
tolerates nulls.avni-server-api/src/test/java/org/avni/server/web/ProgramEncounterControllerIntegrationTest.java (1)
44-44
: No functional changeEOF newline only. Nothing to do.
avni-server-api/src/main/java/org/avni/server/service/EncounterService.java (1)
157-158
: LGTM: update lastModifiedBy on schedule changesAppropriate place to capture modification.
avni-server-api/src/main/java/org/avni/server/service/ProgramEncounterService.java (1)
128-129
: LGTM: touch lastModifiedBy on schedule updatesCorrect audit behavior.
avni-server-data/src/main/java/org/avni/server/domain/AbstractEncounter.java (1)
68-74
: LGTM: JPA mappings for createdBy/lastModifiedByLazy ManyToOne with explicit join columns matches the migration.
avni-server-api/src/main/java/org/avni/server/service/EncounterService.java
Show resolved
Hide resolved
avni-server-api/src/main/java/org/avni/server/service/ProgramEncounterService.java
Outdated
Show resolved
Hide resolved
avni-server-api/src/main/java/org/avni/server/service/ProgramEncounterService.java
Outdated
Show resolved
Hide resolved
avni-server-api/src/main/java/org/avni/server/service/ProgramEncounterService.java
Outdated
Show resolved
Hide resolved
avni-server-api/src/main/java/org/avni/server/web/EncounterController.java
Show resolved
Hide resolved
avni-server-api/src/main/resources/db/migration/V1_353__AddAuditFields.sql
Show resolved
Hide resolved
avni-server-api/src/test/java/org/avni/server/service/ProgramEncounterServiceTest.java
Show resolved
Hide resolved
avni-server-data/src/main/java/org/avni/server/domain/AbstractEncounter.java
Outdated
Show resolved
Hide resolved
…By is set only if null
…ractEncounter to improve code readability
Audit Fields Implementation Summary
This PR addresses Issue #766 by introducing audit fields to track user actions on encounters.
Changes Made
Abstract Base Class Update
Added audit fields to
AbstractEncounter
class:created_by_id
last_modified_by_id
filled_by_id
Entity Relationships
Database Updates
Created migration script
V1_354__AddAuditFieldsToTables.sql
Added audit columns to:
Added performance indexes for audit fields
Service Layer
Updated services to handle audit field population:
EncounterService
ProgramEncounterService
Summary by CodeRabbit