소스 검색

Create incomplete route for creating a new transaction.

Lee Morgan 1 년 전
부모
커밋
296c9f3894
10개의 변경된 파일85개의 추가작업 그리고 0개의 파일을 삭제
  1. 4 0
      src/app_error.rs
  2. 1 0
      src/controllers/mod.rs
  3. 18 0
      src/controllers/transaction.rs
  4. 1 0
      src/dto/mod.rs
  5. 8 0
      src/dto/transaction.rs
  6. 1 0
      src/main.rs
  7. 1 0
      src/models/mod.rs
  8. 41 0
      src/models/transaction.rs
  9. 1 0
      src/routes/mod.rs
  10. 9 0
      src/routes/transaction.rs

+ 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);
+}