From e9b9db9b0b774f83763141e56dd90704781dec97 Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Tue, 4 Feb 2025 12:54:37 +0100 Subject: [PATCH] core done i believe --- .gitignore | 7 ++ Dockerfile | 9 +++ build.gradle | 6 +- docker-compose.yml | 21 ++++++ src/main/java/com/booleanuk/api/Main.java | 11 ++++ .../java/com/booleanuk/api/tweet/Tweet.java | 36 +++++++++++ .../booleanuk/api/tweet/TweetController.java | 64 +++++++++++++++++++ .../booleanuk/api/tweet/TweetRepository.java | 6 ++ .../java/com/booleanuk/api/user/User.java | 40 ++++++++++++ .../booleanuk/api/user/UserController.java | 49 ++++++++++++++ .../booleanuk/api/user/UserRepository.java | 6 ++ 11 files changed, 252 insertions(+), 3 deletions(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 src/main/java/com/booleanuk/api/Main.java create mode 100644 src/main/java/com/booleanuk/api/tweet/Tweet.java create mode 100644 src/main/java/com/booleanuk/api/tweet/TweetController.java create mode 100644 src/main/java/com/booleanuk/api/tweet/TweetRepository.java create mode 100644 src/main/java/com/booleanuk/api/user/User.java create mode 100644 src/main/java/com/booleanuk/api/user/UserController.java create mode 100644 src/main/java/com/booleanuk/api/user/UserRepository.java diff --git a/.gitignore b/.gitignore index c2065bc..08efb1b 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,10 @@ out/ ### VS Code ### .vscode/ + +application.yml + +build/libs/ + +build/libs/*.jar +build/libs/*.war diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..921e94a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM mcr.microsoft.com/openjdk/jdk:21-ubuntu + +WORKDIR /app + +COPY /build/libs/java.docker.day.2-0.0.1.jar /app/java.docker.day.2-0.0.1.jar + +EXPOSE 4000 + +ENTRYPOINT [ "java", "-jar", "java.docker.day.2-0.0.1.jar" ] \ No newline at end of file diff --git a/build.gradle b/build.gradle index fb070c4..ce6a4ed 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.1.4' - id 'io.spring.dependency-management' version '1.1.3' + id 'org.springframework.boot' version '3.4.2' + id 'io.spring.dependency-management' version '1.1.7' } group = 'com.booleanuk' @@ -23,7 +23,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' - implementation 'org.postgresql:postgresql:42.6.0' + runtimeOnly 'org.postgresql:postgresql' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..f865b08 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,21 @@ +services: + app: + image: 'docker-day-2:latest' + container_name: app + depends_on: + - db + ports: + - '4000:4000' + environment: + - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/mypostgresuser + - SPRING_DATASOURCE_USERNAME=mypostgresuser + - SPRING_DATASOURCE_PASSWORD=mypostgrespassword + - SPRING_JPA_HIBERNATE_DDL_AUTO=update + + db: + image: 'postgres:latest' + container_name: db + environment: + - POSTGRES_USER=mypostgresuser + - POSTGRES_DATABASE=mypostgresuser + - POSTGRES_PASSWORD=mypostgrespassword \ No newline at end of file diff --git a/src/main/java/com/booleanuk/api/Main.java b/src/main/java/com/booleanuk/api/Main.java new file mode 100644 index 0000000..dca72b1 --- /dev/null +++ b/src/main/java/com/booleanuk/api/Main.java @@ -0,0 +1,11 @@ +package com.booleanuk.api; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Main { + public static void main(String[] args){ + SpringApplication.run(Main.class, args); + } +} diff --git a/src/main/java/com/booleanuk/api/tweet/Tweet.java b/src/main/java/com/booleanuk/api/tweet/Tweet.java new file mode 100644 index 0000000..0a30e5c --- /dev/null +++ b/src/main/java/com/booleanuk/api/tweet/Tweet.java @@ -0,0 +1,36 @@ +package com.booleanuk.api.tweet; + + +import com.booleanuk.api.user.User; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import jakarta.persistence.*; +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "tweets") +public class Tweet { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column(name = "message", nullable = false) + private String message; + + @ManyToOne + @JoinColumn(name = "user_id", nullable = false) // FK column in "tweets" table + @JsonIgnoreProperties({"tweets"}) + private User user; + + public Tweet(String message, User user){ + this.message = message; + this.user = user; + } + + public Tweet(int id){ + this.id = id; + } +} diff --git a/src/main/java/com/booleanuk/api/tweet/TweetController.java b/src/main/java/com/booleanuk/api/tweet/TweetController.java new file mode 100644 index 0000000..37be917 --- /dev/null +++ b/src/main/java/com/booleanuk/api/tweet/TweetController.java @@ -0,0 +1,64 @@ +package com.booleanuk.api.tweet; + +import com.booleanuk.api.user.User; +import com.booleanuk.api.user.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; + +import java.util.List; + +@RestController +@RequestMapping("tweets") +public class TweetController { + + @Autowired + private TweetRepository tweetRepository; + @Autowired + private UserRepository userRepository; + + @GetMapping + public ResponseEntity> getAll(){ + return ResponseEntity.ok(tweetRepository.findAll()); + } + + @GetMapping("/{id}") + public ResponseEntity> getAllTweetsFromUser(@PathVariable int userId){ + User user = userRepository.findById(userId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found") + ); + + return ResponseEntity.ok(user.getTweets()); + } + + @PostMapping + public ResponseEntity createTweet(@RequestBody Tweet tweet){ + User user = userRepository.findById(tweet.getUser().getId()) + .orElseThrow(() -> new RuntimeException("User not found")); + + tweet.setUser(user); + + return new ResponseEntity(this.tweetRepository.save(tweet), HttpStatus.CREATED); + } + + @PutMapping("/{id}") + public ResponseEntity updateTweet(@PathVariable int id, @RequestBody Tweet tweet){ + Tweet tweetToUpdate = tweetRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found") + ); + + tweetToUpdate.setMessage(tweet.getMessage()); + return new ResponseEntity(this.tweetRepository.save(tweetToUpdate), HttpStatus.CREATED); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteTweet(@PathVariable int id){ + Tweet tweetToDelete = this.tweetRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found") + ); + this.tweetRepository.delete(tweetToDelete); + return ResponseEntity.ok(tweetToDelete); + } +} diff --git a/src/main/java/com/booleanuk/api/tweet/TweetRepository.java b/src/main/java/com/booleanuk/api/tweet/TweetRepository.java new file mode 100644 index 0000000..f7df849 --- /dev/null +++ b/src/main/java/com/booleanuk/api/tweet/TweetRepository.java @@ -0,0 +1,6 @@ +package com.booleanuk.api.tweet; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TweetRepository extends JpaRepository { +} diff --git a/src/main/java/com/booleanuk/api/user/User.java b/src/main/java/com/booleanuk/api/user/User.java new file mode 100644 index 0000000..af9ba90 --- /dev/null +++ b/src/main/java/com/booleanuk/api/user/User.java @@ -0,0 +1,40 @@ +package com.booleanuk.api.user; + + +import com.booleanuk.api.tweet.Tweet; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import jakarta.persistence.*; +import lombok.*; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "users") +public class User { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column(name = "username", nullable = false, unique = true) + private String username; + + @Column(name = "password") + private String password; + + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) + @JsonIgnoreProperties({"user", "id"}) + private List tweets = new ArrayList<>(); + + public User(String username){ + this.username = username; + } + + public User(int id){ + this.id = id; + } +} diff --git a/src/main/java/com/booleanuk/api/user/UserController.java b/src/main/java/com/booleanuk/api/user/UserController.java new file mode 100644 index 0000000..b72ea56 --- /dev/null +++ b/src/main/java/com/booleanuk/api/user/UserController.java @@ -0,0 +1,49 @@ +package com.booleanuk.api.user; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; + +import java.nio.file.Path; +import java.util.List; + +@RestController +@RequestMapping("users") +public class UserController { + + @Autowired + private UserRepository userRepository; + + @GetMapping + public ResponseEntity> getAll(){ + return ResponseEntity.ok(userRepository.findAll()); + } + + @PostMapping + public ResponseEntity createUser(@RequestBody User user){ + return new ResponseEntity(this.userRepository.save(user), HttpStatus.CREATED); + } + + @PutMapping("/{id}") + public ResponseEntity updateUser(@PathVariable int id, @RequestBody User user){ + User userToUpdate = this.userRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found") + ); + + userToUpdate.setUsername(user.getUsername()); + userToUpdate.setPassword(user.getPassword()); + return new ResponseEntity(this.userRepository.save(userToUpdate), HttpStatus.CREATED); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteUser(@PathVariable int id){ + User userToDelete = this.userRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found") + ); + + this.userRepository.delete(userToDelete); + return ResponseEntity.ok(userToDelete); + } +} diff --git a/src/main/java/com/booleanuk/api/user/UserRepository.java b/src/main/java/com/booleanuk/api/user/UserRepository.java new file mode 100644 index 0000000..3e54d19 --- /dev/null +++ b/src/main/java/com/booleanuk/api/user/UserRepository.java @@ -0,0 +1,6 @@ +package com.booleanuk.api.user; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { +} \ No newline at end of file