Skip to content

Commit c846b30

Browse files
committed
feat: include relationship to record
1 parent b054305 commit c846b30

18 files changed

Lines changed: 287 additions & 58 deletions

.editorconfig

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
root = true
2+
3+
[*] # This applies to all files in the project
4+
indent_style = space
5+
indent_size = 4

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM ibm-semeru-runtimes:open-17-jre-focal
1+
FROM ibm-semeru-runtimes:open-21-jdk-focal
22

33
WORKDIR /home/app
44

README.md

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,30 @@ Template for a Spring Boot project including Spring REST, HATEOAS, JPA, etc. Add
2525

2626
## Entities Model
2727

28-
![EntityModelsDiagram](http://www.plantuml.com/plantuml/svg/5Sqn3W8X40NGtbFe0M1wgxNOJXEJZGT061SI6CZC9rvVjthbMmn1CLizNOh4EXDFhUSC3BiIQVZwlI3FzpJMs0KiyB4tUgMxMv-Rs_e7DusPR6YHtO7Rg05CBHXOQHKK5BP7JrpzEAA59Vtz0G00?v0)
29-
28+
```mermaid
29+
classDiagram
30+
class UriEntity {
31+
uri : String
32+
}
33+
34+
class UserDetails
35+
<<interface>> UserDetails
36+
37+
class User {
38+
username : String
39+
password : String
40+
email : String
41+
}
42+
43+
class Resource {
44+
name: String
45+
description: String
46+
created: ZonedDateTime
47+
modified: ZonedDateTime
48+
}
49+
50+
UriEntity <|-- User
51+
UserDetails <|-- User
52+
UriEntity <|-- Resource
53+
User "1" <-- "*" Resource: ownedBy
54+
```

pom.xml

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
<dependency>
7878
<groupId>org.projectlombok</groupId>
7979
<artifactId>lombok</artifactId>
80-
<optional>true</optional>
80+
<scope>provided</scope>
8181
</dependency>
8282
<dependency>
8383
<groupId>org.springframework.boot</groupId>
@@ -89,12 +89,12 @@
8989
<artifactId>spring-security-test</artifactId>
9090
<scope>test</scope>
9191
</dependency>
92-
<dependency>
93-
<groupId>io.cucumber</groupId>
94-
<artifactId>cucumber-junit</artifactId>
95-
<version>7.19.0</version>
96-
<scope>test</scope>
97-
</dependency>
92+
<dependency>
93+
<groupId>io.cucumber</groupId>
94+
<artifactId>cucumber-junit-platform-engine</artifactId>
95+
<version>7.19.0</version>
96+
<scope>test</scope>
97+
</dependency>
9898
<dependency>
9999
<groupId>io.cucumber</groupId>
100100
<artifactId>cucumber-java</artifactId>
@@ -107,33 +107,36 @@
107107
<version>7.19.0</version>
108108
<scope>test</scope>
109109
</dependency>
110-
<dependency>
111-
<groupId>org.junit.vintage</groupId>
112-
<artifactId>junit-vintage-engine</artifactId>
113-
<scope>test</scope>
114-
<exclusions>
115-
<exclusion>
116-
<groupId>org.hamcrest</groupId>
117-
<artifactId>hamcrest-core</artifactId>
118-
</exclusion>
119-
</exclusions>
120-
</dependency>
121110
</dependencies>
122111

123112
<build>
124113
<plugins>
125114
<plugin>
126115
<groupId>org.springframework.boot</groupId>
127116
<artifactId>spring-boot-maven-plugin</artifactId>
128-
<configuration>
129-
<excludes>
130-
<exclude>
131-
<groupId>org.projectlombok</groupId>
132-
<artifactId>lombok</artifactId>
133-
</exclude>
134-
</excludes>
135-
</configuration>
136117
</plugin>
118+
<plugin>
119+
<groupId>org.apache.maven.plugins</groupId>
120+
<artifactId>maven-surefire-plugin</artifactId>
121+
<version>3.2.5</version>
122+
<configuration>
123+
<useModulePath>false</useModulePath>
124+
</configuration>
125+
</plugin>
126+
<plugin>
127+
<groupId>org.apache.maven.plugins</groupId>
128+
<artifactId>maven-compiler-plugin</artifactId>
129+
<version>3.14.0</version>
130+
<configuration>
131+
<annotationProcessorPaths>
132+
<path>
133+
<groupId>org.projectlombok</groupId>
134+
<artifactId>lombok</artifactId>
135+
<version>1.18.34</version>
136+
</path>
137+
</annotationProcessorPaths>
138+
</configuration>
139+
</plugin>
137140
</plugins>
138141
</build>
139142

src/main/java/cat/udl/eps/softarch/demo/config/BasicUserDetailsService.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package cat.udl.eps.softarch.demo.config;
22

33
import cat.udl.eps.softarch.demo.repository.UserRepository;
4-
import org.springframework.beans.factory.annotation.Autowired;
54
import org.springframework.security.core.userdetails.UserDetails;
65
import org.springframework.security.core.userdetails.UserDetailsService;
76
import org.springframework.security.core.userdetails.UsernameNotFoundException;

src/main/java/cat/udl/eps/softarch/demo/config/DBInitialization.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,29 @@
11
package cat.udl.eps.softarch.demo.config;
2+
import cat.udl.eps.softarch.demo.domain.Record;
23
import cat.udl.eps.softarch.demo.domain.User;
4+
import cat.udl.eps.softarch.demo.repository.RecordRepository;
35
import cat.udl.eps.softarch.demo.repository.UserRepository;
46
import org.springframework.beans.factory.annotation.Value;
57
import org.springframework.context.annotation.Configuration;
68
import jakarta.annotation.PostConstruct;
9+
10+
import java.time.ZonedDateTime;
711
import java.util.Arrays;
812

913
@Configuration
1014
public class DBInitialization {
1115
@Value("${default-password}")
1216
String defaultPassword;
17+
1318
@Value("${spring.profiles.active:}")
1419
private String activeProfiles;
20+
21+
private final RecordRepository recordRepository;
1522
private final UserRepository userRepository;
1623

17-
public DBInitialization(UserRepository userRepository) {
24+
public DBInitialization(UserRepository userRepository, RecordRepository recordRepository) {
1825
this.userRepository = userRepository;
26+
this.recordRepository = recordRepository;
1927
}
2028

2129
@PostConstruct
@@ -37,7 +45,14 @@ public void initializeDatabase() {
3745
user.setId("test");
3846
user.setPassword(defaultPassword);
3947
user.encodePassword();
40-
userRepository.save(user);
48+
user = userRepository.save(user);
49+
cat.udl.eps.softarch.demo.domain.Record record = new Record();
50+
record.setName("My test record");
51+
record.setDescription("A record used for testing purposes, nothing more, nothing less...");
52+
record.setCreated(ZonedDateTime.now());
53+
record.setModified(record.getCreated());
54+
record.setOwnedBy(user);
55+
recordRepository.save(record);
4156
}
4257
}
4358
}

src/main/java/cat/udl/eps/softarch/demo/config/WebSecurityConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public class WebSecurityConfig {
2828
protected SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
2929
http.authorizeHttpRequests((auth) -> auth
3030
.requestMatchers(HttpMethod.GET, "/identity").authenticated()
31+
.requestMatchers(HttpMethod.GET, "/users").authenticated()
3132
.requestMatchers(HttpMethod.POST, "/users").anonymous()
3233
.requestMatchers(HttpMethod.POST, "/users/*").denyAll()
3334
.requestMatchers(HttpMethod.POST, "/*/*").authenticated()
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package cat.udl.eps.softarch.demo.domain;
2+
3+
import com.fasterxml.jackson.annotation.JsonIdentityReference;
4+
import jakarta.persistence.*;
5+
import jakarta.validation.constraints.NotBlank;
6+
import lombok.Data;
7+
import lombok.EqualsAndHashCode;
8+
import org.springframework.format.annotation.DateTimeFormat;
9+
10+
import java.time.ZonedDateTime;
11+
12+
@Entity
13+
@Data
14+
@EqualsAndHashCode(callSuper = true)
15+
public class Record extends UriEntity<Long> {
16+
17+
@Id
18+
@GeneratedValue(strategy = GenerationType.IDENTITY)
19+
private Long id;
20+
21+
@NotBlank
22+
private String name;
23+
24+
private String description;
25+
26+
@DateTimeFormat
27+
private ZonedDateTime created;
28+
29+
@DateTimeFormat
30+
private ZonedDateTime modified;
31+
32+
@ManyToOne
33+
@JsonIdentityReference(alwaysAsId = true)
34+
private User ownedBy;
35+
36+
37+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package cat.udl.eps.softarch.demo.handler;
2+
3+
import cat.udl.eps.softarch.demo.domain.Record;
4+
import cat.udl.eps.softarch.demo.repository.RecordRepository;
5+
import org.springframework.data.rest.core.annotation.*;
6+
import org.springframework.stereotype.Component;
7+
8+
import java.time.ZonedDateTime;
9+
10+
@Component
11+
@RepositoryEventHandler
12+
public class RecordEventHandler {
13+
final RecordRepository recordRepository;
14+
15+
public RecordEventHandler(RecordRepository recordRepository) {
16+
this.recordRepository = recordRepository;
17+
}
18+
19+
@HandleBeforeCreate
20+
public void handleRecordPreCreate(Record record) {
21+
ZonedDateTime timeStamp = ZonedDateTime.now();
22+
record.setCreated(timeStamp);
23+
record.setModified(timeStamp);
24+
}
25+
26+
@HandleBeforeSave
27+
public void handleRecordPreSave(Record record) {
28+
ZonedDateTime timeStamp = ZonedDateTime.now();
29+
record.setModified(timeStamp);
30+
}
31+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package cat.udl.eps.softarch.demo.repository;
2+
3+
import cat.udl.eps.softarch.demo.domain.Record;
4+
import cat.udl.eps.softarch.demo.domain.User;
5+
import org.springframework.data.repository.CrudRepository;
6+
import org.springframework.data.repository.PagingAndSortingRepository;
7+
import org.springframework.data.repository.query.Param;
8+
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
9+
10+
import java.util.List;
11+
12+
@RepositoryRestResource
13+
public interface RecordRepository extends CrudRepository<cat.udl.eps.softarch.demo.domain.Record, Long>, PagingAndSortingRepository<Record, Long> {
14+
List<cat.udl.eps.softarch.demo.domain.Record> findByOwnedBy(@Param("user") User owner);
15+
}

0 commit comments

Comments
 (0)