From fa920bd8400933ce1c5d3b215605a0636d94dd0e Mon Sep 17 00:00:00 2001
From: Guams <guamsmdr@gmail.com>
Date: Sun, 8 Dec 2024 19:17:58 +0100
Subject: [PATCH] =?UTF-8?q?j'ai=20mal=20=C3=A0=20la=20t=C3=AAte=20mais=20?=
 =?UTF-8?q?=C3=A7a=20marche?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../review/controller/AuthorController.java   | 61 +++++++++++++++++++
 .../review/controller/UserController.java     | 14 -----
 .../guams/review/modele/AuthorRepository.java | 14 +++++
 .../guams/review/modele/UserRepository.java   |  9 ---
 .../modele/dao/{User.java => Author.java}     |  8 ++-
 .../guams/review/service/AuthorService.java   | 38 ++++++++++++
 .../com/guams/review/service/UserService.java | 16 -----
 .../guams/review/service/mapper/Mapper.java   | 17 ++++++
 .../service/mapper/ReturnableAuthor.java      | 16 +++++
 9 files changed, 152 insertions(+), 41 deletions(-)
 create mode 100644 src/main/java/com/guams/review/controller/AuthorController.java
 delete mode 100644 src/main/java/com/guams/review/controller/UserController.java
 create mode 100644 src/main/java/com/guams/review/modele/AuthorRepository.java
 delete mode 100644 src/main/java/com/guams/review/modele/UserRepository.java
 rename src/main/java/com/guams/review/modele/dao/{User.java => Author.java} (84%)
 create mode 100644 src/main/java/com/guams/review/service/AuthorService.java
 delete mode 100644 src/main/java/com/guams/review/service/UserService.java
 create mode 100644 src/main/java/com/guams/review/service/mapper/Mapper.java
 create mode 100644 src/main/java/com/guams/review/service/mapper/ReturnableAuthor.java

diff --git a/src/main/java/com/guams/review/controller/AuthorController.java b/src/main/java/com/guams/review/controller/AuthorController.java
new file mode 100644
index 0000000..b20da7b
--- /dev/null
+++ b/src/main/java/com/guams/review/controller/AuthorController.java
@@ -0,0 +1,61 @@
+package com.guams.review.controller;
+
+import com.guams.review.exception.NotFoundException;
+import com.guams.review.modele.dao.Author;
+import com.guams.review.service.AuthorService;
+import com.guams.review.service.mapper.Mapper;
+import com.guams.review.service.mapper.ReturnableAuthor;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.MediaType;
+import org.springframework.util.Assert;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.UUID;
+
+@RestController
+@RequestMapping(path = "api/authors")
+@RequiredArgsConstructor
+public class AuthorController {
+
+    private final AuthorService authorService;
+    private final Mapper mapper;
+
+    @GetMapping
+    public List<ReturnableAuthor> getUsers() {
+        return authorService.list();
+    }
+
+    @GetMapping("/{id}")
+    public ReturnableAuthor findUser(@PathVariable UUID id) {
+        Author author = authorService.findById(id).orElseThrow(() -> new NotFoundException("Author not found"));
+        return mapper.mapAuthor(author);
+    }
+
+    @PostMapping
+    public ReturnableAuthor addUser(@RequestBody Author author) {
+        Assert.isNull(author.getId(), "Author id must be null");
+        return authorService.insert(author);
+    }
+
+    @PutMapping("/{id}")
+    public void updateUser(@PathVariable UUID id, @RequestBody Author updatedAuthor) {
+        Author authorToUpdate = authorService.findById(id).orElseThrow(() -> new NotFoundException("Author not found"));
+        authorService.insert(updatedAuthor.setId(authorToUpdate.getId()));
+    }
+
+    @PutMapping(value = "{id}/avatar", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
+    public void updateUserAvatar(@PathVariable UUID id, @RequestPart MultipartFile avatar) throws IOException {
+        Author authorToUpdate = authorService.findById(id).orElseThrow(() -> new NotFoundException("Author not found"));
+        authorService.insert(authorToUpdate.setProfilePicture(avatar.getBytes()));
+    }
+
+    @DeleteMapping("/{id}")
+    public void deleteUser(@PathVariable UUID id) {
+        Author authorToDelete = authorService.findById(id).orElseThrow(() -> new NotFoundException("Author not found"));
+        authorService.delete(authorToDelete);
+    }
+
+}
diff --git a/src/main/java/com/guams/review/controller/UserController.java b/src/main/java/com/guams/review/controller/UserController.java
deleted file mode 100644
index de02bc7..0000000
--- a/src/main/java/com/guams/review/controller/UserController.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.guams.review.controller;
-
-import com.guams.review.service.UserService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.*;
-
-@RestController
-@RequestMapping(path = "api/users")
-@RequiredArgsConstructor
-public class UserController {
-
-    private final UserService userService;
-
-}
diff --git a/src/main/java/com/guams/review/modele/AuthorRepository.java b/src/main/java/com/guams/review/modele/AuthorRepository.java
new file mode 100644
index 0000000..dc60777
--- /dev/null
+++ b/src/main/java/com/guams/review/modele/AuthorRepository.java
@@ -0,0 +1,14 @@
+package com.guams.review.modele;
+
+import com.guams.review.modele.dao.Author;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.UUID;
+
+@Repository
+public interface AuthorRepository extends CrudRepository<Author, UUID> {
+
+    List<Author> findAll();
+}
diff --git a/src/main/java/com/guams/review/modele/UserRepository.java b/src/main/java/com/guams/review/modele/UserRepository.java
deleted file mode 100644
index 23d9242..0000000
--- a/src/main/java/com/guams/review/modele/UserRepository.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.guams.review.modele;
-
-import com.guams.review.modele.dao.User;
-import org.springframework.data.repository.CrudRepository;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public interface UserRepository extends CrudRepository<User, Long> {
-}
diff --git a/src/main/java/com/guams/review/modele/dao/User.java b/src/main/java/com/guams/review/modele/dao/Author.java
similarity index 84%
rename from src/main/java/com/guams/review/modele/dao/User.java
rename to src/main/java/com/guams/review/modele/dao/Author.java
index 06dd681..82d9a2e 100644
--- a/src/main/java/com/guams/review/modele/dao/User.java
+++ b/src/main/java/com/guams/review/modele/dao/Author.java
@@ -2,19 +2,23 @@ package com.guams.review.modele.dao;
 
 
 import lombok.Getter;
+import lombok.Setter;
 import lombok.experimental.Accessors;
 import org.springframework.data.annotation.Id;
 import org.springframework.data.relational.core.mapping.Column;
 import org.springframework.data.relational.core.mapping.Table;
 
+import java.util.UUID;
+
 
 @Getter
+@Setter
 @Accessors(chain = true)
 @Table(name = "author")
-public class User {
+public class Author {
 
     @Id
-    Long id;
+    UUID id;
 
     @Column("name")
     String name;
diff --git a/src/main/java/com/guams/review/service/AuthorService.java b/src/main/java/com/guams/review/service/AuthorService.java
new file mode 100644
index 0000000..0d728a8
--- /dev/null
+++ b/src/main/java/com/guams/review/service/AuthorService.java
@@ -0,0 +1,38 @@
+package com.guams.review.service;
+
+import com.guams.review.modele.AuthorRepository;
+import com.guams.review.modele.dao.Author;
+import com.guams.review.service.mapper.Mapper;
+import com.guams.review.service.mapper.ReturnableAuthor;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+@Service
+@RequiredArgsConstructor
+public class AuthorService
+{
+    private final Mapper mapper;
+    private final AuthorRepository authorRepository;
+
+    public List<ReturnableAuthor> list() {
+        return authorRepository.findAll().stream()
+                .map(mapper::mapAuthor)
+                .toList();
+    }
+
+    public Optional<Author> findById(UUID id) {
+        return authorRepository.findById(id);
+    }
+
+    public ReturnableAuthor insert(Author author) {
+        return mapper.mapAuthor(authorRepository.save(author));
+    }
+
+    public void delete(Author author) {
+        authorRepository.delete(author);
+    }
+}
diff --git a/src/main/java/com/guams/review/service/UserService.java b/src/main/java/com/guams/review/service/UserService.java
deleted file mode 100644
index 80fd082..0000000
--- a/src/main/java/com/guams/review/service/UserService.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.guams.review.service;
-
-import com.guams.review.modele.dao.User;
-import com.guams.review.modele.UserRepository;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.util.Optional;
-
-@Service
-@RequiredArgsConstructor
-public class UserService
-{
-    private final UserRepository userRepository;
-
-}
diff --git a/src/main/java/com/guams/review/service/mapper/Mapper.java b/src/main/java/com/guams/review/service/mapper/Mapper.java
new file mode 100644
index 0000000..6c0edf1
--- /dev/null
+++ b/src/main/java/com/guams/review/service/mapper/Mapper.java
@@ -0,0 +1,17 @@
+package com.guams.review.service.mapper;
+
+import com.guams.review.modele.dao.Author;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Mapper {
+
+    public Mapper() {}
+
+    public ReturnableAuthor mapAuthor(Author author) {
+        return new ReturnableAuthor()
+                .setId(author.getId())
+                .setName(author.getName())
+                .setProfilePicture(author.getProfilePicture());
+    }
+}
diff --git a/src/main/java/com/guams/review/service/mapper/ReturnableAuthor.java b/src/main/java/com/guams/review/service/mapper/ReturnableAuthor.java
new file mode 100644
index 0000000..cbffc71
--- /dev/null
+++ b/src/main/java/com/guams/review/service/mapper/ReturnableAuthor.java
@@ -0,0 +1,16 @@
+package com.guams.review.service.mapper;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+import java.util.UUID;
+
+@Getter
+@Setter
+@Accessors(chain = true)
+public class ReturnableAuthor {
+    private UUID id;
+    private String name;
+    private byte[] profilePicture;
+}