attendance started

REL-BRANCH-ClubhelperModel-0.0.1
kre6513 5 years ago
parent f667b36d35
commit 8bb9156ac5
  1. 30
      src/main/java/de/kreth/clubhelper/model/controller/AttendanceController.java
  2. 50
      src/main/java/de/kreth/clubhelper/model/controller/GroupContoller.java
  3. 4
      src/main/java/de/kreth/clubhelper/model/controller/PersonController.java
  4. 1
      src/main/java/de/kreth/clubhelper/model/dao/AttendanceDao.java
  5. 47
      src/main/java/de/kreth/clubhelper/model/data/BaseEntity.java
  6. 22
      src/main/java/de/kreth/clubhelper/model/data/GroupDef.java
  7. 30
      src/test/java/de/kreth/clubhelper/model/LoadPersonsTest.java
  8. 36
      src/test/java/de/kreth/clubhelper/model/PersonControllerTest.java

@ -6,6 +6,7 @@ import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
@ -15,41 +16,46 @@ import org.springframework.web.bind.annotation.ResponseBody;
import de.kreth.clubhelper.model.dao.AttendanceDao; import de.kreth.clubhelper.model.dao.AttendanceDao;
import de.kreth.clubhelper.model.dao.PersonDao; import de.kreth.clubhelper.model.dao.PersonDao;
import de.kreth.clubhelper.model.data.Attendance; import de.kreth.clubhelper.model.data.Attendance;
import de.kreth.clubhelper.model.data.Person;
@Controller @Controller
@RequestMapping("/attendance") @RequestMapping("/attendance")
@PreAuthorize("hasRole('trainer') or hasRole('admin')") @PreAuthorize("hasRole('trainer') or hasRole('admin')")
public class AttendanceController { public class AttendanceController
{
@Autowired
private AttendanceDao attendanceDao; private AttendanceDao attendanceDao;
private PersonDao personDao;
@Autowired @Autowired
public AttendanceController(AttendanceDao attendanceDao, PersonDao personDao) { private PersonDao personDao;
this.attendanceDao = attendanceDao;
this.personDao = personDao;
}
@PostMapping(value = "/on") @PostMapping(value = "/on")
@ResponseBody @ResponseBody
public List<Attendance> getAttendencesOn(@RequestBody(required = false) Date date) { public List<Attendance> getAttendencesOn(@RequestBody(required = false) Date date)
{
if (date == null) { if (date == null) {
date = new Date(); date = new Date();
} }
return attendanceDao.findByOnDate(date); return attendanceDao.findByOnDate(date);
} }
@PostMapping(value = "/for/{id}") @PostMapping(value = "/for/{id}")
@ResponseBody @ResponseBody
public Attendance post(@PathVariable("id") Integer id) { public Attendance post(@PathVariable("id") Integer id)
{
Attendance att = new Attendance(); Attendance att = new Attendance();
att.setOnDate(new Date()); att.setOnDate(new Date());
att.setPerson(personDao.findById(id).orElseThrow(() -> new RuntimeException("Person not found by id=" + id))); att.setPerson(personDao.findById(id).orElseThrow(() -> new RuntimeException("Person not found by id=" + id)));
attendanceDao.save(att); attendanceDao.save(att);
return att; return att;
} }
@DeleteMapping("/{id}")
public Attendance delete(@PathVariable("id") int personId, @RequestBody(required = true) Date onDate) {
Person person = personDao.findById(personId).orElseThrow(() -> new RuntimeException("Person not found by id=" + personId));
Attendance attendance = attendanceDao.findByPersonAndOnDate(person, onDate);
attendanceDao.delete(attendance);
return attendance;
}
} }

@ -0,0 +1,50 @@
package de.kreth.clubhelper.model.controller;
import java.nio.charset.Charset;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.HttpClientErrorException;
import de.kreth.clubhelper.model.dao.GroupDao;
import de.kreth.clubhelper.model.data.GroupDef;
@RestController
@RequestMapping("/group")
@PreAuthorize("isAuthenticated()")
public class GroupContoller
{
@Autowired
private GroupDao groupDao;
@GetMapping
public List<GroupDef> allGroups() {
return StreamSupport.stream(groupDao.findAll().spliterator(), false)
.collect(Collectors.toList());
}
@GetMapping("/{id}")
public GroupDef getById(@PathVariable("id") int id) {
Supplier<HttpClientErrorException> supplier = () -> createNotFoundForId(id);
return groupDao.findById(id).orElseThrow(supplier);
}
private HttpClientErrorException createNotFoundForId(Integer id)
{
HttpHeaders headers = new HttpHeaders();
byte[] body = new byte[0];
Charset charset = Charset.forName("UTF-8");
HttpClientErrorException ex = HttpClientErrorException.create(HttpStatus.NOT_FOUND, "Group not found by id=" + id, headers, body, charset);
return ex;
}
}

@ -16,6 +16,7 @@ import de.kreth.clubhelper.model.dao.PersonDao;
import de.kreth.clubhelper.model.data.Adress; import de.kreth.clubhelper.model.data.Adress;
import de.kreth.clubhelper.model.data.Contact; import de.kreth.clubhelper.model.data.Contact;
import de.kreth.clubhelper.model.data.Person; import de.kreth.clubhelper.model.data.Person;
import io.swagger.annotations.ApiOperation;
@Controller @Controller
@RequestMapping("/person") @RequestMapping("/person")
@ -24,13 +25,16 @@ public class PersonController
{ {
@Autowired @Autowired
private PersonDao personDao; private PersonDao personDao;
@Autowired @Autowired
private ContactController contactController; private ContactController contactController;
@Autowired @Autowired
private AdressController adressController; private AdressController adressController;
@GetMapping @GetMapping
@PreAuthorize("hasAnyRole('trainer', 'admin')") @PreAuthorize("hasAnyRole('trainer', 'admin')")
@ApiOperation("Get a list of all persons. Restricted to trainers and admins.")
public @ResponseBody Iterable<Person> getAll() public @ResponseBody Iterable<Person> getAll()
{ {
return personDao.findAll(); return personDao.findAll();

@ -14,4 +14,5 @@ public interface AttendanceDao extends CrudRepository<Attendance, Integer> {
List<Attendance> findByPerson(Person person); List<Attendance> findByPerson(Person person);
Attendance findByPersonAndOnDate(Person person, Date onDate);
} }

@ -10,22 +10,20 @@ import javax.persistence.Temporal;
import javax.persistence.TemporalType; import javax.persistence.TemporalType;
@MappedSuperclass @MappedSuperclass
public abstract class BaseEntity implements EntityAccessor { public abstract class BaseEntity implements EntityAccessor
{
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private int id;
@Temporal(TemporalType.TIMESTAMP) @Temporal(TemporalType.TIMESTAMP)
private Date changed; private Date changed;
@Temporal(TemporalType.TIMESTAMP) @Temporal(TemporalType.TIMESTAMP)
private Date created; private Date created;
@Temporal(TemporalType.TIMESTAMP) @Temporal(TemporalType.TIMESTAMP)
private Date deleted; private Date deleted;
public Date getChanged() { public Date getChanged()
{
if (changed == null) { if (changed == null) {
return null; return null;
} }
@ -33,11 +31,13 @@ public abstract class BaseEntity implements EntityAccessor {
} }
@Override @Override
public void setChanged(Date changed) { public void setChanged(Date changed)
{
this.changed = new Date(changed.getTime()); this.changed = new Date(changed.getTime());
} }
public Date getCreated() { public Date getCreated()
{
if (created == null) { if (created == null) {
return null; return null;
} }
@ -45,37 +45,44 @@ public abstract class BaseEntity implements EntityAccessor {
} }
@Override @Override
public void setCreated(Date created) { public void setCreated(Date created)
{
this.created = new Date(created.getTime()); this.created = new Date(created.getTime());
} }
public Date getDeleted() { public Date getDeleted()
{
if (deleted == null) { if (deleted == null) {
return null; return null;
} }
return new Date(this.deleted.getTime()); return new Date(this.deleted.getTime());
} }
public void setDeleted(Date deleted) { public void setDeleted(Date deleted)
{
this.deleted = new Date(deleted.getTime()); this.deleted = new Date(deleted.getTime());
} }
@Override @Override
public Integer getId() { public Integer getId()
{
return id; return id;
} }
public void setId(int id) { public void setId(int id)
{
this.id = id; this.id = id;
} }
@Override @Override
public boolean hasValidId() { public boolean hasValidId()
{
return id > 0; return id > 0;
} }
@Override @Override
public int hashCode() { public int hashCode()
{
final int prime = 31; final int prime = 31;
int result = 1; int result = 1;
result = prime * result + ((changed == null) ? 0 : changed.hashCode()); result = prime * result + ((changed == null) ? 0 : changed.hashCode());
@ -86,7 +93,8 @@ public abstract class BaseEntity implements EntityAccessor {
} }
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj)
{
if (this == obj) { if (this == obj) {
return true; return true;
} }
@ -101,7 +109,8 @@ public abstract class BaseEntity implements EntityAccessor {
if (other.deleted != null) { if (other.deleted != null) {
return false; return false;
} }
} else if (!deleted.equals(other.deleted)) { }
else if (!deleted.equals(other.deleted)) {
return false; return false;
} }
if (id != other.id) { if (id != other.id) {
@ -111,7 +120,8 @@ public abstract class BaseEntity implements EntityAccessor {
} }
@Override @Override
public String toString() { public String toString()
{
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("BaseEntity [id="); stringBuilder.append("BaseEntity [id=");
stringBuilder.append(id); stringBuilder.append(id);
@ -124,5 +134,4 @@ public abstract class BaseEntity implements EntityAccessor {
stringBuilder.append("]"); stringBuilder.append("]");
return stringBuilder.toString(); return stringBuilder.toString();
} }
} }

@ -10,36 +10,38 @@ import javax.persistence.Table;
/** /**
* The persistent class for the groupDef database table. * The persistent class for the groupDef database table.
*
*/ */
@Entity @Entity
@Table(name = "groupdef") @Table(name = "groupdef")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@NamedQuery(name = GroupDef.QUERY_FINDALL, query = "SELECT g FROM GroupDef g") @NamedQuery(name = GroupDef.QUERY_FINDALL, query = "SELECT g FROM GroupDef g")
public class GroupDef extends BaseEntity implements Serializable { public class GroupDef extends BaseEntity implements Serializable
{
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public final static String QUERY_FINDALL = "GroupDef.findAll"; public final static String QUERY_FINDALL = "GroupDef.findAll";
private String name; private String name;
public String getName() { public String getName()
{
return name; return name;
} }
public void setName(String name) { public void setName(String name)
{
this.name = name; this.name = name;
} }
@Override @Override
public int hashCode() { public int hashCode()
{
final int prime = 53; final int prime = 53;
return prime * super.hashCode(); return prime * super.hashCode();
} }
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj)
{
if (this == obj) { if (this == obj) {
return true; return true;
} }
@ -47,8 +49,8 @@ public class GroupDef extends BaseEntity implements Serializable {
} }
@Override @Override
public String toString() { public String toString()
{
return "GroupDef [id=" + getId() + ", name=" + name + "]"; return "GroupDef [id=" + getId() + ", name=" + name + "]";
} }
} }

@ -10,7 +10,7 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.TestPropertySource;
import de.kreth.clubhelper.model.dao.GroupDao; import de.kreth.clubhelper.model.dao.GroupDao;
import de.kreth.clubhelper.model.dao.PersonDao; import de.kreth.clubhelper.model.dao.PersonDao;
@ -19,25 +19,25 @@ import de.kreth.clubhelper.model.data.GroupDef;
import de.kreth.clubhelper.model.data.Person; import de.kreth.clubhelper.model.data.Person;
@DataJpaTest() @DataJpaTest()
@Sql(scripts = "classpath:data.sql") //@Sql(scripts = "classpath:data.sql")
class LoadPersonsTest { @TestPropertySource(properties = {
"spring.jpa.hibernate.ddl-auto=none"
})
class LoadPersonsTest
{
@Autowired @Autowired
PersonDao personDao; PersonDao personDao;
@Autowired @Autowired
GroupDao groupDao; GroupDao groupDao;
private GroupDef aktive; private GroupDef aktive;
private GroupDef trainer; private GroupDef trainer;
private GroupDef competitor; private GroupDef competitor;
private GroupDef admin; private GroupDef admin;
@BeforeEach @BeforeEach
void loadGroups() { void loadGroups()
{
aktive = groupDao.findById(1).get(); aktive = groupDao.findById(1).get();
trainer = groupDao.findById(3).get(); trainer = groupDao.findById(3).get();
competitor = groupDao.findById(7).get(); competitor = groupDao.findById(7).get();
@ -49,30 +49,30 @@ class LoadPersonsTest {
} }
@Test @Test
void testLoadPerson1() { void testLoadPerson1()
{
Optional<Person> person1 = personDao.findById(1); Optional<Person> person1 = personDao.findById(1);
assertTrue(person1.isPresent(), "Person with id=1 not found!"); assertTrue(person1.isPresent(), "Person with id=1 not found!");
assertTrue(person1.get().isMember(trainer)); assertTrue(person1.get().isMember(trainer));
} }
@Test @Test
void testLoadAll() { void testLoadAll()
{
Iterable<Person> all = personDao.findAll(); Iterable<Person> all = personDao.findAll();
assertTrue(all.iterator().hasNext(), "No data found in Person"); assertTrue(all.iterator().hasNext(), "No data found in Person");
} }
@Test @Test
void insertPerson() { void insertPerson()
{
Person p = new Person(); Person p = new Person();
p.setPrename("prename"); p.setPrename("prename");
p.setSurname("surname"); p.setSurname("surname");
p.setBirth(LocalDate.of(1981, 3, 3)); p.setBirth(LocalDate.of(1981, 3, 3));
p.setGender(Gender.MALE); p.setGender(Gender.MALE);
personDao.save(p); personDao.save(p);
assertNotNull(p.getId()); assertNotNull(p.getId());
personDao.delete(p); personDao.delete(p);
} }
} }

@ -26,11 +26,16 @@ import de.kreth.clubhelper.model.dao.PersonDao;
import de.kreth.clubhelper.model.data.Gender; import de.kreth.clubhelper.model.data.Gender;
import de.kreth.clubhelper.model.data.Person; import de.kreth.clubhelper.model.data.Person;
@WebMvcTest(excludeAutoConfiguration = { DataSourceAutoConfiguration.class, JdbcRepositoriesAutoConfiguration.class, @WebMvcTest(excludeAutoConfiguration =
DataSourceTransactionManagerAutoConfiguration.class, JdbcTemplateAutoConfiguration.class, {
SecurityAutoConfiguration.class }) DataSourceAutoConfiguration.class,
class PersonControllerTest { JdbcRepositoriesAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
JdbcTemplateAutoConfiguration.class,
SecurityAutoConfiguration.class
})
class PersonControllerTest
{
@Autowired @Autowired
MockMvc mvc; MockMvc mvc;
@ -38,42 +43,41 @@ class PersonControllerTest {
PersonDao personDao; PersonDao personDao;
private Person p1; private Person p1;
private Person p2; private Person p2;
@BeforeEach @BeforeEach
void initMocks() { void initMocks()
{
p1 = new Person(); p1 = new Person();
p1.setId(1); p1.setId(1);
p1.setPrename("prename"); p1.setPrename("prename");
p1.setSurname("surname"); p1.setSurname("surname");
p1.setBirth(LocalDate.of(2000, 1, 1)); p1.setBirth(LocalDate.of(2000, 1, 1));
p1.setGender(Gender.MALE); p1.setGender(Gender.MALE);
p2 = new Person(); p2 = new Person();
p2.setId(1); p2.setId(1);
p2.setPrename("prename"); p2.setPrename("prename");
p2.setSurname("surname"); p2.setSurname("surname");
p2.setBirth(LocalDate.of(2000, 1, 1)); p2.setBirth(LocalDate.of(2000, 1, 1));
p2.setGender(Gender.MALE); p2.setGender(Gender.MALE);
when(personDao.findAll()).thenReturn(Arrays.asList(p1, p2)); when(personDao.findAll()).thenReturn(Arrays.asList(p1, p2));
when(personDao.findById(1)).thenReturn(Optional.of(p1)); when(personDao.findById(1)).thenReturn(Optional.of(p1));
when(personDao.findById(2)).thenReturn(Optional.of(p2)); when(personDao.findById(2)).thenReturn(Optional.of(p2));
} }
@Test @Test
void callAllPersons() throws Exception { void callAllPersons() throws Exception
{
String jsonListOfPersons = "[{\"id\":1,\"changed\":null,\"created\":null,\"deleted\":null,\"birth\":\"2000-01-01\",\"prename\":\"prename\",\"surname\":\"surname\",\"username\":null,\"password\":null,\"gender\":\"MALE\"},{\"id\":1,\"changed\":null,\"created\":null,\"deleted\":null,\"birth\":\"2000-01-01\",\"prename\":\"prename\",\"surname\":\"surname\",\"username\":null,\"password\":null,\"gender\":\"MALE\"}]"; String jsonListOfPersons = "[{\"id\":1,\"changed\":null,\"created\":null,\"deleted\":null,\"birth\":\"2000-01-01\",\"prename\":\"prename\",\"surname\":\"surname\",\"username\":null,\"password\":null,\"gender\":\"MALE\"},{\"id\":1,\"changed\":null,\"created\":null,\"deleted\":null,\"birth\":\"2000-01-01\",\"prename\":\"prename\",\"surname\":\"surname\",\"username\":null,\"password\":null,\"gender\":\"MALE\"}]";
mvc.perform(get("/person").accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)) mvc.perform(get("/person").accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)).andExpect(status().isOk())
.andExpect(status().isOk()).andExpect(content().string(jsonListOfPersons)); .andExpect(content().string(jsonListOfPersons));
} }
@Test @Test
void callPerson1() throws Exception { void callPerson1() throws Exception
{
String jsonListOfPersons = "{\"id\":1,\"changed\":null,\"created\":null,\"deleted\":null,\"birth\":\"2000-01-01\",\"prename\":\"prename\",\"surname\":\"surname\",\"username\":null,\"password\":null,\"gender\":\"MALE\"}"; String jsonListOfPersons = "{\"id\":1,\"changed\":null,\"created\":null,\"deleted\":null,\"birth\":\"2000-01-01\",\"prename\":\"prename\",\"surname\":\"surname\",\"username\":null,\"password\":null,\"gender\":\"MALE\"}";
mvc.perform(get("/person/1").accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)) mvc.perform(get("/person/1").accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)).andExpect(status().isOk())
.andExpect(status().isOk()).andExpect(content().string(jsonListOfPersons)); .andExpect(content().string(jsonListOfPersons));
} }
} }

Loading…
Cancel
Save