diff --git a/src/application/dtos/requests.rs b/src/application/dtos/requests.rs new file mode 100644 index 0000000..2a26a7e --- /dev/null +++ b/src/application/dtos/requests.rs @@ -0,0 +1,130 @@ +use chrono::NaiveDateTime; +use serde_json::Value; + +pub struct CreateDoseRecordRequest { + pub medication_id: String, + pub scheduled_at: NaiveDateTime, +} + +impl CreateDoseRecordRequest { + pub fn new(medication_id: impl Into, scheduled_at: NaiveDateTime) -> Self { + Self { + medication_id: medication_id.into(), + scheduled_at, + } + } +} + +pub struct CreateMedicationRequest { + pub name: String, + pub amount_mg: u32, + pub scheduled_time: Vec<(u32, u32)>, + pub dose_frequency: String, +} + +impl CreateMedicationRequest { + pub fn new( + name: impl Into, + amount_mg: u32, + scheduled_time: Vec<(u32, u32)>, + dose_frequency: impl Into, + ) -> Self { + Self { + name: name.into(), + amount_mg, + scheduled_time, + dose_frequency: dose_frequency.into(), + } + } +} + +pub struct DeleteMedicationRequest { + pub id: String, +} + +pub struct EditMedicationRequest { + pub id: String, + pub name: String, + pub amount_mg: u32, + pub scheduled_time: Vec<(u32, u32)>, + pub dose_frequency: String, +} + +impl EditMedicationRequest { + pub fn new( + id: impl Into, + name: impl Into, + amount_mg: u32, + scheduled_time: Vec<(u32, u32)>, + dose_frequency: impl Into, + ) -> Self { + Self { + id: id.into(), + name: name.into(), + amount_mg, + scheduled_time, + dose_frequency: dose_frequency.into(), + } + } +} + +pub struct GetMedicationRequest { + pub id: String, +} + +pub struct ListAllMedicationsRequest; + +pub struct ListDoseRecordsRequest { + pub medication_id: String, +} + +pub struct MarkDoseTakenRequest { + pub record_id: String, + pub taken_at: NaiveDateTime, +} + +impl MarkDoseTakenRequest { + pub fn new(record_id: impl Into, taken_at: NaiveDateTime) -> Self { + Self { + record_id: record_id.into(), + taken_at, + } + } +} + +pub struct ScheduleDoseRequest; + +pub struct SettingsRequest { + pub op: SettingsOperation, +} + +pub enum SettingsOperation { + Get, + Update { settings: Value }, +} + +pub struct UpdateMedicationRequest { + pub id: String, + pub name: String, + pub amount_mg: u32, + pub scheduled_time: Vec<(u32, u32)>, + pub dose_frequency: String, +} + +impl UpdateMedicationRequest { + pub fn new( + id: impl Into, + name: impl Into, + amount_mg: u32, + scheduled_time: Vec<(u32, u32)>, + dose_frequency: impl Into, + ) -> Self { + Self { + id: id.into(), + name: name.into(), + amount_mg, + scheduled_time, + dose_frequency: dose_frequency.into(), + } + } +} diff --git a/src/application/dtos/requests/create_dose_record_request.rs b/src/application/dtos/requests/create_dose_record_request.rs deleted file mode 100644 index 842cc13..0000000 --- a/src/application/dtos/requests/create_dose_record_request.rs +++ /dev/null @@ -1,15 +0,0 @@ -use chrono::NaiveDateTime; - -pub struct CreateDoseRecordRequest { - pub medication_id: String, - pub scheduled_at: NaiveDateTime, -} - -impl CreateDoseRecordRequest { - pub fn new(medication_id: impl Into, scheduled_at: NaiveDateTime) -> Self { - Self { - medication_id: medication_id.into(), - scheduled_at, - } - } -} diff --git a/src/application/dtos/requests/create_medication_request.rs b/src/application/dtos/requests/create_medication_request.rs deleted file mode 100644 index db33487..0000000 --- a/src/application/dtos/requests/create_medication_request.rs +++ /dev/null @@ -1,22 +0,0 @@ -pub struct CreateMedicationRequest { - pub name: String, - pub amount_mg: u32, - pub scheduled_time: Vec<(u32, u32)>, - pub dose_frequency: String, -} - -impl CreateMedicationRequest { - pub fn new( - name: impl Into, - amount_mg: u32, - scheduled_time: Vec<(u32, u32)>, - dose_frequency: impl Into, - ) -> Self { - Self { - name: name.into(), - amount_mg, - scheduled_time, - dose_frequency: dose_frequency.into(), - } - } -} diff --git a/src/application/dtos/requests/delete_medication_request.rs b/src/application/dtos/requests/delete_medication_request.rs deleted file mode 100644 index cfdf8c8..0000000 --- a/src/application/dtos/requests/delete_medication_request.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub struct DeleteMedicationRequest { - pub id: String, -} diff --git a/src/application/dtos/requests/edit_medication_request.rs b/src/application/dtos/requests/edit_medication_request.rs deleted file mode 100644 index 447548e..0000000 --- a/src/application/dtos/requests/edit_medication_request.rs +++ /dev/null @@ -1,25 +0,0 @@ -pub struct EditMedicationRequest { - pub id: String, - pub name: String, - pub amount_mg: u32, - pub scheduled_time: Vec<(u32, u32)>, - pub dose_frequency: String, -} - -impl EditMedicationRequest { - pub fn new( - id: impl Into, - name: impl Into, - amount_mg: u32, - scheduled_time: Vec<(u32, u32)>, - dose_frequency: impl Into, - ) -> Self { - Self { - id: id.into(), - name: name.into(), - amount_mg, - scheduled_time, - dose_frequency: dose_frequency.into(), - } - } -} diff --git a/src/application/dtos/requests/get_medication_request.rs b/src/application/dtos/requests/get_medication_request.rs deleted file mode 100644 index 769b3a4..0000000 --- a/src/application/dtos/requests/get_medication_request.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub struct GetMedicationRequest { - pub id: String, -} diff --git a/src/application/dtos/requests/list_all_medications_request.rs b/src/application/dtos/requests/list_all_medications_request.rs deleted file mode 100644 index 3671411..0000000 --- a/src/application/dtos/requests/list_all_medications_request.rs +++ /dev/null @@ -1 +0,0 @@ -pub struct ListAllMedicationsRequest; diff --git a/src/application/dtos/requests/list_dose_records_request.rs b/src/application/dtos/requests/list_dose_records_request.rs deleted file mode 100644 index 088c065..0000000 --- a/src/application/dtos/requests/list_dose_records_request.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub struct ListDoseRecordsRequest { - pub medication_id: String, -} diff --git a/src/application/dtos/requests/mark_dose_taken_request.rs b/src/application/dtos/requests/mark_dose_taken_request.rs deleted file mode 100644 index 659857a..0000000 --- a/src/application/dtos/requests/mark_dose_taken_request.rs +++ /dev/null @@ -1,18 +0,0 @@ -use chrono::NaiveDateTime; - -pub struct MarkDoseTakenRequest { - /// UUID string identifying the [`DoseRecord`] to mark as taken. - /// - /// [`DoseRecord`]: crate::domain::entities::dose_record::DoseRecord - pub record_id: String, - pub taken_at: NaiveDateTime, -} - -impl MarkDoseTakenRequest { - pub fn new(record_id: impl Into, taken_at: NaiveDateTime) -> Self { - Self { - record_id: record_id.into(), - taken_at, - } - } -} diff --git a/src/application/dtos/requests/mod.rs b/src/application/dtos/requests/mod.rs deleted file mode 100644 index 11ed586..0000000 --- a/src/application/dtos/requests/mod.rs +++ /dev/null @@ -1,23 +0,0 @@ -pub mod create_dose_record_request; -pub mod create_medication_request; -pub mod delete_medication_request; -pub mod edit_medication_request; -pub mod get_medication_request; -pub mod list_all_medications_request; -pub mod list_dose_records_request; -pub mod mark_dose_taken_request; -pub mod schedule_dose_request; -pub mod settings_request; -pub mod update_medication_request; - -pub use create_dose_record_request::CreateDoseRecordRequest; -pub use create_medication_request::CreateMedicationRequest; -pub use delete_medication_request::DeleteMedicationRequest; -pub use edit_medication_request::EditMedicationRequest; -pub use get_medication_request::GetMedicationRequest; -pub use list_all_medications_request::ListAllMedicationsRequest; -pub use list_dose_records_request::ListDoseRecordsRequest; -pub use mark_dose_taken_request::MarkDoseTakenRequest; -pub use schedule_dose_request::ScheduleDoseRequest; -pub use settings_request::{SettingsOperation, SettingsRequest}; -pub use update_medication_request::UpdateMedicationRequest; diff --git a/src/application/dtos/requests/schedule_dose_request.rs b/src/application/dtos/requests/schedule_dose_request.rs deleted file mode 100644 index be37194..0000000 --- a/src/application/dtos/requests/schedule_dose_request.rs +++ /dev/null @@ -1,5 +0,0 @@ -/// A scheduling tick request. Contains no parameters — the service uses its -/// injected [`ClockPort`] to determine the current time. -/// -/// [`ClockPort`]: crate::application::ports::clock_port::ClockPort -pub struct ScheduleDoseRequest; diff --git a/src/application/dtos/requests/settings_request.rs b/src/application/dtos/requests/settings_request.rs deleted file mode 100644 index c924497..0000000 --- a/src/application/dtos/requests/settings_request.rs +++ /dev/null @@ -1,12 +0,0 @@ -use serde_json::Value; - -/// Request DTO for settings operations. -pub struct SettingsRequest { - pub op: SettingsOperation, -} - -/// Supported operations for the Settings inbound port. -pub enum SettingsOperation { - Get, - Update { settings: Value }, -} diff --git a/src/application/dtos/requests/update_medication_request.rs b/src/application/dtos/requests/update_medication_request.rs deleted file mode 100644 index 688b4ee..0000000 --- a/src/application/dtos/requests/update_medication_request.rs +++ /dev/null @@ -1,25 +0,0 @@ -pub struct UpdateMedicationRequest { - pub id: String, - pub name: String, - pub amount_mg: u32, - pub scheduled_time: Vec<(u32, u32)>, - pub dose_frequency: String, -} - -impl UpdateMedicationRequest { - pub fn new( - id: impl Into, - name: impl Into, - amount_mg: u32, - scheduled_time: Vec<(u32, u32)>, - dose_frequency: impl Into, - ) -> Self { - Self { - id: id.into(), - name: name.into(), - amount_mg, - scheduled_time, - dose_frequency: dose_frequency.into(), - } - } -} diff --git a/src/application/dtos/responses.rs b/src/application/dtos/responses.rs new file mode 100644 index 0000000..ba3df76 --- /dev/null +++ b/src/application/dtos/responses.rs @@ -0,0 +1,101 @@ +use chrono::NaiveDateTime; +use serde_json::Value; + +#[derive(Clone)] +pub struct DoseRecordDto { + pub id: String, + pub medication_id: String, + pub scheduled_at: NaiveDateTime, + pub taken_at: Option, +} + +#[derive(Clone)] +pub struct ScheduledDoseRecordDto { + pub id: String, + pub medication_id: String, + pub scheduled_at: NaiveDateTime, +} + +pub struct MedicationDto { + pub id: String, + pub name: String, + pub amount_mg: u32, + pub scheduled_time: Vec<(u32, u32)>, + pub dose_frequency: String, +} + +pub struct CreateDoseRecordResponse { + pub id: String, +} + +pub struct CreateMedicationResponse { + pub id: String, +} + +pub struct DeleteMedicationResponse {} + +pub struct EditMedicationResponse { + pub id: String, +} + +pub struct GetMedicationResponse { + pub medication: MedicationDto, +} + +pub struct GetSettingsResponse { + pub navigation_mode: String, +} + +pub struct ListAllMedicationsResponse { + pub medications: Vec, +} + +pub struct ListDoseRecordsResponse { + pub records: Vec, +} + +pub struct MarkDoseTakenResponse { + pub record_id: String, +} + +impl MarkDoseTakenResponse { + pub fn new(record_id: impl Into) -> Self { + Self { + record_id: record_id.into(), + } + } +} + +pub struct MarkMedicationTakenResponse { + pub id: String, +} + +impl MarkMedicationTakenResponse { + pub fn new(id: impl Into) -> Self { + Self { id: id.into() } + } +} + +pub struct ScheduleDoseResponse { + pub created: Vec, +} + +pub struct SettingsResponse { + pub settings: Value, +} + +pub struct UpdateMedicationResponse { + pub id: String, +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn response_new_and_fields() { + let raw_id = "some-id"; + let response = MarkDoseTakenResponse::new("some-id"); + assert_eq!(response.record_id, raw_id); + } +} diff --git a/src/application/dtos/responses/create_dose_record_response.rs b/src/application/dtos/responses/create_dose_record_response.rs deleted file mode 100644 index 3c6e049..0000000 --- a/src/application/dtos/responses/create_dose_record_response.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub struct CreateDoseRecordResponse { - pub id: String, -} diff --git a/src/application/dtos/responses/create_medication_response.rs b/src/application/dtos/responses/create_medication_response.rs deleted file mode 100644 index 9ed5c60..0000000 --- a/src/application/dtos/responses/create_medication_response.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub struct CreateMedicationResponse { - pub id: String, -} diff --git a/src/application/dtos/responses/delete_medication_response.rs b/src/application/dtos/responses/delete_medication_response.rs deleted file mode 100644 index 1422393..0000000 --- a/src/application/dtos/responses/delete_medication_response.rs +++ /dev/null @@ -1 +0,0 @@ -pub struct DeleteMedicationResponse {} diff --git a/src/application/dtos/responses/edit_medication_response.rs b/src/application/dtos/responses/edit_medication_response.rs deleted file mode 100644 index 3d6502b..0000000 --- a/src/application/dtos/responses/edit_medication_response.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub struct EditMedicationResponse { - pub id: String, -} diff --git a/src/application/dtos/responses/get_medication_response.rs b/src/application/dtos/responses/get_medication_response.rs deleted file mode 100644 index 1e53e2e..0000000 --- a/src/application/dtos/responses/get_medication_response.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub use super::list_all_medications_response::MedicationDto; - -pub struct GetMedicationResponse { - pub medication: MedicationDto, -} diff --git a/src/application/dtos/responses/list_all_medications_response.rs b/src/application/dtos/responses/list_all_medications_response.rs deleted file mode 100644 index 0435e64..0000000 --- a/src/application/dtos/responses/list_all_medications_response.rs +++ /dev/null @@ -1,14 +0,0 @@ -/// Data transfer object representing a medication returned from the list query. -pub struct MedicationDto { - pub id: String, - pub name: String, - pub amount_mg: u32, - /// Scheduled administration times as `(hour, minute)` pairs. - pub scheduled_time: Vec<(u32, u32)>, - /// Dose frequency as string (e.g. "OnceDaily", "TwiceDaily") - pub dose_frequency: String, -} - -pub struct ListAllMedicationsResponse { - pub medications: Vec, -} diff --git a/src/application/dtos/responses/list_dose_records_response.rs b/src/application/dtos/responses/list_dose_records_response.rs deleted file mode 100644 index eced375..0000000 --- a/src/application/dtos/responses/list_dose_records_response.rs +++ /dev/null @@ -1,13 +0,0 @@ -use chrono::NaiveDateTime; - -#[derive(Clone)] -pub struct DoseRecordDto { - pub id: String, - pub medication_id: String, - pub scheduled_at: NaiveDateTime, - pub taken_at: Option, -} - -pub struct ListDoseRecordsResponse { - pub records: Vec, -} diff --git a/src/application/dtos/responses/mark_dose_taken_response.rs b/src/application/dtos/responses/mark_dose_taken_response.rs deleted file mode 100644 index c826b07..0000000 --- a/src/application/dtos/responses/mark_dose_taken_response.rs +++ /dev/null @@ -1,26 +0,0 @@ -pub struct MarkDoseTakenResponse { - /// UUID string of the dose record that was marked as taken. - pub record_id: String, -} - -impl MarkDoseTakenResponse { - pub fn new(record_id: impl Into) -> Self { - Self { - record_id: record_id.into(), - } - } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn response_new_and_fields() { - let raw_id = "some-id"; - - let response = MarkDoseTakenResponse::new("some-id"); - - assert_eq!(response.record_id, raw_id); - } -} diff --git a/src/application/dtos/responses/mark_medication_taken_response.rs b/src/application/dtos/responses/mark_medication_taken_response.rs deleted file mode 100644 index 38f6894..0000000 --- a/src/application/dtos/responses/mark_medication_taken_response.rs +++ /dev/null @@ -1,9 +0,0 @@ -pub struct MarkDoseTakenResponse { - pub id: String, -} - -impl MarkDoseTakenResponse { - pub fn new(id: impl Into) -> Self { - Self { id: id.into() } - } -} diff --git a/src/application/dtos/responses/mod.rs b/src/application/dtos/responses/mod.rs deleted file mode 100644 index d89ae42..0000000 --- a/src/application/dtos/responses/mod.rs +++ /dev/null @@ -1,23 +0,0 @@ -pub mod create_dose_record_response; -pub mod create_medication_response; -pub mod delete_medication_response; -pub mod edit_medication_response; -pub mod get_medication_response; -pub mod list_all_medications_response; -pub mod list_dose_records_response; -pub mod mark_dose_taken_response; -pub mod schedule_dose_response; -pub mod settings_response; -pub mod update_medication_response; - -pub use create_dose_record_response::CreateDoseRecordResponse; -pub use create_medication_response::CreateMedicationResponse; -pub use delete_medication_response::DeleteMedicationResponse; -pub use edit_medication_response::EditMedicationResponse; -pub use get_medication_response::GetMedicationResponse; -pub use list_all_medications_response::{ListAllMedicationsResponse, MedicationDto}; -pub use list_dose_records_response::{DoseRecordDto, ListDoseRecordsResponse}; -pub use mark_dose_taken_response::MarkDoseTakenResponse; -pub use schedule_dose_response::ScheduleDoseResponse; -pub use settings_response::SettingsResponse; -pub use update_medication_response::UpdateMedicationResponse; diff --git a/src/application/dtos/responses/schedule_dose_response.rs b/src/application/dtos/responses/schedule_dose_response.rs deleted file mode 100644 index 0fe38ad..0000000 --- a/src/application/dtos/responses/schedule_dose_response.rs +++ /dev/null @@ -1,14 +0,0 @@ -use chrono::NaiveDateTime; - -/// Data transfer object for a dose record created during a scheduling tick. -#[derive(Clone)] -pub struct DoseRecordDto { - pub id: String, - pub medication_id: String, - pub scheduled_at: NaiveDateTime, -} - -pub struct ScheduleDoseResponse { - /// All dose records created during this tick. - pub created: Vec, -} diff --git a/src/application/dtos/responses/settings_response.rs b/src/application/dtos/responses/settings_response.rs deleted file mode 100644 index 27ef986..0000000 --- a/src/application/dtos/responses/settings_response.rs +++ /dev/null @@ -1,6 +0,0 @@ -use serde_json::Value; - -/// Response DTO for settings operations. -pub struct SettingsResponse { - pub settings: Value, -} diff --git a/src/application/dtos/responses/update_medication_response.rs b/src/application/dtos/responses/update_medication_response.rs deleted file mode 100644 index 59e7789..0000000 --- a/src/application/dtos/responses/update_medication_response.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub struct UpdateMedicationResponse { - pub id: String, -} diff --git a/src/application/ports/inbound/get_settings_port.rs b/src/application/ports/inbound/get_settings_port.rs new file mode 100644 index 0000000..3925217 --- /dev/null +++ b/src/application/ports/inbound/get_settings_port.rs @@ -0,0 +1,4 @@ +use crate::application::{ + dtos::responses::GetSettingsResponse, + errors::ApplicationError +}; diff --git a/src/application/ports/inbound/schedule_dose_port.rs b/src/application/ports/inbound/schedule_dose_port.rs index 8359514..ea472fd 100644 --- a/src/application/ports/inbound/schedule_dose_port.rs +++ b/src/application/ports/inbound/schedule_dose_port.rs @@ -1,6 +1,10 @@ -use crate::application::dtos::requests::ScheduleDoseRequest; -use crate::application::dtos::responses::schedule_dose_response::ScheduleDoseResponse; -use crate::application::errors::ApplicationError; +use crate::application::{ + dtos::{ + requests::ScheduleDoseRequest, + responses::ScheduleDoseResponse + }, + errors::ApplicationError +}; /// A scheduling tick port. The service uses its injected [`ClockPort`] to determine /// the current time. diff --git a/src/application/ports/inbound/update_settings_port.rs b/src/application/ports/inbound/update_settings_port.rs new file mode 100644 index 0000000..6ad6e96 --- /dev/null +++ b/src/application/ports/inbound/update_settings_port.rs @@ -0,0 +1,15 @@ +use crate::{ + application::{ + dtos::{ + requests::SettingsRequest, + responses::SettingsResponse, + }, + errors::ApplicationError + } +}; + +/// Inbound application port for settings-related use-cases. +/// Single execute method taking a Request DTO and returning a Response DTO. +pub trait UpdateSettingsPort: Send + Sync { + fn execute(&self, req: SettingsRequest) -> Result; +} diff --git a/src/application/ports/outbound/settings_repository_port.rs b/src/application/ports/outbound/settings_repository_port.rs index 6f01fd6..0ace8c3 100644 --- a/src/application/ports/outbound/settings_repository_port.rs +++ b/src/application/ports/outbound/settings_repository_port.rs @@ -1,10 +1,11 @@ use crate::application::errors::StorageError; use serde_json::Value; +/// Outbound application ports for settings-related storage. pub trait SettingsRepositoryPort: Send + Sync { fn load(&self) -> Result; fn save(&self, settings: &Value) -> Result<(), StorageError>; } -// Boxed trait alias for simpler wiring in the container +/// Boxed trait alias for simpler wiring in the container pub type SettingsRepositoryPortBox = dyn SettingsRepositoryPort + Send + Sync; diff --git a/src/application/services/schedule_dose_service.rs b/src/application/services/schedule_dose_service.rs index c07dfc8..17043df 100644 --- a/src/application/services/schedule_dose_service.rs +++ b/src/application/services/schedule_dose_service.rs @@ -3,9 +3,7 @@ use std::sync::Arc; use chrono::Timelike; use crate::application::dtos::requests::ScheduleDoseRequest; -use crate::application::dtos::responses::schedule_dose_response::{ - DoseRecordDto, ScheduleDoseResponse, -}; +use crate::application::dtos::responses::{ScheduleDoseResponse, ScheduledDoseRecordDto}; use crate::application::errors::ApplicationError; use crate::application::ports::{ clock_port::ClockPort, dose_record_repository_port::DoseRecordRepository, @@ -86,7 +84,7 @@ impl ScheduleDosePort for ScheduleDoseService { let records = self.execute()?; let created = records .into_iter() - .map(|r| DoseRecordDto { + .map(|r| ScheduledDoseRecordDto { id: r.id().to_string(), medication_id: r.medication_id().to_string(), scheduled_at: r.scheduled_at(),