Commit e394936f by Tuukka Kivilahti

send places to other users

1 parent 7a7cd69e
......@@ -89,6 +89,8 @@ public interface UserBeanLocal {
boolean userExists(String login);
boolean userExistsByEmail(String email);
/**
*
* @param invitemail Target mail
......@@ -98,6 +100,9 @@ public interface UserBeanLocal {
*/
boolean invite(String invitemail, String url, GroupMembership membership);
void cancelInvite(GroupMembership ship);
EventUser mergeEventUserChanges(EventUser shoppingUser);
List<Role> findUsersRoles(EventUser u);
......
......@@ -298,6 +298,8 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
throw new EJBAccessException("Not enough rights to release token");
}
gmem.setUser(null);
gmem.setInviteEmail(null);
gmem.setInviteName(null);
gmem.setInviteToken(gmemfacade.createInviteToken());
logger.info("Place released. {} new token {}", gmem.getInviteToken());
}
......
......@@ -551,7 +551,7 @@ public class UserBean implements UserBeanLocal {
invitemail = invitemail.trim();
List<User> usercheck = userFacade.findByEmail(invitemail);
if (usercheck.size() > 0) {
if (usercheck.size() > 0 && inviteGm == null) {
logger.info("Email already exists {}", invitemail);
return false;
}
......@@ -569,17 +569,21 @@ public class UserBean implements UserBeanLocal {
PlaceGroup pg;
if(inviteGm != null) {
inviteGm.setInviteToken(token);
inviteGm.setInviteEmail(invitemail);
gmfacade.merge(inviteGm);
pg = inviteGm.getPlaceGroup();
} else {
pg = new PlaceGroup(ev, Calendar.getInstance(), Calendar.getInstance(), false);
pg.setCreator(creator);
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);
}
MailMessage msg = new MailMessage();
msg.setSubject(eventBean.getPropertyString(LanEventPropertyKey.INVITEMAIL_SUBJECT));
String formatUrl = MessageFormat.format(url, token);
......@@ -591,6 +595,15 @@ public class UserBean implements UserBeanLocal {
}
@Override
public void cancelInvite(GroupMembership ship) {
ship = gmfacade.merge(ship);
ship.setInviteToken(gmfacade.createInviteToken());
ship.setInviteEmail(null);
ship.setInviteName(null);
}
@Override
@PermitAll
public GroupMembership findToken(String token) {
return gmfacade.findByToken(token);
......@@ -748,6 +761,13 @@ public class UserBean implements UserBeanLocal {
}
@Override
public boolean userExistsByEmail(String email) {
List<User> usr = userFacade.findByEmail(email);
return (usr != null && usr.size() > 0);
}
@Override
public EventUser findByEventUserId(Integer integer) {
return eventUserFacade.find(integer);
}
......
......@@ -93,7 +93,7 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(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));
}
......@@ -139,7 +139,7 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(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();
}
......
......@@ -38,7 +38,6 @@
</f:facet>
<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})" />
</p:column>
<p:column>
<f:facet name="header">
......@@ -52,12 +51,20 @@
<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:commandButton rendered="#{!(placeGroupView.canModifyCurrent and placeGroupView.currentMemberUserNotNull and placeGroupView.currentReleaseAllowed)}" value="#{i18n['user.invite']}" actionListener="#{placeGroupView.sendInvite}" update=":messages placestable" />
<p:inputText immediate="true" rendered="#{placeGroupView.canSendInviteCurrent}" value="#{placeGroupView.inviteMail}" />
<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:dataTable>
<p:dialog header="Basic Dialog" widgetVar="dlg1" minHeight="40">
<h:outputText value="Resistance to PrimeFaces is futile!" />
</p:dialog>
</h:form>
<p>
......
......@@ -11,14 +11,13 @@
</f:metadata>
<ui:define name="title">
<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>
</ui:define>
<ui:define name="content">
<ui:fragment rendered="#{!inviteAcceptView.done}">
<h2>
<h:outputText value="#{i18n['invite.existingUserHeader']}" />
</h2>
<p:fieldset legend="#{i18n['invite.existingUserHeader']}">
<h:form>
<h:panelGrid columns="2">
<h:outputLabel for="login" />
......@@ -29,13 +28,12 @@
</h:panelGrid>
<p:commandButton id="submit" action="#{inviteAcceptView.loginWithExisting()}" ajax="false" value="#{i18n['login.submit']}" />
</h:form>
</p:fieldset>
<h2>
<h:outputText value="#{i18n['invite.createNewUserHeader']}" />
</h2>
<br /><br /><br />
<p:fieldset legend="#{i18n['invite.createNewUserHeader']}">
<users:create creating="true" commitaction="#{inviteAcceptView.createUser()}" commitvalue="#{i18n['user.create']}" />
</p:fieldset>
</ui:fragment>
</ui:define>
</ui:composition>
......
......@@ -19,7 +19,9 @@
package fi.codecrew.moya.web.cdiview.map;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
......@@ -28,6 +30,7 @@ import javax.inject.Inject;
import javax.inject.Named;
import fi.codecrew.moya.beans.PlaceGroupBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.enums.apps.MapPermission;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.GroupMembership;
......@@ -56,6 +59,9 @@ public class PlacegroupView extends GenericCDIView {
@EJB
private transient PlaceGroupBeanLocal placegroupBean;
@EJB
UserBeanLocal userBean;
@Inject
private InviteView inviteView;
......@@ -67,9 +73,7 @@ public class PlacegroupView extends GenericCDIView {
private transient ListDataModel<GroupMembership> memberlist;
private String inviteMail;
private Map<Integer, String> inviteMails = new HashMap<>();
public String editGroup() {
setGroup(placegroups.getRowData());
......@@ -92,6 +96,35 @@ public class PlacegroupView extends GenericCDIView {
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() {
GroupMembership row = memberlist.getRowData();
if (row != null && row.getUser() != null)
......@@ -186,24 +219,40 @@ public class PlacegroupView extends GenericCDIView {
GroupMembership row = memberlist.getRowData();
if (row != null) {
if (permbean.isCurrentUser(row.getPlaceGroup().getCreator()) || permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
logger.info("Invitemail is: {} <-- ", inviteMail);
String inviteMail = inviteMails.get(row.getId());
inviteView.setInviteGm(row);
inviteView.setInvitemail(inviteMail);
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() {
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) {
this.inviteMail = inviteMail;
GroupMembership row = memberlist.getRowData();
if(row != null) {
inviteMails.put(row.getId(), inviteMail);
}
}
}
......@@ -27,6 +27,7 @@ import javax.inject.Named;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import fi.codecrew.moya.web.cdiview.user.AuthView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -50,6 +51,9 @@ public class InviteAcceptView extends GenericCDIView {
@Inject
private UserView userview;
@Inject
private AuthView authView;
private EventUser user;
private boolean done = false;
......@@ -60,6 +64,8 @@ public class InviteAcceptView extends GenericCDIView {
private static final Logger logger = LoggerFactory.getLogger(InviteAcceptView.class);
private boolean placeGroupMembership = false;
public void initView() {
if (membership == null) {
......@@ -72,6 +78,10 @@ public class InviteAcceptView extends GenericCDIView {
} else if (user == null) {
user = new EventUser(new User(), null, permbean.getCurrentUser());
userview.setUser(user);
if(membership.getPlaceReservation() != null)
setPlaceGroupMembership(true);
super.beginConversation();
}
......@@ -89,6 +99,14 @@ public class InviteAcceptView extends GenericCDIView {
EventUser eu = userbean.acceptInviteForExistingUser(username, password, token);
if (eu != null) {
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.password = null;
......@@ -102,11 +120,11 @@ public class InviteAcceptView extends GenericCDIView {
String existingUsername = null;
if (req.getUserPrincipal() != null) {
if (User.ANONYMOUS_LOGINNAME.equals(req.getUserPrincipal().getName())) {
if (req.getUserPrincipal() != null) {
try {
req.logout();
} catch (ServletException e) {
logger.warn("Logging out anonymous failed!", e);
logger.warn("Logging out previous user failed!", e);
}
} else {
existingUsername = req.getUserPrincipal().getName();
......@@ -127,6 +145,16 @@ public class InviteAcceptView extends GenericCDIView {
user.getUser().resetPassword(userview.getPassword());
if (userbean.createFromInviteToken(user, token)) {
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");
done = true;
......@@ -174,4 +202,11 @@ public class InviteAcceptView extends GenericCDIView {
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 {
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)) {
message(context, ui, "userview.invalidEmail");
}
......
......@@ -426,3 +426,6 @@ user.createdmessage=K\u00E4ytt\u00E4j\u00E4tunnus on luotu onnistuneesti.
product.vat=ALV-%
productFlag.CREATE_NEW_PLACE_WHEN_BOUGHT=Luo uusi paikka ostettaessa
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
userview.header = Users
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.passwordTooShort = Password has to be atleast {0} characters long\!
userview.passwordsChanged = Password changed
......@@ -1623,3 +1623,6 @@ user.emailAgain=Email (again)
required=Required
usercart.showoverview=
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
user.emailAgain=S\u00E4hk\u00F6posti (uudelleen)
required=Vaaditaan
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!