From fbf3591839f72561d46cfee6148388f9f64ead2d Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Sun, 24 Apr 2022 11:08:04 +0200 Subject: [PATCH] grouping mail archive by year-month --- pom.xml | 2 +- .../de/srsoftware/widerhall/Constants.java | 1 + .../srsoftware/widerhall/data/Database.java | 5 +++- .../de/srsoftware/widerhall/data/Post.java | 24 +++++++++++---- .../de/srsoftware/widerhall/web/Rest.java | 12 +++++--- .../java/de/srsoftware/widerhall/web/Web.java | 7 ++++- static/templates/archive.st | 18 ++++++++++-- static/templates/js.st | 29 +++++++++++++++---- 8 files changed, 77 insertions(+), 21 deletions(-) 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 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)» @@ -18,9 +19,20 @@
DateSubject
+ +«else» + + + + + +
MonthNumber of messages
+ +«endif» «footer()» - \ No newline at end of file diff --git a/static/templates/js.st b/static/templates/js.st index 35a1f62..4189875 100644 --- a/static/templates/js.st +++ b/static/templates/js.st @@ -40,8 +40,12 @@ function hideList(listEmail){ $.post('/api/list/hide',{list:listEmail},showListResult,'json'); } -function loadArchive(listEmail){ - $.get('/api/list/archive?list='+listEmail,showListArchive,'json'); +function loadArchive(listEmail,month){ + $.get('/api/list/archive?month='+month+'&list='+listEmail,showListArchive,'json'); +} + +function loadArchiveSummary(listEmail){ + $.get('/api/list/archive?list='+listEmail,showListArchiveSummary,'json'); } function loadListDetail(listEmail){ @@ -73,15 +77,28 @@ function showList(listEmail){ } function showListArchive(data){ - for (let time in data.archive){ - let post = data.archive[time]; + console.log(data); + let posts = data.archive.posts; + for (let time in posts){ + let post = posts[time]; let row = $(''); var url = 'post?id='+post.id; - $('').html(''+new Date(post.date)+'').appendTo(row); + $('').html(''+post.date+'').appendTo(row); $('').html(''+post.from_name+'').appendTo(row); $('').html(''+post.subject+'').appendTo(row); row.appendTo($('#archive')); - console.log(post); + } +} + +function showListArchiveSummary(data){ + console.log(data); + let summary = data.archive.summary; + for (let month in summary){ + let url = 'archive?month='+month+'&list='+data.archive.list; + let row = $(''); + $('').html(''+month+'').appendTo(row); + $('').html(''+summary[month]+'').appendTo(row); + row.appendTo($('#archive')); } }