diff --git a/src/main/java/de/dpunkt/myaktion/model/Account.java b/src/main/java/de/dpunkt/myaktion/model/Account.java index 227dbcd2d1ea3ef1fab3b14d8ca1073ef046921b..176bd5d88c0d6552a87dd6cd7995c23535b93c58 100644 --- a/src/main/java/de/dpunkt/myaktion/model/Account.java +++ b/src/main/java/de/dpunkt/myaktion/model/Account.java @@ -14,7 +14,7 @@ import javax.validation.constraints.Size; * @author Julian */ @Embeddable -public class Account { +public class Account extends DateEntity { //---------------------------------------------------------------------------------------------- @NotNull diff --git a/src/main/java/de/dpunkt/myaktion/model/Campaign.java b/src/main/java/de/dpunkt/myaktion/model/Campaign.java index 0621204996f86d729e52395bf12d79b185e68b18..0b5aca6de26a5680021f4c73b1c950086123c1f5 100644 --- a/src/main/java/de/dpunkt/myaktion/model/Campaign.java +++ b/src/main/java/de/dpunkt/myaktion/model/Campaign.java @@ -14,6 +14,7 @@ import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; +import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; @@ -36,7 +37,8 @@ import javax.validation.constraints.Size; @NamedQuery(name = Campaign.getAmountDonatedSoFar, query = "SELECT SUM(d.amount) FROM Donation d WHERE d.campaign = :campaign") }) @Entity -public class Campaign { +@EntityListeners(EntityCreationListener.class) +public class Campaign extends DateEntity { public static final String findByOrganizer = "Campaign.findByOrganizer"; public static final String findAll = "Campaign.findAll"; diff --git a/src/main/java/de/dpunkt/myaktion/model/DateEntity.java b/src/main/java/de/dpunkt/myaktion/model/DateEntity.java index ba775de5ebaddfb53b91bd21b626867eaf6c8227..ba65637ce6201b7aaba460a2df3f98621f17e7f4 100644 --- a/src/main/java/de/dpunkt/myaktion/model/DateEntity.java +++ b/src/main/java/de/dpunkt/myaktion/model/DateEntity.java @@ -5,10 +5,24 @@ package de.dpunkt.myaktion.model; +import java.util.Date; + +import javax.persistence.EntityListeners; + /** * @author Julian * */ public class DateEntity { + private Date createdAt; + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + } diff --git a/src/main/java/de/dpunkt/myaktion/model/Donation.java b/src/main/java/de/dpunkt/myaktion/model/Donation.java index b7b2a5da2c3fb314dd711dfb3f8bd9fd40d7d4fc..b235701aebc974131461508a6abbe6ced73a702f 100644 --- a/src/main/java/de/dpunkt/myaktion/model/Donation.java +++ b/src/main/java/de/dpunkt/myaktion/model/Donation.java @@ -24,7 +24,7 @@ import javax.validation.constraints.Size; @Entity @NamedQueries({ @NamedQuery(name = Donation.findByStatus, query = "SELECT d FROM Donation d WHERE d.status = :status") }) -public class Donation { +public class Donation extends DateEntity { //---------------------------------------------------------------------------------------------- public static final String findByStatus = "Donation.findByStatus"; diff --git a/src/main/java/de/dpunkt/myaktion/model/EntityCreationListener.java b/src/main/java/de/dpunkt/myaktion/model/EntityCreationListener.java new file mode 100644 index 0000000000000000000000000000000000000000..5b97facd59ab3c6903749e597e435a023dc48d27 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/model/EntityCreationListener.java @@ -0,0 +1,13 @@ +package de.dpunkt.myaktion.model; + +import java.util.Date; + +import javax.persistence.PrePersist; + +public class EntityCreationListener { + @PrePersist + void onPreUpdate(Object entity) { + DateEntity dateEntity = (DateEntity) entity; + dateEntity.setCreatedAt(new Date()); + } +} diff --git a/src/main/java/de/dpunkt/myaktion/model/Organizer.java b/src/main/java/de/dpunkt/myaktion/model/Organizer.java index 52cb17caf3b798f7ad4aeecc1d515ed1816db3e4..f55beb4c2a3f7193d6b56bf64b2a3a818fe9eb5f 100644 --- a/src/main/java/de/dpunkt/myaktion/model/Organizer.java +++ b/src/main/java/de/dpunkt/myaktion/model/Organizer.java @@ -19,7 +19,7 @@ import javax.validation.constraints.Size; @NamedQueries({ @NamedQuery(name = Organizer.findByEmail, query = "SELECT o FROM Organizer o WHERE o.email = :email") }) @Entity -public class Organizer { +public class Organizer extends DateEntity { public static final String findByEmail = "Organizer.findByEmail"; @NotNull diff --git a/src/main/java/de/dpunkt/myaktion/resources/CampaignResource.java b/src/main/java/de/dpunkt/myaktion/resources/CampaignResource.java new file mode 100644 index 0000000000000000000000000000000000000000..93be80bd15352ab04be7eb1ce9973dfc36a142da --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/resources/CampaignResource.java @@ -0,0 +1,49 @@ +package de.dpunkt.myaktion.resources; + +import java.util.List; + +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import de.dpunkt.myaktion.model.Campaign; +import de.dpunkt.myaktion.services.CampaignService; + +@Path("/organizer/campaign") +public class CampaignResource { + @Inject + private CampaignService campaignService; + + @GET + @Path("/list") + @Produces(MediaType.APPLICATION_JSON) + public List<Campaign> getAllCampaigns() { + List<Campaign> allCampaigns = campaignService.getAllCampaigns(); + + allCampaigns.forEach(campaign -> { + campaign.setDonations(null); + campaign.setOrganizer(null); + }); + + return allCampaigns; + } + + @DELETE + @Path("/{campaignId}") + public void deleteAktion(@PathParam(value = "campaignId") Long campaignId) { + campaignService.deleteCampaign(campaignId); + } + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Campaign addCampaign(Campaign campaign) { + return campaignService.addCampaign(campaign); + } +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/services/CampaignService.java b/src/main/java/de/dpunkt/myaktion/services/CampaignService.java index 2b3b3b8d27f39a2987b04869e9af9e4012c9a873..2b7e2a04c118ece598b796d3af969e86e4fb2e24 100644 --- a/src/main/java/de/dpunkt/myaktion/services/CampaignService.java +++ b/src/main/java/de/dpunkt/myaktion/services/CampaignService.java @@ -17,11 +17,15 @@ public interface CampaignService { List<Campaign> getAllCampaigns(); - void addCampaign(Campaign campaign); - + Campaign addCampaign(Campaign campaign); + void deleteCampaign(Campaign campaign); + void deleteCampaign(Long campaignId); + void updateCampaign(Campaign campaign); + Campaign getCampaign(Long campaignId); + //---------------------------------------------------------------------------------------------- } \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/services/CampaignServiceBean.java b/src/main/java/de/dpunkt/myaktion/services/CampaignServiceBean.java index 06ffe969258b81eee77cc7f6b6d03bf412237765..e48beb356ae2a1db2d246ed49016dd13d4522b70 100644 --- a/src/main/java/de/dpunkt/myaktion/services/CampaignServiceBean.java +++ b/src/main/java/de/dpunkt/myaktion/services/CampaignServiceBean.java @@ -60,11 +60,14 @@ public class CampaignServiceBean implements CampaignService { // ---------------------------------------------------------------------------------------------- @Override - public void addCampaign(Campaign campaign) { + public Campaign addCampaign(Campaign campaign) { Organizer organizer = getLoggedinOrganizer(); campaign.setOrganizer(organizer); entityManager.persist(campaign); + + return campaign; } + // ---------------------------------------------------------------------------------------------- @Override @@ -80,6 +83,17 @@ public class CampaignServiceBean implements CampaignService { entityManager.remove(managedCampaign); } + public void deleteCampaign(Long campaignId) { + Campaign managedCampaign = getCampaign(campaignId); + entityManager.remove(managedCampaign); + } + + public Campaign getCampaign(Long campaignId) { + Campaign managedCampaign = entityManager.find(Campaign.class, campaignId); + + return managedCampaign; + } + // ---------------------------------------------------------------------------------------------- private BigDecimal getAmountDonatedSoFar(Campaign campaign) { diff --git a/src/main/java/de/dpunkt/myaktion/services/CriteriaCampaignServiceBean.java b/src/main/java/de/dpunkt/myaktion/services/CriteriaCampaignServiceBean.java deleted file mode 100644 index a94cc36681752ce79723f2aa8482b7fbe8bd491c..0000000000000000000000000000000000000000 --- a/src/main/java/de/dpunkt/myaktion/services/CriteriaCampaignServiceBean.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2019 (C) by Julian Horner. - * All Rights Reserved. - */ - -package de.dpunkt.myaktion.services; - -import java.math.BigDecimal; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.ejb.Stateless; -import javax.enterprise.inject.Alternative; -import javax.inject.Inject; -import javax.persistence.EntityManager; -import javax.persistence.TypedQuery; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.ParameterExpression; -import javax.persistence.criteria.Root; - -import de.dpunkt.myaktion.model.Campaign; -import de.dpunkt.myaktion.model.Donation; -import de.dpunkt.myaktion.util.Log.TecLog; - -/** - * @author Julian - */ -@Stateless -@Alternative -public class CriteriaCampaignServiceBean implements CampaignService { - //---------------------------------------------------------------------------------------------- - - @Inject - @TecLog - private Logger logger; - - @Inject - EntityManager entityManager; - - //---------------------------------------------------------------------------------------------- - - @Override - public List<Campaign> getAllCampaigns() { - CriteriaBuilder cb = entityManager.getCriteriaBuilder(); - - CriteriaQuery<Campaign> criteriaQuery = cb.createQuery(Campaign.class); - - Root<Campaign> campaignRoot = criteriaQuery.from(Campaign.class); - criteriaQuery.select(campaignRoot).orderBy(cb.asc(campaignRoot.get("name"))); - - TypedQuery<Campaign> query = entityManager.createQuery(criteriaQuery); - List<Campaign> campaigns = query.getResultList(); - -// campaigns.forEach(campaign -> -// campaign.setAmountDonatedSoFar(new BigDecimal(getAmountDonatedSoFar(campaign)))); - - for (Campaign campaign : campaigns) { - campaign.setAmountDonatedSoFar(new BigDecimal(getAmountDonatedSoFar(campaign))); - } - - logger.log(Level.INFO, "Loaded all campaign entities with criteria query"); - - return campaigns; - } - - //---------------------------------------------------------------------------------------------- - - @Override - public void addCampaign(Campaign campaign) { - entityManager.persist(campaign); - } - - //---------------------------------------------------------------------------------------------- - - @Override - public void updateCampaign(Campaign campaign) { - entityManager.merge(campaign); - } - - //---------------------------------------------------------------------------------------------- - - @Override - public void deleteCampaign(Campaign campaign) { - Campaign managedCampaign = entityManager.find(Campaign.class, campaign.getId()); - entityManager.remove(managedCampaign); - } - - //---------------------------------------------------------------------------------------------- - - private Double getAmountDonatedSoFar(Campaign campaign) { - CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); - CriteriaQuery<Double> criteriaQuery = criteriaBuilder.createQuery(Double.class); - Root<Donation> donation = criteriaQuery.from(Donation.class); - - ParameterExpression<Campaign> campaignParameter = criteriaBuilder.parameter(Campaign.class); - - criteriaQuery.select(criteriaBuilder.sumAsDouble(donation.get("amount"))) - .where(criteriaBuilder.equal(donation.get("campaign"), campaignParameter)); - - TypedQuery<Double> query = entityManager.createQuery(criteriaQuery); - query.setParameter(campaignParameter, campaign); - - Double result = query.getSingleResult(); - if (result == null) - result = 0d; - - return result; - } - - //---------------------------------------------------------------------------------------------- -} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index e8885abfa55c52bf4da9dd6dc04e07cb24e4762e..40a01ac4199693028c20b5e6d241b028b3be9c22 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -16,6 +16,10 @@ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" <web-resource-name>organizer</web-resource-name> <url-pattern>/organizer/*</url-pattern> </web-resource-collection> + <web-resource-collection> + <web-resource-name>organizer access via REST</web-resource-name> + <url-pattern>/rest/organizer/*</url-pattern> + </web-resource-collection> <auth-constraint> <role-name>Organizer</role-name> </auth-constraint> @@ -26,4 +30,8 @@ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" <security-role> <role-name>Organizer</role-name> </security-role> + <servlet-mapping> + <servlet-name>javax.ws.rs.core.Application</servlet-name> + <url-pattern>/rest/*</url-pattern> + </servlet-mapping> </web-app> \ No newline at end of file