diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..12937e5 --- /dev/null +++ b/.classpath @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..4ba0c0e --- /dev/null +++ b/.project @@ -0,0 +1,71 @@ + + + wildfly-kitchensink-angularjs + + + + + + tern.eclipse.ide.core.ternBuilder + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.jboss.tools.ws.jaxrs.metamodelBuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.hibernate.eclipse.console.hibernateBuilder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + org.hibernate.eclipse.console.hibernateNature + org.jboss.tools.ws.jaxrs.nature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/.tern-project b/.tern-project new file mode 100644 index 0000000..b6f48dd --- /dev/null +++ b/.tern-project @@ -0,0 +1 @@ +{"ide":{},"libs":["ecma5","browser"],"plugins":{"guess-types":{},"angular":{}}} \ No newline at end of file diff --git a/src/main/java/org/jboss/as/quickstarts/kitchensink/data/MemberRepository.java b/src/main/java/org/jboss/as/quickstarts/kitchensink/data/MemberRepository.java index 2a89ce3..85aa5fb 100644 --- a/src/main/java/org/jboss/as/quickstarts/kitchensink/data/MemberRepository.java +++ b/src/main/java/org/jboss/as/quickstarts/kitchensink/data/MemberRepository.java @@ -46,6 +46,14 @@ public Member findByEmail(String email) { criteria.select(member).where(cb.equal(member.get("email"), email)); return em.createQuery(criteria).getSingleResult(); } + + public Member findByName(String name) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery criteria = cb.createQuery(Member.class); + Root member = criteria.from(Member.class); + criteria.select(member).where(cb.equal(member.get("name"), name)); + return em.createQuery(criteria).getSingleResult(); + } public List findAllOrderedByName() { CriteriaBuilder cb = em.getCriteriaBuilder(); diff --git a/src/main/java/org/jboss/as/quickstarts/kitchensink/model/Member.java b/src/main/java/org/jboss/as/quickstarts/kitchensink/model/Member.java index d2ccaa6..43063e9 100644 --- a/src/main/java/org/jboss/as/quickstarts/kitchensink/model/Member.java +++ b/src/main/java/org/jboss/as/quickstarts/kitchensink/model/Member.java @@ -58,8 +58,21 @@ public class Member implements Serializable { @Digits(fraction = 0, integer = 12) @Column(name = "phone_number") private String phoneNumber; - - public Long getId() { + + @NotNull + @NotEmpty + @Column + private String address; + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public Long getId() { return id; } diff --git a/src/main/java/org/jboss/as/quickstarts/kitchensink/rest/MemberResourceRESTService.java b/src/main/java/org/jboss/as/quickstarts/kitchensink/rest/MemberResourceRESTService.java index a74c537..f3a0656 100644 --- a/src/main/java/org/jboss/as/quickstarts/kitchensink/rest/MemberResourceRESTService.java +++ b/src/main/java/org/jboss/as/quickstarts/kitchensink/rest/MemberResourceRESTService.java @@ -96,9 +96,9 @@ public Response createMember(Member member) { try { // Validates member using bean validation validateMember(member); - + registration.register(member); - + // Create an "ok" response builder = Response.ok(); } catch (ConstraintViolationException ce) { @@ -107,7 +107,12 @@ public Response createMember(Member member) { } catch (ValidationException e) { // Handle the unique constrain violation Map responseObj = new HashMap<>(); - responseObj.put("email", "Email taken"); + if(emailAlreadyExists(member.getEmail())){ + responseObj.put("email", "Email taken"); + } + if(nameAlreadyExists(member.getName())){ + responseObj.put("name", "Name taken"); + } builder = Response.status(Response.Status.CONFLICT).entity(responseObj); } catch (Exception e) { // Handle generic exceptions @@ -145,6 +150,9 @@ private void validateMember(Member member) throws ConstraintViolationException, if (emailAlreadyExists(member.getEmail())) { throw new ValidationException("Unique Email Violation"); } + if (nameAlreadyExists(member.getName())) { + throw new ValidationException("Unique Name Violation"); + } } /** @@ -182,4 +190,20 @@ public boolean emailAlreadyExists(String email) { } return member != null; } + /** + * Checks if a member with the same name address is already registered. This is the only way to easily capture the + * "@UniqueConstraint(columnNames = "name")" constraint from the Member class. + * + * @param name The email to check + * @return True if the name already exists, and false otherwise + */ + public boolean nameAlreadyExists(String name) { + Member member = null; + try { + member = repository.findByName(name); + } catch (NoResultException e) { + // ignore + } + return member != null; + } } diff --git a/src/main/webapp/partials/home.html b/src/main/webapp/partials/home.html index 5433edd..e1edecd 100644 --- a/src/main/webapp/partials/home.html +++ b/src/main/webapp/partials/home.html @@ -46,6 +46,11 @@

Member Registration

{{errors.phoneNumber}} +
+ + + {{errors.address}} +
    @@ -77,6 +82,7 @@

    Members

    Name Email Phone # + Address # REST URL @@ -86,6 +92,7 @@

    Members

    {{member.name}} {{member.email}} {{member.phoneNumber}} + {{member.address}} /rest/members/{{member.id}}