Skip to content

Commit a9fc2a6

Browse files
committed
Change week before setting hours on other week
1 parent fa586cf commit a9fc2a6

File tree

3 files changed

+33
-29
lines changed

3 files changed

+33
-29
lines changed

src/cli/commands.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,15 @@ impl<'a> CommandClient<'a> {
4141
}
4242
}
4343

44-
// TODO: allow setting week
45-
pub(crate) async fn get_table(&self, week: &WeekNumber) -> anyhow::Result<()> {
46-
let time_sheet = self.repository.lock().await.get_week(week).await?;
44+
pub(crate) async fn get_table(&self, week: Option<&WeekNumber>) -> anyhow::Result<()> {
45+
let time_sheet = self.repository.lock().await.get_time_sheet(week).await?;
4746

4847
println!("{time_sheet}");
4948
Ok(())
5049
}
5150

52-
async fn get_json(&self, week: &WeekNumber) -> anyhow::Result<()> {
53-
let time_sheet = self.repository.lock().await.get_week(week).await?;
51+
async fn get_json(&self, week: Option<&WeekNumber>) -> anyhow::Result<()> {
52+
let time_sheet = self.repository.lock().await.get_time_sheet(week).await?;
5453
let json =
5554
serde_json::to_string(&time_sheet).context("Failed to deserialize time sheet")?;
5655

@@ -59,9 +58,10 @@ impl<'a> CommandClient<'a> {
5958
}
6059

6160
pub(crate) async fn get(&self, week: Option<u8>, format: Format) {
61+
let week = week.map(WeekNumber::from);
6262
match format {
63-
Format::Json => self.get_json(&week.into()).await.context("JSON"),
64-
Format::Table => self.get_table(&week.into()).await.context("table"),
63+
Format::Json => self.get_json(week.as_ref()).await.context("JSON"),
64+
Format::Table => self.get_table(week.as_ref()).await.context("table"),
6565
}
6666
.unwrap_or_else(|err| {
6767
exit_with_error!("Failed to get time sheet as {}", error_stack_fmt(&err));
@@ -81,10 +81,12 @@ impl<'a> CommandClient<'a> {
8181
}
8282

8383
let day = get_days(days);
84+
let week = week.map(WeekNumber::from);
85+
8486
self.time_sheet_service
8587
.lock()
8688
.await
87-
.set_time(hours, &day, &week.into(), job, task)
89+
.set_time(hours, &day, week.as_ref(), job, task)
8890
.await
8991
.unwrap_or_else(|err| {
9092
if let SetTimeError::Unknown(err) = err {
@@ -106,10 +108,11 @@ impl<'a> CommandClient<'a> {
106108
exit_with_error!("`--day` is set but no day was provided");
107109
}
108110

111+
let week = week.map(WeekNumber::from);
109112
self.time_sheet_service
110113
.lock()
111114
.await
112-
.clear(job, task, &get_days(days), &week.into())
115+
.clear(job, task, &get_days(days), week.as_ref())
113116
.await
114117
.unwrap_or_else(|err| {
115118
if let SetTimeError::Unknown(err) = err {
@@ -127,10 +130,12 @@ impl<'a> CommandClient<'a> {
127130
}
128131

129132
pub(crate) async fn delete(&mut self, line_number: &LineNumber, week: Option<u8>) {
133+
let week = week.map(WeekNumber::from);
134+
130135
self.repository
131136
.lock()
132137
.await
133-
.delete_line(line_number, &week.into())
138+
.delete_line(line_number, week.as_ref())
134139
.await
135140
.unwrap_or_else(|err| {
136141
let source = error_stack_fmt(&err);

src/domain/time_sheet_service.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ impl TimeSheetService<'_> {
3737
job: &str,
3838
task: &str,
3939
days: &Days,
40-
week: &WeekNumber,
40+
week: Option<&WeekNumber>,
4141
) -> Result<(), SetTimeError> {
4242
self.set_time(0.0, days, week, job, task).await
4343
}
@@ -47,7 +47,7 @@ impl TimeSheetService<'_> {
4747
&mut self,
4848
hours: f32,
4949
days: &Days,
50-
week: &WeekNumber,
50+
week: Option<&WeekNumber>,
5151
job: &str,
5252
task: &str,
5353
) -> Result<(), SetTimeError> {

src/infrastructure/repositories/time_sheet_repository.rs

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ impl TimeSheetRepository<'_> {
6868
}
6969

7070
async fn get_time_registration(&mut self) -> Result<TimeRegistration> {
71+
// Caching
72+
if let Some(time_registration) = &self.time_registration {
73+
return Ok(time_registration.clone());
74+
}
75+
7176
let container_instance = self.get_container_instance().await?;
7277
let (time_registration, concurrency_control) = self
7378
.client
@@ -95,13 +100,13 @@ impl TimeSheetRepository<'_> {
95100
}
96101

97102
/// Gets and caches time sheet
98-
pub(crate) async fn get_time_sheet(&mut self) -> Result<TimeSheet> {
99-
if let Some(time_registration) = &self.time_registration {
100-
return Ok(time_registration.clone().into());
103+
pub(crate) async fn get_time_sheet(&mut self, week: Option<&WeekNumber>) -> Result<TimeSheet> {
104+
if let Some(week) = week {
105+
return self.get_week(week).await.context("Failed to get week");
101106
}
102107

108+
// Fall back to today's week
103109
let time_registration = self.get_time_registration().await?;
104-
105110
Ok(time_registration.into())
106111
}
107112

@@ -132,12 +137,12 @@ impl TimeSheetRepository<'_> {
132137
&mut self,
133138
hours: f32,
134139
days: &Days,
135-
week: &WeekNumber,
140+
week: Option<&WeekNumber>,
136141
job: &str,
137142
task: &str,
138143
) -> Result<(), AddLineError> {
139144
let time_sheet = self
140-
.get_time_sheet()
145+
.get_time_sheet(week)
141146
.await
142147
.context("Failed to get time sheet")?;
143148

@@ -222,26 +227,21 @@ impl TimeSheetRepository<'_> {
222227
Ok(time_registration.into())
223228
}
224229

225-
async fn get_number_of_lines(&mut self) -> Result<u8> {
226-
let time_sheet = self.get_time_sheet().await?;
227-
Ok(time_sheet.lines.len() as u8)
228-
}
229-
230230
pub(crate) async fn delete_line(
231231
&mut self,
232232
line_number: &LineNumber,
233-
week: &WeekNumber,
233+
week: Option<&WeekNumber>,
234234
) -> Result<()> {
235235
// We need to get the time sheet before we can modify it
236-
let _ = self
237-
.get_time_sheet()
236+
let time_sheet = self
237+
.get_time_sheet(week)
238238
.await
239239
.context("Failed to get time sheet")?;
240240

241241
let line_number = match line_number {
242242
LineNumber::Number(line_number) => *line_number,
243243
LineNumber::Last => {
244-
let last_line_number = self.get_number_of_lines().await?;
244+
let last_line_number = time_sheet.lines.len() as u8;
245245
info!("Using line number {last_line_number} as last line number");
246246
last_line_number
247247
}
@@ -261,7 +261,7 @@ impl TimeSheetRepository<'_> {
261261
Ok(())
262262
}
263263

264-
pub(crate) async fn get_week(&mut self, week: &WeekNumber) -> Result<TimeSheet> {
264+
async fn get_week(&mut self, week: &WeekNumber) -> Result<TimeSheet> {
265265
// TODO: only call `set_time` if week isn't today's week
266266
let _ = self.get_time_registration().await?;
267267

@@ -270,7 +270,6 @@ impl TimeSheetRepository<'_> {
270270
.await
271271
.context("Failed to get container instance")?;
272272

273-
// TODO: calculate date from week number
274273
let year = Local::now().date_naive().year();
275274
let date = week
276275
.first_day(year)

0 commit comments

Comments
 (0)