Skip to content

Commit

Permalink
editoast: update paced train endpoint
Browse files Browse the repository at this point in the history
Signed-off-by: Egor Berezovskiy <[email protected]>
  • Loading branch information
Wadjetz committed Mar 6, 2025
1 parent 7d6c72a commit 84f55a8
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 28 deletions.
2 changes: 1 addition & 1 deletion editoast/editoast_schemas/src/primitives/duration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ pub enum PositiveDurationError {
/// let err_s = r#"{"duration":"P1M"}"#; // 1 month
/// assert!(serde_json::from_str::<MyStruct>(err_s).is_err());
/// ```
#[derive(Debug, Clone)]
#[derive(Debug, Clone, PartialEq)]
pub struct PositiveDuration(ChronoDuration);

impl TryFrom<ChronoDuration> for PositiveDuration {
Expand Down
22 changes: 21 additions & 1 deletion editoast/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1626,6 +1626,7 @@ paths:
tags:
- timetable
- paced_train
summary: Update a paced train
parameters:
- name: id
in: path
Expand All @@ -1637,7 +1638,26 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/PacedTrainForm'
allOf:
- $ref: '#/components/schemas/TrainScheduleBase'
- type: object
required:
- paced
properties:
paced:
type: object
required:
- duration
- step
properties:
duration:
type: string
description: Duration of the paced train, an ISO 8601 format is expected
example: PT2H
step:
type: string
description: Time between two occurrences, an ISO 8601 format is expected
example: PT15M
required: true
responses:
'200':
Expand Down
85 changes: 65 additions & 20 deletions editoast/src/views/paced_train.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ use super::SimulationSummaryResult;
use crate::core::simulation::SimulationResponse;
use crate::error::Result;
use crate::models::paced_train::PacedTrain;
use crate::models::paced_train::PacedTrainChangeset;
use crate::models::prelude::*;
use crate::views::projection::ProjectPathTrainResult;
use crate::views::AuthorizationError;
Expand Down Expand Up @@ -130,6 +131,43 @@ async fn get_by_id(
Ok(Json(paced_train))
}

/// Update a paced train
#[utoipa::path(
put, path = "",
tag = "timetable,paced_train",
params(PacedTrainIdParam),
request_body = inline(PacedTrainBase),
responses(
(status = 200, body = PacedTrainResult, description = "Paced train have been updated")
)
)]
async fn update_paced_train(
State(db_pool): State<DbConnectionPoolV2>,
Extension(auth): AuthenticationExt,
Path(PacedTrainIdParam { id: paced_train_id }): Path<PacedTrainIdParam>,
Json(paced_train_base): Json<PacedTrainBase>,
) -> Result<impl IntoResponse> {
let authorized = auth
.check_roles([BuiltinRole::OperationalStudies, BuiltinRole::Stdcm].into())
.await
.map_err(AuthorizationError::AuthError)?;
if !authorized {
return Err(AuthorizationError::Forbidden.into());
}

let conn = &mut db_pool.get().await?;
let paced_train_changeset: PacedTrainChangeset = paced_train_base.into();
let paced_train = paced_train_changeset
.update_or_fail(conn, paced_train_id, || {
PacedTrainError::PacedTrainNotFound { paced_train_id }
})
.await?;

let paced_train_result: PacedTrainResult = paced_train.into();

Ok(Json(paced_train_result))
}

/// Delete a paced train
#[utoipa::path(
delete, path = "",
Expand Down Expand Up @@ -163,26 +201,6 @@ async fn delete(
Ok(axum::http::StatusCode::NO_CONTENT)
}

#[utoipa::path(
put, path = "",
tag = "timetable,paced_train",
request_body = PacedTrainForm,
params(PacedTrainIdParam),
responses(
(status = 200, description = "Paced train have been updated", body = PacedTrainResult)
)
)]
async fn update_paced_train(
State(_db_pool): State<DbConnectionPoolV2>,
Extension(_auth): AuthenticationExt,
Path(PacedTrainIdParam {
id: _paced_train_id,
}): Path<PacedTrainIdParam>,
Json(_paced_train_form): Json<PacedTrainForm>,
) -> Result<Json<PacedTrainResult>> {
todo!();
}

#[derive(Debug, Clone, Deserialize, ToSchema)]
struct SimulationBatchForm {
infra_id: i64,
Expand Down Expand Up @@ -316,6 +334,7 @@ async fn project_path(
#[cfg(test)]
mod tests {
use axum::http::StatusCode;
use chrono::Duration;
use pretty_assertions::assert_eq;
use rstest::rstest;
use serde_json::json;
Expand Down Expand Up @@ -346,6 +365,32 @@ mod tests {
assert_eq!(response.len(), 1);
}

#[rstest]
async fn update_paced_train() {
let app = TestAppBuilder::default_app();
let pool = app.db_pool();

let timetable = create_timetable(&mut pool.get_ok()).await;
let paced_train = create_simple_paced_train(&mut pool.get_ok(), timetable.id).await;

let mut paced_train_base = simple_paced_train_base();
paced_train_base.paced.duration = Duration::minutes(90).try_into().unwrap();
paced_train_base.paced.step = Duration::minutes(15).try_into().unwrap();

let request = app
.put(format!("/paced_train/{}", paced_train.id).as_str())
.json(&json!(&paced_train_base));

let response: PacedTrainResult =
app.fetch(request).assert_status(StatusCode::OK).json_into();

assert_eq!(
response.paced_train.paced.duration,
paced_train_base.paced.duration
);
assert_eq!(response.paced_train.paced.step, paced_train_base.paced.step);
}

#[rstest]
async fn paced_train_delete() {
let app = TestAppBuilder::default_app();
Expand Down
15 changes: 9 additions & 6 deletions front/src/common/api/generatedEditoastApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -512,7 +512,7 @@ const injectedRtkApi = api
query: (queryArg) => ({
url: `/paced_train/${queryArg.id}`,
method: 'PUT',
body: queryArg.pacedTrainForm,
body: queryArg.body,
}),
invalidatesTags: ['timetable', 'paced_train'],
}),
Expand Down Expand Up @@ -1604,7 +1604,14 @@ export type PutPacedTrainByIdApiResponse =
/** status 200 Paced train have been updated */ PacedTrainResult;
export type PutPacedTrainByIdApiArg = {
id: number;
pacedTrainForm: PacedTrainForm;
body: TrainScheduleBase & {
paced: {
/** Duration of the paced train, an ISO 8601 format is expected */
duration: string;
/** Time between two occurrences, an ISO 8601 format is expected */
step: string;
};
};
};
export type GetPacedTrainByIdPathApiResponse = /** status 200 The path */ PathfindingResult;
export type GetPacedTrainByIdPathApiArg = {
Expand Down Expand Up @@ -3249,10 +3256,6 @@ export type PacedTrainResult = PacedTrainBase & {
id: number;
timetable_id: number;
};
export type PacedTrainForm = PacedTrainBase & {
/** Timetable attached to the train schedule */
timetable_id?: number | null;
};
export type ReportTrain = {
/** Total energy consumption */
energy_consumption: number;
Expand Down

0 comments on commit 84f55a8

Please sign in to comment.