Skip to content

Commit 3dc9d59

Browse files
committed
feat: load jobs on load from database
1 parent 4c6a948 commit 3dc9d59

9 files changed

Lines changed: 64 additions & 18 deletions

File tree

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ authors = ["rust Basel", "all its members"]
99
axum = { version = "0.8.4", features = ["macros"] }
1010
env_logger = "0.11.8"
1111
log = "0.4.27"
12-
maud = "0.27.0"
12+
maud = { version = "0.27.0", features = ["axum"] }
1313
mime = "0.3.17"
1414
tokio = { version = "1.45.0", features = ["macros", "rt-multi-thread", "signal"] }
1515
serde = { version = "1.0.219", features = ["derive"] }

data/dev.db

0 Bytes
Binary file not shown.

src/assets/htmx.rs

Lines changed: 2 additions & 0 deletions
Large diffs are not rendered by default.

src/assets/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::http_types::{ox_css, ox_js};
44

55
pub mod basel;
66
pub mod daisy;
7+
pub mod htmx;
78
pub mod tailwind;
89
pub mod themes;
910

@@ -22,6 +23,7 @@ async fn assets(Path(file): Path<String>) -> impl IntoResponse {
2223
"daisy.css" => daisy::CSS,
2324
"tw.js" => tailwind::JS,
2425
"themes.css" => basel::CSS,
26+
"htmx.js" => htmx::JS,
2527
_ => "",
2628
};
2729

src/jobs/job_card.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ use axum::{
66
routing::get,
77
};
88
use log::{error, info};
9+
use maud::{Markup, html};
910

1011
use crate::{
11-
model::{JobId, Limit},
12+
jobs::job_card,
13+
model::{Job, JobId, Limit},
1214
repository::JobRepo,
1315
};
1416
pub fn router() -> Router {
@@ -21,10 +23,10 @@ pub fn router() -> Router {
2123
pub async fn get_jobs(repo: Extension<JobRepo>, limit: Query<Limit>) -> impl IntoResponse {
2224
let limit: Limit = *limit;
2325
match repo.get_page(limit).await {
24-
Ok(_jobs) => (
26+
Ok(jobs) => (
2527
StatusCode::OK,
2628
// todo return new view
27-
Ok(""),
29+
Ok(html!((jobs_view(jobs)))),
2830
),
2931
Err(err) => {
3032
error!("Failed to get a page of jobs: {err}\n{:?}", err.source());
@@ -33,6 +35,21 @@ pub async fn get_jobs(repo: Extension<JobRepo>, limit: Query<Limit>) -> impl Int
3335
}
3436
}
3537

38+
pub fn jobs_view(jobs: Vec<Job>) -> Markup {
39+
html! {
40+
@for job in jobs{
41+
(job_card(job.title(), job.preface(), vec![html!{
42+
div class="badge badge-accent" {
43+
"On-site"
44+
}
45+
}], job.description(), html!{
46+
a class="btn btn-secondary btn-sm bg-base" href=(job.uri()) {
47+
"Apply"
48+
}}))
49+
}
50+
}
51+
}
52+
3653
pub async fn get_job(repo: Extension<JobRepo>, job_id: Path<JobId>) -> impl IntoResponse {
3754
info!("Got job {}?", *job_id);
3855
match repo.get_one(*job_id).await {

src/jobs/mod.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub fn ui() -> Markup {
1111
(maud::DOCTYPE)
1212
html data-theme="rust-ember" {
1313
head {
14+
script src="/_assets/htmx.js" {}
1415
script src="/_assets/tw.js" {}
1516
link href="/_assets/daisy.css" rel="stylesheet" type="text/css";
1617
link href="/_assets/themes.css" rel="stylesheet" type="text/css";
@@ -43,17 +44,23 @@ pub fn ui() -> Markup {
4344
))
4445
}
4546

47+
4648
div class="grid gap-6 md:grid-cols-2 lg:grid-cols-3 mx-3" {
4749

48-
(job_card("Krypto Eng.", "Write the new app layers", vec![html!{
49-
div class="badge badge-accent" {
50-
"On-site"
51-
}
52-
}], "This job is great because lorem ipsum", html!{
53-
button class="btn btn-secondary btn-sm bg-base" {
54-
"Apply"
55-
}}))
50+
51+
52+
div hx-get="/jobs" hx-trigger="load" {
53+
54+
}
55+
}
5656
}
57+
58+
// example job
59+
form hx-put="/api/jobs" hx-trigger="load" hx-target="null" {
60+
input type="hidden" id="uri" name="uri" value="https://rust-basel.ch" {}
61+
input type="hidden" id="title" name="title" value="https://rust-basel.ch" {}
62+
input type="hidden" id="preface" name="preface" value="https://rust-basel.ch" {}
63+
input type="hidden" id="description" name="description" value="https://rust-basel.ch" {}
5764
}
5865
}
5966
}

src/model.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,24 @@ pub struct Job {
5757
pub description: Option<String>,
5858
}
5959

60+
impl Job {
61+
pub fn title(&self) -> String {
62+
self.title.clone().unwrap_or(String::new())
63+
}
64+
65+
pub fn preface(&self) -> String {
66+
self.preface.clone().unwrap_or(String::new())
67+
}
68+
69+
pub fn description(&self) -> String {
70+
self.description.clone().unwrap_or(String::new())
71+
}
72+
73+
pub fn uri(&self) -> String {
74+
self.uri.to_string()
75+
}
76+
}
77+
6078
#[derive(Debug, Copy, Clone, Deserialize)]
6179
pub struct Limit {
6280
pub page_size: Option<u8>,

src/ox_env.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,21 +61,19 @@ impl OxApp {
6161
shutdown,
6262
} = self;
6363
let routes = Router::new()
64+
.merge(health::router())
65+
.merge(jobs::router())
66+
.merge(assets::router())
6467
.route("/api/jobs", put(crate::handlers::create_job))
6568
.route("/api/jobs/{job_id}", post(crate::handlers::update_job))
6669
.route("/api/jobs/{job_id}", delete(crate::handlers::delete_job))
6770
.layer(Extension(repo));
6871

69-
let wiht_view = routes
70-
.merge(health::router())
71-
.merge(jobs::router())
72-
.merge(assets::router());
73-
7472
let listener = TcpListener::bind(socket_addr)
7573
.await
7674
.context("failed to bind socket")?;
7775
info!("server bound to {socket_addr}");
78-
let serve = axum::serve(listener, wiht_view);
76+
let serve = axum::serve(listener, routes);
7977
tokio::select!(
8078
serve = serve => match serve {
8179
Ok(()) => {

0 commit comments

Comments
 (0)