Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,15 @@ dependencies {
tasks.named('test') {
useJUnitPlatform()
}

jar {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
manifest {
attributes 'Main-Class': 'com.booleanuk.api.Main'
}

from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}

9 changes: 9 additions & 0 deletions dockers/Dockerfile.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FROM eclipse-temurin:18

WORKDIR /app

COPY docker2.jar /app/docker2.jar

EXPOSE 4000

ENTRYPOINT ["java", "-jar", "docker2"]
21 changes: 21 additions & 0 deletions dockers/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
services:
app:
image: 'docker2: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
Binary file added dockers/docker2.jar
Binary file not shown.
11 changes: 11 additions & 0 deletions src/main/java/com/booleanuk/api/Main.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
63 changes: 63 additions & 0 deletions src/main/java/com/booleanuk/api/controller/TweetController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.booleanuk.api.controller;

import com.booleanuk.api.model.Tweet;
import com.booleanuk.api.model.User;
import com.booleanuk.api.repository.TweetRepository;
import com.booleanuk.api.repository.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;

@RestController
@RequestMapping("tweets")
public class TweetController {
@Autowired
private TweetRepository tweetRepository;
private UserRepository userRepository;

@GetMapping
public ResponseEntity<Iterable<Tweet>> getTweets() {
Iterable<Tweet> tweets = tweetRepository.findAll();
return ResponseEntity.ok(tweets);
}

@PostMapping
public ResponseEntity<Tweet> createTweet(@PathVariable int userId, @RequestBody Tweet tweet) {

User user = this.userRepository.findById(userId).orElseThrow(
() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No User with that ID found")
);
return new ResponseEntity<>(this.tweetRepository.save(tweet), HttpStatus.CREATED);
}

@GetMapping("{id}")
public ResponseEntity<Tweet> getTweetById(@PathVariable int id) {
Tweet tweet = null;
tweet = this.tweetRepository.findById(id).orElseThrow(
() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No Tweet with that ID found")
);
return ResponseEntity.ok(tweet);
}

@DeleteMapping("{id}")
public ResponseEntity<Tweet> deleteTweet(@PathVariable int id) {
Tweet tweet = this.tweetRepository.findById(id).orElseThrow(
() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No Tweet with that ID found")
);
this.tweetRepository.delete(tweet);
return ResponseEntity.ok(tweet);
}

@PutMapping("{id}")
public ResponseEntity<Tweet> updateTweet(@PathVariable int id, @RequestBody Tweet tweet) {
Tweet tweetToUpdate = this.tweetRepository.findById(id).orElseThrow(
() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No Tweet with that ID found")
);
tweet.setId(tweetToUpdate.getId());
return new ResponseEntity<>(this.tweetRepository.save(tweet), HttpStatus.CREATED);
}


}
59 changes: 59 additions & 0 deletions src/main/java/com/booleanuk/api/controller/UserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.booleanuk.api.controller;

import com.booleanuk.api.model.User;
import com.booleanuk.api.repository.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;

@RestController
@RequestMapping("users")
public class UserController {
@Autowired
private UserRepository userRepository;

public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}

@GetMapping
public ResponseEntity<Iterable<User>> getUsers() {
Iterable<User> users = userRepository.findAll();
return ResponseEntity.ok(users);
}

@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
return ResponseEntity.ok(userRepository.save(user));

}

@GetMapping("{id}")
public ResponseEntity<User> getUserById(@PathVariable int id) {
User user = userRepository.findById(id).orElseThrow(
() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No User with that ID found")
);
return ResponseEntity.ok(user);
}

@PutMapping("{id}")
public ResponseEntity<User> updateUser(@PathVariable int id, @RequestBody User user) {
User userToUpdate = userRepository.findById(id).orElseThrow(
() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No User with that ID found")
);
user.setId(userToUpdate.getId());
return new ResponseEntity<>(userRepository.save(user), HttpStatus.CREATED);
}

@DeleteMapping("{id}")
public ResponseEntity<User> deleteUser(@PathVariable int id) {
User user = userRepository.findById(id).orElseThrow(
() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No User with that ID found")
);
userRepository.delete(user);
return ResponseEntity.ok(user);
}

}
43 changes: 43 additions & 0 deletions src/main/java/com/booleanuk/api/model/Tweet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.booleanuk.api.model;

import jakarta.persistence.*;

@Entity
@Table(name = "Tweets")
public class Tweet {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column
private String tweetContent;

@ManyToOne
@JoinColumn(name = "user_id", referencedColumnName = "id")
private User user;

public Tweet() {
}

public Tweet(String tweetContent, User user) {
this.tweetContent = tweetContent;
this.user = user;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getTweetContent() {
return tweetContent;
}

public void setTweetContent(String tweetContent) {
this.tweetContent = tweetContent;
}

}
50 changes: 50 additions & 0 deletions src/main/java/com/booleanuk/api/model/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.booleanuk.api.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "Users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column
private String username;

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonIgnore
private List<Tweet> tweets = new ArrayList<>();

public User() {
}

public User(String username) {
this.username = username;
}
// Getters and Setters

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}



}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.booleanuk.api.repository;

import com.booleanuk.api.model.Tweet;
import org.springframework.data.jpa.repository.JpaRepository;

public interface TweetRepository extends JpaRepository<Tweet, Integer> {
}
11 changes: 11 additions & 0 deletions src/main/java/com/booleanuk/api/repository/UserRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.booleanuk.api.repository;

import com.booleanuk.api.model.Tweet;
import com.booleanuk.api.model.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface UserRepository extends JpaRepository<User, Integer> {
List<Tweet> findByUser(User user);
}
16 changes: 16 additions & 0 deletions src/main/java/com/booleanuk/api/response/ErrorResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.booleanuk.api.response;
public class ErrorResponse {
private String message;

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

public ErrorResponse(String message) {
this.message = message;
}
}
20 changes: 20 additions & 0 deletions src/main/java/com/booleanuk/api/response/Response.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.booleanuk.api.response;

public class Response<T> {
private String status;
private T data;

public Response(String status, T data) {
this.status = status;
this.data = data;
}

public String getStatus() {
return status;
}

public T getData() {
return data;
}

}