Skip to content
Merged
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
73 changes: 41 additions & 32 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -1,44 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.5</version>
<relativePath/> <!-- lookup parent from repository -->
<relativePath/>
</parent>
<groupId>ie.atu</groupId>
<artifactId>BookingService</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>BookingService</name>
<description>BookingService</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2023.0.3</spring-cloud.version>
</properties>
<dependencies>
<!-- Spring Boot Dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
Expand All @@ -47,18 +30,54 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

<!-- Spring Cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!-- JSON Web Token -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>

<!-- Testing Dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>

<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
Expand All @@ -71,22 +90,12 @@
</dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>

</project>
39 changes: 18 additions & 21 deletions src/main/java/ie/atu/bookingservice/BookingController.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package ie.atu.bookingservice;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

Expand All @@ -23,34 +24,13 @@ public ResponseEntity<BookingDetails> createBooking(@RequestBody BookingDetails
return ResponseEntity.ok(createdBooking);
}

// Endpoint to get all available bookings (those that are not yet booked)
@GetMapping("/available")
public ResponseEntity<List<BookingDetails>> getAvailableBookings() {
List<BookingDetails> availableBookings = bookingService.getAvailableBookings();
return ResponseEntity.ok(availableBookings);
}

// Endpoint to get all bookings
@GetMapping
public ResponseEntity<List<BookingDetails>> getAllBookings() {
List<BookingDetails> bookings = bookingService.getAllBookings();
return ResponseEntity.ok(bookings);
}

// Endpoint to get a booking by its ID
@GetMapping("getbooking/{id}")
public ResponseEntity<BookingDetails> getBookingById(@PathVariable String id) {
Optional<BookingDetails> bookingDetails = bookingService.getBookingById(id);
return bookingDetails.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());
}

// Endpoint to get bookings by user ID
@GetMapping("/user/{userId}")
public ResponseEntity<List<BookingDetails>> getBookingByUserId(@PathVariable String userId) {
List<BookingDetails> bookings = bookingService.getByBookingUserId(userId);
return ResponseEntity.ok(bookings);
}

// Endpoint for updating a booking
@PutMapping("update/{id}")
public ResponseEntity<BookingDetails> updateBooking(@PathVariable String id, @RequestBody BookingDetails bookingDetails) {
Expand All @@ -61,6 +41,23 @@ public ResponseEntity<BookingDetails> updateBooking(@PathVariable String id, @Re
return ResponseEntity.notFound().build();
}

@PostMapping("/confirmBooking")
public ResponseEntity<String> confirmBooking(@RequestBody BookingDetails bookingDetails) {
String authToken = bookingDetails.getToken();

if (authToken == null || authToken.isEmpty()) {
return ResponseEntity.badRequest().body("Auth token is required.");
}

boolean isConfirmed = bookingService.confirmBooking(bookingDetails.getId());

if (isConfirmed) {
return ResponseEntity.ok("Booking confirmed successfully.");
} else {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Booking could not be confirmed.");
}
}

// Endpoint for deleting a booking
@DeleteMapping("delete/{id}")
public ResponseEntity<Void> deleteBooking(@PathVariable String id) {
Expand Down
19 changes: 19 additions & 0 deletions src/main/java/ie/atu/bookingservice/BookingDetails.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public class BookingDetails {
private String serviceType;
private String status;
private Date bookingDate;
private String token = null;

public String getId() {
return id;
Expand Down Expand Up @@ -62,4 +63,22 @@ public Date getBookingDate() {
public void setBookingDate(Date bookingDate) {
this.bookingDate = bookingDate;
}

public void setBookedBy(String username) {
}

public void setBooked(boolean b) {
}

public boolean isBooked() {
return false;
}

public String getToken() {
return token;
}

public void setToken(String token) {
this.token = token;
}
}
14 changes: 14 additions & 0 deletions src/main/java/ie/atu/bookingservice/BookingService.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,5 +47,19 @@ public List<BookingDetails> getAllBookings() {
public List<BookingDetails> getAvailableBookings() {
return bookingRepository.findByStatus("AVAILABLE");
}
public boolean confirmBooking(String id) {
Optional<BookingDetails> bookingOptional = bookingRepository.findById(id);
if (bookingOptional.isPresent()) {
BookingDetails booking = bookingOptional.get();

// Check if the status is "AVAILABLE"
if ("AVAILABLE".equals(booking.getStatus())) {
// If AVAILABLE, update status to "BOOKED"
booking.setStatus("BOOKED");
bookingRepository.save(booking); // Save the updated booking
return true;
}
}
return false; // Return false if the booking is not available or doesn't exist
}
}
31 changes: 31 additions & 0 deletions src/main/java/ie/atu/bookingservice/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package ie.atu.bookingservice;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable())
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/booking/confirmBooking").permitAll()
.anyRequest().authenticated() // Protect all other endpoints
)
.httpBasic(httpBasic -> httpBasic.disable())
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); // Stateless JWT auth
return http.build();
}

@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Loading
Loading