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())