Skip to content
This repository was archived by the owner on Oct 10, 2025. It is now read-only.

Commit 35e7862

Browse files
committed
Add event url QRC
1 parent 80a5bd8 commit 35e7862

3 files changed

Lines changed: 44 additions & 24 deletions

File tree

src/event.rs

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
use std::fs::OpenOptions;
22
use rocket::serde::json::Json;
3-
use std::io::{Cursor, Read};
3+
use std::io::{Read};
44
use anyhow::anyhow;
5-
use image::ImageFormat;
65
use rocket::form::{Contextual, Form};
76
use rocket::http::{Status};
87
use rocket::response::{Redirect};
@@ -13,15 +12,14 @@ use sqlx::{query, query_as, FromRow, SqlitePool};
1312
use crate::db::{get_event_db, DbPool};
1413
use crate::{files, MaybeSessionId, QxApiToken, QxSessionId, SharedQxState};
1514
use crate::auth::{generate_random_string, UserInfo};
16-
use base64::Engine;
1715
use chrono::{DateTime, FixedOffset};
1816
use rocket::serde::{Deserialize, Serialize};
1917
use crate::changes::{ChangesRecord, PENDING, RUN_UPDATE_REQUEST};
2018
use crate::files::{load_file_from_db, save_file_to_db};
2119
use crate::iofxml3::parser::parse_startlist_xml_data;
2220
use crate::qxdatetime::QxDateTime;
2321
use crate::runs::{ClassesRecord, RunsRecord};
24-
use crate::util::{anyhow_to_custom_error, sqlx_to_anyhow, sqlx_to_custom_error, string_to_custom_error};
22+
use crate::util::{anyhow_to_custom_error, create_qrc, sqlx_to_anyhow, sqlx_to_custom_error, string_to_custom_error};
2523

2624
pub const START_LIST_IOFXML3_FILE: &str = "startlist-iof3.xml";
2725
pub const RUNS_CSV_FILE: &str = "runs.csv";
@@ -206,16 +204,7 @@ async fn event_edit_insert(event_id: Option<EventId>, session_id: &QxSessionId,
206204
} else {
207205
EventRecord::new(&user.email)
208206
};
209-
let api_token_qrc_img_data = {
210-
let code = qrcode::QrCode::new(event.api_token.0.as_bytes()).unwrap();
211-
// Render the bits into an image.
212-
let image = code.render::<::image::LumaA<u8>>().build();
213-
let mut buffer: Vec<u8> = Vec::new();
214-
let mut cursor = Cursor::new(&mut buffer);
215-
image.write_to(&mut cursor, ImageFormat::Png).unwrap();
216-
// Encode the image buffer to base64
217-
base64::engine::general_purpose::STANDARD.encode(&buffer)
218-
};
207+
let api_token_qrc_img_data = create_qrc(event.api_token.0.as_bytes()).map_err(anyhow_to_custom_error)?;
219208
Ok(Template::render("event-edit", context! {
220209
event_id,
221210
user,
@@ -257,7 +246,16 @@ async fn get_event(event_id: EventId, session_id: MaybeSessionId, state: &State<
257246
let user = user_info_opt(session_id.0.as_ref(), state).await.map_err(anyhow_to_custom_error)?;
258247
let is_event_owner = is_event_owner(&event, user.as_ref());
259248
let files = files::list_files(event_id, state).await?;
249+
let is_local_server = state.read().await.app_config.is_local_server();
250+
let event_url = if is_local_server {
251+
format!("http://localhost:8000/event/{event_id}")
252+
} else {
253+
format!("https://qxqx.org/event/{event_id}")
254+
};
255+
let event_qrc_img_data = create_qrc(event_url.as_bytes()).map_err(anyhow_to_custom_error)?;
260256
Ok(Template::render("event", context! {
257+
event_url,
258+
event_qrc_img_data,
261259
user,
262260
is_event_owner,
263261
event,

src/util.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use std::backtrace::Backtrace;
2-
use std::io::Read;
2+
use std::io::{Cursor, Read};
33
use anyhow::anyhow;
4+
use base64::Engine;
5+
use image::ImageFormat;
46
use rocket::http::Status;
57
use rocket::response::status::Custom;
68

@@ -73,3 +75,14 @@ where
7375
Some(value)
7476
}
7577
}
78+
79+
pub(crate) fn create_qrc(data: &[u8]) -> anyhow::Result<String> {
80+
let code = qrcode::QrCode::new(data)?;
81+
// Render the bits into an image.
82+
let image = code.render::<::image::LumaA<u8>>().build();
83+
let mut buffer: Vec<u8> = Vec::new();
84+
let mut cursor = Cursor::new(&mut buffer);
85+
image.write_to(&mut cursor, ImageFormat::Png)?;
86+
// Encode the image buffer to base64
87+
Ok(base64::engine::general_purpose::STANDARD.encode(&buffer))
88+
}

templates/event.html.hbs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,24 @@
88
{{/if}}
99
<a href="/event/{{event.id}}/export/runs" class="w3-button w3-theme w3-round-large">Export runs</a>
1010
</div>
11-
<ul>
12-
<li><a class="w3-button" href="/event/{{ event.id }}/startlist">Start list</a></li>
13-
<li><a class="w3-button" href="/event/{{ event.id }}/results">Results</a></li>
14-
{{#if user}}
15-
<li><a class="w3-button" href="/event/{{ event.id }}/my-changes">My changes</a></li>
16-
{{/if}}
17-
<li><a class="w3-button" href="/event/{{ event.id }}/changes">Changes</a></li>
18-
</ul>
19-
11+
<div class="w3-row-padding">
12+
<div class="w3-half">
13+
<ul>
14+
<li><a class="w3-button" href="/event/{{ event.id }}/startlist">Start list</a></li>
15+
<li><a class="w3-button" href="/event/{{ event.id }}/results">Results</a></li>
16+
{{#if user}}
17+
<li><a class="w3-button" href="/event/{{ event.id }}/my-changes">My changes</a></li>
18+
{{/if}}
19+
<li><a class="w3-button" href="/event/{{ event.id }}/changes">Changes</a></li>
20+
</ul>
21+
</div>
22+
<div class="w3-half">
23+
<div style="display:flex; justify-content:center">
24+
<img src="data:image/png;base64,{{event_qrc_img_data}}" alt="API token QRC" />
25+
</div>
26+
<p style="display:flex; justify-content:center">{{ event_url }}</p>
27+
</div>
28+
</div>
2029
<h3>Files</h3>
2130
<ul>
2231
{{#each files}}

0 commit comments

Comments
 (0)