grouping mail archive by year-month
This commit is contained in:
@@ -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";
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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<Post> find(MailingList list) throws SQLException {
|
||||
var rs = Database.open().select(TABLE_NAME).where(LIST,list.email()).sort(DATE).compile().exec();
|
||||
public static ArrayList<Post> 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<Post>();
|
||||
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<String, Object> 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<String,Object>();
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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<String, Object> 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
|
||||
|
||||
@@ -134,8 +134,13 @@ public class Web extends TemplateServlet {
|
||||
}
|
||||
|
||||
private String archive(HttpServletRequest req, HttpServletResponse resp) {
|
||||
var map = new HashMap<String,Object>();
|
||||
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) {
|
||||
|
||||
Reference in New Issue
Block a user