From e67de45a3e51246b7afad21ec74114305c6ed8bf Mon Sep 17 00:00:00 2001 From: Aubert Marvin Date: Fri, 12 Jun 2026 10:50:45 +0200 Subject: [PATCH] Branche fusion : API REST Spring Boot pour le front React Co-authored-by: Cursor --- README.md | 50 +++++++++++ pom.xml | 19 ++++ .../dev62/mylibrary/MyLibraryApplication.java | 12 +++ .../mylibrary/api/ApiExceptionHandler.java | 23 +++++ .../dev62/mylibrary/api/BookController.java | 86 +++++++++++++++++++ .../mylibrary/api/CustomerController.java | 31 +++++++ .../mylibrary/api/FrontendBookMapper.java | 67 +++++++++++++++ .../dev62/mylibrary/api/HealthController.java | 16 ++++ .../api/dto/FrontendBookRequest.java | 10 +++ .../api/dto/FrontendBookResponse.java | 12 +++ .../api/dto/LoyaltyPointsResponse.java | 3 + .../mylibrary/book/usecase/BookUseCase.java | 7 ++ .../dev62/mylibrary/config/AppConfig.java | 32 +++++++ .../mylibrary/config/DemoDataLoader.java | 74 ++++++++++++++++ .../dev62/mylibrary/config/WebConfig.java | 17 ++++ .../customer/usecase/CustomerUseCase.java | 4 + src/main/resources/application.properties | 2 + 17 files changed, 465 insertions(+) create mode 100644 README.md create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/MyLibraryApplication.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/ApiExceptionHandler.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/BookController.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/CustomerController.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/FrontendBookMapper.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/HealthController.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/dto/FrontendBookRequest.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/dto/FrontendBookResponse.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/dto/LoyaltyPointsResponse.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/config/AppConfig.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/config/DemoDataLoader.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/config/WebConfig.java create mode 100644 src/main/resources/application.properties diff --git a/README.md b/README.md new file mode 100644 index 0000000..4c4822f --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +# MyLibrary — backend Java + +Backend métier du projet librairie (Maxime Lebreton / Marvin Aubert / Patrick Felix-Vimalaratnam). +Pendant visuel : dépôt **`2026-DEV-BUT3`** (React). + +## Stack + +- Java 21, Maven +- Couche domaine : livres, clients, points de fidélité +- **API REST** (branche `fusion`) : Spring Boot sur le port **8080** + +## Lancer l’API + +```bash +mvn spring-boot:run +``` + +Vérifier : [http://localhost:8080/api/health](http://localhost:8080/api/health) + +## Endpoints exposés au front + +| Méthode | Route | Rôle | +|---------|-------|------| +| GET | `/api/health` | Ping | +| GET | `/api/books` | Liste des livres (format UI) | +| POST | `/api/books` | Créer un livre | +| GET | `/api/books/{isbn}` | Détail | +| DELETE | `/api/books/{isbn}` | Supprimer | +| POST | `/api/books/{isbn}/read` | Basculer lu / non lu | +| GET | `/api/users/{uuid}/loyalty-points` | Points fidélité client | + +Au démarrage, deux livres démo + un client Marie Dupont (100 pts) sont chargés si le catalogue est vide. + +## Brancher le front React + +Dans `2026-DEV-BUT3` (branche `fusion`) : + +```bash +cp .env.example .env +npm install +npm run dev +``` + +Le proxy Vite envoie `/api` vers `localhost:8080`. Commandes, promos, réservations, avis, abo, prêts et groupes restent côté front (local) tant que ces use cases ne sont pas exposés ici. + +## Tests unitaires + +```bash +mvn test +``` diff --git a/pom.xml b/pom.xml index 27ec78e..9358d49 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ UTF-8 + 3.4.1 1.18.36 @@ -48,6 +49,12 @@ + + org.springframework.boot + spring-boot-starter-web + ${spring.boot.version} + + org.projectlombok lombok @@ -146,6 +153,18 @@ + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + + + repackage + + + + \ No newline at end of file diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/MyLibraryApplication.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/MyLibraryApplication.java new file mode 100644 index 0000000..832bd3a --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/MyLibraryApplication.java @@ -0,0 +1,12 @@ +package fr.iut_fbleau.but3.dev62.mylibrary; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MyLibraryApplication { + + public static void main(String[] args) { + SpringApplication.run(MyLibraryApplication.class, args); + } +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/ApiExceptionHandler.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/ApiExceptionHandler.java new file mode 100644 index 0000000..0cdaaec --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/ApiExceptionHandler.java @@ -0,0 +1,23 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.api; + +import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.BookNotFoundException; +import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.NotValidBookException; +import java.util.Map; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class ApiExceptionHandler { + + @ExceptionHandler(BookNotFoundException.class) + public ResponseEntity> handleBookNotFound(BookNotFoundException ex) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Map.of("error", ex.getMessage())); + } + + @ExceptionHandler(NotValidBookException.class) + public ResponseEntity> handleNotValidBook(NotValidBookException ex) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(Map.of("error", ex.getMessage())); + } +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/BookController.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/BookController.java new file mode 100644 index 0000000..368dc78 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/BookController.java @@ -0,0 +1,86 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.api; + +import fr.iut_fbleau.but3.dev62.mylibrary.api.dto.FrontendBookRequest; +import fr.iut_fbleau.but3.dev62.mylibrary.api.dto.FrontendBookResponse; +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDTO; +import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.BookNotFoundException; +import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.NotValidBookException; +import fr.iut_fbleau.but3.dev62.mylibrary.book.usecase.BookUseCase; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import org.springframework.http.HttpStatus; +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.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/books") +public class BookController { + + private final BookUseCase bookUseCase; + private final Map readStatusByIsbn = new ConcurrentHashMap<>(); + + public BookController(BookUseCase bookUseCase) { + this.bookUseCase = bookUseCase; + } + + @GetMapping + public List listBooks() { + return bookUseCase.findAllBooks().stream() + .map(book -> FrontendBookMapper.toResponse(book, readStatusByIsbn.getOrDefault(book.getIsbn(), false))) + .toList(); + } + + @GetMapping("/{id}") + public ResponseEntity getBook(@PathVariable String id) { + return bookUseCase.findBookByIsbn(id) + .map(book -> FrontendBookMapper.toResponse(book, readStatusByIsbn.getOrDefault(id, false))) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + @PostMapping + public ResponseEntity createBook(@RequestBody FrontendBookRequest request) + throws NotValidBookException { + if (request.title() == null || request.title().isBlank() + || request.author() == null || request.author().isBlank()) { + return ResponseEntity.badRequest().body(Map.of("error", "title and author are required")); + } + + String isbn = FrontendBookMapper.generateIsbn(); + bookUseCase.registerBook( + FrontendBookMapper.toBookInfo(isbn, request), + FrontendBookMapper.toBookSalesInfo(request), + FrontendBookMapper.toBookDetails(request)); + readStatusByIsbn.put(isbn, request.read()); + + return bookUseCase.findBookByIsbn(isbn) + .map(book -> ResponseEntity.status(HttpStatus.CREATED) + .body(FrontendBookMapper.toResponse(book, request.read()))) + .orElse(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build()); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteBook(@PathVariable String id) throws BookNotFoundException { + bookUseCase.deleteBook(id); + readStatusByIsbn.remove(id); + return ResponseEntity.noContent().build(); + } + + @PostMapping("/{id}/read") + public ResponseEntity toggleRead(@PathVariable String id) { + return bookUseCase.findBookByIsbn(id) + .map(book -> { + boolean next = !readStatusByIsbn.getOrDefault(id, false); + readStatusByIsbn.put(id, next); + return ResponseEntity.ok(FrontendBookMapper.toResponse(book, next)); + }) + .orElse(ResponseEntity.notFound().build()); + } +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/CustomerController.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/CustomerController.java new file mode 100644 index 0000000..b08f1df --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/CustomerController.java @@ -0,0 +1,31 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.api; + +import fr.iut_fbleau.but3.dev62.mylibrary.api.dto.LoyaltyPointsResponse; +import fr.iut_fbleau.but3.dev62.mylibrary.customer.CustomerDTO; +import fr.iut_fbleau.but3.dev62.mylibrary.customer.usecase.CustomerUseCase; +import java.util.Optional; +import java.util.UUID; +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.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/users") +public class CustomerController { + + private final CustomerUseCase customerUseCase; + + public CustomerController(CustomerUseCase customerUseCase) { + this.customerUseCase = customerUseCase; + } + + @GetMapping("/{id}/loyalty-points") + public ResponseEntity getLoyaltyPoints(@PathVariable UUID id) { + Optional customer = customerUseCase.findCustomerById(id); + return customer + .map(c -> ResponseEntity.ok(new LoyaltyPointsResponse(c.getId().toString(), c.getLoyaltyPoints()))) + .orElse(ResponseEntity.notFound().build()); + } +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/FrontendBookMapper.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/FrontendBookMapper.java new file mode 100644 index 0000000..c08d9c3 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/FrontendBookMapper.java @@ -0,0 +1,67 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.api; + +import fr.iut_fbleau.but3.dev62.mylibrary.api.dto.FrontendBookRequest; +import fr.iut_fbleau.but3.dev62.mylibrary.api.dto.FrontendBookResponse; +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDTO; +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDetails; +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookInfo; +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookSalesInfo; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.concurrent.atomic.AtomicLong; + +public final class FrontendBookMapper { + + private static final AtomicLong ISBN_SEQUENCE = new AtomicLong(System.nanoTime() % 1_000_000_000L); + + private FrontendBookMapper() {} + + public static String generateIsbn() { + long value = ISBN_SEQUENCE.incrementAndGet() % 10_000_000_000L; + return String.format("978%010d", value); + } + + public static BookInfo toBookInfo(String isbn, FrontendBookRequest request) { + int safeYear = request.year() > 0 ? request.year() : LocalDate.now().getYear(); + return new BookInfo( + isbn, + request.title().trim(), + request.author().trim(), + "Ma librairie", + LocalDate.of(safeYear, 1, 1)); + } + + public static BookSalesInfo toBookSalesInfo(FrontendBookRequest request) { + return BookSalesInfo.builder() + .price(request.price()) + .stock(1) + .build(); + } + + public static BookDetails toBookDetails(FrontendBookRequest request) { + ArrayList categories = new ArrayList<>(); + String genre = request.genre() == null ? "" : request.genre().trim(); + categories.add(genre.isBlank() ? "Général" : genre); + return BookDetails.builder() + .categories(categories) + .description("") + .language("fr") + .build(); + } + + public static FrontendBookResponse toResponse(BookDTO book, boolean read) { + int year = book.getDate() != null ? book.getDate().getYear() : LocalDate.now().getYear(); + String genre = book.getCategories() == null || book.getCategories().isEmpty() + ? "Général" + : book.getCategories().getFirst(); + return new FrontendBookResponse( + book.getIsbn(), + book.getTitle(), + book.getAuthor(), + year, + genre, + book.getPrice(), + read, + book.getStock() == null ? 0 : book.getStock()); + } +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/HealthController.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/HealthController.java new file mode 100644 index 0000000..e272233 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/HealthController.java @@ -0,0 +1,16 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.api; + +import java.util.Map; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api") +public class HealthController { + + @GetMapping("/health") + public Map health() { + return Map.of("status", "ok", "service", "mylibrary-backend"); + } +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/dto/FrontendBookRequest.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/dto/FrontendBookRequest.java new file mode 100644 index 0000000..3cfdb04 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/dto/FrontendBookRequest.java @@ -0,0 +1,10 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.api.dto; + +public record FrontendBookRequest( + String title, + String author, + int year, + String genre, + double price, + boolean read +) {} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/dto/FrontendBookResponse.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/dto/FrontendBookResponse.java new file mode 100644 index 0000000..1f24eee --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/dto/FrontendBookResponse.java @@ -0,0 +1,12 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.api.dto; + +public record FrontendBookResponse( + String id, + String title, + String author, + int year, + String genre, + double price, + boolean read, + int stock +) {} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/dto/LoyaltyPointsResponse.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/dto/LoyaltyPointsResponse.java new file mode 100644 index 0000000..4edb06b --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/api/dto/LoyaltyPointsResponse.java @@ -0,0 +1,3 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.api.dto; + +public record LoyaltyPointsResponse(String userId, int points) {} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCase.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCase.java index b59de47..301a79a 100644 --- a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCase.java +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCase.java @@ -12,6 +12,7 @@ import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.NotValidBookException; import fr.iut_fbleau.but3.dev62.mylibrary.book.repository.BookRepository; import fr.iut_fbleau.but3.dev62.mylibrary.book.validator.BookValidator; +import java.util.List; import java.util.Optional; public class BookUseCase { @@ -32,6 +33,12 @@ public class BookUseCase { return bookToRegistered.getIsbn(); } + public List findAllBooks() { + return bookRepository.findAll().stream() + .map(BookConverter::ToDTO) + .toList(); + } + public Optional findBookByIsbn(String isbn) { Optional optionalBook = bookRepository.findByIsbn(isbn); return optionalBook.map(BookConverter::ToDTO); diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/config/AppConfig.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/config/AppConfig.java new file mode 100644 index 0000000..069f1a6 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/config/AppConfig.java @@ -0,0 +1,32 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.config; + +import fr.iut_fbleau.but3.dev62.mylibrary.book.repository.BookRepository; +import fr.iut_fbleau.but3.dev62.mylibrary.book.usecase.BookUseCase; +import fr.iut_fbleau.but3.dev62.mylibrary.customer.repository.CustomerRepository; +import fr.iut_fbleau.but3.dev62.mylibrary.customer.usecase.CustomerUseCase; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class AppConfig { + + @Bean + BookRepository bookRepository() { + return new BookRepository(); + } + + @Bean + BookUseCase bookUseCase(BookRepository bookRepository) { + return new BookUseCase(bookRepository); + } + + @Bean + CustomerRepository customerRepository() { + return new CustomerRepository(); + } + + @Bean + CustomerUseCase customerUseCase(CustomerRepository customerRepository) { + return new CustomerUseCase(customerRepository); + } +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/config/DemoDataLoader.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/config/DemoDataLoader.java new file mode 100644 index 0000000..f154a80 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/config/DemoDataLoader.java @@ -0,0 +1,74 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.config; + +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDetails; +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookInfo; +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookSalesInfo; +import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.NotValidBookException; +import fr.iut_fbleau.but3.dev62.mylibrary.book.usecase.BookUseCase; +import fr.iut_fbleau.but3.dev62.mylibrary.customer.CustomerInfo; +import fr.iut_fbleau.but3.dev62.mylibrary.customer.exception.NotValidCustomerException; +import fr.iut_fbleau.but3.dev62.mylibrary.customer.usecase.CustomerUseCase; +import java.time.LocalDate; +import java.util.ArrayList; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +@Component +public class DemoDataLoader implements ApplicationRunner { + + private final BookUseCase bookUseCase; + private final CustomerUseCase customerUseCase; + + public DemoDataLoader(BookUseCase bookUseCase, CustomerUseCase customerUseCase) { + this.bookUseCase = bookUseCase; + this.customerUseCase = customerUseCase; + } + + @Override + public void run(ApplicationArguments args) throws NotValidBookException, NotValidCustomerException { + if (!bookUseCase.findAllBooks().isEmpty()) { + return; + } + + registerBook( + "9782070612758", + "Le Petit Prince", + "Antoine de Saint-Exupéry", + LocalDate.of(1943, 1, 1), + 8.5, + "Conte"); + registerBook( + "9782070368228", + "1984", + "George Orwell", + LocalDate.of(1949, 1, 1), + 9.9, + "Science-fiction"); + + customerUseCase.registerCustomer(new CustomerInfo("Marie", "Dupont", "0612345678")); + customerUseCase.addLoyaltyPoints( + customerUseCase.findCustomerByPhoneNumber("0612345678").orElseThrow().getId(), + 100); + } + + private void registerBook( + String isbn, + String title, + String author, + LocalDate date, + double price, + String category) + throws NotValidBookException { + ArrayList categories = new ArrayList<>(); + categories.add(category); + bookUseCase.registerBook( + new BookInfo(isbn, title, author, "Gallimard", date), + BookSalesInfo.builder().price(price).stock(5).build(), + BookDetails.builder() + .categories(categories) + .description("") + .language("fr") + .build()); + } +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/config/WebConfig.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/config/WebConfig.java new file mode 100644 index 0000000..997ac65 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/config/WebConfig.java @@ -0,0 +1,17 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/api/**") + .allowedOrigins("http://localhost:5173", "http://127.0.0.1:5173") + .allowedMethods("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS") + .allowedHeaders("*"); + } +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/customer/usecase/CustomerUseCase.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/customer/usecase/CustomerUseCase.java index 3241c30..216320d 100644 --- a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/customer/usecase/CustomerUseCase.java +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/customer/usecase/CustomerUseCase.java @@ -32,6 +32,10 @@ public final class CustomerUseCase { return optionalCustomer.map(CustomerConverter::toDTO); } + public Optional findCustomerById(UUID uuid) { + return customerRepository.findById(uuid).map(CustomerConverter::toDTO); + } + public CustomerDTO updateCustomer(UUID uuid, CustomerInfo customerInfo) throws CustomerNotFoundException, NotValidCustomerException { CustomerValidator.validate(customerInfo); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..1a8b5e1 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,2 @@ +server.port=8080 +spring.application.name=mylibrary