Skip to content

Commit 22005d6

Browse files
committed
feat: Implement MinIO and Hibernate
fix: Refactor classes
1 parent 45fd8c4 commit 22005d6

37 files changed

+355
-750
lines changed

docker-compose.yaml

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ volumes:
55
driver: local
66
db-data:
77
driver: local
8+
minio-data:
9+
driver: local
810

911
services:
1012
app:
@@ -13,6 +15,8 @@ services:
1315
container_name: tasklist
1416
depends_on:
1517
- db
18+
- minio
19+
- redis
1620
env_file:
1721
- .env
1822
ports:
@@ -37,4 +41,17 @@ services:
3741
- '6379:6379'
3842
command: redis-server --save 20 1 --loglevel warning --requirepass ${REDIS_PASSWORD}
3943
volumes:
40-
- cache:/data
44+
- cache:/data
45+
46+
minio:
47+
image: minio/minio:latest
48+
container_name: minio
49+
environment:
50+
- MINIO_ROOT_USER=${MINIO_ACCESS_KEY}
51+
- MINIO_ROOT_PASSWORD=${MINIO_SECRET_KEY}
52+
command: server ~/minio --console-address :9090
53+
ports:
54+
- '9090:9090'
55+
- '9000:9000'
56+
volumes:
57+
- minio-data:/minio

pom.xml

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@
2424
<hibernate-validator.version>8.0.0.Final</hibernate-validator.version>
2525
<jakarta-validation.version>3.0.2</jakarta-validation.version>
2626
<jjwt.version>0.11.5</jjwt.version>
27-
<mybatis.version>3.0.1</mybatis.version>
2827
<liquibase.version>4.19.0</liquibase.version>
2928
<springdoc.version>2.0.2</springdoc.version>
29+
<preliquibase.version>1.3.0</preliquibase.version>
30+
<minio.version>8.5.3</minio.version>
3031
</properties>
3132

3233
<dependencies>
@@ -61,18 +62,18 @@
6162
<artifactId>spring-boot-configuration-processor</artifactId>
6263
</dependency>
6364

64-
<dependency>
65-
<groupId>org.mybatis.spring.boot</groupId>
66-
<artifactId>mybatis-spring-boot-starter</artifactId>
67-
<version>${mybatis.version}</version>
68-
</dependency>
69-
7065
<dependency>
7166
<groupId>org.liquibase</groupId>
7267
<artifactId>liquibase-core</artifactId>
7368
<version>${liquibase.version}</version>
7469
</dependency>
7570

71+
<dependency>
72+
<groupId>net.lbruun.springboot</groupId>
73+
<artifactId>preliquibase-spring-boot-starter</artifactId>
74+
<version>${preliquibase.version}</version>
75+
</dependency>
76+
7677
<dependency>
7778
<groupId>org.postgresql</groupId>
7879
<artifactId>postgresql</artifactId>
@@ -137,6 +138,12 @@
137138
<version>${springdoc.version}</version>
138139
</dependency>
139140

141+
<dependency>
142+
<groupId>io.minio</groupId>
143+
<artifactId>minio</artifactId>
144+
<version>${minio.version}</version>
145+
</dependency>
146+
140147
</dependencies>
141148

142149
<build>

src/main/java/com/example/tasklist/config/ApplicationConfig.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.example.tasklist.config;
22

3+
import com.example.tasklist.service.props.MinioProperties;
34
import com.example.tasklist.web.security.JwtTokenFilter;
45
import com.example.tasklist.web.security.JwtTokenProvider;
56
import com.example.tasklist.web.security.expression.CustomSecurityExceptionHandler;
7+
import io.minio.MinioClient;
68
import io.swagger.v3.oas.models.Components;
79
import io.swagger.v3.oas.models.OpenAPI;
810
import io.swagger.v3.oas.models.info.Info;
@@ -35,6 +37,7 @@ public class ApplicationConfig {
3537

3638
private final JwtTokenProvider tokenProvider;
3739
private final ApplicationContext applicationContext;
40+
private final MinioProperties minioProperties;
3841

3942
@Bean
4043
public PasswordEncoder passwordEncoder() {
@@ -53,6 +56,14 @@ public MethodSecurityExpressionHandler expressionHandler() {
5356
return expressionHandler;
5457
}
5558

59+
@Bean
60+
public MinioClient minioClient() {
61+
return MinioClient.builder()
62+
.endpoint(minioProperties.getUrl())
63+
.credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey())
64+
.build();
65+
}
66+
5667
@Bean
5768
public OpenAPI openAPI() {
5869
return new OpenAPI()
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.example.tasklist.domain.exception;
2+
3+
public class ImageUploadException extends RuntimeException {
4+
5+
public ImageUploadException(String message) {
6+
super(message);
7+
}
8+
9+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,41 @@
11
package com.example.tasklist.domain.task;
22

3+
import jakarta.persistence.CollectionTable;
4+
import jakarta.persistence.Column;
5+
import jakarta.persistence.ElementCollection;
6+
import jakarta.persistence.Entity;
7+
import jakarta.persistence.EnumType;
8+
import jakarta.persistence.Enumerated;
9+
import jakarta.persistence.GeneratedValue;
10+
import jakarta.persistence.GenerationType;
11+
import jakarta.persistence.Id;
12+
import jakarta.persistence.Table;
313
import lombok.Data;
414

515
import java.io.Serializable;
616
import java.time.LocalDateTime;
17+
import java.util.List;
718

19+
@Entity
20+
@Table(name = "tasks")
821
@Data
922
public class Task implements Serializable {
1023

24+
@Id
25+
@GeneratedValue(strategy = GenerationType.AUTO)
1126
private Long id;
27+
1228
private String title;
1329
private String description;
30+
31+
@Enumerated(value = EnumType.STRING)
1432
private Status status;
33+
1534
private LocalDateTime expirationDate;
1635

36+
@Column(name = "image")
37+
@CollectionTable(name = "tasks_images")
38+
@ElementCollection
39+
private List<String> images;
40+
1741
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.example.tasklist.domain.task;
2+
3+
import lombok.Data;
4+
import org.springframework.web.multipart.MultipartFile;
5+
6+
@Data
7+
public class TaskImage {
8+
9+
private MultipartFile file;
10+
11+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,51 @@
11
package com.example.tasklist.domain.user;
22

33
import com.example.tasklist.domain.task.Task;
4+
import jakarta.persistence.CollectionTable;
5+
import jakarta.persistence.Column;
6+
import jakarta.persistence.ElementCollection;
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.EnumType;
9+
import jakarta.persistence.Enumerated;
10+
import jakarta.persistence.FetchType;
11+
import jakarta.persistence.GeneratedValue;
12+
import jakarta.persistence.GenerationType;
13+
import jakarta.persistence.Id;
14+
import jakarta.persistence.JoinColumn;
15+
import jakarta.persistence.OneToMany;
16+
import jakarta.persistence.Table;
17+
import jakarta.persistence.Transient;
418
import lombok.Data;
519

620
import java.io.Serializable;
721
import java.util.List;
822
import java.util.Set;
923

24+
@Entity
25+
@Table(name = "users")
1026
@Data
1127
public class User implements Serializable {
1228

29+
@Id
30+
@GeneratedValue(strategy = GenerationType.AUTO)
1331
private Long id;
32+
1433
private String name;
1534
private String username;
1635
private String password;
36+
37+
@Transient
1738
private String passwordConfirmation;
39+
40+
@Column(name = "role")
41+
@ElementCollection(fetch = FetchType.EAGER)
42+
@CollectionTable(name = "users_roles")
43+
@Enumerated(value = EnumType.STRING)
1844
private Set<Role> roles;
45+
46+
@CollectionTable(name = "users_tasks")
47+
@OneToMany
48+
@JoinColumn(name = "task_id")
1949
private List<Task> tasks;
2050

2151
}

src/main/java/com/example/tasklist/repository/DataSourceConfig.java

Lines changed: 0 additions & 20 deletions
This file was deleted.
Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,19 @@
11
package com.example.tasklist.repository;
22

33
import com.example.tasklist.domain.task.Task;
4-
import org.apache.ibatis.annotations.Mapper;
5-
import org.apache.ibatis.annotations.Param;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.data.jpa.repository.Query;
6+
import org.springframework.data.repository.query.Param;
67

78
import java.util.List;
8-
import java.util.Optional;
99

10-
@Mapper
11-
public interface TaskRepository {
10+
public interface TaskRepository extends JpaRepository<Task, Long> {
1211

13-
Optional<Task> findById(Long id);
14-
15-
List<Task> findAllByUserId(Long userId);
16-
17-
void assignToUserById(@Param("taskId") Long taskId, @Param("userId") Long userId);
18-
19-
void update(Task task);
20-
21-
void create(Task task);
22-
23-
void delete(Long id);
12+
@Query(value = """
13+
SELECT * FROM tasks t
14+
JOIN users_tasks ut ON ut.task_id = t.id
15+
WHERE ut.user_id = :userId
16+
""", nativeQuery = true)
17+
List<Task> findAllByUserId(@Param("userId") Long userId);
2418

2519
}
Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,23 @@
11
package com.example.tasklist.repository;
22

3-
import com.example.tasklist.domain.user.Role;
43
import com.example.tasklist.domain.user.User;
5-
import org.apache.ibatis.annotations.Mapper;
6-
import org.apache.ibatis.annotations.Param;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.data.jpa.repository.Query;
6+
import org.springframework.data.repository.query.Param;
77

88
import java.util.Optional;
99

10-
@Mapper
11-
public interface UserRepository {
12-
13-
Optional<User> findById(Long id);
10+
public interface UserRepository extends JpaRepository<User, Long> {
1411

1512
Optional<User> findByUsername(String username);
1613

17-
void update(User user);
18-
19-
void create(User user);
20-
21-
void insertUserRole(@Param("userId") Long userId, @Param("role") Role role);
22-
14+
@Query(value = """
15+
SELECT exists(
16+
SELECT 1
17+
FROM users_tasks
18+
WHERE user_id = :userId
19+
AND task_id = :taskId)
20+
""", nativeQuery = true)
2321
boolean isTaskOwner(@Param("userId") Long userId, @Param("taskId") Long taskId);
2422

25-
void delete(Long id);
26-
2723
}

0 commit comments

Comments
 (0)