diff --git a/agiledancers-be/pom.xml b/agiledancers-be/pom.xml index 477cbba..26611a6 100644 --- a/agiledancers-be/pom.xml +++ b/agiledancers-be/pom.xml @@ -18,6 +18,19 @@ com.google.ortools ortools-java + + + + net.datafaker + datafaker + test + + + + org.junit.jupiter + junit-jupiter + test + \ No newline at end of file diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/Main.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/Main.java deleted file mode 100644 index 00ddbb4..0000000 --- a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/Main.java +++ /dev/null @@ -1,17 +0,0 @@ -package nl.agilecc.agiledancers; - -//TIP To Run code, press or -// click the icon in the gutter. -public class Main { - public static void main(String[] args) { - //TIP Press with your caret at the highlighted text - // to see how IntelliJ IDEA suggests fixing it. - System.out.printf("Hello and welcome!"); - - for (int i = 1; i <= 5; i++) { - //TIP Press to start debugging your code. We have set one breakpoint - // for you, but you can always add more by pressing . - System.out.println("i = " + i); - } - } -} \ No newline at end of file diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/AbstractEntity.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/AbstractEntity.java new file mode 100644 index 0000000..3a08a0e --- /dev/null +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/AbstractEntity.java @@ -0,0 +1,30 @@ +package nl.agilecc.agiledancers.model; + +import lombok.*; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +@Getter +@Setter +@EqualsAndHashCode +@ToString +@NoArgsConstructor +public abstract class AbstractEntity { + private Long id; + + protected void addNullSafe(Set set, T t) { + emptyIfNull(set).add(t); + } + + private Set emptyIfNull(Set set) { + return set == null ? + new HashSet<>() : + set; + } + + protected Set unmodifiableNullSafe(Set set) { + return set == null ? Collections.emptySet() : Collections.unmodifiableSet(set); + } +} diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Coach.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Coach.java index f008c3c..326b14c 100644 --- a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Coach.java +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Coach.java @@ -1,6 +1,12 @@ package nl.agilecc.agiledancers.model; -public class Coach { - private Long id; - private String name; +import lombok.*; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder +@ToString(onlyExplicitlyIncluded = true) +public class Coach extends AbstractEntity { + @ToString.Include + private final String name; } diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DanceGroup.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DanceGroup.java index 5914190..c81a203 100644 --- a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DanceGroup.java +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DanceGroup.java @@ -1,17 +1,46 @@ package nl.agilecc.agiledancers.model; +import lombok.*; import nl.agilecc.agiledancers.model.specifications.DanceGroupStyle; import nl.agilecc.agiledancers.model.specifications.DanceGroupType; +import java.util.Collections; +import java.util.HashSet; import java.util.Set; -public class DanceGroup { - private Long id; - private String category; - private DanceGroupType type; - private int startAge; - private int endAge; +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder +@ToString(onlyExplicitlyIncluded = true) +public class DanceGroup extends AbstractEntity { + @ToString.Include + private final String category; + @ToString.Include + private final DanceGroupType type; + @ToString.Include + private final int startAge; + @ToString.Include + private final int endAge; + @ToString.Include private Set dancers; + @ToString.Include private Set styles; + @ToString.Include private Coach coach; + + public Set getDancers() { + return super.unmodifiableNullSafe(dancers); + } + + public void addDancer(Dancer dancer) { + super.addNullSafe(dancers, dancer); + } + + public Set getStyles() { + return super.unmodifiableNullSafe(styles); + } + + public void addStyle(DanceGroupStyle style) { + super.addNullSafe(styles, style); + } } diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DanceSchool.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DanceSchool.java new file mode 100644 index 0000000..63803d7 --- /dev/null +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DanceSchool.java @@ -0,0 +1,50 @@ +package nl.agilecc.agiledancers.model; + +import lombok.*; + +import java.util.Collections; +import java.util.Set; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder +@ToString(onlyExplicitlyIncluded = true) +public class DanceSchool extends AbstractEntity { + private final String name; + private final Set dancers; + private final Set danceGroups; + private final Set shows; + private final Set coaches; + + public Set getDancers() { + return super.unmodifiableNullSafe(dancers); + } + + public Set getDanceGroups() { + return super.unmodifiableNullSafe(danceGroups); + } + + public Set getShows() { + return super.unmodifiableNullSafe(shows); + } + + public Set getCoaches() { + return super.unmodifiableNullSafe(coaches); + } + + public void addDancer(Dancer dancer) { + super.addNullSafe(dancers, dancer); + } + + public void addDanceGroup(DanceGroup danceGroup) { + super.addNullSafe(danceGroups, danceGroup); + } + + public void addShow(Show show) { + super.addNullSafe(shows, show); + } + + public void addCoach(Coach coach) { + super.addNullSafe(coaches, coach); + } +} diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Dancer.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Dancer.java index 5b3dfec..a628a44 100644 --- a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Dancer.java +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Dancer.java @@ -1,7 +1,21 @@ package nl.agilecc.agiledancers.model; -public class Dancer { - private Long id; - private String name; - private int age; +import lombok.*; + +import java.time.LocalDate; +import java.time.Period; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder +@ToString(onlyExplicitlyIncluded = true) +public class Dancer extends AbstractEntity { + @ToString.Include + private final String name; + @ToString.Include + private LocalDate birthDate; + + public int age() { + return Period.between(birthDate, LocalDate.now()).getYears(); + } } diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DayPart.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DayPart.java index ba068f5..6503d82 100644 --- a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DayPart.java +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DayPart.java @@ -1,12 +1,17 @@ package nl.agilecc.agiledancers.model; +import lombok.*; import nl.agilecc.agiledancers.model.specifications.DayPartType; import java.util.List; -public class DayPart { - private Long id; - - private DayPartType type; - private List danceGroups; +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder +@ToString(onlyExplicitlyIncluded = true) +public class DayPart extends AbstractEntity { + @ToString.Include + private final DayPartType type; + @ToString.Include + private final List danceGroups; } diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Show.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Show.java index b23a772..de61f10 100644 --- a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Show.java +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Show.java @@ -1,8 +1,14 @@ package nl.agilecc.agiledancers.model; +import lombok.*; + import java.util.List; -public class Show { - private Long id; - private List dayParts; +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder +@ToString(onlyExplicitlyIncluded = true) +public class Show extends AbstractEntity { + @ToString.Include + private final List dayParts; } diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/AbstractRepository.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/AbstractRepository.java new file mode 100644 index 0000000..0468b13 --- /dev/null +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/AbstractRepository.java @@ -0,0 +1,27 @@ +package nl.agilecc.agiledancers.repository; + +import nl.agilecc.agiledancers.model.AbstractEntity; + +import java.util.*; + +public abstract class AbstractRepository { + private long sequence = 0L; + + protected Map entities = new LinkedHashMap<>(); + + public T add(T entity) { + if (entity.getId() == null) { + entity.setId(sequence++); + } + entities.put(entity.getId(), entity); + return entity; + } + + public List findAll() { + return List.copyOf(entities.values()); + } + + public T findById(long id) { + return entities.get(id); + } +} diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/CoachRepository.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/CoachRepository.java new file mode 100644 index 0000000..2257e5c --- /dev/null +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/CoachRepository.java @@ -0,0 +1,7 @@ +package nl.agilecc.agiledancers.repository; + +import nl.agilecc.agiledancers.model.Coach; + +public class CoachRepository extends AbstractRepository { + +} diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DanceGroupRepository.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DanceGroupRepository.java new file mode 100644 index 0000000..57f4ed2 --- /dev/null +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DanceGroupRepository.java @@ -0,0 +1,6 @@ +package nl.agilecc.agiledancers.repository; + +import nl.agilecc.agiledancers.model.DanceGroup; + +public class DanceGroupRepository extends AbstractRepository { +} diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DanceSchoolRepository.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DanceSchoolRepository.java new file mode 100644 index 0000000..de5ce27 --- /dev/null +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DanceSchoolRepository.java @@ -0,0 +1,6 @@ +package nl.agilecc.agiledancers.repository; + +import nl.agilecc.agiledancers.model.DanceSchool; + +public class DanceSchoolRepository extends AbstractRepository { +} diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DancerRepository.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DancerRepository.java new file mode 100644 index 0000000..98cf1f3 --- /dev/null +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DancerRepository.java @@ -0,0 +1,6 @@ +package nl.agilecc.agiledancers.repository; + +import nl.agilecc.agiledancers.model.Dancer; + +public class DancerRepository extends AbstractRepository { +} diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DayPartRepository.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DayPartRepository.java new file mode 100644 index 0000000..5d0a703 --- /dev/null +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DayPartRepository.java @@ -0,0 +1,6 @@ +package nl.agilecc.agiledancers.repository; + +import nl.agilecc.agiledancers.model.DayPart; + +public class DayPartRepository extends AbstractRepository { +} diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/ShowRepository.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/ShowRepository.java new file mode 100644 index 0000000..4e96e32 --- /dev/null +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/ShowRepository.java @@ -0,0 +1,6 @@ +package nl.agilecc.agiledancers.repository; + +import nl.agilecc.agiledancers.model.Show; + +public class ShowRepository extends AbstractRepository { +} diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/CoachService.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/CoachService.java new file mode 100644 index 0000000..457ae29 --- /dev/null +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/CoachService.java @@ -0,0 +1,12 @@ +package nl.agilecc.agiledancers.service; + +import nl.agilecc.agiledancers.model.Coach; +import nl.agilecc.agiledancers.repository.CoachRepository; + +public class CoachService { + private CoachRepository coachRepository = new CoachRepository(); + + public Coach addCoach(String name, Coach coach) { + return coachRepository.add(Coach.builder().name(name).build()); + } +} diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DanceGroupService.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DanceGroupService.java new file mode 100644 index 0000000..a201877 --- /dev/null +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DanceGroupService.java @@ -0,0 +1,27 @@ +package nl.agilecc.agiledancers.service; + +import nl.agilecc.agiledancers.model.Coach; +import nl.agilecc.agiledancers.model.DanceGroup; +import nl.agilecc.agiledancers.model.Dancer; +import nl.agilecc.agiledancers.model.specifications.DanceGroupStyle; +import nl.agilecc.agiledancers.model.specifications.DanceGroupType; +import nl.agilecc.agiledancers.repository.DanceGroupRepository; + +import java.util.Set; + +public class DanceGroupService { + private final DanceGroupRepository danceGroupRepository = new DanceGroupRepository(); + + public DanceGroup add(String category, DanceGroupType type, int startAge, int endAge, Set dancers, Set styles, Coach coach) { + DanceGroup danceGroup = DanceGroup.builder() + .category(category) + .type(type) + .startAge(startAge) + .endAge(endAge) + .dancers(dancers) + .styles(styles) + .coach(coach).build(); + + return danceGroupRepository.add(danceGroup); + } +} diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DanceSchoolService.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DanceSchoolService.java new file mode 100644 index 0000000..a300d0d --- /dev/null +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DanceSchoolService.java @@ -0,0 +1,29 @@ +package nl.agilecc.agiledancers.service; + +import nl.agilecc.agiledancers.model.*; +import nl.agilecc.agiledancers.repository.DanceSchoolRepository; + +public class DanceSchoolService { + private final DanceSchoolRepository danceSchoolRepository = new DanceSchoolRepository(); + + public DanceSchool add(String name) { + DanceSchool danceSchool = DanceSchool.builder().name(name).build(); + return danceSchoolRepository.add(danceSchool); + } + + public void addDancer(Long danceSchoolId, Dancer dancer) { + danceSchoolRepository.findById(danceSchoolId).addDancer(dancer); + } + + public void addDanceGroup(Long danceSchoolId, DanceGroup danceGroup) { + danceSchoolRepository.findById(danceSchoolId).addDanceGroup(danceGroup); + } + + public void addCoach(Long danceSchoolId, Coach coach) { + danceSchoolRepository.findById(danceSchoolId).addCoach(coach); + } + + public void addShow(Long danceSchoolId, Show show) { + danceSchoolRepository.findById(danceSchoolId).addShow(show); + } +} diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DancerService.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DancerService.java new file mode 100644 index 0000000..7898505 --- /dev/null +++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DancerService.java @@ -0,0 +1,15 @@ +package nl.agilecc.agiledancers.service; + +import nl.agilecc.agiledancers.model.Dancer; +import nl.agilecc.agiledancers.repository.DancerRepository; + +import java.time.LocalDate; + +public class DancerService { + private final DancerRepository dancerRepository = new DancerRepository(); + + public Dancer addDancer(String name, LocalDate birthDate) { + Dancer dancer = Dancer.builder().name(name).birthDate(birthDate).build(); + return dancerRepository.add(dancer); + } +} diff --git a/agiledancers-be/src/test/java/sit/DanceSchoolSit.java b/agiledancers-be/src/test/java/sit/DanceSchoolSit.java new file mode 100644 index 0000000..6d09bfa --- /dev/null +++ b/agiledancers-be/src/test/java/sit/DanceSchoolSit.java @@ -0,0 +1,26 @@ +package sit; + +import net.datafaker.Faker; +import nl.agilecc.agiledancers.model.DanceSchool; +import nl.agilecc.agiledancers.service.DanceSchoolService; +import org.junit.jupiter.api.Test; + +class DanceSchoolSit { + Faker faker = new Faker(); + int numberOfDanceGroups = 42; + + int aantalDansersTm5 = 10; + int aantalDansers6tm10 = 30; + int aantalDansers11tot14 = 70; + int aantalDansers14tm17 = 140; + int aantalDansers18Plus = 100; + + private DanceSchoolService danceSchoolService = new DanceSchoolService(); + + @Test + void testDanceSchoolModel() { + DanceSchool danceSchool = danceSchoolService.add("24 Dance Studio"); + + + } +} diff --git a/pom.xml b/pom.xml index eb10361..49e5777 100644 --- a/pom.xml +++ b/pom.xml @@ -26,6 +26,10 @@ 9.12.4544 1.18.38 + + + 2.4.3 + 5.12.2 @@ -36,6 +40,21 @@ ortools-java ${ortools-java.version} + + + + net.datafaker + datafaker + ${datafaker.version} + test + + + + org.junit.jupiter + junit-jupiter + ${junit-jupiter.version} + test +