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,
|
||||
grind_setting: f64,
|
||||
brewer_id: GearId,
|
||||
filter_paper_id: Option<GearId>,
|
||||
water_volume: i32,
|
||||
water_temp: f64,
|
||||
) -> Result<BrewWithDetails> {
|
||||
let url = self.inner.endpoint("api/v1/brews")?;
|
||||
let payload = serde_json::json!({
|
||||
let mut payload = serde_json::json!({
|
||||
"bag_id": bag_id,
|
||||
"coffee_weight": coffee_weight,
|
||||
"grinder_id": grinder_id,
|
||||
|
|
@ -35,6 +36,9 @@ impl<'a> BrewsClient<'a> {
|
|||
"water_volume": water_volume,
|
||||
"water_temp": water_temp,
|
||||
});
|
||||
if let Some(fp_id) = filter_paper_id {
|
||||
payload["filter_paper_id"] = serde_json::json!(fp_id);
|
||||
}
|
||||
|
||||
let response = self
|
||||
.inner
|
||||
|
|
|
|||
|
|
@ -12,17 +12,20 @@ use crate::infrastructure::database::DatabasePool;
|
|||
const BASE_SELECT: &str = r"
|
||||
SELECT
|
||||
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,
|
||||
rr.name as roaster_name, rr.slug as roaster_slug,
|
||||
(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
|
||||
JOIN bags b ON br.bag_id = b.id
|
||||
JOIN roasts r ON b.roast_id = r.id
|
||||
JOIN roasters rr ON r.roaster_id = rr.id
|
||||
JOIN gear g_grinder ON br.grinder_id = g_grinder.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)]
|
||||
|
|
@ -56,6 +59,7 @@ impl SqlBrewRepository {
|
|||
grinder_id: GearId::new(record.grinder_id),
|
||||
grind_setting: record.grind_setting,
|
||||
brewer_id: GearId::new(record.brewer_id),
|
||||
filter_paper_id: record.filter_paper_id.map(GearId::new),
|
||||
water_volume: record.water_volume,
|
||||
water_temp: record.water_temp,
|
||||
created_at: record.created_at,
|
||||
|
|
@ -72,6 +76,7 @@ impl SqlBrewRepository {
|
|||
grinder_id: GearId::new(record.grinder_id),
|
||||
grind_setting: record.grind_setting,
|
||||
brewer_id: GearId::new(record.brewer_id),
|
||||
filter_paper_id: record.filter_paper_id.map(GearId::new),
|
||||
water_volume: record.water_volume,
|
||||
water_temp: record.water_temp,
|
||||
created_at: record.created_at,
|
||||
|
|
@ -83,6 +88,7 @@ impl SqlBrewRepository {
|
|||
roaster_slug: record.roaster_slug,
|
||||
grinder_name: record.grinder_name,
|
||||
brewer_name: record.brewer_name,
|
||||
filter_paper_name: record.filter_paper_name,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -129,9 +135,9 @@ impl BrewRepository for SqlBrewRepository {
|
|||
|
||||
// Insert the brew
|
||||
let insert_query = r"
|
||||
INSERT INTO brews (bag_id, coffee_weight, grinder_id, grind_setting, brewer_id, water_volume, water_temp)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?)
|
||||
RETURNING id, bag_id, coffee_weight, grinder_id, grind_setting, brewer_id, water_volume, water_temp, created_at, updated_at
|
||||
INSERT INTO brews (bag_id, coffee_weight, grinder_id, grind_setting, brewer_id, filter_paper_id, water_volume, water_temp)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
||||
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)
|
||||
|
|
@ -140,6 +146,10 @@ impl BrewRepository for SqlBrewRepository {
|
|||
.bind(brew.grinder_id.into_inner())
|
||||
.bind(brew.grind_setting)
|
||||
.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_temp)
|
||||
.fetch_one(&mut *tx)
|
||||
|
|
@ -155,7 +165,7 @@ impl BrewRepository for SqlBrewRepository {
|
|||
|
||||
async fn get(&self, id: BrewId) -> Result<Brew, RepositoryError> {
|
||||
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
|
||||
WHERE id = ?
|
||||
";
|
||||
|
|
@ -242,6 +252,7 @@ struct BrewRecord {
|
|||
grinder_id: i64,
|
||||
grind_setting: f64,
|
||||
brewer_id: i64,
|
||||
filter_paper_id: Option<i64>,
|
||||
water_volume: i32,
|
||||
water_temp: f64,
|
||||
created_at: DateTime<Utc>,
|
||||
|
|
@ -256,6 +267,7 @@ struct BrewWithDetailsRecord {
|
|||
grinder_id: i64,
|
||||
grind_setting: f64,
|
||||
brewer_id: i64,
|
||||
filter_paper_id: Option<i64>,
|
||||
water_volume: i32,
|
||||
water_temp: f64,
|
||||
created_at: DateTime<Utc>,
|
||||
|
|
@ -266,4 +278,5 @@ struct BrewWithDetailsRecord {
|
|||
roaster_slug: String,
|
||||
grinder_name: String,
|
||||
brewer_name: String,
|
||||
filter_paper_name: Option<String>,
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue