diff --git a/pom.xml b/pom.xml
index 684028d..81bc592 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.example
Widerhall
- 0.2.40
+ 0.2.41
diff --git a/src/main/java/de/srsoftware/widerhall/Constants.java b/src/main/java/de/srsoftware/widerhall/Constants.java
index dae10b7..fb9396b 100644
--- a/src/main/java/de/srsoftware/widerhall/Constants.java
+++ b/src/main/java/de/srsoftware/widerhall/Constants.java
@@ -18,6 +18,7 @@ public class Constants {
public static final String LIST = "list";
public static final String LOCATIONS = "locations";
public static final String NAME = "name";
+ public static final String MONTH = "month";
public static final String NOTES = "notes";
public static final String PASSWORD = "password";
public static final String PERMISSIONS = "permissions";
diff --git a/src/main/java/de/srsoftware/widerhall/data/Database.java b/src/main/java/de/srsoftware/widerhall/data/Database.java
index b6c3691..f2eaffb 100644
--- a/src/main/java/de/srsoftware/widerhall/data/Database.java
+++ b/src/main/java/de/srsoftware/widerhall/data/Database.java
@@ -143,11 +143,14 @@ public class Database {
* finalize sql, save sql and arguments as compiled request
* @return
*/
- public CompiledRequest compile(){
+ public CompiledRequest compile(Object ...additionalArgs){
var args = new ArrayList<>();
applyValues(args);
applyConditions(args);
applySorting();
+ if (additionalArgs != null) {
+ for (Object arg : additionalArgs) args.add(arg);
+ }
return new CompiledRequest(sql.toString(),args);
}
diff --git a/src/main/java/de/srsoftware/widerhall/data/Post.java b/src/main/java/de/srsoftware/widerhall/data/Post.java
index adf8a3e..92b062f 100644
--- a/src/main/java/de/srsoftware/widerhall/data/Post.java
+++ b/src/main/java/de/srsoftware/widerhall/data/Post.java
@@ -12,12 +12,11 @@ import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
-import java.sql.Array;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.Map;
import static de.srsoftware.widerhall.Constants.*;
@@ -98,8 +97,14 @@ public class Post {
return new File(filename);
}
- public static ArrayList find(MailingList list) throws SQLException {
- var rs = Database.open().select(TABLE_NAME).where(LIST,list.email()).sort(DATE).compile().exec();
+ public static ArrayList find(MailingList list, String month) throws SQLException {
+ var rs = Database.open()
+ .select(TABLE_NAME,"*","strftime('%Y-%m',date/1000,'unixepoch') as month")
+ .where(LIST,list.email())
+ .where(MONTH,month)
+ .sort(DATE)
+ .compile()
+ .exec();
try {
var result = new ArrayList();
while (rs.next()) result.add(Post.from(rs));
@@ -160,7 +165,7 @@ public class Post {
LIST,list.name(),
FROM_NAME,fromName,
SUBJECT,Util.dropEmail(subject),
- DATE,timestamp);
+ DATE, new Timestamp(timestamp).toString());
}
private Post save() throws SQLException {
@@ -168,6 +173,15 @@ public class Post {
return this;
}
+ public static HashMap summarize(MailingList list) throws SQLException {
+ var sql = new StringBuilder("SELECT count(*) as count,strftime('%Y-%m',date/1000,'unixepoch') as month FROM Posts WHERE list = ? GROUP BY month ORDER BY month;");
+ var map = new HashMap();
+ var rs = Database.open().query(sql).compile(list.email()).exec();
+ while (rs.next()) map.put(rs.getString("month"),rs.getInt("count"));
+ rs.close();
+ return map;
+ }
+
public long timestamp(){
return timestamp;
}
diff --git a/src/main/java/de/srsoftware/widerhall/web/Rest.java b/src/main/java/de/srsoftware/widerhall/web/Rest.java
index 4c7313e..2b64ca5 100644
--- a/src/main/java/de/srsoftware/widerhall/web/Rest.java
+++ b/src/main/java/de/srsoftware/widerhall/web/Rest.java
@@ -14,7 +14,6 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
-import java.lang.reflect.Member;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
@@ -62,17 +61,22 @@ public class Rest extends HttpServlet {
return Map.of(SUCCESS,"Updated user permissions");
}
- private List extends Object> archive(HttpServletRequest req) {
+ private Map archive(HttpServletRequest req) {
var list = Util.getMailingList(req);
if (list != null){
try {
- return Post.find(list).stream().map(Post::safeMap).toList();
+ var month = req.getParameter(MONTH);
+ if (month == null || month.isBlank()) {
+ return Map.of(LIST,list.email(),"summary",Post.summarize(list));
+ } else {
+ return Map.of(LIST,list.email(),"posts",Post.find(list,month).stream().map(Post::safeMap).toList());
+ }
} catch (SQLException e) {
e.printStackTrace();
}
}
LOG.debug("list: {}",list.email());
- return List.of();
+ return Map.of();
}
@Override
diff --git a/src/main/java/de/srsoftware/widerhall/web/Web.java b/src/main/java/de/srsoftware/widerhall/web/Web.java
index 792547b..bd7d718 100644
--- a/src/main/java/de/srsoftware/widerhall/web/Web.java
+++ b/src/main/java/de/srsoftware/widerhall/web/Web.java
@@ -134,8 +134,13 @@ public class Web extends TemplateServlet {
}
private String archive(HttpServletRequest req, HttpServletResponse resp) {
+ var map = new HashMap();
var list = Util.getMailingList(req);
- return loadTemplate(ARCHIVE,Map.of(LIST,list.email()),resp);
+ map.put(LIST,list.email());
+
+ var month = req.getParameter(MONTH);
+ if (month != null && !month.isBlank())map.put(MONTH,month);
+ return loadTemplate(ARCHIVE,map,resp);
}
private String confirm(HttpServletRequest req, HttpServletResponse resp) {
diff --git a/static/templates/archive.st b/static/templates/archive.st
index f6424f8..1099639 100644
--- a/static/templates/archive.st
+++ b/static/templates/archive.st
@@ -11,6 +11,7 @@
«userinfo()»
«messages()»
Widerhall List Archive
+«if(data.month)»
Date |
@@ -18,9 +19,20 @@
Subject |
+
+«else»
+
+
+ Month |
+ Number of messages |
+
+
+
+«endif»
«footer()»