diff --git a/build.gradle.kts b/build.gradle.kts index fdf5863..f122ecf 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,38 +1,39 @@ plugins { - java - id("org.springframework.boot") version "3.3.3" - id("io.spring.dependency-management") version "1.1.6" + java + id("org.springframework.boot") version "3.3.3" + id("io.spring.dependency-management") version "1.1.6" } group = "com.miti99" version = "0.0.1-SNAPSHOT" java { - toolchain { - languageVersion = JavaLanguageVersion.of(21) - } + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } } configurations { - compileOnly { - extendsFrom(configurations.annotationProcessor.get()) - } + compileOnly { + extendsFrom(configurations.annotationProcessor.get()) + } } repositories { - mavenCentral() + mavenCentral() } dependencies { - implementation("org.springframework.boot:spring-boot-starter-data-mongodb") - implementation("org.springframework.boot:spring-boot-starter-data-redis") - implementation("org.springframework.boot:spring-boot-starter-web") - compileOnly("org.projectlombok:lombok") - annotationProcessor("org.projectlombok:lombok") - testImplementation("org.springframework.boot:spring-boot-starter-test") - testRuntimeOnly("org.junit.platform:junit-platform-launcher") + annotationProcessor("org.projectlombok:lombok") + + implementation("org.springframework.boot:spring-boot-starter-data-mongodb") + implementation("org.springframework.boot:spring-boot-starter-data-redis") + implementation("org.springframework.boot:spring-boot-starter-web") + + testImplementation("org.springframework.boot:spring-boot-starter-test") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } tasks.withType { - useJUnitPlatform() + useJUnitPlatform() } diff --git a/src/main/java/com/miti99/testdeployspringbootoncoolify/TestDeploySpringBootOnCoolifyApplication.java b/src/main/java/com/miti99/testdeployspringbootoncoolify/TestDeploySpringBootOnCoolifyApplication.java index 652a087..878c2eb 100644 --- a/src/main/java/com/miti99/testdeployspringbootoncoolify/TestDeploySpringBootOnCoolifyApplication.java +++ b/src/main/java/com/miti99/testdeployspringbootoncoolify/TestDeploySpringBootOnCoolifyApplication.java @@ -6,8 +6,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class TestDeploySpringBootOnCoolifyApplication { - public static void main(String[] args) { - SpringApplication.run(TestDeploySpringBootOnCoolifyApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(TestDeploySpringBootOnCoolifyApplication.class, args); + } } diff --git a/src/main/java/com/miti99/testdeployspringbootoncoolify/configuration/RedisConfig.java b/src/main/java/com/miti99/testdeployspringbootoncoolify/configuration/RedisConfig.java new file mode 100644 index 0000000..fea4542 --- /dev/null +++ b/src/main/java/com/miti99/testdeployspringbootoncoolify/configuration/RedisConfig.java @@ -0,0 +1,20 @@ +package com.miti99.testdeployspringbootoncoolify.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +public class RedisConfig { + + @Bean + public RedisTemplate redisTemplate(LettuceConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(new StringRedisSerializer()); + return template; + } +} diff --git a/src/main/java/com/miti99/testdeployspringbootoncoolify/controller/UserController.java b/src/main/java/com/miti99/testdeployspringbootoncoolify/controller/UserController.java new file mode 100644 index 0000000..8c584c5 --- /dev/null +++ b/src/main/java/com/miti99/testdeployspringbootoncoolify/controller/UserController.java @@ -0,0 +1,49 @@ +package com.miti99.testdeployspringbootoncoolify.controller; + +import com.miti99.testdeployspringbootoncoolify.entity.User; +import com.miti99.testdeployspringbootoncoolify.service.UserService; +import java.util.Optional; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/users") +public class UserController { + + @Autowired + private UserService userService; + + @PostMapping + public ResponseEntity createUser(@RequestBody User user) { + return ResponseEntity.ok(userService.createUser(user)); + } + + @GetMapping("/{id}") + public ResponseEntity getUser(@PathVariable String id) { + Optional user = userService.getUser(id); + return user.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); + } + + @PutMapping("/{id}") + public ResponseEntity updateUser(@PathVariable String id, @RequestBody User user) { + User updatedUser = userService.updateUser(id, user); + if (updatedUser != null) { + return ResponseEntity.ok(updatedUser); + } + return ResponseEntity.notFound().build(); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteUser(@PathVariable String id) { + userService.deleteUser(id); + return ResponseEntity.noContent().build(); + } +} diff --git a/src/main/java/com/miti99/testdeployspringbootoncoolify/entity/User.java b/src/main/java/com/miti99/testdeployspringbootoncoolify/entity/User.java new file mode 100644 index 0000000..d1a26a0 --- /dev/null +++ b/src/main/java/com/miti99/testdeployspringbootoncoolify/entity/User.java @@ -0,0 +1,14 @@ +package com.miti99.testdeployspringbootoncoolify.entity; + +import lombok.Data; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document(collection = "users") +@Data +public class User { + @Id + private String id; + private String name; + private String email; +} diff --git a/src/main/java/com/miti99/testdeployspringbootoncoolify/entity/UserCache.java b/src/main/java/com/miti99/testdeployspringbootoncoolify/entity/UserCache.java new file mode 100644 index 0000000..21a92a5 --- /dev/null +++ b/src/main/java/com/miti99/testdeployspringbootoncoolify/entity/UserCache.java @@ -0,0 +1,11 @@ +package com.miti99.testdeployspringbootoncoolify.entity; + +import java.io.Serializable; +import lombok.Data; + +@Data +public class UserCache implements Serializable { + private String id; + private String name; + private String email; +} diff --git a/src/main/java/com/miti99/testdeployspringbootoncoolify/repository/UserRepository.java b/src/main/java/com/miti99/testdeployspringbootoncoolify/repository/UserRepository.java new file mode 100644 index 0000000..7b3c2ba --- /dev/null +++ b/src/main/java/com/miti99/testdeployspringbootoncoolify/repository/UserRepository.java @@ -0,0 +1,7 @@ +package com.miti99.testdeployspringbootoncoolify.repository; + +import com.miti99.testdeployspringbootoncoolify.entity.User; +import org.springframework.data.mongodb.repository.MongoRepository; + +public interface UserRepository extends MongoRepository { +} diff --git a/src/main/java/com/miti99/testdeployspringbootoncoolify/service/UserService.java b/src/main/java/com/miti99/testdeployspringbootoncoolify/service/UserService.java new file mode 100644 index 0000000..317b4b1 --- /dev/null +++ b/src/main/java/com/miti99/testdeployspringbootoncoolify/service/UserService.java @@ -0,0 +1,52 @@ +package com.miti99.testdeployspringbootoncoolify.service; + +import com.miti99.testdeployspringbootoncoolify.entity.User; +import com.miti99.testdeployspringbootoncoolify.repository.UserRepository; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +@Service +public class UserService { + + @Autowired + private UserRepository userRepository; + + @Autowired + private RedisTemplate redisTemplate; + + private final String USER_CACHE_KEY = "USER_"; + + public User createUser(User user) { + User savedUser = userRepository.save(user); + redisTemplate.opsForValue().set(USER_CACHE_KEY + savedUser.getId(), savedUser.toString(), 10, TimeUnit.MINUTES); + return savedUser; + } + + public Optional getUser(String id) { + User user = (User) redisTemplate.opsForValue().get(USER_CACHE_KEY + id); + if (user == null) { + Optional userFromDb = userRepository.findById(id); + userFromDb.ifPresent(value -> redisTemplate.opsForValue().set(USER_CACHE_KEY + id, value, 10, TimeUnit.MINUTES)); + return userFromDb; + } + return Optional.of(user); + } + + public User updateUser(String id, User updatedUser) { + if (userRepository.existsById(id)) { + updatedUser.setId(id); + User savedUser = userRepository.save(updatedUser); + redisTemplate.opsForValue().set(USER_CACHE_KEY + savedUser.getId(), savedUser, 10, TimeUnit.MINUTES); + return savedUser; + } + return null; + } + + public void deleteUser(String id) { + userRepository.deleteById(id); + redisTemplate.delete(USER_CACHE_KEY + id); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 399f625..0000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=test-deploy-spring-boot-on-coolify diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..df397dc --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,7 @@ +spring: + data: + mongodb: + uri: ${MONGODB_URI:mongodb://localhost:27017/mydatabase} + redis: + host: ${REDIS_HOST:localhost} + port: ${REDIS_PORT:6379} diff --git a/src/test/java/com/miti99/testdeployspringbootoncoolify/TestDeploySpringBootOnCoolifyApplicationTests.java b/src/test/java/com/miti99/testdeployspringbootoncoolify/TestDeploySpringBootOnCoolifyApplicationTests.java index 9064fbf..11353bc 100644 --- a/src/test/java/com/miti99/testdeployspringbootoncoolify/TestDeploySpringBootOnCoolifyApplicationTests.java +++ b/src/test/java/com/miti99/testdeployspringbootoncoolify/TestDeploySpringBootOnCoolifyApplicationTests.java @@ -6,8 +6,8 @@ import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class TestDeploySpringBootOnCoolifyApplicationTests { - @Test - void contextLoads() { - } + @Test + void contextLoads() { + } }