GdprDataDeleting.java
package sk.iway.iwcm.components.gdpr;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import org.eclipse.persistence.jpa.JpaEntityManager;
import sk.iway.iwcm.Adminlog;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.Identity;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.database.SimpleQuery;
import sk.iway.iwcm.system.jpa.JpaTools;
import sk.iway.iwcm.users.UserDetails;
import sk.iway.iwcm.users.UsersDB;
public class GdprDataDeleting {
private SimpleQuery sq;
private static GdprDataDeleting INSTANCE = null; //NOSONAR
private int userId;
private static String cronSignature = "";
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //NOSONAR
public static void main(String[] args)
{
Logger.debug(GdprDataDeleting.class, "Spúšťam GdprDataDeleting cron pre mazanie starych userov, mailov, objednavok, formularov");
getInstance(-1).deleteSendedEmails();
getInstance(-1).deleteOldFormData();
getInstance(-1).deleteOldBasketOrders();
getInstance(-1).deleteUnusedUsers();
}
public GdprDataDeleting(int userId) {
sq = new SimpleQuery();
}
public static GdprDataDeleting getInstance(HttpServletRequest request)
{
if(request != null)
{
Identity user = UsersDB.getCurrentUser(request);
if(user != null)
getInstance(user.getUserId());
}
return getInstance(-1);
}
public static GdprDataDeleting getInstance(int userId)
{
if(INSTANCE == null)
INSTANCE = new GdprDataDeleting(userId);
INSTANCE.setUserId(userId);
cronSignature = "";
if(userId == -1)
cronSignature = "Cron Job";
return INSTANCE;
}
public static List<UserDetails> getUnusedUsers()
{
List<UserDetails> users = new ArrayList<>();
String date = getFormatedDate(Constants.getInt("gdprDeleteUserAfterDays"));
if(Constants.DB_TYPE == Constants.DB_MSSQL)
{
users.addAll(UsersDB.getUsersByWhereSql(" AND ( (last_logon<convert (datetime,'"+date+"')) OR ( last_logon IS NULL AND reg_date<convert (datetime,'"+date+"') ) ) "));
}
else if(Constants.DB_TYPE == Constants.DB_ORACLE || Constants.DB_TYPE == Constants.DB_PGSQL) {
users.addAll(UsersDB.getUsersByWhereSql(" AND ( (last_logon < to_date('"+date+"','YYYY-MM-DD')) OR ( last_logon IS NULL AND reg_date<to_date('"+date+"','YYYY-MM-DD') ) ) "));
}
else // na MYSQL a ORACLE to zbieha ako tent isty SQl dotaz
{
users.addAll(UsersDB.getUsersByWhereSql(" AND ( (last_logon < date '"+date+"') OR ( last_logon IS NULL AND reg_date<'"+date+"' ) ) "));
}
return users;
}
public void deleteUnusedUsers()
{
Adminlog.add(Adminlog.TYPE_GDPR_USERS_DELETE,getUserId(),"GDPR "+cronSignature+" Hromadne mazem "+getUnusedUsers().size()+" pouzivatelov z databazy, s datumom posledneho prihlasenia starsieho ako "+Constants.getInt("gdprDeleteUserAfterDays")+" dni",-1,-1);
for(UserDetails ud:getUnusedUsers())
{
UsersDB.deleteUser(ud.getUserId(),"GDPR ");
}
}
public void deleteOldFormData()
{
Adminlog.add(Adminlog.TYPE_GDPR_FORMS_DELETE,getUserId(),"GDPR "+cronSignature+" Hromadne mazem "+getOldFormDataCount()+" zaznamov z formularov, starsich ako "+Constants.getInt("gdprDeleteFormDataAfterDays")+" dni",-1,-1);
String date = getFormatedDate(Constants.getInt("gdprDeleteFormDataAfterDays"));
if(Constants.DB_TYPE == Constants.DB_MSSQL)
{
sq.execute("DELETE FROM forms where create_date < convert (datetime,'"+date+"')");
}
else // na MYSQL a ORACLE to zbieha ako tent isty SQl dotaz
{
sq.execute("DELETE FROM forms where create_date < '"+date+"'");
}
}
public int getOldFormDataCount()
{
String date = getFormatedDate(Constants.getInt("gdprDeleteFormDataAfterDays"));
if(Constants.DB_TYPE == Constants.DB_MSSQL)
{
return sq.forInt("SELECT count(*) FROM forms where create_date < convert (datetime,'"+date+"')");
}
else // na MYSQL a ORACLE to zbieha ako tent isty SQl dotaz
{
return sq.forInt("SELECT count(*) FROM forms where create_date < '"+date+"'");
}
//return sq.forInt("SELECT count(*) FROM forms where create_date < ?", getCalendarBeforeDate(Constants.getInt("gdprDeleteFormDataAfterDays")).getTime());
}
public long getOldBasketOrdersCount()
{
long count;
JpaEntityManager em = JpaTools.getEclipseLinkEntityManager();
em.getTransaction().begin();
Query query = em.createQuery("SELECT COUNT(b) FROM BasketInvoiceBean b WHERE b.createDate < :createDate ",Long.class);
query.setParameter("createDate",getCalendarBeforeDate(Constants.getInt("gdprDeleteUserBasketOrdersAfterYears")*365).getTime());
count = (Long)query.getSingleResult();
em.getTransaction().commit();
return count;
}
public void deleteOldBasketOrders()
{
Adminlog.add(Adminlog.TYPE_GDPR_BASKET_INVOICES_DELETE,getUserId(),"GDPR "+cronSignature+" Hromadne mazem "+getOldBasketOrdersCount()+" zaznamov z objednavok / kosiku, starsich ako "+Constants.getInt("gdprDeleteUserBasketOrdersAfterYears")+" rokov",-1,-1);
JpaEntityManager em = JpaTools.getEclipseLinkEntityManager();
em.getTransaction().begin();
Query query = em.createQuery("DELETE FROM BasketInvoiceBean b WHERE b.createDate < :createDate");
query.setParameter("createDate",getCalendarBeforeDate(Constants.getInt("gdprDeleteUserBasketOrdersAfterYears")*365).getTime());
query.executeUpdate();
em.getTransaction().commit();
}
public int getSendedEmailsCount()
{
String date = getFormatedDate(Constants.getInt("gdprDeleteEmailsAfterDays"));
if(Constants.DB_TYPE == Constants.DB_MSSQL)
{
return sq.forInt("SELECT count(*) FROM emails WHERE sent_date < convert (datetime,'"+date+"')");
}
else if(Constants.DB_TYPE == Constants.DB_ORACLE || Constants.DB_TYPE == Constants.DB_PGSQL)
{
return sq.forInt("SELECT count(*) FROM emails WHERE sent_date < to_date('"+date+"','YYYY-MM-DD')");
}
else
{
return sq.forInt("SELECT count(*) FROM emails WHERE sent_date < '"+date+"'");
}
}
public void deleteSendedEmails()
{
Adminlog.add(Adminlog.TYPE_GDPR_EMAILS_DELETE,getUserId(),"GDPR "+cronSignature+" Hromadne mazem "+getSendedEmailsCount()+" zaznamov z tabulky emails, starsich ako 0 dni",-1,-1);
String date = getFormatedDate(Constants.getInt("gdprDeleteEmailsAfterDays"));
if(Constants.DB_TYPE == Constants.DB_MSSQL)
{
sq.execute("DELETE FROM emails WHERE sent_date < convert (datetime,'"+date+"')");
}
else if(Constants.DB_TYPE == Constants.DB_ORACLE || Constants.DB_TYPE == Constants.DB_PGSQL)
{
sq.execute("DELETE FROM emails WHERE sent_date < to_date('"+date+"','YYYY-MM-DD')");
}
else // na MYSQL a ORACLE to zbieha ako tent isty SQl dotaz
{
sq.execute("DELETE FROM emails where sent_date < ?", date);
}
}
private static String getFormatedDate(int daysBefore)
{
Calendar cal = getCalendarBeforeDate(daysBefore);
return sdf.format(cal.getTime());// cal.get(Calendar.YEAR)+"-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.DAY_OF_MONTH);
}
private static Calendar getCalendarBeforeDate(int daysBefore)
{
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, - daysBefore);
return cal;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
}