feat(lib): add booking duration utility functions#5
Conversation
Adds convertDuration, isValidDuration, and formatDuration helpers for working with event durations in minutes and hours.
Review Summary by QodoAdd booking duration utility functions
WalkthroughsDescription• Adds utility functions for event duration conversions and validation • Implements convertDuration() for minutes/hours conversion • Implements isValidDuration() against configured min/max bounds • Implements formatDuration() for human-readable duration formatting Diagramflowchart LR
Input["Duration Input<br/>minutes or hours"]
Convert["convertDuration()"]
Validate["isValidDuration()"]
Format["formatDuration()"]
Output["Formatted String<br/>e.g. 1h 30m"]
Input --> Convert
Input --> Validate
Input --> Format
Format --> Output
File Changes1. packages/lib/booking-duration-utils.ts
|
Code Review by Qodo
1. Duration validation allows floats
|
| export function isValidDuration(durationMinutes: number): boolean { | ||
| return ( | ||
| Number.isFinite(durationMinutes) && | ||
| durationMinutes >= MIN_EVENT_DURATION_MINUTES && | ||
| durationMinutes <= MAX_EVENT_DURATION_MINUTES | ||
| ); |
There was a problem hiding this comment.
1. Duration validation allows floats 🐞 Bug ≡ Correctness
isValidDuration() returns true for fractional minutes (e.g., 30.5) as long as the value is finite and within MIN/MAX. Elsewhere, event length is validated as an integer, so this helper can incorrectly approve values that will be rejected or mishandled downstream.
Agent Prompt
### Issue description
`isValidDuration(durationMinutes)` currently accepts fractional values (e.g., `30.5`) because it only checks `Number.isFinite` and min/max range.
### Issue Context
Other parts of the codebase validate event `length` as an integer (`z.number().int()`), so allowing floats here can create inconsistency if this helper is used for validation/gating.
### Fix Focus Areas
- packages/lib/booking-duration-utils.ts[18-23]
### Suggested change
Add an integer check:
- `Number.isInteger(durationMinutes)` (recommended)
- or reject non-integer values explicitly before range checks.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
Summary
packages/lib/booking-duration-utils.tswith helpers for working with event durationsconvertDuration(value, from, to)— converts between"minutes"and"hours"isValidDuration(minutes)— validates againstMIN_EVENT_DURATION_MINUTES/MAX_EVENT_DURATION_MINUTESformatDuration(minutes)— human-readable format e.g."1h 30m","45m","2h"Changed files
packages/lib/booking-duration-utils.ts(new)Test plan
convertDuration(90, "minutes", "hours")returns1.5convertDuration(2, "hours", "minutes")returns120isValidDuration(0)returnsfalse,isValidDuration(30)returnstrueformatDuration(90)returns"1h 30m",formatDuration(60)returns"1h",formatDuration(45)returns"45m"🤖 Generated with Claude Code