From 2165a08a36b3b08248443274f554fbbd0e20e620 Mon Sep 17 00:00:00 2001
From: damini1994 <55175815+damini1994@users.noreply.github.com>
Date: Mon, 25 Nov 2024 23:54:34 +0530
Subject: [PATCH 1/6] Feature/10 liquibase integration (#22)
* #10 Add Liquibase Integration
* #10 Add ChangeLog Master
* #10 Add Create Table change set xml file
* #10 Add Constraint change set xml file
* #10 Resolve review changes
* #10 Resolved review changes
---
.../backend/java/bms-monolith/pom.xml | 12 ++
.../bms/bms_monolith/common/entity/Event.java | 3 +-
.../bms_monolith/common/entity/EventShow.java | 6 +-
.../bms_monolith/common/entity/EventType.java | 2 +
.../bms/bms_monolith/common/entity/Seat.java | 9 +-
.../bms_monolith/common/entity/SeatType.java | 2 +
.../common/entity/SeatTypeInShow.java | 6 +-
.../bms_monolith/common/entity/Vendor.java | 22 +-
.../bms/bms_monolith/common/entity/Venue.java | 7 +-
.../src/main/resources/application.yaml | 5 +-
.../db/changelog/changelog-master.xml | 10 +
.../db/changelog/v1.0/add-constraints.xml | 58 +++++
.../db/changelog/v1.0/create-tables.xml | 202 ++++++++++++++++++
13 files changed, 331 insertions(+), 13 deletions(-)
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/changelog-master.xml
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/add-constraints.xml
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/create-tables.xml
diff --git a/book-my-show/backend/java/bms-monolith/pom.xml b/book-my-show/backend/java/bms-monolith/pom.xml
index 76f9214..a695f1f 100644
--- a/book-my-show/backend/java/bms-monolith/pom.xml
+++ b/book-my-show/backend/java/bms-monolith/pom.xml
@@ -54,6 +54,10 @@
org.springframework.boot
spring-boot-starter-validation
+
+ org.liquibase
+ liquibase-core
+
org.projectlombok
@@ -87,6 +91,14 @@
+
+ org.liquibase
+ liquibase-maven-plugin
+
+ src/main/resources/application.yaml
+ true
+
+
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Event.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Event.java
index 12dbaf9..0c770c9 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Event.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Event.java
@@ -1,6 +1,7 @@
package org.lbcc.bms.bms_monolith.common.entity;
import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.CascadeType;
@@ -18,12 +19,12 @@
import java.util.List;
@Entity
+@Table(name = "events")
@Getter @Setter
@AllArgsConstructor @NoArgsConstructor
@SuperBuilder
public class Event extends BaseAuditingEntity {
- @Size(min=10, max=50, message = "Title must be between 10 and 50 characters.")
@Column(nullable = false, length = 50)
private String title;
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/EventShow.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/EventShow.java
index a8196e1..b7652a1 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/EventShow.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/EventShow.java
@@ -1,6 +1,7 @@
package org.lbcc.bms.bms_monolith.common.entity;
import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.CollectionTable;
import jakarta.persistence.Column;
@@ -21,13 +22,14 @@
import java.util.List;
@Entity
+@Table(name = "event_shows")
@Getter
@SuperBuilder
public class EventShow extends BaseAuditingEntity {
@ElementCollection(targetClass = Genre.class)
- @CollectionTable(name = "show_genre", joinColumns = @JoinColumn(name = "show_id"))
- @Column(name = "genre")
+ @CollectionTable(name = "show_genres", joinColumns = @JoinColumn(name = "show_id"))
+ @Column(name = "label")
@Enumerated(EnumType.STRING)
private List genres;
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/EventType.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/EventType.java
index e3b4af8..be81f6c 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/EventType.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/EventType.java
@@ -2,6 +2,7 @@
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
@@ -9,6 +10,7 @@
import lombok.experimental.SuperBuilder;
@Entity
+@Table(name = "event_types")
@Getter
@Setter
@AllArgsConstructor
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Seat.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Seat.java
index 0673e1d..536fb65 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Seat.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Seat.java
@@ -1,6 +1,12 @@
package org.lbcc.bms.bms_monolith.common.entity;
-import jakarta.persistence.*;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Column;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
@@ -8,6 +14,7 @@
import org.lbcc.bms.bms_monolith.common.enums.OperationalStatus;
@Entity
+@Table(name = "seats")
@Getter
@Setter
@AllArgsConstructor
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/SeatType.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/SeatType.java
index 4a11cc2..50d26ff 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/SeatType.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/SeatType.java
@@ -2,6 +2,7 @@
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
@@ -10,6 +11,7 @@
import java.math.BigDecimal;
@Entity
+@Table(name = "seat_types")
@Getter
@Setter
@AllArgsConstructor
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/SeatTypeInShow.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/SeatTypeInShow.java
index 45f7fb1..581241e 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/SeatTypeInShow.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/SeatTypeInShow.java
@@ -1,6 +1,7 @@
package org.lbcc.bms.bms_monolith.common.entity;
import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.Column;
@@ -10,16 +11,17 @@
import java.math.BigDecimal;
@Entity
+@Table(name = "seat_type_in_shows")
@Getter
@SuperBuilder
public class SeatTypeInShow extends BaseAuditingEntity {
@ManyToOne
- @JoinColumn(name = "seat_type_id")
+ @JoinColumn(name = "seat_type_id", nullable = false)
private SeatType seatType;
@ManyToOne
- @JoinColumn(name = "show_id")
+ @JoinColumn(name = "show_id", nullable = false)
private EventShow show;
@Column(precision = 10, scale = 2)
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Vendor.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Vendor.java
index 5feef8b..94e32ff 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Vendor.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Vendor.java
@@ -1,37 +1,51 @@
package org.lbcc.bms.bms_monolith.common.entity;
import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
import jakarta.persistence.Enumerated;
import jakarta.persistence.EnumType;
import jakarta.persistence.Column;
import jakarta.validation.constraints.Size;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.Pattern;
+import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.lbcc.bms.bms_monolith.common.enums.VendorStatus;
+import java.time.LocalDateTime;
+
@Entity
+@Table(name = "vendors")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Vendor extends BaseAuditingEntity {
+ @Column(nullable = false, length = 20)
private String name;
private String contactNumber;
+
+ @Column(nullable = false, length = 100)
private String email;
+
+ @Column(nullable = false)
private String address;
+
+ @Column(nullable = true, length = 100)
private String website;
@Enumerated(EnumType.STRING)
+ @Column(nullable = false, length = 20)
private VendorStatus status;
- @Column(nullable = true, length = 100)
- @Size(min = 10, max = 100, message = "Registration date must be between 10 and 100 characters.")
- private String registrationDate;
+ @Column(nullable = false)
+ private LocalDateTime registrationDate;
@Column(nullable = false, length = 255)
- @Size(min = 25, max = 255, message = "Logo URL must be between 25 and 255 characters.")
private String logoUrl;
}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Venue.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Venue.java
index 3e698c7..97d9bea 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Venue.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Venue.java
@@ -1,11 +1,13 @@
package org.lbcc.bms.bms_monolith.common.entity;
import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
import jakarta.persistence.Enumerated;
import jakarta.persistence.EnumType;
import jakarta.persistence.CascadeType;
import jakarta.persistence.FetchType;
import jakarta.persistence.OneToMany;
+import jakarta.persistence.Column;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
@@ -19,12 +21,14 @@
import java.util.List;
@Entity
+@Table(name = "venues")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Venue extends BaseAuditingEntity {
+ @Column(nullable = false, unique = true)
private String name;
private String address;
private BigDecimal latitude;
@@ -38,7 +42,6 @@ public class Venue extends BaseAuditingEntity {
private OperationalStatus operationalStatus;
@OneToMany(mappedBy = "venue", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
- @NotNull(message = "Seats list cannot be null.")
- @Size(min = 1, max = 100, message = "Seats list must contain between 1 and 100 seats.")
+ @Column(nullable = false)
private List seats;
}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml b/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml
index a30b3ae..c63a05b 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml
+++ b/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml
@@ -11,8 +11,11 @@ Spring:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect
hibernate:
- ddl-auto: update
+ ddl-auto: validate
show-sql: true
+ liquibase:
+ change-log: classpath:db/changelog/changelog-master.xml
+ enabled: true
server:
servlet:
context-path: /api/v1
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/changelog-master.xml b/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/changelog-master.xml
new file mode 100644
index 0000000..0bbd586
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/changelog-master.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
diff --git a/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/add-constraints.xml b/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/add-constraints.xml
new file mode 100644
index 0000000..4db64bc
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/add-constraints.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/create-tables.xml b/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/create-tables.xml
new file mode 100644
index 0000000..e580d92
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/create-tables.xml
@@ -0,0 +1,202 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From a8f5cc47761eb437b3a6a63911e903a4be9ebdcd Mon Sep 17 00:00:00 2001
From: Naresh Darga
Date: Tue, 26 Nov 2024 21:03:59 +0530
Subject: [PATCH 2/6] security- changes for user login
---
.../backend/java/bms-monolith/pom.xml | 36 ++++++++
.../bms_monolith/BmsMonolithApplication.java | 1 +
.../exception/GlobalExceptionHandler.java | 59 +++++++++++--
.../security/AuthEntryPointJwt.java | 41 +++++++++
.../security/AuthTokenFilter.java | 67 ++++++++++++++
.../security/WebSecurityConfig.java | 88 +++++++++++++++++++
.../userservice/common/JwtUtils.java | 69 +++++++++++++++
.../userservice/common/RoleDataSeeder.java | 39 ++++++++
.../userservice/common/RoleFactory.java | 33 +++++++
.../userservice/common/RoleType.java | 9 ++
.../userservice/common/SignUpRequestDto.java | 34 +++++++
.../controller/AuthController.java | 31 +++++++
.../controller/UserController.java | 18 ++++
.../exeception/RoleNotFoundException.java | 7 ++
.../UserAlreadyExistsException.java | 7 ++
.../exeception/UsernameNotFoundException.java | 7 ++
.../userservice/model/BaseEntity.java | 48 ++++++++++
.../bms_monolith/userservice/model/Role.java | 23 +++++
.../bms_monolith/userservice/model/User.java | 38 ++++++++
.../repository/RoleRepository.java | 11 +++
.../repository/UserRepository.java | 13 +++
.../userservice/service/AuthService.java | 14 +++
.../userservice/service/UserService.java | 11 +++
.../service/impl/AuthServiceImpl.java | 75 ++++++++++++++++
.../service/impl/UserDetailsImpl.java | 67 ++++++++++++++
.../service/impl/UserDetailsServiceImpl.java | 27 ++++++
.../service/impl/UserServiceImpl.java | 34 +++++++
.../src/main/resources/application.yaml | 19 ++--
28 files changed, 916 insertions(+), 10 deletions(-)
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/AuthEntryPointJwt.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/AuthTokenFilter.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/WebSecurityConfig.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/JwtUtils.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleDataSeeder.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleFactory.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleType.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/SignUpRequestDto.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/AuthController.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/UserController.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/RoleNotFoundException.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UserAlreadyExistsException.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UsernameNotFoundException.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/BaseEntity.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/Role.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/User.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/RoleRepository.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/UserRepository.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/AuthService.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/UserService.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsImpl.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsServiceImpl.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserServiceImpl.java
diff --git a/book-my-show/backend/java/bms-monolith/pom.xml b/book-my-show/backend/java/bms-monolith/pom.xml
index 76f9214..2acf613 100644
--- a/book-my-show/backend/java/bms-monolith/pom.xml
+++ b/book-my-show/backend/java/bms-monolith/pom.xml
@@ -54,6 +54,16 @@
org.springframework.boot
spring-boot-starter-validation
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.security
+ spring-security-test
+ test
+
+
org.projectlombok
@@ -70,6 +80,32 @@
jackson-datatype-jsr310
2.18.0
+
+ io.jsonwebtoken
+ jjwt-api
+ 0.11.5
+
+
+ io.jsonwebtoken
+ jjwt-impl
+ 0.11.5
+
+
+ io.jsonwebtoken
+ jjwt-jackson
+ 0.11.5
+
+
+
+ org.postgresql
+ postgresql
+ 42.7.4
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/BmsMonolithApplication.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/BmsMonolithApplication.java
index f43b60d..ad6b857 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/BmsMonolithApplication.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/BmsMonolithApplication.java
@@ -4,6 +4,7 @@
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
+
public class BmsMonolithApplication {
public static void main(String[] args) {
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java
index b0de11d..0c80f1a 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java
@@ -2,18 +2,19 @@
import org.lbcc.bms.bms_monolith.common.constants.BMSConstants;
import org.lbcc.bms.bms_monolith.common.response.ApiErrorResponse;
+import org.lbcc.bms.bms_monolith.userservice.exeception.RoleNotFoundException;
+import org.lbcc.bms.bms_monolith.userservice.exeception.UserAlreadyExistsException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
+import java.util.ArrayList;
+import java.util.List;
+
@ControllerAdvice
public class GlobalExceptionHandler {
- @ExceptionHandler(Exception.class)
- public ResponseEntity handleGlobalException(Exception ex) {
- return buildErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR, BMSConstants.UNEXPECTED_ERROR_MESSAGE, BMSConstants.UNEXPECTED_ERROR_CODE);
- }
-
public static ResponseEntity buildErrorResponse(HttpStatus status, String message, String code) {
ApiErrorResponse errorResponse = ApiErrorResponse.builder()
.message(message)
@@ -21,4 +22,52 @@ public static ResponseEntity buildErrorResponse(HttpStatus sta
.build();
return ResponseEntity.status(status).body(errorResponse);
}
+
+ @ExceptionHandler(Exception.class)
+ public ResponseEntity handleGlobalException(Exception ex) {
+ return buildErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR, BMSConstants.UNEXPECTED_ERROR_MESSAGE, BMSConstants.UNEXPECTED_ERROR_CODE);
+ }
+
+ @ExceptionHandler(value = MethodArgumentNotValidException.class)
+ public ResponseEntity MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException exception) {
+
+ List errorMessage = new ArrayList<>();
+
+ exception.getBindingResult().getFieldErrors().forEach(error -> {
+ errorMessage.add(error.getDefaultMessage());
+ });
+ return ResponseEntity
+ .badRequest()
+ .body(
+ ApiErrorResponse.builder()
+ // .isSuccess(false)
+ .message("Registration Failed: Please provide valid data.")
+ .code(errorMessage.toString())
+ .build()
+ );
+ }
+
+ @ExceptionHandler(value = UserAlreadyExistsException.class)
+ public ResponseEntity UserAlreadyExistsExceptionHandler(UserAlreadyExistsException exception) {
+ return ResponseEntity
+ .status(HttpStatus.CONFLICT)
+ .body(
+ ApiErrorResponse.builder()
+ // .isSuccess(false)
+ .message(exception.getMessage())
+ .build()
+ );
+ }
+
+ @ExceptionHandler(value = RoleNotFoundException.class)
+ public ResponseEntity RoleNotFoundExceptionHandler(RoleNotFoundException exception) {
+ return ResponseEntity
+ .status(HttpStatus.NOT_FOUND)
+ .body(
+ ApiErrorResponse.builder()
+ .message(exception.getMessage())
+ .build()
+ );
+ }
+
}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/AuthEntryPointJwt.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/AuthEntryPointJwt.java
new file mode 100644
index 0000000..4d62880
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/AuthEntryPointJwt.java
@@ -0,0 +1,41 @@
+
+package org.lbcc.bms.bms_monolith.security;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.MediaType;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class AuthEntryPointJwt implements AuthenticationEntryPoint {
+
+ private static final Logger logger = LoggerFactory.getLogger(AuthEntryPointJwt.class);
+
+ @Override
+ public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException)
+ throws IOException {
+ logger.error("Unauthorized error: {}", authException.getMessage());
+
+ response.setContentType(MediaType.APPLICATION_JSON_VALUE);
+ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+
+ final Map body = new HashMap<>();
+ body.put("status", HttpServletResponse.SC_UNAUTHORIZED);
+ body.put("error", "Unauthorized");
+ body.put("message", authException.getMessage());
+ body.put("path", request.getServletPath());
+
+ final ObjectMapper mapper = new ObjectMapper();
+ mapper.writeValue(response.getOutputStream(), body);
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/AuthTokenFilter.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/AuthTokenFilter.java
new file mode 100644
index 0000000..7d2667e
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/AuthTokenFilter.java
@@ -0,0 +1,67 @@
+
+package org.lbcc.bms.bms_monolith.security;
+
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.lbcc.bms.bms_monolith.userservice.common.JwtUtils;
+import org.lbcc.bms.bms_monolith.userservice.service.impl.UserDetailsServiceImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import java.io.IOException;
+
+
+public class AuthTokenFilter extends OncePerRequestFilter {
+ @Autowired
+ private JwtUtils jwtUtils;
+
+ @Autowired
+ private UserDetailsServiceImpl userDetailsService;
+
+ private static final Logger logger = LoggerFactory.getLogger(AuthTokenFilter.class);
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+ throws ServletException, IOException {
+ try {
+ String jwt = parseJwt(request);
+ if (jwt != null && jwtUtils.validateJwtToken(jwt)) {
+ String username = jwtUtils.getUserNameFromJwtToken(jwt);
+
+ UserDetails userDetails = userDetailsService.loadUserByUsername(username);
+ UsernamePasswordAuthenticationToken authentication =
+ new UsernamePasswordAuthenticationToken(
+ userDetails,
+ null,
+ userDetails.getAuthorities());
+ authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
+
+ SecurityContextHolder.getContext().setAuthentication(authentication);
+ }
+ } catch (Exception e) {
+ logger.error("Cannot set user authentication: {}", e);
+ }
+
+ filterChain.doFilter(request, response);
+ }
+
+ private String parseJwt(HttpServletRequest request) {
+ String headerAuth = request.getHeader("Authorization");
+
+ if (StringUtils.hasText(headerAuth) && headerAuth.startsWith("Bearer ")) {
+ return headerAuth.substring(7);
+ }
+
+ return null;
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/WebSecurityConfig.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/WebSecurityConfig.java
new file mode 100644
index 0000000..c0071cd
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/WebSecurityConfig.java
@@ -0,0 +1,88 @@
+package org.lbcc.bms.bms_monolith.security;
+
+
+import org.lbcc.bms.bms_monolith.userservice.service.impl.UserDetailsServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
+import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
+import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+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;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+import org.springframework.security.web.util.matcher.RequestMatcher;
+
+import java.util.List;
+
+
+@Configuration
+@EnableMethodSecurity
+public class WebSecurityConfig{
+
+ List publicApis = List.of( "/api/auth/**");
+
+ private final AuthEntryPointJwt unauthorizedHandler = new AuthEntryPointJwt();
+ UserDetailsServiceImpl userDetailsService = new UserDetailsServiceImpl();
+
+ @Bean
+ public AuthTokenFilter authenticationJwtTokenFilter() {
+ return new AuthTokenFilter();
+ }
+
+ @Bean
+ public DaoAuthenticationProvider authenticationProvider() {
+
+
+ DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
+
+ authProvider.setUserDetailsService(userDetailsService);
+ authProvider.setPasswordEncoder(passwordEncoder());
+
+ return authProvider;
+ }
+
+ @Bean
+ public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig)
+ throws Exception {
+ return authConfig.getAuthenticationManager();
+ }
+
+ @Bean
+ public PasswordEncoder passwordEncoder() {
+ return new BCryptPasswordEncoder();
+ }
+
+ @Bean
+ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
+
+ http.csrf(AbstractHttpConfigurer::disable)
+
+ .exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler))
+ .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
+
+ .authorizeHttpRequests(auth ->
+ auth.requestMatchers(publicApis.stream()
+ .map(AntPathRequestMatcher::new)
+ .toArray(RequestMatcher[]::new)).permitAll()
+ .anyRequest().authenticated()
+ );
+
+ http.authenticationProvider(authenticationProvider());
+
+ http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
+
+ return http.build();
+ }
+ @Bean
+ public WebSecurityCustomizer webSecurityCustomizer() {
+ return (web) -> web.ignoring().requestMatchers(publicApis.toArray(String[]::new));
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/JwtUtils.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/JwtUtils.java
new file mode 100644
index 0000000..6533589
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/JwtUtils.java
@@ -0,0 +1,69 @@
+
+package org.lbcc.bms.bms_monolith.userservice.common;
+
+import io.jsonwebtoken.*;
+import io.jsonwebtoken.io.Decoders;
+import io.jsonwebtoken.security.Keys;
+import org.lbcc.bms.bms_monolith.userservice.service.impl.UserDetailsImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.Authentication;
+import org.springframework.stereotype.Component;
+
+import java.security.Key;
+import java.util.Date;
+
+@Component
+public class JwtUtils {
+ private static final Logger logger = LoggerFactory.getLogger(JwtUtils.class);
+
+ @Value("${app.jwtSecret}")
+ private String jwtSecret;
+
+ @Value("${app.jwtExpirationMs}")
+ private int jwtExpirationMs;
+
+ public String generateJwtToken(Authentication authentication) {
+
+ UserDetailsImpl userPrincipal = (UserDetailsImpl) authentication.getPrincipal();
+
+ return Jwts.builder()
+ .setSubject((userPrincipal.getEmail()))
+ .setIssuedAt(new Date())
+ .setExpiration(new Date((new Date()).getTime() + jwtExpirationMs))
+ .signWith(key(), SignatureAlgorithm.HS256)
+ .compact();
+ }
+
+ private Key key() {
+ return Keys.hmacShaKeyFor(Decoders.BASE64.decode(jwtSecret));
+ }
+
+ public String getUserNameFromJwtToken(String token) {
+ return Jwts.parserBuilder()
+ .setSigningKey(key())
+ .build()
+ .parseClaimsJws(token)
+ .getBody()
+ .getSubject();
+ }
+
+ public boolean validateJwtToken(String authToken) {
+ try {
+ Jwts.parserBuilder().setSigningKey(key()).build().parse(authToken);
+ return true;
+ } catch (MalformedJwtException e) {
+ logger.error("Invalid JWT token: {}", e.getMessage());
+ } catch (ExpiredJwtException e) {
+ logger.error("JWT token is expired: {}", e.getMessage());
+ } catch (UnsupportedJwtException e) {
+ logger.error("JWT token is unsupported: {}", e.getMessage());
+ } catch (IllegalArgumentException e) {
+ logger.error("JWT claims string is empty: {}", e.getMessage());
+ }
+
+ return false;
+ }
+}
+
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleDataSeeder.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleDataSeeder.java
new file mode 100644
index 0000000..156e715
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleDataSeeder.java
@@ -0,0 +1,39 @@
+package org.lbcc.bms.bms_monolith.userservice.common;
+
+import jakarta.transaction.Transactional;
+import org.lbcc.bms.bms_monolith.userservice.model.Role;
+import org.lbcc.bms.bms_monolith.userservice.repository.RoleRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+import java.time.Instant;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+
+@Component
+public class RoleDataSeeder {
+ @Autowired private RoleRepository roleRepository;
+
+ @EventListener
+ @Transactional
+ public void LoadRoles(ContextRefreshedEvent event) {
+
+ List roles = Arrays.stream(RoleType.values()).toList();
+
+ for (RoleType erole : roles) {
+ if (roleRepository.findByName(erole) == null) {
+ Role role = new Role();
+ role.setName(erole);
+ role.setDescription(erole.name());
+ role.setCreatedBy("system");
+ role.setCreatedDate(Instant.now());
+ role.setLastModifiedDate(Instant.now());
+ role.setLastModifiedBy("system");
+ roleRepository.save(role);
+ }
+ }
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleFactory.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleFactory.java
new file mode 100644
index 0000000..25140fd
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleFactory.java
@@ -0,0 +1,33 @@
+package org.lbcc.bms.bms_monolith.userservice.common;
+
+import org.lbcc.bms.bms_monolith.userservice.exeception.RoleNotFoundException;
+import org.lbcc.bms.bms_monolith.userservice.model.Role;
+import org.lbcc.bms.bms_monolith.userservice.repository.RoleRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class RoleFactory {
+ @Autowired
+ RoleRepository roleRepository;
+
+ public Role getInstance(String role) throws RoleNotFoundException {
+ switch (role) {
+ case "admin" -> {
+ return roleRepository.findByName(RoleType.ADMIN);
+ }
+ case "user" -> {
+ return roleRepository.findByName(RoleType.USER);
+ }
+ case "vendor" -> {
+ return roleRepository.findByName(RoleType.VENDOR);
+ }
+ case "guest" -> {
+ return roleRepository.findByName(RoleType.GUEST);
+ }
+
+ default -> throw new RoleNotFoundException("No role found for " + role);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleType.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleType.java
new file mode 100644
index 0000000..e893a2b
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleType.java
@@ -0,0 +1,9 @@
+package org.lbcc.bms.bms_monolith.userservice.common;
+
+public enum RoleType {
+ GUEST,
+ VENDOR,
+ ADMIN,
+ USER,
+
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/SignUpRequestDto.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/SignUpRequestDto.java
new file mode 100644
index 0000000..4080f22
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/SignUpRequestDto.java
@@ -0,0 +1,34 @@
+package org.lbcc.bms.bms_monolith.userservice.common;
+
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Set;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class SignUpRequestDto {
+ @NotBlank(message = "Username is required!")
+ @Size(min= 3, message = "Username must have atleast 3 characters!")
+ @Size(max= 20, message = "Username can have have atmost 20 characters!")
+ private String userName;
+
+ @Email(message = "Email is not in valid format!")
+ @NotBlank(message = "Email is required!")
+ private String email;
+
+ @NotBlank(message = "Password is required!")
+ @Size(min = 8, message = "Password must have atleast 8 characters!")
+ @Size(max = 20, message = "Password can have have atmost 20 characters!")
+ private String password;
+
+ private Set roles;
+
+
+}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/AuthController.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/AuthController.java
new file mode 100644
index 0000000..8df0792
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/AuthController.java
@@ -0,0 +1,31 @@
+package org.lbcc.bms.bms_monolith.userservice.controller;
+
+import jakarta.validation.Valid;
+import org.lbcc.bms.bms_monolith.common.response.ApiResponse;
+import org.lbcc.bms.bms_monolith.userservice.common.SignUpRequestDto;
+import org.lbcc.bms.bms_monolith.userservice.exeception.RoleNotFoundException;
+import org.lbcc.bms.bms_monolith.userservice.exeception.UserAlreadyExistsException;
+import org.lbcc.bms.bms_monolith.userservice.service.AuthService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@CrossOrigin("*")
+@RequestMapping("/auth")
+public class AuthController {
+ @Autowired
+ private AuthService authService;
+
+ @PostMapping("/signup")
+ public ResponseEntity registerUser(@RequestBody @Valid SignUpRequestDto signUpRequestDto)
+ throws UserAlreadyExistsException, RoleNotFoundException {
+ return authService.signUpUser(signUpRequestDto);
+ }
+ @PostMapping("/signin")
+ public ResponseEntity signIn(@RequestBody @Valid SignUpRequestDto signUpRequestDto)
+ throws UserAlreadyExistsException, RoleNotFoundException {
+ return authService.signUpUser(signUpRequestDto);
+ }
+
+}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/UserController.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/UserController.java
new file mode 100644
index 0000000..4aa615f
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/UserController.java
@@ -0,0 +1,18 @@
+package org.lbcc.bms.bms_monolith.userservice.controller;
+
+import org.lbcc.bms.bms_monolith.common.response.ApiResponse;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/users")
+public class UserController {
+
+ @GetMapping("/")
+ public ResponseEntity> Test() {
+ return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.builder().success(true).message(" jwt token test").build());
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/RoleNotFoundException.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/RoleNotFoundException.java
new file mode 100644
index 0000000..e79aa86
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/RoleNotFoundException.java
@@ -0,0 +1,7 @@
+package org.lbcc.bms.bms_monolith.userservice.exeception;
+
+public class RoleNotFoundException extends Exception{
+ public RoleNotFoundException(String message) {
+ super(message);
+ }
+}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UserAlreadyExistsException.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UserAlreadyExistsException.java
new file mode 100644
index 0000000..5b9f596
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UserAlreadyExistsException.java
@@ -0,0 +1,7 @@
+package org.lbcc.bms.bms_monolith.userservice.exeception;
+
+public class UserAlreadyExistsException extends Exception{
+ public UserAlreadyExistsException(String message) {
+ super(message);
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UsernameNotFoundException.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UsernameNotFoundException.java
new file mode 100644
index 0000000..5d57ccf
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UsernameNotFoundException.java
@@ -0,0 +1,7 @@
+package org.lbcc.bms.bms_monolith.userservice.exeception;
+
+public class UsernameNotFoundException extends RuntimeException {
+ public UsernameNotFoundException(String message) {
+ super(message);
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/BaseEntity.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/BaseEntity.java
new file mode 100644
index 0000000..2287e9f
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/BaseEntity.java
@@ -0,0 +1,48 @@
+package org.lbcc.bms.bms_monolith.userservice.model;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.EntityListeners;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.MappedSuperclass;
+import java.time.Instant;
+import java.util.UUID;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.experimental.SuperBuilder;
+import org.springframework.data.annotation.CreatedBy;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedBy;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+@AllArgsConstructor
+@Getter
+@MappedSuperclass
+@NoArgsConstructor
+@Setter
+@SuperBuilder
+@EntityListeners(AuditingEntityListener.class)
+public abstract class BaseEntity {
+
+
+
+ @CreatedDate
+ @Column(updatable = false)
+ private Instant createdDate;
+
+ @LastModifiedDate
+ @Column(insertable = false)
+ private Instant lastModifiedDate;
+
+ @CreatedBy
+ @Column(updatable = false, length = 10)
+ private String createdBy;
+
+ @LastModifiedBy
+ @Column(insertable = false, length = 10)
+ private String lastModifiedBy;
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/Role.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/Role.java
new file mode 100644
index 0000000..ae3e77e
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/Role.java
@@ -0,0 +1,23 @@
+package org.lbcc.bms.bms_monolith.userservice.model;
+
+import jakarta.persistence.*;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.lbcc.bms.bms_monolith.userservice.common.RoleType;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@Table(name = "roles")
+public class Role extends BaseEntity {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ @Column(name = "role_id")
+ private Long roleId;
+ @Enumerated(EnumType.STRING)
+ private RoleType name;
+
+ @Column private String description;
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/User.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/User.java
new file mode 100644
index 0000000..81910d7
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/User.java
@@ -0,0 +1,38 @@
+package org.lbcc.bms.bms_monolith.userservice.model;
+
+import jakarta.persistence.*;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+import org.lbcc.bms.bms_monolith.common.entity.BaseAuditingEntity;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@Table(name="users")
+public class User extends BaseEntity {
+
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ @Column(name = "user_id")
+ private Long id;
+ private String username;
+ private String email;
+ private String phone;
+ private String password;
+ private boolean enabled = true;
+
+ @ManyToMany(fetch = FetchType.EAGER)
+ @JoinTable(
+ name = "user_roles",
+ joinColumns = {@JoinColumn(name = "user_id")},
+ inverseJoinColumns = {@JoinColumn(name = "role_id")})
+ private Set roles = new HashSet<>();
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/RoleRepository.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/RoleRepository.java
new file mode 100644
index 0000000..b1d5096
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/RoleRepository.java
@@ -0,0 +1,11 @@
+package org.lbcc.bms.bms_monolith.userservice.repository;
+
+import org.lbcc.bms.bms_monolith.userservice.common.RoleType;
+import org.lbcc.bms.bms_monolith.userservice.model.Role;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface RoleRepository extends JpaRepository {
+ Role findByName(RoleType name);
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/UserRepository.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/UserRepository.java
new file mode 100644
index 0000000..081ff0f
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/UserRepository.java
@@ -0,0 +1,13 @@
+package org.lbcc.bms.bms_monolith.userservice.repository;
+
+import org.lbcc.bms.bms_monolith.userservice.model.User;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+@Repository
+public interface UserRepository extends JpaRepository {
+ Optional findByEmail(String email);
+ Boolean existsByUsername(String username);
+ Boolean existsByEmail(String email);
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/AuthService.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/AuthService.java
new file mode 100644
index 0000000..3d4322a
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/AuthService.java
@@ -0,0 +1,14 @@
+package org.lbcc.bms.bms_monolith.userservice.service;
+
+import org.lbcc.bms.bms_monolith.common.response.ApiResponse;
+import org.lbcc.bms.bms_monolith.userservice.common.SignUpRequestDto;
+import org.lbcc.bms.bms_monolith.userservice.exeception.RoleNotFoundException;
+import org.lbcc.bms.bms_monolith.userservice.exeception.UserAlreadyExistsException;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public interface AuthService {
+ ResponseEntity signUpUser(SignUpRequestDto signUpRequestDto) throws UserAlreadyExistsException, RoleNotFoundException, org.lbcc.bms.bms_monolith.userservice.exeception.RoleNotFoundException;
+}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/UserService.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/UserService.java
new file mode 100644
index 0000000..3aec886
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/UserService.java
@@ -0,0 +1,11 @@
+package org.lbcc.bms.bms_monolith.userservice.service;
+
+import org.lbcc.bms.bms_monolith.userservice.model.User;
+import org.springframework.stereotype.Service;
+
+@Service
+public interface UserService {
+ boolean existsByUsername(String username);
+ boolean existsByEmail(String email);
+ void save(User user);
+}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java
new file mode 100644
index 0000000..df78109
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java
@@ -0,0 +1,75 @@
+package org.lbcc.bms.bms_monolith.userservice.service.impl;
+
+import org.lbcc.bms.bms_monolith.common.response.ApiResponse;
+import org.lbcc.bms.bms_monolith.userservice.common.RoleFactory;
+import org.lbcc.bms.bms_monolith.userservice.common.SignUpRequestDto;
+import org.lbcc.bms.bms_monolith.userservice.exeception.RoleNotFoundException;
+import org.lbcc.bms.bms_monolith.userservice.exeception.UserAlreadyExistsException;
+import org.lbcc.bms.bms_monolith.userservice.model.Role;
+import org.lbcc.bms.bms_monolith.userservice.model.User;
+import org.lbcc.bms.bms_monolith.userservice.service.AuthService;
+import org.lbcc.bms.bms_monolith.userservice.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Component;
+
+import java.util.HashSet;
+import java.util.Set;
+
+@Component
+public class AuthServiceImpl implements AuthService {
+
+ @Autowired
+ private UserService userService;
+
+ private PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+
+ @Autowired
+ private RoleFactory roleFactory;
+
+ @Override
+ public ResponseEntity signUpUser(SignUpRequestDto signUpRequestDto)
+ throws UserAlreadyExistsException , RoleNotFoundException {
+ if (userService.existsByEmail(signUpRequestDto.getEmail())) {
+ throw new UserAlreadyExistsException("Registration Failed: Provided email already exists. Try sign in or provide another email.");
+ }
+ if (userService.existsByUsername(signUpRequestDto.getUserName())) {
+ throw new UserAlreadyExistsException("Registration Failed: Provided username already exists. Try sign in or provide another username.");
+ }
+
+ User user = createUser(signUpRequestDto);
+ userService.save(user);
+ return ResponseEntity.status(HttpStatus.CREATED).body(
+ ApiResponse.builder()
+ // .isSuccess(true)
+ .message("User account has been successfully created!")
+ .build()
+ );
+ }
+
+ private User createUser(SignUpRequestDto signUpRequestDto) throws RoleNotFoundException {
+ return User.builder()
+ .email(signUpRequestDto.getEmail())
+ .username(signUpRequestDto.getUserName())
+ .password(signUpRequestDto.getPassword())
+ .enabled(true)
+ .roles(determineRoles(signUpRequestDto.getRoles()))
+ .build();
+ }
+
+ private Set determineRoles(Set strRoles) throws RoleNotFoundException {
+ Set roles = new HashSet<>();
+
+ if (strRoles == null) {
+ roles.add(roleFactory.getInstance("user"));
+ } else {
+ for (String role : strRoles) {
+ roles.add(roleFactory.getInstance(role));
+ }
+ }
+ return roles;
+ }
+}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsImpl.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsImpl.java
new file mode 100644
index 0000000..a6f1c4c
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsImpl.java
@@ -0,0 +1,67 @@
+
+package org.lbcc.bms.bms_monolith.userservice.service.impl;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.lbcc.bms.bms_monolith.userservice.model.User;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.io.Serial;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@AllArgsConstructor
+@Data
+public class UserDetailsImpl implements UserDetails {
+ @Serial private static final long serialVersionUID = 1L;
+ private Long id;
+ private String username;
+ private String email;
+ @JsonIgnore private String password;
+ private Collection extends GrantedAuthority> authorities;
+ private boolean enabled;
+
+ public static UserDetailsImpl build(User user) {
+ List authorities =
+ user.getRoles().stream()
+ .map(role -> new SimpleGrantedAuthority(role.getName().name()))
+ .collect(Collectors.toList());
+
+ return new UserDetailsImpl(
+ user.getId(),
+ user.getUsername(),
+ user.getEmail(),
+ user.getPassword(),
+ authorities,
+ user.isEnabled());
+ }
+
+ @Override
+ public boolean isAccountNonExpired() {
+ return true;
+ }
+
+ @Override
+ public boolean isAccountNonLocked() {
+ return true;
+ }
+
+ @Override
+ public boolean isCredentialsNonExpired() {
+ return true;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ UserDetailsImpl user = (UserDetailsImpl) o;
+ return Objects.equals(id, user.id);
+ }
+}
+
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsServiceImpl.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsServiceImpl.java
new file mode 100644
index 0000000..209cb3f
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsServiceImpl.java
@@ -0,0 +1,27 @@
+package org.lbcc.bms.bms_monolith.userservice.service.impl;
+
+import jakarta.transaction.Transactional;
+import org.lbcc.bms.bms_monolith.userservice.model.User;
+import org.lbcc.bms.bms_monolith.userservice.repository.UserRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserDetailsServiceImpl implements UserDetailsService {
+ @Autowired UserRepository userRepository;
+
+ @Override
+ @Transactional
+ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+ User user =
+ userRepository
+ .findByEmail(username)
+ .orElseThrow(
+ () -> new UsernameNotFoundException("User Not Found with username: " + username));
+
+ return UserDetailsImpl.build(user);
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserServiceImpl.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserServiceImpl.java
new file mode 100644
index 0000000..4946fba
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserServiceImpl.java
@@ -0,0 +1,34 @@
+package org.lbcc.bms.bms_monolith.userservice.service.impl;
+
+import org.lbcc.bms.bms_monolith.userservice.model.User;
+import org.lbcc.bms.bms_monolith.userservice.repository.UserRepository;
+import org.lbcc.bms.bms_monolith.userservice.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserServiceImpl implements UserService {
+
+ private final UserRepository userRepository;
+
+ @Autowired
+ public UserServiceImpl(UserRepository userRepository) {
+ this.userRepository = userRepository;
+ }
+
+ @Override
+ public boolean existsByUsername(String username) {
+ return userRepository.existsByUsername(username);
+ }
+
+ @Override
+ public boolean existsByEmail(String email) {
+ return userRepository.existsByEmail(email);
+ }
+
+ @Override
+ public void save(User user) {
+ userRepository.save(user);
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml b/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml
index a30b3ae..a975fcf 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml
+++ b/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml
@@ -2,17 +2,26 @@ Spring:
application:
name: BMS Monolith
datasource:
- url: jdbc:mysql://localhost:3306/bms
- username: ${DB_USERNAME:root}
+ url: jdbc:postgresql://localhost:5432/bms
+ username: ${DB_USERNAME:postgres}
password: ${DB_PASSWORD:root}
- driver-class-name: com.mysql.cj.jdbc.Driver
+ driver-class-name: org.postgresql.Driver
jpa:
properties:
hibernate:
- dialect: org.hibernate.dialect.MySQLDialect
+ dialect: org.hibernate.dialect.PostgreSQLDialect
hibernate:
ddl-auto: update
show-sql: true
server:
servlet:
- context-path: /api/v1
\ No newline at end of file
+ context-path: /api/v1
+app:
+ jwtSecret: ramdom852
+ jwtExpirationMs: 86400000
+
+logging:
+ level:
+ org:
+ springframework:
+ security: DEBUG
\ No newline at end of file
From 7777b9cd5280e453c8d86f07a08aefb0e455fd62 Mon Sep 17 00:00:00 2001
From: Naresh Darga
Date: Tue, 26 Nov 2024 21:10:45 +0530
Subject: [PATCH 3/6] security- changes for user login: changes reverted
---
.../exception/GlobalExceptionHandler.java | 11 +++++++----
.../src/main/resources/application.yaml | 19 +++++--------------
2 files changed, 12 insertions(+), 18 deletions(-)
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java
index 0c80f1a..894414e 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java
@@ -15,6 +15,12 @@
@ControllerAdvice
public class GlobalExceptionHandler {
+
+ @ExceptionHandler(Exception.class)
+ public ResponseEntity handleGlobalException(Exception ex) {
+ return buildErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR, BMSConstants.UNEXPECTED_ERROR_MESSAGE, BMSConstants.UNEXPECTED_ERROR_CODE);
+ }
+
public static ResponseEntity buildErrorResponse(HttpStatus status, String message, String code) {
ApiErrorResponse errorResponse = ApiErrorResponse.builder()
.message(message)
@@ -23,10 +29,7 @@ public static ResponseEntity buildErrorResponse(HttpStatus sta
return ResponseEntity.status(status).body(errorResponse);
}
- @ExceptionHandler(Exception.class)
- public ResponseEntity handleGlobalException(Exception ex) {
- return buildErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR, BMSConstants.UNEXPECTED_ERROR_MESSAGE, BMSConstants.UNEXPECTED_ERROR_CODE);
- }
+
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException exception) {
diff --git a/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml b/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml
index a975fcf..a30b3ae 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml
+++ b/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml
@@ -2,26 +2,17 @@ Spring:
application:
name: BMS Monolith
datasource:
- url: jdbc:postgresql://localhost:5432/bms
- username: ${DB_USERNAME:postgres}
+ url: jdbc:mysql://localhost:3306/bms
+ username: ${DB_USERNAME:root}
password: ${DB_PASSWORD:root}
- driver-class-name: org.postgresql.Driver
+ driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
properties:
hibernate:
- dialect: org.hibernate.dialect.PostgreSQLDialect
+ dialect: org.hibernate.dialect.MySQLDialect
hibernate:
ddl-auto: update
show-sql: true
server:
servlet:
- context-path: /api/v1
-app:
- jwtSecret: ramdom852
- jwtExpirationMs: 86400000
-
-logging:
- level:
- org:
- springframework:
- security: DEBUG
\ No newline at end of file
+ context-path: /api/v1
\ No newline at end of file
From 397fbe06ae12f0468c886ca3ebdb33a2bd65a23b Mon Sep 17 00:00:00 2001
From: rohitnandi12
Date: Sat, 7 Dec 2024 14:11:00 +0530
Subject: [PATCH 4/6] #11 Adds liquibase code for Role,user, etc. Fix UUID
issue. Formatting and clean code fixed."
---
.../common/entity/BaseAuditingEntity.java | 4 +-
.../bms/bms_monolith/common/entity/Event.java | 1 -
.../bms_monolith/common/entity/EventShow.java | 4 ++
.../common/entity/SeatTypeInShow.java | 4 ++
.../exception/GlobalExceptionHandler.java | 2 -
.../eventservice/dto/SeatInShowResponse.java | 4 +-
.../dto/SeatTypeInShowResponse.java | 4 +-
.../userservice/common/JwtUtils.java | 5 +-
.../userservice/common/RoleDataSeeder.java | 39 +++++++------
.../userservice/common/RoleFactory.java | 8 +--
.../userservice/model/BaseEntity.java | 48 ----------------
.../bms_monolith/userservice/model/Role.java | 18 +++---
.../bms_monolith/userservice/model/User.java | 50 +++++++++--------
.../repository/RoleRepository.java | 2 +-
.../repository/UserRepository.java | 3 +
.../service/impl/AuthServiceImpl.java | 15 ++---
.../service/impl/UserDetailsImpl.java | 6 +-
.../src/main/resources/application.yaml | 10 +++-
.../db/changelog/changelog-master.xml | 1 +
.../db/changelog/v1.0/add-auth-tables.xml | 55 +++++++++++++++++++
20 files changed, 155 insertions(+), 128 deletions(-)
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/BaseEntity.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/add-auth-tables.xml
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/BaseAuditingEntity.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/BaseAuditingEntity.java
index 83b1dd5..af1b843 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/BaseAuditingEntity.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/BaseAuditingEntity.java
@@ -31,8 +31,8 @@ public abstract class BaseAuditingEntity {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
- @Column(columnDefinition = "CHAR(36)")
- private UUID id;
+ @Column(columnDefinition = "CHAR(36)", updatable = false, nullable = false)
+ private String id;
@CreatedDate
@Column(updatable = false)
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Event.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Event.java
index 0c770c9..20bb6b3 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Event.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Event.java
@@ -8,7 +8,6 @@
import jakarta.persistence.JoinColumn;
import jakarta.persistence.FetchType;
import jakarta.persistence.Column;
-import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/EventShow.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/EventShow.java
index b7652a1..b1d2882 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/EventShow.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/EventShow.java
@@ -14,7 +14,9 @@
import jakarta.persistence.FetchType;
import jakarta.validation.constraints.NotNull;
+import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.lbcc.bms.bms_monolith.common.enums.Genre;
@@ -25,6 +27,8 @@
@Table(name = "event_shows")
@Getter
@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
public class EventShow extends BaseAuditingEntity {
@ElementCollection(targetClass = Genre.class)
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/SeatTypeInShow.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/SeatTypeInShow.java
index 581241e..f421aca 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/SeatTypeInShow.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/SeatTypeInShow.java
@@ -5,7 +5,9 @@
import jakarta.persistence.ManyToOne;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.Column;
+import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.math.BigDecimal;
@@ -14,6 +16,8 @@
@Table(name = "seat_type_in_shows")
@Getter
@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
public class SeatTypeInShow extends BaseAuditingEntity {
@ManyToOne
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java
index 894414e..f348a1e 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java
@@ -29,8 +29,6 @@ public static ResponseEntity buildErrorResponse(HttpStatus sta
return ResponseEntity.status(status).body(errorResponse);
}
-
-
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException exception) {
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/eventservice/dto/SeatInShowResponse.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/eventservice/dto/SeatInShowResponse.java
index 6184e9a..0da96b3 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/eventservice/dto/SeatInShowResponse.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/eventservice/dto/SeatInShowResponse.java
@@ -8,12 +8,12 @@
@Getter
public class SeatInShowResponse {
- private UUID seatTypeInShowId;
+ private String seatTypeInShowId;
private String bookingStatus;
// Constructors, Getters, and Setters
- public SeatInShowResponse(UUID seatTypeInShowId, String bookingStatus) {
+ public SeatInShowResponse(String seatTypeInShowId, String bookingStatus) {
this.seatTypeInShowId = seatTypeInShowId;
this.bookingStatus = bookingStatus;
}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/eventservice/dto/SeatTypeInShowResponse.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/eventservice/dto/SeatTypeInShowResponse.java
index c5601d1..c9f9eff 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/eventservice/dto/SeatTypeInShowResponse.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/eventservice/dto/SeatTypeInShowResponse.java
@@ -9,11 +9,11 @@
@Getter
public class SeatTypeInShowResponse {
- private UUID seatTypeId;
+ private String seatTypeId;
private String seatTypeName;
private BigDecimal price;
- public SeatTypeInShowResponse(UUID seatTypeId, String seatTypeName, BigDecimal price) {
+ public SeatTypeInShowResponse(String seatTypeId, String seatTypeName, BigDecimal price) {
this.seatTypeId = seatTypeId;
this.seatTypeName = seatTypeName;
this.price = price;
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/JwtUtils.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/JwtUtils.java
index 6533589..9f7e970 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/JwtUtils.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/JwtUtils.java
@@ -1,4 +1,3 @@
-
package org.lbcc.bms.bms_monolith.userservice.common;
import io.jsonwebtoken.*;
@@ -18,10 +17,10 @@
public class JwtUtils {
private static final Logger logger = LoggerFactory.getLogger(JwtUtils.class);
- @Value("${app.jwtSecret}")
+ @Value("${app.auth:jwt-secret}")
private String jwtSecret;
- @Value("${app.jwtExpirationMs}")
+ @Value("${app.auth.jwt-expiration-ms}")
private int jwtExpirationMs;
public String generateJwtToken(Authentication authentication) {
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleDataSeeder.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleDataSeeder.java
index 156e715..a9f1790 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleDataSeeder.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleDataSeeder.java
@@ -11,29 +11,32 @@
import java.time.Instant;
import java.util.Arrays;
import java.util.List;
-import java.util.Random;
+import java.util.UUID;
@Component
public class RoleDataSeeder {
- @Autowired private RoleRepository roleRepository;
+ private final RoleRepository roleRepository;
- @EventListener
- @Transactional
- public void LoadRoles(ContextRefreshedEvent event) {
+ public RoleDataSeeder(RoleRepository roleRepository) {
+ this.roleRepository = roleRepository;
+ }
+
+ @EventListener
+ @Transactional
+ public void loadRoles(ContextRefreshedEvent event) {
- List roles = Arrays.stream(RoleType.values()).toList();
+ List roles = Arrays.stream(RoleType.values()).toList();
- for (RoleType erole : roles) {
- if (roleRepository.findByName(erole) == null) {
- Role role = new Role();
- role.setName(erole);
- role.setDescription(erole.name());
- role.setCreatedBy("system");
- role.setCreatedDate(Instant.now());
- role.setLastModifiedDate(Instant.now());
- role.setLastModifiedBy("system");
- roleRepository.save(role);
- }
+ for (RoleType roleType : roles) {
+ if (roleRepository.findByLabel(roleType) == null) {
+ Role role = new Role();
+ role.setId(UUID.randomUUID().toString());
+ role.setLabel(roleType);
+ role.setDescription(roleType.name());
+ role.setCreatedBy("system");
+ role.setCreatedDate(Instant.now());
+ roleRepository.save(role);
+ }
+ }
}
- }
}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleFactory.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleFactory.java
index 25140fd..072430e 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleFactory.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleFactory.java
@@ -14,16 +14,16 @@ public class RoleFactory {
public Role getInstance(String role) throws RoleNotFoundException {
switch (role) {
case "admin" -> {
- return roleRepository.findByName(RoleType.ADMIN);
+ return roleRepository.findByLabel(RoleType.ADMIN);
}
case "user" -> {
- return roleRepository.findByName(RoleType.USER);
+ return roleRepository.findByLabel(RoleType.USER);
}
case "vendor" -> {
- return roleRepository.findByName(RoleType.VENDOR);
+ return roleRepository.findByLabel(RoleType.VENDOR);
}
case "guest" -> {
- return roleRepository.findByName(RoleType.GUEST);
+ return roleRepository.findByLabel(RoleType.GUEST);
}
default -> throw new RoleNotFoundException("No role found for " + role);
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/BaseEntity.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/BaseEntity.java
deleted file mode 100644
index 2287e9f..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/BaseEntity.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.lbcc.bms.bms_monolith.userservice.model;
-
-import jakarta.persistence.Column;
-import jakarta.persistence.EntityListeners;
-import jakarta.persistence.GeneratedValue;
-import jakarta.persistence.GenerationType;
-import jakarta.persistence.Id;
-import jakarta.persistence.MappedSuperclass;
-import java.time.Instant;
-import java.util.UUID;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import lombok.experimental.SuperBuilder;
-import org.springframework.data.annotation.CreatedBy;
-import org.springframework.data.annotation.CreatedDate;
-import org.springframework.data.annotation.LastModifiedBy;
-import org.springframework.data.annotation.LastModifiedDate;
-import org.springframework.data.jpa.domain.support.AuditingEntityListener;
-
-@AllArgsConstructor
-@Getter
-@MappedSuperclass
-@NoArgsConstructor
-@Setter
-@SuperBuilder
-@EntityListeners(AuditingEntityListener.class)
-public abstract class BaseEntity {
-
-
-
- @CreatedDate
- @Column(updatable = false)
- private Instant createdDate;
-
- @LastModifiedDate
- @Column(insertable = false)
- private Instant lastModifiedDate;
-
- @CreatedBy
- @Column(updatable = false, length = 10)
- private String createdBy;
-
- @LastModifiedBy
- @Column(insertable = false, length = 10)
- private String lastModifiedBy;
-}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/Role.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/Role.java
index ae3e77e..5dbaadd 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/Role.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/Role.java
@@ -3,21 +3,23 @@
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
+import org.lbcc.bms.bms_monolith.common.entity.BaseAuditingEntity;
import org.lbcc.bms.bms_monolith.userservice.common.RoleType;
+@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "roles")
-public class Role extends BaseEntity {
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- @Column(name = "role_id")
- private Long roleId;
- @Enumerated(EnumType.STRING)
- private RoleType name;
+public class Role extends BaseAuditingEntity {
- @Column private String description;
+ @Enumerated(EnumType.STRING)
+ @Column(nullable = false)
+ private RoleType label;
+
+ @Column(nullable = false, length = 50)
+ private String description;
}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/User.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/User.java
index 81910d7..2ab5a5b 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/User.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/User.java
@@ -1,38 +1,40 @@
package org.lbcc.bms.bms_monolith.userservice.model;
import jakarta.persistence.*;
-import lombok.*;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.lbcc.bms.bms_monolith.common.entity.BaseAuditingEntity;
-import java.util.ArrayList;
import java.util.HashSet;
-import java.util.List;
import java.util.Set;
-@Data
@AllArgsConstructor
-@NoArgsConstructor
-@Builder
+@SuperBuilder
+@Data
@Entity
-@Table(name="users")
-public class User extends BaseEntity {
-
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Table(name = "users")
+public class User extends BaseAuditingEntity {
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- @Column(name = "user_id")
- private Long id;
- private String username;
- private String email;
- private String phone;
- private String password;
- private boolean enabled = true;
+ private String username;
+ private String email;
+ @Column(columnDefinition = "CHAR(10)")
+ private String phone;
+ private String password;
+ @Builder.Default
+ @Column(columnDefinition = "TINYINT(1)")
+ private Boolean isActive = true;
- @ManyToMany(fetch = FetchType.EAGER)
- @JoinTable(
- name = "user_roles",
- joinColumns = {@JoinColumn(name = "user_id")},
- inverseJoinColumns = {@JoinColumn(name = "role_id")})
- private Set roles = new HashSet<>();
+ @ManyToMany(fetch = FetchType.EAGER)
+ @JoinTable(
+ name = "user_roles",
+ joinColumns = {@JoinColumn(name = "user_id")},
+ inverseJoinColumns = {@JoinColumn(name = "role_id")})
+ @Builder.Default
+ private Set roles = new HashSet<>();
}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/RoleRepository.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/RoleRepository.java
index b1d5096..6c8ca49 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/RoleRepository.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/RoleRepository.java
@@ -7,5 +7,5 @@
@Repository
public interface RoleRepository extends JpaRepository {
- Role findByName(RoleType name);
+ Role findByLabel(RoleType label);
}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/UserRepository.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/UserRepository.java
index 081ff0f..40033b8 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/UserRepository.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/UserRepository.java
@@ -5,9 +5,12 @@
import org.springframework.stereotype.Repository;
import java.util.Optional;
+
@Repository
public interface UserRepository extends JpaRepository {
Optional findByEmail(String email);
+
Boolean existsByUsername(String username);
+
Boolean existsByEmail(String email);
}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java
index df78109..a284de5 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java
@@ -22,17 +22,20 @@
@Component
public class AuthServiceImpl implements AuthService {
- @Autowired
- private UserService userService;
+ private final UserService userService;
- private PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+ private PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
@Autowired
private RoleFactory roleFactory;
+ public AuthServiceImpl(UserService userService) {
+ this.userService = userService;
+ }
+
@Override
public ResponseEntity signUpUser(SignUpRequestDto signUpRequestDto)
- throws UserAlreadyExistsException , RoleNotFoundException {
+ throws UserAlreadyExistsException, RoleNotFoundException {
if (userService.existsByEmail(signUpRequestDto.getEmail())) {
throw new UserAlreadyExistsException("Registration Failed: Provided email already exists. Try sign in or provide another email.");
}
@@ -44,7 +47,6 @@ public ResponseEntity signUpUser(SignUpRequestDto signUpRequestDto)
userService.save(user);
return ResponseEntity.status(HttpStatus.CREATED).body(
ApiResponse.builder()
- // .isSuccess(true)
.message("User account has been successfully created!")
.build()
);
@@ -55,13 +57,12 @@ private User createUser(SignUpRequestDto signUpRequestDto) throws RoleNotFoundEx
.email(signUpRequestDto.getEmail())
.username(signUpRequestDto.getUserName())
.password(signUpRequestDto.getPassword())
- .enabled(true)
.roles(determineRoles(signUpRequestDto.getRoles()))
.build();
}
private Set determineRoles(Set strRoles) throws RoleNotFoundException {
- Set roles = new HashSet<>();
+ Set roles = new HashSet<>();
if (strRoles == null) {
roles.add(roleFactory.getInstance("user"));
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsImpl.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsImpl.java
index a6f1c4c..7a07f3f 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsImpl.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsImpl.java
@@ -19,7 +19,7 @@
@Data
public class UserDetailsImpl implements UserDetails {
@Serial private static final long serialVersionUID = 1L;
- private Long id;
+ private String id;
private String username;
private String email;
@JsonIgnore private String password;
@@ -29,7 +29,7 @@ public class UserDetailsImpl implements UserDetails {
public static UserDetailsImpl build(User user) {
List authorities =
user.getRoles().stream()
- .map(role -> new SimpleGrantedAuthority(role.getName().name()))
+ .map(role -> new SimpleGrantedAuthority(role.getLabel().name()))
.collect(Collectors.toList());
return new UserDetailsImpl(
@@ -38,7 +38,7 @@ public static UserDetailsImpl build(User user) {
user.getEmail(),
user.getPassword(),
authorities,
- user.isEnabled());
+ user.getIsActive());
}
@Override
diff --git a/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml b/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml
index c63a05b..8f56af0 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml
+++ b/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml
@@ -1,4 +1,4 @@
-Spring:
+spring:
application:
name: BMS Monolith
datasource:
@@ -9,7 +9,7 @@ Spring:
jpa:
properties:
hibernate:
- dialect: org.hibernate.dialect.MySQLDialect
+ dialect: org.hibernate.dialect.MySQL8Dialect
hibernate:
ddl-auto: validate
show-sql: true
@@ -18,4 +18,8 @@ Spring:
enabled: true
server:
servlet:
- context-path: /api/v1
\ No newline at end of file
+ context-path: /api/v1
+app:
+ auth:
+ jwt-secret: ${JWT_SECRET:some_secret}
+ jwt-expiration-ms: ${JWT_EXPIRATION_MS:50000}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/changelog-master.xml b/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/changelog-master.xml
index 0bbd586..ba0c725 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/changelog-master.xml
+++ b/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/changelog-master.xml
@@ -7,4 +7,5 @@
+
diff --git a/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/add-auth-tables.xml b/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/add-auth-tables.xml
new file mode 100644
index 0000000..9d0af54
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/add-auth-tables.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
From 407f4da93353465dab610ed888fd698a58f9a77f Mon Sep 17 00:00:00 2001
From: rohitnandi12
Date: Sat, 7 Dec 2024 15:09:11 +0530
Subject: [PATCH 5/6] #11 Working registration flow.
---
.../org/lbcc/bms/bms_monolith/security/WebSecurityConfig.java | 2 +-
.../bms_monolith/userservice/service/impl/AuthServiceImpl.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/WebSecurityConfig.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/WebSecurityConfig.java
index c0071cd..3568aad 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/WebSecurityConfig.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/WebSecurityConfig.java
@@ -27,7 +27,7 @@
@EnableMethodSecurity
public class WebSecurityConfig{
- List publicApis = List.of( "/api/auth/**");
+ List publicApis = List.of( "/auth/**");
private final AuthEntryPointJwt unauthorizedHandler = new AuthEntryPointJwt();
UserDetailsServiceImpl userDetailsService = new UserDetailsServiceImpl();
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java
index a284de5..747f69e 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java
@@ -68,7 +68,7 @@ private Set determineRoles(Set strRoles) throws RoleNotFoundExcept
roles.add(roleFactory.getInstance("user"));
} else {
for (String role : strRoles) {
- roles.add(roleFactory.getInstance(role));
+ roles.add(roleFactory.getInstance(role.toLowerCase()));
}
}
return roles;
From 2806b49bb16c5c2e353a5172365df26792fbf706 Mon Sep 17 00:00:00 2001
From: rohitnandi12
Date: Sat, 7 Dec 2024 19:10:39 +0530
Subject: [PATCH 6/6] #11 Working username password authentication and
authorization.
---
.../constants/BMSErrorMessageConstants.java | 10 ++
.../constants/BMSSuccessMessageConstants.java | 8 ++
.../entity/RegisteredUser.java} | 16 ++-
.../model => common/entity}/Role.java | 5 +-
.../common => common/enums}/RoleType.java | 3 +-
.../exception/GlobalExceptionHandler.java | 4 +-
.../security/AuthTokenFilter.java | 67 ----------
.../security/WebSecurityConfig.java | 88 -------------
.../bootstrap}/RoleDataSeeder.java | 8 +-
.../config}/AuthEntryPointJwt.java | 5 +-
.../config/JwtAuthenticationFilter.java | 85 +++++++++++++
.../config/SecurityConfiguration.java | 108 ++++++++++++++++
.../controller/LoginController.java | 36 ++++++
.../controller/RegisterController.java | 37 ++++++
.../uesrnamepassword/dto/LogInRequest.java | 8 ++
.../uesrnamepassword/dto/LogInResponse.java | 7 ++
.../uesrnamepassword/dto/SignUpRequest.java} | 11 +-
.../uesrnamepassword/dto/SignUpResponse.java | 6 +
.../exeception/RoleNotFoundException.java | 7 ++
.../UserAlreadyExistsException.java | 7 ++
.../model/UserDetailsModel.java | 60 +++++++++
.../repository/RegisteredUserRepository.java | 17 +++
.../repository/RoleRepository.java | 6 +-
.../service/DaoUserDetailsService.java | 30 +++++
.../uesrnamepassword/service/JwtService.java | 117 ++++++++++++++++++
.../service/LoginService.java | 49 ++++++++
.../service/RegisterService.java | 66 ++++++++++
.../service/RegisteredUserService.java | 27 ++++
.../service/RoleFactoryService.java | 27 ++++
.../userservice/common/JwtUtils.java | 68 ----------
.../userservice/common/RoleFactory.java | 33 -----
.../controller/AuthController.java | 31 -----
.../controller/UserController.java | 18 ---
.../exeception/RoleNotFoundException.java | 7 --
.../UserAlreadyExistsException.java | 7 --
.../exeception/UsernameNotFoundException.java | 7 --
.../repository/UserRepository.java | 16 ---
.../userservice/service/AuthService.java | 14 ---
.../userservice/service/UserService.java | 11 --
.../service/impl/AuthServiceImpl.java | 76 ------------
.../service/impl/UserDetailsImpl.java | 67 ----------
.../service/impl/UserDetailsServiceImpl.java | 27 ----
.../service/impl/UserServiceImpl.java | 34 -----
.../src/main/resources/application.yaml | 5 +-
.../db/changelog/v1.0/add-auth-tables.xml | 4 +-
45 files changed, 748 insertions(+), 602 deletions(-)
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/constants/BMSErrorMessageConstants.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/constants/BMSSuccessMessageConstants.java
rename book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/{userservice/model/User.java => common/entity/RegisteredUser.java} (76%)
rename book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/{userservice/model => common/entity}/Role.java (72%)
rename book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/{userservice/common => common/enums}/RoleType.java (56%)
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/AuthTokenFilter.java
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/WebSecurityConfig.java
rename book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/{userservice/common => security/uesrnamepassword/bootstrap}/RoleDataSeeder.java (81%)
rename book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/{ => uesrnamepassword/config}/AuthEntryPointJwt.java (91%)
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/config/JwtAuthenticationFilter.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/config/SecurityConfiguration.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/controller/LoginController.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/controller/RegisterController.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/dto/LogInRequest.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/dto/LogInResponse.java
rename book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/{userservice/common/SignUpRequestDto.java => security/uesrnamepassword/dto/SignUpRequest.java} (69%)
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/dto/SignUpResponse.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/exeception/RoleNotFoundException.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/exeception/UserAlreadyExistsException.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/model/UserDetailsModel.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/repository/RegisteredUserRepository.java
rename book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/{userservice => security/uesrnamepassword}/repository/RoleRepository.java (56%)
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/DaoUserDetailsService.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/JwtService.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/LoginService.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/RegisterService.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/RegisteredUserService.java
create mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/RoleFactoryService.java
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/JwtUtils.java
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleFactory.java
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/AuthController.java
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/UserController.java
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/RoleNotFoundException.java
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UserAlreadyExistsException.java
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UsernameNotFoundException.java
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/UserRepository.java
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/AuthService.java
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/UserService.java
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsImpl.java
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsServiceImpl.java
delete mode 100644 book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserServiceImpl.java
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/constants/BMSErrorMessageConstants.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/constants/BMSErrorMessageConstants.java
new file mode 100644
index 0000000..fa5912d
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/constants/BMSErrorMessageConstants.java
@@ -0,0 +1,10 @@
+package org.lbcc.bms.bms_monolith.common.constants;
+
+public final class BMSErrorMessageConstants {
+ private BMSErrorMessageConstants() {
+ }
+
+ public static final String UNEXPECTED_ERROR_MESSAGE = "An unexpected error occurred";
+ public static final String UNEXPECTED_ERROR_CODE = "UNEXPECTED_ERROR";
+ public static final String EVENT_SERVICE_ERROR = "EVENT_SERVICE_ERROR";
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/constants/BMSSuccessMessageConstants.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/constants/BMSSuccessMessageConstants.java
new file mode 100644
index 0000000..cfd9fc1
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/constants/BMSSuccessMessageConstants.java
@@ -0,0 +1,8 @@
+package org.lbcc.bms.bms_monolith.common.constants;
+
+public final class BMSSuccessMessageConstants {
+ private BMSSuccessMessageConstants() {
+ }
+
+ public static final String EVENT_SUCCESS_MESSAGE = "Events fetched successfully";
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/User.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/RegisteredUser.java
similarity index 76%
rename from book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/User.java
rename to book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/RegisteredUser.java
index 2ab5a5b..2f16836 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/User.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/RegisteredUser.java
@@ -1,5 +1,6 @@
-package org.lbcc.bms.bms_monolith.userservice.model;
+package org.lbcc.bms.bms_monolith.common.entity;
+import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -7,7 +8,6 @@
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
-import org.lbcc.bms.bms_monolith.common.entity.BaseAuditingEntity;
import java.util.HashSet;
import java.util.Set;
@@ -18,14 +18,22 @@
@Entity
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
-@Table(name = "users")
-public class User extends BaseAuditingEntity {
+@Table(name = "registered_users")
+public class RegisteredUser extends BaseAuditingEntity {
+ @Column(length = 20)
private String username;
+
+ @Column(length = 25)
private String email;
+
@Column(columnDefinition = "CHAR(10)")
private String phone;
+
+ @Column(length = 20)
+ @JsonIgnore
private String password;
+
@Builder.Default
@Column(columnDefinition = "TINYINT(1)")
private Boolean isActive = true;
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/Role.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Role.java
similarity index 72%
rename from book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/Role.java
rename to book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Role.java
index 5dbaadd..ba74d26 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/model/Role.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/entity/Role.java
@@ -1,12 +1,11 @@
-package org.lbcc.bms.bms_monolith.userservice.model;
+package org.lbcc.bms.bms_monolith.common.entity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
-import org.lbcc.bms.bms_monolith.common.entity.BaseAuditingEntity;
-import org.lbcc.bms.bms_monolith.userservice.common.RoleType;
+import org.lbcc.bms.bms_monolith.common.enums.RoleType;
@EqualsAndHashCode(callSuper = true)
@Data
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleType.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/enums/RoleType.java
similarity index 56%
rename from book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleType.java
rename to book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/enums/RoleType.java
index e893a2b..0d64ed4 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleType.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/enums/RoleType.java
@@ -1,9 +1,8 @@
-package org.lbcc.bms.bms_monolith.userservice.common;
+package org.lbcc.bms.bms_monolith.common.enums;
public enum RoleType {
GUEST,
VENDOR,
ADMIN,
USER,
-
}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java
index f348a1e..7080791 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/common/exception/GlobalExceptionHandler.java
@@ -2,8 +2,8 @@
import org.lbcc.bms.bms_monolith.common.constants.BMSConstants;
import org.lbcc.bms.bms_monolith.common.response.ApiErrorResponse;
-import org.lbcc.bms.bms_monolith.userservice.exeception.RoleNotFoundException;
-import org.lbcc.bms.bms_monolith.userservice.exeception.UserAlreadyExistsException;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.exeception.RoleNotFoundException;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.exeception.UserAlreadyExistsException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/AuthTokenFilter.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/AuthTokenFilter.java
deleted file mode 100644
index 7d2667e..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/AuthTokenFilter.java
+++ /dev/null
@@ -1,67 +0,0 @@
-
-package org.lbcc.bms.bms_monolith.security;
-
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import org.lbcc.bms.bms_monolith.userservice.common.JwtUtils;
-import org.lbcc.bms.bms_monolith.userservice.service.impl.UserDetailsServiceImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-import org.springframework.web.filter.OncePerRequestFilter;
-
-import java.io.IOException;
-
-
-public class AuthTokenFilter extends OncePerRequestFilter {
- @Autowired
- private JwtUtils jwtUtils;
-
- @Autowired
- private UserDetailsServiceImpl userDetailsService;
-
- private static final Logger logger = LoggerFactory.getLogger(AuthTokenFilter.class);
-
- @Override
- protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
- throws ServletException, IOException {
- try {
- String jwt = parseJwt(request);
- if (jwt != null && jwtUtils.validateJwtToken(jwt)) {
- String username = jwtUtils.getUserNameFromJwtToken(jwt);
-
- UserDetails userDetails = userDetailsService.loadUserByUsername(username);
- UsernamePasswordAuthenticationToken authentication =
- new UsernamePasswordAuthenticationToken(
- userDetails,
- null,
- userDetails.getAuthorities());
- authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
-
- SecurityContextHolder.getContext().setAuthentication(authentication);
- }
- } catch (Exception e) {
- logger.error("Cannot set user authentication: {}", e);
- }
-
- filterChain.doFilter(request, response);
- }
-
- private String parseJwt(HttpServletRequest request) {
- String headerAuth = request.getHeader("Authorization");
-
- if (StringUtils.hasText(headerAuth) && headerAuth.startsWith("Bearer ")) {
- return headerAuth.substring(7);
- }
-
- return null;
- }
-}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/WebSecurityConfig.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/WebSecurityConfig.java
deleted file mode 100644
index 3568aad..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/WebSecurityConfig.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.lbcc.bms.bms_monolith.security;
-
-
-import org.lbcc.bms.bms_monolith.userservice.service.impl.UserDetailsServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
-import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
-import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
-import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
-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;
-import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
-import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
-import org.springframework.security.web.util.matcher.RequestMatcher;
-
-import java.util.List;
-
-
-@Configuration
-@EnableMethodSecurity
-public class WebSecurityConfig{
-
- List publicApis = List.of( "/auth/**");
-
- private final AuthEntryPointJwt unauthorizedHandler = new AuthEntryPointJwt();
- UserDetailsServiceImpl userDetailsService = new UserDetailsServiceImpl();
-
- @Bean
- public AuthTokenFilter authenticationJwtTokenFilter() {
- return new AuthTokenFilter();
- }
-
- @Bean
- public DaoAuthenticationProvider authenticationProvider() {
-
-
- DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
-
- authProvider.setUserDetailsService(userDetailsService);
- authProvider.setPasswordEncoder(passwordEncoder());
-
- return authProvider;
- }
-
- @Bean
- public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig)
- throws Exception {
- return authConfig.getAuthenticationManager();
- }
-
- @Bean
- public PasswordEncoder passwordEncoder() {
- return new BCryptPasswordEncoder();
- }
-
- @Bean
- public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
-
- http.csrf(AbstractHttpConfigurer::disable)
-
- .exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler))
- .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
-
- .authorizeHttpRequests(auth ->
- auth.requestMatchers(publicApis.stream()
- .map(AntPathRequestMatcher::new)
- .toArray(RequestMatcher[]::new)).permitAll()
- .anyRequest().authenticated()
- );
-
- http.authenticationProvider(authenticationProvider());
-
- http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
-
- return http.build();
- }
- @Bean
- public WebSecurityCustomizer webSecurityCustomizer() {
- return (web) -> web.ignoring().requestMatchers(publicApis.toArray(String[]::new));
- }
-}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleDataSeeder.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/bootstrap/RoleDataSeeder.java
similarity index 81%
rename from book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleDataSeeder.java
rename to book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/bootstrap/RoleDataSeeder.java
index a9f1790..4c40e64 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleDataSeeder.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/bootstrap/RoleDataSeeder.java
@@ -1,9 +1,9 @@
-package org.lbcc.bms.bms_monolith.userservice.common;
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.bootstrap;
import jakarta.transaction.Transactional;
-import org.lbcc.bms.bms_monolith.userservice.model.Role;
-import org.lbcc.bms.bms_monolith.userservice.repository.RoleRepository;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.lbcc.bms.bms_monolith.common.entity.Role;
+import org.lbcc.bms.bms_monolith.common.enums.RoleType;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.repository.RoleRepository;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/AuthEntryPointJwt.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/config/AuthEntryPointJwt.java
similarity index 91%
rename from book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/AuthEntryPointJwt.java
rename to book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/config/AuthEntryPointJwt.java
index d58801a..de9cd33 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/AuthEntryPointJwt.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/config/AuthEntryPointJwt.java
@@ -1,5 +1,4 @@
-
-package org.lbcc.bms.bms_monolith.security;
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
@@ -28,7 +27,7 @@ public void commence(HttpServletRequest request, HttpServletResponse response, A
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
- final Map body = new HashMap<>();
+ final Map body = new HashMap<>();
body.put("status", HttpServletResponse.SC_UNAUTHORIZED);
body.put("error", "Unauthorized");
body.put("message", authException.getMessage());
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/config/JwtAuthenticationFilter.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/config/JwtAuthenticationFilter.java
new file mode 100644
index 0000000..3456582
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/config/JwtAuthenticationFilter.java
@@ -0,0 +1,85 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.config;
+
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.service.JwtService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.lang.NonNull;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.filter.OncePerRequestFilter;
+import org.springframework.web.servlet.HandlerExceptionResolver;
+
+import java.util.Optional;
+
+
+@Component
+public class JwtAuthenticationFilter extends OncePerRequestFilter {
+
+ private static final Logger logger = LoggerFactory.getLogger(JwtAuthenticationFilter.class);
+
+ private final JwtService jwtService;
+ private final UserDetailsService userDetailsService;
+ private final HandlerExceptionResolver handlerExceptionResolver;
+
+ public JwtAuthenticationFilter(
+ JwtService jwtService, UserDetailsService userDetailsService,
+ HandlerExceptionResolver handlerExceptionResolver
+ ) {
+ this.jwtService = jwtService;
+ this.userDetailsService = userDetailsService;
+ this.handlerExceptionResolver = handlerExceptionResolver;
+ }
+
+ @Override
+ protected void doFilterInternal(
+ @NonNull HttpServletRequest request,
+ @NonNull HttpServletResponse response,
+ @NonNull FilterChain filterChain
+ ) {
+ try {
+
+ final Optional jwt = parseJwt(request);
+ if (jwt.isEmpty() || !jwtService.validateJwtToken(jwt.get())) {
+ filterChain.doFilter(request, response);
+ return;
+ }
+
+ String username = jwtService.extractUsername(jwt.get());
+ Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+
+ if (username != null && authentication == null) {
+ UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
+
+ if (jwtService.isTokenValid(jwt.get(), userDetails)) {
+ UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
+
+ authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
+ SecurityContextHolder.getContext().setAuthentication(authToken);
+ }
+ }
+
+ filterChain.doFilter(request, response);
+ } catch (Exception exception) {
+ handlerExceptionResolver.resolveException(request, response, null, exception);
+ }
+
+ }
+
+ private Optional parseJwt(HttpServletRequest request) {
+ String headerAuth = request.getHeader("Authorization");
+
+ if (StringUtils.hasText(headerAuth) && headerAuth.startsWith("Bearer ")) {
+ return Optional.of(headerAuth.substring(7));
+ }
+ return Optional.empty();
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/config/SecurityConfiguration.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/config/SecurityConfiguration.java
new file mode 100644
index 0000000..6e34334
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/config/SecurityConfiguration.java
@@ -0,0 +1,108 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
+import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
+import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+import org.springframework.security.web.util.matcher.RequestMatcher;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.CorsConfigurationSource;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+
+import java.util.List;
+
+@Configuration(proxyBeanMethods = false)
+@EnableWebSecurity
+@EnableMethodSecurity
+public class SecurityConfiguration {
+
+ private final UserDetailsService userDetailsService;
+ private final AuthEntryPointJwt unauthorizedHandler;
+ private final JwtAuthenticationFilter jwtAuthenticationFilter;
+ //TODO: Load this from application properties
+ List publicApis = List.of("/auth/**");
+
+ public SecurityConfiguration(
+ UserDetailsService userDetailsService, AuthEntryPointJwt unauthorizedHandler,
+ JwtAuthenticationFilter jwtAuthenticationFilter
+ ) {
+ this.userDetailsService = userDetailsService;
+ this.unauthorizedHandler = unauthorizedHandler;
+ this.jwtAuthenticationFilter = jwtAuthenticationFilter;
+ }
+
+ @Bean
+ public BCryptPasswordEncoder passwordEncoder() {
+ return new BCryptPasswordEncoder();
+ }
+
+ @Bean
+ public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
+ return config.getAuthenticationManager();
+ }
+
+ @Bean
+ public AuthenticationProvider authenticationProvider() {
+ DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
+
+ daoAuthenticationProvider.setUserDetailsService(userDetailsService);
+ daoAuthenticationProvider.setPasswordEncoder(passwordEncoder());
+
+ return daoAuthenticationProvider;
+ }
+
+ @Bean
+ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+
+ http.csrf(AbstractHttpConfigurer::disable)
+ .authorizeHttpRequests(authorize -> authorize
+ .requestMatchers(
+ publicApis.stream()
+ .map(AntPathRequestMatcher::new)
+ .toArray(RequestMatcher[]::new)
+ )
+ .permitAll()
+ .anyRequest()
+ .authenticated()
+ )
+ .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
+ .exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler))
+ .authenticationProvider(authenticationProvider())
+ .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
+
+ return http.build();
+ }
+
+ @Bean
+ CorsConfigurationSource corsConfigurationSource() {
+ CorsConfiguration configuration = new CorsConfiguration();
+
+ configuration.setAllowedOrigins(List.of("http://localhost:8005"));
+ configuration.setAllowedMethods(List.of("GET", "POST"));
+ configuration.setAllowedHeaders(List.of("Authorization", "Content-Type"));
+
+ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+
+ source.registerCorsConfiguration("/**", configuration);
+
+ return source;
+ }
+
+ @Bean
+ public WebSecurityCustomizer webSecurityCustomizer() {
+ return (web) -> web.ignoring().requestMatchers(publicApis.toArray(String[]::new));
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/controller/LoginController.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/controller/LoginController.java
new file mode 100644
index 0000000..da01e2c
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/controller/LoginController.java
@@ -0,0 +1,36 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.controller;
+
+import jakarta.validation.Valid;
+import org.lbcc.bms.bms_monolith.common.response.ApiResponse;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.dto.LogInRequest;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.dto.LogInResponse;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.service.LoginService;
+import org.springframework.http.ResponseEntity;
+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("/auth/login")
+public class LoginController {
+
+ private final LoginService loginService;
+
+ public LoginController(LoginService loginService) {
+ this.loginService = loginService;
+ }
+
+ @PostMapping
+ public ResponseEntity> login(
+ @RequestBody @Valid LogInRequest logInRequest
+ ) {
+ LogInResponse loginResponse = loginService.login(logInRequest);
+ ApiResponse response = ApiResponse.builder()
+ .success(true)
+ .message("Login successful!!")
+ .data(loginResponse)
+ .build();
+ return ResponseEntity.ok(response);
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/controller/RegisterController.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/controller/RegisterController.java
new file mode 100644
index 0000000..0a23476
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/controller/RegisterController.java
@@ -0,0 +1,37 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.controller;
+
+import jakarta.validation.Valid;
+import org.lbcc.bms.bms_monolith.common.response.ApiResponse;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.dto.SignUpRequest;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.dto.SignUpResponse;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.service.RegisterService;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+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("/auth/register")
+public class RegisterController {
+
+ private final RegisterService registerService;
+
+ public RegisterController(RegisterService registerService) {
+ this.registerService = registerService;
+ }
+
+ @PostMapping
+ public ResponseEntity> registerUser(
+ @RequestBody @Valid SignUpRequest signUpRequest
+ ) {
+ SignUpResponse signUpUser = registerService.signUpUser(signUpRequest);
+ ApiResponse response = ApiResponse.builder()
+ .success(true)
+ .message("User registered successfully!!")
+ .data(signUpUser)
+ .build();
+ return ResponseEntity.status(HttpStatus.CREATED).body(response);
+ }
+}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/dto/LogInRequest.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/dto/LogInRequest.java
new file mode 100644
index 0000000..d3de372
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/dto/LogInRequest.java
@@ -0,0 +1,8 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.dto;
+
+public record LogInRequest(
+ //TODO: Add validation
+ String username,
+ String password
+) {
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/dto/LogInResponse.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/dto/LogInResponse.java
new file mode 100644
index 0000000..b37c199
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/dto/LogInResponse.java
@@ -0,0 +1,7 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.dto;
+
+public record LogInResponse(
+ String token,
+ long expiresIn
+) {
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/SignUpRequestDto.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/dto/SignUpRequest.java
similarity index 69%
rename from book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/SignUpRequestDto.java
rename to book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/dto/SignUpRequest.java
index 4080f22..357297c 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/SignUpRequestDto.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/dto/SignUpRequest.java
@@ -1,4 +1,4 @@
-package org.lbcc.bms.bms_monolith.userservice.common;
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.dto;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
@@ -6,18 +6,17 @@
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
import java.util.Set;
@Data
@AllArgsConstructor
@NoArgsConstructor
-public class SignUpRequestDto {
+public class SignUpRequest {
@NotBlank(message = "Username is required!")
- @Size(min= 3, message = "Username must have atleast 3 characters!")
- @Size(max= 20, message = "Username can have have atmost 20 characters!")
- private String userName;
+ @Size(min = 3, message = "Username must have atleast 3 characters!")
+ @Size(max = 20, message = "Username can have have atmost 20 characters!")
+ private String username;
@Email(message = "Email is not in valid format!")
@NotBlank(message = "Email is required!")
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/dto/SignUpResponse.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/dto/SignUpResponse.java
new file mode 100644
index 0000000..d49a60d
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/dto/SignUpResponse.java
@@ -0,0 +1,6 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.dto;
+
+public record SignUpResponse(
+ String username
+) {
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/exeception/RoleNotFoundException.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/exeception/RoleNotFoundException.java
new file mode 100644
index 0000000..365350e
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/exeception/RoleNotFoundException.java
@@ -0,0 +1,7 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.exeception;
+
+public class RoleNotFoundException extends RuntimeException {
+ public RoleNotFoundException(String message) {
+ super(message);
+ }
+}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/exeception/UserAlreadyExistsException.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/exeception/UserAlreadyExistsException.java
new file mode 100644
index 0000000..7be1bd9
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/exeception/UserAlreadyExistsException.java
@@ -0,0 +1,7 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.exeception;
+
+public class UserAlreadyExistsException extends RuntimeException {
+ public UserAlreadyExistsException(String message) {
+ super(message);
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/model/UserDetailsModel.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/model/UserDetailsModel.java
new file mode 100644
index 0000000..632d263
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/model/UserDetailsModel.java
@@ -0,0 +1,60 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.lbcc.bms.bms_monolith.common.entity.RegisteredUser;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.io.Serial;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+@AllArgsConstructor
+@Data
+public class UserDetailsModel implements UserDetails {
+
+ @Serial
+ private static final long serialVersionUID = -4335856020700036116L;
+ private RegisteredUser registeredUser;
+
+ @Override
+ public Collection extends GrantedAuthority> getAuthorities() {
+
+ return registeredUser.getRoles().stream()
+ .map(role -> new SimpleGrantedAuthority(role.getLabel().name()))
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public String getPassword() {
+ return registeredUser.getPassword();
+ }
+
+ @Override
+ public String getUsername() {
+ return registeredUser.getUsername();
+ }
+
+ @Override
+ public boolean isAccountNonExpired() {
+ return true;
+ }
+
+ @Override
+ public boolean isAccountNonLocked() {
+ return true;
+ }
+
+ @Override
+ public boolean isCredentialsNonExpired() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return registeredUser.getIsActive();
+ }
+}
+
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/repository/RegisteredUserRepository.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/repository/RegisteredUserRepository.java
new file mode 100644
index 0000000..405421e
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/repository/RegisteredUserRepository.java
@@ -0,0 +1,17 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.repository;
+
+import org.lbcc.bms.bms_monolith.common.entity.RegisteredUser;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface RegisteredUserRepository extends JpaRepository {
+
+ Optional findByUsername(String email);
+
+ Boolean existsByUsername(String username);
+
+ Boolean existsByEmail(String email);
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/RoleRepository.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/repository/RoleRepository.java
similarity index 56%
rename from book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/RoleRepository.java
rename to book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/repository/RoleRepository.java
index 6c8ca49..76090fa 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/RoleRepository.java
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/repository/RoleRepository.java
@@ -1,7 +1,7 @@
-package org.lbcc.bms.bms_monolith.userservice.repository;
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.repository;
-import org.lbcc.bms.bms_monolith.userservice.common.RoleType;
-import org.lbcc.bms.bms_monolith.userservice.model.Role;
+import org.lbcc.bms.bms_monolith.common.entity.Role;
+import org.lbcc.bms.bms_monolith.common.enums.RoleType;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/DaoUserDetailsService.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/DaoUserDetailsService.java
new file mode 100644
index 0000000..fc990b9
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/DaoUserDetailsService.java
@@ -0,0 +1,30 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.service;
+
+import org.lbcc.bms.bms_monolith.common.entity.RegisteredUser;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.model.UserDetailsModel;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.repository.RegisteredUserRepository;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DaoUserDetailsService implements UserDetailsService {
+
+ private final RegisteredUserRepository registeredUserRepository;
+
+ public DaoUserDetailsService(RegisteredUserRepository registeredUserRepository) {
+ this.registeredUserRepository = registeredUserRepository;
+ }
+
+ @Override
+ public UserDetails loadUserByUsername(String username) {
+ RegisteredUser registeredUser =
+ registeredUserRepository
+ .findByUsername(username)
+ .orElseThrow(
+ () -> new UsernameNotFoundException("User Not Found with username: " + username));
+
+ return new UserDetailsModel(registeredUser);
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/JwtService.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/JwtService.java
new file mode 100644
index 0000000..cdaf6b2
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/JwtService.java
@@ -0,0 +1,117 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.service;
+
+import io.jsonwebtoken.*;
+import io.jsonwebtoken.io.Decoders;
+import io.jsonwebtoken.security.Keys;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Service;
+
+import java.security.Key;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Function;
+
+@Service
+public class JwtService {
+ private static final Logger logger = LoggerFactory.getLogger(JwtService.class);
+
+ private final String secretKey;
+ private final int expirationInMs;
+
+ public JwtService(
+ @Value("${app.auth.jwt.secret-key}") String secretKey,
+ @Value("${app.auth.jwt.expiration-in-ms}") int expirationInMs
+ ) {
+ this.secretKey = secretKey;
+ this.expirationInMs = expirationInMs;
+ }
+
+ public long getDefaultExpirationTime() {
+ return expirationInMs;
+ }
+
+ private Key getSignInKey() {
+ byte[] keyBytes = Decoders.BASE64.decode(secretKey);
+ return Keys.hmacShaKeyFor(keyBytes);
+ }
+
+ private Claims extractAllClaims(String token) {
+ return Jwts
+ .parserBuilder()
+ .setSigningKey(getSignInKey())
+ .build()
+ .parseClaimsJws(token)
+ .getBody();
+ }
+
+ public T extractClaim(String token, Function claimsResolver) {
+ final Claims claims = extractAllClaims(token);
+ return claimsResolver.apply(claims);
+ }
+
+ public String generateToken(UserDetails userDetails) {
+ return generateToken(new HashMap<>(), userDetails);
+ }
+
+ public String generateToken(Map extraClaims, UserDetails userDetails) {
+ return buildToken(extraClaims, userDetails, expirationInMs);
+ }
+
+ private String buildToken(
+ Map extraClaims,
+ UserDetails userDetails,
+ long expiration
+ ) {
+ return Jwts
+ .builder()
+ .setClaims(extraClaims)
+ .setSubject(userDetails.getUsername())
+ .setIssuedAt(new Date(System.currentTimeMillis()))
+ .setExpiration(new Date(System.currentTimeMillis() + expiration))
+ .signWith(getSignInKey(), SignatureAlgorithm.HS256)
+ .compact();
+ }
+
+
+ public String extractUsername(String token) {
+ return extractClaim(token, Claims::getSubject);
+ }
+
+
+ public boolean isTokenValid(String token, UserDetails userDetails) {
+ final String username = extractUsername(token);
+ return (username.equals(userDetails.getUsername())) && !isTokenExpired(token);
+ }
+
+ private boolean isTokenExpired(String token) {
+ return extractExpiration(token).before(new Date());
+ }
+
+
+ private Date extractExpiration(String token) {
+ return extractClaim(token, Claims::getExpiration);
+ }
+
+
+ public boolean validateJwtToken(String authToken) {
+ try {
+ Jwts.parserBuilder().setSigningKey(getSignInKey()).build().parse(authToken);
+ return true;
+ } catch (MalformedJwtException e) {
+ logger.error("Invalid JWT token: {}", e.getMessage());
+ } catch (ExpiredJwtException e) {
+ logger.error("JWT token is expired: {}", e.getMessage());
+ } catch (UnsupportedJwtException e) {
+ logger.error("JWT token is unsupported: {}", e.getMessage());
+ } catch (IllegalArgumentException e) {
+ logger.error("JWT claims string is empty: {}", e.getMessage());
+ }
+
+ return false;
+ }
+}
+
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/LoginService.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/LoginService.java
new file mode 100644
index 0000000..29346a5
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/LoginService.java
@@ -0,0 +1,49 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.service;
+
+import org.lbcc.bms.bms_monolith.common.entity.RegisteredUser;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.dto.LogInRequest;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.dto.LogInResponse;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.model.UserDetailsModel;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.repository.RegisteredUserRepository;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+@Service
+public class LoginService {
+
+ private final JwtService jwtService;
+ private final AuthenticationManager authenticationManager;
+ private final RegisteredUserRepository registeredUserRepository;
+
+ public LoginService(
+ JwtService jwtService, AuthenticationManager authenticationManager,
+ RegisteredUserRepository registeredUserRepository
+ ) {
+ this.jwtService = jwtService;
+ this.authenticationManager = authenticationManager;
+ this.registeredUserRepository = registeredUserRepository;
+ }
+
+
+ public LogInResponse login(LogInRequest loginInRequest) {
+
+ authenticationManager.authenticate(
+ new UsernamePasswordAuthenticationToken(
+ loginInRequest.username(),
+ loginInRequest.password()
+ )
+ );
+
+ RegisteredUser authenticatedUser = registeredUserRepository
+ .findByUsername(loginInRequest.username())
+ .orElseThrow(() -> new UsernameNotFoundException("Username not found!!"));
+ String jwtToken = jwtService.generateToken(new UserDetailsModel(authenticatedUser));
+
+ return new LogInResponse(
+ jwtToken,
+ jwtService.getDefaultExpirationTime()
+ );
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/RegisterService.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/RegisterService.java
new file mode 100644
index 0000000..601ed06
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/RegisterService.java
@@ -0,0 +1,66 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.service;
+
+import org.lbcc.bms.bms_monolith.common.entity.RegisteredUser;
+import org.lbcc.bms.bms_monolith.common.entity.Role;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.dto.SignUpRequest;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.dto.SignUpResponse;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.exeception.RoleNotFoundException;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.exeception.UserAlreadyExistsException;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Component;
+
+import java.util.HashSet;
+import java.util.Set;
+
+@Component
+public class RegisterService {
+
+ private final RegisteredUserService registeredUserService;
+ private final RoleFactoryService roleFactory;
+ private final PasswordEncoder passwordEncoder;
+
+ public RegisterService(
+ RegisteredUserService registeredUserService, RoleFactoryService roleFactory,
+ PasswordEncoder passwordEncoder
+ ) {
+ this.registeredUserService = registeredUserService;
+ this.roleFactory = roleFactory;
+ this.passwordEncoder = passwordEncoder;
+ }
+
+ public SignUpResponse signUpUser(SignUpRequest signUpRequest)
+ throws UserAlreadyExistsException, RoleNotFoundException {
+ if (registeredUserService.existsByEmail(signUpRequest.getEmail())) {
+ throw new UserAlreadyExistsException("Registration Failed: Provided email already exists. Try sign in or provide another email.");
+ }
+ if (registeredUserService.existsByUsername(signUpRequest.getUsername())) {
+ throw new UserAlreadyExistsException("Registration Failed: Provided username already exists. Try sign in or provide another username.");
+ }
+
+ RegisteredUser registeredUser = createUser(signUpRequest);
+ registeredUserService.save(registeredUser);
+ return new SignUpResponse(registeredUser.getUsername());
+ }
+
+ private RegisteredUser createUser(SignUpRequest signUpRequest) throws RoleNotFoundException {
+ return RegisteredUser.builder()
+ .email(signUpRequest.getEmail())
+ .username(signUpRequest.getUsername())
+ .password(passwordEncoder.encode(signUpRequest.getPassword()))
+ .roles(determineRoles(signUpRequest.getRoles()))
+ .build();
+ }
+
+ private Set determineRoles(Set strRoles) throws RoleNotFoundException {
+ Set roles = new HashSet<>();
+
+ if (strRoles == null) {
+ roles.add(roleFactory.getInstance("user"));
+ } else {
+ for (String role : strRoles) {
+ roles.add(roleFactory.getInstance(role.toLowerCase()));
+ }
+ }
+ return roles;
+ }
+}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/RegisteredUserService.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/RegisteredUserService.java
new file mode 100644
index 0000000..39d37b5
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/RegisteredUserService.java
@@ -0,0 +1,27 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.service;
+
+import org.lbcc.bms.bms_monolith.common.entity.RegisteredUser;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.repository.RegisteredUserRepository;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RegisteredUserService {
+
+ private final RegisteredUserRepository registeredUserRepository;
+
+ public RegisteredUserService(RegisteredUserRepository registeredUserRepository) {
+ this.registeredUserRepository = registeredUserRepository;
+ }
+
+ public boolean existsByUsername(String username) {
+ return registeredUserRepository.existsByUsername(username);
+ }
+
+ public boolean existsByEmail(String email) {
+ return registeredUserRepository.existsByEmail(email);
+ }
+
+ public void save(RegisteredUser registeredUser) {
+ registeredUserRepository.save(registeredUser);
+ }
+}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/RoleFactoryService.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/RoleFactoryService.java
new file mode 100644
index 0000000..00eba9d
--- /dev/null
+++ b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/security/uesrnamepassword/service/RoleFactoryService.java
@@ -0,0 +1,27 @@
+package org.lbcc.bms.bms_monolith.security.uesrnamepassword.service;
+
+import org.lbcc.bms.bms_monolith.common.entity.Role;
+import org.lbcc.bms.bms_monolith.common.enums.RoleType;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.exeception.RoleNotFoundException;
+import org.lbcc.bms.bms_monolith.security.uesrnamepassword.repository.RoleRepository;
+import org.springframework.stereotype.Component;
+
+@Component
+public class RoleFactoryService {
+
+ private final RoleRepository roleRepository;
+
+ public RoleFactoryService(RoleRepository roleRepository) {
+ this.roleRepository = roleRepository;
+ }
+
+ public Role getInstance(String role) throws RoleNotFoundException {
+ return switch (role.toLowerCase()) {
+ case "admin" -> roleRepository.findByLabel(RoleType.ADMIN);
+ case "user" -> roleRepository.findByLabel(RoleType.USER);
+ case "vendor" -> roleRepository.findByLabel(RoleType.VENDOR);
+ case "guest" -> roleRepository.findByLabel(RoleType.GUEST);
+ default -> throw new RoleNotFoundException("No role found for " + role);
+ };
+ }
+}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/JwtUtils.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/JwtUtils.java
deleted file mode 100644
index 9f7e970..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/JwtUtils.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.lbcc.bms.bms_monolith.userservice.common;
-
-import io.jsonwebtoken.*;
-import io.jsonwebtoken.io.Decoders;
-import io.jsonwebtoken.security.Keys;
-import org.lbcc.bms.bms_monolith.userservice.service.impl.UserDetailsImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.security.core.Authentication;
-import org.springframework.stereotype.Component;
-
-import java.security.Key;
-import java.util.Date;
-
-@Component
-public class JwtUtils {
- private static final Logger logger = LoggerFactory.getLogger(JwtUtils.class);
-
- @Value("${app.auth:jwt-secret}")
- private String jwtSecret;
-
- @Value("${app.auth.jwt-expiration-ms}")
- private int jwtExpirationMs;
-
- public String generateJwtToken(Authentication authentication) {
-
- UserDetailsImpl userPrincipal = (UserDetailsImpl) authentication.getPrincipal();
-
- return Jwts.builder()
- .setSubject((userPrincipal.getEmail()))
- .setIssuedAt(new Date())
- .setExpiration(new Date((new Date()).getTime() + jwtExpirationMs))
- .signWith(key(), SignatureAlgorithm.HS256)
- .compact();
- }
-
- private Key key() {
- return Keys.hmacShaKeyFor(Decoders.BASE64.decode(jwtSecret));
- }
-
- public String getUserNameFromJwtToken(String token) {
- return Jwts.parserBuilder()
- .setSigningKey(key())
- .build()
- .parseClaimsJws(token)
- .getBody()
- .getSubject();
- }
-
- public boolean validateJwtToken(String authToken) {
- try {
- Jwts.parserBuilder().setSigningKey(key()).build().parse(authToken);
- return true;
- } catch (MalformedJwtException e) {
- logger.error("Invalid JWT token: {}", e.getMessage());
- } catch (ExpiredJwtException e) {
- logger.error("JWT token is expired: {}", e.getMessage());
- } catch (UnsupportedJwtException e) {
- logger.error("JWT token is unsupported: {}", e.getMessage());
- } catch (IllegalArgumentException e) {
- logger.error("JWT claims string is empty: {}", e.getMessage());
- }
-
- return false;
- }
-}
-
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleFactory.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleFactory.java
deleted file mode 100644
index 072430e..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/common/RoleFactory.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.lbcc.bms.bms_monolith.userservice.common;
-
-import org.lbcc.bms.bms_monolith.userservice.exeception.RoleNotFoundException;
-import org.lbcc.bms.bms_monolith.userservice.model.Role;
-import org.lbcc.bms.bms_monolith.userservice.repository.RoleRepository;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-@Component
-public class RoleFactory {
- @Autowired
- RoleRepository roleRepository;
-
- public Role getInstance(String role) throws RoleNotFoundException {
- switch (role) {
- case "admin" -> {
- return roleRepository.findByLabel(RoleType.ADMIN);
- }
- case "user" -> {
- return roleRepository.findByLabel(RoleType.USER);
- }
- case "vendor" -> {
- return roleRepository.findByLabel(RoleType.VENDOR);
- }
- case "guest" -> {
- return roleRepository.findByLabel(RoleType.GUEST);
- }
-
- default -> throw new RoleNotFoundException("No role found for " + role);
- }
- }
-
-}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/AuthController.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/AuthController.java
deleted file mode 100644
index e88137d..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/AuthController.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.lbcc.bms.bms_monolith.userservice.controller;
-
-import jakarta.validation.Valid;
-import org.lbcc.bms.bms_monolith.common.response.ApiResponse;
-import org.lbcc.bms.bms_monolith.userservice.common.SignUpRequestDto;
-import org.lbcc.bms.bms_monolith.userservice.exeception.RoleNotFoundException;
-import org.lbcc.bms.bms_monolith.userservice.exeception.UserAlreadyExistsException;
-import org.lbcc.bms.bms_monolith.userservice.service.AuthService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-@RestController
-@CrossOrigin("*")
-@RequestMapping("/auth")
-public class AuthController {
- @Autowired
- private AuthService authService;
-
- @PostMapping("/register")
- public ResponseEntity registerUser(@RequestBody @Valid SignUpRequestDto signUpRequestDto)
- throws UserAlreadyExistsException, RoleNotFoundException {
- return authService.signUpUser(signUpRequestDto);
- }
- @PostMapping("/login")
- public ResponseEntity signIn(@RequestBody @Valid SignUpRequestDto signUpRequestDto)
- throws UserAlreadyExistsException, RoleNotFoundException {
- return authService.signUpUser(signUpRequestDto);
- }
-
-}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/UserController.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/UserController.java
deleted file mode 100644
index 4aa615f..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/controller/UserController.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.lbcc.bms.bms_monolith.userservice.controller;
-
-import org.lbcc.bms.bms_monolith.common.response.ApiResponse;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-@RequestMapping("/api/users")
-public class UserController {
-
- @GetMapping("/")
- public ResponseEntity> Test() {
- return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.builder().success(true).message(" jwt token test").build());
- }
-}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/RoleNotFoundException.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/RoleNotFoundException.java
deleted file mode 100644
index e79aa86..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/RoleNotFoundException.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.lbcc.bms.bms_monolith.userservice.exeception;
-
-public class RoleNotFoundException extends Exception{
- public RoleNotFoundException(String message) {
- super(message);
- }
-}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UserAlreadyExistsException.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UserAlreadyExistsException.java
deleted file mode 100644
index 5b9f596..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UserAlreadyExistsException.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.lbcc.bms.bms_monolith.userservice.exeception;
-
-public class UserAlreadyExistsException extends Exception{
- public UserAlreadyExistsException(String message) {
- super(message);
- }
-}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UsernameNotFoundException.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UsernameNotFoundException.java
deleted file mode 100644
index 5d57ccf..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/exeception/UsernameNotFoundException.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.lbcc.bms.bms_monolith.userservice.exeception;
-
-public class UsernameNotFoundException extends RuntimeException {
- public UsernameNotFoundException(String message) {
- super(message);
- }
-}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/UserRepository.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/UserRepository.java
deleted file mode 100644
index 40033b8..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/repository/UserRepository.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.lbcc.bms.bms_monolith.userservice.repository;
-
-import org.lbcc.bms.bms_monolith.userservice.model.User;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-import java.util.Optional;
-
-@Repository
-public interface UserRepository extends JpaRepository {
- Optional findByEmail(String email);
-
- Boolean existsByUsername(String username);
-
- Boolean existsByEmail(String email);
-}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/AuthService.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/AuthService.java
deleted file mode 100644
index 3d4322a..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/AuthService.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.lbcc.bms.bms_monolith.userservice.service;
-
-import org.lbcc.bms.bms_monolith.common.response.ApiResponse;
-import org.lbcc.bms.bms_monolith.userservice.common.SignUpRequestDto;
-import org.lbcc.bms.bms_monolith.userservice.exeception.RoleNotFoundException;
-import org.lbcc.bms.bms_monolith.userservice.exeception.UserAlreadyExistsException;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Service;
-
-
-@Service
-public interface AuthService {
- ResponseEntity signUpUser(SignUpRequestDto signUpRequestDto) throws UserAlreadyExistsException, RoleNotFoundException, org.lbcc.bms.bms_monolith.userservice.exeception.RoleNotFoundException;
-}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/UserService.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/UserService.java
deleted file mode 100644
index 3aec886..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/UserService.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.lbcc.bms.bms_monolith.userservice.service;
-
-import org.lbcc.bms.bms_monolith.userservice.model.User;
-import org.springframework.stereotype.Service;
-
-@Service
-public interface UserService {
- boolean existsByUsername(String username);
- boolean existsByEmail(String email);
- void save(User user);
-}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java
deleted file mode 100644
index 747f69e..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/AuthServiceImpl.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.lbcc.bms.bms_monolith.userservice.service.impl;
-
-import org.lbcc.bms.bms_monolith.common.response.ApiResponse;
-import org.lbcc.bms.bms_monolith.userservice.common.RoleFactory;
-import org.lbcc.bms.bms_monolith.userservice.common.SignUpRequestDto;
-import org.lbcc.bms.bms_monolith.userservice.exeception.RoleNotFoundException;
-import org.lbcc.bms.bms_monolith.userservice.exeception.UserAlreadyExistsException;
-import org.lbcc.bms.bms_monolith.userservice.model.Role;
-import org.lbcc.bms.bms_monolith.userservice.model.User;
-import org.lbcc.bms.bms_monolith.userservice.service.AuthService;
-import org.lbcc.bms.bms_monolith.userservice.service.UserService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Component;
-
-import java.util.HashSet;
-import java.util.Set;
-
-@Component
-public class AuthServiceImpl implements AuthService {
-
- private final UserService userService;
-
- private PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
-
- @Autowired
- private RoleFactory roleFactory;
-
- public AuthServiceImpl(UserService userService) {
- this.userService = userService;
- }
-
- @Override
- public ResponseEntity signUpUser(SignUpRequestDto signUpRequestDto)
- throws UserAlreadyExistsException, RoleNotFoundException {
- if (userService.existsByEmail(signUpRequestDto.getEmail())) {
- throw new UserAlreadyExistsException("Registration Failed: Provided email already exists. Try sign in or provide another email.");
- }
- if (userService.existsByUsername(signUpRequestDto.getUserName())) {
- throw new UserAlreadyExistsException("Registration Failed: Provided username already exists. Try sign in or provide another username.");
- }
-
- User user = createUser(signUpRequestDto);
- userService.save(user);
- return ResponseEntity.status(HttpStatus.CREATED).body(
- ApiResponse.builder()
- .message("User account has been successfully created!")
- .build()
- );
- }
-
- private User createUser(SignUpRequestDto signUpRequestDto) throws RoleNotFoundException {
- return User.builder()
- .email(signUpRequestDto.getEmail())
- .username(signUpRequestDto.getUserName())
- .password(signUpRequestDto.getPassword())
- .roles(determineRoles(signUpRequestDto.getRoles()))
- .build();
- }
-
- private Set determineRoles(Set strRoles) throws RoleNotFoundException {
- Set roles = new HashSet<>();
-
- if (strRoles == null) {
- roles.add(roleFactory.getInstance("user"));
- } else {
- for (String role : strRoles) {
- roles.add(roleFactory.getInstance(role.toLowerCase()));
- }
- }
- return roles;
- }
-}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsImpl.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsImpl.java
deleted file mode 100644
index 7a07f3f..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsImpl.java
+++ /dev/null
@@ -1,67 +0,0 @@
-
-package org.lbcc.bms.bms_monolith.userservice.service.impl;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import org.lbcc.bms.bms_monolith.userservice.model.User;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.UserDetails;
-
-import java.io.Serial;
-import java.util.Collection;
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-@AllArgsConstructor
-@Data
-public class UserDetailsImpl implements UserDetails {
- @Serial private static final long serialVersionUID = 1L;
- private String id;
- private String username;
- private String email;
- @JsonIgnore private String password;
- private Collection extends GrantedAuthority> authorities;
- private boolean enabled;
-
- public static UserDetailsImpl build(User user) {
- List authorities =
- user.getRoles().stream()
- .map(role -> new SimpleGrantedAuthority(role.getLabel().name()))
- .collect(Collectors.toList());
-
- return new UserDetailsImpl(
- user.getId(),
- user.getUsername(),
- user.getEmail(),
- user.getPassword(),
- authorities,
- user.getIsActive());
- }
-
- @Override
- public boolean isAccountNonExpired() {
- return true;
- }
-
- @Override
- public boolean isAccountNonLocked() {
- return true;
- }
-
- @Override
- public boolean isCredentialsNonExpired() {
- return true;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- UserDetailsImpl user = (UserDetailsImpl) o;
- return Objects.equals(id, user.id);
- }
-}
-
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsServiceImpl.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsServiceImpl.java
deleted file mode 100644
index 209cb3f..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserDetailsServiceImpl.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.lbcc.bms.bms_monolith.userservice.service.impl;
-
-import jakarta.transaction.Transactional;
-import org.lbcc.bms.bms_monolith.userservice.model.User;
-import org.lbcc.bms.bms_monolith.userservice.repository.UserRepository;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
-
-@Service
-public class UserDetailsServiceImpl implements UserDetailsService {
- @Autowired UserRepository userRepository;
-
- @Override
- @Transactional
- public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
- User user =
- userRepository
- .findByEmail(username)
- .orElseThrow(
- () -> new UsernameNotFoundException("User Not Found with username: " + username));
-
- return UserDetailsImpl.build(user);
- }
-}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserServiceImpl.java b/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserServiceImpl.java
deleted file mode 100644
index 4946fba..0000000
--- a/book-my-show/backend/java/bms-monolith/src/main/java/org/lbcc/bms/bms_monolith/userservice/service/impl/UserServiceImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.lbcc.bms.bms_monolith.userservice.service.impl;
-
-import org.lbcc.bms.bms_monolith.userservice.model.User;
-import org.lbcc.bms.bms_monolith.userservice.repository.UserRepository;
-import org.lbcc.bms.bms_monolith.userservice.service.UserService;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import org.springframework.stereotype.Service;
-
-@Service
-public class UserServiceImpl implements UserService {
-
- private final UserRepository userRepository;
-
- @Autowired
- public UserServiceImpl(UserRepository userRepository) {
- this.userRepository = userRepository;
- }
-
- @Override
- public boolean existsByUsername(String username) {
- return userRepository.existsByUsername(username);
- }
-
- @Override
- public boolean existsByEmail(String email) {
- return userRepository.existsByEmail(email);
- }
-
- @Override
- public void save(User user) {
- userRepository.save(user);
- }
-}
diff --git a/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml b/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml
index 8f56af0..ea81d5d 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml
+++ b/book-my-show/backend/java/bms-monolith/src/main/resources/application.yaml
@@ -21,5 +21,6 @@ server:
context-path: /api/v1
app:
auth:
- jwt-secret: ${JWT_SECRET:some_secret}
- jwt-expiration-ms: ${JWT_EXPIRATION_MS:50000}
\ No newline at end of file
+ jwt:
+ secret-key: ${JWT_SECRET_KEY:ZmxhbWVyb2xsc3RvcHBlZGNyZWFtY29sbGVjdGZhbGxzb2xkaWVydG9uZWdpdmVua24=}
+ expiration-in-ms: ${JWT_EXPIRATION_IN_MS:50000}
\ No newline at end of file
diff --git a/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/add-auth-tables.xml b/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/add-auth-tables.xml
index 9d0af54..c8be503 100644
--- a/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/add-auth-tables.xml
+++ b/book-my-show/backend/java/bms-monolith/src/main/resources/db/changelog/v1.0/add-auth-tables.xml
@@ -20,7 +20,7 @@
-
+
@@ -42,7 +42,7 @@
-
+