Commit e394936f by Tuukka Kivilahti

send places to other users

1 parent 7a7cd69e
...@@ -89,6 +89,8 @@ public interface UserBeanLocal { ...@@ -89,6 +89,8 @@ public interface UserBeanLocal {
boolean userExists(String login); boolean userExists(String login);
boolean userExistsByEmail(String email);
/** /**
* *
* @param invitemail Target mail * @param invitemail Target mail
...@@ -98,6 +100,9 @@ public interface UserBeanLocal { ...@@ -98,6 +100,9 @@ public interface UserBeanLocal {
*/ */
boolean invite(String invitemail, String url, GroupMembership membership); boolean invite(String invitemail, String url, GroupMembership membership);
void cancelInvite(GroupMembership ship);
EventUser mergeEventUserChanges(EventUser shoppingUser); EventUser mergeEventUserChanges(EventUser shoppingUser);
List<Role> findUsersRoles(EventUser u); List<Role> findUsersRoles(EventUser u);
......
...@@ -298,6 +298,8 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal { ...@@ -298,6 +298,8 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
throw new EJBAccessException("Not enough rights to release token"); throw new EJBAccessException("Not enough rights to release token");
} }
gmem.setUser(null); gmem.setUser(null);
gmem.setInviteEmail(null);
gmem.setInviteName(null);
gmem.setInviteToken(gmemfacade.createInviteToken()); gmem.setInviteToken(gmemfacade.createInviteToken());
logger.info("Place released. {} new token {}", gmem.getInviteToken()); logger.info("Place released. {} new token {}", gmem.getInviteToken());
} }
......
...@@ -551,7 +551,7 @@ public class UserBean implements UserBeanLocal { ...@@ -551,7 +551,7 @@ public class UserBean implements UserBeanLocal {
invitemail = invitemail.trim(); invitemail = invitemail.trim();
List<User> usercheck = userFacade.findByEmail(invitemail); List<User> usercheck = userFacade.findByEmail(invitemail);
if (usercheck.size() > 0) { if (usercheck.size() > 0 && inviteGm == null) {
logger.info("Email already exists {}", invitemail); logger.info("Email already exists {}", invitemail);
return false; return false;
} }
...@@ -569,17 +569,21 @@ public class UserBean implements UserBeanLocal { ...@@ -569,17 +569,21 @@ public class UserBean implements UserBeanLocal {
PlaceGroup pg; PlaceGroup pg;
if(inviteGm != null) { if(inviteGm != null) {
inviteGm.setInviteToken(token); inviteGm.setInviteToken(token);
inviteGm.setInviteEmail(invitemail);
gmfacade.merge(inviteGm); gmfacade.merge(inviteGm);
pg = inviteGm.getPlaceGroup(); pg = inviteGm.getPlaceGroup();
} else { } else {
pg = new PlaceGroup(ev, Calendar.getInstance(), Calendar.getInstance(), false); pg = new PlaceGroup(ev, Calendar.getInstance(), Calendar.getInstance(), false);
pg.setCreator(creator); pg.setCreator(creator);
pg.setName("Invite to " + invitemail); pg.setName("Invite to " + invitemail);
pg.getMembers().add(new GroupMembership(pg, null, token)); GroupMembership gm = new GroupMembership(pg, null, token);
gm.setInviteEmail(invitemail);
pg.getMembers().add(gm);
pgfacade.create(pg); pgfacade.create(pg);
} }
MailMessage msg = new MailMessage(); MailMessage msg = new MailMessage();
msg.setSubject(eventBean.getPropertyString(LanEventPropertyKey.INVITEMAIL_SUBJECT)); msg.setSubject(eventBean.getPropertyString(LanEventPropertyKey.INVITEMAIL_SUBJECT));
String formatUrl = MessageFormat.format(url, token); String formatUrl = MessageFormat.format(url, token);
...@@ -591,6 +595,15 @@ public class UserBean implements UserBeanLocal { ...@@ -591,6 +595,15 @@ public class UserBean implements UserBeanLocal {
} }
@Override @Override
public void cancelInvite(GroupMembership ship) {
ship = gmfacade.merge(ship);
ship.setInviteToken(gmfacade.createInviteToken());
ship.setInviteEmail(null);
ship.setInviteName(null);
}
@Override
@PermitAll @PermitAll
public GroupMembership findToken(String token) { public GroupMembership findToken(String token) {
return gmfacade.findByToken(token); return gmfacade.findByToken(token);
...@@ -748,6 +761,13 @@ public class UserBean implements UserBeanLocal { ...@@ -748,6 +761,13 @@ public class UserBean implements UserBeanLocal {
} }
@Override @Override
public boolean userExistsByEmail(String email) {
List<User> usr = userFacade.findByEmail(email);
return (usr != null && usr.size() > 0);
}
@Override
public EventUser findByEventUserId(Integer integer) { public EventUser findByEventUserId(Integer integer) {
return eventUserFacade.find(integer); return eventUserFacade.find(integer);
} }
......
...@@ -93,7 +93,7 @@ public class UserFacade extends IntegerPkGenericFacade<User> { ...@@ -93,7 +93,7 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
CriteriaBuilder cb = getEm().getCriteriaBuilder(); CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class); CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(User.class); Root<User> root = cq.from(User.class);
cq.where(cb.equal(root.get(User_.login), login)); cq.where(cb.equal(cb.lower(root.get(User_.login)), login.toLowerCase()));
return getSingleNullableResult(getEm().createQuery(cq)); return getSingleNullableResult(getEm().createQuery(cq));
} }
...@@ -139,7 +139,7 @@ public class UserFacade extends IntegerPkGenericFacade<User> { ...@@ -139,7 +139,7 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
CriteriaBuilder cb = getEm().getCriteriaBuilder(); CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class); CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(User.class); Root<User> root = cq.from(User.class);
cq.where(cb.equal(root.get(User_.email), email)); cq.where(cb.equal(cb.upper(root.get(User_.email)), email.toUpperCase()));
return getEm().createQuery(cq).getResultList(); return getEm().createQuery(cq).getResultList();
} }
......
...@@ -38,7 +38,6 @@ ...@@ -38,7 +38,6 @@
</f:facet> </f:facet>
<h:outputText rendered="#{empty member.user}" value="#{member.inviteToken}" /> <h:outputText rendered="#{empty member.user}" value="#{member.inviteToken}" />
<h:outputText rendered="#{!empty member.user}" value="#{member.user.firstnames} #{member.user.lastname} (#{member.user.nick})" /> <h:outputText rendered="#{!empty member.user}" value="#{member.user.firstnames} #{member.user.lastname} (#{member.user.nick})" />
</p:column> </p:column>
<p:column> <p:column>
<f:facet name="header"> <f:facet name="header">
...@@ -52,12 +51,20 @@ ...@@ -52,12 +51,20 @@
<h:commandButton rendered="#{placeGroupView.canModifyCurrent and placeGroupView.currentMemberUserNotNull and placeGroupView.currentReleaseAllowed}" action="#{placeGroupView.releasePlace()}" value="#{i18n['placegroupview.releasePlace']}" /> <h:commandButton rendered="#{placeGroupView.canModifyCurrent and placeGroupView.currentMemberUserNotNull and placeGroupView.currentReleaseAllowed}" action="#{placeGroupView.releasePlace()}" value="#{i18n['placegroupview.releasePlace']}" />
<p:inputText immediate="true" rendered="#{!(placeGroupView.canModifyCurrent and placeGroupView.currentMemberUserNotNull and placeGroupView.currentReleaseAllowed)}" value="#{placeGroupView.inviteMail}" /> <p:inputText immediate="true" rendered="#{placeGroupView.canSendInviteCurrent}" value="#{placeGroupView.inviteMail}" />
<p:commandButton rendered="#{!(placeGroupView.canModifyCurrent and placeGroupView.currentMemberUserNotNull and placeGroupView.currentReleaseAllowed)}" value="#{i18n['user.invite']}" actionListener="#{placeGroupView.sendInvite}" update=":messages placestable" /> <p:commandButton rendered="#{placeGroupView.canSendInviteCurrent}" value="#{i18n['user.invite']}" actionListener="#{placeGroupView.sendInvite}" update=":messages placestable" />
<h:outputText rendered="#{placeGroupView.showCancelInviteCurrent}" value="#{member.inviteEmail}" />&nbsp;&nbsp;
<p:commandButton rendered="#{placeGroupView.showCancelInviteCurrent}" value="#{i18n['user.cancelInvite']}" actionListener="#{placeGroupView.cancelInvite}" update=":messages placestable" />
</p:column> </p:column>
</p:dataTable> </p:dataTable>
<p:dialog header="Basic Dialog" widgetVar="dlg1" minHeight="40">
<h:outputText value="Resistance to PrimeFaces is futile!" />
</p:dialog>
</h:form> </h:form>
<p> <p>
......
...@@ -11,14 +11,13 @@ ...@@ -11,14 +11,13 @@
</f:metadata> </f:metadata>
<ui:define name="title"> <ui:define name="title">
<h1> <h1>
<h:outputText value="#{i18n['user.invite.header']}" /> <h:outputText rendered="#{!inviteAcceptView.placeGroupMembership}" value="#{i18n['user.invite.header']}" />
<h:outputText rendered="#{inviteAcceptView.placeGroupMembership}" value="#{i18n['user.invite.placeInvite.header']}" />
</h1> </h1>
</ui:define> </ui:define>
<ui:define name="content"> <ui:define name="content">
<ui:fragment rendered="#{!inviteAcceptView.done}"> <ui:fragment rendered="#{!inviteAcceptView.done}">
<h2> <p:fieldset legend="#{i18n['invite.existingUserHeader']}">
<h:outputText value="#{i18n['invite.existingUserHeader']}" />
</h2>
<h:form> <h:form>
<h:panelGrid columns="2"> <h:panelGrid columns="2">
<h:outputLabel for="login" /> <h:outputLabel for="login" />
...@@ -29,13 +28,12 @@ ...@@ -29,13 +28,12 @@
</h:panelGrid> </h:panelGrid>
<p:commandButton id="submit" action="#{inviteAcceptView.loginWithExisting()}" ajax="false" value="#{i18n['login.submit']}" /> <p:commandButton id="submit" action="#{inviteAcceptView.loginWithExisting()}" ajax="false" value="#{i18n['login.submit']}" />
</h:form> </h:form>
</p:fieldset>
<h2> <br /><br /><br />
<h:outputText value="#{i18n['invite.createNewUserHeader']}" /> <p:fieldset legend="#{i18n['invite.createNewUserHeader']}">
</h2>
<users:create creating="true" commitaction="#{inviteAcceptView.createUser()}" commitvalue="#{i18n['user.create']}" /> <users:create creating="true" commitaction="#{inviteAcceptView.createUser()}" commitvalue="#{i18n['user.create']}" />
</p:fieldset>
</ui:fragment> </ui:fragment>
</ui:define> </ui:define>
</ui:composition> </ui:composition>
......
...@@ -19,7 +19,9 @@ ...@@ -19,7 +19,9 @@
package fi.codecrew.moya.web.cdiview.map; package fi.codecrew.moya.web.cdiview.map;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped; import javax.enterprise.context.ConversationScoped;
...@@ -28,6 +30,7 @@ import javax.inject.Inject; ...@@ -28,6 +30,7 @@ import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import fi.codecrew.moya.beans.PlaceGroupBeanLocal; import fi.codecrew.moya.beans.PlaceGroupBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.enums.apps.MapPermission; import fi.codecrew.moya.enums.apps.MapPermission;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.GroupMembership; import fi.codecrew.moya.model.GroupMembership;
...@@ -56,6 +59,9 @@ public class PlacegroupView extends GenericCDIView { ...@@ -56,6 +59,9 @@ public class PlacegroupView extends GenericCDIView {
@EJB @EJB
private transient PlaceGroupBeanLocal placegroupBean; private transient PlaceGroupBeanLocal placegroupBean;
@EJB
UserBeanLocal userBean;
@Inject @Inject
private InviteView inviteView; private InviteView inviteView;
...@@ -67,9 +73,7 @@ public class PlacegroupView extends GenericCDIView { ...@@ -67,9 +73,7 @@ public class PlacegroupView extends GenericCDIView {
private transient ListDataModel<GroupMembership> memberlist; private transient ListDataModel<GroupMembership> memberlist;
private Map<Integer, String> inviteMails = new HashMap<>();
private String inviteMail;
public String editGroup() { public String editGroup() {
setGroup(placegroups.getRowData()); setGroup(placegroups.getRowData());
...@@ -92,6 +96,35 @@ public class PlacegroupView extends GenericCDIView { ...@@ -92,6 +96,35 @@ public class PlacegroupView extends GenericCDIView {
return canModify(memberlist.getRowData()); return canModify(memberlist.getRowData());
} }
public boolean isShowCancelInviteCurrent() {
GroupMembership row = memberlist.getRowData();
if(row == null)
return false;
if(!isCanModifyCurrent())
return false;
if(row.getUser() == null && (row.getInviteEmail() != null && !row.getInviteEmail().trim().isEmpty()))
return true;
return false;
}
public boolean isCanSendInviteCurrent() {
GroupMembership row = memberlist.getRowData();
if(row == null)
return false;
if(!isCanModifyCurrent())
return false;
if(row.getUser() == null && (row.getInviteEmail() == null || row.getInviteEmail().trim().isEmpty()))
return true;
return false;
}
public boolean isCurrentMemberUserNotNull() { public boolean isCurrentMemberUserNotNull() {
GroupMembership row = memberlist.getRowData(); GroupMembership row = memberlist.getRowData();
if (row != null && row.getUser() != null) if (row != null && row.getUser() != null)
...@@ -186,24 +219,40 @@ public class PlacegroupView extends GenericCDIView { ...@@ -186,24 +219,40 @@ public class PlacegroupView extends GenericCDIView {
GroupMembership row = memberlist.getRowData(); GroupMembership row = memberlist.getRowData();
if (row != null) { if (row != null) {
if (permbean.isCurrentUser(row.getPlaceGroup().getCreator()) || permbean.hasPermission(MapPermission.MANAGE_OTHERS)) { if (permbean.isCurrentUser(row.getPlaceGroup().getCreator()) || permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
String inviteMail = inviteMails.get(row.getId());
logger.info("Invitemail is: {} <-- ", inviteMail);
inviteView.setInviteGm(row); inviteView.setInviteGm(row);
inviteView.setInvitemail(inviteMail); inviteView.setInvitemail(inviteMail);
inviteView.invite(); inviteView.invite();
}
}
}
public void cancelInvite() {
GroupMembership row = memberlist.getRowData();
if (row != null) {
if (permbean.isCurrentUser(row.getPlaceGroup().getCreator()) || permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
userBean.cancelInvite(row);
} }
} }
} }
public String getInviteMail() { public String getInviteMail() {
if(inviteMail == null)
return "";
return inviteMail; GroupMembership row = memberlist.getRowData();
if(row != null) {
return inviteMails.get(row.getId());
}
return null;
} }
public void setInviteMail(String inviteMail) { public void setInviteMail(String inviteMail) {
this.inviteMail = inviteMail; GroupMembership row = memberlist.getRowData();
if(row != null) {
inviteMails.put(row.getId(), inviteMail);
}
} }
} }
...@@ -27,6 +27,7 @@ import javax.inject.Named; ...@@ -27,6 +27,7 @@ import javax.inject.Named;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import fi.codecrew.moya.web.cdiview.user.AuthView;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -50,6 +51,9 @@ public class InviteAcceptView extends GenericCDIView { ...@@ -50,6 +51,9 @@ public class InviteAcceptView extends GenericCDIView {
@Inject @Inject
private UserView userview; private UserView userview;
@Inject
private AuthView authView;
private EventUser user; private EventUser user;
private boolean done = false; private boolean done = false;
...@@ -60,6 +64,8 @@ public class InviteAcceptView extends GenericCDIView { ...@@ -60,6 +64,8 @@ public class InviteAcceptView extends GenericCDIView {
private static final Logger logger = LoggerFactory.getLogger(InviteAcceptView.class); private static final Logger logger = LoggerFactory.getLogger(InviteAcceptView.class);
private boolean placeGroupMembership = false;
public void initView() { public void initView() {
if (membership == null) { if (membership == null) {
...@@ -72,6 +78,10 @@ public class InviteAcceptView extends GenericCDIView { ...@@ -72,6 +78,10 @@ public class InviteAcceptView extends GenericCDIView {
} else if (user == null) { } else if (user == null) {
user = new EventUser(new User(), null, permbean.getCurrentUser()); user = new EventUser(new User(), null, permbean.getCurrentUser());
userview.setUser(user); userview.setUser(user);
if(membership.getPlaceReservation() != null)
setPlaceGroupMembership(true);
super.beginConversation(); super.beginConversation();
} }
...@@ -89,6 +99,14 @@ public class InviteAcceptView extends GenericCDIView { ...@@ -89,6 +99,14 @@ public class InviteAcceptView extends GenericCDIView {
EventUser eu = userbean.acceptInviteForExistingUser(username, password, token); EventUser eu = userbean.acceptInviteForExistingUser(username, password, token);
if (eu != null) { if (eu != null) {
login(username, password); login(username, password);
this.username = null;
this.password = null;
super.addFaceMessage("invite.userCreateSuccessfull");
if(isPlaceGroupMembership())
return "/place/myGroups.jsf";
else
return "/index.jsf";
} }
this.username = null; this.username = null;
this.password = null; this.password = null;
...@@ -102,11 +120,11 @@ public class InviteAcceptView extends GenericCDIView { ...@@ -102,11 +120,11 @@ public class InviteAcceptView extends GenericCDIView {
String existingUsername = null; String existingUsername = null;
if (req.getUserPrincipal() != null) { if (req.getUserPrincipal() != null) {
if (User.ANONYMOUS_LOGINNAME.equals(req.getUserPrincipal().getName())) { if (req.getUserPrincipal() != null) {
try { try {
req.logout(); req.logout();
} catch (ServletException e) { } catch (ServletException e) {
logger.warn("Logging out anonymous failed!", e); logger.warn("Logging out previous user failed!", e);
} }
} else { } else {
existingUsername = req.getUserPrincipal().getName(); existingUsername = req.getUserPrincipal().getName();
...@@ -127,6 +145,16 @@ public class InviteAcceptView extends GenericCDIView { ...@@ -127,6 +145,16 @@ public class InviteAcceptView extends GenericCDIView {
user.getUser().resetPassword(userview.getPassword()); user.getUser().resetPassword(userview.getPassword());
if (userbean.createFromInviteToken(user, token)) { if (userbean.createFromInviteToken(user, token)) {
login(user.getUser().getLogin(), userview.getPassword()); login(user.getUser().getLogin(), userview.getPassword());
super.addFaceMessage("invite.userCreateSuccessfull");
done = true;
user = null;
if(isPlaceGroupMembership())
return "/place/myGroups.jsf";
else
return "/index.jsf";
} }
super.addFaceMessage("invite.userCreateSuccessfull"); super.addFaceMessage("invite.userCreateSuccessfull");
done = true; done = true;
...@@ -174,4 +202,11 @@ public class InviteAcceptView extends GenericCDIView { ...@@ -174,4 +202,11 @@ public class InviteAcceptView extends GenericCDIView {
this.password = password; this.password = password;
} }
public boolean isPlaceGroupMembership() {
return placeGroupMembership;
}
public void setPlaceGroupMembership(boolean placeGroupMembership) {
this.placeGroupMembership = placeGroupMembership;
}
} }
...@@ -65,6 +65,10 @@ public class UserValidator implements Serializable { ...@@ -65,6 +65,10 @@ public class UserValidator implements Serializable {
message(context, ui, "user.emailtooshortmessage", EMAIL_MIN_LENGTH); message(context, ui, "user.emailtooshortmessage", EMAIL_MIN_LENGTH);
} }
if(userbean.userExistsByEmail(email) || userbean.userExists(email)) {
message(context, ui, "userview.userExistsByEmail");
}
if (!permbean.hasPermission(UserPermission.MODIFY) && (email == null || email.indexOf('@') == -1)) { if (!permbean.hasPermission(UserPermission.MODIFY) && (email == null || email.indexOf('@') == -1)) {
message(context, ui, "userview.invalidEmail"); message(context, ui, "userview.invalidEmail");
} }
......
...@@ -426,3 +426,6 @@ user.createdmessage=K\u00E4ytt\u00E4j\u00E4tunnus on luotu onnistuneesti. ...@@ -426,3 +426,6 @@ user.createdmessage=K\u00E4ytt\u00E4j\u00E4tunnus on luotu onnistuneesti.
product.vat=ALV-% product.vat=ALV-%
productFlag.CREATE_NEW_PLACE_WHEN_BOUGHT=Luo uusi paikka ostettaessa productFlag.CREATE_NEW_PLACE_WHEN_BOUGHT=Luo uusi paikka ostettaessa
submenu.neomap.view=Paikkakartta submenu.neomap.view=Paikkakartta
user.cancelInvite=Peruuta kutsu
user.invite.placeInvite.header=Liit\u00E4 paikka itsellesi
userview.userExistsByEmail=
...@@ -1559,7 +1559,7 @@ usertitle.managingUser = Shop ...@@ -1559,7 +1559,7 @@ usertitle.managingUser = Shop
userview.header = Users userview.header = Users
userview.invalidEmail = Invalid email address userview.invalidEmail = Invalid email address
userview.loginstringFaulty = Username has to be atleast 2 characters long! userview.loginstringFaulty = Username has to be atleast 2 characters long\!
userview.oldPasswordError = Invalid password! userview.oldPasswordError = Invalid password!
userview.passwordTooShort = Password has to be atleast {0} characters long\! userview.passwordTooShort = Password has to be atleast {0} characters long\!
userview.passwordsChanged = Password changed userview.passwordsChanged = Password changed
...@@ -1623,3 +1623,6 @@ user.emailAgain=Email (again) ...@@ -1623,3 +1623,6 @@ user.emailAgain=Email (again)
required=Required required=Required
usercart.showoverview= usercart.showoverview=
submenu.neomap.view=Map submenu.neomap.view=Map
user.cancelInvite=Cancel invite
user.invite.placeInvite.header=Receive sendet place
userview.userExistsByEmail=Email already exists\! You may already have an account.
...@@ -1604,3 +1604,6 @@ user.emailsunmatch=S\u00E4hk\u00F6postiosoitteet eiv\u00E4t t\u00E4sm\u00E4\u00E ...@@ -1604,3 +1604,6 @@ user.emailsunmatch=S\u00E4hk\u00F6postiosoitteet eiv\u00E4t t\u00E4sm\u00E4\u00E
user.emailAgain=S\u00E4hk\u00F6posti (uudelleen) user.emailAgain=S\u00E4hk\u00F6posti (uudelleen)
required=Vaaditaan required=Vaaditaan
submenu.neomap.view=Paikkakartta submenu.neomap.view=Paikkakartta
user.cancelInvite=Peruuta kutsu
user.invite.placeInvite.header=Vastaanota l\u00E4hetetty paikka
userview.userExistsByEmail=S\u00E4hk\u00F6posti on jo olemassa. Sinulla saattaa jo olla tunnus j\u00E4rjestelm\u00E4ss\u00E4.
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!