diff --git a/src/main/java/fr/lirmm/aren/model/vm/VMNotification.java b/src/main/java/fr/lirmm/aren/model/vm/VMNotification.java new file mode 100644 index 0000000..1c367ed --- /dev/null +++ b/src/main/java/fr/lirmm/aren/model/vm/VMNotification.java @@ -0,0 +1,38 @@ +package fr.lirmm.aren.model.vm; + +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Set; + +/** + * @author ANDRIAMBOLAHARIMIHANTA Havana on 01/08/2021 + * @project aren-1 + */ +public class VMNotification { + private String link ; + private Listemails ; + private String expiracy ; + public String getLink() { + return link; + } + + public void setLink(String link) { + this.link = link; + } + + public List getEmails() { + return emails; + } + + public void setEmails(List emails) { + this.emails = emails; + } + + public String getExpiracy() { + return expiracy; + } + + public void setExpiracy(String expiracy) { + this.expiracy = expiracy; + } +} diff --git a/src/main/java/fr/lirmm/aren/service/vm/VMSendNotificationService.java b/src/main/java/fr/lirmm/aren/service/vm/VMSendNotificationService.java new file mode 100644 index 0000000..9c0cfb0 --- /dev/null +++ b/src/main/java/fr/lirmm/aren/service/vm/VMSendNotificationService.java @@ -0,0 +1,125 @@ +package fr.lirmm.aren.service.vm; + +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.lirmm.aren.model.User; +import fr.lirmm.aren.model.vm.VMNotification; +import fr.lirmm.aren.model.vm.VMTheme; +import fr.lirmm.aren.producer.Configurable; +import fr.lirmm.aren.service.MailingService; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.mail.*; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import java.io.File; +import java.text.MessageFormat; +import java.time.ZonedDateTime; +import java.util.*; + +/** + * @author ANDRIAMBOLAHARIMIHANTA Havana on 18/07/2021 + * @project aren-1 + */ + +@ApplicationScoped +public class VMSendNotificationService extends Thread implements Runnable{ + + @Inject + @Configurable("reverse-proxy") + private String reverseProxy; + + public VMSendNotificationService() { + } + + @Override + public void run(){ + int i=0 ; + try { + VMNotification notification=null ; + while(true){ + File file = new File("/aren/tmp/vote_majoritaire.json"); + if((file.exists() && notification==null) || notification.getEmails().size()==0){ + ObjectMapper mapper = new ObjectMapper(); + Map map = (Map) mapper.readValue(file, Map.class); + notification=new VMNotification() ; + for (Map.Entry entry : map.entrySet()) { + switch(entry.getKey().toString()){ + case "link": + notification.setLink(entry.getValue().toString()); + break; + case "expiracy": + notification.setExpiracy(entry.getValue().toString()); + break; + case "emails": + notification.setEmails((List) entry.getValue()); + break; + } + } + } + if(notification!=null){ + final String link=notification.getLink() ; + ZonedDateTime dateTime=ZonedDateTime.now(); + if(dateTime.getHour()==20 && dateTime.getMinute()==0 && dateTime.getSecond()==0) { + notification.getEmails().forEach(email->{ + try { + sendNotification(link,email,"mail_vm_notification_subject","mail_vm_notification_body"); + } catch (MessagingException e) { + e.printStackTrace(); + } + }) ; + } + } + i++ ; + Thread.sleep(1000); + } + }catch (Exception ex){ + ex.printStackTrace(); + } + } + private void sendNotification(String link, String adress, String subject, String body) throws MessagingException { + Locale currentLocale = Locale.getDefault(); + ResourceBundle messages = ResourceBundle.getBundle("messages", currentLocale); + ResourceBundle application_config = ResourceBundle.getBundle("application", currentLocale); + + String localSubject; + String localBody; + + localSubject = messages.getString(subject); + localBody = MessageFormat.format(messages.getString(body), link, link); + System.out.println(localBody) ; + + Properties properties=System.getProperties() ; + properties.put("mail.smtp.host",application_config.getString("smtp.server")) ; + properties.put("mail.smtp.auth", application_config.getString("smtp.auth")); + properties.put("mail.smtp.starttls.enable", application_config.getString("smtp.tls")); + properties.put("mail.smtp.port", application_config.getString("smtp.port")); + + Authenticator auth = new Authenticator() { + //override the getPasswordAuthentication method + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(application_config.getString("smtp.username"), application_config.getString("smtp.password")); + } + }; + Session session = Session.getInstance(properties,auth) ; + + // Create a default MimeMessage object. + Message message = new MimeMessage(session); + + // Set From: header field of the header. + message.setFrom(new InternetAddress(application_config.getString("smtp.username"))); + + // Set To: header field of the header. + message.setRecipients(Message.RecipientType.TO, + InternetAddress.parse(adress)); + + // Set Subject: header field + message.setSubject(localSubject); + + // Send the actual HTML message, as big as you like + message.setContent(localBody, "text/html"); + + // Send message + Transport.send(message); + } +} diff --git a/src/main/java/fr/lirmm/aren/service/vm/VMThemeService.java b/src/main/java/fr/lirmm/aren/service/vm/VMThemeService.java index c999509..b645034 100644 --- a/src/main/java/fr/lirmm/aren/service/vm/VMThemeService.java +++ b/src/main/java/fr/lirmm/aren/service/vm/VMThemeService.java @@ -7,6 +7,8 @@ import fr.lirmm.aren.service.AbstractService; import javax.enterprise.context.ApplicationScoped; import javax.persistence.TypedQuery; import javax.ws.rs.NotFoundException; +import java.io.File; +import java.io.IOException; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -35,8 +37,10 @@ public class VMThemeService extends AbstractService { } return query ; } + public Set findAll(boolean withChoices, boolean withVotes) { - return new HashSet(generateQuery(null, withChoices,withVotes).getResultList()); + List themes=generateQuery(null, withChoices,withVotes).getResultList() ; + return new HashSet<>(themes); } @Override diff --git a/src/main/java/fr/lirmm/aren/servlet/BackgroundJobManager.java b/src/main/java/fr/lirmm/aren/servlet/BackgroundJobManager.java index ed56f03..142709d 100644 --- a/src/main/java/fr/lirmm/aren/servlet/BackgroundJobManager.java +++ b/src/main/java/fr/lirmm/aren/servlet/BackgroundJobManager.java @@ -6,6 +6,8 @@ package fr.lirmm.aren.servlet; import fr.lirmm.aren.service.CommentService; +import fr.lirmm.aren.service.vm.VMSendNotificationService; + import java.util.Calendar; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -42,6 +44,9 @@ public class BackgroundJobManager implements ServletContextListener { this.scheduler.scheduleAtFixedRate(() -> { this.commentService.updateAllTags(); }, untilMidnight, millisInDay, TimeUnit.MILLISECONDS); + + VMSendNotificationService sendNotificationService=new VMSendNotificationService() ; + sendNotificationService.start(); } @Override diff --git a/src/main/java/fr/lirmm/aren/servlet/Root.java b/src/main/java/fr/lirmm/aren/servlet/Root.java index 99ecfd8..bca1f3a 100644 --- a/src/main/java/fr/lirmm/aren/servlet/Root.java +++ b/src/main/java/fr/lirmm/aren/servlet/Root.java @@ -43,6 +43,7 @@ public class Root implements Filter { String path = request.getRequestURI().substring(request.getContextPath().length()); if (!path.startsWith("/caslogin") && !path.startsWith("/ws/") && !path.startsWith("/assets/")) { request.getRequestDispatcher("/index.jsp").forward(request, response); + } else { chain.doFilter(request, response); } diff --git a/src/main/java/fr/lirmm/aren/ws/rest/VMThemeRESTFacade.java b/src/main/java/fr/lirmm/aren/ws/rest/VMThemeRESTFacade.java index 414e2e1..e1a1916 100644 --- a/src/main/java/fr/lirmm/aren/ws/rest/VMThemeRESTFacade.java +++ b/src/main/java/fr/lirmm/aren/ws/rest/VMThemeRESTFacade.java @@ -1,7 +1,12 @@ package fr.lirmm.aren.ws.rest; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.lirmm.aren.model.Team; import fr.lirmm.aren.model.vm.VMChoice; +import fr.lirmm.aren.model.vm.VMNotification; +import fr.lirmm.aren.model.vm.VMTeam; import fr.lirmm.aren.model.vm.VMTheme; +import fr.lirmm.aren.service.TeamService; import fr.lirmm.aren.service.vm.VMChoiceService; import fr.lirmm.aren.service.vm.VMThemeService; import fr.lirmm.aren.service.vm.VMVoteService; @@ -14,6 +19,9 @@ import javax.inject.Inject; import javax.ws.rs.DELETE; import javax.ws.rs.Path; import javax.ws.rs.PathParam; +import java.io.File; +import java.io.IOException; +import java.time.ZonedDateTime; import java.util.*; /** @@ -32,6 +40,9 @@ public class VMThemeRESTFacade extends AbstractRESTFacade{ @Inject VMVoteService voteService ; + @Inject + TeamService teamService ; + @Override protected VMThemeService getService() { return themeService; @@ -41,8 +52,40 @@ public class VMThemeRESTFacade extends AbstractRESTFacade{ //@RolesAllowed({"ADMIN"}) @PermitAll public VMTheme create(VMTheme theme){ - System.out.println(theme.toString()); - return super.create(theme); + VMTheme res= super.create(theme); + try{ + File file = new File("/aren/tmp/vote_majoritaire.json"); + File directory = new File("/aren/tmp"); + if (! directory.exists()){ + directory.mkdirs() ; + } + System.out.println(file.getAbsolutePath()); + if(!file.exists()) + file.createNewFile() ; + VMNotification notification=new VMNotification() ; + List emails=new ArrayList<>() ; + Team team=teamService.find(theme.getTeam().getId()); + team.getUsers().forEach(user->{ + emails.add(user.getEmail()) ; + }); + notification.setExpiracy(theme.getExpiracyDate().toString()); + String serverRoot = request.getRequestURL().substring(0, request.getRequestURL().length() - "/ws/vm/themes".length()); + notification.setLink(serverRoot+"/votemajoritairedetails?id="+res.getId()); + notification.setEmails(emails); + String []emails_array=new String[notification.getEmails().size()] ; + for(int j=0 ; j map = new HashMap<>() ; + map.put("link",notification.getLink()) ; + map.put("expiracy",notification.getExpiracy()) ; + map.put("emails",emails_array) ; + ObjectMapper mapper = new ObjectMapper(); + mapper.writeValue(file,map); + }catch (IOException e) { + e.printStackTrace(); + } + return res ; } @Override diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index dc40f99..c5e50d9 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -22,4 +22,7 @@ mail_new_user_subject: Activation utilisateur mail_new_user_body:

Bonjour,

Pour poursuivre l''activation de votre compte sur la plateforme AREN veuillez cliquer ici

Si le lien ne fonctionne pas, veuillez copier-coller l''url suivante dans la barre d''adresse de votre navigateur :
{0}


Attention ce lien n''est valable que pendant 24h.


PS : Veuillez ne pas répondre à ce mail qui est envoyé automatiquement par l''application de gestion de comptes informatiques.

mail_reset_password_subject: Réinitialisation du mot de passe -mail_reset_password_body:

Bonjour,

Une demande de réinitialisation de mot de passe à été faite en votre nom pour la plateforme AREN.

Si vous êtes l''auteur\u22c5e de cette demande, pour réinitialiser votre mot de passe, cliquer ici

Si le lien ne fonctionne pas, veuillez copier-coller l''url suivante dans la barre d''adresse de votre navigateur :
{0}


Attention ce lien n''est valable que pendant 24h.


Si vous n''êtes pas l''auteur\u22c5e de cette demande, vous pouvez ignorer cet e-mail.


PS : Veuillez ne pas répondre à ce mail qui est envoyé automatiquement par l''application de gestion de comptes informatiques.

\ No newline at end of file +mail_reset_password_body:

Bonjour,

Une demande de réinitialisation de mot de passe à été faite en votre nom pour la plateforme AREN.

Si vous êtes l''auteur\u22c5e de cette demande, pour réinitialiser votre mot de passe, cliquer ici

Si le lien ne fonctionne pas, veuillez copier-coller l''url suivante dans la barre d''adresse de votre navigateur :
{0}


Attention ce lien n''est valable que pendant 24h.


Si vous n''êtes pas l''auteur\u22c5e de cette demande, vous pouvez ignorer cet e-mail.


PS : Veuillez ne pas répondre à ce mail qui est envoyé automatiquement par l''application de gestion de comptes informatiques.

+ +mail_vm_notification_subject: Notification sur le vote +mail_vm_notification_body :

Bonjour,

Pour poursuivre l''evolution du vote sur la plateforme AREN veuillez cliquer ici

Si le lien ne fonctionne pas, veuillez copier-coller l''url suivante dans la barre d''adresse de votre navigateur :
{0}



PS : Veuillez ne pas répondre à ce mail qui est envoyé automatiquement par l''application de gestion de comptes informatiques.

\ No newline at end of file