Skip to content

Commit d0a9f6b

Browse files
committed
Add ApprovalStatus::ApprovalPending variant
1 parent 0834d42 commit d0a9f6b

File tree

4 files changed

+44
-17
lines changed

4 files changed

+44
-17
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- Add down migration script here
2+
ALTER TABLE pull_request DROP COLUMN approval_pending;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- Add up migration script here
2+
ALTER TABLE pull_request ADD COLUMN approval_pending BOOLEAN DEFAULT FALSE;

src/database/mod.rs

+32-13
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ pub struct ApprovalInfo {
147147
#[derive(Debug, Clone, PartialEq)]
148148
pub enum ApprovalStatus {
149149
NotApproved,
150+
ApprovalPending(ApprovalInfo),
150151
Approved(ApprovalInfo),
151152
}
152153

@@ -158,23 +159,33 @@ impl sqlx::Type<sqlx::Postgres> for ApprovalStatus {
158159

159160
impl<'r> sqlx::Decode<'r, sqlx::Postgres> for ApprovalStatus {
160161
fn decode(value: sqlx::postgres::PgValueRef<'r>) -> Result<Self, BoxDynError> {
161-
let (approver, sha, approved_at) =
162-
<(Option<String>, Option<String>, Option<DateTime<Utc>>) as sqlx::Decode<
163-
sqlx::Postgres,
164-
>>::decode(value)?;
165-
166-
match (approver, sha, approved_at) {
167-
(Some(approver), Some(sha), Some(approved_at)) => {
162+
let (approver, sha, approved_at, is_pending) =
163+
<(
164+
Option<String>,
165+
Option<String>,
166+
Option<DateTime<Utc>>,
167+
Option<bool>,
168+
) as sqlx::Decode<sqlx::Postgres>>::decode(value)?;
169+
170+
match (approver, sha, approved_at, is_pending) {
171+
(Some(approver), Some(sha), Some(approved_at), Some(true)) => {
172+
Ok(ApprovalStatus::ApprovalPending(ApprovalInfo {
173+
approver,
174+
sha,
175+
approved_at,
176+
}))
177+
}
178+
(Some(approver), Some(sha), Some(approved_at), Some(false) | None) => {
168179
Ok(ApprovalStatus::Approved(ApprovalInfo {
169180
approver,
170181
sha,
171182
approved_at,
172183
}))
173184
}
174-
(None, None, None) => Ok(ApprovalStatus::NotApproved),
175-
(approver, sha, approved_at) => Err(format!(
176-
"Inconsistent approval state: approver={:?}, sha={:?}, approved_at={:?}",
177-
approver, sha, approved_at
185+
(None, None, None, _) => Ok(ApprovalStatus::NotApproved),
186+
(approver, sha, approved_at, is_pending) => Err(format!(
187+
"Inconsistent approval state: approver={:?}, sha={:?}, approved_at={:?}, is_pending={:?}",
188+
approver, sha, approved_at, is_pending
178189
)
179190
.into()),
180191
}
@@ -258,16 +269,24 @@ impl PullRequestModel {
258269
matches!(self.approval_status, ApprovalStatus::Approved(_))
259270
}
260271

272+
pub fn is_pending_approval(&self) -> bool {
273+
matches!(self.approval_status, ApprovalStatus::ApprovalPending(_))
274+
}
275+
261276
pub fn approver(&self) -> Option<&str> {
262277
match &self.approval_status {
263-
ApprovalStatus::Approved(info) => Some(info.approver.as_str()),
278+
ApprovalStatus::Approved(info) | ApprovalStatus::ApprovalPending(info) => {
279+
Some(info.approver.as_str())
280+
}
264281
ApprovalStatus::NotApproved => None,
265282
}
266283
}
267284

268285
pub fn approved_sha(&self) -> Option<&str> {
269286
match &self.approval_status {
270-
ApprovalStatus::Approved(info) => Some(info.sha.as_str()),
287+
ApprovalStatus::Approved(info) | ApprovalStatus::ApprovalPending(info) => {
288+
Some(info.sha.as_str())
289+
}
271290
ApprovalStatus::NotApproved => None,
272291
}
273292
}

src/database/operations.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ pub(crate) async fn get_pull_request(
3838
(
3939
pr.approved_by,
4040
pr.approved_sha,
41-
pr.approved_at
41+
pr.approved_at,
42+
pr.approval_pending
4243
) AS "approval_status!: ApprovalStatus",
4344
pr.status as "pr_status: PullRequestStatus",
4445
pr.priority,
@@ -137,7 +138,8 @@ pub(crate) async fn upsert_pull_request(
137138
(
138139
pr.approved_by,
139140
pr.approved_sha,
140-
pr.approved_at
141+
pr.approved_at,
142+
pr.approval_pending
141143
) AS "approval_status!: ApprovalStatus",
142144
pr.status as "pr_status: PullRequestStatus",
143145
pr.priority,
@@ -207,6 +209,7 @@ UPDATE pull_request
207209
SET approved_by = $1,
208210
approved_sha = $2,
209211
approved_at = NOW(),
212+
approval_pending = false,
210213
priority = COALESCE($3, priority),
211214
rollup = COALESCE($4, rollup)
212215
WHERE id = $5
@@ -230,7 +233,7 @@ pub(crate) async fn unapprove_pull_request(
230233
) -> anyhow::Result<()> {
231234
measure_db_query("unapprove_pull_request", || async {
232235
sqlx::query!(
233-
"UPDATE pull_request SET approved_by = NULL, approved_sha = NULL, approved_at = NULL WHERE id = $1",
236+
"UPDATE pull_request SET approved_by = NULL, approved_sha = NULL, approved_at = NULL, approval_pending = false WHERE id = $1",
234237
pr_id
235238
)
236239
.execute(executor)
@@ -287,7 +290,8 @@ SELECT
287290
(
288291
pr.approved_by,
289292
pr.approved_sha,
290-
pr.approved_at
293+
pr.approved_at,
294+
pr.approval_pending
291295
) AS "approval_status!: ApprovalStatus",
292296
pr.status as "pr_status: PullRequestStatus",
293297
pr.delegated,

0 commit comments

Comments
 (0)