diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6fdcc99f4d3119fc3244604c18e85fc5e10caf36 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# NoSQL Datenbank für My-Aktion + +Relationale-Datenbank (H2) ersetzen durch NoSQL-Datenbank (MongoDB). Anpassen von My-Aktion an die neue Datenbank. + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..cde1dbc5c10327f8c691c8e438e44c8081e2a9a7 --- /dev/null +++ b/pom.xml @@ -0,0 +1,57 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>de.dpunkt</groupId> + <artifactId>my-aktion</artifactId> + <version>0.0.1</version> + <packaging>war</packaging> + + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.hibernate.ogm</groupId> + <artifactId>hibernate-ogm-bom</artifactId> + <version>5.4.1.Final</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> + + <dependencies> + <dependency> + <groupId>jakarta.platform</groupId> + <artifactId>jakarta.jakartaee-api</artifactId> + <version>8.0.0</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.primefaces</groupId> + <artifactId>primefaces</artifactId> + <version>8.0</version> + </dependency> + <dependency> + <groupId>org.hibernate.ogm</groupId> + <artifactId>hibernate-ogm-mongodb</artifactId> + </dependency> + </dependencies> + + <build> + <finalName>my-aktion</finalName> + <plugins> + <plugin> + <groupId>org.wildfly.plugins</groupId> + <artifactId>wildfly-maven-plugin</artifactId> + <version>2.0.2.Final</version> + </plugin> + </plugins> + </build> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <maven.compiler.source>1.8</maven.compiler.source> + <maven.compiler.target>1.8</maven.compiler.target> + <failOnMissingWebXml>false</failOnMissingWebXml> + </properties> +</project> \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/controller/DonateMoneyController.java b/src/main/java/de/dpunkt/myaktion/controller/DonateMoneyController.java new file mode 100644 index 0000000000000000000000000000000000000000..6151b3524ce4675e2507fff26039a4d9ca566cb2 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/controller/DonateMoneyController.java @@ -0,0 +1,113 @@ +package de.dpunkt.myaktion.controller; + +import java.io.Serializable; +import java.util.ResourceBundle; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; + +import de.dpunkt.myaktion.model.Donation; +import de.dpunkt.myaktion.model.Donation.Status; +import de.dpunkt.myaktion.services.DonationService; +import de.dpunkt.myaktion.util.Log.FachLog; + +/** + * @author Julian + */ +@ViewScoped +@Named +public class DonateMoneyController implements Serializable { + //---------------------------------------------------------------------------------------------- + + private static final long serialVersionUID = 5493038842003809106L; + + //============================================================================================== + + private String textColor = "000000"; + + private String bgColor = "ffffff"; + + private Long campaignId; + + private Donation donation; + + //---------------------------------------------------------------------------------------------- + + @Inject + private FacesContext facesContext; + + @Inject @FachLog + private Logger logger; + + @Inject + private DonationService donationService; + + //---------------------------------------------------------------------------------------------- + + @PostConstruct + public void init() { + this.donation = new Donation(); + } + + //---------------------------------------------------------------------------------------------- + + public Long getCampaignId() { + return campaignId; + } + + public void setCampaignId(Long campaignId) { + this.campaignId = campaignId; + } + + public Donation getDonation() { + return donation; + } + + public void setDonation(Donation donation) { + this.donation = donation; + } + + public String getTextColor() { + return textColor; + } + + public void setTextColor(String textColor) { + this.textColor = textColor; + } + + public String getBgColor() { + return bgColor; + } + + public void setBgColor(String bgColor) { + this.bgColor = bgColor; + } + + //---------------------------------------------------------------------------------------------- + + public String doDonation() { + getDonation().setStatus(Status.IN_PROCESS); + donationService.addDonation(getCampaignId(), getDonation()); + + final ResourceBundle resourceBundle = + facesContext.getApplication().getResourceBundle(facesContext, "msg"); + + final String msg = resourceBundle.getString("donateMoney.thank_you"); + facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, msg, null)); + + init(); + + logger.log(Level.INFO, "log.donateMoney.thank_you", new + Object[]{getDonation().getDonorName(), getDonation().getAmount()}); + + return Pages.DONATE_MONEY; + } + + //---------------------------------------------------------------------------------------------- +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/controller/EditCampaignController.java b/src/main/java/de/dpunkt/myaktion/controller/EditCampaignController.java new file mode 100644 index 0000000000000000000000000000000000000000..84f09544a8ee70b7ccb6ec34fcd48cb3354819c7 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/controller/EditCampaignController.java @@ -0,0 +1,53 @@ +package de.dpunkt.myaktion.controller; + +import java.io.Serializable; + +import javax.enterprise.event.Event; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; + +import de.dpunkt.myaktion.data.CampaignProducer; +import de.dpunkt.myaktion.model.Campaign; +import de.dpunkt.myaktion.util.Events.Added; +import de.dpunkt.myaktion.util.Events.Updated; + +/** + * @author Julian + */ +@ViewScoped +@Named +public class EditCampaignController implements Serializable { + //---------------------------------------------------------------------------------------------- + + private static final long serialVersionUID = 2815796004558360299L; + + //============================================================================================== + + @Inject + private CampaignProducer campaignProducer; + + @Inject @Added + private Event<Campaign> campaignAddEvent; + + @Inject @Updated + private Event<Campaign> campaignUpdatedEvent; + + //---------------------------------------------------------------------------------------------- + + public String doSave() { + if (campaignProducer.isAddMode()) { + campaignAddEvent.fire(campaignProducer.getSelectedCampaign()); + } else { + campaignUpdatedEvent.fire(campaignProducer.getSelectedCampaign()); + } + + return Pages.LIST_CAMPAIGNS; + } + + public String doCancel() { + return Pages.LIST_CAMPAIGNS; + } + + //---------------------------------------------------------------------------------------------- +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/controller/EditDonationFormController.java b/src/main/java/de/dpunkt/myaktion/controller/EditDonationFormController.java new file mode 100644 index 0000000000000000000000000000000000000000..ad4942527109803a828768f1fa5a7f549b4bdd9d --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/controller/EditDonationFormController.java @@ -0,0 +1,75 @@ +package de.dpunkt.myaktion.controller; + +import java.io.Serializable; + +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.http.HttpServletRequest; + +import de.dpunkt.myaktion.data.CampaignProducer; + +/** + * @author Julian + */ +@ViewScoped +@Named +public class EditDonationFormController implements Serializable { + //---------------------------------------------------------------------------------------------- + + private static final long serialVersionUID = -4210085664588144340L; + + //============================================================================================== + + private String textColor = "000000"; + + private String bgColor = "ffffff"; + + @Inject + private CampaignProducer campaignProducer; + + @Inject + private HttpServletRequest req; + + //---------------------------------------------------------------------------------------------- + + public String getTextColor() { + return textColor; + } + + public void setTextColor(String textColor) { + this.textColor = textColor; + } + + public String getBgColor() { + return bgColor; + } + + public void setBgColor(String bgColor) { + this.bgColor = bgColor; + } + + //---------------------------------------------------------------------------------------------- + + public String doOk() { + return Pages.LIST_CAMPAIGNS; + } + + //---------------------------------------------------------------------------------------------- + + public String getUrl() { + return getAppUrl() + "/" + Pages.DONATE_MONEY + ".jsf" + "?bgColor=" + bgColor + + "&textColor=" + textColor + "&campaignId=" + + campaignProducer.getSelectedCampaign().getId(); + } + + private String getAppUrl() { + String scheme = req.getScheme(); + String serverName = req.getServerName(); + int serverPort = req.getServerPort(); + String contextPath = req.getContextPath(); + return scheme + "://" + serverName + ":" + serverPort + contextPath; + } + + //---------------------------------------------------------------------------------------------- +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/controller/ListCampaignsController.java b/src/main/java/de/dpunkt/myaktion/controller/ListCampaignsController.java new file mode 100644 index 0000000000000000000000000000000000000000..b8c390c40303a2c31bd4b7eac073683c146aeccb --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/controller/ListCampaignsController.java @@ -0,0 +1,73 @@ +package de.dpunkt.myaktion.controller; + +import java.io.Serializable; +import java.util.List; + +import javax.enterprise.event.Event; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; + +import de.dpunkt.myaktion.data.CampaignProducer; +import de.dpunkt.myaktion.model.Campaign; +import de.dpunkt.myaktion.model.Donation; +import de.dpunkt.myaktion.services.DonationService; +import de.dpunkt.myaktion.util.Events.Deleted; + +@ViewScoped +@Named +public class ListCampaignsController implements Serializable { + //---------------------------------------------------------------------------------------------- + + private static final long serialVersionUID = 8693277383648025822L; + + //============================================================================================== + + @Inject + private CampaignProducer campaignProducer; + + private Campaign campaignToDelete; + + @Inject + @Deleted + private Event<Campaign> campaignDeleteEvent; + + @Inject + private DonationService donationService; + + //---------------------------------------------------------------------------------------------- + + public String doAddCampaign() { + campaignProducer.prepareAddCampaign(); + return Pages.EDIT_CAMPAIGN; + } + + public String doEditCampaign(Campaign campaign) { + campaignProducer.prepareEditCampaign(campaign); + return Pages.EDIT_CAMPAIGN; + } + + public String doEditDonationForm(Campaign campaign) { + campaignProducer.setSelectedCampaign(campaign); + return Pages.EDIT_DONATION_FORM; + } + + public String doListDonations(Campaign campaign) { + final List<Donation> donations = donationService.getDonationList(campaign.getId()); + campaign.setDonations(donations); + + campaignProducer.setSelectedCampaign(campaign); + return Pages.LIST_DONATIONS; + } + + public void doDeleteCampaign(Campaign campaign) { + this.campaignToDelete = campaign; + System.out.println("Aktion zum löschen vorgemerkt"); + } + + public void commitDeleteCampaign() { + campaignDeleteEvent.fire(campaignToDelete); + } + + //---------------------------------------------------------------------------------------------- +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/controller/ListDonationsController.java b/src/main/java/de/dpunkt/myaktion/controller/ListDonationsController.java new file mode 100644 index 0000000000000000000000000000000000000000..da4c0a1465122e1775b48d800fb6fd095480717c --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/controller/ListDonationsController.java @@ -0,0 +1,25 @@ +package de.dpunkt.myaktion.controller; + +import java.io.Serializable; + +import javax.faces.view.ViewScoped; +import javax.inject.Named; + +/** + * @author Julian + */ +@ViewScoped +@Named +public class ListDonationsController implements Serializable { + //---------------------------------------------------------------------------------------------- + + private static final long serialVersionUID = 437878972432L; + + //============================================================================================== + + public String doOk() { + return Pages.LIST_CAMPAIGNS; + } + + //---------------------------------------------------------------------------------------------- +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/controller/Pages.java b/src/main/java/de/dpunkt/myaktion/controller/Pages.java new file mode 100644 index 0000000000000000000000000000000000000000..4ee13f283664dd6e6e13acf42473dc3f4f88b346 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/controller/Pages.java @@ -0,0 +1,20 @@ +package de.dpunkt.myaktion.controller; + +/** + * @author Julian + */ +public class Pages { + //---------------------------------------------------------------------------------------------- + + public static final String LIST_CAMPAIGNS = "/organizer/listCampaigns"; + + public static final String EDIT_CAMPAIGN = "/organizer/editCampaign"; + + public static final String EDIT_DONATION_FORM = "/organizer/editDonationForm"; + + public static final String LIST_DONATIONS = "/organizer/listDonations"; + + public static final String DONATE_MONEY = "donateMoney"; + + //---------------------------------------------------------------------------------------------- +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/data/CampaignListProducer.java b/src/main/java/de/dpunkt/myaktion/data/CampaignListProducer.java new file mode 100644 index 0000000000000000000000000000000000000000..362c05be3e822650aee7eeadd8bb032152002905 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/data/CampaignListProducer.java @@ -0,0 +1,72 @@ +package de.dpunkt.myaktion.data; + +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.annotation.PostConstruct; +import javax.enterprise.context.RequestScoped; +import javax.enterprise.event.Observes; +import javax.enterprise.inject.Produces; +import javax.inject.Inject; +import javax.inject.Named; + +import de.dpunkt.myaktion.model.Campaign; +import de.dpunkt.myaktion.services.CampaignService; +import de.dpunkt.myaktion.util.Events.Added; +import de.dpunkt.myaktion.util.Events.Deleted; +import de.dpunkt.myaktion.util.Events.Updated; +import de.dpunkt.myaktion.util.Log.TecLog; + +/** + * @author Julian + */ +@RequestScoped +public class CampaignListProducer { + //---------------------------------------------------------------------------------------------- + + private List<Campaign> campaigns; + + @Inject + @TecLog + private Logger logger; + + //---------------------------------------------------------------------------------------------- + + @Inject + private CampaignService campaignService; + + @PostConstruct + public void init() { + campaigns = campaignService.getAllCampaigns(); + } + + //---------------------------------------------------------------------------------------------- + + @Produces + @Named + public List<Campaign> getCampaigns() { + return campaigns; + } + + //---------------------------------------------------------------------------------------------- + + public void onCampaignAdded(@Observes @Added Campaign campaign) { + campaignService.addCampaign(campaign); + init(); + } + + public void onCampaignDeleted(@Observes @Deleted Campaign campaign) { + campaignService.deleteCampaign(campaign); + init(); + } + + public void onCampaignUpdated(@Observes @Updated Campaign campaign) { + campaignService.updateCampaign(campaign); + init(); + + logger.log(Level.INFO, "Updated campaign with id " + campaign.getId()); + } + + //---------------------------------------------------------------------------------------------- +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/data/CampaignProducer.java b/src/main/java/de/dpunkt/myaktion/data/CampaignProducer.java new file mode 100644 index 0000000000000000000000000000000000000000..3e980ab5880764a1d0f0097db88af94e4141d58e --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/data/CampaignProducer.java @@ -0,0 +1,63 @@ +package de.dpunkt.myaktion.data; + +import java.io.Serializable; + +import javax.enterprise.context.SessionScoped; +import javax.enterprise.inject.Produces; +import javax.inject.Named; + +import de.dpunkt.myaktion.model.Campaign; + +/** + * @author Julian + */ +@SessionScoped +public class CampaignProducer implements Serializable { + //---------------------------------------------------------------------------------------------- + + private static final long serialVersionUID = -1828660647917534556L; + + //============================================================================================== + + private enum Mode { + EDIT, ADD + } + + //---------------------------------------------------------------------------------------------- + + private Campaign campaign; + + private Mode mode; + + //---------------------------------------------------------------------------------------------- + + @Produces + @Named + public Campaign getSelectedCampaign() { + return campaign; + } + + public void setSelectedCampaign(Campaign campaign) { + this.campaign = campaign; + } + + //---------------------------------------------------------------------------------------------- + + @Produces + @Named + public boolean isAddMode() { + return mode == Mode.ADD; + } + + public void prepareAddCampaign() { + this.campaign = new Campaign(); + this.mode = Mode.ADD; + } + + public void prepareEditCampaign(Campaign campaign) { + this.campaign = campaign; + this.mode = Mode.EDIT; + } + + //---------------------------------------------------------------------------------------------- +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/model/Account.java b/src/main/java/de/dpunkt/myaktion/model/Account.java new file mode 100644 index 0000000000000000000000000000000000000000..7f41d80139b0116953c59c3af88a57f24498ef9b --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/model/Account.java @@ -0,0 +1,68 @@ +package de.dpunkt.myaktion.model; + +import javax.persistence.Embeddable; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +/** + * @author Julian + */ +@Embeddable +public class Account extends DateEntity { + //---------------------------------------------------------------------------------------------- + + @NotNull + @Size(min = 5, max = 60, message = "{account.name.size}") + private String name; + + @NotNull + @Size(min = 4, max = 40, message = "{account.nameOfBank.size}") + private String nameOfBank; + + @NotNull + @Pattern(regexp = "[A-Z]{2}[0-9]{2}[A-Z0-9]{12,30}", message = "{account.iban.pattern}") + private String iban; + + //---------------------------------------------------------------------------------------------- + + public Account() { + this(null, null, null); + } + + public Account(String name, String nameOfBank, String iban) { + super(); + + this.name = name; + this.nameOfBank = nameOfBank; + this.iban = iban; + } + + //---------------------------------------------------------------------------------------------- + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getNameOfBank() { + return nameOfBank; + } + + public void setNameOfBank(String nameOfBank) { + this.nameOfBank = nameOfBank; + } + + public String getIban() { + return iban; + } + + public void setIban(String iban) { + this.iban = iban; + } + + //---------------------------------------------------------------------------------------------- +} diff --git a/src/main/java/de/dpunkt/myaktion/model/Campaign.java b/src/main/java/de/dpunkt/myaktion/model/Campaign.java new file mode 100644 index 0000000000000000000000000000000000000000..442777b7093fc68000e5de8085ba885938c7ad24 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/model/Campaign.java @@ -0,0 +1,151 @@ +package de.dpunkt.myaktion.model; + +import java.util.List; + +import javax.persistence.AttributeOverride; +import javax.persistence.AttributeOverrides; +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; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.Transient; +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * @author Julian + */ +@NamedQueries({ + @NamedQuery(name = Campaign.findByOrganizer, + query = "SELECT c FROM Campaign c WHERE c.organizer = :organizer ORDER BY c.name"), + @NamedQuery(name = Campaign.findAll, + query = "SELECT a FROM Campaign a ORDER BY a.name"), + @NamedQuery(name = Campaign.getAmountDonatedSoFar, + query = "SELECT SUM(d.amount) FROM Donation d WHERE d.campaign = :campaign") }) +@XmlRootElement +@Entity +@EntityListeners(EntityCreationListener.class) +public class Campaign extends DateEntity { + //---------------------------------------------------------------------------------------------- + + public static final String findByOrganizer = "Campaign.findByOrganizer"; + + public static final String findAll = "Campaign.findAll"; + + public static final String getAmountDonatedSoFar = "Campaign.getAmountDonatedSoFar"; + + //============================================================================================== + + @GeneratedValue + @Id + private Long id; + + @NotNull + @Size(min = 4, max = 30, message = "{campaign.name.size}") + private String name; + + @NotNull(message = "{campaign.targetAmount.notNull}") + @DecimalMin(value = "10.00", message = "{campaign.targetAmount.decimalMin}") + private Double targetAmount; + + @NotNull(message = "{campaign.donationMinimum.notNull}") + @DecimalMin(value = "1.00", message = "{campaign.donationMinimum.decimalMin}") + private Double donationMinimum; + + @Transient + private Double amountDonatedSoFar; + + @Embedded + @AttributeOverrides({ + @AttributeOverride(name = "name", column = @Column(name = "accountName")) }) + private Account account; + + @OneToMany(mappedBy = "campaign", cascade = CascadeType.REMOVE) + private List<Donation> donations; + + @ManyToOne + private Organizer organizer; + + //---------------------------------------------------------------------------------------------- + + public Campaign() { + account = new Account(); + } + + //---------------------------------------------------------------------------------------------- + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Double getTargetAmount() { + return targetAmount; + } + + public void setTargetAmount(Double targetAmount) { + this.targetAmount = targetAmount; + } + + public Double getDonationMinimum() { + return donationMinimum; + } + + public void setDonationMinimum(Double donationMinimum) { + this.donationMinimum = donationMinimum; + } + + public Double getAmountDonatedSoFar() { + return amountDonatedSoFar; + } + + public void setAmountDonatedSoFar(Double amountDonatedSoFar) { + this.amountDonatedSoFar = amountDonatedSoFar; + } + + public Account getAccount() { + return account; + } + + public void setAccount(Account account) { + this.account = account; + } + + public List<Donation> getDonations() { + return donations; + } + + public void setDonations(List<Donation> donations) { + this.donations = donations; + } + + public Organizer getOrganizer() { + return organizer; + } + + public void setOrganizer(Organizer organizer) { + this.organizer = organizer; + } + + //---------------------------------------------------------------------------------------------- +} diff --git a/src/main/java/de/dpunkt/myaktion/model/DateEntity.java b/src/main/java/de/dpunkt/myaktion/model/DateEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..ee669af23f1b6700d97d3e2d118fb7ca68783f71 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/model/DateEntity.java @@ -0,0 +1,21 @@ +package de.dpunkt.myaktion.model; + +import java.util.Date; + +/** + * @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 new file mode 100644 index 0000000000000000000000000000000000000000..7a719131856b4a207a6952298e39dd307b98d701 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/model/Donation.java @@ -0,0 +1,124 @@ +package de.dpunkt.myaktion.model; + +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * @author Julian + */ +@Entity +@NamedQueries({ @NamedQuery(name = Donation.findByStatus, + query = "SELECT d FROM Donation d WHERE d.status = :status") }) +public class Donation extends DateEntity { + //---------------------------------------------------------------------------------------------- + + public static final String findByStatus = "Donation.findByStatus"; + + //============================================================================================== + + @GeneratedValue + @Id + private Long id; + + @NotNull(message = "{donation.amount.notNull}") + @DecimalMin(value = "1.00", message = "{donation.amount.decimalMin}") + private Double amount; + + @NotNull + @Size(min = 5, max = 40, message = "{donation.donorName.size}") + private String donorName; + + @NotNull + private Boolean receiptRequested; + + @NotNull + private Status status; + + @NotNull + @Embedded + private Account account; + + @NotNull + @ManyToOne + private Campaign campaign; + + //---------------------------------------------------------------------------------------------- + + public enum Status { + TRANSFERRED, IN_PROCESS; + } + + //---------------------------------------------------------------------------------------------- + + public Donation() { + this.account = new Account(); + } + + //---------------------------------------------------------------------------------------------- + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Double getAmount() { + return amount; + } + + public void setAmount(Double amount) { + this.amount = amount; + } + + public String getDonorName() { + return donorName; + } + + public void setDonorName(String donorName) { + this.donorName = donorName; + } + + public Boolean getReceiptRequested() { + return receiptRequested; + } + + public void setReceiptRequested(Boolean receiptRequested) { + this.receiptRequested = receiptRequested; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + public Account getAccount() { + return account; + } + + public void setAccount(Account account) { + this.account = account; + } + + public Campaign getCampaign() { + return campaign; + } + + public void setCampaign(Campaign campaign) { + this.campaign = campaign; + } + + //---------------------------------------------------------------------------------------------- +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..c0cbbc664937d0b8abbb5dbb45e5014c38ff8dd2 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/model/Organizer.java @@ -0,0 +1,86 @@ +package de.dpunkt.myaktion.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +/** + * @author Julian + */ +@NamedQueries({ @NamedQuery(name = Organizer.findByEmail, + query = "SELECT o FROM Organizer o WHERE o.email = :email") }) +@Entity +public class Organizer extends DateEntity { + //---------------------------------------------------------------------------------------------- + + public static final String findByEmail = "Organizer.findByEmail"; + + //============================================================================================== + + @GeneratedValue + @Id + private Long id; + + @NotNull + @Size(min = 3, max = 20, message = "{organizer.firstName.size}") + private String firstName; + + @NotNull + @Size(min = 3, max = 30, message = "{organizer.lastName.size}") + private String lastName; + + @Pattern(regexp = ".+@.+", message = "{organizer.email.pattern}") + private String email; + + @NotNull + private String password; + + //---------------------------------------------------------------------------------------------- + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + //---------------------------------------------------------------------------------------------- +} \ No newline at end of file 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..e549dcc7e4089d34ffaab126be6e8eb6b5d8e105 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/resources/CampaignResource.java @@ -0,0 +1,80 @@ +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.PUT; +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, MediaType.APPLICATION_XML }) + 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); + } + + //---------------------------------------------------------------------------------------------- + + @PUT + @Path("/{campaignId}") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Campaign updateCampaign(@PathParam(value = "campaignId") Long campaignId, + Campaign newCampaign) { + Campaign campaign = campaignService.getCampaign(campaignId); + campaign.setName(newCampaign.getName()); + campaign.setDonationMinimum(newCampaign.getDonationMinimum()); + campaign.setTargetAmount(newCampaign.getTargetAmount()); + + newCampaign = campaignService.updateCampaign(campaign); + newCampaign.setDonations(null); + newCampaign.setOrganizer(null); + + return newCampaign; + } + + //---------------------------------------------------------------------------------------------- +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/resources/DonationResource.java b/src/main/java/de/dpunkt/myaktion/resources/DonationResource.java new file mode 100644 index 0000000000000000000000000000000000000000..d54a3c724e55679d41ac2001614f3244493777e2 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/resources/DonationResource.java @@ -0,0 +1,84 @@ +package de.dpunkt.myaktion.resources; + +import java.util.List; + +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.FormParam; +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 javax.ws.rs.core.Response; + +import de.dpunkt.myaktion.model.Account; +import de.dpunkt.myaktion.model.Donation; +import de.dpunkt.myaktion.model.Donation.Status; +import de.dpunkt.myaktion.services.DonationService; +import de.dpunkt.myaktion.services.exceptions.ObjectNotFoundException; + +@Path("/") +public class DonationResource { + //---------------------------------------------------------------------------------------------- + + @Inject + private DonationService donationService; + + //---------------------------------------------------------------------------------------------- + + @GET + @Path("/organizer/donation/list/{campaignId}") + @Produces(MediaType.APPLICATION_JSON) + public List<Donation> getDonationList(@PathParam(value = "campaignId") Long campaignId) { + List<Donation> donations = donationService.getDonationList(campaignId); + donations.forEach(donation -> donation.setCampaign(null)); + + return donations; + } + + //---------------------------------------------------------------------------------------------- + + @POST + @Path("/donation/{campaignId}") + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + public void addDonation(@PathParam(value = "campaignId") Long campaignId, + @FormParam(value = "donorName") String donorName, + @FormParam(value = "amount") Double amount, @FormParam(value = "iban") String iban, + @FormParam(value = "nameOfBank") String nameOfBank, + @FormParam(value = "receiptRequested") Boolean receiptRequested) { + Donation donation = new Donation(); + donation.setDonorName(donorName); + donation.setAmount(amount); + + Account account = new Account(); + account.setIban(iban); + account.setName(donorName); + account.setNameOfBank(nameOfBank); + + donation.setAccount(account); + donation.setReceiptRequested(receiptRequested); + donation.setStatus(Status.IN_PROCESS); + + donationService.addDonation(campaignId, donation); + } + + //---------------------------------------------------------------------------------------------- + + @GET + @Path("/donation/list/{campaignId}") + @Produces(MediaType.APPLICATION_JSON) + public Response getDonationListPublic(@PathParam(value = "campaignId") Long campaignId) { + List<Donation> donations; + try { + donations = donationService.getDonationListPublic(campaignId); + + return Response.ok(donations).build(); + } catch (ObjectNotFoundException e) { + return Response.status(javax.ws.rs.core.Response.Status.NOT_FOUND).build(); + } + } + + //---------------------------------------------------------------------------------------------- +} diff --git a/src/main/java/de/dpunkt/myaktion/scheduler/SchedulerBean.java b/src/main/java/de/dpunkt/myaktion/scheduler/SchedulerBean.java new file mode 100644 index 0000000000000000000000000000000000000000..b6bc8df234a44dd7a84e5c8df36df2597ab5aab7 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/scheduler/SchedulerBean.java @@ -0,0 +1,21 @@ +package de.dpunkt.myaktion.scheduler; + +import javax.ejb.Schedule; +import javax.ejb.Singleton; +import javax.inject.Inject; + +import de.dpunkt.myaktion.services.DonationService; + +/** + * @author Julian + */ +@Singleton +public class SchedulerBean { + @Inject + private DonationService donationService; + + @Schedule(hour = "*", minute = "*/5", persistent = false) + public void doTransferDonations() { + donationService.transferDonations(); + } +} \ 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 new file mode 100644 index 0000000000000000000000000000000000000000..69b38e0c865c92afac3e64761ecd5f4ddb6af625 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/services/CampaignService.java @@ -0,0 +1,26 @@ +package de.dpunkt.myaktion.services; + +import java.util.List; + +import de.dpunkt.myaktion.model.Campaign; + +/** + * @author Julian + */ +public interface CampaignService { + //---------------------------------------------------------------------------------------------- + + List<Campaign> getAllCampaigns(); + + Campaign addCampaign(Campaign campaign); + + void deleteCampaign(Campaign campaign); + + void deleteCampaign(Long campaignId); + + Campaign 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 new file mode 100644 index 0000000000000000000000000000000000000000..d6ff8513df08b13c5944061a4ec684242418c240 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/services/CampaignServiceBean.java @@ -0,0 +1,124 @@ +package de.dpunkt.myaktion.services; + +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.annotation.Resource; +import javax.annotation.security.RolesAllowed; +import javax.ejb.SessionContext; +import javax.ejb.Stateless; +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; + +import org.hibernate.ogm.OgmSession; + +import de.dpunkt.myaktion.model.Campaign; +import de.dpunkt.myaktion.model.Organizer; +import de.dpunkt.myaktion.util.Log.TecLog; + +/** + * @author Julian + */ +@RolesAllowed("Organizer") +@Stateless +public class CampaignServiceBean implements CampaignService { + // ---------------------------------------------------------------------------------------------- + + @Inject + @TecLog + private Logger logger; + + @Inject + EntityManager entityManager; + + @Resource + private SessionContext sessionContext; + + // ---------------------------------------------------------------------------------------------- + + @Override + public List<Campaign> getAllCampaigns() { + TypedQuery<Campaign> query = + entityManager.createNamedQuery(Campaign.findByOrganizer, Campaign.class); + query.setParameter("organizer", getLoggedinOrganizer()); + + List<Campaign> campaigns = query.getResultList(); + + for (Campaign campaign : campaigns) { + campaign.setAmountDonatedSoFar(getAmountDonatedSoFar(campaign)); + } + + logger.log(Level.INFO, + "Loaded all campaign entities with query " + Campaign.findByOrganizer); + + return campaigns; + } + + // ---------------------------------------------------------------------------------------------- + + @Override + public Campaign addCampaign(Campaign campaign) { + Organizer organizer = getLoggedinOrganizer(); + + campaign.setOrganizer(organizer); + entityManager.persist(campaign); + + return campaign; + } + + // ---------------------------------------------------------------------------------------------- + + @Override + public Campaign updateCampaign(Campaign campaign) { + return entityManager.merge(campaign); + } + + // ---------------------------------------------------------------------------------------------- + + @Override + public void deleteCampaign(Campaign campaign) { + Campaign managedCampaign = entityManager.find(Campaign.class, campaign.getId()); + entityManager.remove(managedCampaign); + } + + @Override + public void deleteCampaign(Long campaignId) { + Campaign managedCampaign = getCampaign(campaignId); + entityManager.remove(managedCampaign); + } + + @Override + public Campaign getCampaign(Long campaignId) { + Campaign managedCampaign = entityManager.find(Campaign.class, campaignId); + + return managedCampaign; + } + + // ---------------------------------------------------------------------------------------------- + + private Double getAmountDonatedSoFar(Campaign campaign) { + OgmSession session = entityManager.unwrap(OgmSession.class); + + Double result = session.createNamedQuery(Campaign.getAmountDonatedSoFar, Double.class) + .setParameter("campaign", campaign).uniqueResult(); + if (result == null) + result = 0d; + + return result; + } + + // ---------------------------------------------------------------------------------------------- + + private Organizer getLoggedinOrganizer() { + String organizerEmail = sessionContext.getCallerPrincipal().getName(); + + Organizer organizer = entityManager.createNamedQuery(Organizer.findByEmail, Organizer.class) + .setParameter("email", organizerEmail).getSingleResult(); + + return organizer; + } + + // ---------------------------------------------------------------------------------------------- +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/services/DonationService.java b/src/main/java/de/dpunkt/myaktion/services/DonationService.java new file mode 100644 index 0000000000000000000000000000000000000000..3bf753553a1086b39afd174729b72764eef770b0 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/services/DonationService.java @@ -0,0 +1,23 @@ +package de.dpunkt.myaktion.services; + +import java.util.List; + +import de.dpunkt.myaktion.model.Donation; +import de.dpunkt.myaktion.services.exceptions.ObjectNotFoundException; + +/** + * @author Julian + */ +public interface DonationService { + //---------------------------------------------------------------------------------------------- + + List<Donation> getDonationList(Long campaignId); + + void addDonation(Long campaignId, Donation donation); + + void transferDonations(); + + List<Donation> getDonationListPublic(Long campaignId) throws ObjectNotFoundException; + + //---------------------------------------------------------------------------------------------- +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/services/DonationServiceBean.java b/src/main/java/de/dpunkt/myaktion/services/DonationServiceBean.java new file mode 100644 index 0000000000000000000000000000000000000000..c86c0e0e5f40e5dcd4ef151f38996e808516b9cb --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/services/DonationServiceBean.java @@ -0,0 +1,94 @@ +package de.dpunkt.myaktion.services; + +import java.util.List; +import java.util.function.Function; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.stream.Collectors; + +import javax.annotation.security.PermitAll; +import javax.annotation.security.RolesAllowed; +import javax.ejb.Stateless; +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; + +import de.dpunkt.myaktion.model.Campaign; +import de.dpunkt.myaktion.model.Donation; +import de.dpunkt.myaktion.model.Donation.Status; +import de.dpunkt.myaktion.services.exceptions.ObjectNotFoundException; +import de.dpunkt.myaktion.util.Log.TecLog; + +/** + * @author Julian + */ +@Stateless +public class DonationServiceBean implements DonationService { + //---------------------------------------------------------------------------------------------- + + @Inject + EntityManager entityManager; + + @Inject + @TecLog + private Logger logger; + + //---------------------------------------------------------------------------------------------- + + @RolesAllowed("Organizer") + @Override + public List<Donation> getDonationList(Long campaignId) { + Campaign managedCampaign = entityManager.find(Campaign.class, campaignId); + List<Donation> donations = managedCampaign.getDonations(); + + donations.size(); // To avoid Lazy loading exception + + return donations; + } + + @PermitAll + @Override + public void addDonation(Long campaignId, Donation donation) { + Campaign managedCampaign = entityManager.find(Campaign.class, campaignId); + donation.setCampaign(managedCampaign); + + entityManager.persist(donation); + } + + @PermitAll + @Override + public void transferDonations() { + logger.log(Level.INFO, "log.transferDonation.start"); + + TypedQuery<Donation> query = + entityManager.createNamedQuery(Donation.findByStatus, Donation.class); + query.setParameter("status", Status.IN_PROCESS); + + List<Donation> donations = query.getResultList(); + donations.forEach(donation -> donation.setStatus(Status.TRANSFERRED)); + + logger.log(Level.INFO, "log.transferDonation.done", new Object[] { donations.size() }); + } + + @PermitAll + @Override + public List<Donation> getDonationListPublic(Long campaignId) throws ObjectNotFoundException { + Campaign managedCampaign = entityManager.find(Campaign.class, campaignId); + if (managedCampaign == null) { + throw new ObjectNotFoundException(); + } + + List<Donation> donations = managedCampaign.getDonations(); + final Function<Donation, Donation> donationFilter = donation -> { + Donation filtered = new Donation(); + filtered.setAmount(donation.getAmount()); + filtered.setDonorName(donation.getDonorName()); + + return filtered; + }; + + return donations.stream().map(donationFilter).collect(Collectors.toList()); + } + + //---------------------------------------------------------------------------------------------- +} diff --git a/src/main/java/de/dpunkt/myaktion/services/exceptions/ObjectNotFoundException.java b/src/main/java/de/dpunkt/myaktion/services/exceptions/ObjectNotFoundException.java new file mode 100644 index 0000000000000000000000000000000000000000..31501a27b4d82dbbacec82ddc78fbeff055a5005 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/services/exceptions/ObjectNotFoundException.java @@ -0,0 +1,5 @@ +package de.dpunkt.myaktion.services.exceptions; + +public class ObjectNotFoundException extends Exception { + private static final long serialVersionUID = 879959260339550219L; +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/util/Events.java b/src/main/java/de/dpunkt/myaktion/util/Events.java new file mode 100644 index 0000000000000000000000000000000000000000..3e3f2f44570ca24e76d4d4f54f183d6b35ec2021 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/util/Events.java @@ -0,0 +1,30 @@ +package de.dpunkt.myaktion.util; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.inject.Qualifier; + +/** + * @author Julian + */ +public class Events { + @Qualifier + @Target({ FIELD, PARAMETER }) + @Retention(RUNTIME) + public @interface Added { } + + @Qualifier + @Target({ FIELD, PARAMETER }) + @Retention(RUNTIME) + public @interface Deleted { } + + @Qualifier + @Target({ FIELD, PARAMETER }) + @Retention(RUNTIME) + public @interface Updated { } +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/util/Log.java b/src/main/java/de/dpunkt/myaktion/util/Log.java new file mode 100644 index 0000000000000000000000000000000000000000..4853c7089aa7a8a377a6eb469985e1b472b4c847 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/util/Log.java @@ -0,0 +1,26 @@ +package de.dpunkt.myaktion.util; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.inject.Qualifier; + +/** + * @author Julian + */ +public class Log { + @Qualifier + @Target({ FIELD, PARAMETER, METHOD }) + @Retention(RUNTIME) + public @interface FachLog { } + + @Qualifier + @Target({ FIELD, PARAMETER, METHOD }) + @Retention(RUNTIME) + public @interface TecLog { } +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/util/Resources.java b/src/main/java/de/dpunkt/myaktion/util/Resources.java new file mode 100644 index 0000000000000000000000000000000000000000..bdd90ef498631219d01991c4604d541fa12a94d0 --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/util/Resources.java @@ -0,0 +1,42 @@ +package de.dpunkt.myaktion.util; + +import java.util.logging.Logger; + +import javax.enterprise.context.Dependent; +import javax.enterprise.context.RequestScoped; +import javax.enterprise.inject.Produces; +import javax.enterprise.inject.spi.InjectionPoint; +import javax.faces.context.FacesContext; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import de.dpunkt.myaktion.util.Log.FachLog; +import de.dpunkt.myaktion.util.Log.TecLog; + +/** + * @author Julian + */ +@Dependent +public class Resources { + @Produces + @PersistenceContext + private EntityManager em; + + @Produces @FachLog + public Logger produceFachLog(InjectionPoint injectionPoint) { + return Logger.getLogger( + "FachLog: " + injectionPoint.getMember().getDeclaringClass().getName(), "messages"); + } + + @Produces @TecLog + public Logger produceTecLog(InjectionPoint injectionPoint) { + return Logger.getLogger( + "TecLog: " + injectionPoint.getMember().getDeclaringClass().getName(), "messages"); + } + + @Produces + @RequestScoped + public FacesContext produceFacesContext() { + return FacesContext.getCurrentInstance(); + } +} \ No newline at end of file diff --git a/src/main/java/de/dpunkt/myaktion/util/TransactionInterceptor.java b/src/main/java/de/dpunkt/myaktion/util/TransactionInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..eb79c7a7490c7b989b1941b37813fc9ece158afc --- /dev/null +++ b/src/main/java/de/dpunkt/myaktion/util/TransactionInterceptor.java @@ -0,0 +1,35 @@ +package de.dpunkt.myaktion.util; + +import javax.annotation.Resource; +import javax.interceptor.AroundInvoke; +import javax.interceptor.InvocationContext; +import javax.transaction.UserTransaction; + +/** + * @author Julian + */ +public class TransactionInterceptor { + @Resource + private UserTransaction transaction; + + @AroundInvoke + public Object doTransaction(InvocationContext ctx) throws Exception { + try { + transaction.begin(); + + Object ret = ctx.proceed(); + + transaction.commit(); + + return ret; + } catch (Exception e) { + try { + transaction.rollback(); + System.err.println("addCampaign – Transaktion wurde zurückgerollt."); + } catch (Exception e2) { + System.err.println("addCampaign – Fehler beim Zurückrollen von Transaktion."); + } + throw e; + } + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000000000000000000000000000000000..502f486e102318c514a1bff0296caf7efaa9fd9d --- /dev/null +++ b/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<persistence xmlns="http://java.sun.com/xml/ns/persistence" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_1.xsd" + version="2.1"> + + <persistence-unit name="primary" + transaction-type="JTA"> + <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider> + + <class>de.dpunkt.myaktion.model.Account</class> + <class>de.dpunkt.myaktion.model.Campaign</class> + <class>de.dpunkt.myaktion.model.Donation</class> + <class>de.dpunkt.myaktion.model.Organizer</class> + <exclude-unlisted-classes>true</exclude-unlisted-classes> + + <properties> + <property name="hibernate.transaction.jta.platform" + value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" /> + <property name="hibernate.ogm.datastore.database" + value="my-aktion" /> + <property name="hibernate.ogm.datastore.host" + value="localhost" /> + <property name="hibernate.ogm.datastore.provider" + value="MONGODB" /> + </properties> + </persistence-unit> +</persistence> \ No newline at end of file diff --git a/src/main/resources/ValidationMessages_de.properties b/src/main/resources/ValidationMessages_de.properties new file mode 100644 index 0000000000000000000000000000000000000000..334b1b301f6ce1fe0fceeeb008bdcceeb80df160 --- /dev/null +++ b/src/main/resources/ValidationMessages_de.properties @@ -0,0 +1,22 @@ +# resource file for bean validation +# campaign model +campaign.name.size=Der Name einer Aktion muss min. {min} und darf max. {max} Zeichen lang sein. +campaign.targetAmount.notNull=Bitte ein Spendenziel angeben. +campaign.targetAmount.decimalMin=Das Spendenziel für die Aktion muss min. {value} Euro sein. +campaign.donationMinimum.notNull=Bitte einen Spendenbetrag angeben. +campaign.donationMinimum.decimalMin=Der Spendenbetrag muss min. {value} Euro sein. + +# donation model +donation.amount.notNull=Bitte einen Spendenbetrag angeben. +donation.amount.decimalMin=Der Spendenbetrag muss min. {value} Euro sein. +donation.donorName.size=Der Name eines Spenders muss min. {min} und darf max. {max} Zeichen lang sein. + +# account model +account.name.size=Der Name des Besitzers eines Kontos muss min. {min} und darf max. {max} Zeichen lang sein. +account.nameOfBank.size=Der Name einer Bank muss min. {min} und darf max. {max} Zeichen lang sein. +account.iban.pattern=Eine IBAN besteht aus zwei Buchstaben, gefolgt von zwei Ziffern und 12 bis 30 alphanumerischen Zeichen. + +# organizer model +organizer.firstName.size=Der Vorname eines Organisators muss min. {min} und darf max. {max} Zeichen lang sein. +organizer.lastName.size=Der Nachname eines Organisators muss min. {min} und darf max. {max} Zeichen lang sein. +organizer.email.pattern=Bitte eine valide E-Mail-Adresse angeben. \ No newline at end of file diff --git a/src/main/resources/ValidationMessages_en.properties b/src/main/resources/ValidationMessages_en.properties new file mode 100644 index 0000000000000000000000000000000000000000..0bd4fe3a4ebb6fa622eb31dac2704ac1cb079f84 --- /dev/null +++ b/src/main/resources/ValidationMessages_en.properties @@ -0,0 +1,22 @@ +# resource file for bean validation +# campaign model +campaign.name.size=The name of a campaign must be between {min} and {max} characters long. +campaign.targetAmount.notNull=Please specify a target amount. +campaign.targetAmount.decimalMin=The target amount for the campaign must be at least {value} Euro. +campaign.donationMinimum.notNull=Please specify a donation minimum. +campaign.donationMinimum.decimalMin=The donation minimum must be at least {value} Euro. + +# donation model +donation.amount.notNull=Please specify a donation amount. +donation.amount.decimalMin=The donation amount must be at least {value} Euro. +donation.donorName.size=The donor's name must be between {min} and {max} characters long. + +# account model +account.name.size=The name of the account owner must be between {min} and {max} characters long. +account.nameOfBank.size=The name of a bank must be between {min} and {max} characters long. +account.iban.pattern=An IBAN contains of two letters, followed by two digits and between 12 and 30 alphanumeric characters. + +# organizer model +organizer.firstName.size=The first name of an organizer must be between {min} and {max} characters long. +organizer.lastName.size=The last name of an organizer must be between {min} and {max} characters long. +organizer.email.pattern=Please enter a valid email address. \ No newline at end of file diff --git a/src/main/resources/messages_de.properties b/src/main/resources/messages_de.properties new file mode 100644 index 0000000000000000000000000000000000000000..1059e8d85b74e9ed7f11baa8ba041ae483c80b4f --- /dev/null +++ b/src/main/resources/messages_de.properties @@ -0,0 +1,74 @@ +# index.xhtml +welcome.title= Workshop Java EE 7 +welcome.text=Java EE 7: Willkommen zu unserem Workshop! + +# listCampaigns.xhtml +listCampaigns.my_campaigns=Meine Aktionen +listCampaigns.name=Name +listCampaigns.target_amount=Spendenziel +listCampaigns.donated_so_far=bisher gespendet +listCampaigns.edit=Editieren +listCampaigns.list_donations=Spendenliste +listCampaigns.form=Formular +listCampaigns.add_campaign=Aktion hinzufügen +listCampaigns.ask_delete_campaign=Aktion wirklich löschen? +listCampaigns.delete_campaign=Aktion löschen +listCampaigns.yes=Ja +listCampaigns.no=Nein + +# editCampaign.xhtml +editCampaign.add_new_campaign=Neue Aktion anlegen +editCampaign.edit_campaign=Aktionsdaten editieren +editCampaign.general=Allgemein +editCampaign.name=Name +editCampaign.name_of_the_campaign=Name der Spendenaktion +editCampaign.target_amount=Spendenziel +editCampaign.donation_amount=Spendenbetrag +editCampaign.bank_account=Bankverbindung +editCampaign.iban=IBAN +editCampaign.name_of_bank=Name der Bank +editCampaign.save=Speichern +editCampaign.cancel=Abbrechen + +# listDonations.xhtml +listDonations.donation_list=Spenderliste +listDonations.beneficiary_account=Empfängerkonto +listDonations.iban=IBAN +listDonations.name=Name +listDonations.name_of_bank=Name der Bank +listDonations.donation_amount=Spendenbetrag +listDonations.receipt=Quittung +listDonations.yes=ja +listDonations.no=nein +listDonations.status=Status +listDonations.status.TRANSFERRED=überwiesen +listDonations.status.IN_PROCESS=in Bearbeitung + +# editDonationForm.xhtml +editDonationForm.edit_donation_form=Spendenformular bearbeiten +editDonationForm.background_color=Hintergrundfarbe +editDonationForm.text_color=Textfarbe +editDonationForm.form_url=URL des Formulars +editDonationForm.update_url=Aktualisieren der URL + +# donateMoney.xhtml +donateMoney.donate_money=Geld spenden +donateMoney.name=Name +donateMoney.iban=IBAN +donateMoney.name_of_bank=Name der Bank +donateMoney.donation_amount=Spendenbetrag +donateMoney.i_want_a_receipt=Ja, ich möchte eine Spendenquittung +donateMoney.donate=Spenden +donateMoney.thank_you=Vielen Dank für die Spende! + +# logger +log.donateMoney.thank_you={0} hat {1} Euro gespendet. +log.transferDonation.start=Zu bearbeitende Spenden werden überwiesen. +log.transferDonation.done=Es wurden {0} Spenden überwiesen. + +# login.xhtml +login.email=E-Mail +login.password=Passwort +login.login=Anmelden +login.errorMsg=Passwort oder User sind falsch + diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties new file mode 100644 index 0000000000000000000000000000000000000000..7ab66a6ba41d41e7916f892b0d2731a741309a2f --- /dev/null +++ b/src/main/resources/messages_en.properties @@ -0,0 +1,73 @@ +# index.xhtml +welcome.title=Workshop Java EE 7 +welcome.text=Java EE 7: Welcome to our Workshop! + +# listCampaigns.xhtml +listCampaigns.my_campaigns=My campaigns +listCampaigns.name=Name +listCampaigns.target_amount=Target amount +listCampaigns.donated_so_far=Donated so far +listCampaigns.edit=Edit +listCampaigns.list_donations=List donations +listCampaigns.form=Form +listCampaigns.add_campaign=Add campaign +listCampaigns.ask_delete_campaign=Really delete campaign? +listCampaigns.delete_campaign=Delete campaign +listCampaigns.yes=Yes +listCampaigns.no=No + +# editCampaign.xhtml +editCampaign.add_new_campaign=Add a new campaign +editCampaign.edit_campaign=Edit campaign +editCampaign.general=General +editCampaign.name=Name +editCampaign.name_of_the_campaign=Name of the campaign +editCampaign.target_amount=Target amount +editCampaign.donation_amount=Donation amount +editCampaign.bank_account=Bank account +editCampaign.iban=IBAN +editCampaign.name_of_bank=Name of Bank +editCampaign.save=Save +editCampaign.cancel=Cancel + +# listDonations.xhtml +listDonations.donation_list=List of donations +listDonations.beneficiary_account=Beneficiary account +listDonations.iban=IBAN +listDonations.name=Name +listDonations.name_of_bank=Name of Bank +listDonations.donation_amount=Donation amount +listDonations.receipt=Receipt +listDonations.yes=yes +listDonations.no=no +listDonations.status=Status +listDonations.status.TRANSFERRED=transferred +listDonations.status.IN_PROCESS=in process + +# editDonationForm.xhtml +editDonationForm.edit_donation_form=Edit donation form +editDonationForm.background_color=Background color +editDonationForm.text_color=Text color +editDonationForm.form_url=Form URL +editDonationForm.update_url=Update URL + +# donateMoney.xhtml +donateMoney.donate_money=Donate money +donateMoney.name=Name +donateMoney.iban=IBAN +donateMoney.name_of_bank=Name of bank +donateMoney.donation_amount=Donation amount +donateMoney.i_want_a_receipt=Yes, I would like a donation receipt +donateMoney.donate=Donate +donateMoney.thank_you=Thank you for your donation! + +# logger +log.donateMoney.thank_you={0} has donated {1} Euro. +log.transferDonation.start=Starting transfering donations. +log.transferDonation.done={0} donations have been transfered. + +# login.xhtml +login.email=Email +login.password=Password +login.login=Log in +login.errorMsg=Password or user are wrong \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/faces-config.xml b/src/main/webapp/WEB-INF/faces-config.xml new file mode 100644 index 0000000000000000000000000000000000000000..c5fd52797c166b4e7de1919e28f8e37996ef8453 --- /dev/null +++ b/src/main/webapp/WEB-INF/faces-config.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<faces-config version="2.3" + xmlns="http://xmlns.jcp.org/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee + http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd"> + <application> + <locale-config> + <default-locale>de</default-locale> + <supported-locale>en</supported-locale> + <supported-locale>de</supported-locale> + </locale-config> + <resource-bundle> + <base-name>messages</base-name> + <var>msg</var> + </resource-bundle> + </application> +</faces-config> \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jboss-web.xml b/src/main/webapp/WEB-INF/jboss-web.xml new file mode 100644 index 0000000000000000000000000000000000000000..91d6a72f47782c891e8f5180d38bcc5a5d0fa83d --- /dev/null +++ b/src/main/webapp/WEB-INF/jboss-web.xml @@ -0,0 +1,3 @@ +<jboss-web> + <security-domain>mongo-auth</security-domain> +</jboss-web> \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..ce63a7056615274144fa5dbb14dc896a1da872e2 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee + http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" + version="3.1"> + <login-config> + <auth-method>FORM</auth-method> + <form-login-config> + <form-login-page>/login.jsf</form-login-page> + <form-error-page>/loginError.jsf</form-error-page> + </form-login-config> + </login-config> + <security-constraint> + <web-resource-collection> + <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> + <user-data-constraint> + <transport-guarantee>CONFIDENTIAL</transport-guarantee> + </user-data-constraint> + </security-constraint> + <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 diff --git a/src/main/webapp/contracts/de/screen.css b/src/main/webapp/contracts/de/screen.css new file mode 100644 index 0000000000000000000000000000000000000000..fd7253dd9842d160bd4c35fc55fe499db947d679 --- /dev/null +++ b/src/main/webapp/contracts/de/screen.css @@ -0,0 +1,35 @@ +body { + margin: 0; + padding: 0; + background-color: #EAECEE; + font-family: Verdana, sans-serif; + font-size: 0.9em; +} + +#container { + margin: 0 auto; + padding: 0 20px 10px 20px; + border: 1px solid #666666; + width: 865px; + padding-top: 10px; +} + +#header { + font-size: 1.3em; + border: 1px solid #666666; + background: #EAECEE; + padding: 0 15px 5px 15px; + margin-bottom: 50px; +} + +#footer { + clear: both; + text-align: center; + color: #666666; + font-size: 0.85em; + padding: 3em 0 0 0; +} + +h2 { + font-size: 1.2em; +} \ No newline at end of file diff --git a/src/main/webapp/contracts/de/template.xhtml b/src/main/webapp/contracts/de/template.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..17cdc03c4046c20d800b054bf0109c724d7ff40f --- /dev/null +++ b/src/main/webapp/contracts/de/template.xhtml @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:h="http://xmlns.jcp.org/jsf/html" + xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> +<h:head> + <title>My-Aktion</title> + <meta charset="utf-8" /> + <h:outputStylesheet name="/screen.css" /> +</h:head> +<h:body> + <div id="container"> + <div id="header"> + <p> + Beispielanwendung <b>My-Aktion</b> – Workshop Java EE 7 + </p> + </div> + <div id="content"> + <ui:insert name="content"> + [Template content will be inserted here] + </ui:insert> + </div> + <div id="footer"> + <p>(C) 2013-2014 dpunkt.verlag GmbH, MIT Lizenz</p> + </div> + </div> +</h:body> +</html> \ No newline at end of file diff --git a/src/main/webapp/contracts/en/screen.css b/src/main/webapp/contracts/en/screen.css new file mode 100644 index 0000000000000000000000000000000000000000..fd7253dd9842d160bd4c35fc55fe499db947d679 --- /dev/null +++ b/src/main/webapp/contracts/en/screen.css @@ -0,0 +1,35 @@ +body { + margin: 0; + padding: 0; + background-color: #EAECEE; + font-family: Verdana, sans-serif; + font-size: 0.9em; +} + +#container { + margin: 0 auto; + padding: 0 20px 10px 20px; + border: 1px solid #666666; + width: 865px; + padding-top: 10px; +} + +#header { + font-size: 1.3em; + border: 1px solid #666666; + background: #EAECEE; + padding: 0 15px 5px 15px; + margin-bottom: 50px; +} + +#footer { + clear: both; + text-align: center; + color: #666666; + font-size: 0.85em; + padding: 3em 0 0 0; +} + +h2 { + font-size: 1.2em; +} \ No newline at end of file diff --git a/src/main/webapp/contracts/en/template.xhtml b/src/main/webapp/contracts/en/template.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..56e9c61261d8ad66f8fe814fe8ff1da3daed7c8b --- /dev/null +++ b/src/main/webapp/contracts/en/template.xhtml @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:h="http://xmlns.jcp.org/jsf/html" + xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> +<h:head> + <title>My-Aktion</title> + <meta charset="utf-8" /> + <h:outputStylesheet name="/screen.css" /> +</h:head> +<h:body> + <div id="container"> + <div id="header"> + <p> + Example application <b>My-Aktion</b> – Workshop Java EE 7 + </p> + </div> + <div id="content"> + <ui:insert name="content"> + [Template content will be inserted here] + </ui:insert> + </div> + <div id="footer"> + <p>(C) 2013-2014 dpunkt.verlag GmbH, MIT license</p> + </div> + </div> +</h:body> +</html> \ No newline at end of file diff --git a/src/main/webapp/donateMoney.xhtml b/src/main/webapp/donateMoney.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..000c3061c6eaafa8a89c5fc36a5904d6ad110d0d --- /dev/null +++ b/src/main/webapp/donateMoney.xhtml @@ -0,0 +1,75 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:ui="http://xmlns.jcp.org/jsf/facelets" + xmlns:f="http://xmlns.jcp.org/jsf/core" + xmlns:p="http://primefaces.org/ui" + xmlns:h="http://xmlns.jcp.org/jsf/html"> +<h:head> + <title>#{msg['donateMoney.donate_money']}</title> + <meta charset="utf-8" /> + <f:metadata> + <f:viewParam id="bgColor" name="bgColor" + value="#{donateMoneyController.bgColor}"> + <f:validateRegex pattern="[A-Fa-f0-9]{6}" /> + </f:viewParam> + <f:viewParam id="textColor" name="textColor" + value="#{donateMoneyController.textColor}"> + <f:validateRegex pattern="[A-Fa-f0-9]{6}" /> + </f:viewParam> + <f:viewParam id="campaignId" name="campaignId" + converter="javax.faces.Long" + value="#{donateMoneyController.campaignId}"> + </f:viewParam> + </f:metadata> +</h:head> +<h:body style="margin:0; font-family: Verdana, sans-serif; font-size: 0.9em; + background-color: ##{donateMoneyController.bgColor}; + color: ##{donateMoneyController.textColor}"> + <h1>#{msg['donateMoney.donate_money']}</h1> + <p:messages globalOnly="true" /> + <p:message for="bgColor" style="color: red;" /> + <p:message for="textColor" style="color: red;" /> + <p:message for="campaignId" style="color: red;" /> + <h:form> + <h:panelGrid columns="3"> + <h:outputLabel value="#{msg['donateMoney.name']}:"> + </h:outputLabel> + <p:inputText id="name" + value="#{donateMoneyController.donation.donorName}"> + </p:inputText> + <p:message for="name" style="color: red;" /> + <h:outputLabel value="#{msg['donateMoney.iban']}:"> + </h:outputLabel> + <p:inputText id="iban" + value="#{donateMoneyController.donation.account.iban}"> + </p:inputText> + <p:message for="iban" style="color: red;" /> + <h:outputLabel value="#{msg['donateMoney.name_of_bank']}:"> + </h:outputLabel> + <p:inputText id="name_bank" + value="#{donateMoneyController.donation.account.nameOfBank}"> + </p:inputText> + <p:message for="name_bank" style="color: red;" /> + <h:outputLabel value="#{msg['donateMoney.donation_amount']}:"> + </h:outputLabel> + <h:panelGroup> + <p:inputText id="donationAmount" + value="#{donateMoneyController.donation.amount}" + onchange=" + if(value !== '') { + if(value.indexOf('.') === -1) { + document.getElementById('j_idt8:tabView:donationAmount').value = value + '.00'; + } + }"> + </p:inputText> EUR + </h:panelGroup> + <p:message for="donationAmount" style="color: red;" /> + </h:panelGrid> + <p:selectBooleanCheckbox + value="#{donateMoneyController.donation.receiptRequested}" /> + #{msg['donateMoney.i_want_a_receipt']}<br /> + <p:commandButton value="#{msg['donateMoney.donate']}" ajax="false" + action="#{donateMoneyController.doDonation}" /> + </h:form> +</h:body> +</html> \ No newline at end of file diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html new file mode 100644 index 0000000000000000000000000000000000000000..4189c9066f9d67cf29c65def449764bcc0e91fbd --- /dev/null +++ b/src/main/webapp/index.html @@ -0,0 +1,5 @@ +<html> +<head> + <meta http-equiv="Refresh" content="0; URL=organizer/listCampaigns.jsf"> +</head> +</html> \ No newline at end of file diff --git a/src/main/webapp/index.xhtml b/src/main/webapp/index.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..79287a7ebc57a54cc3e2b4366027e227903a4a55 --- /dev/null +++ b/src/main/webapp/index.xhtml @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:f="http://xmlns.jcp.org/jsf/core" + xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> +<body> + <f:view contract="#{view.locale.language}"> + <ui:composition template="/template.xhtml"> + <ui:define name="content"> + <h1>#{msg['welcome.text']}</h1> + </ui:define> + </ui:composition> + </f:view> +</body> +</html> \ No newline at end of file diff --git a/src/main/webapp/login.xhtml b/src/main/webapp/login.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..d5d98083e3292915ceb7288ba0892943a9026d3d --- /dev/null +++ b/src/main/webapp/login.xhtml @@ -0,0 +1,22 @@ +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:ui="http://xmlns.jcp.org/jsf/facelets" + xmlns:f="http://xmlns.jcp.org/jsf/core" + xmlns:h="http://xmlns.jcp.org/jsf/html"> +<body> + <f:view contracts="#{view.locale.language}"> + <ui:composition template="/template.xhtml"> + <ui:define name="content"> + <form method="post" action="j_security_check"> + <h:panelGrid columns="2"> + <h:outputLabel value="#{msg['login.email']}:" /> + <input type="text" name="j_username" /> + <h:outputLabel value="#{msg['login.password']}:" /> + <input type="password" name="j_password" /> + </h:panelGrid> + <input type="submit" value="#{msg['login.login']}" /> + </form> + </ui:define> + </ui:composition> + </f:view> +</body> +</html> \ No newline at end of file diff --git a/src/main/webapp/loginError.xhtml b/src/main/webapp/loginError.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..14b9f994a46b7acd885b136dbcaf8ab243f81f0c --- /dev/null +++ b/src/main/webapp/loginError.xhtml @@ -0,0 +1,23 @@ +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:ui="http://xmlns.jcp.org/jsf/facelets" + xmlns:f="http://xmlns.jcp.org/jsf/core" + xmlns:h="http://xmlns.jcp.org/jsf/html"> +<body> + <f:view contracts="#{view.locale.language}"> + <ui:composition template="/template.xhtml"> + <ui:define name="content"> + <b style="color: red;">#{msg['login.errorMsg']}</b> + <form method="post" action="j_security_check"> + <h:panelGrid columns="2"> + <h:outputLabel value="#{msg['login.email']}:" /> + <input type="text" name="j_username" /> + <h:outputLabel value="#{msg['login.password']}:" /> + <input type="password" name="j_password" /> + </h:panelGrid> + <input type="submit" value="#{msg['login.login']}" /> + </form> + </ui:define> + </ui:composition> + </f:view> +</body> +</html> \ No newline at end of file diff --git a/src/main/webapp/organizer/editCampaign.xhtml b/src/main/webapp/organizer/editCampaign.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..4d0a7f8d76ca30def6f2436d47dc35d6d8fb1e78 --- /dev/null +++ b/src/main/webapp/organizer/editCampaign.xhtml @@ -0,0 +1,93 @@ +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:ui="http://xmlns.jcp.org/jsf/facelets" + xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:p="http://primefaces.org/ui" + xmlns:h="http://xmlns.jcp.org/jsf/html"> +<body> + <f:view contracts="#{view.locale.language}"> + <ui:composition template="/template.xhtml"> + <ui:define name="content"> + <h1>#{addMode ? msg['editCampaign.add_new_campaign'] : + msg['editCampaign.edit_campaign']}</h1> + <h:form> + <p:messages closable="true" /> + <p:tabView id="tabView"> + <p:tab title="#{msg['editCampaign.general']}"> + <h:panelGrid columns="3"> + <h:outputLabel + value="#{msg['editCampaign.name']}:"> + </h:outputLabel> + <p:inputText id="a_name" + value="#{selectedCampaign.name}"> + <f:passThroughAttribute name="placeholder" + value="#{msg['editCampaign.name_of_the_campaign']}" /> + </p:inputText> + <p:message for="a_name" /> + <h:outputLabel + value="#{msg['editCampaign.target_amount']}:"> + </h:outputLabel> + <h:panelGroup> + <p:inputText id="a_targetAmount" + value="#{selectedCampaign.targetAmount}" + onchange=" + if(value !== '') { + if(value.indexOf('.') === -1) { + document.getElementById('j_idt8:tabView:a_targetAmount').value = value + '.00'; + } + }"> + </p:inputText> EUR + </h:panelGroup> + <p:message for="a_targetAmount" /> + <h:outputLabel + value="#{msg['editCampaign.donation_amount']}:"> + </h:outputLabel> + <h:panelGroup> + <p:inputText id="a_donationMinimum" + value="#{selectedCampaign.donationMinimum}" + onchange=" + if(value !== '') { + if(value.indexOf('.') === -1) { + document.getElementById('j_idt8:tabView:a_donationMinimum').value = value + '.00'; + } + }"> + </p:inputText> EUR + </h:panelGroup> + <p:message for="a_donationMinimum" /> + </h:panelGrid> + </p:tab> + <p:tab title="#{msg['editCampaign.bank_account']}"> + <h:panelGrid columns="3"> + <h:outputLabel + value="#{msg['editCampaign.name']}:"> + </h:outputLabel> + <p:inputText id="b_name" + value="#{selectedCampaign.account.name}"> + </p:inputText> + <p:message for="b_name" /> + <h:outputLabel + value="#{msg['editCampaign.iban']}:"> + </h:outputLabel> + <p:inputText id="b_iban" + value="#{selectedCampaign.account.iban}"> + </p:inputText> + <p:message for="b_iban" /> + <h:outputLabel + value="#{msg['editCampaign.name_of_bank']}:"> + </h:outputLabel> + <p:inputText id="b_name_bank" + value="#{selectedCampaign.account.nameOfBank}"> + </p:inputText> + <p:message for="b_name_bank" /> + </h:panelGrid> + </p:tab> + </p:tabView> + <p:commandButton value="#{msg['editCampaign.save']}" + ajax="false" action="#{editCampaignController.doSave}" /> + <p:commandButton value="#{msg['editCampaign.cancel']}" + immediate="true" ajax="false" + action="#{editCampaignController.doCancel}" /> + </h:form> + </ui:define> + </ui:composition> + </f:view> +</body> +</html> \ No newline at end of file diff --git a/src/main/webapp/organizer/editDonationForm.xhtml b/src/main/webapp/organizer/editDonationForm.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..78107ac48573b1f613b85243eda4fd3756d0584a --- /dev/null +++ b/src/main/webapp/organizer/editDonationForm.xhtml @@ -0,0 +1,41 @@ +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:ui="http://xmlns.jcp.org/jsf/facelets" + xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:p="http://primefaces.org/ui" + xmlns:h="http://xmlns.jcp.org/jsf/html"> +<body> + <f:view contracts="#{view.locale.language}"> + <ui:composition template="/template.xhtml"> + <ui:define name="content"> + <h1>#{msg['editDonationForm.edit_donation_form']}</h1> + <h:form> + <h:panelGrid columns="2"> + <h:outputLabel + value="#{msg['editDonationForm.background_color']}:"> + </h:outputLabel> + <p:colorPicker id="bgColor" + value="#{editDonationFormController.bgColor}" + widgetVar="bgPicker"> + </p:colorPicker> + <h:outputLabel + value="#{msg['editDonationForm.text_color']}:"> + </h:outputLabel> + <p:colorPicker id="textColor" + value="#{editDonationFormController.textColor}" + widgetVar="textPicker"> + </p:colorPicker> + <h:outputLabel + value="#{msg['editDonationForm.form_url']}:"> + </h:outputLabel> + <p:inputTextarea id="url" rows="6" cols="30" + readonly="true" + value="#{editDonationFormController.url}" /> + </h:panelGrid> + <p:commandButton value="#{msg['editDonationForm.update_url']}" update="url" /> + <p:commandButton value="OK" + action="#{editDonationFormController.doOk}" ajax="false" /> + </h:form> + </ui:define> + </ui:composition> + </f:view> +</body> +</html> \ No newline at end of file diff --git a/src/main/webapp/organizer/listCampaigns.xhtml b/src/main/webapp/organizer/listCampaigns.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..e0132ad516790501fb76e60b2ecb9898e49235f5 --- /dev/null +++ b/src/main/webapp/organizer/listCampaigns.xhtml @@ -0,0 +1,78 @@ +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:ui="http://xmlns.jcp.org/jsf/facelets" + xmlns:f="http://xmlns.jcp.org/jsf/core" + xmlns:p="http://primefaces.org/ui" + xmlns:h="http://xmlns.jcp.org/jsf/html"> +<body> + <f:view contracts="#{view.locale.language}"> + <ui:composition template="/template.xhtml"> + <ui:define name="content"> + <h1>#{msg['listCampaigns.my_campaigns']}</h1> + <h:form> + <p:dataTable value="#{campaigns}" var="campaign"> + <p:column> + <p:commandButton onclick="PF('confirmation').show()" + actionListener="#{listCampaignsController.doDeleteCampaign(campaign)}" + icon="ui-icon-close" /> + </p:column> + <p:column> + <f:facet name="header"> + #{msg['listCampaigns.name']} + </f:facet> + <h:outputText value="#{campaign.name}" /> + </p:column> + <p:column> + <f:facet name="header"> + #{msg['listCampaigns.target_amount']} + </f:facet> + <h:outputText value="#{campaign.targetAmount}"> + <f:convertNumber type="currency" + currencyCode="EUR" /> + </h:outputText> + </p:column> + <p:column> + <f:facet name="header"> + #{msg['listCampaigns.donated_so_far']} + </f:facet> + <h:outputText value="#{campaign.amountDonatedSoFar}"> + <f:convertNumber type="currency" + currencyCode="EUR" /> + </h:outputText> + </p:column> + <p:column> + <p:commandLink value="#{msg['listCampaigns.edit']}" + ajax="false" + action="#{listCampaignsController.doEditCampaign(campaign)}" /> + </p:column> + <p:column> + <p:commandLink + value="#{msg['listCampaigns.list_donations']}" + ajax="false" + action="#{listCampaignsController.doListDonations(campaign)}" /> + </p:column> + <p:column> + <p:commandLink value="#{msg['listCampaigns.form']}" + ajax="false" + action="#{listCampaignsController.doEditDonationForm(campaign)}" /> + </p:column> + </p:dataTable> + <p:commandButton + value="#{msg['listCampaigns.add_campaign']}" + ajax="false" + action="#{listCampaignsController.doAddCampaign}" /> + <p:confirmDialog + message="#{msg['listCampaigns.ask_delete_campaign']}" + header="#{msg['listCampaigns.delete_campaign']}" + severity="alert" widgetVar="confirmation"> + <p:commandButton value="#{msg['listCampaigns.yes']}" + oncomplete="confirmation.hide()" ajax="false" + actionListener="#{listCampaignsController.commitDeleteCampaign}" /> + <p:commandButton value="#{msg['listCampaigns.no']}" + onclick="confirmation.hide()" /> + </p:confirmDialog> + </h:form> + </ui:define> + </ui:composition> + </f:view> +</body> +</html> \ No newline at end of file diff --git a/src/main/webapp/organizer/listDonations.xhtml b/src/main/webapp/organizer/listDonations.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..360c3e899899f96a86d47bb8c4a744942aecdb05 --- /dev/null +++ b/src/main/webapp/organizer/listDonations.xhtml @@ -0,0 +1,76 @@ +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:ui="http://xmlns.jcp.org/jsf/facelets" + xmlns:f="http://xmlns.jcp.org/jsf/core" + xmlns:p="http://primefaces.org/ui" + xmlns:h="http://xmlns.jcp.org/jsf/html"> +<body> + <f:view contracts="#{view.locale.language}"> + <ui:composition template="/template.xhtml"> + <ui:define name="content"> + <h1>#{msg['listDonations.donation_list']} + '#{selectedCampaign.name}'</h1> + <h2>#{msg['listDonations.beneficiary_account']}: + #{selectedCampaign.account.name}, + #{msg['listDonations.iban']}: + #{selectedCampaign.account.iban}, + #{campaignProducer .selectedCampaign.account.nameOfBank}</h2> + <h:form> + <p:dataTable value="#{selectedCampaign.donations}" + var="donation"> + <p:column> + <f:facet name="header"> + #{msg['listDonations.name']} + </f:facet> + <h:outputText value="#{donation.donorName}" /> + </p:column> + <p:column> + <f:facet name="header"> + #{msg['listDonations.iban']} + </f:facet> + <h:outputText value="#{donation.account.iban}" /> + </p:column> + <p:column> + <f:facet name="header"> + #{msg['listDonations.name_of_bank']} + </f:facet> + <h:outputText value="#{donation.account.nameOfBank}" /> + </p:column> + <p:column> + <f:facet name="header"> + #{msg['listDonations.donation_amount']} + </f:facet> + <h:outputText value="#{donation.amount}"> + <f:convertNumber type="currency" + currencyCode="EUR" /> + </h:outputText> + </p:column> + <p:column> + <f:facet name="header"> + #{msg['listDonations.receipt']} + </f:facet> + <h:outputText + value="#{donation.receiptRequested ? + msg['listDonations.yes'] + : msg['listDonations.no']}" /> + </p:column> + <p:column> + <f:facet name="header"> + #{msg['listDonations.status']} + </f:facet> + <h:outputText + value="#{msg['listDonations.status.TRANSFERRED']}" + rendered="#{donation.status == 'TRANSFERRED'}" /> + <h:outputText + value="#{msg['listDonations.status.IN_PROCESS']}" + rendered="#{donation.status == 'IN_PROCESS'}" /> + </p:column> + </p:dataTable> + <p:commandButton value="OK" + ajax="false" + action="#{listDonationsController.doOk}" /> + </h:form> + </ui:define> + </ui:composition> + </f:view> +</body> +</html> \ No newline at end of file diff --git a/target/classes/.gitignore b/target/classes/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..fd04598cccd1eb791debf5b0edfff26368dbb294 --- /dev/null +++ b/target/classes/.gitignore @@ -0,0 +1 @@ +/de/ diff --git a/target/classes/META-INF/persistence.xml b/target/classes/META-INF/persistence.xml new file mode 100644 index 0000000000000000000000000000000000000000..502f486e102318c514a1bff0296caf7efaa9fd9d --- /dev/null +++ b/target/classes/META-INF/persistence.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<persistence xmlns="http://java.sun.com/xml/ns/persistence" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_1.xsd" + version="2.1"> + + <persistence-unit name="primary" + transaction-type="JTA"> + <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider> + + <class>de.dpunkt.myaktion.model.Account</class> + <class>de.dpunkt.myaktion.model.Campaign</class> + <class>de.dpunkt.myaktion.model.Donation</class> + <class>de.dpunkt.myaktion.model.Organizer</class> + <exclude-unlisted-classes>true</exclude-unlisted-classes> + + <properties> + <property name="hibernate.transaction.jta.platform" + value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" /> + <property name="hibernate.ogm.datastore.database" + value="my-aktion" /> + <property name="hibernate.ogm.datastore.host" + value="localhost" /> + <property name="hibernate.ogm.datastore.provider" + value="MONGODB" /> + </properties> + </persistence-unit> +</persistence> \ No newline at end of file diff --git a/target/classes/ValidationMessages_de.properties b/target/classes/ValidationMessages_de.properties new file mode 100644 index 0000000000000000000000000000000000000000..334b1b301f6ce1fe0fceeeb008bdcceeb80df160 --- /dev/null +++ b/target/classes/ValidationMessages_de.properties @@ -0,0 +1,22 @@ +# resource file for bean validation +# campaign model +campaign.name.size=Der Name einer Aktion muss min. {min} und darf max. {max} Zeichen lang sein. +campaign.targetAmount.notNull=Bitte ein Spendenziel angeben. +campaign.targetAmount.decimalMin=Das Spendenziel für die Aktion muss min. {value} Euro sein. +campaign.donationMinimum.notNull=Bitte einen Spendenbetrag angeben. +campaign.donationMinimum.decimalMin=Der Spendenbetrag muss min. {value} Euro sein. + +# donation model +donation.amount.notNull=Bitte einen Spendenbetrag angeben. +donation.amount.decimalMin=Der Spendenbetrag muss min. {value} Euro sein. +donation.donorName.size=Der Name eines Spenders muss min. {min} und darf max. {max} Zeichen lang sein. + +# account model +account.name.size=Der Name des Besitzers eines Kontos muss min. {min} und darf max. {max} Zeichen lang sein. +account.nameOfBank.size=Der Name einer Bank muss min. {min} und darf max. {max} Zeichen lang sein. +account.iban.pattern=Eine IBAN besteht aus zwei Buchstaben, gefolgt von zwei Ziffern und 12 bis 30 alphanumerischen Zeichen. + +# organizer model +organizer.firstName.size=Der Vorname eines Organisators muss min. {min} und darf max. {max} Zeichen lang sein. +organizer.lastName.size=Der Nachname eines Organisators muss min. {min} und darf max. {max} Zeichen lang sein. +organizer.email.pattern=Bitte eine valide E-Mail-Adresse angeben. \ No newline at end of file diff --git a/target/classes/ValidationMessages_en.properties b/target/classes/ValidationMessages_en.properties new file mode 100644 index 0000000000000000000000000000000000000000..0bd4fe3a4ebb6fa622eb31dac2704ac1cb079f84 --- /dev/null +++ b/target/classes/ValidationMessages_en.properties @@ -0,0 +1,22 @@ +# resource file for bean validation +# campaign model +campaign.name.size=The name of a campaign must be between {min} and {max} characters long. +campaign.targetAmount.notNull=Please specify a target amount. +campaign.targetAmount.decimalMin=The target amount for the campaign must be at least {value} Euro. +campaign.donationMinimum.notNull=Please specify a donation minimum. +campaign.donationMinimum.decimalMin=The donation minimum must be at least {value} Euro. + +# donation model +donation.amount.notNull=Please specify a donation amount. +donation.amount.decimalMin=The donation amount must be at least {value} Euro. +donation.donorName.size=The donor's name must be between {min} and {max} characters long. + +# account model +account.name.size=The name of the account owner must be between {min} and {max} characters long. +account.nameOfBank.size=The name of a bank must be between {min} and {max} characters long. +account.iban.pattern=An IBAN contains of two letters, followed by two digits and between 12 and 30 alphanumeric characters. + +# organizer model +organizer.firstName.size=The first name of an organizer must be between {min} and {max} characters long. +organizer.lastName.size=The last name of an organizer must be between {min} and {max} characters long. +organizer.email.pattern=Please enter a valid email address. \ No newline at end of file diff --git a/target/classes/de/dpunkt/myaktion/controller/DonateMoneyController.class b/target/classes/de/dpunkt/myaktion/controller/DonateMoneyController.class index fc30f7acd62163c14e756b95eb2f3a290fcd71ae..a42ff9d81f8e34df94fae149ec163a6ff10aa450 100644 Binary files a/target/classes/de/dpunkt/myaktion/controller/DonateMoneyController.class and b/target/classes/de/dpunkt/myaktion/controller/DonateMoneyController.class differ diff --git a/target/classes/de/dpunkt/myaktion/controller/EditCampaignController.class b/target/classes/de/dpunkt/myaktion/controller/EditCampaignController.class index 161e67b4902f3dae54b23475eba2997013935dba..ab6286a1eea2544958c793a502e3ef51f4cb53f8 100644 Binary files a/target/classes/de/dpunkt/myaktion/controller/EditCampaignController.class and b/target/classes/de/dpunkt/myaktion/controller/EditCampaignController.class differ diff --git a/target/classes/de/dpunkt/myaktion/controller/EditDonationFormController.class b/target/classes/de/dpunkt/myaktion/controller/EditDonationFormController.class index bc95b0b4665be3a07c2ee37e1c8452a91b054b66..cddd6c8af9ddf942c595619dd70447f24f50c924 100644 Binary files a/target/classes/de/dpunkt/myaktion/controller/EditDonationFormController.class and b/target/classes/de/dpunkt/myaktion/controller/EditDonationFormController.class differ diff --git a/target/classes/de/dpunkt/myaktion/controller/ListCampaignsController.class b/target/classes/de/dpunkt/myaktion/controller/ListCampaignsController.class index 67b50cba2dfd0e418395ba43c8907c5bca74aa64..19cf3a0bad12568766da125b903f997fdc8c211a 100644 Binary files a/target/classes/de/dpunkt/myaktion/controller/ListCampaignsController.class and b/target/classes/de/dpunkt/myaktion/controller/ListCampaignsController.class differ diff --git a/target/classes/de/dpunkt/myaktion/controller/ListDonationsController.class b/target/classes/de/dpunkt/myaktion/controller/ListDonationsController.class index 438e70240ff1a5dc624d864e52379f83acc0cff6..7780ca54afc2308be916c0a20896bd41861e8f93 100644 Binary files a/target/classes/de/dpunkt/myaktion/controller/ListDonationsController.class and b/target/classes/de/dpunkt/myaktion/controller/ListDonationsController.class differ diff --git a/target/classes/de/dpunkt/myaktion/controller/Pages.class b/target/classes/de/dpunkt/myaktion/controller/Pages.class index 21ba9ffc3e0235fdb3c0d2dff1aa69edaa43d3a0..ae8a3a01e1a2f44e80d60326b9d6472b556ef7eb 100644 Binary files a/target/classes/de/dpunkt/myaktion/controller/Pages.class and b/target/classes/de/dpunkt/myaktion/controller/Pages.class differ diff --git a/target/classes/de/dpunkt/myaktion/data/CampaignListProducer.class b/target/classes/de/dpunkt/myaktion/data/CampaignListProducer.class index d7e714e29f995c3d25b26c531b2beb28cc7f9617..df433cb78e251d6e9156fd8022845bf28c3e90cd 100644 Binary files a/target/classes/de/dpunkt/myaktion/data/CampaignListProducer.class and b/target/classes/de/dpunkt/myaktion/data/CampaignListProducer.class differ diff --git a/target/classes/de/dpunkt/myaktion/data/CampaignProducer$Mode.class b/target/classes/de/dpunkt/myaktion/data/CampaignProducer$Mode.class index 29af38dfd2b2214b81eaf736ceb1f513b461ea6d..5efdb7aaf5c1a59feebc581c2119955a2f6ac1af 100644 Binary files a/target/classes/de/dpunkt/myaktion/data/CampaignProducer$Mode.class and b/target/classes/de/dpunkt/myaktion/data/CampaignProducer$Mode.class differ diff --git a/target/classes/de/dpunkt/myaktion/data/CampaignProducer.class b/target/classes/de/dpunkt/myaktion/data/CampaignProducer.class index 51768c658a951c34ba6d64724c8d7195e7311c55..f049f4d20e5a760d7243810933d995d12d239410 100644 Binary files a/target/classes/de/dpunkt/myaktion/data/CampaignProducer.class and b/target/classes/de/dpunkt/myaktion/data/CampaignProducer.class differ diff --git a/target/classes/de/dpunkt/myaktion/model/Account.class b/target/classes/de/dpunkt/myaktion/model/Account.class index f74c3c507f07053f02b3d7f4c0b350186bf07d4f..8ca6d81da454ec1fadbaa5f0290f6e463ddf4c6f 100644 Binary files a/target/classes/de/dpunkt/myaktion/model/Account.class and b/target/classes/de/dpunkt/myaktion/model/Account.class differ diff --git a/target/classes/de/dpunkt/myaktion/model/Campaign.class b/target/classes/de/dpunkt/myaktion/model/Campaign.class index 640e513f1f5405bf219c99b9e6b8ea7e4b4ed94a..a78544fcdaedbf0303790ea11d7e81d597682eb7 100644 Binary files a/target/classes/de/dpunkt/myaktion/model/Campaign.class and b/target/classes/de/dpunkt/myaktion/model/Campaign.class differ diff --git a/target/classes/de/dpunkt/myaktion/model/Donation$Status.class b/target/classes/de/dpunkt/myaktion/model/Donation$Status.class index d8005ba2d011006ad770985283d86eb495b566fb..33b52a3bbf63715a2c3c0319d4eff497c9a1f878 100644 Binary files a/target/classes/de/dpunkt/myaktion/model/Donation$Status.class and b/target/classes/de/dpunkt/myaktion/model/Donation$Status.class differ diff --git a/target/classes/de/dpunkt/myaktion/model/Donation.class b/target/classes/de/dpunkt/myaktion/model/Donation.class index 1383d0b2b0b874243e7e2e4d05bbce0753526019..3ecf73df1d51c6673829250ce21241d9697d475c 100644 Binary files a/target/classes/de/dpunkt/myaktion/model/Donation.class and b/target/classes/de/dpunkt/myaktion/model/Donation.class differ diff --git a/target/classes/messages_de.properties b/target/classes/messages_de.properties index 07544ff2deb2fd43d5e72f642c02f19a8e7c5384..1059e8d85b74e9ed7f11baa8ba041ae483c80b4f 100644 --- a/target/classes/messages_de.properties +++ b/target/classes/messages_de.properties @@ -11,18 +11,19 @@ listCampaigns.edit=Editieren listCampaigns.list_donations=Spendenliste listCampaigns.form=Formular listCampaigns.add_campaign=Aktion hinzufügen +listCampaigns.ask_delete_campaign=Aktion wirklich löschen? +listCampaigns.delete_campaign=Aktion löschen +listCampaigns.yes=Ja +listCampaigns.no=Nein # editCampaign.xhtml editCampaign.add_new_campaign=Neue Aktion anlegen editCampaign.edit_campaign=Aktionsdaten editieren editCampaign.general=Allgemein editCampaign.name=Name -editCampaign.campaign_name_validation=Der Name einer Aktion muss min. 4 und darf max. 30 Zeichen lang sein. editCampaign.name_of_the_campaign=Name der Spendenaktion editCampaign.target_amount=Spendenziel -editCampaign.target_amount_validation=Das Spendenziel für die Aktion muss min. 10 Euro sein. editCampaign.donation_amount=Spendenbetrag -editCampaign.donation_amount_validation=Der Spendenbetrag muss min. 1 Euro sein. editCampaign.bank_account=Bankverbindung editCampaign.iban=IBAN editCampaign.name_of_bank=Name der Bank @@ -60,7 +61,14 @@ donateMoney.i_want_a_receipt=Ja, ich m donateMoney.donate=Spenden donateMoney.thank_you=Vielen Dank für die Spende! -listCampaigns.ask_delete_campaign=Aktion wirklich löschen? -listCampaigns.delete_campaign=Aktion löschen -listCampaigns.yes=Ja -listCampaigns.no=Nein \ No newline at end of file +# logger +log.donateMoney.thank_you={0} hat {1} Euro gespendet. +log.transferDonation.start=Zu bearbeitende Spenden werden überwiesen. +log.transferDonation.done=Es wurden {0} Spenden überwiesen. + +# login.xhtml +login.email=E-Mail +login.password=Passwort +login.login=Anmelden +login.errorMsg=Passwort oder User sind falsch + diff --git a/target/classes/messages_en.properties b/target/classes/messages_en.properties index 5df0b5aed6b0df2809e2ae1ef2f080db8dc8f6ad..7ab66a6ba41d41e7916f892b0d2731a741309a2f 100644 --- a/target/classes/messages_en.properties +++ b/target/classes/messages_en.properties @@ -11,18 +11,19 @@ listCampaigns.edit=Edit listCampaigns.list_donations=List donations listCampaigns.form=Form listCampaigns.add_campaign=Add campaign +listCampaigns.ask_delete_campaign=Really delete campaign? +listCampaigns.delete_campaign=Delete campaign +listCampaigns.yes=Yes +listCampaigns.no=No # editCampaign.xhtml editCampaign.add_new_campaign=Add a new campaign editCampaign.edit_campaign=Edit campaign editCampaign.general=General editCampaign.name=Name -editCampaign.campaign_name_validation=The name of a campaign must be at least 4 and max. 30 characters long. editCampaign.name_of_the_campaign=Name of the campaign editCampaign.target_amount=Target amount -editCampaign.target_amount_validation=The target amount for the campaign must be at least 10 Euro. editCampaign.donation_amount=Donation amount -editCampaign.donation_amount_validation=The donation amount must be at least 1 Euro. editCampaign.bank_account=Bank account editCampaign.iban=IBAN editCampaign.name_of_bank=Name of Bank @@ -60,7 +61,13 @@ donateMoney.i_want_a_receipt=Yes, I would like a donation receipt donateMoney.donate=Donate donateMoney.thank_you=Thank you for your donation! -listCampaigns.ask_delete_campaign=Really delete campaign? -listCampaigns.delete_campaign=Delete campaign -listCampaigns.yes=Yes -listCampaigns.no=No \ No newline at end of file +# logger +log.donateMoney.thank_you={0} has donated {1} Euro. +log.transferDonation.start=Starting transfering donations. +log.transferDonation.done={0} donations have been transfered. + +# login.xhtml +login.email=Email +login.password=Password +login.login=Log in +login.errorMsg=Password or user are wrong \ No newline at end of file diff --git a/target/m2e-wtp/web-resources/.gitignore b/target/m2e-wtp/web-resources/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..3385916da52dc526118c7c76899e628cdde10ca1 --- /dev/null +++ b/target/m2e-wtp/web-resources/.gitignore @@ -0,0 +1 @@ +/META-INF/ diff --git a/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.properties b/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.properties index 6ff87473c383f8b33b19325f351ecd4e6cf0b820..9748c86141a30dafadf69a8eca18910c53defaf5 100644 --- a/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.properties +++ b/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Thu Jul 23 17:39:07 CEST 2020 +#Fri Jul 24 11:18:02 CEST 2020 version=0.0.1 groupId=de.dpunkt m2e.projectName=my-aktion diff --git a/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.xml b/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.xml index 0cb5aa5a9b663e37fc79f1add8d84121e5dc185e..cde1dbc5c10327f8c691c8e438e44c8081e2a9a7 100644 --- a/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.xml +++ b/target/m2e-wtp/web-resources/META-INF/maven/de.dpunkt/my-aktion/pom.xml @@ -7,6 +7,18 @@ <version>0.0.1</version> <packaging>war</packaging> + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.hibernate.ogm</groupId> + <artifactId>hibernate-ogm-bom</artifactId> + <version>5.4.1.Final</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> + <dependencies> <dependency> <groupId>jakarta.platform</groupId> @@ -14,18 +26,15 @@ <version>8.0.0</version> <scope>provided</scope> </dependency> - <dependency> - <groupId>org.eclipse.microprofile</groupId> - <artifactId>microprofile</artifactId> - <version>3.0</version> - <type>pom</type> - <scope>provided</scope> - </dependency> <dependency> <groupId>org.primefaces</groupId> <artifactId>primefaces</artifactId> <version>8.0</version> </dependency> + <dependency> + <groupId>org.hibernate.ogm</groupId> + <artifactId>hibernate-ogm-mongodb</artifactId> + </dependency> </dependencies> <build> @@ -38,7 +47,7 @@ </plugin> </plugins> </build> - + <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source>