瀏覽代碼

Webhook partially complete

Lee Morgan 1 月之前
父節點
當前提交
6c576664df
共有 3 個文件被更改,包括 30 次插入9 次删除
  1. 6 2
      src/controllers/webhook/stripe.rs
  2. 8 5
      src/models/purchase.rs
  3. 16 2
      src/models/user.rs

+ 6 - 2
src/controllers/webhook/stripe.rs

@@ -3,7 +3,10 @@ use stripe::{Event, EventType, EventObject, Webhook};
 use sqlx::PgPool;
 use crate::{
     http_error::HttpError,
-    models::purchase::{Purchase, Status},
+    models::{
+        purchase::{Purchase, Status},
+        user::User
+    },
     STRIPE_WEBHOOK_SECRET
 };
 
@@ -44,7 +47,8 @@ async fn handle_success(event: Event, db: &PgPool) -> Result<(), HttpError> {
         _ => {return Err(HttpError::InvalidInput("No payment intent ID".into()))}
     };
 
-    Purchase::update_status(db, id, Status::Succeeded).await?;
+    let purchase = Purchase::update_status(db, id, Status::Succeeded).await?;
+
     Ok(())
 }
 

+ 8 - 5
src/models/purchase.rs

@@ -99,16 +99,19 @@ impl Purchase {
     }
 
     pub async fn update_status(db: &PgPool, stripe_id: String, status: Status) -> Result<(), HttpError> {
-        sqlx::query(
+        let purchase = sqlx::query_as::<_, Purchase>(
             "UPDATE purchases
-            SET status = $2
-            WHERE stripe_id = $1"
+            SET status = $1
+            WHERE stripe_id = $2"
         )
             .bind(stripe_id)
             .bind(status.to_string())
-            .execute(db)
+            .fetch_optional(db)
             .await?;
 
-        Ok(())
+        match purchase {
+            Some(p) => Ok(p),
+            None => Err(HttpError::InternalError("Failed to update Purchase status".into()))
+        }
     }
 }

+ 16 - 2
src/models/user.rs

@@ -1,6 +1,6 @@
 use uuid::Uuid;
 use chrono::{DateTime, Utc};
-use sqlx::{PgPool, FromRow};
+use sqlx::{PgPool, FromRow, QueryBuilder};
 use serde::Serialize;
 use crate::http_error::HttpError;
 
@@ -78,7 +78,7 @@ impl User {
 
         match user {
             Some(u) => Ok(u),
-            _ => Err(HttpError::Auth)
+            None => Err(HttpError::Auth)
         }
     }
 
@@ -100,6 +100,20 @@ impl User {
         }
     }
 
+    pub async fn add_tokens(db: &PgPool, user: Uuid, new_tokens: i32) -> Result<(), HttpError> {
+        sqlx::query(
+            "UPDATE users
+            SET tokens = tokens + $1
+            WHERE id = $2"
+        )
+            .bind(new_tokens)
+            .bind(user)
+            .execute(db)
+            .await?;
+
+        Ok(())
+    }
+
     pub fn response(self) -> ResponseUser {
         ResponseUser {
             id: self.id.to_string(),