Skip to content

Commit e1602d6

Browse files
authored
Merge pull request #82 from nanotaboada/refactor/service-errors
refactor(services): wrap read/delete errors in PlayerServiceError (#56)
2 parents 83cd8a1 + a4a3d75 commit e1602d6

2 files changed

Lines changed: 20 additions & 9 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1717
### Changed
1818

1919
- Consolidated `commitlint`, `format`, and `lint` CI jobs into a single `lint` job (#42)
20+
- `get_all`, `get_by_id`, `get_by_squad_number`, and `delete` in `player_service` now return `Result<T, PlayerServiceError>` instead of `Result<T, diesel::result::Error>`, aligning with the `CreateError`/`UpdateError` pattern (#56)
2021
- `codecov.yml` `ignore` list extended with `src/**/mod.rs` to exclude module re-exports from coverage reporting (#78)
2122
- `codecov.yml` comment updated to reflect goal of maximum coverage on business logic layers (#78)
2223

src/services/player_service.rs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ use crate::repositories::player_repository;
1010
use diesel::SqliteConnection;
1111
use uuid::Uuid;
1212

13+
/// Error type for player read and delete operations.
14+
#[derive(Debug)]
15+
pub enum PlayerServiceError {
16+
/// An unexpected database error occurred.
17+
Database(#[allow(dead_code)] diesel::result::Error),
18+
}
19+
1320
/// Error types for player creation operations.
1421
#[derive(Debug)]
1522
pub enum CreateError {
@@ -29,26 +36,30 @@ pub enum UpdateError {
2936
}
3037

3138
/// Retrieves all players ordered by squad number.
32-
pub fn get_all(conn: &mut SqliteConnection) -> Result<Vec<PlayerResponse>, diesel::result::Error> {
39+
pub fn get_all(conn: &mut SqliteConnection) -> Result<Vec<PlayerResponse>, PlayerServiceError> {
3340
player_repository::get_all(conn)
3441
.map(|players| players.into_iter().map(PlayerResponse::from).collect())
42+
.map_err(PlayerServiceError::Database)
3543
}
3644

3745
/// Finds a player by UUID (surrogate key, admin route).
3846
pub fn get_by_id(
3947
conn: &mut SqliteConnection,
4048
id: &str,
41-
) -> Result<Option<PlayerResponse>, diesel::result::Error> {
42-
player_repository::get_by_id(conn, id).map(|opt| opt.map(PlayerResponse::from))
49+
) -> Result<Option<PlayerResponse>, PlayerServiceError> {
50+
player_repository::get_by_id(conn, id)
51+
.map(|opt| opt.map(PlayerResponse::from))
52+
.map_err(PlayerServiceError::Database)
4353
}
4454

4555
/// Finds a player by squad number (natural key).
4656
pub fn get_by_squad_number(
4757
conn: &mut SqliteConnection,
4858
squad_number: u32,
49-
) -> Result<Option<PlayerResponse>, diesel::result::Error> {
59+
) -> Result<Option<PlayerResponse>, PlayerServiceError> {
5060
player_repository::get_by_squad_number(conn, squad_number as i32)
5161
.map(|opt| opt.map(PlayerResponse::from))
62+
.map_err(PlayerServiceError::Database)
5263
}
5364

5465
/// Creates a new player with an auto-generated UUID.
@@ -132,9 +143,8 @@ pub fn update(
132143
/// Deletes a player by squad number (natural key).
133144
///
134145
/// Returns `true` if a row was deleted, `false` if no match was found.
135-
pub fn delete(
136-
conn: &mut SqliteConnection,
137-
squad_number: u32,
138-
) -> Result<bool, diesel::result::Error> {
139-
player_repository::delete(conn, squad_number as i32).map(|affected| affected > 0)
146+
pub fn delete(conn: &mut SqliteConnection, squad_number: u32) -> Result<bool, PlayerServiceError> {
147+
player_repository::delete(conn, squad_number as i32)
148+
.map(|affected| affected > 0)
149+
.map_err(PlayerServiceError::Database)
140150
}

0 commit comments

Comments
 (0)