commit c08f0874bd4f1cb8f73642b400a798b38cd74014 Author: franklinblanco Date: Thu Jun 23 14:45:13 2022 -0400 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3549fae --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +Cargo.lock +.env \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..ef68a8d --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "corpos-backend" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +dotenv = "0.15.0" +serde = { version = "1.0", features = ["derive"] } +tokio = { version = "1", features = ["full"] } +sqlx = { version = "0.5", features = [ "runtime-tokio-rustls", "mysql" ] } +actix-web = "4" +chrono = "0.4" \ No newline at end of file diff --git a/src/dao/main_dao.rs b/src/dao/main_dao.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/dao/mod.rs b/src/dao/mod.rs new file mode 100644 index 0000000..e96fb14 --- /dev/null +++ b/src/dao/mod.rs @@ -0,0 +1,2 @@ +pub mod main_dao; +pub mod user_dao; \ No newline at end of file diff --git a/src/dao/user_dao.rs b/src/dao/user_dao.rs new file mode 100644 index 0000000..7b48289 --- /dev/null +++ b/src/dao/user_dao.rs @@ -0,0 +1,6 @@ +use crate::r#do::user::User; + + +pub async fn insert_user(user: User) -> Result<(), sqlx::Error>{ + Ok(()) +} \ No newline at end of file diff --git a/src/do/mod.rs b/src/do/mod.rs new file mode 100644 index 0000000..018ff2e --- /dev/null +++ b/src/do/mod.rs @@ -0,0 +1 @@ +pub mod user; \ No newline at end of file diff --git a/src/do/user.rs b/src/do/user.rs new file mode 100644 index 0000000..336cc71 --- /dev/null +++ b/src/do/user.rs @@ -0,0 +1,7 @@ +use serde::Serialize; + +#[derive(Serialize)] +pub struct User{ + pub id: u16, + pub name: String +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..c408b59 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,17 @@ +mod r#do; mod dao; +mod routes; mod service; +mod util; +use util::env_util; +use routes::main_router::{start_all_routes, after_startup_fn}; + +#[tokio::main] +async fn main() -> Result<(), std::io::Error> { + // Retrieve env variables and send to services that need them. + let env_vars = env_util::get_dot_env_map(); + + // Start database + + + // Start server + start_all_routes(&after_startup_fn, env_vars).await +} diff --git a/src/routes/main_router.rs b/src/routes/main_router.rs new file mode 100644 index 0000000..f26e66b --- /dev/null +++ b/src/routes/main_router.rs @@ -0,0 +1,41 @@ +use std::collections::HashMap; +use actix_web::{HttpServer, App}; +use super::user_routes; + +// This function is to be used in case code is meant to be run after server startup +pub fn after_startup_fn(){ + println!("{}", "Started server."); +} + +pub async fn start_all_routes(after_startup_fn_call: &dyn Fn(), env_vars: HashMap) + -> Result<(), std::io::Error> +{ + // Get env variables to build server address + let host_addr: &str = match env_vars.get("HOST_ADDRESS") { + Some(str) => {str}, + None => {panic!("HOST_ADDRESS env variable not found.");}, + }; + let host_port: u16 = match env_vars.get("HOST_PORT") { + Some(str) => { + match str.parse::() { + Ok(resolved_port) => {resolved_port}, + Err(e) => {panic!("{:?}", e);} + } + }, + None => {panic!("HOST_PORT env variable not found.");}, + }; + + // Start server + let server_future = HttpServer::new( || { + App::new() + // Define routes + .service(user_routes::get_user_from_db) + }) + .bind((host_addr, host_port))? + .run(); + + let (server_start_result, _after_startup_value) = + tokio::join!(server_future, async {after_startup_fn_call();}); + + return server_start_result; // Return server +} \ No newline at end of file diff --git a/src/routes/mod.rs b/src/routes/mod.rs new file mode 100644 index 0000000..95d7850 --- /dev/null +++ b/src/routes/mod.rs @@ -0,0 +1,3 @@ + +pub mod main_router; +pub mod user_routes; \ No newline at end of file diff --git a/src/routes/user_routes.rs b/src/routes/user_routes.rs new file mode 100644 index 0000000..e3f5664 --- /dev/null +++ b/src/routes/user_routes.rs @@ -0,0 +1,8 @@ +use actix_web::{get, web, Responder, HttpResponse, body::MessageBody}; + +use crate::r#do::user::User; + +#[get("/user/{id}")] +pub async fn get_user_from_db(id: web::Path) -> HttpResponse { + HttpResponse::Ok().json(web::Json(User {id: *id, name: "nigga".to_string()})) +} \ No newline at end of file diff --git a/src/service/mod.rs b/src/service/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/util/env_util.rs b/src/util/env_util.rs new file mode 100644 index 0000000..c3ddbb7 --- /dev/null +++ b/src/util/env_util.rs @@ -0,0 +1,14 @@ +extern crate dotenv; + +use dotenv::dotenv; +use std::{env, collections::HashMap}; + +pub fn get_dot_env_map() -> HashMap{ + dotenv().ok(); + let mut dotenv_vars: HashMap = HashMap::new(); + for (key, val) in env::vars() { + // Use pattern bindings instead of testing .is_some() followed by .unwrap() + dotenv_vars.insert(key, val); + } + dotenv_vars +} \ No newline at end of file diff --git a/src/util/mod.rs b/src/util/mod.rs new file mode 100644 index 0000000..d50ede2 --- /dev/null +++ b/src/util/mod.rs @@ -0,0 +1 @@ +pub mod env_util; \ No newline at end of file