Przeglądaj źródła

Create incomplete route for creating a new transaction.

Lee Morgan 1 rok temu
rodzic
commit
296c9f3894

+ 4 - 0
src/app_error.rs

@@ -18,6 +18,9 @@ pub enum AppError {
     #[error("Database error")]
     Database(#[from] mongodb::error::Error),
 
+    #[error("Invalid ID")]
+    InvalidID(#[from] bson::oid::Error),
+
     #[error("{0}")]
     InvalidInput(String),
 
@@ -32,6 +35,7 @@ impl ResponseError for AppError {
     fn status_code(&self) -> StatusCode {
         match self {
             AppError::Database(_) => StatusCode::INTERNAL_SERVER_ERROR,
+            AppError::InvalidID(_) => StatusCode::BAD_REQUEST,
             AppError::InvalidInput(_) => StatusCode::BAD_REQUEST,
             AppError::InternalError(_) => StatusCode::INTERNAL_SERVER_ERROR,
             AppError::Auth => StatusCode::UNAUTHORIZED

+ 1 - 0
src/controllers/mod.rs

@@ -1,2 +1,3 @@
 pub mod user;
 pub mod account;
+pub mod transaction;

+ 18 - 0
src/controllers/transaction.rs

@@ -0,0 +1,18 @@
+use actix_web::{post, web, HttpResponse, HttpRequest};
+use mongodb::{Database, Collection};
+
+use crate::models::transaction::Transaction;
+use crate::app_error::AppError;
+use crate::auth::user_auth;
+use crate::dto::transaction::CreateInput;
+
+#[post("/api/transaction")]
+pub async fn create_route(
+    db: web::Data<Database>,
+    body: web::Json<CreateInput>,
+    request: HttpRequest
+) -> Result<HttpResponse, AppError> {
+    let user = user_auth(&db, &request).await?;
+    let transaction_collection = db.collection::<Transaction>("transactions");
+    Ok(HttpResponse::Ok().json(user.response(None)))
+}

+ 1 - 0
src/dto/mod.rs

@@ -1,2 +1,3 @@
 pub mod user;
 pub mod account;
+pub mod transaction;

+ 8 - 0
src/dto/transaction.rs

@@ -0,0 +1,8 @@
+use serde::Deserialize;
+
+#[derive(Deserialize)]
+pub struct CreateInput {
+    pub account: String,
+    pub date: String,
+    pub data: String
+}

+ 1 - 0
src/main.rs

@@ -25,6 +25,7 @@ async fn main() -> std::io::Result<()> {
             .configure(routes::other::config)
             .configure(routes::user::config)
             .configure(routes::account::config)
+            .configure(routes::transaction::config)
     })
         .bind(("127.0.0.1", 8000))?
         .run()

+ 1 - 0
src/models/mod.rs

@@ -1,2 +1,3 @@
 pub mod user;
 pub mod account;
+pub mod transaction;

+ 41 - 0
src/models/transaction.rs

@@ -0,0 +1,41 @@
+use serde::{Serialize, Deserialize};
+use mongodb::Collection;
+use bson::oid::ObjectId;
+
+use crate::app_error::AppError;
+use crate::dto::transaction::CreateInput;
+
+#[derive(Serialize, Deserialize)]
+pub struct Transaction {
+    #[serde(rename = "_id")]
+    pub id: ObjectId,
+    pub account: ObjectId,
+    pub data: String,
+    pub date: String
+}
+
+#[derive(Serialize, Deserialize)]
+pub struct ResponseTransaction {
+    pub id: String,
+    pub account: String,
+    pub data: String,
+    pub date: String
+}
+
+impl Transaction {
+    pub async fn insert(
+        collection: &Collection<Transaction>,
+        input: CreateInput,
+        account: ObjectId
+    ) -> Result<(), AppError> {
+        let transaction = Transaction {
+            id: ObjectId::new(),
+            account: ObjectId::parse_str(input.account)?,
+            data: input.data,
+            date: input.date
+        };
+
+        collection.insert_one(transaction, None).await?;
+        Ok(())
+    }
+}

+ 1 - 0
src/routes/mod.rs

@@ -1,3 +1,4 @@
 pub mod other;
 pub mod user;
 pub mod account;
+pub mod transaction;

+ 9 - 0
src/routes/transaction.rs

@@ -0,0 +1,9 @@
+use actix_web::web;
+
+use crate::controllers::transaction::{
+    create_route
+};
+
+pub fn config(cfg: &mut web::ServiceConfig) {
+    cfg.service(create_route);
+}