|
1 | | -use axum::{ |
2 | | - extract::{Form, State}, |
3 | | - response::{Html, Redirect}, |
4 | | -}; |
5 | | -use diesel::prelude::*; |
| 1 | +use axum::response::Html; |
6 | 2 | use maud::{DOCTYPE, Markup, html}; |
7 | | -use serde::Deserialize; |
8 | | -use tracing::{debug, info, instrument}; |
9 | 3 |
|
10 | | -use crate::db::DbPool; |
11 | | -use crate::models::{Message, NewMessage}; |
12 | | -use crate::schema::messages; |
13 | | - |
14 | | -fn layout(content: Markup) -> Markup { |
| 4 | +pub fn layout(content: Markup) -> Markup { |
15 | 5 | html! { |
16 | 6 | (DOCTYPE) |
17 | 7 | html { |
@@ -83,78 +73,14 @@ fn layout(content: Markup) -> Markup { |
83 | 73 | } |
84 | 74 | } |
85 | 75 |
|
86 | | -#[instrument(skip(pool))] |
87 | | -pub async fn index(State(pool): State<DbPool>) -> Html<String> { |
88 | | - info!("Index route called"); |
89 | | - debug!("Getting database connection from pool"); |
90 | | - let mut conn = pool.get().expect("Failed to get DB connection"); |
91 | | - |
92 | | - debug!("Loading messages from database"); |
93 | | - let messages_list = messages::table |
94 | | - .order(messages::created_at.desc()) |
95 | | - .limit(50) |
96 | | - .load::<Message>(&mut conn) |
97 | | - .expect("Error loading messages"); |
98 | | - |
99 | | - info!( |
100 | | - message_count = messages_list.len(), |
101 | | - "Messages loaded successfully" |
102 | | - ); |
103 | | - |
| 76 | +pub async fn index() -> Html<String> { |
104 | 77 | let content = html! { |
105 | 78 | h1 { "Echo Server" } |
106 | | - |
107 | | - form method="post" action="/echo" { |
108 | | - textarea name="content" rows="5" placeholder="Type your message here..." required {} |
109 | | - br; |
110 | | - button type="submit" { "Send Echo" } |
111 | | - } |
112 | | - |
113 | | - h2 { "Recent Messages" } |
114 | | - |
115 | | - @for message in messages_list { |
116 | | - div.message { |
117 | | - div.message-content { (message.content) } |
118 | | - div.message-time { |
119 | | - "Sent at: " |
120 | | - @let time = message.created_at; |
121 | | - (format!("{:?}", time)) |
122 | | - } |
123 | | - } |
| 79 | + p { |
| 80 | + "Welcome to the Echo Server! " |
| 81 | + a href="/echoes" { "View echoes" } |
124 | 82 | } |
125 | 83 | }; |
126 | 84 |
|
127 | 85 | Html(layout(content).into_string()) |
128 | 86 | } |
129 | | - |
130 | | -#[derive(Deserialize)] |
131 | | -pub struct EchoForm { |
132 | | - content: String, |
133 | | -} |
134 | | - |
135 | | -#[instrument(skip(pool, form), fields(content_length = form.content.len()))] |
136 | | -pub async fn echo(State(pool): State<DbPool>, Form(form): Form<EchoForm>) -> Redirect { |
137 | | - info!("Echo route called"); |
138 | | - debug!("Getting database connection from pool"); |
139 | | - let mut conn = pool.get().expect("Failed to get DB connection"); |
140 | | - |
141 | | - let content_preview = if form.content.len() > 50 { |
142 | | - format!("{}...", &form.content[..50]) |
143 | | - } else { |
144 | | - form.content.clone() |
145 | | - }; |
146 | | - debug!(content_preview = %content_preview, "Preparing to save message"); |
147 | | - |
148 | | - let new_message = NewMessage { |
149 | | - content: form.content, |
150 | | - }; |
151 | | - |
152 | | - debug!("Inserting message into database"); |
153 | | - diesel::insert_into(messages::table) |
154 | | - .values(&new_message) |
155 | | - .execute(&mut conn) |
156 | | - .expect("Error saving message"); |
157 | | - |
158 | | - info!("Message saved successfully, redirecting to index"); |
159 | | - Redirect::to("/") |
160 | | -} |
0 commit comments