Server API v1 #1

Merged
luke merged 30 commits from development into main 2024-05-04 20:22:45 +00:00
3 changed files with 35 additions and 15 deletions
Showing only changes of commit 9d492f6f91 - Show all commits

View File

@ -1,13 +1,17 @@
// SPDX-License-Identifier: GPL-3.0-Only // SPDX-License-Identifier: GPL-3.0-Only
// Copyright (C) 2024 Luke Harding // Copyright (C) 2024 Luke Harding
use actix_web::{get, HttpResponse, Responder}; use actix_web::{get, HttpResponse, Responder, web};
use crate::db; use crate::db;
pub struct AppState {
pub database_url: String,
}
#[get("/get_tasks")] #[get("/get_tasks")]
pub async fn get_tasks() -> impl Responder { pub async fn get_tasks(data: web::Data<AppState>) -> impl Responder {
let tasks = match db::get_tasks().await { let tasks = match db::get_tasks(data.database_url.clone()).await {
Ok(tasks) => tasks, Ok(tasks) => tasks,
Err(e) => return HttpResponse::InternalServerError().body(e.to_string()), Err(e) => return HttpResponse::InternalServerError().body(e.to_string()),
}; };

View File

@ -1,7 +1,7 @@
// SPDX-License-Identifier: GPL-3.0-Only // SPDX-License-Identifier: GPL-3.0-Only
// Copyright (C) 2024 Luke Harding // Copyright (C) 2024 Luke Harding
use std::{env, error}; use std::error;
use diesel::{Connection, PgConnection, QueryDsl, RunQueryDsl, SelectableHelper}; use diesel::{Connection, PgConnection, QueryDsl, RunQueryDsl, SelectableHelper};
use diesel::pg::Pg; use diesel::pg::Pg;
@ -13,9 +13,7 @@ pub mod models;
pub const MIGRATIONS: EmbeddedMigrations = embed_migrations!("./migrations"); pub const MIGRATIONS: EmbeddedMigrations = embed_migrations!("./migrations");
pub fn establish_connection() -> Result<PgConnection, Box<dyn error::Error>> { pub fn establish_connection(database_url: &String) -> Result<PgConnection, Box<dyn error::Error>> {
let database_url = env::var("DATABASE_URL")?;
Ok(PgConnection::establish(&database_url)?) Ok(PgConnection::establish(&database_url)?)
} }
@ -27,10 +25,10 @@ pub fn run_migrations(
Ok(()) Ok(())
} }
pub async fn get_tasks() -> Result<Vec<Task>, Box<dyn error::Error>> { pub async fn get_tasks(database_url: String) -> Result<Vec<Task>, Box<dyn error::Error>> {
use crate::schema::tasks::dsl::*; use crate::schema::tasks::dsl::*;
let conn = &mut establish_connection()?; let conn = &mut establish_connection(&database_url)?;
Ok(tasks.select(Task::as_select()).load(conn)?) Ok(tasks.select(Task::as_select()).load(conn)?)
} }

View File

@ -3,7 +3,9 @@
use std::{env, io}; use std::{env, io};
use actix_web::{App, HttpServer}; use actix_web::{App, HttpServer, web};
use crate::api::AppState;
mod api; mod api;
pub mod db; pub mod db;
@ -17,6 +19,7 @@ async fn main() -> io::Result<()> {
// Default Server Values // Default Server Values
let mut port = 8000; let mut port = 8000;
let mut bind_addr = String::from("127.0.0.1"); let mut bind_addr = String::from("127.0.0.1");
let mut database_url = String::new();
util::notice_println("Loading Environment Variables"); util::notice_println("Loading Environment Variables");
@ -40,8 +43,17 @@ async fn main() -> io::Result<()> {
} }
} }
if let Ok(env_database) = env::var("DATABASE_URL") {
if !env_database.is_empty() {
database_url = env_database;
} else {
util::err_println("No DATABASE_URL found. Aborting,");
return Ok(());
}
}
util::notice_println("Connecting to DB."); util::notice_println("Connecting to DB.");
let mut conn = match db::establish_connection() { let mut conn = match db::establish_connection(&database_url) {
Ok(conn) => conn, Ok(conn) => conn,
Err(e) => { Err(e) => {
util::err_println("Failed to connect to DB. Aborting."); util::err_println("Failed to connect to DB. Aborting.");
@ -59,8 +71,14 @@ async fn main() -> io::Result<()> {
util::notice_println(format!("Starting server on {}:{}", bind_addr, port)); util::notice_println(format!("Starting server on {}:{}", bind_addr, port));
HttpServer::new(|| App::new().service(api::get_tasks)) HttpServer::new(move || {
.bind((bind_addr, port))? App::new()
.run() .app_data(web::Data::new(AppState {
.await database_url: database_url.clone(),
}))
.service(api::get_tasks)
})
.bind((bind_addr, port))?
.run()
.await
} }