diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/advice/TrivioNotFoundAdvice.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/advice/TrivioNotFoundAdvice.java new file mode 100644 index 0000000000000000000000000000000000000000..f9cefa3e598a0885cb2f90a8aa3d73906095c1e0 --- /dev/null +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/advice/TrivioNotFoundAdvice.java @@ -0,0 +1,17 @@ +package ntnu.idatt2105.group44.trivioServer.advice; + +import ntnu.idatt2105.group44.trivioServer.exception.TrivioNotFoundException; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ControllerAdvice +public class TrivioNotFoundAdvice { + + @ExceptionHandler + @ResponseStatus(HttpStatus.NOT_FOUND) + String TrivioNotFoundHandler(TrivioNotFoundException ex) { + return ex.getMessage(); + } +} diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/controller/TrivioController.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/controller/TrivioController.java new file mode 100644 index 0000000000000000000000000000000000000000..641f687f513a4f747c24ab06020f3b40b11b7443 --- /dev/null +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/controller/TrivioController.java @@ -0,0 +1,52 @@ +package ntnu.idatt2105.group44.trivioServer.controller; + +import java.util.List; +import ntnu.idatt2105.group44.trivioServer.dto.TrivioWithQAndA; +import ntnu.idatt2105.group44.trivioServer.model.Trivio; +import ntnu.idatt2105.group44.trivioServer.model.User; +import ntnu.idatt2105.group44.trivioServer.service.TrivioService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +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.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@CrossOrigin +@RequestMapping("/trivios") +public class TrivioController { + private TrivioService trivioService; + + @Autowired + public TrivioController(TrivioService trivioService){ + this.trivioService=trivioService; + } + + @GetMapping + public List<Trivio> getAllTrivio(){ + return trivioService.getAllTrivios(); + } + + @GetMapping(path = "{trivioId}") + public Trivio getTrivio(@PathVariable Long trivioId){ + return trivioService.getTrivioById(trivioId); + } + + @PostMapping + public ResponseEntity<String> addUser(@RequestBody Trivio trivio){ + trivioService.addTrivio(trivio); + return new ResponseEntity<>("created!", HttpStatus.CREATED); + } + + + @PostMapping("/create") + public ResponseEntity<String> addTrivioWithQuestionsAndAnswers(@RequestBody TrivioWithQAndA trivioWithQuestionsAndAnswers) { + trivioService.createTrivio(trivioWithQuestionsAndAnswers); + return new ResponseEntity<>("Trivio with questions and answers added successfully", HttpStatus.CREATED); + } +} diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/controller/TrivioQuestionController.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/controller/TrivioQuestionController.java new file mode 100644 index 0000000000000000000000000000000000000000..015960b9dd22d105fc55d631d74ebe8cbe0a08ed --- /dev/null +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/controller/TrivioQuestionController.java @@ -0,0 +1,49 @@ +package ntnu.idatt2105.group44.trivioServer.controller; + +import java.util.List; +import ntnu.idatt2105.group44.trivioServer.model.Question; +import ntnu.idatt2105.group44.trivioServer.model.Trivio; +import ntnu.idatt2105.group44.trivioServer.service.QuestionService; +import ntnu.idatt2105.group44.trivioServer.service.TrivioService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +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.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/trivios") +public class TrivioQuestionController { + private TrivioService trivioService; + private QuestionService questionService; + + @Autowired + public TrivioQuestionController(TrivioService trivioService, QuestionService questionService) { + this.trivioService = trivioService; + this.questionService = questionService; + } + + @GetMapping("{trivioId}/questions") + public ResponseEntity<List<Question>> getQuestionForTrivia(@PathVariable Long trivioId){ + Trivio trivio = trivioService.getTrivioById(trivioId); + System.out.println(trivio.getQuestionList()); + System.out.println(trivio.getQuestionList().size()); + + return ResponseEntity.ok(trivio.getQuestionList()); + } + + /* + Denne løsningen fungerer ikke helt. Implementasjonen her er å legge til et spørsmål til + spesifikke trivioen, men tror det er bedre at vi bare poster hele trivioen, istedenfor + å poste flere spørsmål samtidig. + */ + @PostMapping("{trivioId}/questions") + public ResponseEntity<Question> addQuestionToTrivio(@PathVariable Long trivioId, @RequestBody Question question){ + trivioService.addQuestionToTrivio(question,trivioId); + return ResponseEntity.ok(question); + } +} diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/dto/QuestionWithAnswers.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/dto/QuestionWithAnswers.java new file mode 100644 index 0000000000000000000000000000000000000000..ebba791ca9585201f322aa376cc213c2845578f0 --- /dev/null +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/dto/QuestionWithAnswers.java @@ -0,0 +1,28 @@ +package ntnu.idatt2105.group44.trivioServer.dto; + +import java.util.List; +import ntnu.idatt2105.group44.trivioServer.model.Answer; +import ntnu.idatt2105.group44.trivioServer.model.Question; +//selve DTO-klasse for å abstraktere spørsmål- og svar-entitetene +public class QuestionWithAnswers { + private Question question; + private List<Answer> answers; + + public Question getQuestion() { + return question; + } + + public void setQuestion(Question question) { + this.question = question; + } + + public List<Answer> getAnswers() { + return answers; + } + + public void setAnswers(List<Answer> answers) { + this.answers = answers; + } +} + + diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/dto/TrivioWithQAndA.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/dto/TrivioWithQAndA.java new file mode 100644 index 0000000000000000000000000000000000000000..ef9963ee10aa90da8d8dcc22bd558582d95262b3 --- /dev/null +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/dto/TrivioWithQAndA.java @@ -0,0 +1,32 @@ +package ntnu.idatt2105.group44.trivioServer.dto; + +import java.util.List; +import ntnu.idatt2105.group44.trivioServer.model.Trivio; + +public class TrivioWithQAndA { + + private Trivio trivio; + private List<QuestionWithAnswers> questionsWithAnswers; + + private Long userId; + + public Trivio getTrivio() { + return trivio; + } + + public void setTrivio(Trivio trivio) { + this.trivio = trivio; + } + + public Long getUserId() { + return userId; + } + + public List<QuestionWithAnswers> getQuestionsWithAnswers() { + return questionsWithAnswers; + } + + public void setQuestionsWithAnswers(List<QuestionWithAnswers> questionsWithAnswers) { + this.questionsWithAnswers = questionsWithAnswers; + } +} diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/dto/UserDTO.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/dto/UserDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..2ee72ee0cdf23695235a74430de7b3a4bcf570ae --- /dev/null +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/dto/UserDTO.java @@ -0,0 +1,19 @@ +package ntnu.idatt2105.group44.trivioServer.dto; + +public class UserDTO { + private Long id; + private String username; + private String email; + + public Long getId() { + return id; + } + + public String getUsername() { + return username; + } + + public String getEmail() { + return email; + } +} diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/exception/TrivioNotFoundException.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/exception/TrivioNotFoundException.java new file mode 100644 index 0000000000000000000000000000000000000000..eed2ae21940b662f6693b23c58055e343c8b874a --- /dev/null +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/exception/TrivioNotFoundException.java @@ -0,0 +1,7 @@ +package ntnu.idatt2105.group44.trivioServer.exception; + +public class TrivioNotFoundException extends RuntimeException { + public TrivioNotFoundException(Long id){ + super("Trivio id: "+id+" does not exist!"); + } +} diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/model/Answer.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/model/Answer.java index 014a1a4a60a18e902c0b6e71b81a06b22e973d81..3b4fe0b03af0f29d64872dd20c7fa295429c4d75 100644 --- a/src/main/java/ntnu/idatt2105/group44/trivioServer/model/Answer.java +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/model/Answer.java @@ -1,14 +1,42 @@ package ntnu.idatt2105.group44.trivioServer.model; +import com.fasterxml.jackson.annotation.JsonBackReference; import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import ntnu.idatt2105.group44.trivioServer.repository.QuestionRepository; @Entity public class Answer { @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + public Long getId() { + return id; + } + + public String getAnswer() { + return answer; + } + + @JsonBackReference + @ManyToOne + @JoinColumn(name = "question_id") + public Question question; + + public boolean isCorrect() { + return correct; + } + public String answer; boolean correct; + + public void setQuestion(Question question){ + this.question = question; + } } diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/model/Question.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/model/Question.java index 66abe990f5e1775aab3b4307b73b6c785f0ef955..5a24975f1c5e347d98769a26796fbcdfa2b2d678 100644 --- a/src/main/java/ntnu/idatt2105/group44/trivioServer/model/Question.java +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/model/Question.java @@ -1,7 +1,13 @@ package ntnu.idatt2105.group44.trivioServer.model; +import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonManagedReference; +import jakarta.persistence.CascadeType; import jakarta.persistence.ElementCollection; import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; @@ -11,13 +17,15 @@ import java.util.List; @Entity public class Question { @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; public String question; - - @OneToMany + @JsonManagedReference + @OneToMany(mappedBy = "question", cascade = CascadeType.ALL) public List<Answer> answers; + @JsonBackReference @ManyToOne @JoinColumn(name = "trivio_id") public Trivio trivio; @@ -29,4 +37,8 @@ public class Question { public List<Answer> getAnswers() { return answers; } + + public void setTrivio(Trivio trivio) { + this.trivio = trivio; + } } diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/model/Trivio.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/model/Trivio.java index aaff7b3cedead21c8021abff6e05ab2b983fd67b..dfe396484661a2d2fdca4e06a6322bd75915d45f 100644 --- a/src/main/java/ntnu/idatt2105/group44/trivioServer/model/Trivio.java +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/model/Trivio.java @@ -1,18 +1,31 @@ package ntnu.idatt2105.group44.trivioServer.model; +import com.fasterxml.jackson.annotation.JsonManagedReference; import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; import java.util.List; @Entity +@Table(name="trivio") public class Trivio { @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; public String title; public String description; + @ManyToOne + @JoinColumn(name = "user_id") + public User user; + + @JsonManagedReference @OneToMany(mappedBy = "trivio") public List<Question> questionList; @@ -23,4 +36,20 @@ public class Trivio { public String getDescription() { return description; } + + public List<Question> getQuestionList(){ + return questionList; + } + + public User getUser() { + return user; + } + + public Long getId() { + return id; + } + + public void setUser(User user) { + this.user = user; + } } diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/model/User.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/model/User.java index 17e32e6c902f387a879f8e4ed81af9c6b51fb1d1..e402aedefc8d65d12d5d24df52dd25d91cb6a0a4 100644 --- a/src/main/java/ntnu/idatt2105/group44/trivioServer/model/User.java +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/model/User.java @@ -4,7 +4,10 @@ import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; import jakarta.persistence.Table; +import java.util.List; @Entity @Table(name="users") @@ -18,6 +21,8 @@ public class User { private String email; + @OneToMany(mappedBy = "user") + private List<Trivio> trivio; public User(){ } @@ -41,4 +46,16 @@ public class User { public String getEmail() { return email; } + + public void setId(Long id) { + this.id = id; + } + + public void setUsername(String username) { + this.username = username; + } + + public void setEmail(String email) { + this.email = email; + } } diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/repository/AnswerRepository.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/repository/AnswerRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..833b93b342ab4320df2e75f2dd7d2dc87002f9e7 --- /dev/null +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/repository/AnswerRepository.java @@ -0,0 +1,8 @@ +package ntnu.idatt2105.group44.trivioServer.repository; + +import ntnu.idatt2105.group44.trivioServer.model.Answer; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AnswerRepository extends JpaRepository<Answer, Long> { + +} diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/repository/QuestionRepository.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/repository/QuestionRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..6ad3835f0500b8d892ac0b19f8dc541e1a295952 --- /dev/null +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/repository/QuestionRepository.java @@ -0,0 +1,10 @@ +package ntnu.idatt2105.group44.trivioServer.repository; + +import ntnu.idatt2105.group44.trivioServer.model.Question; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface QuestionRepository extends JpaRepository<Question, Long> { + +} diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/repository/TrivioRepository.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/repository/TrivioRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..548e0500a8db7953d450969d4f8ee11037cd7a1b --- /dev/null +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/repository/TrivioRepository.java @@ -0,0 +1,11 @@ +package ntnu.idatt2105.group44.trivioServer.repository; + +import java.util.Optional; +import ntnu.idatt2105.group44.trivioServer.model.Trivio; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface TrivioRepository extends JpaRepository<Trivio, Long> { + Optional<Trivio> findTrivioByTitle(String title); +} diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/service/QuestionService.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/service/QuestionService.java new file mode 100644 index 0000000000000000000000000000000000000000..75973e21e216e9fb7df8f0bcb938807d8f984d47 --- /dev/null +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/service/QuestionService.java @@ -0,0 +1,45 @@ +package ntnu.idatt2105.group44.trivioServer.service; + +import java.util.List; +import ntnu.idatt2105.group44.trivioServer.exception.TrivioNotFoundException; +import ntnu.idatt2105.group44.trivioServer.model.Answer; +import ntnu.idatt2105.group44.trivioServer.model.Question; +import ntnu.idatt2105.group44.trivioServer.repository.AnswerRepository; +import ntnu.idatt2105.group44.trivioServer.repository.QuestionRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class QuestionService { + private QuestionRepository questionRepository; + private AnswerRepository answerRepository; + + public QuestionService(QuestionRepository questionRepository, AnswerRepository answerRepository) { + this.questionRepository = questionRepository; + this.answerRepository = answerRepository; + } + + public void addQuestion(Question question) { + questionRepository.save(question); + } + +// public void addAnswerToQuestion(Long questionId, Answer answer){ +// Question question = questionRepository.findById(questionId).orElseThrow(() -> new TrivioNotFoundException(questionId)); +// answer.setQuestion(question); +// answerRepository.save(answer); +// +// question.getAnswers().add(answer); +// questionRepository.save(question); +// } + + + @Transactional + public void addQuestionWithAnswers(Question question, List<Answer> answers) { + Question savedQuestion = questionRepository.save(question); + for (Answer answer : answers) { + answer.setQuestion(savedQuestion); + answerRepository.save(answer); + } + + } +} diff --git a/src/main/java/ntnu/idatt2105/group44/trivioServer/service/TrivioService.java b/src/main/java/ntnu/idatt2105/group44/trivioServer/service/TrivioService.java new file mode 100644 index 0000000000000000000000000000000000000000..f8732803a3f0355a6f3104191e3abc36426a2506 --- /dev/null +++ b/src/main/java/ntnu/idatt2105/group44/trivioServer/service/TrivioService.java @@ -0,0 +1,86 @@ +package ntnu.idatt2105.group44.trivioServer.service; + +import java.util.List; +import ntnu.idatt2105.group44.trivioServer.dto.QuestionWithAnswers; +import ntnu.idatt2105.group44.trivioServer.dto.TrivioWithQAndA; +import ntnu.idatt2105.group44.trivioServer.dto.UserDTO; +import ntnu.idatt2105.group44.trivioServer.exception.TrivioNotFoundException; +import ntnu.idatt2105.group44.trivioServer.model.Answer; +import ntnu.idatt2105.group44.trivioServer.model.Question; +import ntnu.idatt2105.group44.trivioServer.model.Trivio; +import ntnu.idatt2105.group44.trivioServer.model.User; +import ntnu.idatt2105.group44.trivioServer.repository.QuestionRepository; +import ntnu.idatt2105.group44.trivioServer.repository.TrivioRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class TrivioService { + private TrivioRepository trivioRepository; + private QuestionRepository questionRepository; + + private QuestionService questionService; + + private UserService userService; + @Autowired + public TrivioService(TrivioRepository trivioRepository, QuestionRepository questionRepository, QuestionService questionService, + UserService userService){ + this.trivioRepository = trivioRepository; + this.questionRepository = questionRepository; + this.questionService = questionService; + this.userService = userService; + } + + public List<Trivio> getAllTrivios(){ + return trivioRepository.findAll(); + } + + public Trivio getTrivioByTitle(String title){ + if(trivioRepository.findTrivioByTitle(title).isPresent()){ + return trivioRepository.findTrivioByTitle(title).get(); + } + return null; + } + + public Trivio getTrivioById(Long id){ +// if(trivioRepository.findById(id).isPresent()){ +// return trivioRepository.findById(id).get(); +// } +// return null; + + return trivioRepository.findById(id).orElseThrow(() -> new TrivioNotFoundException(id)); + } + + public void addTrivio(Trivio trivio){ + trivioRepository.save(trivio); + } + + public void addQuestionToTrivio(Question question, Long id){ + Trivio trivio = trivioRepository.findById(id).orElseThrow(() -> new TrivioNotFoundException(id)); + trivio.questionList.add(question); + trivioRepository.save(trivio); + questionRepository.save(question); + } + + public void createTrivio(TrivioWithQAndA trivioWithQAndA){ + Trivio trivio = trivioWithQAndA.getTrivio(); + Long userId = trivioWithQAndA.getUserId(); + + User user = userService.getUserById(userId); + + trivio.setUser(user); + + List<QuestionWithAnswers> questionWithAnswers = trivioWithQAndA.getQuestionsWithAnswers(); + Trivio flushTrivio = trivioRepository.save(trivio); + + for (QuestionWithAnswers questionWithanswers : questionWithAnswers){ + Question question = questionWithanswers.getQuestion(); + List<Answer> answers = questionWithanswers.getAnswers(); + + question.setTrivio(flushTrivio); + + questionService.addQuestionWithAnswers(question, answers); + } + + } +}