ImgScroll/src/main/java/de/gurkengewuerz/ripmewrapper/handler/APIHandler.java

197 lines
7.7 KiB
Java

package de.gurkengewuerz.ripmewrapper.handler;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.json.JSONArray;
import org.json.JSONObject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Created by gurkengewuerz.de on 09.10.2018.
*/
public class APIHandler extends AbstractHandler {
@Override
public void handle(String s, Request request, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
try {
Connection connection = DriverManager.getConnection("jdbc:sqlite:reddit_meta.db");
Statement statement = connection.createStatement();
statement.setQueryTimeout(30); // set timeout to 30 sec.
JSONObject returnObject = null;
JSONArray returnArray = null;
request.setCharacterEncoding("UTF-8");
httpServletResponse.setCharacterEncoding("UTF-8");
if (s.equals("/get")) {
httpServletResponse.setStatus(HttpServletResponse.SC_OK);
returnArray = new JSONArray();
if (request.getParameter("subreddits") != null) {
String[] subreddits = request.getParameter("subreddits").split(",");
int offset = request.getParameter("offset") == null ? -1 : Integer.valueOf(request.getParameter("offset"));
StringBuilder builder = new StringBuilder();
for (int i = 0; i < subreddits.length; i++) {
builder.append("?,");
}
String builderString = builder.deleteCharAt(builder.length() - 1).toString();
int limit = 0;
int index = 1;
if (offset != -1) {
PreparedStatement psPre = connection.prepareStatement(
"SELECT iid FROM filelist LEFT JOIN metalist ON filelist.id = metalist.id WHERE subreddit IN (" + builderString + ") ORDER BY created DESC, iid DESC"
);
for (String o : subreddits) {
psPre.setString(index++, o);
}
ResultSet rsPre = psPre.executeQuery();
while (rsPre.next()) {
limit++;
if (rsPre.getInt("iid") == offset) {
break;
}
}
rsPre.close();
psPre.close();
}
// ----------------
PreparedStatement ps = connection.prepareStatement(
"SELECT iid, metalist.id, subreddit, created, path FROM filelist LEFT JOIN metalist ON filelist.id = metalist.id WHERE subreddit IN (" + builderString + ") ORDER BY created DESC, iid DESC LIMIT 10 OFFSET ?"
);
index = 1;
for (String o : subreddits) {
ps.setString(index++, o);
}
ps.setInt(index, limit);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
JSONObject data = new JSONObject();
data.put("iid", rs.getInt("iid"));
data.put("id", rs.getString("id"));
data.put("subreddit", rs.getString("subreddit"));
data.put("created", rs.getInt("created"));
data.put("webm", rs.getString("path").endsWith(".webm"));
data.put("mp4", rs.getString("path").endsWith(".mp4"));
returnArray.put(data);
}
rs.close();
}
} else if (s.equals("/img")) {
httpServletResponse.setStatus(HttpServletResponse.SC_OK);
PreparedStatement ps = connection.prepareStatement("SELECT path FROM filelist WHERE iid = ? AND id = ?");
ps.setString(1, request.getParameter("iid"));
ps.setString(2, request.getParameter("id"));
ResultSet rs = ps.executeQuery();
if (rs.next()) {
String path = rs.getString("path");
byte[] encoded = Files.readAllBytes(Paths.get(path));
httpServletResponse.setContentType(Files.probeContentType(Paths.get(path)));// or png or gif, etc
httpServletResponse.setContentLength(encoded.length);
httpServletResponse.getOutputStream().write(encoded);
}
request.setHandled(true);
return;
} else if (s.equals("/info")) {
httpServletResponse.setStatus(HttpServletResponse.SC_OK);
returnObject = new JSONObject();
ResultSet rs = statement.executeQuery("SELECT DISTINCT subreddit FROM metalist;");
JSONArray ja = new JSONArray();
while (rs.next()) {
ja.put(rs.getString("subreddit"));
}
returnObject.put("subreddits", ja);
returnObject.put("subreddits_count", ja.length());
rs = statement.executeQuery("SELECT COUNT(*) c_all FROM filelist;");
if (rs.next()) {
returnObject.put("files", rs.getInt("c_all"));
}
if (request.getParameter("subreddits") != null) {
String[] subreddits = request.getParameter("subreddits").split(",");
StringBuilder builder = new StringBuilder();
for (int i = 0; i < subreddits.length; i++) {
builder.append("?,");
}
PreparedStatement ps = connection.prepareStatement(
"SELECT COUNT(*) c FROM filelist LEFT JOIN metalist ON filelist.id = metalist.id WHERE subreddit IN (" + builder.deleteCharAt(builder.length() - 1).toString() + ")"
);
int index = 1;
for (String o : subreddits) {
ps.setString(index++, o);
}
rs = ps.executeQuery();
if (rs.next()) {
returnObject.put("files_subreddits", rs.getInt("c"));
}
}
} else {
httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
}
httpServletResponse.setContentType("application/json; charset=utf-8");
PrintWriter out = httpServletResponse.getWriter();
if (returnObject != null) {
out.write(returnObject.toString());
} else if (returnArray != null) {
out.write(returnArray.toString());
} else {
returnObject = new JSONObject();
returnObject.put("error", "not found");
out.write(returnObject.toString());
}
request.setHandled(true);
connection.close();
} catch (SQLException e) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, e);
}
}
}