1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
// rocie - An enterprise grocery management system
//
// Copyright (C) 2026 Benedikt Peetz <benedikt.peetz@b-peetz.de>
// SPDX-License-Identifier: GPL-3.0-or-later
//
// This file is part of Rocie.
//
// You should have received a copy of the License along with this program.
// If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
use actix_identity::Identity;
use actix_web::{HttpResponse, Responder, Result, post, web};
use log::debug;
use crate::{
app::App,
storage::sql::{
barcode::{Barcode, BarcodeId, BarcodeIdStub},
insert::Operations,
unit::UnitAmount,
},
};
/// Buy an barcode
#[utoipa::path(
responses(
(
status = OK,
description = "Barcode successfully bought",
),
(
status = NOT_FOUND,
description = "Barcode id was not found",
),
(
status = UNAUTHORIZED,
description = "You did not login before calling this endpoint",
),
(
status = INTERNAL_SERVER_ERROR,
description = "Server encountered error",
body = String,
)
),
params(
(
"barcode_id" = BarcodeId,
description = "The numeric value of the barcode"
),
(
"times" = u16,
description = "How often to buy the barcode"
),
)
)]
#[post("/barcode/{barcode_id}/buy/{times}")]
pub(crate) async fn buy_barcode(
app: web::Data<App>,
path: web::Path<(BarcodeIdStub, u16)>,
_user: Identity,
) -> Result<impl Responder> {
let (barcode_id, times) = path.into_inner();
let mut ops = Operations::new("buy barcode unit");
let barcode = Barcode::from_id(&app, barcode_id.into()).await?;
match barcode {
Some(barcode) => {
for _ in 0..times {
barcode.buy(&mut ops);
}
ops.apply(&app).await?;
Ok(HttpResponse::Ok().finish())
}
None => Ok(HttpResponse::NotFound().finish()),
}
}
/// Consume an barcode
#[utoipa::path(
responses(
(
status = OK,
description = "Barcode successfully consumed",
),
(
status = NOT_FOUND,
description = "Barcode id was not found",
),
(
status = UNAUTHORIZED,
description = "You did not login before calling this endpoint",
),
(
status = INTERNAL_SERVER_ERROR,
description = "Server encountered error",
body = String,
)
),
params(
(
"id" = BarcodeId,
description = "The numeric value of the barcode"
),
),
request_body = UnitAmount,
)]
#[post("/barcode/{id}/consume")]
pub(crate) async fn consume_barcode(
app: web::Data<App>,
barcode_id: web::Path<BarcodeIdStub>,
unit_amount: web::Json<UnitAmount>,
_user: Identity,
) -> Result<impl Responder> {
let mut ops = Operations::new("consume barcode unit");
let barcode = Barcode::from_id(&app, barcode_id.into_inner().into()).await?;
debug!("Starting consume for barcode: {barcode:?}");
match barcode {
Some(barcode) => {
barcode
.consume(&app, unit_amount.into_inner(), &mut ops)
.await?;
ops.apply(&app).await?;
Ok(HttpResponse::Ok().finish())
}
None => Ok(HttpResponse::NotFound().finish()),
}
}
|