bitpill 0.3.5

A personal medication management TUI application built in Rust.
Documentation
use std::sync::Arc;

use actix_web::{HttpResponse, web};
use serde::{Deserialize, Serialize};

use crate::application::dtos::requests::{MarkDoseTakenRequest, ScheduleDoseRequest};
use crate::application::errors::{ApplicationError, NotFoundError};
use crate::infrastructure::container::Container;

#[derive(Deserialize)]
pub struct MarkTakenBody {
    pub notes: Option<String>,
}

#[derive(Serialize)]
pub struct ScheduleResponseBody {
    pub created_count: usize,
}

#[derive(Serialize)]
pub struct MarkTakenResponseBody {
    pub record_id: String,
}

#[derive(Serialize)]
pub struct ErrorBody {
    pub error: String,
}

pub async fn schedule(data: web::Data<Arc<Container>>) -> HttpResponse {
    match data.schedule_dose_service.execute(ScheduleDoseRequest) {
        Ok(resp) => HttpResponse::Ok().json(ScheduleResponseBody {
            created_count: resp.created.len(),
        }),
        Err(e) => HttpResponse::InternalServerError().json(ErrorBody {
            error: e.to_string(),
        }),
    }
}

pub async fn mark_taken(
    data: web::Data<Arc<Container>>,
    path: web::Path<String>,
    _body: web::Json<MarkTakenBody>,
) -> HttpResponse {
    let id = path.into_inner();

    let request = MarkDoseTakenRequest::new(id);
    match data.mark_dose_taken_service.execute(request) {
        Ok(resp) => HttpResponse::Ok().json(MarkTakenResponseBody {
            record_id: resp.record_id,
        }),
        Err(ApplicationError::NotFound(NotFoundError)) => {
            HttpResponse::NotFound().json(ErrorBody {
                error: "dose record not found".into(),
            })
        }
        Err(ApplicationError::InvalidInput(e)) => {
            HttpResponse::BadRequest().json(ErrorBody { error: e })
        }
        Err(ApplicationError::Domain(e)) => HttpResponse::BadRequest().json(ErrorBody {
            error: e.to_string(),
        }),
        Err(e) => HttpResponse::InternalServerError().json(ErrorBody {
            error: e.to_string(),
        }),
    }
}