Mercurial > lbo > hg > analyrics
changeset 16:be0b8268c936
Add domain column to sessions and integrate
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Mon, 11 Jul 2022 19:32:29 -0700 |
parents | d5724ebeefd3 |
children | acf064f0e934 |
files | TODO assets/index.html.hbs log_sqlite.sql src/main.rs |
diffstat | 4 files changed, 29 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/TODO Mon Jul 11 18:22:59 2022 -0700 +++ b/TODO Mon Jul 11 19:32:29 2022 -0700 @@ -1,5 +1,3 @@ -* Set up logging -* Start database layer -* Enable checked user login -* Start templates -* Figure out counting pixel +* Count by domain/host +* Enable page parameterization +* Assign sessions to domains (initial domain)
--- a/assets/index.html.hbs Mon Jul 11 18:22:59 2022 -0700 +++ b/assets/index.html.hbs Mon Jul 11 19:32:29 2022 -0700 @@ -8,6 +8,7 @@ #logo { color: #22bb22; font-size: 20pt; font-style: bold; } #header { color: #bb2222; } .useraction { float: right; padding: 3pt; } + .userdomain { float: right; padding: 3pt; } #logout { float: right; padding: 3pt; } #flashtext { } #flash { text-align: center; border-style: solid; border-color: #22aa22; margin-left: 30%; margin-right: 30%; } @@ -30,6 +31,7 @@ <input type="submit" value="Log out" /> </form> <div class="useraction">Logged in as <b>{{username}}</b>.</div> + <div class="userdomain">{{#if domain}}Domain: <b>{{domain}}</b>{{else}}<i>(all domains)</i>{{/if}}</div> {{else}} <a class="useraction" href="/login">Log in</a> {{/if}} @@ -38,6 +40,7 @@ {{#if error}}<div id="error"><span id="errortext">{{error}}</span></div>{{/if}} <!-- Plots --> + {{#if loggedin}} <div class="plotrow row1"> <div class="plotframe fullwidth"> <canvas id="visitsAndSessions" height="100"></canvas> @@ -56,6 +59,7 @@ const myChart = new Chart(ctx, plots[cv]); }); </script> + {{/if}} </body> </html>
--- a/log_sqlite.sql Mon Jul 11 18:22:59 2022 -0700 +++ b/log_sqlite.sql Mon Jul 11 19:32:29 2022 -0700 @@ -4,6 +4,7 @@ id INTEGER PRIMARY KEY, start INTEGER NOT NULL, last INTEGER NOT NULL + domain TEXT, ); DROP TABLE IF EXISTS RequestLog;
--- a/src/main.rs Mon Jul 11 18:22:59 2022 -0700 +++ b/src/main.rs Mon Jul 11 19:32:29 2022 -0700 @@ -121,10 +121,11 @@ Ok(ntags) } - async fn start_session(&mut self) -> Result<u32, Error> { - Ok(sqlx::query("INSERT INTO Sessions (start, last) VALUES (strftime('%s', 'now'), strftime('%s', 'now')) RETURNING id") - .fetch_one(&mut *self.0) - .await?.get(0)) + async fn start_session(&mut self, domain: &str) -> Result<u32, Error> { + Ok(sqlx::query("INSERT INTO Sessions (start, last, domain) VALUES (strftime('%s', 'now'), strftime('%s', 'now'), ?) RETURNING id") + .bind(domain) + .fetch_one(&mut *self.0) + .await?.get(0)) } async fn update_session_time(&mut self, id: u32) -> Result<(), Error> { @@ -135,25 +136,29 @@ Ok(()) } - async fn query_visits_sessions_counts( + async fn query_visits_sessions_counts<S: AsRef<str>>( &mut self, from: OffsetDateTime, to: OffsetDateTime, + domainpattern: Option<S>, ) -> Result<(Vec<String>, Vec<u32>, Vec<u32>), Error> { + let domain = domainpattern.as_ref().map(AsRef::as_ref).unwrap_or("%"); let mut results = sqlx::query( r#" SELECT DATE(atime, 'unixepoch') AS rqdate, COUNT(requestlog.id) AS rqcount, sesscount FROM requestlog JOIN ( SELECT DATE(start, 'unixepoch') AS sessdate, COUNT(*) AS sesscount - FROM sessions GROUP BY sessdate) + FROM sessions WHERE sessions.domain LIKE ? GROUP BY sessdate) AS sc ON (rqdate = sessdate) -WHERE atime > ? AND atime < ? +WHERE atime > ? AND atime < ? AND requestlog.domain LIKE ? GROUP BY rqdate ORDER BY rqdate ASC;"#, ) + .bind(domain) .bind(from.unix_timestamp()) .bind(to.unix_timestamp()) + .bind(domain) .fetch(&mut *self.0); // Result table: date / visit count / session count @@ -320,11 +325,12 @@ inner } -#[rocket::get("/", rank = 1)] +#[rocket::get("/?<domain>", rank = 1)] async fn route_index_loggedin( mut conn: Connection<LogsDB>, lig: LoggedInGuard, flash: Option<FlashMessage<'_>>, + domain: Option<&str>, ) -> Template { let f; if let Some(ref flash) = flash { @@ -339,7 +345,7 @@ let begin = OffsetDateTime::now_utc() - Duration::days(30); let end = OffsetDateTime::now_utc(); match LogsDBSession(&mut conn) - .query_visits_sessions_counts(begin, end) + .query_visits_sessions_counts(begin, end, domain) .await { Ok((dates, visits, sessions)) => { @@ -357,6 +363,7 @@ "index", context![ loggedin: true, + domain: domain, username: lig.0, flash: f, chartconfig: context![ visitsAndSessions: vissess ]], @@ -364,7 +371,7 @@ } Err(e) => Template::render( "index", - context![loggedin: true, username: lig.0, flash: f, chartconfig: context![], error: e.to_string()], + context![loggedin: true, domain: domain, username: lig.0, flash: f, chartconfig: context![], error: format!("{:?}", e)], ), } } @@ -408,7 +415,10 @@ } } if session_id.is_none() { - match conn.start_session().await { + match conn + .start_session(host.as_ref().map(String::as_str).unwrap_or("")) + .await + { Ok(id) => { session_id = Some(id); let c = Cookie::build("analyrics_session", id.to_string())