feat(brews): support filter paper in repository and HTTP client
- Add filter_paper_id to SQL queries (SELECT, INSERT, LEFT JOIN) - Add filter_paper_name via LEFT JOIN on gear table - Update BrewRecord and BrewWithDetailsRecord structs - Add filter_paper_id parameter to HTTP client create method
This commit is contained in:
parent
0b967cbb14
commit
d636f6c246
2 changed files with 24 additions and 7 deletions
|
|
@ -22,11 +22,12 @@ impl<'a> BrewsClient<'a> {
|
||||||
grinder_id: GearId,
|
grinder_id: GearId,
|
||||||
grind_setting: f64,
|
grind_setting: f64,
|
||||||
brewer_id: GearId,
|
brewer_id: GearId,
|
||||||
|
filter_paper_id: Option<GearId>,
|
||||||
water_volume: i32,
|
water_volume: i32,
|
||||||
water_temp: f64,
|
water_temp: f64,
|
||||||
) -> Result<BrewWithDetails> {
|
) -> Result<BrewWithDetails> {
|
||||||
let url = self.inner.endpoint("api/v1/brews")?;
|
let url = self.inner.endpoint("api/v1/brews")?;
|
||||||
let payload = serde_json::json!({
|
let mut payload = serde_json::json!({
|
||||||
"bag_id": bag_id,
|
"bag_id": bag_id,
|
||||||
"coffee_weight": coffee_weight,
|
"coffee_weight": coffee_weight,
|
||||||
"grinder_id": grinder_id,
|
"grinder_id": grinder_id,
|
||||||
|
|
@ -35,6 +36,9 @@ impl<'a> BrewsClient<'a> {
|
||||||
"water_volume": water_volume,
|
"water_volume": water_volume,
|
||||||
"water_temp": water_temp,
|
"water_temp": water_temp,
|
||||||
});
|
});
|
||||||
|
if let Some(fp_id) = filter_paper_id {
|
||||||
|
payload["filter_paper_id"] = serde_json::json!(fp_id);
|
||||||
|
}
|
||||||
|
|
||||||
let response = self
|
let response = self
|
||||||
.inner
|
.inner
|
||||||
|
|
|
||||||
|
|
@ -12,17 +12,20 @@ use crate::infrastructure::database::DatabasePool;
|
||||||
const BASE_SELECT: &str = r"
|
const BASE_SELECT: &str = r"
|
||||||
SELECT
|
SELECT
|
||||||
br.id, br.bag_id, br.coffee_weight, br.grinder_id, br.grind_setting,
|
br.id, br.bag_id, br.coffee_weight, br.grinder_id, br.grind_setting,
|
||||||
br.brewer_id, br.water_volume, br.water_temp, br.created_at, br.updated_at,
|
br.brewer_id, br.filter_paper_id, br.water_volume, br.water_temp,
|
||||||
|
br.created_at, br.updated_at,
|
||||||
r.name as roast_name, r.slug as roast_slug,
|
r.name as roast_name, r.slug as roast_slug,
|
||||||
rr.name as roaster_name, rr.slug as roaster_slug,
|
rr.name as roaster_name, rr.slug as roaster_slug,
|
||||||
(g_grinder.make || ' ' || g_grinder.model) as grinder_name,
|
(g_grinder.make || ' ' || g_grinder.model) as grinder_name,
|
||||||
(g_brewer.make || ' ' || g_brewer.model) as brewer_name
|
(g_brewer.make || ' ' || g_brewer.model) as brewer_name,
|
||||||
|
(g_fp.make || ' ' || g_fp.model) as filter_paper_name
|
||||||
FROM brews br
|
FROM brews br
|
||||||
JOIN bags b ON br.bag_id = b.id
|
JOIN bags b ON br.bag_id = b.id
|
||||||
JOIN roasts r ON b.roast_id = r.id
|
JOIN roasts r ON b.roast_id = r.id
|
||||||
JOIN roasters rr ON r.roaster_id = rr.id
|
JOIN roasters rr ON r.roaster_id = rr.id
|
||||||
JOIN gear g_grinder ON br.grinder_id = g_grinder.id
|
JOIN gear g_grinder ON br.grinder_id = g_grinder.id
|
||||||
JOIN gear g_brewer ON br.brewer_id = g_brewer.id
|
JOIN gear g_brewer ON br.brewer_id = g_brewer.id
|
||||||
|
LEFT JOIN gear g_fp ON br.filter_paper_id = g_fp.id
|
||||||
";
|
";
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
|
@ -56,6 +59,7 @@ impl SqlBrewRepository {
|
||||||
grinder_id: GearId::new(record.grinder_id),
|
grinder_id: GearId::new(record.grinder_id),
|
||||||
grind_setting: record.grind_setting,
|
grind_setting: record.grind_setting,
|
||||||
brewer_id: GearId::new(record.brewer_id),
|
brewer_id: GearId::new(record.brewer_id),
|
||||||
|
filter_paper_id: record.filter_paper_id.map(GearId::new),
|
||||||
water_volume: record.water_volume,
|
water_volume: record.water_volume,
|
||||||
water_temp: record.water_temp,
|
water_temp: record.water_temp,
|
||||||
created_at: record.created_at,
|
created_at: record.created_at,
|
||||||
|
|
@ -72,6 +76,7 @@ impl SqlBrewRepository {
|
||||||
grinder_id: GearId::new(record.grinder_id),
|
grinder_id: GearId::new(record.grinder_id),
|
||||||
grind_setting: record.grind_setting,
|
grind_setting: record.grind_setting,
|
||||||
brewer_id: GearId::new(record.brewer_id),
|
brewer_id: GearId::new(record.brewer_id),
|
||||||
|
filter_paper_id: record.filter_paper_id.map(GearId::new),
|
||||||
water_volume: record.water_volume,
|
water_volume: record.water_volume,
|
||||||
water_temp: record.water_temp,
|
water_temp: record.water_temp,
|
||||||
created_at: record.created_at,
|
created_at: record.created_at,
|
||||||
|
|
@ -83,6 +88,7 @@ impl SqlBrewRepository {
|
||||||
roaster_slug: record.roaster_slug,
|
roaster_slug: record.roaster_slug,
|
||||||
grinder_name: record.grinder_name,
|
grinder_name: record.grinder_name,
|
||||||
brewer_name: record.brewer_name,
|
brewer_name: record.brewer_name,
|
||||||
|
filter_paper_name: record.filter_paper_name,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -129,9 +135,9 @@ impl BrewRepository for SqlBrewRepository {
|
||||||
|
|
||||||
// Insert the brew
|
// Insert the brew
|
||||||
let insert_query = r"
|
let insert_query = r"
|
||||||
INSERT INTO brews (bag_id, coffee_weight, grinder_id, grind_setting, brewer_id, water_volume, water_temp)
|
INSERT INTO brews (bag_id, coffee_weight, grinder_id, grind_setting, brewer_id, filter_paper_id, water_volume, water_temp)
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?)
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
RETURNING id, bag_id, coffee_weight, grinder_id, grind_setting, brewer_id, water_volume, water_temp, created_at, updated_at
|
RETURNING id, bag_id, coffee_weight, grinder_id, grind_setting, brewer_id, filter_paper_id, water_volume, water_temp, created_at, updated_at
|
||||||
";
|
";
|
||||||
|
|
||||||
let record = query_as::<_, BrewRecord>(insert_query)
|
let record = query_as::<_, BrewRecord>(insert_query)
|
||||||
|
|
@ -140,6 +146,10 @@ impl BrewRepository for SqlBrewRepository {
|
||||||
.bind(brew.grinder_id.into_inner())
|
.bind(brew.grinder_id.into_inner())
|
||||||
.bind(brew.grind_setting)
|
.bind(brew.grind_setting)
|
||||||
.bind(brew.brewer_id.into_inner())
|
.bind(brew.brewer_id.into_inner())
|
||||||
|
.bind(
|
||||||
|
brew.filter_paper_id
|
||||||
|
.map(crate::domain::ids::GearId::into_inner),
|
||||||
|
)
|
||||||
.bind(brew.water_volume)
|
.bind(brew.water_volume)
|
||||||
.bind(brew.water_temp)
|
.bind(brew.water_temp)
|
||||||
.fetch_one(&mut *tx)
|
.fetch_one(&mut *tx)
|
||||||
|
|
@ -155,7 +165,7 @@ impl BrewRepository for SqlBrewRepository {
|
||||||
|
|
||||||
async fn get(&self, id: BrewId) -> Result<Brew, RepositoryError> {
|
async fn get(&self, id: BrewId) -> Result<Brew, RepositoryError> {
|
||||||
let query = r"
|
let query = r"
|
||||||
SELECT id, bag_id, coffee_weight, grinder_id, grind_setting, brewer_id, water_volume, water_temp, created_at, updated_at
|
SELECT id, bag_id, coffee_weight, grinder_id, grind_setting, brewer_id, filter_paper_id, water_volume, water_temp, created_at, updated_at
|
||||||
FROM brews
|
FROM brews
|
||||||
WHERE id = ?
|
WHERE id = ?
|
||||||
";
|
";
|
||||||
|
|
@ -242,6 +252,7 @@ struct BrewRecord {
|
||||||
grinder_id: i64,
|
grinder_id: i64,
|
||||||
grind_setting: f64,
|
grind_setting: f64,
|
||||||
brewer_id: i64,
|
brewer_id: i64,
|
||||||
|
filter_paper_id: Option<i64>,
|
||||||
water_volume: i32,
|
water_volume: i32,
|
||||||
water_temp: f64,
|
water_temp: f64,
|
||||||
created_at: DateTime<Utc>,
|
created_at: DateTime<Utc>,
|
||||||
|
|
@ -256,6 +267,7 @@ struct BrewWithDetailsRecord {
|
||||||
grinder_id: i64,
|
grinder_id: i64,
|
||||||
grind_setting: f64,
|
grind_setting: f64,
|
||||||
brewer_id: i64,
|
brewer_id: i64,
|
||||||
|
filter_paper_id: Option<i64>,
|
||||||
water_volume: i32,
|
water_volume: i32,
|
||||||
water_temp: f64,
|
water_temp: f64,
|
||||||
created_at: DateTime<Utc>,
|
created_at: DateTime<Utc>,
|
||||||
|
|
@ -266,4 +278,5 @@ struct BrewWithDetailsRecord {
|
||||||
roaster_slug: String,
|
roaster_slug: String,
|
||||||
grinder_name: String,
|
grinder_name: String,
|
||||||
brewer_name: String,
|
brewer_name: String,
|
||||||
|
filter_paper_name: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue