diff --git a/.env b/.env new file mode 100644 index 0000000..235d2a8 --- /dev/null +++ b/.env @@ -0,0 +1 @@ +DATABASE_URL=sqlite://db/db.db \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index ee32b2a..e5d9407 100644 --- a/src/main.rs +++ b/src/main.rs @@ -45,22 +45,24 @@ fn error_page(tmpl: web::Data, msg: String) -> Result, query: web::Query>, + db_pool: web::Data>, ) -> Result { // one uuid: 9228c1a4-8956-4f1c-8b5f-53cc575bd78 if let Some(uuid_str) = query.get("uuid") { - // TODO: based on uuid get link from database - let link = "this is the link from the db".to_string(); match Uuid::parse_str(uuid_str) { - Ok(uuid) => { - let mut ctx = tera::Context::new(); - ctx.insert("link", &link); - ctx.insert("uuid", &uuid.to_string()); - let s = tmpl - .render("edit.html", &ctx) - .map_err(|_| error::ErrorInternalServerError("Template error"))?; + Ok(uuid) => match Link::find_by_uuid(uuid.to_string(), db_pool).await { + Ok(link) => { + let mut ctx = tera::Context::new(); + ctx.insert("link", &link.destination); + ctx.insert("uuid", &link.uuid); + let s = tmpl + .render("edit.html", &ctx) + .map_err(|_| error::ErrorInternalServerError("Template error"))?; - Ok(HttpResponse::Ok().content_type("text/html").body(s)) - } + Ok(HttpResponse::Ok().content_type("text/html").body(s)) + } + Err(err) => error_page(tmpl, format!("db error: {}", err.to_string())), + }, Err(err) => error_page(tmpl, format!("uuid parsing error: {}", err.to_string())), } } else { diff --git a/src/model.rs b/src/model.rs index f837dfa..2827146 100644 --- a/src/model.rs +++ b/src/model.rs @@ -11,6 +11,25 @@ pub struct Link { } impl Link { + pub async fn find_by_uuid( + uuid: String, + pool: web::Data>, + ) -> Result { + let mut tx = pool.begin().await?; + let rec = sqlx::query!( + r#" + SELECT * FROM links WHERE uuid = $1 + "#, + uuid + ) + .fetch_one(&mut tx) + .await?; + + Ok(Link { + uuid: rec.UUID, + destination: rec.DESTINATION, + }) + } pub async fn create(link: Link, pool: web::Data>) -> Result { let mut tx = pool.begin().await?; sqlx::query("INSERT INTO links (uuid, destination) VALUES ($1, $2);")