package ru.semiot.platform.apigateway.config;
import ru.semiot.platform.apigateway.utils.Credentials;
import ru.semiot.platform.apigateway.utils.DataBase;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author Daniil Garayzuev <garayzuev@gmail.com>
*/
@WebServlet("/config/AdminPanel")
public class AdminPanelHandler extends HttpServlet {
@Inject
DataBase db;
volatile List<Credentials> credentials;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String s = req.getQueryString();
if (s != null && s.contains("logout")) {
resp.setHeader("Cache-Control", "no-cache, no-store");
resp.setHeader("Pragma", "no-cache");
resp.setHeader("Expires", new java.util.Date().toString());
if (req.getSession(false) != null) {
req.getSession(false).invalidate();// remove session.
}
req.logout();
resp.sendRedirect("/");
}
synchronized (this) {
credentials = db.getAllUsers();
}
;
req.setAttribute("credentials", credentials);
req.getRequestDispatcher("/configuration/AdminPanel").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
if (req.getParameter("save") != null) {
Map m = req.getParameterMap();
String[] ids = (String[]) m.get("id");
String[] logins = (String[]) m.get("login");
String[] passwords = (String[]) m.get("password");
String[] roles = (String[]) m.get("role");
List<Credentials> newList = new ArrayList<>();
Credentials c;
for (int i = 0; i < ids.length; i++) {
c = new Credentials(Integer.parseInt(ids[i]), logins[i], passwords[i],
(i == 0) ? "admin" : roles[i]);
if (c.getLogin().isEmpty() || c.getLogin().contains(" ")
|| !db.isUniqueLogin(c.getLogin(), c.getId())) {
if (credentials.contains(c)) {
newList.add(credentials.get(credentials.indexOf(c)));
}
continue;
}
newList.add(c);
if (credentials.contains(c)) {
if (c.needUpdate(credentials.get(credentials.indexOf(c)))) {
if (!db.updateUser(c)) {
newList.remove(c);
}
}
} else if (db.addUser(c) == null) {
newList.remove(c);
}
}
for (Credentials q : credentials) {
if (!newList.contains(q)) {
db.removeUser(q.getId());
}
}
resp.sendRedirect("/config/AdminPanel");
}
}
}