From 94df923643809430575e9d8be76590dd399ffa28 Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Tue, 8 Apr 2025 17:24:49 +0300 Subject: [PATCH 01/19] task 1&2 completed --- pom.xml | 24 ++++++- .../spring/ordering/HelloWorldController.kt | 65 +++++++++++++++++++ .../coded/spring/ordering/OrderRepository.kt | 29 +++++++++ .../coded/spring/ordering/UserRepository.kt | 21 ++++++ src/main/resources/application.properties | 2 + 5 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/UserRepository.kt diff --git a/pom.xml b/pom.xml index 163ad53..39be955 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot @@ -58,6 +58,26 @@ kotlin-test-junit5 test + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + runtime + + + + jakarta.inject + jakarta.inject-api + 2.0.1 + + + + @@ -90,4 +110,4 @@ - + \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt new file mode 100644 index 0000000..863be58 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt @@ -0,0 +1,65 @@ +package com.coded.spring.ordering + + +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RestController +import java.time.LocalDateTime + +@RestController +class HelloWorldController( + val usersRepository: UsersRepository, + val orderRepository: OrderRepository +){ + + @GetMapping("/hello") + fun helloWorld() = "Hello World!" + + + @GetMapping("/cart") + fun cart() = "Your cart" + + @GetMapping("/restaurants") + fun resturant() = "List of resturants" + + @GetMapping("/Settings") + fun settings() = "Settings!" + + // Post + @PostMapping("/my-name") + fun sayMyName( @RequestBody request: SayMyNameRequest) = usersRepository.save(User(name = request.name)) + + @GetMapping("/my-name") + fun getName(): MutableList { + return usersRepository.findAll() + } + + @PostMapping("/orders") + fun orders( @RequestBody request: OrderRequest): Order{ + val order = (Order(null, LocalDateTime.now() ,request.user , request.restaurant, request.items.toMutableList())) + return orderRepository.save(order) + } + + @GetMapping("/orders") + fun getOrders(): MutableList{ + return orderRepository.findAll() + } + + + +} + +data class SayMyNameRequest( + val name: String +) + +data class OrderRequest( + val user: String, + val restaurant: String, + val items: MutableList + +) + + + diff --git a/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt b/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt new file mode 100644 index 0000000..b394ef2 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt @@ -0,0 +1,29 @@ +package com.coded.spring.ordering + + +import jakarta.inject.Named +import jakarta.persistence.* +import org.springframework.data.jpa.repository.JpaRepository +import java.time.LocalDateTime + +@Named +interface OrderRepository : JpaRepository + +@Entity +@Table(name = "orders") +data class Order( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + var createdAt: LocalDateTime = LocalDateTime.now(), + // @column since user is reserved word in sql ;/ + @Column(name = "'user'") + var user: String, + var restaurant: String, + var items: MutableList = mutableListOf() + + +){ + constructor(): this(null, LocalDateTime.now() ,"", "", mutableListOf()) + +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/UserRepository.kt b/src/main/kotlin/com/coded/spring/ordering/UserRepository.kt new file mode 100644 index 0000000..1eb1ec6 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/UserRepository.kt @@ -0,0 +1,21 @@ +package com.coded.spring.ordering + +import jakarta.inject.Named +import jakarta.persistence.* +import org.springframework.data.jpa.repository.JpaRepository + +@Named +interface UsersRepository : JpaRepository + +@Entity +@Table(name = "users") +data class User( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + var name: String +){ + constructor() : this(null, "") +} + + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 3704dc6..3ebb263 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,3 @@ spring.application.name=Kotlin.SpringbootV2 + +server.port=8081 From 145c1096f45cf590d2d956b27f3f15e811896ac6 Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Tue, 8 Apr 2025 20:40:08 +0300 Subject: [PATCH 02/19] create online order task is completed --- .../spring/ordering/HelloWorldController.kt | 13 +++++----- .../coded/spring/ordering/OrderRepository.kt | 10 +++---- .../coded/spring/ordering/UserRepository.kt | 11 +++++--- .../spring/ordering/orders/OrderController.kt | 14 ++++++++++ .../spring/ordering/orders/OrderService.kt | 26 +++++++++++++++++++ .../spring/ordering/users/UsersController.kt | 13 ++++++++++ .../spring/ordering/users/UsersService.kt | 22 ++++++++++++++++ 7 files changed, 94 insertions(+), 15 deletions(-) create mode 100644 src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt index 863be58..90b7506 100644 --- a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt @@ -28,16 +28,16 @@ class HelloWorldController( // Post @PostMapping("/my-name") - fun sayMyName( @RequestBody request: SayMyNameRequest) = usersRepository.save(User(name = request.name)) + fun sayMyName( @RequestBody request: SayMyNameRequest) = usersRepository.save(UserEntity(name = request.name, age = request.age)) @GetMapping("/my-name") - fun getName(): MutableList { + fun getName(): MutableList { return usersRepository.findAll() } @PostMapping("/orders") fun orders( @RequestBody request: OrderRequest): Order{ - val order = (Order(null, LocalDateTime.now() ,request.user , request.restaurant, request.items.toMutableList())) + val order = (Order(null ,request.username , request.restaurant, request.items)) return orderRepository.save(order) } @@ -51,13 +51,14 @@ class HelloWorldController( } data class SayMyNameRequest( - val name: String + val name: String, + val age: Int ) data class OrderRequest( - val user: String, + val username: String, val restaurant: String, - val items: MutableList + val items: String ) diff --git a/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt b/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt index b394ef2..fbf6056 100644 --- a/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt +++ b/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt @@ -15,15 +15,15 @@ data class Order( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long? = null, - var createdAt: LocalDateTime = LocalDateTime.now(), +// var createdAt: LocalDateTime = LocalDateTime.now(), // @column since user is reserved word in sql ;/ - @Column(name = "'user'") - var user: String, + + var username: String, var restaurant: String, - var items: MutableList = mutableListOf() + var items: String ){ - constructor(): this(null, LocalDateTime.now() ,"", "", mutableListOf()) + constructor(): this(null,"", "", "") } \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/UserRepository.kt b/src/main/kotlin/com/coded/spring/ordering/UserRepository.kt index 1eb1ec6..917d956 100644 --- a/src/main/kotlin/com/coded/spring/ordering/UserRepository.kt +++ b/src/main/kotlin/com/coded/spring/ordering/UserRepository.kt @@ -5,17 +5,20 @@ import jakarta.persistence.* import org.springframework.data.jpa.repository.JpaRepository @Named -interface UsersRepository : JpaRepository +interface UsersRepository : JpaRepository { + fun age(age: Int): MutableList +} @Entity @Table(name = "users") -data class User( +data class UserEntity( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long? = null, - var name: String + var name: String, + var age: Int ){ - constructor() : this(null, "") + constructor() : this(null, "", 0) } diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt new file mode 100644 index 0000000..edfec3c --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt @@ -0,0 +1,14 @@ +package com.coded.spring.ordering.orders + +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +class OrderController( + private val orderService: OrderService + +) { + + @GetMapping("/orders/list") + fun orders() = orderService.listOrders() +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt new file mode 100644 index 0000000..0e95ee5 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt @@ -0,0 +1,26 @@ +package com.coded.spring.ordering.orders + +import com.coded.spring.ordering.OrderRepository +import jakarta.inject.Named + +@Named +class OrderService( + private val orderRepository: OrderRepository, +) { + + fun listOrders(): List = orderRepository.findAll().map{ + Order( + username = it.username, + restaurant = it.restaurant, + items = it.items + + + ) + } +} + +data class Order( + val username: String, + val restaurant: String, + val items: String +) \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt b/src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt new file mode 100644 index 0000000..5c3c6af --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt @@ -0,0 +1,13 @@ +package com.coded.spring.ordering.users + +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +class UsersController( + private val usersService: UsersService +){ + + @GetMapping("/users/list") + fun users() = usersService.listUsers() +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt b/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt new file mode 100644 index 0000000..b178d0e --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt @@ -0,0 +1,22 @@ +package com.coded.spring.ordering.users + +import com.coded.spring.ordering.UsersRepository +import jakarta.inject.Named + +@Named +class UsersService( + private val usersRepository: UsersRepository, +) { + + fun listUsers(): List = usersRepository.findAll().map { + User( + name = it.name, + age = it.age + ) + } +} + +data class User( + val name: String, + val age: Int +) \ No newline at end of file From 81d73efa473e09f9214974a331189b35735654aa Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Thu, 10 Apr 2025 16:51:20 +0300 Subject: [PATCH 03/19] task 3 bonus ( item table completed ) --- .../spring/ordering/HelloWorldController.kt | 10 ++++---- .../coded/spring/ordering/OrderRepository.kt | 12 ++++------ .../spring/ordering/orders/ItemsController.kt | 14 +++++++++++ .../spring/ordering/orders/ItemsRepository.kt | 24 +++++++++++++++++++ .../spring/ordering/orders/ItemsService.kt | 20 ++++++++++++++++ .../spring/ordering/orders/OrderService.kt | 15 +++++------- 6 files changed, 72 insertions(+), 23 deletions(-) create mode 100644 src/main/kotlin/com/coded/spring/ordering/orders/ItemsController.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/orders/ItemsRepository.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/orders/ItemsService.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt index 90b7506..dcacb41 100644 --- a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt @@ -5,7 +5,6 @@ import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RestController -import java.time.LocalDateTime @RestController class HelloWorldController( @@ -36,8 +35,8 @@ class HelloWorldController( } @PostMapping("/orders") - fun orders( @RequestBody request: OrderRequest): Order{ - val order = (Order(null ,request.username , request.restaurant, request.items)) + fun orders( @RequestBody request: OrderRequest): Order { + val order = (Order(null ,1)) return orderRepository.save(order) } @@ -56,9 +55,8 @@ data class SayMyNameRequest( ) data class OrderRequest( - val username: String, - val restaurant: String, - val items: String + val user_id: Int, + ) diff --git a/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt b/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt index fbf6056..7fd4497 100644 --- a/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt +++ b/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt @@ -1,10 +1,10 @@ package com.coded.spring.ordering +import com.coded.spring.ordering.users.User import jakarta.inject.Named import jakarta.persistence.* import org.springframework.data.jpa.repository.JpaRepository -import java.time.LocalDateTime @Named interface OrderRepository : JpaRepository @@ -15,15 +15,11 @@ data class Order( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long? = null, -// var createdAt: LocalDateTime = LocalDateTime.now(), - // @column since user is reserved word in sql ;/ - - var username: String, - var restaurant: String, - var items: String +// @OneToOne(targetEntity = User) + var user_id: Long ){ - constructor(): this(null,"", "", "") + constructor(): this(null,1) } \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/ItemsController.kt b/src/main/kotlin/com/coded/spring/ordering/orders/ItemsController.kt new file mode 100644 index 0000000..7a5a84a --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/orders/ItemsController.kt @@ -0,0 +1,14 @@ +package com.coded.spring.ordering.orders + +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RestController + + +@RestController +class ItemsController( + private val itemsService: ItemsService +) { + + @GetMapping("/items/list") + fun items() = itemsService.listItems() +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/ItemsRepository.kt b/src/main/kotlin/com/coded/spring/ordering/orders/ItemsRepository.kt new file mode 100644 index 0000000..08aefd4 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/orders/ItemsRepository.kt @@ -0,0 +1,24 @@ +package com.coded.spring.ordering.orders + +import jakarta.inject.Named +import jakarta.persistence.* +import org.springframework.data.jpa.repository.JpaRepository + +@Named +interface ItemsRepository: JpaRepository + +@Entity +@Table(name = "items") +data class Items( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + var order_id: Int, + var quantity: Int, + var price: Double, +// @Column("'name'") + var name: String + +){ + constructor(): this(null, 1, 1, 1.0, "") +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/ItemsService.kt b/src/main/kotlin/com/coded/spring/ordering/orders/ItemsService.kt new file mode 100644 index 0000000..39cfd1e --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/orders/ItemsService.kt @@ -0,0 +1,20 @@ +package com.coded.spring.ordering.orders + +import jakarta.inject.Named + +@Named +class ItemsService( + private val itemsRepository: ItemsRepository +) { + + fun listItems(): List = itemsRepository.findAll().map { + Items( + id = it.id, + order_id = it.order_id, + quantity = it.quantity, + price = it.price, + name = it.name + ) + + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt index 0e95ee5..1fd2c97 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt @@ -1,7 +1,9 @@ package com.coded.spring.ordering.orders +import com.coded.spring.ordering.Order import com.coded.spring.ordering.OrderRepository import jakarta.inject.Named +import java.math.BigInteger @Named class OrderService( @@ -9,18 +11,13 @@ class OrderService( ) { fun listOrders(): List = orderRepository.findAll().map{ - Order( - username = it.username, - restaurant = it.restaurant, - items = it.items + com.coded.spring.ordering.Order( + id = it.id, + user_id = it.user_id, + ) } } -data class Order( - val username: String, - val restaurant: String, - val items: String -) \ No newline at end of file From 9dc23ed4d83940092ef11b07fdbd1e7975ff3d92 Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Thu, 10 Apr 2025 18:47:43 +0300 Subject: [PATCH 04/19] finished working with items,orders --- .../spring/ordering/HelloWorldController.kt | 12 +++++------ .../coded/spring/ordering/OrderRepository.kt | 18 +++++++++++------ .../spring/ordering/orders/ItemsRepository.kt | 13 ++++++------ .../spring/ordering/orders/ItemsService.kt | 5 ++--- .../spring/ordering/orders/OrderController.kt | 20 +++++++++++++++++-- .../spring/ordering/orders/OrderService.kt | 20 ++++++++++++------- 6 files changed, 58 insertions(+), 30 deletions(-) diff --git a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt index dcacb41..c693df9 100644 --- a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt @@ -34,14 +34,14 @@ class HelloWorldController( return usersRepository.findAll() } - @PostMapping("/orders") - fun orders( @RequestBody request: OrderRequest): Order { - val order = (Order(null ,1)) - return orderRepository.save(order) - } +// @PostMapping("/orders") +// fun orders( @RequestBody request: OrderRequest): OrderEntity { +// val order = (OrderEntity(null,user)) +// return orderRepository.save(order) +// } @GetMapping("/orders") - fun getOrders(): MutableList{ + fun getOrders(): MutableList{ return orderRepository.findAll() } diff --git a/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt b/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt index 7fd4497..f13504d 100644 --- a/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt +++ b/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt @@ -1,25 +1,31 @@ package com.coded.spring.ordering +import com.coded.spring.ordering.orders.ItemEntity import com.coded.spring.ordering.users.User import jakarta.inject.Named import jakarta.persistence.* import org.springframework.data.jpa.repository.JpaRepository @Named -interface OrderRepository : JpaRepository +interface OrderRepository : JpaRepository @Entity @Table(name = "orders") -data class Order( +data class OrderEntity( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - var id: Long? = null, -// @OneToOne(targetEntity = User) - var user_id: Long + val id: Long? = null, + + @ManyToOne + val user: UserEntity, + + // join + @OneToMany(mappedBy = "order_id") + val items: List? = null ){ - constructor(): this(null,1) + constructor(): this(null, UserEntity(), listOf()) } \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/ItemsRepository.kt b/src/main/kotlin/com/coded/spring/ordering/orders/ItemsRepository.kt index 08aefd4..e5dcadf 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/ItemsRepository.kt +++ b/src/main/kotlin/com/coded/spring/ordering/orders/ItemsRepository.kt @@ -5,20 +5,21 @@ import jakarta.persistence.* import org.springframework.data.jpa.repository.JpaRepository @Named -interface ItemsRepository: JpaRepository +interface ItemsRepository: JpaRepository @Entity @Table(name = "items") -data class Items( +data class ItemEntity( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long? = null, - var order_id: Int, + var name: String, var quantity: Int, - var price: Double, + var order_id: Int, + // @Column("'name'") - var name: String + ){ - constructor(): this(null, 1, 1, 1.0, "") + constructor(): this(null, "", 0, 0) } \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/ItemsService.kt b/src/main/kotlin/com/coded/spring/ordering/orders/ItemsService.kt index 39cfd1e..389abd2 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/ItemsService.kt +++ b/src/main/kotlin/com/coded/spring/ordering/orders/ItemsService.kt @@ -7,12 +7,11 @@ class ItemsService( private val itemsRepository: ItemsRepository ) { - fun listItems(): List = itemsRepository.findAll().map { - Items( + fun listItems(): List = itemsRepository.findAll().map { + ItemEntity( id = it.id, order_id = it.order_id, quantity = it.quantity, - price = it.price, name = it.name ) diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt index edfec3c..3efe16a 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt @@ -1,14 +1,30 @@ package com.coded.spring.ordering.orders +import com.coded.spring.ordering.users.UsersService import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RestController @RestController class OrderController( - private val orderService: OrderService + private val orderService: OrderService, + private val userService: UsersService ) { @GetMapping("/orders/list") fun orders() = orderService.listOrders() -} \ No newline at end of file + + // create order + @PostMapping("/orders/create-order") + + fun createOrders(@RequestBody request: CreateOrderRequest){ + orderService.createOrder( userId = request.userId ) + } + +} + +data class CreateOrderRequest( + val userId: Long +) \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt index 1fd2c97..ea92cff 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt @@ -1,23 +1,29 @@ package com.coded.spring.ordering.orders -import com.coded.spring.ordering.Order +import com.coded.spring.ordering.OrderEntity import com.coded.spring.ordering.OrderRepository +import com.coded.spring.ordering.UsersRepository import jakarta.inject.Named import java.math.BigInteger @Named class OrderService( private val orderRepository: OrderRepository, + private val userRepository: UsersRepository ) { - fun listOrders(): List = orderRepository.findAll().map{ - com.coded.spring.ordering.Order( - id = it.id, - user_id = it.user_id, + // listing orders + fun listOrders(): List = orderRepository.findAll().map{ + OrderEntity(id = it.id, user = it.user,items = it.items) + } + // creating new order + fun createOrder(userId: Long){ + val user = userRepository.findById(userId).get() + val newOrder = OrderEntity(user=user) + orderRepository.save(newOrder) + } - ) - } } From e4bac999f98d11d4cc4ceb81619d97ecc2996aec Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Sun, 13 Apr 2025 13:39:04 +0300 Subject: [PATCH 05/19] This is the correct version of items& orders --- .../com/coded/spring/ordering/HelloWorldController.kt | 2 ++ .../com/coded/spring/ordering/orders/OrderController.kt | 8 ++++---- .../com/coded/spring/ordering/orders/OrderService.kt | 4 ++-- .../com/coded/spring/ordering/users/UsersService.kt | 2 ++ 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt index c693df9..d4eae4b 100644 --- a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt @@ -47,6 +47,8 @@ class HelloWorldController( + + } data class SayMyNameRequest( diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt index 3efe16a..5ad1037 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt @@ -13,18 +13,18 @@ class OrderController( ) { - @GetMapping("/orders/list") + @GetMapping("/orders/orders-list") fun orders() = orderService.listOrders() // create order - @PostMapping("/orders/create-order") - + @PostMapping("/orders/orders-list") fun createOrders(@RequestBody request: CreateOrderRequest){ - orderService.createOrder( userId = request.userId ) + return orderService.createOrder( userId = request.userId ) } } data class CreateOrderRequest( val userId: Long + ) \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt index ea92cff..9b562a3 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt @@ -18,12 +18,12 @@ class OrderService( } // creating new order - fun createOrder(userId: Long){ + fun createOrder(userId: Long) { val user = userRepository.findById(userId).get() val newOrder = OrderEntity(user=user) + // save order orderRepository.save(newOrder) } - } diff --git a/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt b/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt index b178d0e..95df4a1 100644 --- a/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt +++ b/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt @@ -10,6 +10,7 @@ class UsersService( fun listUsers(): List = usersRepository.findAll().map { User( + id = it.id, name = it.name, age = it.age ) @@ -17,6 +18,7 @@ class UsersService( } data class User( + val id: Long?, val name: String, val age: Int ) \ No newline at end of file From 249a8056a697fee21ccdecb666d541884b20adab Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Thu, 17 Apr 2025 20:30:32 +0300 Subject: [PATCH 06/19] fixed creating items and added DTO, implemnted authentication and jwt but missing the menu endpoint --- .../spring/ordering/HelloWorldController.kt | 8 ++- .../coded/spring/ordering/InitUserRunner.kt | 35 ++++++++++ .../coded/spring/ordering/UserRepository.kt | 24 ------- .../AuthenticationController.kt | 49 ++++++++++++++ .../authentication/CustomUserDetailsClass.kt | 28 ++++++++ .../ordering/authentication/SecurityConfig.kt | 64 +++++++++++++++++++ .../authentication/jwt/JwtAuthFilter.kt | 45 +++++++++++++ .../ordering/authentication/jwt/JwtService.kt | 50 +++++++++++++++ .../{orders => items}/ItemsController.kt | 8 ++- .../coded/spring/ordering/items/ItemsDTO.kt | 8 +++ .../{orders => items}/ItemsRepository.kt | 2 +- .../{orders => items}/ItemsService.kt | 13 +++- .../ordering/{ => orders}/OrderRepository.kt | 6 +- .../spring/ordering/orders/OrderService.kt | 13 ++-- .../spring/ordering/users/UserRepository.kt | 39 +++++++++++ .../spring/ordering/users/UsersController.kt | 23 ++++++- .../coded/spring/ordering/users/UsersDTO.kt | 19 ++++++ .../spring/ordering/users/UsersService.kt | 53 +++++++++++++-- 18 files changed, 444 insertions(+), 43 deletions(-) create mode 100644 src/main/kotlin/com/coded/spring/ordering/InitUserRunner.kt delete mode 100644 src/main/kotlin/com/coded/spring/ordering/UserRepository.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/authentication/AuthenticationController.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/authentication/CustomUserDetailsClass.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/authentication/jwt/JwtAuthFilter.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/authentication/jwt/JwtService.kt rename src/main/kotlin/com/coded/spring/ordering/{orders => items}/ItemsController.kt (57%) create mode 100644 src/main/kotlin/com/coded/spring/ordering/items/ItemsDTO.kt rename src/main/kotlin/com/coded/spring/ordering/{orders => items}/ItemsRepository.kt (91%) rename src/main/kotlin/com/coded/spring/ordering/{orders => items}/ItemsService.kt (53%) rename src/main/kotlin/com/coded/spring/ordering/{ => orders}/OrderRepository.kt (78%) create mode 100644 src/main/kotlin/com/coded/spring/ordering/users/UserRepository.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/users/UsersDTO.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt index d4eae4b..038ab20 100644 --- a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt @@ -1,6 +1,10 @@ package com.coded.spring.ordering +import com.coded.spring.ordering.orders.OrderEntity +import com.coded.spring.ordering.orders.OrderRepository +import com.coded.spring.ordering.users.UserEntity +import com.coded.spring.ordering.users.UsersRepository import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody @@ -26,8 +30,8 @@ class HelloWorldController( fun settings() = "Settings!" // Post - @PostMapping("/my-name") - fun sayMyName( @RequestBody request: SayMyNameRequest) = usersRepository.save(UserEntity(name = request.name, age = request.age)) +// @PostMapping("/my-name") +// fun sayMyName( @RequestBody request: SayMyNameRequest) = usersRepository.save(UserEntity(name = request.name, age = request.age)) @GetMapping("/my-name") fun getName(): MutableList { diff --git a/src/main/kotlin/com/coded/spring/ordering/InitUserRunner.kt b/src/main/kotlin/com/coded/spring/ordering/InitUserRunner.kt new file mode 100644 index 0000000..c39fc71 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/InitUserRunner.kt @@ -0,0 +1,35 @@ +package com.coded.spring.ordering + +import com.coded.spring.ordering.users.Roles +import com.coded.spring.ordering.users.UserEntity +import com.coded.spring.ordering.users.UsersRepository +import org.springframework.boot.CommandLineRunner +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication +import org.springframework.context.annotation.Bean +import org.springframework.security.crypto.password.PasswordEncoder + +@SpringBootApplication +class InitUserRunner { + + @Bean + fun initUsers(usersRepository: UsersRepository, passwordEncoder: PasswordEncoder) = CommandLineRunner { + val user = UserEntity( + name = "HelloUser", + username = "testuser", + password = passwordEncoder.encode("password123"), + age = 18, + + ) + if (usersRepository.findByUsername(user.username) == null) { + println("Creating user ${user.username}") + usersRepository.save(user) + } else { + println("User ${user.username} already exists") + } + } +} + +fun main(args: Array) { + runApplication(*args).close() +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/UserRepository.kt b/src/main/kotlin/com/coded/spring/ordering/UserRepository.kt deleted file mode 100644 index 917d956..0000000 --- a/src/main/kotlin/com/coded/spring/ordering/UserRepository.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.coded.spring.ordering - -import jakarta.inject.Named -import jakarta.persistence.* -import org.springframework.data.jpa.repository.JpaRepository - -@Named -interface UsersRepository : JpaRepository { - fun age(age: Int): MutableList -} - -@Entity -@Table(name = "users") -data class UserEntity( - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - var id: Long? = null, - var name: String, - var age: Int -){ - constructor() : this(null, "", 0) -} - - diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/AuthenticationController.kt b/src/main/kotlin/com/coded/spring/ordering/authentication/AuthenticationController.kt new file mode 100644 index 0000000..8eab987 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/authentication/AuthenticationController.kt @@ -0,0 +1,49 @@ +package com.coded.spring.ordering.authentication + +import com.coded.spring.ordering.authentication.jwt.JwtService +import org.springframework.security.authentication.* +import org.springframework.security.core.userdetails.UserDetailsService +import org.springframework.security.core.userdetails.UsernameNotFoundException +import org.springframework.web.bind.annotation.* + + +@RestController +@RequestMapping("/authentication") +class AuthController( + private val authenticationManager: AuthenticationManager, + private val userDetailsService: UserDetailsService, + private val jwtService: JwtService +) { + + // login page + @PostMapping("/login") + fun login(@RequestBody authRequest: AuthRequest): AuthResponse { + + // create a spring security authentication using the username and password from the request + val authToken = UsernamePasswordAuthenticationToken(authRequest.username, authRequest.password) + // then the credentials will be authenticated by authentication manager + val authentication = authenticationManager.authenticate(authToken) + + // check if authentication is successful + if (authentication.isAuthenticated) { + + // load the user details from the userDetailsService + val userDetails = userDetailsService.loadUserByUsername(authRequest.username) + // Uses a JWT (JSON Web Token) service to generate a token for the authenticated user. + val token = jwtService.generateToken(userDetails.username) + // Returns a response object containing the JWT token + return AuthResponse(token) + } else { + throw UsernameNotFoundException("Invalid user request!") + } + } +} + +data class AuthRequest( + val username: String, + val password: String +) + +data class AuthResponse( + val token: String +) \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/CustomUserDetailsClass.kt b/src/main/kotlin/com/coded/spring/ordering/authentication/CustomUserDetailsClass.kt new file mode 100644 index 0000000..3142b81 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/authentication/CustomUserDetailsClass.kt @@ -0,0 +1,28 @@ +package com.coded.spring.ordering.authentication + +import com.coded.spring.ordering.users.UserEntity +import com.coded.spring.ordering.users.UsersRepository +import jakarta.inject.Named +import org.springframework.security.core.userdetails.User +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 +class CustomUserDetailsClass( + private val usersRepository: UsersRepository +): UserDetailsService{ + + override fun loadUserByUsername(username: String): UserDetails { + val user: UserEntity = usersRepository.findByUsername(username) + ?: throw UsernameNotFoundException("User Not Found") + + return User.builder() + .username(user.username) + .password(user.password) + // .roles(user.role.toString()) + .build() + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt b/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt new file mode 100644 index 0000000..fae300c --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt @@ -0,0 +1,64 @@ +package com.coded.spring.ordering.authentication + +import com.coded.spring.ordering.authentication.jwt.JwtAuthFilter +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.web.builders.HttpSecurity +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity +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.crypto.password.PasswordEncoder +import org.springframework.security.web.SecurityFilterChain +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter + +@Configuration +@EnableWebSecurity +class SecurityConfig( + private val jwtAuthFilter: JwtAuthFilter, + private val userDetailsService: UserDetailsService +) { + + @Bean + fun passwordEncoder(): PasswordEncoder = BCryptPasswordEncoder() + + @Bean + fun securityFilterChain(http: HttpSecurity): SecurityFilterChain { + http.csrf { it.disable() } + .authorizeHttpRequests { + it + .requestMatchers("/authentication/**").permitAll() + // menu end points available for all users + .requestMatchers("/items/list").permitAll() + // registration endpoint + .requestMatchers("/register").permitAll() + // to submit orders (only for authenticated) + .requestMatchers("/orders/**").authenticated() + // rest of endpoints will need authentication + .anyRequest().authenticated() + } + .sessionManagement { + it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) + } + .authenticationProvider(authenticationProvider()) + .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter::class.java) + + return http.build(); + } + + @Bean + fun authenticationManager(config: AuthenticationConfiguration): AuthenticationManager = + config.authenticationManager + + @Bean + fun authenticationProvider(): AuthenticationProvider { + val provider = DaoAuthenticationProvider() + provider.setUserDetailsService(userDetailsService) + provider.setPasswordEncoder(passwordEncoder()) + return provider + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/jwt/JwtAuthFilter.kt b/src/main/kotlin/com/coded/spring/ordering/authentication/jwt/JwtAuthFilter.kt new file mode 100644 index 0000000..29ea88a --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/authentication/jwt/JwtAuthFilter.kt @@ -0,0 +1,45 @@ +package com.coded.spring.ordering.authentication.jwt + +import jakarta.servlet.FilterChain +import jakarta.servlet.http.* +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken +import org.springframework.security.core.context.SecurityContextHolder +import org.springframework.security.core.userdetails.UserDetailsService +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource +import org.springframework.stereotype.Component +import org.springframework.web.filter.OncePerRequestFilter + +@Component +class JwtAuthFilter( + private val jwtService: JwtService, + private val userDetailsService: UserDetailsService +) : OncePerRequestFilter() { + + override fun doFilterInternal( + request: HttpServletRequest, + response: HttpServletResponse, + filterChain: FilterChain + ) { + val authHeader = request.getHeader("Authorization") + if (authHeader == null || !authHeader.startsWith("Bearer ")){ + filterChain.doFilter(request, response) + return + } + + val token = authHeader.substring(7) + val username = jwtService.extractUsername(token) + + if (SecurityContextHolder.getContext().authentication == null) { + if (jwtService.isTokenValid(token, username)) { + val userDetails = userDetailsService.loadUserByUsername(username) + val authToken = UsernamePasswordAuthenticationToken( + userDetails, null, userDetails.authorities + ) + authToken.details = WebAuthenticationDetailsSource().buildDetails(request) + SecurityContextHolder.getContext().authentication = authToken + } + } + + filterChain.doFilter(request, response) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/jwt/JwtService.kt b/src/main/kotlin/com/coded/spring/ordering/authentication/jwt/JwtService.kt new file mode 100644 index 0000000..cb02f2a --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/authentication/jwt/JwtService.kt @@ -0,0 +1,50 @@ +package com.coded.spring.ordering.authentication.jwt + + +import io.jsonwebtoken.* +import java.util.* +import javax.crypto.SecretKey +import io.jsonwebtoken.SignatureAlgorithm +import io.jsonwebtoken.security.Keys +import org.springframework.stereotype.Component +import java.util.* + + +@Component +class JwtService { + + private val secretKey: SecretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256) + private val expirationsMs: Long = 1000 * 60 * 60 + + // generate token for the user + fun generateToken(username: String): String { + val now = Date() + val expiry = Date(now.time + expirationsMs) + + return Jwts.builder() + .setSubject(username) + .setIssuedAt(now) + .setExpiration(expiry) + .signWith(secretKey) + .compact() + } + + // extract username from the token itself + fun extractUsername(token: String): String = + Jwts.parserBuilder() + .setSigningKey(secretKey) + .build() + .parseClaimsJws(token) + .body + .subject + + // check if token is valid or not + fun isTokenValid(token: String, username: String): Boolean{ + return try { + extractUsername(token) == username + } catch (e: Exception){ + false + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/ItemsController.kt b/src/main/kotlin/com/coded/spring/ordering/items/ItemsController.kt similarity index 57% rename from src/main/kotlin/com/coded/spring/ordering/orders/ItemsController.kt rename to src/main/kotlin/com/coded/spring/ordering/items/ItemsController.kt index 7a5a84a..c0f9590 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/ItemsController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/items/ItemsController.kt @@ -1,6 +1,7 @@ -package com.coded.spring.ordering.orders +package com.coded.spring.ordering.items import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RestController @@ -11,4 +12,9 @@ class ItemsController( @GetMapping("/items/list") fun items() = itemsService.listItems() + +// @PostMapping("/items/create") +// fun addItems(request: CreateItemRequestDTO): ItemEntity{ +// +// } } \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/items/ItemsDTO.kt b/src/main/kotlin/com/coded/spring/ordering/items/ItemsDTO.kt new file mode 100644 index 0000000..2376903 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/items/ItemsDTO.kt @@ -0,0 +1,8 @@ +package com.coded.spring.ordering.items + +data class CreateItemRequestDTO( + + var name: String, + var quantity: Int, + var order_id: Int +) \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/ItemsRepository.kt b/src/main/kotlin/com/coded/spring/ordering/items/ItemsRepository.kt similarity index 91% rename from src/main/kotlin/com/coded/spring/ordering/orders/ItemsRepository.kt rename to src/main/kotlin/com/coded/spring/ordering/items/ItemsRepository.kt index e5dcadf..635356d 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/ItemsRepository.kt +++ b/src/main/kotlin/com/coded/spring/ordering/items/ItemsRepository.kt @@ -1,4 +1,4 @@ -package com.coded.spring.ordering.orders +package com.coded.spring.ordering.items import jakarta.inject.Named import jakarta.persistence.* diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/ItemsService.kt b/src/main/kotlin/com/coded/spring/ordering/items/ItemsService.kt similarity index 53% rename from src/main/kotlin/com/coded/spring/ordering/orders/ItemsService.kt rename to src/main/kotlin/com/coded/spring/ordering/items/ItemsService.kt index 389abd2..2aeb947 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/ItemsService.kt +++ b/src/main/kotlin/com/coded/spring/ordering/items/ItemsService.kt @@ -1,4 +1,4 @@ -package com.coded.spring.ordering.orders +package com.coded.spring.ordering.items import jakarta.inject.Named @@ -16,4 +16,15 @@ class ItemsService( ) } + + fun createItem(request: CreateItemRequestDTO): Any{ + val item = ItemEntity( + name = request.name, + quantity = request.quantity, + order_id = request.order_id + ) + return itemsRepository.save(item) + } + + } \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrderRepository.kt similarity index 78% rename from src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt rename to src/main/kotlin/com/coded/spring/ordering/orders/OrderRepository.kt index f13504d..ad15318 100644 --- a/src/main/kotlin/com/coded/spring/ordering/OrderRepository.kt +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrderRepository.kt @@ -1,8 +1,8 @@ -package com.coded.spring.ordering +package com.coded.spring.ordering.orders -import com.coded.spring.ordering.orders.ItemEntity -import com.coded.spring.ordering.users.User +import com.coded.spring.ordering.items.ItemEntity +import com.coded.spring.ordering.users.UserEntity import jakarta.inject.Named import jakarta.persistence.* import org.springframework.data.jpa.repository.JpaRepository diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt index 9b562a3..d71ad93 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt @@ -1,10 +1,7 @@ package com.coded.spring.ordering.orders -import com.coded.spring.ordering.OrderEntity -import com.coded.spring.ordering.OrderRepository -import com.coded.spring.ordering.UsersRepository +import com.coded.spring.ordering.users.UsersRepository import jakarta.inject.Named -import java.math.BigInteger @Named class OrderService( @@ -23,7 +20,11 @@ class OrderService( val newOrder = OrderEntity(user=user) // save order orderRepository.save(newOrder) - } -} +// val Items = request.items.map{ +// ItemEntity(name = it.) +// } +// } + +}} diff --git a/src/main/kotlin/com/coded/spring/ordering/users/UserRepository.kt b/src/main/kotlin/com/coded/spring/ordering/users/UserRepository.kt new file mode 100644 index 0000000..24c2b3c --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/users/UserRepository.kt @@ -0,0 +1,39 @@ +package com.coded.spring.ordering.users + +import jakarta.inject.Named +import jakarta.persistence.* +import org.springframework.data.jpa.repository.JpaRepository + +@Named +interface UsersRepository : JpaRepository { + fun age(age: Int): MutableList + fun findByUsername(username: String): UserEntity? + fun existsByUsername(username: String): Boolean +} + +@Entity +@Table(name = "users") +data class UserEntity( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + var name: String, + var age: Int, + + @Column(unique = true) // make sure it's unique + var username: String, + + var password: String, + +// @Enumerated(EnumType.STRING) +// val role: Roles = Roles.USER + +){ + constructor() : this(null, "", 0,"username","password") +} + +enum class Roles { + USER, ADMIN +} + + diff --git a/src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt b/src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt index 5c3c6af..5e08de5 100644 --- a/src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt @@ -1,13 +1,34 @@ package com.coded.spring.ordering.users +import RegistrationResponseDto +import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RestController +import com.coded.spring.ordering.users.RegistrationRequest + @RestController class UsersController( - private val usersService: UsersService + private val usersService: UsersService, + ){ @GetMapping("/users/list") fun users() = usersService.listUsers() + + @PostMapping("/register") + fun registerUser(@RequestBody request: RegistrationRequest): Any { + try { + val user = usersService.registerUsers(request) + return RegistrationResponseDto( + message = "User registered successfully", + username = user.username + ) + }catch (e: IllegalArgumentException){ + return ResponseEntity.badRequest().body(mapOf("error" to e.message)) + } + } + } \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/users/UsersDTO.kt b/src/main/kotlin/com/coded/spring/ordering/users/UsersDTO.kt new file mode 100644 index 0000000..5a45b75 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/users/UsersDTO.kt @@ -0,0 +1,19 @@ +// Change this: +data class RegistrationRequestDTO( + val name: String, + val age: Int, + val username: String, + val password: String +) +// To this: +data class RegistrationRequest( + val name: String, + val age: Int, + val username: String, + val password: String +) + +data class RegistrationResponseDto( + val message: String, + val username: String +) \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt b/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt index 95df4a1..07079af 100644 --- a/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt +++ b/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt @@ -1,19 +1,56 @@ package com.coded.spring.ordering.users -import com.coded.spring.ordering.UsersRepository import jakarta.inject.Named +import org.springframework.security.crypto.password.PasswordEncoder @Named class UsersService( private val usersRepository: UsersRepository, + private val passwordEncoder: PasswordEncoder // Added missing dependency ) { - fun listUsers(): List = usersRepository.findAll().map { User( id = it.id, name = it.name, - age = it.age + age = it.age, + ) + } + + fun registerUsers(request: RegistrationRequest): UserEntity { + + //check if username exists already + if(usersRepository.existsByUsername(request.username)){ + throw IllegalArgumentException("user name already exists") + } + + // Validate the password + val password = request.password + + // check pass length + if (password.length < 6) { + throw IllegalArgumentException("Password must be at least 6 characters long") + } + + // check if there's any uppercase letter + if (!password.any { it.isUpperCase() }) { + throw IllegalArgumentException("Password must contain at least one capital letter") + } + + // check if there's any digits + if (!password.any { it.isDigit() }) { + throw IllegalArgumentException("Password must contain at least one number") + } + + // create user + val user = UserEntity( + name = request.name, + age = request.age, + username = request.username, + password = passwordEncoder.encode(request.password) ) + + // save the user + return usersRepository.save(user) } } @@ -21,4 +58,12 @@ data class User( val id: Long?, val name: String, val age: Int -) \ No newline at end of file +) + +data class RegistrationRequest( + val name: String, + val age: Int, + val username: String, + val password: String +) + From 30313e59669210bc33c6d4d38966954c26c4c3af Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Fri, 18 Apr 2025 21:26:42 +0300 Subject: [PATCH 07/19] Online Ordering - User Authentication task completed --- .../ordering/authentication/SecurityConfig.kt | 2 +- .../spring/ordering/menu/MenuController.kt | 13 +++++++++ .../spring/ordering/menu/MenuRepository.kt | 27 +++++++++++++++++++ .../coded/spring/ordering/menu/MenuService.kt | 19 +++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/com/coded/spring/ordering/menu/MenuController.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/menu/MenuRepository.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/menu/MenuService.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt b/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt index fae300c..50b1185 100644 --- a/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt +++ b/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt @@ -33,7 +33,7 @@ class SecurityConfig( it .requestMatchers("/authentication/**").permitAll() // menu end points available for all users - .requestMatchers("/items/list").permitAll() + .requestMatchers("/menu").permitAll() // registration endpoint .requestMatchers("/register").permitAll() // to submit orders (only for authenticated) diff --git a/src/main/kotlin/com/coded/spring/ordering/menu/MenuController.kt b/src/main/kotlin/com/coded/spring/ordering/menu/MenuController.kt new file mode 100644 index 0000000..2698441 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/menu/MenuController.kt @@ -0,0 +1,13 @@ +package com.coded.spring.ordering.menu + +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +class MenuController( + private val menuService: MenuService +){ + + @GetMapping("menu") + fun menu() = menuService.listMenu() +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/menu/MenuRepository.kt b/src/main/kotlin/com/coded/spring/ordering/menu/MenuRepository.kt new file mode 100644 index 0000000..9def669 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/menu/MenuRepository.kt @@ -0,0 +1,27 @@ +package com.coded.spring.ordering.menu + +import jakarta.inject.Named +import jakarta.persistence.* +import org.springframework.data.jpa.repository.JpaRepository +import java.math.BigDecimal + +@Named +interface MenuRepository : JpaRepository{ + +} + +@Entity +@Table(name = "menu") +data class MenuEntity( + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + var name: String, + var price: BigDecimal, + var description: String + + +){ + constructor() : this(null, "", BigDecimal.ZERO, "") +} diff --git a/src/main/kotlin/com/coded/spring/ordering/menu/MenuService.kt b/src/main/kotlin/com/coded/spring/ordering/menu/MenuService.kt new file mode 100644 index 0000000..6926789 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/menu/MenuService.kt @@ -0,0 +1,19 @@ +package com.coded.spring.ordering.menu + +import jakarta.inject.Named + +@Named +class MenuService( + private val menuRepository: MenuRepository, +) { + + fun listMenu(): List = menuRepository.findAll().map { + MenuEntity( + id = it.id, + name = it.name, + price = it.price, + description = it.description + ) + } + +} \ No newline at end of file From 5fea0137d206382c8d3669f6507eccb42e190bab Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Sun, 20 Apr 2025 19:36:16 +0300 Subject: [PATCH 08/19] Profile task is completed --- .../ordering/authentication/SecurityConfig.kt | 1 + .../ordering/profiles/ProfilesController.kt | 22 ++++++++ .../spring/ordering/profiles/ProfilesDTO.kt | 16 ++++++ .../ordering/profiles/ProfilesRepository.kt | 33 ++++++++++++ .../ordering/profiles/ProfilesService.kt | 53 +++++++++++++++++++ 5 files changed, 125 insertions(+) create mode 100644 src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesController.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesDTO.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesRepository.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesService.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt b/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt index 50b1185..7c0c1ea 100644 --- a/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt +++ b/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt @@ -35,6 +35,7 @@ class SecurityConfig( // menu end points available for all users .requestMatchers("/menu").permitAll() // registration endpoint + .requestMatchers("/profile").authenticated() .requestMatchers("/register").permitAll() // to submit orders (only for authenticated) .requestMatchers("/orders/**").authenticated() diff --git a/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesController.kt b/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesController.kt new file mode 100644 index 0000000..d700271 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesController.kt @@ -0,0 +1,22 @@ +package com.coded.spring.ordering.profiles + +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.RestController + +@RestController +class ProfilesController( + private val profilesRepository: ProfilesRepository, + private val profilesService: ProfilesService +){ + // user creating profile + @PostMapping("/profile") + fun saveInfoKyc(@RequestBody request: ProfileRequestDto): Any { + try{ + return profilesService.creatOrUpdateProf(request) + } catch (e: IllegalArgumentException) { + return ResponseEntity.badRequest().body(mapOf("error" to e.message)) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesDTO.kt b/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesDTO.kt new file mode 100644 index 0000000..96fedea --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesDTO.kt @@ -0,0 +1,16 @@ +package com.coded.spring.ordering.profiles + +import com.coded.spring.ordering.users.UserEntity + +data class ProfileRequestDto( + val firstName: String, + val lastName: String, + val phoneNumber: String +) + +data class ProfileResponseDto( + val userId: Long, + val firstName: String, + val lastName: String, + val phoneNumber: String +) \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesRepository.kt b/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesRepository.kt new file mode 100644 index 0000000..5bbf828 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesRepository.kt @@ -0,0 +1,33 @@ +package com.coded.spring.ordering.profiles + + +import com.coded.spring.ordering.users.UserEntity +import jakarta.inject.Named +import jakarta.persistence.* +import org.springframework.data.jpa.repository.JpaRepository + + + +@Named +interface ProfilesRepository : JpaRepository { + fun findByUserId(userId: UserEntity): ProfileEntity? +} + +@Entity +@Table(name = "profiles") +data class ProfileEntity( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + + //one user can have one profile + @OneToOne + @JoinColumn(name = "user_id")// foreign key for Users(Id) + var userId: UserEntity, + + var firstName: String, + var lastName: String, + var phoneNumber: String, + +){ constructor() : this(null, UserEntity(), "", "", "") +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesService.kt b/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesService.kt new file mode 100644 index 0000000..2197a8f --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesService.kt @@ -0,0 +1,53 @@ +package com.coded.spring.ordering.profiles + +import com.coded.spring.ordering.users.UsersRepository +import jakarta.inject.Named +import org.springframework.security.core.context.SecurityContextHolder +import org.springframework.stereotype.Service + +@Service +open class ProfilesService( + private val profilesRepository: ProfilesRepository, + private val usersRepository: UsersRepository +) { + + // create or update info for profiles + fun creatOrUpdateProf(request: ProfileRequestDto): Any{ + + // get the username from the security contextholer + val username = SecurityContextHolder.getContext().authentication.name + + // check if user exists + val user = usersRepository.findByUsername(username) + ?: throw IllegalArgumentException("user not found") + + // check if user have a profile + val existingProfile = profilesRepository.findByUserId(user) + val profile = if( existingProfile != null){ + // update existing profile + val updateProfile = existingProfile.copy( + firstName = request.firstName, + lastName = request.lastName, + phoneNumber = request.phoneNumber + ) + profilesRepository.save(updateProfile) + } else { // if user doesn't have a profile + // create a new profile + val createProfile = ProfileEntity( + userId = user, + firstName = request.firstName, + lastName = request.lastName, + phoneNumber = request.phoneNumber, + ) + profilesRepository.save(createProfile) + } + + return ProfileResponseDto( + userId = user.id!!, + firstName = profile.firstName, + lastName = profile.lastName, + phoneNumber = profile.phoneNumber + ) + } + +} \ No newline at end of file From e310d755318e592c7d0aa880ab533c627ffbaa07 Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Mon, 28 Apr 2025 13:57:00 +0300 Subject: [PATCH 09/19] fixed itemsService, update orderService and include the ItemdDTO and map it correctly to prevent the exposure of sensitive data in the API --- pom.xml | 33 ++++++- .../coded/spring/ordering/LoggingFilter.kt | 40 ++++++++ .../ordering/authentication/SecurityConfig.kt | 6 +- .../spring/ordering/items/ItemsController.kt | 9 +- .../coded/spring/ordering/items/ItemsDTO.kt | 9 +- .../spring/ordering/items/ItemsRepository.kt | 8 +- .../spring/ordering/items/ItemsService.kt | 30 ++++-- .../spring/ordering/orders/OrderController.kt | 4 +- .../spring/ordering/orders/OrderRepository.kt | 2 +- .../spring/ordering/orders/OrderService.kt | 26 ++++-- .../coded/spring/ordering/orders/OrdersDTO.kt | 11 +++ .../ordering/profiles/ProfilesController.kt | 4 +- .../ordering/profiles/ProfilesService.kt | 4 +- .../ordering/{ => scripts}/InitUserRunner.kt | 3 +- src/main/resources/application.properties | 5 + .../coded/spring/ordering/ApplicationTests.kt | 93 ++++++++++++++++++- 16 files changed, 249 insertions(+), 38 deletions(-) create mode 100644 src/main/kotlin/com/coded/spring/ordering/LoggingFilter.kt create mode 100644 src/main/kotlin/com/coded/spring/ordering/orders/OrdersDTO.kt rename src/main/kotlin/com/coded/spring/ordering/{ => scripts}/InitUserRunner.kt (93%) diff --git a/pom.xml b/pom.xml index 39be955..7c3c41a 100644 --- a/pom.xml +++ b/pom.xml @@ -43,16 +43,42 @@ org.jetbrains.kotlin kotlin-reflect + + io.jsonwebtoken + jjwt-api + 0.11.5 + + + io.jsonwebtoken + jjwt-impl + runtime + 0.11.5 + + + io.jsonwebtoken + jjwt-jackson + runtime + 0.11.5 + org.jetbrains.kotlin kotlin-stdlib - + + org.postgresql + postgresql + compile + org.springframework.boot spring-boot-starter-test test + + com.h2database + h2 + test + org.jetbrains.kotlin kotlin-test-junit5 @@ -75,7 +101,10 @@ jakarta.inject-api 2.0.1 - + + org.springframework.boot + spring-boot-starter-security + diff --git a/src/main/kotlin/com/coded/spring/ordering/LoggingFilter.kt b/src/main/kotlin/com/coded/spring/ordering/LoggingFilter.kt new file mode 100644 index 0000000..23a4448 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/LoggingFilter.kt @@ -0,0 +1,40 @@ +package com.coded.spring.ordering + +import jakarta.servlet.FilterChain +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse +import org.springframework.stereotype.Component +import org.springframework.web.filter.OncePerRequestFilter +import org.springframework.web.util.ContentCachingRequestWrapper +import org.springframework.web.util.ContentCachingResponseWrapper + + +@Component +class LoggingFilter: OncePerRequestFilter() { + override fun doFilterInternal( + request: HttpServletRequest, + response: HttpServletResponse, + filterChain: FilterChain + ) { + + val cachedRequest = ContentCachingRequestWrapper(request) + val cachedResponse = ContentCachingResponseWrapper(response) + + filterChain.doFilter(cachedRequest, cachedResponse) + + logRequest(cachedRequest) + logResponse(cachedResponse) + cachedResponse.copyBodyToResponse() + } + + private fun logRequest(request: ContentCachingRequestWrapper){ + val requestBody = String(request.contentAsByteArray) + logger.info("Request: method=${request.method}, uri=${request.requestURI}, body=$requestBody") + } + + private fun logResponse(response: ContentCachingResponseWrapper) { + val responseBody = String(response.contentAsByteArray) + logger.info("Response: status=${response.status}, body=$responseBody") + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt b/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt index 7c0c1ea..6e66ac3 100644 --- a/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt +++ b/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt @@ -34,13 +34,15 @@ class SecurityConfig( .requestMatchers("/authentication/**").permitAll() // menu end points available for all users .requestMatchers("/menu").permitAll() + .requestMatchers("/hello").permitAll() // registration endpoint .requestMatchers("/profile").authenticated() .requestMatchers("/register").permitAll() // to submit orders (only for authenticated) - .requestMatchers("/orders/**").authenticated() + .requestMatchers("/orders/**").permitAll() + .requestMatchers("/items/create").permitAll() // rest of endpoints will need authentication - .anyRequest().authenticated() + //.anyRequest().authenticated() } .sessionManagement { it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) diff --git a/src/main/kotlin/com/coded/spring/ordering/items/ItemsController.kt b/src/main/kotlin/com/coded/spring/ordering/items/ItemsController.kt index c0f9590..c831644 100644 --- a/src/main/kotlin/com/coded/spring/ordering/items/ItemsController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/items/ItemsController.kt @@ -2,6 +2,7 @@ package com.coded.spring.ordering.items import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RestController @@ -13,8 +14,8 @@ class ItemsController( @GetMapping("/items/list") fun items() = itemsService.listItems() -// @PostMapping("/items/create") -// fun addItems(request: CreateItemRequestDTO): ItemEntity{ -// -// } + @PostMapping("/items/create") + fun addItems(@RequestBody request: CreateItemRequestDTO): ItemDTO { + return itemsService.createItem(request) + } } \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/items/ItemsDTO.kt b/src/main/kotlin/com/coded/spring/ordering/items/ItemsDTO.kt index 2376903..7b909d3 100644 --- a/src/main/kotlin/com/coded/spring/ordering/items/ItemsDTO.kt +++ b/src/main/kotlin/com/coded/spring/ordering/items/ItemsDTO.kt @@ -4,5 +4,12 @@ data class CreateItemRequestDTO( var name: String, var quantity: Int, - var order_id: Int + var order_id: Long +) + +data class ItemDTO( + val id: Long?, + val name: String, + val quantity: Int, + val orderId: Long? ) \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/items/ItemsRepository.kt b/src/main/kotlin/com/coded/spring/ordering/items/ItemsRepository.kt index 635356d..5a032c8 100644 --- a/src/main/kotlin/com/coded/spring/ordering/items/ItemsRepository.kt +++ b/src/main/kotlin/com/coded/spring/ordering/items/ItemsRepository.kt @@ -1,5 +1,6 @@ package com.coded.spring.ordering.items +import com.coded.spring.ordering.orders.OrderEntity import jakarta.inject.Named import jakarta.persistence.* import org.springframework.data.jpa.repository.JpaRepository @@ -15,11 +16,14 @@ data class ItemEntity( var id: Long? = null, var name: String, var quantity: Int, - var order_id: Int, + + @ManyToOne + @JoinColumn(name = "order_id") + var order: OrderEntity, // @Column("'name'") ){ - constructor(): this(null, "", 0, 0) + constructor(): this(null, "", 0, OrderEntity()) } \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/items/ItemsService.kt b/src/main/kotlin/com/coded/spring/ordering/items/ItemsService.kt index 2aeb947..1342f01 100644 --- a/src/main/kotlin/com/coded/spring/ordering/items/ItemsService.kt +++ b/src/main/kotlin/com/coded/spring/ordering/items/ItemsService.kt @@ -1,29 +1,43 @@ package com.coded.spring.ordering.items +import com.coded.spring.ordering.orders.OrderRepository import jakarta.inject.Named @Named class ItemsService( - private val itemsRepository: ItemsRepository + private val itemsRepository: ItemsRepository, + private val orderRepository: OrderRepository // Added to fetch orders + ) { - fun listItems(): List = itemsRepository.findAll().map { - ItemEntity( + fun listItems(): List = itemsRepository.findAll().map { + ItemDTO( id = it.id, - order_id = it.order_id, + name = it.name, quantity = it.quantity, - name = it.name + orderId = it.order.id ) } - fun createItem(request: CreateItemRequestDTO): Any{ + fun createItem(request: CreateItemRequestDTO): ItemDTO { + val order = orderRepository.findById(request.order_id) + .orElseThrow { IllegalArgumentException("Order not found with id: ${request.order_id}") } + val item = ItemEntity( name = request.name, quantity = request.quantity, - order_id = request.order_id + order = order + ) + + val savedItem = itemsRepository.save(item) + + return ItemDTO( + id = savedItem.id, + name = savedItem.name, + quantity = savedItem.quantity, + orderId = savedItem.order.id ) - return itemsRepository.save(item) } diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt index 5ad1037..0337aab 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt @@ -13,11 +13,11 @@ class OrderController( ) { - @GetMapping("/orders/orders-list") + @GetMapping("/orders/orders") fun orders() = orderService.listOrders() // create order - @PostMapping("/orders/orders-list") + @PostMapping("/orders/orders") fun createOrders(@RequestBody request: CreateOrderRequest){ return orderService.createOrder( userId = request.userId ) } diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderRepository.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrderRepository.kt index ad15318..1dea930 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/OrderRepository.kt +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrderRepository.kt @@ -21,7 +21,7 @@ data class OrderEntity( val user: UserEntity, // join - @OneToMany(mappedBy = "order_id") + @OneToMany(mappedBy = "order") val items: List? = null diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt index d71ad93..0a54c25 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt @@ -1,5 +1,6 @@ package com.coded.spring.ordering.orders +import com.coded.spring.ordering.items.ItemDTO import com.coded.spring.ordering.users.UsersRepository import jakarta.inject.Named @@ -10,8 +11,20 @@ class OrderService( ) { // listing orders - fun listOrders(): List = orderRepository.findAll().map{ - OrderEntity(id = it.id, user = it.user,items = it.items) + fun listOrders(): List = orderRepository.findAll().map { order -> + OrderDTO( + id = order.id, // transfer the orderId to dto + userId = order.user.id, + items = order.items?.map { item -> + // for each item in the order, create an ItemDTO + ItemDTO( + id = item.id, + name = item.name, + quantity = item.quantity, + orderId = order.id + ) + } + ) } // creating new order @@ -20,11 +33,6 @@ class OrderService( val newOrder = OrderEntity(user=user) // save order orderRepository.save(newOrder) - -// val Items = request.items.map{ -// ItemEntity(name = it.) -// } -// } - -}} + } +} diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrdersDTO.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrdersDTO.kt new file mode 100644 index 0000000..e9726b4 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrdersDTO.kt @@ -0,0 +1,11 @@ +package com.coded.spring.ordering.orders + +import com.coded.spring.ordering.items.ItemDTO + +// return this when user asking for order list +data class OrderDTO( + val id: Long?, + val userId: Long?, + val items: List? +) + diff --git a/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesController.kt b/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesController.kt index d700271..b98db49 100644 --- a/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesController.kt @@ -12,9 +12,9 @@ class ProfilesController( ){ // user creating profile @PostMapping("/profile") - fun saveInfoKyc(@RequestBody request: ProfileRequestDto): Any { + fun createOrUpdateProfile(@RequestBody request: ProfileRequestDto): Any { try{ - return profilesService.creatOrUpdateProf(request) + return profilesService.createOrUpdateProf(request) } catch (e: IllegalArgumentException) { return ResponseEntity.badRequest().body(mapOf("error" to e.message)) } diff --git a/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesService.kt b/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesService.kt index 2197a8f..b08210f 100644 --- a/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesService.kt +++ b/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesService.kt @@ -12,7 +12,7 @@ open class ProfilesService( ) { // create or update info for profiles - fun creatOrUpdateProf(request: ProfileRequestDto): Any{ + fun createOrUpdateProf(request: ProfileRequestDto): Any{ // get the username from the security contextholer val username = SecurityContextHolder.getContext().authentication.name @@ -23,6 +23,7 @@ open class ProfilesService( // check if user have a profile val existingProfile = profilesRepository.findByUserId(user) + val profile = if( existingProfile != null){ // update existing profile val updateProfile = existingProfile.copy( @@ -31,6 +32,7 @@ open class ProfilesService( phoneNumber = request.phoneNumber ) profilesRepository.save(updateProfile) + } else { // if user doesn't have a profile // create a new profile val createProfile = ProfileEntity( diff --git a/src/main/kotlin/com/coded/spring/ordering/InitUserRunner.kt b/src/main/kotlin/com/coded/spring/ordering/scripts/InitUserRunner.kt similarity index 93% rename from src/main/kotlin/com/coded/spring/ordering/InitUserRunner.kt rename to src/main/kotlin/com/coded/spring/ordering/scripts/InitUserRunner.kt index c39fc71..a2bbb6d 100644 --- a/src/main/kotlin/com/coded/spring/ordering/InitUserRunner.kt +++ b/src/main/kotlin/com/coded/spring/ordering/scripts/InitUserRunner.kt @@ -1,6 +1,5 @@ -package com.coded.spring.ordering +package com.coded.spring.ordering.scripts -import com.coded.spring.ordering.users.Roles import com.coded.spring.ordering.users.UserEntity import com.coded.spring.ordering.users.UsersRepository import org.springframework.boot.CommandLineRunner diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 3ebb263..c4f9d3a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,8 @@ spring.application.name=Kotlin.SpringbootV2 server.port=8081 + +spring.datasource.url=jdbc:postgresql://localhost:8080/myHelloDatabase +spring.datasource.username=postgres +spring.datasource.password=Barrak2000# +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect diff --git a/src/test/kotlin/com/coded/spring/ordering/ApplicationTests.kt b/src/test/kotlin/com/coded/spring/ordering/ApplicationTests.kt index b2e2320..eeb6f93 100644 --- a/src/test/kotlin/com/coded/spring/ordering/ApplicationTests.kt +++ b/src/test/kotlin/com/coded/spring/ordering/ApplicationTests.kt @@ -1,13 +1,102 @@ package com.coded.spring.ordering +import com.coded.spring.ordering.authentication.jwt.JwtService +import com.coded.spring.ordering.items.CreateItemRequestDTO +import com.coded.spring.ordering.items.ItemsRepository +import com.coded.spring.ordering.orders.OrderRepository +import com.coded.spring.ordering.users.UserEntity +import com.coded.spring.ordering.users.UsersRepository +import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment +import org.springframework.boot.test.web.client.TestRestTemplate +import org.springframework.boot.test.web.client.exchange +import org.springframework.boot.test.web.client.postForEntity +import org.springframework.http.HttpEntity +import org.springframework.http.HttpHeaders +import org.springframework.http.HttpMethod +import org.springframework.http.HttpStatus +import org.springframework.security.config.annotation.web.builders.HttpSecurity +import org.springframework.security.crypto.password.PasswordEncoder +import org.springframework.test.context.ActiveProfiles +import org.springframework.util.MultiValueMap +import kotlin.test.assertEquals -@SpringBootTest +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@ActiveProfiles("test") class ApplicationTests { + @Autowired + lateinit var restTemplate: TestRestTemplate + + companion object { + @JvmStatic + @BeforeAll + fun setUp( + @Autowired usersRepository: UsersRepository, + @Autowired passwordEncoder: PasswordEncoder, + @Autowired ordersRepository: OrderRepository, + @Autowired itemsRepository: ItemsRepository + ) { + + val testUser = UserEntity( + name = "test1", + age = 29, + username = "test2", + password = passwordEncoder.encode("testpass"), + ) + usersRepository.save(testUser) + } + } @Test - fun contextLoads() { + fun testHelloWorld(@Autowired jwtService: JwtService){ + val token = jwtService.generateToken("test2") + val headers = HttpHeaders( + MultiValueMap.fromSingleValue(mapOf("Authorization" to "Bearer $token")) + ) + val requestEntity = HttpEntity(headers) + + val result = restTemplate.exchange( + "/hello", + HttpMethod.GET, + requestEntity, + String::class.java + ) + assertEquals(HttpStatus.OK, result.statusCode) + assertEquals("Hello World!", result.body) } } +// @Autowired +// lateinit var restTemplate: TestRestTemplate +// +// @Test +// fun helloWorld() { +// +// val result = restTemplate.getForEntity( +// "/hello", +// String::class.java +// ) +// assertEquals(expected = HttpStatus.OK, actual = result?.statusCode) +// assertEquals(expected = "Hello World!", actual = result.body) +// } +// +// @Test +// fun createItem() { +// val result = restTemplate.postForEntity( +// "/items/create", +// CreateItemRequestDTO( +// name = "burger", +// quantity = 2, +// order_id = 3), +// Any::class.java) +// +// assertEquals(expected = HttpStatus.OK, actual = result?.statusCode) +// } +// +// } + + + From f6f48e760b34f160401371f625a615e56f939c20 Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Mon, 28 Apr 2025 18:04:40 +0300 Subject: [PATCH 10/19] set up swagger, added tags to the controller --- pom.xml | 5 +++++ .../ordering/authentication/AuthenticationController.kt | 2 ++ .../coded/spring/ordering/authentication/SecurityConfig.kt | 7 ++----- .../com/coded/spring/ordering/items/ItemsController.kt | 3 ++- .../com/coded/spring/ordering/menu/MenuController.kt | 2 ++ .../com/coded/spring/ordering/orders/OrderController.kt | 2 ++ .../coded/spring/ordering/profiles/ProfilesController.kt | 2 ++ .../com/coded/spring/ordering/users/UsersController.kt | 3 ++- src/main/resources/application.properties | 2 ++ 9 files changed, 21 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 7c3c41a..cfe1e2b 100644 --- a/pom.xml +++ b/pom.xml @@ -64,6 +64,11 @@ org.jetbrains.kotlin kotlin-stdlib + + org.springdoc + springdoc-openapi-starter-webmvc-api + 2.6.0 + org.postgresql postgresql diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/AuthenticationController.kt b/src/main/kotlin/com/coded/spring/ordering/authentication/AuthenticationController.kt index 8eab987..1ce28b4 100644 --- a/src/main/kotlin/com/coded/spring/ordering/authentication/AuthenticationController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/authentication/AuthenticationController.kt @@ -1,12 +1,14 @@ package com.coded.spring.ordering.authentication import com.coded.spring.ordering.authentication.jwt.JwtService +import io.swagger.v3.oas.annotations.tags.Tag import org.springframework.security.authentication.* import org.springframework.security.core.userdetails.UserDetailsService import org.springframework.security.core.userdetails.UsernameNotFoundException import org.springframework.web.bind.annotation.* +@Tag(name = "AuthenticationAPI") @RestController @RequestMapping("/authentication") class AuthController( diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt b/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt index 6e66ac3..f03184c 100644 --- a/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt +++ b/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt @@ -34,13 +34,10 @@ class SecurityConfig( .requestMatchers("/authentication/**").permitAll() // menu end points available for all users .requestMatchers("/menu").permitAll() - .requestMatchers("/hello").permitAll() + // swagger + .requestMatchers("/api-docs").permitAll() // registration endpoint - .requestMatchers("/profile").authenticated() .requestMatchers("/register").permitAll() - // to submit orders (only for authenticated) - .requestMatchers("/orders/**").permitAll() - .requestMatchers("/items/create").permitAll() // rest of endpoints will need authentication //.anyRequest().authenticated() } diff --git a/src/main/kotlin/com/coded/spring/ordering/items/ItemsController.kt b/src/main/kotlin/com/coded/spring/ordering/items/ItemsController.kt index c831644..16e50f5 100644 --- a/src/main/kotlin/com/coded/spring/ordering/items/ItemsController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/items/ItemsController.kt @@ -1,11 +1,12 @@ package com.coded.spring.ordering.items +import io.swagger.v3.oas.annotations.tags.Tag import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RestController - +@Tag(name = "ItemAPI") @RestController class ItemsController( private val itemsService: ItemsService diff --git a/src/main/kotlin/com/coded/spring/ordering/menu/MenuController.kt b/src/main/kotlin/com/coded/spring/ordering/menu/MenuController.kt index 2698441..66044f1 100644 --- a/src/main/kotlin/com/coded/spring/ordering/menu/MenuController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/menu/MenuController.kt @@ -1,8 +1,10 @@ package com.coded.spring.ordering.menu +import io.swagger.v3.oas.annotations.tags.Tag import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RestController +@Tag(name = "MenuAPI") @RestController class MenuController( private val menuService: MenuService diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt index 0337aab..0c4c97c 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt @@ -1,11 +1,13 @@ package com.coded.spring.ordering.orders import com.coded.spring.ordering.users.UsersService +import io.swagger.v3.oas.annotations.tags.Tag import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RestController +@Tag(name = "OrderAPI") @RestController class OrderController( private val orderService: OrderService, diff --git a/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesController.kt b/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesController.kt index b98db49..6329263 100644 --- a/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesController.kt @@ -1,10 +1,12 @@ package com.coded.spring.ordering.profiles +import io.swagger.v3.oas.annotations.tags.Tag 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.RestController +@Tag(name = "ProfileAPI") @RestController class ProfilesController( private val profilesRepository: ProfilesRepository, diff --git a/src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt b/src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt index 5e08de5..180ac7f 100644 --- a/src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt @@ -7,8 +7,9 @@ import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RestController import com.coded.spring.ordering.users.RegistrationRequest +import io.swagger.v3.oas.annotations.tags.Tag - +@Tag(name = "UserAPI") @RestController class UsersController( private val usersService: UsersService, diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c4f9d3a..38fb0f0 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -6,3 +6,5 @@ spring.datasource.url=jdbc:postgresql://localhost:8080/myHelloDatabase spring.datasource.username=postgres spring.datasource.password=Barrak2000# spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect + +springdoc.api-docs.path=/api-docs From 4390358a79d999496780bf660654174b182bba47 Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Mon, 28 Apr 2025 18:46:39 +0300 Subject: [PATCH 11/19] Online Ordering - Setup Swagger task completed --- .../ordering/files/Barrak-online-ordering-api-swagger-01.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/kotlin/com/coded/spring/ordering/files/Barrak-online-ordering-api-swagger-01.json diff --git a/src/main/kotlin/com/coded/spring/ordering/files/Barrak-online-ordering-api-swagger-01.json b/src/main/kotlin/com/coded/spring/ordering/files/Barrak-online-ordering-api-swagger-01.json new file mode 100644 index 0000000..195bf86 --- /dev/null +++ b/src/main/kotlin/com/coded/spring/ordering/files/Barrak-online-ordering-api-swagger-01.json @@ -0,0 +1 @@ +{"openapi":"3.0.1","info":{"title":"OpenAPI definition","version":"v0"},"servers":[{"url":"http://localhost:8081","description":"Generated server url"}],"paths":{"/register":{"post":{"tags":["UserAPI"],"operationId":"registerUser","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistrationRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/profile":{"post":{"tags":["ProfileAPI"],"operationId":"createOrUpdateProfile","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileRequestDto"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/orders/orders":{"get":{"tags":["OrderAPI"],"operationId":"orders","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrderDTO"}}}}}}},"post":{"tags":["OrderAPI"],"operationId":"createOrders","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrderRequest"}}},"required":true},"responses":{"200":{"description":"OK"}}}},"/items/create":{"post":{"tags":["ItemAPI"],"operationId":"addItems","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateItemRequestDTO"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ItemDTO"}}}}}}},"/authentication/login":{"post":{"tags":["AuthenticationAPI"],"operationId":"login","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}}}}},"/users/list":{"get":{"tags":["UserAPI"],"operationId":"users","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/User"}}}}}}}},"/restaurants":{"get":{"tags":["hello-world-controller"],"operationId":"resturant","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/orders":{"get":{"tags":["hello-world-controller"],"operationId":"getOrders","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrderEntity"}}}}}}}},"/my-name":{"get":{"tags":["hello-world-controller"],"operationId":"getName","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserEntity"}}}}}}}},"/menu":{"get":{"tags":["MenuAPI"],"operationId":"menu","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuEntity"}}}}}}}},"/items/list":{"get":{"tags":["ItemAPI"],"operationId":"items","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Unit"}}}}}}}},"/hello":{"get":{"tags":["hello-world-controller"],"operationId":"helloWorld","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/cart":{"get":{"tags":["hello-world-controller"],"operationId":"cart","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/Settings":{"get":{"tags":["hello-world-controller"],"operationId":"settings","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"RegistrationRequest":{"required":["age","name","password","username"],"type":"object","properties":{"name":{"type":"string"},"age":{"type":"integer","format":"int32"},"username":{"type":"string"},"password":{"type":"string"}}},"ProfileRequestDto":{"required":["firstName","lastName","phoneNumber"],"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"phoneNumber":{"type":"string"}}},"CreateOrderRequest":{"required":["userId"],"type":"object","properties":{"userId":{"type":"integer","format":"int64"}}},"CreateItemRequestDTO":{"required":["name","order_id","quantity"],"type":"object","properties":{"name":{"type":"string"},"quantity":{"type":"integer","format":"int32"},"order_id":{"type":"integer","format":"int64"}}},"ItemDTO":{"required":["name","quantity"],"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"quantity":{"type":"integer","format":"int32"},"orderId":{"type":"integer","format":"int64"}}},"AuthRequest":{"required":["password","username"],"type":"object","properties":{"username":{"type":"string"},"password":{"type":"string"}}},"AuthResponse":{"required":["token"],"type":"object","properties":{"token":{"type":"string"}}},"User":{"required":["age","name"],"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"age":{"type":"integer","format":"int32"}}},"ItemEntity":{"required":["name","order","quantity"],"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"quantity":{"type":"integer","format":"int32"},"order":{"$ref":"#/components/schemas/OrderEntity"}}},"OrderEntity":{"required":["user"],"type":"object","properties":{"id":{"type":"integer","format":"int64"},"user":{"$ref":"#/components/schemas/UserEntity"},"items":{"type":"array","items":{"$ref":"#/components/schemas/ItemEntity"}}}},"UserEntity":{"required":["age","name","password","username"],"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"age":{"type":"integer","format":"int32"},"username":{"type":"string"},"password":{"type":"string"}}},"OrderDTO":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"userId":{"type":"integer","format":"int64"},"items":{"type":"array","items":{"$ref":"#/components/schemas/ItemDTO"}}}},"MenuEntity":{"required":["description","name","price"],"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"price":{"type":"number"},"description":{"type":"string"}}},"Unit":{"type":"object"}}}} \ No newline at end of file From a3320eb66b77ee9becde48830eab92eaabc226d2 Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Mon, 28 Apr 2025 20:35:56 +0300 Subject: [PATCH 12/19] creating a configuarion --- pom.xml | 5 +++++ src/main/kotlin/com/coded/spring/ordering/Application.kt | 7 +++++++ .../com/coded/spring/ordering/HelloWorldController.kt | 7 +++++-- .../coded/spring/ordering/authentication/SecurityConfig.kt | 1 + 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index cfe1e2b..d172239 100644 --- a/pom.xml +++ b/pom.xml @@ -74,6 +74,11 @@ postgresql compile + + com.hazelcast + hazelcast + 5.3.8 + org.springframework.boot spring-boot-starter-test diff --git a/src/main/kotlin/com/coded/spring/ordering/Application.kt b/src/main/kotlin/com/coded/spring/ordering/Application.kt index 8554e49..08a9aa1 100644 --- a/src/main/kotlin/com/coded/spring/ordering/Application.kt +++ b/src/main/kotlin/com/coded/spring/ordering/Application.kt @@ -2,6 +2,10 @@ package com.coded.spring.ordering import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication +import com.hazelcast.config.Config; +import com.hazelcast.core.Hazelcast +import com.hazelcast.core.HazelcastInstance + @SpringBootApplication class Application @@ -9,3 +13,6 @@ class Application fun main(args: Array) { runApplication(*args) } + +val orderingConfig = Config("Ordering-config") +val serverCache: HazelcastInstance = Hazelcast.newHazelcastInstance(orderingConfig) \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt index 038ab20..6472d2c 100644 --- a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt @@ -5,6 +5,7 @@ import com.coded.spring.ordering.orders.OrderEntity import com.coded.spring.ordering.orders.OrderRepository import com.coded.spring.ordering.users.UserEntity import com.coded.spring.ordering.users.UsersRepository +import org.springframework.beans.factory.annotation.Value import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody @@ -13,11 +14,13 @@ import org.springframework.web.bind.annotation.RestController @RestController class HelloWorldController( val usersRepository: UsersRepository, - val orderRepository: OrderRepository + val orderRepository: OrderRepository, + @Value("\${server-welcome-message}") + val welcomeMessage: String ){ @GetMapping("/hello") - fun helloWorld() = "Hello World!" + fun helloWorld() = "$welcomeMessage Barrak" @GetMapping("/cart") diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt b/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt index f03184c..f084756 100644 --- a/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt +++ b/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt @@ -32,6 +32,7 @@ class SecurityConfig( .authorizeHttpRequests { it .requestMatchers("/authentication/**").permitAll() + .requestMatchers("/hello").permitAll() // menu end points available for all users .requestMatchers("/menu").permitAll() // swagger From 62e10c9c7435c5c83067bb1d7bc92019cd80bd69 Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Tue, 29 Apr 2025 00:00:25 +0300 Subject: [PATCH 13/19] Online Ordering - Configuration Task is completed --- pom.xml | 21 +++++++++---------- .../spring/ordering/HelloWorldController.kt | 17 +++++++++++++-- .../coded/spring/ordering/menu/MenuService.kt | 13 +++++++++++- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/pom.xml b/pom.xml index d172239..adc6e78 100644 --- a/pom.xml +++ b/pom.xml @@ -72,7 +72,6 @@ org.postgresql postgresql - compile com.hazelcast @@ -84,11 +83,11 @@ spring-boot-starter-test test - - com.h2database - h2 - test - + + + + + org.jetbrains.kotlin kotlin-test-junit5 @@ -100,11 +99,11 @@ spring-boot-starter-data-jpa - - com.h2database - h2 - runtime - + + + + + jakarta.inject diff --git a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt index 6472d2c..f5be06b 100644 --- a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt @@ -15,12 +15,25 @@ import org.springframework.web.bind.annotation.RestController class HelloWorldController( val usersRepository: UsersRepository, val orderRepository: OrderRepository, + + // welcome endpoint @Value("\${server-welcome-message}") - val welcomeMessage: String + val welcomeMessage: String, + //the feature + @Value("\${feature.festive.enabled:false}") + val festiveStatus: Boolean, + + @Value("\${festive-welcome-message: Eidkom Mubarak}") + private val festiveWelcomeMessage: String ){ @GetMapping("/hello") - fun helloWorld() = "$welcomeMessage Barrak" + + fun helloWorld() = if(festiveStatus){ + festiveWelcomeMessage + }else { + "$welcomeMessage Barrak" + } @GetMapping("/cart") diff --git a/src/main/kotlin/com/coded/spring/ordering/menu/MenuService.kt b/src/main/kotlin/com/coded/spring/ordering/menu/MenuService.kt index 6926789..b40140c 100644 --- a/src/main/kotlin/com/coded/spring/ordering/menu/MenuService.kt +++ b/src/main/kotlin/com/coded/spring/ordering/menu/MenuService.kt @@ -1,17 +1,28 @@ package com.coded.spring.ordering.menu import jakarta.inject.Named +import org.springframework.beans.factory.annotation.Value +import java.math.BigDecimal +import java.math.RoundingMode @Named class MenuService( private val menuRepository: MenuRepository, + + @Value("\${feature.festive.enabled:false}") + val festiveStatus: Boolean, ) { fun listMenu(): List = menuRepository.findAll().map { MenuEntity( id = it.id, name = it.name, - price = it.price, + price = if(festiveStatus) { + // discount the price by 20% + it.price.multiply(BigDecimal("0.8")) + } else{ + it.price + }, description = it.description ) } From 6d1e1531938a8d28ceb823d90314a4c27e925b33 Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Tue, 29 Apr 2025 22:26:51 +0300 Subject: [PATCH 14/19] working on the tests, changes some implementations for better use of the code in the testig part. test is working as h2 instead of postgress --- pom.xml | 11 +- .../kotlin/com/coded/spring - Shortcut.lnk | Bin 0 -> 1773 bytes .../spring/ordering/HelloWorldController.kt | 2 +- .../ordering/authentication/SecurityConfig.kt | 2 +- .../spring/ordering/orders/OrderController.kt | 5 +- .../coded/spring/ordering/orders/OrdersDTO.kt | 3 + .../coded/spring/ordering/ApplicationTests.kt | 250 +++++++++++++----- .../resources/application-test.properties | 10 + 8 files changed, 214 insertions(+), 69 deletions(-) create mode 100644 src/main/kotlin/com/coded/spring - Shortcut.lnk create mode 100644 src/test/resources/application-test.properties diff --git a/pom.xml b/pom.xml index adc6e78..6bd37a6 100644 --- a/pom.xml +++ b/pom.xml @@ -72,6 +72,7 @@ org.postgresql postgresql + compile com.hazelcast @@ -83,11 +84,11 @@ spring-boot-starter-test test - - - - - + + com.h2database + h2 + test + org.jetbrains.kotlin kotlin-test-junit5 diff --git a/src/main/kotlin/com/coded/spring - Shortcut.lnk b/src/main/kotlin/com/coded/spring - Shortcut.lnk new file mode 100644 index 0000000000000000000000000000000000000000..f6e78c93b067f2d05ebe22877adb85223aff02a9 GIT binary patch literal 1773 zcmd5+Sx8h-82(0sv~|pdk}`_|gD~@<#WE~S$CMnHl)4=XaD}?eE%s0U`dK04fIKk z!u^PYmBtemyqeZ>ZqO16DdQ8b4qC!<{TST~4~*U#n}q4MoVz!A<_?yw=$fo>WcP|fhBOiWL!A$}r zp~ApxRz9d!*lV4dJ3SkD2I4N|R4|PAsA4SL&|?eZ0Vf+~SnQ~U6B=QrBb&BT&}g8x zO4Jg6&|BxrbOh8oUrnXoAFRm6TEoH~#k+}5vCr$5FzyUirq*6K&r(7@2jN8>e8_|Y z0jP3ZgG$=ry$Wf0CRQ1i_b9$iR%ogVi-s-v$daC&r4QIZs>uoui_i2@6e?Uao`ls= zNcGM-ACMD;byIq6lUV2f!1_Mai+aimd(3%WGmI8$u)-rV0xTN=Z{b6RlBqCZW^^{f zW6A<&IXYICzy6O{b^qQyVwlq=EFNCYyH0WX$w!Vg%ql%=t|(UVTC1XCr9I)hb6A-g z$I4g{Rz;$fuOJ_O1t$Bj}fRHsK45o__xG9J=g5O){&m<_bBvffaGa`v27K$hj zH|X};)>6+++VtpS){~!2X$sx?QF6HEWc9tH9>>nOx9>}5eM`9ZqHUeMbY<7y_776w z#RF{vgf-t`cYMj}eVUKGMV-I;6Wg`wnZ2~m6^-d6pe@NaIhIaYyl-(=m>ukSftDf2e8- z(kr>D(mLOsKq7COzvS1n#{P6{bY^)$Y~$O_5-np!=@dQC=i zmAwZRlW>6DDfI;xn*+8^TV7^+?&hXxv|h^xY$QDieStgMI#yoV@$u*O=bt3Qc#qp} DFD8Eg literal 0 HcmV?d00001 diff --git a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt index f5be06b..e0ce963 100644 --- a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt @@ -17,7 +17,7 @@ class HelloWorldController( val orderRepository: OrderRepository, // welcome endpoint - @Value("\${server-welcome-message}") + @Value("\${server-welcome-message:test}") val welcomeMessage: String, //the feature @Value("\${feature.festive.enabled:false}") diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt b/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt index f084756..11beb1d 100644 --- a/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt +++ b/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt @@ -40,7 +40,7 @@ class SecurityConfig( // registration endpoint .requestMatchers("/register").permitAll() // rest of endpoints will need authentication - //.anyRequest().authenticated() + .anyRequest().authenticated() } .sessionManagement { it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt index 0c4c97c..3a885d4 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt @@ -16,7 +16,10 @@ class OrderController( ) { @GetMapping("/orders/orders") - fun orders() = orderService.listOrders() + fun orders(): OrdersListDTO { + val ordersList = orderService.listOrders() + return OrdersListDTO(orders = ordersList) + } // create order @PostMapping("/orders/orders") diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrdersDTO.kt b/src/main/kotlin/com/coded/spring/ordering/orders/OrdersDTO.kt index e9726b4..746f805 100644 --- a/src/main/kotlin/com/coded/spring/ordering/orders/OrdersDTO.kt +++ b/src/main/kotlin/com/coded/spring/ordering/orders/OrdersDTO.kt @@ -9,3 +9,6 @@ data class OrderDTO( val items: List? ) +data class OrdersListDTO( + val orders: List +) \ No newline at end of file diff --git a/src/test/kotlin/com/coded/spring/ordering/ApplicationTests.kt b/src/test/kotlin/com/coded/spring/ordering/ApplicationTests.kt index eeb6f93..b26b5b4 100644 --- a/src/test/kotlin/com/coded/spring/ordering/ApplicationTests.kt +++ b/src/test/kotlin/com/coded/spring/ordering/ApplicationTests.kt @@ -1,12 +1,22 @@ package com.coded.spring.ordering +import RegistrationResponseDto +import com.coded.spring.ordering.authentication.AuthRequest +import com.coded.spring.ordering.authentication.AuthResponse import com.coded.spring.ordering.authentication.jwt.JwtService import com.coded.spring.ordering.items.CreateItemRequestDTO import com.coded.spring.ordering.items.ItemsRepository +import com.coded.spring.ordering.orders.CreateOrderRequest +import com.coded.spring.ordering.orders.OrderDTO import com.coded.spring.ordering.orders.OrderRepository +import com.coded.spring.ordering.orders.OrdersListDTO +import com.coded.spring.ordering.users.RegistrationRequest import com.coded.spring.ordering.users.UserEntity import com.coded.spring.ordering.users.UsersRepository +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Assertions.assertNotNull import org.junit.jupiter.api.BeforeAll +import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest @@ -14,89 +24,207 @@ import org.springframework.boot.test.context.SpringBootTest.WebEnvironment import org.springframework.boot.test.web.client.TestRestTemplate import org.springframework.boot.test.web.client.exchange import org.springframework.boot.test.web.client.postForEntity -import org.springframework.http.HttpEntity -import org.springframework.http.HttpHeaders -import org.springframework.http.HttpMethod -import org.springframework.http.HttpStatus +import org.springframework.context.annotation.Profile +import org.springframework.http.* import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.crypto.password.PasswordEncoder import org.springframework.test.context.ActiveProfiles import org.springframework.util.MultiValueMap import kotlin.test.assertEquals +import kotlin.test.assertTrue -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@ActiveProfiles("test") +@SpringBootTest( + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, +) class ApplicationTests { - @Autowired - lateinit var restTemplate: TestRestTemplate companion object { - @JvmStatic - @BeforeAll - fun setUp( + val testUser = "Yousef91" + val testPassword = "Test123456" + + @JvmStatic + @BeforeAll + fun setup( + @Autowired usersRepository: UsersRepository, - @Autowired passwordEncoder: PasswordEncoder, - @Autowired ordersRepository: OrderRepository, - @Autowired itemsRepository: ItemsRepository + @Autowired passwordEncoder: PasswordEncoder ) { - val testUser = UserEntity( - name = "test1", - age = 29, - username = "test2", - password = passwordEncoder.encode("testpass"), - ) - usersRepository.save(testUser) - } + val test = UserEntity( + name = "Yousef Al Othman", + age = 25, + username = testUser, + password = passwordEncoder.encode(testPassword) + ) + usersRepository.save(test) + } + } + + @Autowired + lateinit var restTemplate: TestRestTemplate + @Autowired + lateinit var usersRepository: UsersRepository + + // a helper function to get jwt token + fun getAuthToken(): String { + // create a authentication request with test credentials + val login = AuthRequest( + username = testUser, + password = testPassword + ) + + // send an http post request to the login endpoint + val response: ResponseEntity = restTemplate.postForEntity( + "/authentication/login", + login, + AuthResponse::class.java + ) + + Assertions.assertEquals(HttpStatus.OK, response.statusCode) //check status code + assertNotNull(response.body) //check that response.body is not null + + return response.body?.token ?: throw AssertionError("Token is null") + + } + + // function to create the authentication request + fun authRequest(body: T, token: String): HttpEntity{ + val headers = HttpHeaders() + headers.setBearerAuth(token) + return HttpEntity(body, headers) } + + // 1st test @Test - fun testHelloWorld(@Autowired jwtService: JwtService){ - val token = jwtService.generateToken("test2") - val headers = HttpHeaders( - MultiValueMap.fromSingleValue(mapOf("Authorization" to "Bearer $token")) + fun `As a user, I can login and get jwt token`(){ + // create a authentication request with test credentials + val login = AuthRequest( + username = testUser, + password = testPassword ) - val requestEntity = HttpEntity(headers) - val result = restTemplate.exchange( - "/hello", - HttpMethod.GET, - requestEntity, - String::class.java + // send a http post request to the login endpoint + val response: ResponseEntity = restTemplate.postForEntity( + "/authentication/login", + login, + AuthResponse::class.java ) - assertEquals(HttpStatus.OK, result.statusCode) - assertEquals("Hello World!", result.body) + + Assertions.assertEquals(HttpStatus.OK, response.statusCode) //check status code + assertNotNull(response.body) //check that response.body is not null } -} -// @Autowired -// lateinit var restTemplate: TestRestTemplate -// -// @Test -// fun helloWorld() { -// -// val result = restTemplate.getForEntity( -// "/hello", -// String::class.java + //registration + @Test + fun `As a developer, I can test user regastration endpoint`(){ + // create a regastration request + val regastration = RegistrationRequest( + username = "userRegistration", + password = testPassword, + age = 30, + name = "Nemo" + ) + + // send http post request to the regastration endpoint + val response: ResponseEntity = restTemplate.postForEntity( + "/register", + regastration, + RegistrationResponseDto::class.java + ) + + Assertions.assertEquals(HttpStatus.OK, response.statusCode) //check status code + Assertions.assertEquals("userRegistration", response.body?.username) // check if username matches + // Verify the user was saved in database + val savedUser = usersRepository.findByUsername("userRegistration") + assertNotNull(savedUser) + + } + + + + // 3rd test + @Test + fun `As a developer, I can test creating orders`(){ + //get authentication token + val token = getAuthToken() + + //get user id + val user = usersRepository.findByUsername(testUser) + assertNotNull(user) + + // create order + val order = CreateOrderRequest( + userId = user?.id!! + ) + //1st order + val response1: ResponseEntity = restTemplate.postForEntity( + "/orders/orders", + authRequest(order, token), + Any::class.java + ) + assertEquals(HttpStatus.OK, response1.statusCode) // check status code + + //2nd order + val response2: ResponseEntity = restTemplate.postForEntity( + "/orders/orders", + authRequest(order, token), + Any::class.java + ) + assertEquals(HttpStatus.OK, response2.statusCode) // check status code + + + }// 4th test + @Test + fun `As a developer, I can test reading orders list`(){ + //get authentication token + val token = getAuthToken() + + //get user id + val user = usersRepository.findByUsername(testUser) + assertNotNull(user) + + // create order +// val order = CreateOrderRequest( +// userId = user?.id!! // ) -// assertEquals(expected = HttpStatus.OK, actual = result?.statusCode) -// assertEquals(expected = "Hello World!", actual = result.body) -// } -// -// @Test -// fun createItem() { -// val result = restTemplate.postForEntity( -// "/items/create", -// CreateItemRequestDTO( -// name = "burger", -// quantity = 2, -// order_id = 3), -// Any::class.java) -// -// assertEquals(expected = HttpStatus.OK, actual = result?.statusCode) -// } +// //1st order +// val response1: ResponseEntity = restTemplate.postForEntity( +// "/orders/orders", +// authRequest(order, token), +// Any::class.java +// ) +// assertEquals(HttpStatus.OK, response1.statusCode) // check status code // -// } +// //2nd order +// val response2: ResponseEntity = restTemplate.postForEntity( +// "/orders/orders", +// authRequest(order, token), +// Any::class.java +// ) +// assertEquals(HttpStatus.OK, response2.statusCode) // check status code + + // create authenticated get request + val headers = HttpHeaders() + headers.setBearerAuth(token) + val getRequest = HttpEntity(headers) + // get the orders + val response: ResponseEntity = restTemplate.exchange( + "/orders/orders", + HttpMethod.GET, + getRequest, + OrdersListDTO::class.java + ) + + assertEquals(HttpStatus.OK, response.statusCode) // check status code + val orders = response.body + assertNotNull(orders) // checking orders is not null + assertEquals(2, response.body?.orders?.size)// making sure there's 2 orders in the list + + //verify all orders belong to the same user + + } +} \ No newline at end of file diff --git a/src/test/resources/application-test.properties b/src/test/resources/application-test.properties new file mode 100644 index 0000000..a3a4208 --- /dev/null +++ b/src/test/resources/application-test.properties @@ -0,0 +1,10 @@ +spring.application.name=Kotlin.SpringbootV2 +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password= +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.show-sql=true +spring.h2.console.enabled=true +spring.h2.console.path=/h2-console \ No newline at end of file From afc627042445e5b06baa6b93e0614cd2e0b51b4f Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Wed, 30 Apr 2025 17:07:06 +0300 Subject: [PATCH 15/19] All tests passed --- .../coded/spring/ordering/items/ItemsDTO.kt | 4 + .../coded/spring/ordering/ApplicationTests.kt | 117 ++++++++++++++++++ 2 files changed, 121 insertions(+) diff --git a/src/main/kotlin/com/coded/spring/ordering/items/ItemsDTO.kt b/src/main/kotlin/com/coded/spring/ordering/items/ItemsDTO.kt index 7b909d3..6785ebd 100644 --- a/src/main/kotlin/com/coded/spring/ordering/items/ItemsDTO.kt +++ b/src/main/kotlin/com/coded/spring/ordering/items/ItemsDTO.kt @@ -12,4 +12,8 @@ data class ItemDTO( val name: String, val quantity: Int, val orderId: Long? +) + +data class ItemsListDTO( + val items: List ) \ No newline at end of file diff --git a/src/test/kotlin/com/coded/spring/ordering/ApplicationTests.kt b/src/test/kotlin/com/coded/spring/ordering/ApplicationTests.kt index b26b5b4..18278f6 100644 --- a/src/test/kotlin/com/coded/spring/ordering/ApplicationTests.kt +++ b/src/test/kotlin/com/coded/spring/ordering/ApplicationTests.kt @@ -5,11 +5,15 @@ import com.coded.spring.ordering.authentication.AuthRequest import com.coded.spring.ordering.authentication.AuthResponse import com.coded.spring.ordering.authentication.jwt.JwtService import com.coded.spring.ordering.items.CreateItemRequestDTO +import com.coded.spring.ordering.items.ItemDTO +import com.coded.spring.ordering.items.ItemsListDTO import com.coded.spring.ordering.items.ItemsRepository import com.coded.spring.ordering.orders.CreateOrderRequest import com.coded.spring.ordering.orders.OrderDTO import com.coded.spring.ordering.orders.OrderRepository import com.coded.spring.ordering.orders.OrdersListDTO +import com.coded.spring.ordering.profiles.ProfileRequestDto +import com.coded.spring.ordering.profiles.ProfileResponseDto import com.coded.spring.ordering.users.RegistrationRequest import com.coded.spring.ordering.users.UserEntity import com.coded.spring.ordering.users.UsersRepository @@ -23,6 +27,7 @@ import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.context.SpringBootTest.WebEnvironment import org.springframework.boot.test.web.client.TestRestTemplate import org.springframework.boot.test.web.client.exchange +import org.springframework.boot.test.web.client.getForEntity import org.springframework.boot.test.web.client.postForEntity import org.springframework.context.annotation.Profile import org.springframework.http.* @@ -30,6 +35,7 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.crypto.password.PasswordEncoder import org.springframework.test.context.ActiveProfiles import org.springframework.util.MultiValueMap +import kotlin.reflect.jvm.internal.impl.load.kotlin.JvmType import kotlin.test.assertEquals import kotlin.test.assertTrue @@ -226,5 +232,116 @@ class ApplicationTests { } + //5th test + @Test + fun `as a developer, I can test a user can create profile`(){ + val token = getAuthToken() + + // create profile + val createProfile = ProfileRequestDto( + firstName = "Harvey", + lastName = "Specter", + phoneNumber = "333-111-3333" + ) + //create response + val response: ResponseEntity = restTemplate.postForEntity( + "/profile", + authRequest(createProfile, token), + ProfileResponseDto::class.java + ) + //verify responses + assertEquals(HttpStatus.OK, response.statusCode) + assertEquals("Harvey", response.body?.firstName) + assertEquals("Specter", response.body?.lastName) + assertEquals("333-111-3333", response.body?.phoneNumber) + } + + //6th test + @Test + fun `as a developer, I can test a user can update profile`(){ + val token = getAuthToken() + + val updateProfile = ProfileRequestDto( + firstName = "Mike", + lastName = "Ross", + phoneNumber = "111-222-2222" + ) + val response2: ResponseEntity = restTemplate.postForEntity( + "/profile", + authRequest(updateProfile, token), + ProfileResponseDto::class.java + ) + + assertEquals(HttpStatus.OK, response2.statusCode) + assertEquals("Mike", response2.body?.firstName) + assertEquals("Ross", response2.body?.lastName) + assertEquals("111-222-2222", response2.body?.phoneNumber) + } + + //7th test + @Test + fun `As a developer, I can add items to an order`(){ + val token = getAuthToken() + + //get user id + val user = usersRepository.findByUsername(testUser) + assertNotNull(user) + + // Add items to the order + val item1 = CreateItemRequestDTO( + name = "Machboos", + quantity = 1, + order_id = user?.id!! + ) + + val item2 = CreateItemRequestDTO( + name = "Laban", + quantity = 4, + order_id = user.id!! + ) + + // Create items + restTemplate.postForEntity( + "/items/create", + authRequest(item1, token), + ItemDTO::class.java + ) + + restTemplate.postForEntity( + "/items/create", + authRequest(item2, token), + ItemDTO::class.java + ) + + // Get the order id + val headers = HttpHeaders() + headers.setBearerAuth(token) + val getRequest = HttpEntity(headers) + + // list items + val response: ResponseEntity = restTemplate.exchange( + "/orders/orders", + HttpMethod.GET, + getRequest, + ItemsListDTO::class.java + + ) + assertEquals(HttpStatus.OK, response.statusCode) + val items = response.body + assertNotNull(items) + } + + //8th test + @Test + fun `as a developer, I can test reading the menu`(){ + + val response = restTemplate.getForEntity( + "/menu", + Object::class.java + ) + assertEquals(HttpStatus.OK, response.statusCode) + assertNotNull(response) + + } } \ No newline at end of file From c5e47148995e90c50c9a642347a484ad01f5cb65 Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Thu, 1 May 2025 15:13:29 +0300 Subject: [PATCH 16/19] Authentication module is ready and the server booted up --- authentication/pom.xml | 15 ++++ .../AuthenticationApplication.kt | 11 +++ .../AuthenticationController.kt | 35 +++++++- .../authentication/CustomUserDetailsClass.kt | 6 +- .../kotlin/authentication/LoggingFilter.kt | 40 +++++++++ .../kotlin}/authentication/SecurityConfig.kt | 10 +-- .../authentication/jwt/JwtAuthFilter.kt | 2 +- .../kotlin}/authentication/jwt/JwtService.kt | 2 +- .../authentication/users/UserRepository.kt | 39 ++++++++ .../authentication/users/UsersController.kt | 22 +++++ .../kotlin/authentication/users/UsersDTO.kt | 14 +++ .../authentication/users/UsersService.kt | 77 ++++++++++++++++ .../src/main/resources/application.properties | 10 +++ ordering/pom.xml | 90 +++++++++++++++++++ .../src/main/kotlin}/LoggingFilter.kt | 0 .../src/main/kotlin/OrderingApplication.kt | 0 .../kotlin/client/AuthenticationClient.kt | 4 + .../src/main/kotlin}/items/ItemsController.kt | 0 .../src/main/kotlin}/items/ItemsDTO.kt | 0 .../src/main/kotlin}/items/ItemsRepository.kt | 0 .../src/main/kotlin}/items/ItemsService.kt | 0 .../main/kotlin}/orders/OrderController.kt | 0 .../main/kotlin}/orders/OrderRepository.kt | 0 .../src/main/kotlin}/orders/OrderService.kt | 0 .../src/main/kotlin}/orders/OrdersDTO.kt | 0 .../security/RemoteAuthenticationFilter.kt | 4 + .../main/kotlin/security/SecurityConfig.kt | 2 + .../spring/ordering/users/UsersService.kt | 6 ++ 28 files changed, 375 insertions(+), 14 deletions(-) create mode 100644 authentication/pom.xml create mode 100644 authentication/src/main/kotlin/authentication/AuthenticationApplication.kt rename {src/main/kotlin/com/coded/spring/ordering => authentication/src/main/kotlin}/authentication/AuthenticationController.kt (69%) rename {src/main/kotlin/com/coded/spring/ordering => authentication/src/main/kotlin}/authentication/CustomUserDetailsClass.kt (84%) create mode 100644 authentication/src/main/kotlin/authentication/LoggingFilter.kt rename {src/main/kotlin/com/coded/spring/ordering => authentication/src/main/kotlin}/authentication/SecurityConfig.kt (89%) rename {src/main/kotlin/com/coded/spring/ordering => authentication/src/main/kotlin}/authentication/jwt/JwtAuthFilter.kt (97%) rename {src/main/kotlin/com/coded/spring/ordering => authentication/src/main/kotlin}/authentication/jwt/JwtService.kt (95%) create mode 100644 authentication/src/main/kotlin/authentication/users/UserRepository.kt create mode 100644 authentication/src/main/kotlin/authentication/users/UsersController.kt create mode 100644 authentication/src/main/kotlin/authentication/users/UsersDTO.kt create mode 100644 authentication/src/main/kotlin/authentication/users/UsersService.kt create mode 100644 authentication/src/main/resources/application.properties create mode 100644 ordering/pom.xml rename {src/main/kotlin/com/coded/spring/ordering => ordering/src/main/kotlin}/LoggingFilter.kt (100%) create mode 100644 ordering/src/main/kotlin/OrderingApplication.kt create mode 100644 ordering/src/main/kotlin/client/AuthenticationClient.kt rename {src/main/kotlin/com/coded/spring/ordering => ordering/src/main/kotlin}/items/ItemsController.kt (100%) rename {src/main/kotlin/com/coded/spring/ordering => ordering/src/main/kotlin}/items/ItemsDTO.kt (100%) rename {src/main/kotlin/com/coded/spring/ordering => ordering/src/main/kotlin}/items/ItemsRepository.kt (100%) rename {src/main/kotlin/com/coded/spring/ordering => ordering/src/main/kotlin}/items/ItemsService.kt (100%) rename {src/main/kotlin/com/coded/spring/ordering => ordering/src/main/kotlin}/orders/OrderController.kt (100%) rename {src/main/kotlin/com/coded/spring/ordering => ordering/src/main/kotlin}/orders/OrderRepository.kt (100%) rename {src/main/kotlin/com/coded/spring/ordering => ordering/src/main/kotlin}/orders/OrderService.kt (100%) rename {src/main/kotlin/com/coded/spring/ordering => ordering/src/main/kotlin}/orders/OrdersDTO.kt (100%) create mode 100644 ordering/src/main/kotlin/security/RemoteAuthenticationFilter.kt create mode 100644 ordering/src/main/kotlin/security/SecurityConfig.kt diff --git a/authentication/pom.xml b/authentication/pom.xml new file mode 100644 index 0000000..ddcaf97 --- /dev/null +++ b/authentication/pom.xml @@ -0,0 +1,15 @@ + + + 4.0.0 + + com.coded.spring + Barrak + 0.0.1-SNAPSHOT + + + authentication + + + \ No newline at end of file diff --git a/authentication/src/main/kotlin/authentication/AuthenticationApplication.kt b/authentication/src/main/kotlin/authentication/AuthenticationApplication.kt new file mode 100644 index 0000000..eb6774c --- /dev/null +++ b/authentication/src/main/kotlin/authentication/AuthenticationApplication.kt @@ -0,0 +1,11 @@ +package authentication + +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication + +@SpringBootApplication +class AuthenticationApplication + +fun main(args: Array) { + runApplication(*args) +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/AuthenticationController.kt b/authentication/src/main/kotlin/authentication/AuthenticationController.kt similarity index 69% rename from src/main/kotlin/com/coded/spring/ordering/authentication/AuthenticationController.kt rename to authentication/src/main/kotlin/authentication/AuthenticationController.kt index 1ce28b4..84e3c7f 100644 --- a/src/main/kotlin/com/coded/spring/ordering/authentication/AuthenticationController.kt +++ b/authentication/src/main/kotlin/authentication/AuthenticationController.kt @@ -1,12 +1,15 @@ -package com.coded.spring.ordering.authentication +package authentication -import com.coded.spring.ordering.authentication.jwt.JwtService +import RegistrationRequestDTO +import authentication.jwt.JwtService +import authentication.users.UsersService import io.swagger.v3.oas.annotations.tags.Tag +import org.springframework.http.ResponseEntity import org.springframework.security.authentication.* import org.springframework.security.core.userdetails.UserDetailsService import org.springframework.security.core.userdetails.UsernameNotFoundException import org.springframework.web.bind.annotation.* - +import java.security.Principal @Tag(name = "AuthenticationAPI") @RestController @@ -14,7 +17,8 @@ import org.springframework.web.bind.annotation.* class AuthController( private val authenticationManager: AuthenticationManager, private val userDetailsService: UserDetailsService, - private val jwtService: JwtService + private val jwtService: JwtService, + private val usersService: UsersService ) { // login page @@ -39,8 +43,31 @@ class AuthController( throw UsernameNotFoundException("Invalid user request!") } } + + // register + @PostMapping("/register") + fun addUser(@RequestBody request: RegistrationRequestDTO) { + usersService.registerUsers(request) + ResponseEntity.ok() + } + + + // check the token + @PostMapping("/check-token") + fun checkToken( + principal: Principal + ): CheckTokenResponse { + return CheckTokenResponse( + userId = usersService.findByUsername(principal.name) + ) + } + } +data class CheckTokenResponse( + val userId: Long +) + data class AuthRequest( val username: String, val password: String diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/CustomUserDetailsClass.kt b/authentication/src/main/kotlin/authentication/CustomUserDetailsClass.kt similarity index 84% rename from src/main/kotlin/com/coded/spring/ordering/authentication/CustomUserDetailsClass.kt rename to authentication/src/main/kotlin/authentication/CustomUserDetailsClass.kt index 3142b81..d68bece 100644 --- a/src/main/kotlin/com/coded/spring/ordering/authentication/CustomUserDetailsClass.kt +++ b/authentication/src/main/kotlin/authentication/CustomUserDetailsClass.kt @@ -1,7 +1,7 @@ -package com.coded.spring.ordering.authentication +package authentication -import com.coded.spring.ordering.users.UserEntity -import com.coded.spring.ordering.users.UsersRepository +import authentication.users.UserEntity +import authentication.users.UsersRepository import jakarta.inject.Named import org.springframework.security.core.userdetails.User import org.springframework.security.core.userdetails.UserDetails diff --git a/authentication/src/main/kotlin/authentication/LoggingFilter.kt b/authentication/src/main/kotlin/authentication/LoggingFilter.kt new file mode 100644 index 0000000..46bb417 --- /dev/null +++ b/authentication/src/main/kotlin/authentication/LoggingFilter.kt @@ -0,0 +1,40 @@ +package authentication + +import jakarta.servlet.FilterChain +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse +import org.springframework.stereotype.Component +import org.springframework.web.filter.OncePerRequestFilter +import org.springframework.web.util.ContentCachingRequestWrapper +import org.springframework.web.util.ContentCachingResponseWrapper + + +@Component +class LoggingFilter: OncePerRequestFilter() { + override fun doFilterInternal( + request: HttpServletRequest, + response: HttpServletResponse, + filterChain: FilterChain + ) { + + val cachedRequest = ContentCachingRequestWrapper(request) + val cachedResponse = ContentCachingResponseWrapper(response) + + filterChain.doFilter(cachedRequest, cachedResponse) + + logRequest(cachedRequest) + logResponse(cachedResponse) + cachedResponse.copyBodyToResponse() + } + + private fun logRequest(request: ContentCachingRequestWrapper){ + val requestBody = String(request.contentAsByteArray) + logger.info("Request: method=${request.method}, uri=${request.requestURI}, body=$requestBody") + } + + private fun logResponse(response: ContentCachingResponseWrapper) { + val responseBody = String(response.contentAsByteArray) + logger.info("Response: status=${response.status}, body=$responseBody") + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt b/authentication/src/main/kotlin/authentication/SecurityConfig.kt similarity index 89% rename from src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt rename to authentication/src/main/kotlin/authentication/SecurityConfig.kt index 11beb1d..184cbb3 100644 --- a/src/main/kotlin/com/coded/spring/ordering/authentication/SecurityConfig.kt +++ b/authentication/src/main/kotlin/authentication/SecurityConfig.kt @@ -1,6 +1,6 @@ -package com.coded.spring.ordering.authentication +package authentication -import com.coded.spring.ordering.authentication.jwt.JwtAuthFilter +import authentication.jwt.JwtAuthFilter import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.security.authentication.AuthenticationManager @@ -32,13 +32,13 @@ class SecurityConfig( .authorizeHttpRequests { it .requestMatchers("/authentication/**").permitAll() + .requestMatchers("/authentication/login").permitAll() .requestMatchers("/hello").permitAll() - // menu end points available for all users - .requestMatchers("/menu").permitAll() + .requestMatchers("/authentication/check-token").authenticated() // swagger .requestMatchers("/api-docs").permitAll() // registration endpoint - .requestMatchers("/register").permitAll() + // rest of endpoints will need authentication .anyRequest().authenticated() } diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/jwt/JwtAuthFilter.kt b/authentication/src/main/kotlin/authentication/jwt/JwtAuthFilter.kt similarity index 97% rename from src/main/kotlin/com/coded/spring/ordering/authentication/jwt/JwtAuthFilter.kt rename to authentication/src/main/kotlin/authentication/jwt/JwtAuthFilter.kt index 29ea88a..407bcb9 100644 --- a/src/main/kotlin/com/coded/spring/ordering/authentication/jwt/JwtAuthFilter.kt +++ b/authentication/src/main/kotlin/authentication/jwt/JwtAuthFilter.kt @@ -1,4 +1,4 @@ -package com.coded.spring.ordering.authentication.jwt +package authentication.jwt import jakarta.servlet.FilterChain import jakarta.servlet.http.* diff --git a/src/main/kotlin/com/coded/spring/ordering/authentication/jwt/JwtService.kt b/authentication/src/main/kotlin/authentication/jwt/JwtService.kt similarity index 95% rename from src/main/kotlin/com/coded/spring/ordering/authentication/jwt/JwtService.kt rename to authentication/src/main/kotlin/authentication/jwt/JwtService.kt index cb02f2a..79d9387 100644 --- a/src/main/kotlin/com/coded/spring/ordering/authentication/jwt/JwtService.kt +++ b/authentication/src/main/kotlin/authentication/jwt/JwtService.kt @@ -1,4 +1,4 @@ -package com.coded.spring.ordering.authentication.jwt +package authentication.jwt import io.jsonwebtoken.* diff --git a/authentication/src/main/kotlin/authentication/users/UserRepository.kt b/authentication/src/main/kotlin/authentication/users/UserRepository.kt new file mode 100644 index 0000000..e0f9913 --- /dev/null +++ b/authentication/src/main/kotlin/authentication/users/UserRepository.kt @@ -0,0 +1,39 @@ +package authentication.users + +import jakarta.inject.Named +import jakarta.persistence.* +import org.springframework.data.jpa.repository.JpaRepository + +@Named +interface UsersRepository : JpaRepository { + fun age(age: Int): MutableList + fun findByUsername(username: String): UserEntity? + fun existsByUsername(username: String): Boolean +} + +@Entity +@Table(name = "authentication/users") +data class UserEntity( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + var name: String, + var age: Int, + + @Column(unique = true) // make sure it's unique + var username: String, + + var password: String, + +// @Enumerated(EnumType.STRING) +// val role: Roles = Roles.USER + +){ + constructor() : this(null, "", 0,"username","password") +} + +enum class Roles { + USER, ADMIN +} + + diff --git a/authentication/src/main/kotlin/authentication/users/UsersController.kt b/authentication/src/main/kotlin/authentication/users/UsersController.kt new file mode 100644 index 0000000..0a08332 --- /dev/null +++ b/authentication/src/main/kotlin/authentication/users/UsersController.kt @@ -0,0 +1,22 @@ +package authentication.users + +import RegistrationResponseDto +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RestController +import io.swagger.v3.oas.annotations.tags.Tag + +@Tag(name = "UserAPI") +@RestController +class UsersController( + private val usersService: UsersService, + +){ + + @GetMapping("/authentication/users/list") + fun users() = usersService.listUsers() + + +} \ No newline at end of file diff --git a/authentication/src/main/kotlin/authentication/users/UsersDTO.kt b/authentication/src/main/kotlin/authentication/users/UsersDTO.kt new file mode 100644 index 0000000..8eac6a1 --- /dev/null +++ b/authentication/src/main/kotlin/authentication/users/UsersDTO.kt @@ -0,0 +1,14 @@ +// Change this: +data class RegistrationRequestDTO( + val name: String, + val age: Int, + val username: String, + val password: String +) +// To this: + + +data class RegistrationResponseDto( + val message: String, + val username: String +) \ No newline at end of file diff --git a/authentication/src/main/kotlin/authentication/users/UsersService.kt b/authentication/src/main/kotlin/authentication/users/UsersService.kt new file mode 100644 index 0000000..bf66bca --- /dev/null +++ b/authentication/src/main/kotlin/authentication/users/UsersService.kt @@ -0,0 +1,77 @@ +package authentication.users + +import RegistrationRequestDTO + +import jakarta.inject.Named +import org.springframework.security.crypto.password.PasswordEncoder + +@Named +class UsersService( + private val usersRepository: UsersRepository, + private val passwordEncoder: PasswordEncoder // Added missing dependency +) { + + fun findByUsername(username: String): Long { + return usersRepository.findByUsername(username)?.id + ?: throw IllegalArgumentException("User has no id") + } + + fun listUsers(): List = usersRepository.findAll().map { + User( + id = it.id, + name = it.name, + age = it.age, + ) + } + + fun registerUsers(request: RegistrationRequestDTO): UserEntity { + + //check if username exists already + if(usersRepository.existsByUsername(request.username)){ + throw IllegalArgumentException("user name already exists") + } + + // Validate the password + val password = request.password + + // check pass length + if (password.length < 6) { + throw IllegalArgumentException("Password must be at least 6 characters long") + } + + // check if there's any uppercase letter + if (!password.any { it.isUpperCase() }) { + throw IllegalArgumentException("Password must contain at least one capital letter") + } + + // check if there's any digits + if (!password.any { it.isDigit() }) { + throw IllegalArgumentException("Password must contain at least one number") + } + + // create user + val user = UserEntity( + name = request.name, + age = request.age, + username = request.username, + password = passwordEncoder.encode(request.password) + ) + + // save the user + return usersRepository.save(user) + } +} + +data class User( + val id: Long?, + val name: String, + val age: Int +) + +data class RegistrationRequest( + val name: String, + val age: Int, + val username: String, + val password: String +) + diff --git a/authentication/src/main/resources/application.properties b/authentication/src/main/resources/application.properties new file mode 100644 index 0000000..f0889b4 --- /dev/null +++ b/authentication/src/main/resources/application.properties @@ -0,0 +1,10 @@ +spring.application.name=Kotlin.SpringbootV2 + +server.port=8082 + +spring.datasource.url=jdbc:postgresql://localhost:8080/myHelloDatabase +spring.datasource.username=postgres +spring.datasource.password=Barrak2000# +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect + +springdoc.api-docs.path=/api-docs diff --git a/ordering/pom.xml b/ordering/pom.xml new file mode 100644 index 0000000..c2d2de9 --- /dev/null +++ b/ordering/pom.xml @@ -0,0 +1,90 @@ + + + 4.0.0 + + com.coded.spring + Barrak + 0.0.1-SNAPSHOT + + + ordering + + + UTF-8 + official + 1.8 + + + + + mavenCentral + https://repo1.maven.org/maven2/ + + + + + src/main/kotlin + src/test/kotlin + + + org.jetbrains.kotlin + kotlin-maven-plugin + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + maven-surefire-plugin + 2.22.2 + + + maven-failsafe-plugin + 2.22.2 + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + MainKt + + + + + + + + org.jetbrains.kotlin + kotlin-test-junit5 + 2.1.10 + test + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.jetbrains.kotlin + kotlin-stdlib + 2.1.10 + + + + \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/LoggingFilter.kt b/ordering/src/main/kotlin/LoggingFilter.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/LoggingFilter.kt rename to ordering/src/main/kotlin/LoggingFilter.kt diff --git a/ordering/src/main/kotlin/OrderingApplication.kt b/ordering/src/main/kotlin/OrderingApplication.kt new file mode 100644 index 0000000..e69de29 diff --git a/ordering/src/main/kotlin/client/AuthenticationClient.kt b/ordering/src/main/kotlin/client/AuthenticationClient.kt new file mode 100644 index 0000000..91254f7 --- /dev/null +++ b/ordering/src/main/kotlin/client/AuthenticationClient.kt @@ -0,0 +1,4 @@ +package client + +class AuthenticationClient { +} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/items/ItemsController.kt b/ordering/src/main/kotlin/items/ItemsController.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/items/ItemsController.kt rename to ordering/src/main/kotlin/items/ItemsController.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/items/ItemsDTO.kt b/ordering/src/main/kotlin/items/ItemsDTO.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/items/ItemsDTO.kt rename to ordering/src/main/kotlin/items/ItemsDTO.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/items/ItemsRepository.kt b/ordering/src/main/kotlin/items/ItemsRepository.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/items/ItemsRepository.kt rename to ordering/src/main/kotlin/items/ItemsRepository.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/items/ItemsService.kt b/ordering/src/main/kotlin/items/ItemsService.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/items/ItemsService.kt rename to ordering/src/main/kotlin/items/ItemsService.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt b/ordering/src/main/kotlin/orders/OrderController.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/orders/OrderController.kt rename to ordering/src/main/kotlin/orders/OrderController.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderRepository.kt b/ordering/src/main/kotlin/orders/OrderRepository.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/orders/OrderRepository.kt rename to ordering/src/main/kotlin/orders/OrderRepository.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt b/ordering/src/main/kotlin/orders/OrderService.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/orders/OrderService.kt rename to ordering/src/main/kotlin/orders/OrderService.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/orders/OrdersDTO.kt b/ordering/src/main/kotlin/orders/OrdersDTO.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/orders/OrdersDTO.kt rename to ordering/src/main/kotlin/orders/OrdersDTO.kt diff --git a/ordering/src/main/kotlin/security/RemoteAuthenticationFilter.kt b/ordering/src/main/kotlin/security/RemoteAuthenticationFilter.kt new file mode 100644 index 0000000..ada99a8 --- /dev/null +++ b/ordering/src/main/kotlin/security/RemoteAuthenticationFilter.kt @@ -0,0 +1,4 @@ +package security + +class RemoteAuthenticationFilter { +} \ No newline at end of file diff --git a/ordering/src/main/kotlin/security/SecurityConfig.kt b/ordering/src/main/kotlin/security/SecurityConfig.kt new file mode 100644 index 0000000..fc5572f --- /dev/null +++ b/ordering/src/main/kotlin/security/SecurityConfig.kt @@ -0,0 +1,2 @@ +package security + diff --git a/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt b/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt index 07079af..2f9ae71 100644 --- a/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt +++ b/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt @@ -8,6 +8,12 @@ class UsersService( private val usersRepository: UsersRepository, private val passwordEncoder: PasswordEncoder // Added missing dependency ) { + + fun findByUsername(username: String): Long { + return usersRepository.findByUsername(username)?.id + ?: throw IllegalArgumentException("User has no id") + } + fun listUsers(): List = usersRepository.findAll().map { User( id = it.id, From 819fc40376c880286621883e119f3439e91604cd Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Thu, 1 May 2025 15:43:18 +0300 Subject: [PATCH 17/19] ordering server booted up --- ordering/pom.xml | 77 ++----------------- ordering/src/main/kotlin/LoggingFilter.kt | 2 - .../src/main/kotlin/OrderingApplication.kt | 15 ++++ .../kotlin/client/AuthenticationClient.kt | 25 ++++++ .../src/main/kotlin/items/ItemsController.kt | 2 +- ordering/src/main/kotlin/items/ItemsDTO.kt | 2 +- .../src/main/kotlin/items/ItemsRepository.kt | 4 +- .../src/main/kotlin/items/ItemsService.kt | 4 +- .../src/main/kotlin/orders/OrderController.kt | 4 +- .../src/main/kotlin/orders/OrderRepository.kt | 6 +- .../src/main/kotlin/orders/OrderService.kt | 6 +- ordering/src/main/kotlin/orders/OrdersDTO.kt | 4 +- .../security/RemoteAuthenticationFilter.kt | 30 +++++++- .../main/kotlin/security/SecurityConfig.kt | 28 +++++++ .../src/main/resources/application.properties | 10 +++ 15 files changed, 128 insertions(+), 91 deletions(-) create mode 100644 ordering/src/main/resources/application.properties diff --git a/ordering/pom.xml b/ordering/pom.xml index c2d2de9..7d417c0 100644 --- a/ordering/pom.xml +++ b/ordering/pom.xml @@ -10,81 +10,14 @@ ordering - - - UTF-8 - official - 1.8 - - - - - mavenCentral - https://repo1.maven.org/maven2/ - - - - - src/main/kotlin - src/test/kotlin - - - org.jetbrains.kotlin - kotlin-maven-plugin - - - compile - compile - - compile - - - - test-compile - test-compile - - test-compile - - - - - - maven-surefire-plugin - 2.22.2 - - - maven-failsafe-plugin - 2.22.2 - - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - MainKt - - - - - - org.jetbrains.kotlin - kotlin-test-junit5 - 2.1.10 - test - - - org.junit.jupiter - junit-jupiter - 5.10.0 - test - - - org.jetbrains.kotlin - kotlin-stdlib - 2.1.10 + com.coded.spring + authentication + 0.0.1-SNAPSHOT + compile + \ No newline at end of file diff --git a/ordering/src/main/kotlin/LoggingFilter.kt b/ordering/src/main/kotlin/LoggingFilter.kt index 23a4448..eba5c42 100644 --- a/ordering/src/main/kotlin/LoggingFilter.kt +++ b/ordering/src/main/kotlin/LoggingFilter.kt @@ -1,5 +1,3 @@ -package com.coded.spring.ordering - import jakarta.servlet.FilterChain import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletResponse diff --git a/ordering/src/main/kotlin/OrderingApplication.kt b/ordering/src/main/kotlin/OrderingApplication.kt index e69de29..7b0c436 100644 --- a/ordering/src/main/kotlin/OrderingApplication.kt +++ b/ordering/src/main/kotlin/OrderingApplication.kt @@ -0,0 +1,15 @@ +import com.hazelcast.config.Config +import com.hazelcast.core.Hazelcast +import com.hazelcast.core.HazelcastInstance +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication + +@SpringBootApplication +class OrderingApplication + +fun main(args: Array) { + runApplication(*args) +} + +val orderingCacheConfig = Config("hello-world-cache") +val serverCache: HazelcastInstance = Hazelcast.newHazelcastInstance(orderingCacheConfig) \ No newline at end of file diff --git a/ordering/src/main/kotlin/client/AuthenticationClient.kt b/ordering/src/main/kotlin/client/AuthenticationClient.kt index 91254f7..2d9d2af 100644 --- a/ordering/src/main/kotlin/client/AuthenticationClient.kt +++ b/ordering/src/main/kotlin/client/AuthenticationClient.kt @@ -1,4 +1,29 @@ package client +import authentication.CheckTokenResponse +import jakarta.inject.Named +import org.springframework.core.ParameterizedTypeReference +import org.springframework.http.* +import org.springframework.util.MultiValueMap +import org.springframework.web.client.RestTemplate +import org.springframework.web.client.exchange + +@Named class AuthenticationClient { + + fun checkToken(token: String): CheckTokenResponse { + val restTemplate = RestTemplate() + val url = "http://localhost:8081/authentication/v1/check-token" + val response = restTemplate.exchange( + url = url, + method = HttpMethod.POST, + requestEntity = HttpEntity( + MultiValueMap.fromMultiValue(mapOf("Authorization" to listOf("Bearer $token"))) + ), + object : ParameterizedTypeReference() { + } + ) + return response.body ?: throw IllegalStateException("Check token response has no body ...") + } + } \ No newline at end of file diff --git a/ordering/src/main/kotlin/items/ItemsController.kt b/ordering/src/main/kotlin/items/ItemsController.kt index 16e50f5..7dcaa15 100644 --- a/ordering/src/main/kotlin/items/ItemsController.kt +++ b/ordering/src/main/kotlin/items/ItemsController.kt @@ -1,4 +1,4 @@ -package com.coded.spring.ordering.items +package items import io.swagger.v3.oas.annotations.tags.Tag import org.springframework.web.bind.annotation.GetMapping diff --git a/ordering/src/main/kotlin/items/ItemsDTO.kt b/ordering/src/main/kotlin/items/ItemsDTO.kt index 6785ebd..345b75f 100644 --- a/ordering/src/main/kotlin/items/ItemsDTO.kt +++ b/ordering/src/main/kotlin/items/ItemsDTO.kt @@ -1,4 +1,4 @@ -package com.coded.spring.ordering.items +package items data class CreateItemRequestDTO( diff --git a/ordering/src/main/kotlin/items/ItemsRepository.kt b/ordering/src/main/kotlin/items/ItemsRepository.kt index 5a032c8..bef4fa6 100644 --- a/ordering/src/main/kotlin/items/ItemsRepository.kt +++ b/ordering/src/main/kotlin/items/ItemsRepository.kt @@ -1,6 +1,6 @@ -package com.coded.spring.ordering.items +package items -import com.coded.spring.ordering.orders.OrderEntity +import orders.OrderEntity import jakarta.inject.Named import jakarta.persistence.* import org.springframework.data.jpa.repository.JpaRepository diff --git a/ordering/src/main/kotlin/items/ItemsService.kt b/ordering/src/main/kotlin/items/ItemsService.kt index 1342f01..31bd3e5 100644 --- a/ordering/src/main/kotlin/items/ItemsService.kt +++ b/ordering/src/main/kotlin/items/ItemsService.kt @@ -1,6 +1,6 @@ -package com.coded.spring.ordering.items +package items -import com.coded.spring.ordering.orders.OrderRepository +import orders.OrderRepository import jakarta.inject.Named @Named diff --git a/ordering/src/main/kotlin/orders/OrderController.kt b/ordering/src/main/kotlin/orders/OrderController.kt index 3a885d4..c2c00d1 100644 --- a/ordering/src/main/kotlin/orders/OrderController.kt +++ b/ordering/src/main/kotlin/orders/OrderController.kt @@ -1,6 +1,6 @@ -package com.coded.spring.ordering.orders +package orders -import com.coded.spring.ordering.users.UsersService +import authentication.users.UsersService import io.swagger.v3.oas.annotations.tags.Tag import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping diff --git a/ordering/src/main/kotlin/orders/OrderRepository.kt b/ordering/src/main/kotlin/orders/OrderRepository.kt index 1dea930..a7e1a99 100644 --- a/ordering/src/main/kotlin/orders/OrderRepository.kt +++ b/ordering/src/main/kotlin/orders/OrderRepository.kt @@ -1,8 +1,8 @@ -package com.coded.spring.ordering.orders +package orders -import com.coded.spring.ordering.items.ItemEntity -import com.coded.spring.ordering.users.UserEntity +import authentication.users.UserEntity +import items.ItemEntity import jakarta.inject.Named import jakarta.persistence.* import org.springframework.data.jpa.repository.JpaRepository diff --git a/ordering/src/main/kotlin/orders/OrderService.kt b/ordering/src/main/kotlin/orders/OrderService.kt index 0a54c25..67a739c 100644 --- a/ordering/src/main/kotlin/orders/OrderService.kt +++ b/ordering/src/main/kotlin/orders/OrderService.kt @@ -1,7 +1,7 @@ -package com.coded.spring.ordering.orders +package orders -import com.coded.spring.ordering.items.ItemDTO -import com.coded.spring.ordering.users.UsersRepository +import authentication.users.UsersRepository +import items.ItemDTO import jakarta.inject.Named @Named diff --git a/ordering/src/main/kotlin/orders/OrdersDTO.kt b/ordering/src/main/kotlin/orders/OrdersDTO.kt index 746f805..5bf0981 100644 --- a/ordering/src/main/kotlin/orders/OrdersDTO.kt +++ b/ordering/src/main/kotlin/orders/OrdersDTO.kt @@ -1,6 +1,6 @@ -package com.coded.spring.ordering.orders +package orders -import com.coded.spring.ordering.items.ItemDTO +import items.ItemDTO // return this when user asking for order list data class OrderDTO( diff --git a/ordering/src/main/kotlin/security/RemoteAuthenticationFilter.kt b/ordering/src/main/kotlin/security/RemoteAuthenticationFilter.kt index ada99a8..7a0d215 100644 --- a/ordering/src/main/kotlin/security/RemoteAuthenticationFilter.kt +++ b/ordering/src/main/kotlin/security/RemoteAuthenticationFilter.kt @@ -1,4 +1,32 @@ package security -class RemoteAuthenticationFilter { +import client.AuthenticationClient +import jakarta.servlet.FilterChain +import jakarta.servlet.http.* +import org.springframework.stereotype.Component +import org.springframework.web.filter.OncePerRequestFilter + +@Component +class RemoteAuthenticationFilter( + private val authenticationClient: AuthenticationClient, +) : OncePerRequestFilter() { + + override fun doFilterInternal( + request: HttpServletRequest, + response: HttpServletResponse, + filterChain: FilterChain + ) { + logger.info("Remote authentication filter running...") + val authHeader = request.getHeader("Authorization") + if (authHeader == null || !authHeader.startsWith("Bearer ")) { + filterChain.doFilter(request, response) + return + } + + val token = authHeader.substring(7) + val result = authenticationClient.checkToken(token) + request.setAttribute("userId", result.userId) + + filterChain.doFilter(request, response) + } } \ No newline at end of file diff --git a/ordering/src/main/kotlin/security/SecurityConfig.kt b/ordering/src/main/kotlin/security/SecurityConfig.kt index fc5572f..63cf9e1 100644 --- a/ordering/src/main/kotlin/security/SecurityConfig.kt +++ b/ordering/src/main/kotlin/security/SecurityConfig.kt @@ -1,2 +1,30 @@ package security +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.security.config.annotation.web.builders.HttpSecurity +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity +import org.springframework.security.config.http.SessionCreationPolicy +import org.springframework.security.web.SecurityFilterChain +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter + +@Configuration +@EnableWebSecurity +class SecurityConfig( + private val remoteAuthFilter: RemoteAuthenticationFilter +) { + + @Bean + fun securityFilterChain(http: HttpSecurity): SecurityFilterChain { + http.csrf { it.disable() } + .authorizeHttpRequests { + it.anyRequest().permitAll() + } + .sessionManagement { + it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) + } + .addFilterBefore(remoteAuthFilter, UsernamePasswordAuthenticationFilter::class.java) + + return http.build() + } +} \ No newline at end of file diff --git a/ordering/src/main/resources/application.properties b/ordering/src/main/resources/application.properties new file mode 100644 index 0000000..2bf2893 --- /dev/null +++ b/ordering/src/main/resources/application.properties @@ -0,0 +1,10 @@ +spring.application.name=Kotlin.SpringbootV2 + +server.port=8083 + +spring.datasource.url=jdbc:postgresql://localhost:8080/myHelloDatabase +spring.datasource.username=postgres +spring.datasource.password=Barrak2000# +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect + +springdoc.api-docs.path=/api-docs From 91a37c51216bae6d369cd2a5fe8fb38dd66d8895 Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Sat, 3 May 2025 18:00:23 +0300 Subject: [PATCH 18/19] Ordering server still have some issues when creating ordert --- .../kotlin/authentication/SecurityConfig.kt | 2 +- .../authentication/users/UserRepository.kt | 2 +- ordering/pom.xml | 1 - .../src/main/kotlin/OrderingApplication.kt | 2 + .../kotlin/client/AuthenticationClient.kt | 17 ++-- .../src/main/kotlin/items/ItemsController.kt | 44 +++++----- ordering/src/main/kotlin/items/ItemsDTO.kt | 2 - .../src/main/kotlin/items/ItemsRepository.kt | 7 +- .../src/main/kotlin/items/ItemsService.kt | 88 +++++++++---------- .../src/main/kotlin/orders/OrderController.kt | 22 +++-- .../src/main/kotlin/orders/OrderRepository.kt | 10 ++- .../src/main/kotlin/orders/OrderService.kt | 36 +++++--- ordering/src/main/kotlin/orders/OrdersDTO.kt | 5 +- pom.xml | 8 +- .../spring/ordering/users/UserRepository.kt | 39 -------- .../spring/ordering/users/UsersController.kt | 35 -------- .../coded/spring/ordering/users/UsersDTO.kt | 19 ---- .../spring/ordering/users/UsersService.kt | 75 ---------------- .../{ordering => orders}/Application.kt | 0 .../HelloWorldController.kt | 0 ...Barrak-online-ordering-api-swagger-01.json | 0 .../menu/MenuController.kt | 0 .../menu/MenuRepository.kt | 0 .../{ordering => orders}/menu/MenuService.kt | 0 .../profiles/ProfilesController.kt | 0 .../profiles/ProfilesDTO.kt | 0 .../profiles/ProfilesRepository.kt | 0 .../profiles/ProfilesService.kt | 0 .../scripts/InitUserRunner.kt | 0 29 files changed, 141 insertions(+), 273 deletions(-) delete mode 100644 src/main/kotlin/com/coded/spring/ordering/users/UserRepository.kt delete mode 100644 src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt delete mode 100644 src/main/kotlin/com/coded/spring/ordering/users/UsersDTO.kt delete mode 100644 src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt rename src/main/kotlin/com/coded/spring/{ordering => orders}/Application.kt (100%) rename src/main/kotlin/com/coded/spring/{ordering => orders}/HelloWorldController.kt (100%) rename src/main/kotlin/com/coded/spring/{ordering => orders}/files/Barrak-online-ordering-api-swagger-01.json (100%) rename src/main/kotlin/com/coded/spring/{ordering => orders}/menu/MenuController.kt (100%) rename src/main/kotlin/com/coded/spring/{ordering => orders}/menu/MenuRepository.kt (100%) rename src/main/kotlin/com/coded/spring/{ordering => orders}/menu/MenuService.kt (100%) rename src/main/kotlin/com/coded/spring/{ordering => orders}/profiles/ProfilesController.kt (100%) rename src/main/kotlin/com/coded/spring/{ordering => orders}/profiles/ProfilesDTO.kt (100%) rename src/main/kotlin/com/coded/spring/{ordering => orders}/profiles/ProfilesRepository.kt (100%) rename src/main/kotlin/com/coded/spring/{ordering => orders}/profiles/ProfilesService.kt (100%) rename src/main/kotlin/com/coded/spring/{ordering => orders}/scripts/InitUserRunner.kt (100%) diff --git a/authentication/src/main/kotlin/authentication/SecurityConfig.kt b/authentication/src/main/kotlin/authentication/SecurityConfig.kt index 184cbb3..c90be75 100644 --- a/authentication/src/main/kotlin/authentication/SecurityConfig.kt +++ b/authentication/src/main/kotlin/authentication/SecurityConfig.kt @@ -34,7 +34,7 @@ class SecurityConfig( .requestMatchers("/authentication/**").permitAll() .requestMatchers("/authentication/login").permitAll() .requestMatchers("/hello").permitAll() - .requestMatchers("/authentication/check-token").authenticated() + .requestMatchers("/authentication/check-token").permitAll() // swagger .requestMatchers("/api-docs").permitAll() // registration endpoint diff --git a/authentication/src/main/kotlin/authentication/users/UserRepository.kt b/authentication/src/main/kotlin/authentication/users/UserRepository.kt index e0f9913..1a04034 100644 --- a/authentication/src/main/kotlin/authentication/users/UserRepository.kt +++ b/authentication/src/main/kotlin/authentication/users/UserRepository.kt @@ -12,7 +12,7 @@ interface UsersRepository : JpaRepository { } @Entity -@Table(name = "authentication/users") +@Table(name = "users") data class UserEntity( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/ordering/pom.xml b/ordering/pom.xml index 7d417c0..0cfd102 100644 --- a/ordering/pom.xml +++ b/ordering/pom.xml @@ -19,5 +19,4 @@ - \ No newline at end of file diff --git a/ordering/src/main/kotlin/OrderingApplication.kt b/ordering/src/main/kotlin/OrderingApplication.kt index 7b0c436..a1fc64b 100644 --- a/ordering/src/main/kotlin/OrderingApplication.kt +++ b/ordering/src/main/kotlin/OrderingApplication.kt @@ -1,3 +1,5 @@ +package ordering + import com.hazelcast.config.Config import com.hazelcast.core.Hazelcast import com.hazelcast.core.HazelcastInstance diff --git a/ordering/src/main/kotlin/client/AuthenticationClient.kt b/ordering/src/main/kotlin/client/AuthenticationClient.kt index 2d9d2af..45ab472 100644 --- a/ordering/src/main/kotlin/client/AuthenticationClient.kt +++ b/ordering/src/main/kotlin/client/AuthenticationClient.kt @@ -13,15 +13,20 @@ class AuthenticationClient { fun checkToken(token: String): CheckTokenResponse { val restTemplate = RestTemplate() - val url = "http://localhost:8081/authentication/v1/check-token" + val url = "http://localhost:8082/authentication/check-token" + + // Create headers with token + val headers = HttpHeaders() + headers.set("Authorization", "Bearer $token") + + // Create request entity with headers + val requestEntity = HttpEntity(headers) + val response = restTemplate.exchange( url = url, method = HttpMethod.POST, - requestEntity = HttpEntity( - MultiValueMap.fromMultiValue(mapOf("Authorization" to listOf("Bearer $token"))) - ), - object : ParameterizedTypeReference() { - } + requestEntity = requestEntity, + object : ParameterizedTypeReference() {} ) return response.body ?: throw IllegalStateException("Check token response has no body ...") } diff --git a/ordering/src/main/kotlin/items/ItemsController.kt b/ordering/src/main/kotlin/items/ItemsController.kt index 7dcaa15..8def5d4 100644 --- a/ordering/src/main/kotlin/items/ItemsController.kt +++ b/ordering/src/main/kotlin/items/ItemsController.kt @@ -1,22 +1,22 @@ -package items - -import io.swagger.v3.oas.annotations.tags.Tag -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.PostMapping -import org.springframework.web.bind.annotation.RequestBody -import org.springframework.web.bind.annotation.RestController - -@Tag(name = "ItemAPI") -@RestController -class ItemsController( - private val itemsService: ItemsService -) { - - @GetMapping("/items/list") - fun items() = itemsService.listItems() - - @PostMapping("/items/create") - fun addItems(@RequestBody request: CreateItemRequestDTO): ItemDTO { - return itemsService.createItem(request) - } -} \ No newline at end of file +//package items +// +//import io.swagger.v3.oas.annotations.tags.Tag +//import org.springframework.web.bind.annotation.GetMapping +//import org.springframework.web.bind.annotation.PostMapping +//import org.springframework.web.bind.annotation.RequestBody +//import org.springframework.web.bind.annotation.RestController +// +//@Tag(name = "ItemAPI") +//@RestController +//class ItemsController( +// private val itemsService: ItemsService +//) { +// +// @GetMapping("/items/list") +// fun items() = itemsService.listItems() +// +// @PostMapping("/items/create") +// fun addItems(@RequestBody request: CreateItemRequestDTO): ItemDTO { +// return itemsService.createItem(request) +// } +//} \ No newline at end of file diff --git a/ordering/src/main/kotlin/items/ItemsDTO.kt b/ordering/src/main/kotlin/items/ItemsDTO.kt index 345b75f..7292246 100644 --- a/ordering/src/main/kotlin/items/ItemsDTO.kt +++ b/ordering/src/main/kotlin/items/ItemsDTO.kt @@ -8,10 +8,8 @@ data class CreateItemRequestDTO( ) data class ItemDTO( - val id: Long?, val name: String, val quantity: Int, - val orderId: Long? ) data class ItemsListDTO( diff --git a/ordering/src/main/kotlin/items/ItemsRepository.kt b/ordering/src/main/kotlin/items/ItemsRepository.kt index bef4fa6..a756c29 100644 --- a/ordering/src/main/kotlin/items/ItemsRepository.kt +++ b/ordering/src/main/kotlin/items/ItemsRepository.kt @@ -17,13 +17,12 @@ data class ItemEntity( var name: String, var quantity: Int, - @ManyToOne - @JoinColumn(name = "order_id") - var order: OrderEntity, + @Column(name = "order_id") + var orderId: Long, // @Column("'name'") ){ - constructor(): this(null, "", 0, OrderEntity()) + constructor(): this(null, "", 0, 0) } \ No newline at end of file diff --git a/ordering/src/main/kotlin/items/ItemsService.kt b/ordering/src/main/kotlin/items/ItemsService.kt index 31bd3e5..a9821fb 100644 --- a/ordering/src/main/kotlin/items/ItemsService.kt +++ b/ordering/src/main/kotlin/items/ItemsService.kt @@ -1,44 +1,44 @@ -package items - -import orders.OrderRepository -import jakarta.inject.Named - -@Named -class ItemsService( - private val itemsRepository: ItemsRepository, - private val orderRepository: OrderRepository // Added to fetch orders - -) { - - fun listItems(): List = itemsRepository.findAll().map { - ItemDTO( - id = it.id, - name = it.name, - quantity = it.quantity, - orderId = it.order.id - ) - - } - - fun createItem(request: CreateItemRequestDTO): ItemDTO { - val order = orderRepository.findById(request.order_id) - .orElseThrow { IllegalArgumentException("Order not found with id: ${request.order_id}") } - - val item = ItemEntity( - name = request.name, - quantity = request.quantity, - order = order - ) - - val savedItem = itemsRepository.save(item) - - return ItemDTO( - id = savedItem.id, - name = savedItem.name, - quantity = savedItem.quantity, - orderId = savedItem.order.id - ) - } - - -} \ No newline at end of file +//package items +// +//import orders.OrderRepository +//import jakarta.inject.Named +// +//@Named +//class ItemsService( +// private val itemsRepository: ItemsRepository, +// private val orderRepository: OrderRepository // Added to fetch orders +// +//) { +// +// fun listItems(): List = itemsRepository.findAll().map { +// ItemDTO( +// id = it.id, +// name = it.name, +// quantity = it.quantity, +// orderId = it.order.id +// ) +// +// } +// +// fun createItem(request: CreateItemRequestDTO): ItemDTO { +// val order = orderRepository.findById(request.order_id) +// .orElseThrow { IllegalArgumentException("Order not found with id: ${request.order_id}") } +// +// val item = ItemEntity( +// name = request.name, +// quantity = request.quantity, +// order = order +// ) +// +// val savedItem = itemsRepository.save(item) +// +// return ItemDTO( +// id = savedItem.id, +// name = savedItem.name, +// quantity = savedItem.quantity, +// orderId = savedItem.order.id +// ) +// } +// +// +//} \ No newline at end of file diff --git a/ordering/src/main/kotlin/orders/OrderController.kt b/ordering/src/main/kotlin/orders/OrderController.kt index c2c00d1..1f5880e 100644 --- a/ordering/src/main/kotlin/orders/OrderController.kt +++ b/ordering/src/main/kotlin/orders/OrderController.kt @@ -2,6 +2,8 @@ package orders import authentication.users.UsersService import io.swagger.v3.oas.annotations.tags.Tag +import items.ItemDTO +import jakarta.servlet.http.HttpServletRequest import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody @@ -23,13 +25,21 @@ class OrderController( // create order @PostMapping("/orders/orders") - fun createOrders(@RequestBody request: CreateOrderRequest){ - return orderService.createOrder( userId = request.userId ) + fun createOrder( + request: HttpServletRequest, + @RequestBody body: CreateOrderRequest + ): CreateOrderResponse { + val userId = request.getAttribute("userId") as Long + val order = orderService.createOrder(userId, body.items) + return CreateOrderResponse( + order.id, + order.items + ) } } -data class CreateOrderRequest( - val userId: Long - -) \ No newline at end of file +data class CreateOrderResponse( + val id: Long?, + val items: List? +) diff --git a/ordering/src/main/kotlin/orders/OrderRepository.kt b/ordering/src/main/kotlin/orders/OrderRepository.kt index a7e1a99..b717808 100644 --- a/ordering/src/main/kotlin/orders/OrderRepository.kt +++ b/ordering/src/main/kotlin/orders/OrderRepository.kt @@ -8,7 +8,9 @@ import jakarta.persistence.* import org.springframework.data.jpa.repository.JpaRepository @Named -interface OrderRepository : JpaRepository +interface OrderRepository : JpaRepository { + fun findByUserId(userId: Long): List +} @Entity @Table(name = "orders") @@ -18,14 +20,14 @@ data class OrderEntity( val id: Long? = null, @ManyToOne - val user: UserEntity, + val userId: Long, // join - @OneToMany(mappedBy = "order") + @OneToMany val items: List? = null ){ - constructor(): this(null, UserEntity(), listOf()) + constructor(): this(null, 0, listOf()) } \ No newline at end of file diff --git a/ordering/src/main/kotlin/orders/OrderService.kt b/ordering/src/main/kotlin/orders/OrderService.kt index 67a739c..7c17476 100644 --- a/ordering/src/main/kotlin/orders/OrderService.kt +++ b/ordering/src/main/kotlin/orders/OrderService.kt @@ -2,37 +2,49 @@ package orders import authentication.users.UsersRepository import items.ItemDTO +import items.ItemEntity +import items.ItemsRepository import jakarta.inject.Named @Named class OrderService( private val orderRepository: OrderRepository, - private val userRepository: UsersRepository + private val userRepository: UsersRepository, + private val itemsRepository: ItemsRepository ) { // listing orders fun listOrders(): List = orderRepository.findAll().map { order -> OrderDTO( - id = order.id, // transfer the orderId to dto - userId = order.user.id, + id = order.id, //transfer the orderId to dto items = order.items?.map { item -> - // for each item in the order, create an ItemDTO + //for each item in the order, create an ItemDTO ItemDTO( - id = item.id, name = item.name, - quantity = item.quantity, - orderId = order.id + quantity = item.quantity ) } ) } // creating new order - fun createOrder(userId: Long) { - val user = userRepository.findById(userId).get() - val newOrder = OrderEntity(user=user) - // save order - orderRepository.save(newOrder) + fun createOrder(userId: Long, items: List): OrderDTO { + val newOrder = OrderEntity(userId = userId) + val savedOrder = orderRepository.save(newOrder) + + val newItems = items.map { + ItemEntity( + name = it.name, + quantity = it.quantity, + orderId = savedOrder.id!! + ) + } + itemsRepository.saveAll(newItems) + + return OrderDTO( + id = savedOrder.id, + items = newItems.map { ItemDTO(it.name, it.quantity) } + ) } } diff --git a/ordering/src/main/kotlin/orders/OrdersDTO.kt b/ordering/src/main/kotlin/orders/OrdersDTO.kt index 5bf0981..34ac72b 100644 --- a/ordering/src/main/kotlin/orders/OrdersDTO.kt +++ b/ordering/src/main/kotlin/orders/OrdersDTO.kt @@ -5,10 +5,13 @@ import items.ItemDTO // return this when user asking for order list data class OrderDTO( val id: Long?, - val userId: Long?, val items: List? ) data class OrdersListDTO( val orders: List +) + +data class CreateOrderRequest( + val items: List ) \ No newline at end of file diff --git a/pom.xml b/pom.xml index 6bd37a6..5875045 100644 --- a/pom.xml +++ b/pom.xml @@ -8,9 +8,11 @@ 3.4.4 + com.coded.spring - Ordering + Barrak 0.0.1-SNAPSHOT + pom Kotlin.SpringbootV2 Kotlin.SpringbootV2 @@ -20,6 +22,10 @@ + + authentication + ordering + diff --git a/src/main/kotlin/com/coded/spring/ordering/users/UserRepository.kt b/src/main/kotlin/com/coded/spring/ordering/users/UserRepository.kt deleted file mode 100644 index 24c2b3c..0000000 --- a/src/main/kotlin/com/coded/spring/ordering/users/UserRepository.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.coded.spring.ordering.users - -import jakarta.inject.Named -import jakarta.persistence.* -import org.springframework.data.jpa.repository.JpaRepository - -@Named -interface UsersRepository : JpaRepository { - fun age(age: Int): MutableList - fun findByUsername(username: String): UserEntity? - fun existsByUsername(username: String): Boolean -} - -@Entity -@Table(name = "users") -data class UserEntity( - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - var id: Long? = null, - var name: String, - var age: Int, - - @Column(unique = true) // make sure it's unique - var username: String, - - var password: String, - -// @Enumerated(EnumType.STRING) -// val role: Roles = Roles.USER - -){ - constructor() : this(null, "", 0,"username","password") -} - -enum class Roles { - USER, ADMIN -} - - diff --git a/src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt b/src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt deleted file mode 100644 index 180ac7f..0000000 --- a/src/main/kotlin/com/coded/spring/ordering/users/UsersController.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.coded.spring.ordering.users - -import RegistrationResponseDto -import org.springframework.http.ResponseEntity -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.PostMapping -import org.springframework.web.bind.annotation.RequestBody -import org.springframework.web.bind.annotation.RestController -import com.coded.spring.ordering.users.RegistrationRequest -import io.swagger.v3.oas.annotations.tags.Tag - -@Tag(name = "UserAPI") -@RestController -class UsersController( - private val usersService: UsersService, - -){ - - @GetMapping("/users/list") - fun users() = usersService.listUsers() - - @PostMapping("/register") - fun registerUser(@RequestBody request: RegistrationRequest): Any { - try { - val user = usersService.registerUsers(request) - return RegistrationResponseDto( - message = "User registered successfully", - username = user.username - ) - }catch (e: IllegalArgumentException){ - return ResponseEntity.badRequest().body(mapOf("error" to e.message)) - } - } - -} \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/users/UsersDTO.kt b/src/main/kotlin/com/coded/spring/ordering/users/UsersDTO.kt deleted file mode 100644 index 5a45b75..0000000 --- a/src/main/kotlin/com/coded/spring/ordering/users/UsersDTO.kt +++ /dev/null @@ -1,19 +0,0 @@ -// Change this: -data class RegistrationRequestDTO( - val name: String, - val age: Int, - val username: String, - val password: String -) -// To this: -data class RegistrationRequest( - val name: String, - val age: Int, - val username: String, - val password: String -) - -data class RegistrationResponseDto( - val message: String, - val username: String -) \ No newline at end of file diff --git a/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt b/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt deleted file mode 100644 index 2f9ae71..0000000 --- a/src/main/kotlin/com/coded/spring/ordering/users/UsersService.kt +++ /dev/null @@ -1,75 +0,0 @@ -package com.coded.spring.ordering.users - -import jakarta.inject.Named -import org.springframework.security.crypto.password.PasswordEncoder - -@Named -class UsersService( - private val usersRepository: UsersRepository, - private val passwordEncoder: PasswordEncoder // Added missing dependency -) { - - fun findByUsername(username: String): Long { - return usersRepository.findByUsername(username)?.id - ?: throw IllegalArgumentException("User has no id") - } - - fun listUsers(): List = usersRepository.findAll().map { - User( - id = it.id, - name = it.name, - age = it.age, - ) - } - - fun registerUsers(request: RegistrationRequest): UserEntity { - - //check if username exists already - if(usersRepository.existsByUsername(request.username)){ - throw IllegalArgumentException("user name already exists") - } - - // Validate the password - val password = request.password - - // check pass length - if (password.length < 6) { - throw IllegalArgumentException("Password must be at least 6 characters long") - } - - // check if there's any uppercase letter - if (!password.any { it.isUpperCase() }) { - throw IllegalArgumentException("Password must contain at least one capital letter") - } - - // check if there's any digits - if (!password.any { it.isDigit() }) { - throw IllegalArgumentException("Password must contain at least one number") - } - - // create user - val user = UserEntity( - name = request.name, - age = request.age, - username = request.username, - password = passwordEncoder.encode(request.password) - ) - - // save the user - return usersRepository.save(user) - } -} - -data class User( - val id: Long?, - val name: String, - val age: Int -) - -data class RegistrationRequest( - val name: String, - val age: Int, - val username: String, - val password: String -) - diff --git a/src/main/kotlin/com/coded/spring/ordering/Application.kt b/src/main/kotlin/com/coded/spring/orders/Application.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/Application.kt rename to src/main/kotlin/com/coded/spring/orders/Application.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt b/src/main/kotlin/com/coded/spring/orders/HelloWorldController.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/HelloWorldController.kt rename to src/main/kotlin/com/coded/spring/orders/HelloWorldController.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/files/Barrak-online-ordering-api-swagger-01.json b/src/main/kotlin/com/coded/spring/orders/files/Barrak-online-ordering-api-swagger-01.json similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/files/Barrak-online-ordering-api-swagger-01.json rename to src/main/kotlin/com/coded/spring/orders/files/Barrak-online-ordering-api-swagger-01.json diff --git a/src/main/kotlin/com/coded/spring/ordering/menu/MenuController.kt b/src/main/kotlin/com/coded/spring/orders/menu/MenuController.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/menu/MenuController.kt rename to src/main/kotlin/com/coded/spring/orders/menu/MenuController.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/menu/MenuRepository.kt b/src/main/kotlin/com/coded/spring/orders/menu/MenuRepository.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/menu/MenuRepository.kt rename to src/main/kotlin/com/coded/spring/orders/menu/MenuRepository.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/menu/MenuService.kt b/src/main/kotlin/com/coded/spring/orders/menu/MenuService.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/menu/MenuService.kt rename to src/main/kotlin/com/coded/spring/orders/menu/MenuService.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesController.kt b/src/main/kotlin/com/coded/spring/orders/profiles/ProfilesController.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesController.kt rename to src/main/kotlin/com/coded/spring/orders/profiles/ProfilesController.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesDTO.kt b/src/main/kotlin/com/coded/spring/orders/profiles/ProfilesDTO.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesDTO.kt rename to src/main/kotlin/com/coded/spring/orders/profiles/ProfilesDTO.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesRepository.kt b/src/main/kotlin/com/coded/spring/orders/profiles/ProfilesRepository.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesRepository.kt rename to src/main/kotlin/com/coded/spring/orders/profiles/ProfilesRepository.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesService.kt b/src/main/kotlin/com/coded/spring/orders/profiles/ProfilesService.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/profiles/ProfilesService.kt rename to src/main/kotlin/com/coded/spring/orders/profiles/ProfilesService.kt diff --git a/src/main/kotlin/com/coded/spring/ordering/scripts/InitUserRunner.kt b/src/main/kotlin/com/coded/spring/orders/scripts/InitUserRunner.kt similarity index 100% rename from src/main/kotlin/com/coded/spring/ordering/scripts/InitUserRunner.kt rename to src/main/kotlin/com/coded/spring/orders/scripts/InitUserRunner.kt From 33879753c04e8ed9059606e52da375ed87eb9542 Mon Sep 17 00:00:00 2001 From: BarrakBM Date: Sat, 3 May 2025 18:59:45 +0300 Subject: [PATCH 19/19] refactor to microservices Task is completed --- .gitignore | 36 ++---------------- .idea/.gitignore | 3 ++ .idea/compiler.xml | 21 ++++++++++ .idea/encodings.xml | 9 +++++ .idea/jarRepositories.xml | 25 ++++++++++++ .idea/kotlinc.xml | 15 ++++++++ .idea/misc.xml | 17 +++++++++ .idea/vcs.xml | 6 +++ .../kotlin/authentication/SecurityConfig.kt | 2 +- .../META-INF/authentication.kotlin_module | Bin 0 -> 71 bytes .../classes/RegistrationRequestDTO.class | Bin 0 -> 3706 bytes .../classes/RegistrationResponseDto.class | Bin 0 -> 2897 bytes .../target/classes/application.properties | 10 +++++ .../authentication/AuthController.class | Bin 0 -> 5189 bytes .../classes/authentication/AuthRequest.class | Bin 0 -> 2919 bytes .../classes/authentication/AuthResponse.class | Bin 0 -> 2433 bytes .../AuthenticationApplication.class | Bin 0 -> 614 bytes .../AuthenticationApplicationKt.class | Bin 0 -> 2097 bytes .../authentication/CheckTokenResponse.class | Bin 0 -> 2153 bytes .../CustomUserDetailsClass.class | Bin 0 -> 2578 bytes .../authentication/LoggingFilter.class | Bin 0 -> 3665 bytes .../authentication/SecurityConfig.class | Bin 0 -> 7955 bytes .../authentication/jwt/JwtAuthFilter.class | Bin 0 -> 4349 bytes .../authentication/jwt/JwtService.class | Bin 0 -> 3327 bytes .../users/RegistrationRequest.class | Bin 0 -> 3797 bytes .../classes/authentication/users/Roles.class | Bin 0 -> 1775 bytes .../classes/authentication/users/User.class | Bin 0 -> 3307 bytes .../authentication/users/UserEntity.class | Bin 0 -> 5546 bytes .../users/UsersController.class | Bin 0 -> 1527 bytes .../users/UsersRepository.class | Bin 0 -> 1331 bytes .../authentication/users/UsersService.class | Bin 0 -> 5970 bytes ordering/src/main/kotlin/LoggingFilter.kt | 2 + .../kotlin/client/AuthenticationClient.kt | 3 +- ordering/src/main/kotlin/items/ItemsDTO.kt | 2 +- .../src/main/kotlin/items/ItemsRepository.kt | 3 +- .../src/main/kotlin/orders/OrderController.kt | 8 ++-- .../src/main/kotlin/orders/OrderRepository.kt | 7 ++-- .../src/main/kotlin/orders/OrderService.kt | 10 ++--- ordering/src/main/kotlin/orders/OrdersDTO.kt | 4 +- .../security/RemoteAuthenticationFilter.kt | 4 +- .../main/kotlin/security/SecurityConfig.kt | 2 +- .../classes/META-INF/ordering.kotlin_module | Bin 0 -> 59 bytes .../target/classes/application.properties | 10 +++++ .../classes/ordering/LoggingFilter.class | Bin 0 -> 3647 bytes .../ordering/OrderingApplication.class | Bin 0 -> 578 bytes .../ordering/OrderingApplicationKt.class | Bin 0 -> 2811 bytes ...lient$checkToken$$inlined$exchange$1.class | Bin 0 -> 1799 bytes ...ticationClient$checkToken$response$1.class | Bin 0 -> 985 bytes .../client/AuthenticationClient.class | Bin 0 -> 4330 bytes .../ordering/items/CreateItemRequestDTO.class | Bin 0 -> 3648 bytes .../classes/ordering/items/ItemDTO.class | Bin 0 -> 2773 bytes .../classes/ordering/items/ItemEntity.class | Bin 0 -> 4804 bytes .../classes/ordering/items/ItemsListDTO.class | Bin 0 -> 2735 bytes .../ordering/items/ItemsRepository.class | Bin 0 -> 698 bytes .../ordering/orders/CreateOrderRequest.class | Bin 0 -> 2784 bytes .../ordering/orders/CreateOrderResponse.class | Bin 0 -> 3326 bytes .../ordering/orders/OrderController.class | Bin 0 -> 2826 bytes .../classes/ordering/orders/OrderDTO.class | Bin 0 -> 3243 bytes .../classes/ordering/orders/OrderEntity.class | Bin 0 -> 4360 bytes .../ordering/orders/OrderRepository.class | Bin 0 -> 970 bytes .../ordering/orders/OrderService.class | Bin 0 -> 5955 bytes .../ordering/orders/OrdersListDTO.class | Bin 0 -> 2762 bytes .../security/RemoteAuthenticationFilter.class | Bin 0 -> 3085 bytes .../ordering/security/SecurityConfig.class | Bin 0 -> 5180 bytes .../classes/META-INF/Ordering.kotlin_module | Bin 0 -> 123 bytes target/classes/RegistrationRequest.class | Bin 0 -> 3682 bytes target/classes/RegistrationRequestDTO.class | Bin 0 -> 3700 bytes target/classes/RegistrationResponseDto.class | Bin 0 -> 2891 bytes target/classes/application.properties | 10 +++++ .../coded/spring/ordering/Application.class | Bin 0 -> 588 bytes .../coded/spring/ordering/ApplicationKt.class | Bin 0 -> 2797 bytes .../ordering/HelloWorldController.class | Bin 0 -> 4403 bytes .../coded/spring/ordering/LoggingFilter.class | Bin 0 -> 3681 bytes .../coded/spring/ordering/OrderRequest.class | Bin 0 -> 2151 bytes .../spring/ordering/SayMyNameRequest.class | Bin 0 -> 2879 bytes .../authentication/AuthController.class | Bin 0 -> 4097 bytes .../ordering/authentication/AuthRequest.class | Bin 0 -> 3043 bytes .../authentication/AuthResponse.class | Bin 0 -> 2557 bytes .../CustomUserDetailsClass.class | Bin 0 -> 2690 bytes .../authentication/SecurityConfig.class | Bin 0 -> 8019 bytes .../authentication/jwt/JwtAuthFilter.class | Bin 0 -> 4473 bytes .../authentication/jwt/JwtService.class | Bin 0 -> 3373 bytes .../ordering/items/CreateItemRequestDTO.class | Bin 0 -> 3733 bytes .../coded/spring/ordering/items/ItemDTO.class | Bin 0 -> 3874 bytes .../spring/ordering/items/ItemEntity.class | Bin 0 -> 5404 bytes .../ordering/items/ItemsController.class | Bin 0 -> 2126 bytes .../spring/ordering/items/ItemsListDTO.class | Bin 0 -> 2922 bytes .../ordering/items/ItemsRepository.class | Bin 0 -> 766 bytes .../spring/ordering/items/ItemsService.class | Bin 0 -> 6126 bytes .../spring/ordering/menu/MenuController.class | Bin 0 -> 1565 bytes .../spring/ordering/menu/MenuEntity.class | Bin 0 -> 5260 bytes .../spring/ordering/menu/MenuRepository.class | Bin 0 -> 759 bytes .../spring/ordering/menu/MenuService.class | Bin 0 -> 4095 bytes .../ordering/orders/CreateOrderRequest.class | Bin 0 -> 2228 bytes .../ordering/orders/OrderController.class | Bin 0 -> 2514 bytes .../spring/ordering/orders/OrderDTO.class | Bin 0 -> 3936 bytes .../spring/ordering/orders/OrderEntity.class | Bin 0 -> 5107 bytes .../ordering/orders/OrderRepository.class | Bin 0 -> 772 bytes .../spring/ordering/orders/OrderService.class | Bin 0 -> 5378 bytes .../ordering/orders/OrdersListDTO.class | Bin 0 -> 2949 bytes .../ordering/profiles/ProfileEntity.class | Bin 0 -> 6198 bytes .../ordering/profiles/ProfileRequestDto.class | Bin 0 -> 3509 bytes .../profiles/ProfileResponseDto.class | Bin 0 -> 3912 bytes .../profiles/ProfilesController.class | Bin 0 -> 2801 bytes .../profiles/ProfilesRepository.class | Bin 0 -> 1209 bytes .../ordering/profiles/ProfilesService.class | Bin 0 -> 4121 bytes .../ordering/scripts/InitUserRunner.class | Bin 0 -> 3772 bytes .../ordering/scripts/InitUserRunnerKt.class | Bin 0 -> 2158 bytes .../ordering/users/RegistrationRequest.class | Bin 0 -> 3846 bytes .../coded/spring/ordering/users/Roles.class | Bin 0 -> 1846 bytes .../coded/spring/ordering/users/User.class | Bin 0 -> 3356 bytes .../spring/ordering/users/UserEntity.class | Bin 0 -> 5595 bytes .../ordering/users/UsersController.class | Bin 0 -> 3262 bytes .../ordering/users/UsersRepository.class | Bin 0 -> 1391 bytes .../spring/ordering/users/UsersService.class | Bin 0 -> 5828 bytes .../META-INF/Ordering.kotlin_module | Bin 0 -> 24 bytes .../test-classes/application-test.properties | 10 +++++ .../ordering/ApplicationTests$Companion.class | Bin 0 -> 2801 bytes .../spring/ordering/ApplicationTests.class | Bin 0 -> 11634 bytes 119 files changed, 162 insertions(+), 57 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/kotlinc.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 authentication/target/classes/META-INF/authentication.kotlin_module create mode 100644 authentication/target/classes/RegistrationRequestDTO.class create mode 100644 authentication/target/classes/RegistrationResponseDto.class create mode 100644 authentication/target/classes/application.properties create mode 100644 authentication/target/classes/authentication/AuthController.class create mode 100644 authentication/target/classes/authentication/AuthRequest.class create mode 100644 authentication/target/classes/authentication/AuthResponse.class create mode 100644 authentication/target/classes/authentication/AuthenticationApplication.class create mode 100644 authentication/target/classes/authentication/AuthenticationApplicationKt.class create mode 100644 authentication/target/classes/authentication/CheckTokenResponse.class create mode 100644 authentication/target/classes/authentication/CustomUserDetailsClass.class create mode 100644 authentication/target/classes/authentication/LoggingFilter.class create mode 100644 authentication/target/classes/authentication/SecurityConfig.class create mode 100644 authentication/target/classes/authentication/jwt/JwtAuthFilter.class create mode 100644 authentication/target/classes/authentication/jwt/JwtService.class create mode 100644 authentication/target/classes/authentication/users/RegistrationRequest.class create mode 100644 authentication/target/classes/authentication/users/Roles.class create mode 100644 authentication/target/classes/authentication/users/User.class create mode 100644 authentication/target/classes/authentication/users/UserEntity.class create mode 100644 authentication/target/classes/authentication/users/UsersController.class create mode 100644 authentication/target/classes/authentication/users/UsersRepository.class create mode 100644 authentication/target/classes/authentication/users/UsersService.class create mode 100644 ordering/target/classes/META-INF/ordering.kotlin_module create mode 100644 ordering/target/classes/application.properties create mode 100644 ordering/target/classes/ordering/LoggingFilter.class create mode 100644 ordering/target/classes/ordering/OrderingApplication.class create mode 100644 ordering/target/classes/ordering/OrderingApplicationKt.class create mode 100644 ordering/target/classes/ordering/client/AuthenticationClient$checkToken$$inlined$exchange$1.class create mode 100644 ordering/target/classes/ordering/client/AuthenticationClient$checkToken$response$1.class create mode 100644 ordering/target/classes/ordering/client/AuthenticationClient.class create mode 100644 ordering/target/classes/ordering/items/CreateItemRequestDTO.class create mode 100644 ordering/target/classes/ordering/items/ItemDTO.class create mode 100644 ordering/target/classes/ordering/items/ItemEntity.class create mode 100644 ordering/target/classes/ordering/items/ItemsListDTO.class create mode 100644 ordering/target/classes/ordering/items/ItemsRepository.class create mode 100644 ordering/target/classes/ordering/orders/CreateOrderRequest.class create mode 100644 ordering/target/classes/ordering/orders/CreateOrderResponse.class create mode 100644 ordering/target/classes/ordering/orders/OrderController.class create mode 100644 ordering/target/classes/ordering/orders/OrderDTO.class create mode 100644 ordering/target/classes/ordering/orders/OrderEntity.class create mode 100644 ordering/target/classes/ordering/orders/OrderRepository.class create mode 100644 ordering/target/classes/ordering/orders/OrderService.class create mode 100644 ordering/target/classes/ordering/orders/OrdersListDTO.class create mode 100644 ordering/target/classes/ordering/security/RemoteAuthenticationFilter.class create mode 100644 ordering/target/classes/ordering/security/SecurityConfig.class create mode 100644 target/classes/META-INF/Ordering.kotlin_module create mode 100644 target/classes/RegistrationRequest.class create mode 100644 target/classes/RegistrationRequestDTO.class create mode 100644 target/classes/RegistrationResponseDto.class create mode 100644 target/classes/application.properties create mode 100644 target/classes/com/coded/spring/ordering/Application.class create mode 100644 target/classes/com/coded/spring/ordering/ApplicationKt.class create mode 100644 target/classes/com/coded/spring/ordering/HelloWorldController.class create mode 100644 target/classes/com/coded/spring/ordering/LoggingFilter.class create mode 100644 target/classes/com/coded/spring/ordering/OrderRequest.class create mode 100644 target/classes/com/coded/spring/ordering/SayMyNameRequest.class create mode 100644 target/classes/com/coded/spring/ordering/authentication/AuthController.class create mode 100644 target/classes/com/coded/spring/ordering/authentication/AuthRequest.class create mode 100644 target/classes/com/coded/spring/ordering/authentication/AuthResponse.class create mode 100644 target/classes/com/coded/spring/ordering/authentication/CustomUserDetailsClass.class create mode 100644 target/classes/com/coded/spring/ordering/authentication/SecurityConfig.class create mode 100644 target/classes/com/coded/spring/ordering/authentication/jwt/JwtAuthFilter.class create mode 100644 target/classes/com/coded/spring/ordering/authentication/jwt/JwtService.class create mode 100644 target/classes/com/coded/spring/ordering/items/CreateItemRequestDTO.class create mode 100644 target/classes/com/coded/spring/ordering/items/ItemDTO.class create mode 100644 target/classes/com/coded/spring/ordering/items/ItemEntity.class create mode 100644 target/classes/com/coded/spring/ordering/items/ItemsController.class create mode 100644 target/classes/com/coded/spring/ordering/items/ItemsListDTO.class create mode 100644 target/classes/com/coded/spring/ordering/items/ItemsRepository.class create mode 100644 target/classes/com/coded/spring/ordering/items/ItemsService.class create mode 100644 target/classes/com/coded/spring/ordering/menu/MenuController.class create mode 100644 target/classes/com/coded/spring/ordering/menu/MenuEntity.class create mode 100644 target/classes/com/coded/spring/ordering/menu/MenuRepository.class create mode 100644 target/classes/com/coded/spring/ordering/menu/MenuService.class create mode 100644 target/classes/com/coded/spring/ordering/orders/CreateOrderRequest.class create mode 100644 target/classes/com/coded/spring/ordering/orders/OrderController.class create mode 100644 target/classes/com/coded/spring/ordering/orders/OrderDTO.class create mode 100644 target/classes/com/coded/spring/ordering/orders/OrderEntity.class create mode 100644 target/classes/com/coded/spring/ordering/orders/OrderRepository.class create mode 100644 target/classes/com/coded/spring/ordering/orders/OrderService.class create mode 100644 target/classes/com/coded/spring/ordering/orders/OrdersListDTO.class create mode 100644 target/classes/com/coded/spring/ordering/profiles/ProfileEntity.class create mode 100644 target/classes/com/coded/spring/ordering/profiles/ProfileRequestDto.class create mode 100644 target/classes/com/coded/spring/ordering/profiles/ProfileResponseDto.class create mode 100644 target/classes/com/coded/spring/ordering/profiles/ProfilesController.class create mode 100644 target/classes/com/coded/spring/ordering/profiles/ProfilesRepository.class create mode 100644 target/classes/com/coded/spring/ordering/profiles/ProfilesService.class create mode 100644 target/classes/com/coded/spring/ordering/scripts/InitUserRunner.class create mode 100644 target/classes/com/coded/spring/ordering/scripts/InitUserRunnerKt.class create mode 100644 target/classes/com/coded/spring/ordering/users/RegistrationRequest.class create mode 100644 target/classes/com/coded/spring/ordering/users/Roles.class create mode 100644 target/classes/com/coded/spring/ordering/users/User.class create mode 100644 target/classes/com/coded/spring/ordering/users/UserEntity.class create mode 100644 target/classes/com/coded/spring/ordering/users/UsersController.class create mode 100644 target/classes/com/coded/spring/ordering/users/UsersRepository.class create mode 100644 target/classes/com/coded/spring/ordering/users/UsersService.class create mode 100644 target/test-classes/META-INF/Ordering.kotlin_module create mode 100644 target/test-classes/application-test.properties create mode 100644 target/test-classes/com/coded/spring/ordering/ApplicationTests$Companion.class create mode 100644 target/test-classes/com/coded/spring/ordering/ApplicationTests.class diff --git a/.gitignore b/.gitignore index 549e00a..f72c5bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,33 +1,3 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ +ordering/src/main/resources/application.properties +authentication/src/main/resources/application.properties +src/main/resources/application.properties \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..075303c --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..694ced6 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..b301a31 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..214cb49 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a2c32e8 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/authentication/src/main/kotlin/authentication/SecurityConfig.kt b/authentication/src/main/kotlin/authentication/SecurityConfig.kt index c90be75..184cbb3 100644 --- a/authentication/src/main/kotlin/authentication/SecurityConfig.kt +++ b/authentication/src/main/kotlin/authentication/SecurityConfig.kt @@ -34,7 +34,7 @@ class SecurityConfig( .requestMatchers("/authentication/**").permitAll() .requestMatchers("/authentication/login").permitAll() .requestMatchers("/hello").permitAll() - .requestMatchers("/authentication/check-token").permitAll() + .requestMatchers("/authentication/check-token").authenticated() // swagger .requestMatchers("/api-docs").permitAll() // registration endpoint diff --git a/authentication/target/classes/META-INF/authentication.kotlin_module b/authentication/target/classes/META-INF/authentication.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..e0ddbc886fd8c79c5fcbf22a5a98f1b567025596 GIT binary patch literal 71 zcmZQzU|?ooU|B!*v>YWsXfVFM!*`>PeZIy@_mc1o@nD5!d=>?x0=TahXB z3FInUPNf!ayK6USor(fyJA;U#oa^Rs1_Q86^kdLK+JH&drwVHsB#<+qV@M!-bXx`~ z45y)CL_m}?FmO_Fr!q)K^4BsjBP!371Y52Y7+&mtBy$3(O($3i^LBiyaMT>nh6-0z zM(JExpqK3Xt<);+ZY#TH#oyWWJ;w`X1=`HTPUg){<`O-u_`44Te$$z=S339?g{JbD zG?|(U0vTmwvg+KooAp58Pg5`2bTk3~SM_x&#Rpz^k%qon*|@J8TAu?oz0KcOjA z!t>%>o<*&u{i;^z zAGpC5DH+&az)JaB=Q+eEx1C_iuimu1YTc2Oi@slL?sh5Yj@%vCxcXq%>7u^gq2J2c zkq8#-dVR$WoVg6{zq4FykJ^&R*37*9_CGLSTi;2*+Y|mn$;gohN&3?WP3U5 z#`DjN;b#voY8S+{Gufo2jcONqIP07foRcx1QuFgKlA2}QN?QYpyZO^+J)|wA8PkIu z@@$KqwT_Xd5yQ|T10fZf2&vFWNQGtyCT<cirKxcSo~W$px}H1|l5 z9*#^r63c^;!*tMKkfXYhwoD4cXxhSFD?{OaD6wW=C=6X_YxY~2=U*k+)wL=cCNtb` zH(3o{;PUeFA!X}TeOK}&JzrxJJGtEC+KyB9_FU<*Ag;FGG8SP}!UK!0=PWgMHk`() zDjId@e#Ne@*$r3mv2gM*R_ir80BS{@ptZtKK+fz#*69+{-zuUb=ARJ9lJ_FWw=FnT*VoU z+oT3{qJaB(>G+vSgh`wsnhL2zRn`d-#ji2?PZE)0N*ZG1b+J@xxvux@ikT-%_YgvG~b8GtPw;GZ8WB5=AK= zB7lJcZnFs}$7W-b0!z5VG^@1yg*vJ&tQM!gL_&W&{Ufx0Akp)9`Wdv_%Jw;aPw{>z zRQAb_eXcafjFTDfSezg~vCr$#byn%>Lo#Lj2gg&;G6MtQl~B&9Q`zrYtGJ6bx~Wc? z{{rzxISJK?5`rtLsnj`YsA7ln11fyL6a8=fe=Eka$a?0*~em Kn*SBQpZ^b|M)F1g literal 0 HcmV?d00001 diff --git a/authentication/target/classes/RegistrationResponseDto.class b/authentication/target/classes/RegistrationResponseDto.class new file mode 100644 index 0000000000000000000000000000000000000000..06740b4dd8639599dface2c2f1b0d2391e8dfabe GIT binary patch literal 2897 zcma)8TT>fl7=FIZX%hl0X*rjcwrGLGhEi>-(9*M{23mnqTRbgcg(b-@=G!p##_3gm zLPx#y!ttUPI%5x0XB=$r{1g5W$MN~HO9-dI8M5E|z5Bk;dw!R{{(bcafGhYypmWAr zwxw4wJ==9=EV<@7(z@=sF$e);)m%5TCDU2X-d}fmyF& zJIiCcIYaXTv9cwlxoipORcTcmvrO`2-mNTWS1oU`V%m<(nvUaoH9ur_+V!TZrP7#= zn84AZ>y>OLySiS^+K#96OWB;G3`)BoV`vg+FRWOFVxV@%tk41lclhWBv8RtoG@~Vf zBwBUo0-?d7`6MDpB@o6Tfz1+RVq{ z!J*yI0!@^;ThCOY;Feh!%kj=oy?z;`xq`d)P+;Q!RbpSKRH)GeV>v01RFDHp)>me= zE%S$B(8)*X1}IaOx8g2M zn$A+mk^_0yEmqg|XsCv$w<*p&T(kBNUucl8XK7ai*UVCB*7mHiBu*onz&jXeje;$4 zq0!O(2eH9OAf$lKrnn2^6jne6`Dw(0l9W4MsSIh;@6eSE+@P_bmKMFfST z*4I_D#H6)1`m!0z1A&O^t*C)y&i0>rj=Z^8vN$BVS+Q;?$OA{XZX=1SxTZ$<`u2GZ z1O(dh!6IQ1%_Y+_X-6xshZw(5kGOh3KorUU##XlxQcKM6-y4rkB(yFqp&1*G68zJQ zmV~Cqc{cG>d|jRT>&JT6#-mYfL|ko8MGdV-8wv3YtMm1bQO$_liW_ltn|$*)L^@HY z`-~>iRMvIPSFBMrRSJt+hm0fznn!h`r6=4aM#SWsCkmpKT!XYA-R8qR5i@N*294@; zxF@VfjTo7mo&-$Yh`s(fno?nMoiO+ov&up_p3O1gCxNR-?IC%6?)K>-*Fo=0mG8<{ z&RMsm&01aA+S*)4e*d)QZO59fmKUwcoT{g)hg&d9^Jc|X_kcOD6RW#7h{NR2!eeFK~D`{S2MMnP=$!m9I72tHFiY zpG`3MZ08rJhx8}p_xljM_wq)tz!gO)2Q=I#w^<9k@_lK|goXS#= z)kI|YH+23&!Z)v?0!=HENnao^*%)&hj_wK6y%VVUK%irFpp!d25(g^x@2On#;$UTd zNLW^ti%FiUKpl+*`W@Q+bmj#HR7^gaUxSW%4La&I=m=`in4|;iVZ`wk-X^y4;VeCf z@a*dgfBQXjRh4{SBp|z|hSQnn81!9Ppja4Mlj^dedImDApsHPqQsuAv72X53ocF8Q zvPU(A+Sq{`6GYL7q7XWtV{E+FIJTnDNPjur`;@QzTy#)OM=Qp0v1Yb202a7}3C5yg zTBD50>-pjIPl$w{rvHTY10tcP=?!R8%0h;}m$*@5Dl5EqZ{EYomkG2TtFy?Tn@K# z_y~EDn95-qw-+EJ?%?AE9Fpjjn30Ipp1MR-;)q0_#8HW368#d#B`($8UY0mlBZeeq N@i{H&v^2_J`aduHaF751 literal 0 HcmV?d00001 diff --git a/authentication/target/classes/application.properties b/authentication/target/classes/application.properties new file mode 100644 index 0000000..f0889b4 --- /dev/null +++ b/authentication/target/classes/application.properties @@ -0,0 +1,10 @@ +spring.application.name=Kotlin.SpringbootV2 + +server.port=8082 + +spring.datasource.url=jdbc:postgresql://localhost:8080/myHelloDatabase +spring.datasource.username=postgres +spring.datasource.password=Barrak2000# +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect + +springdoc.api-docs.path=/api-docs diff --git a/authentication/target/classes/authentication/AuthController.class b/authentication/target/classes/authentication/AuthController.class new file mode 100644 index 0000000000000000000000000000000000000000..d6881810b1c97b64084f27900dde919d6e160a38 GIT binary patch literal 5189 zcmbtY`CC-i8Gg?&%pHaih7lLsQKBsBC1{!jVgslVibzl~M3eS1a~UoS_mX?=fOa*h zZPPa0(j`szrdztFt%}6wX?^@L|4RRc_UU`>T$mNq^m&+j_V0VY^?Zj9|NFr|0rcap zz-}Yw&6u`lr3}wYb+Xi*03}Bxv5z*nyyUI7tf=Mb$ki1;@q=rDJXsIMhB;Zkyhsne&QBrnh4vjz%P6Xh2gG(J1PohzZoR ztA$!@jUkL}0)rddpj0uwpH!ML4h=1J2w{i7z{d0*#-?#Zu}hKLEwJ|i29Bc+d)3~3 z0td?XRva>22s zNh)uda-!)66((tT6|AwckNLvs- zNF*9Q&P-9XllGf_K>na-r2*d)&+?7!5D;#;8WqPxqgU;T3#J;Q2>al?r-Z zLZ_Xaoj!FnWiF_SLBkZ;4cW{_R(hW@(mpqz2V0{^$BeYO3eKLFgAJ%5x^HheR zb5*7bfjXs_K(8-s%%)6*s}8!FVu}KUQu-vBI2uY%3G{5tq*^2j?5ci2zq6 zf|T@4`r7Te!)<+NLZx?fu_=+=^x`A@Kja9Rx59)Vz2P@Ak{}X>c>u@IBG0= zb`aZ0P-vg!yCH3O1{s9r7i;(s66#Z@J`fOe$Iw+vjk?)OKQ2Vmz3XRUq3xkqC~@z4 zjDM!og*vwwDziSJ7ThDA8Z^+Ys@%~$3MT_V; z<+CWA^0}8z`2dQh?!On|Yax{G5lUSZrFNyiQ_;K2^M`VjqL4cF5rSXCpLnqpWdo+m zQvWMB)6qGPtK&K5s(F)ll_jmItl3|9lhK6-oitszam2FC(cJu$>0U6nN8K|{%E(R_ zuBFDoWLr6{wO3gQ(FC1s#!0U&GRbZ_?-{8%dTKzaC7?7>1=If0wKXy&JmNz(%Zb4( zt8tU`W9OZmn=(&ZSre^%-h}DMVI9Sm)47c8on5!Ev-9vR?CCsm3$2|k;ag}^ z$3yr#zdJ~-g>Tf|1hyZWaR|*gj4dqwoA3{=AJ4PEV>rkWnFS)Lo)RSF&nfsSc8{s& z9RjMvn7EBA&(z+< zE0Zm?%P`)*i_~P&T*maj$f*Xm`K^ce53XqF)>x7&1??fs2-UNdBDPVuBUD8nfsUgC zSJ34v=>&K5VIMM>A?$GqV_{Z3@>$!?AxkB-VF2^6eI-q=DRY`M9E!b6J`HR;`Rlq2 zA!&kQpSii4xrnxKWDL=T0Hmc>*m+s*D zrGo7n2q!{IH_~pKX=!Eet@(3n5S!uRHPWtxDDgm8t`F;Vd@+FaGTA9utzF44`$m0Z z(ucN!Zzv0W%eT;Xm+=E7eBM9v82hNwXK94KB8;tT7+Y}zZ&$_mr4ltNuPoQx4bIhI zh2Iz{{Fz0~Um|t*z~}#0U+On$(jRi|9f=>|$6WXc2YD;~6hEV6KfjEcA^c(pzZ}B5 z_!YbO^$>o8-};vP9p1Z)?GgtielMX(v`9oHc1hGp?3IW~?3aj0EchE-iPt1vm-vIk S4T-lU4oUn`qC>)wnExMOn#w%@ literal 0 HcmV?d00001 diff --git a/authentication/target/classes/authentication/AuthRequest.class b/authentication/target/classes/authentication/AuthRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..0c1bc8724c668103f7895a511d326694a9d05369 GIT binary patch literal 2919 zcma)8+j7%Z6kSKY$&QmKhTI7RNJ|pCID{5x6K_evyJhU_AGIXYs!dri$Kho)R9ZPYX3#2o)&OTfFtiAT-Z2PZ&U;F{!BEAsl z(`#PIuspM%d!}t=FLFC)+^ZR`7lRPcR`fMJThXoM?DeG;qd;v)AUbJUrgu)@*l>Q+ zVBT{~Yk6X)W@JG?t+|F{>8l3Cs_wd9+fGs7Xx?^~vnz(THz1X`92 z?^Yux`-ew%!uv)y8rez|?A5Amv0NtvHaFvRS+J}31*ZOAIo?D}MjTBrq@w~!i8@p? zzS3(IPvGA0n-1=zzf+TIQU!$=c@t(5hjB!bImWK>Y`?+SHBDVQywO)@MP_iLvCfJS z6{7+}o6TujYj)Yl`Vg0Fi~W8@FL<_dKZcAz_o`kteD!V9D^YSi-SSw*@0xQOpv)Lv z$u3UoRz|nds~9Vw01=NCKTqaU#6SESGeb(HD75+5fpM1Hdza5{na@c~DHW4QJ1 z5HyZ*a_AK%t+ScSMl5#)A~vTDuOxH!`g_kyuP;>$-Vs%IjLQ;o&r96!k;D`($xHm< z)*Blb2z2CwQNkkXMcvcsM_FA9F@7N*aruCNC{zE9DR*O(ip=oe>kp13lpZCaXzLFW z{3u#mLQ&&fTewQSDp&R8L$zo9!MHLeraDtmP3cp{LR`agefeWl(IVI4T3qg?Up)*_ zPBi2Jt%WiVtE%E3tV{KyG#1zPX-OKij;mT*U${q%iRo95Bt$#48f8Jb!-sn$<~kZq zRTAzCt5GdRWt|b31WHwlz5F?vl3{X~F!;8uqf4M)Ub)TR3EmISu`3nBIbP;u=%1_c zCuG&gS!G^_K2Q#A$7)RSEuflz z2OBThbglEAUMSD#)c`3mZ`YiHamAFrdIQ*nT?lGZw(Yr|qgQ=U7biG#!mPZ4lpOKQ z$Sv-oT;p6*a@cRvCAjD0Lfm$q8TOB+pP+j*^8~%W^0k87 zb+|D5^(r(>6E=rF%AZg_=tFSd&mF-6DpHaJ6x^YZS*?q4YQ?qyVIf*Ld@Y0r9SalD1Mi7h#t zB!dXofr0S1-$RvE$qz&Vv3F)Poq393pUNW5!cbadmyI+skYNR7?b_r~etTcwJz$f( zU(L2%sww0I4``exib52L(ESt>ll|JEl0>8Y@ltH}M(QA`PxG+tZ5(<&ewa zS`Hr}PZ2XY%;NeYgo_*acoF+t^t+gI5vxB{7f}}nT@1K5;Np;rK^KQzoU6aR;NnzW R7;!O=&*@2}r*VGM{{ciidny0` literal 0 HcmV?d00001 diff --git a/authentication/target/classes/authentication/AuthResponse.class b/authentication/target/classes/authentication/AuthResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..d04e23af72b2e784862254ce75ffa8e7ec74061f GIT binary patch literal 2433 zcmah~O;a3I6g{u!t7!(NA&DW7L=6}QCT0LNMoFR&6PY-W2uMma={{2X_AUn7A8A?lVy3{bY~a>Ayv%#xP3p)J@4MjKmR@X3&0d^3k=AH zT6cWqR-|$Rzc|I~yc2E)e&}Q%1ndpDC5xW)*NQh+Hk^veAR&;xklIRiW-EWXZ21hzz;HW@St-GPXsq!IwO$wN6j#`W|Kbjxe?^3|31U0ft%E#%o z5^UZP7;ne_oWw&TY2;~(&`t?twUeP$=NsAZlz_}1YPla%sZA7z;18u$Lu6-=hW^ebh56_dubr~|(Ri{~(r9E92sb?^e#Tdpd zyn}byf6liJ>5-K^{r4Q~SM0xlZOzsoDKGCoHlJMa99_4v?p)I@U)fBp7+HLXN!?7B z_BKzfAkb5eTbi#VSEZ7SW7M`1Oj+oqLoW~zRm#6}^=*u&Rrba9&fPPX(PvnOy>r*% zpJ8`fhMDHx$z97$y_-+(nSDEVCyX&M-PN16jecV+@$~1kVJB~N*cpABd3G;xWX1P!y4cJVBD?v9+?7xO(W_a-6rC(V?de)?-V zr!h|mok{oJ;lSytTVi**vYJ&r@I0q}zRFG=m~U|K)|`^R<%TXFVrq9dayCTukSn{s zGuNoCIQ2#SSeophBE2P9clA9M4!!8BH6HgkwWE${ePji7Eht&3&dSZ$leG{u>J{g@ zt7Dyr-7Xyf(4Gzg6{@=2jGTrT=S)a8-?UecPBJpfTbjGc-Q>=xg#_k!D^u6tZWnqx z9wRsU2)(0)KXB|f$_(7(+D*+g^(=bHalb{`Ymp82P|=tje|WU;3sTAL!rw4{LMpLc*nu&tp`7FIF)lZSN$t{r#&02!G5^KU4Db5+BI<@) z)D7bzt`Jy@t`DdbSI0#j6IkSGu(rP7zD&)JSfL*;BT>Rs3DYH9#V0)CS_#+jDHTG@ vptKA-#PJX}LS&k2Iz(TH6CwIT41~DQ6kZH5);tV`_zX)7pc~*Ee{cN{VEQD* literal 0 HcmV?d00001 diff --git a/authentication/target/classes/authentication/AuthenticationApplication.class b/authentication/target/classes/authentication/AuthenticationApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..e0c394341e379bd2fffc7cf2b204dfb217e70c87 GIT binary patch literal 614 zcma)3v2GJV5Ph?@&(2{ICjsI>08t=?6kG^pqDT%BlBEMAg50=TpEu6N=UwY|FHrhh zQqfW&QAAcsJ_<2wT#y2ZX6C(_r`dfoKY#tW2GGG%!mcd+xiVg7(rasy&Mn%RPV;4_ z4kENJc8+gv#!VUK2G$F{-E&s{UL%!e08nj~o(?Q(KG@ zH!ZXoofUGTKHFlP46OADPqCRbXL?i?Dmh(9PPp;cFL}UvI<`L7CV8j497->_CMK5^ zc1$6xga87Kx&B25w$Etzitv0sYsR82V$qt`)QbQf<`xaxzfGCppNuvXR>Hz?a4N)Rsl2-s+&( z{#f#nCaR~MW=Y2w>lYVucm~1iUYZKq=bt@f`Z}28T-*DO#y186k2uDh!6Lp8b{IAP zh_J$)pn1HA+jzqHkold3riQzHRJvI0Vy%l7))``>i%s0?gB!sEaNudG6z!d%yGg?(yIM{PhAr8=DNO2!lh@2`obd zmg{Kkxovwqwj<4UkO5;T9Epk0Y~c*FC;cPSAZdajITDt`uvFdaUg~>+XE}pbZI|@I z8~6<6uIml7BQxlGbl%s5JOw})Z{Q z-!l9RIKxfj&@_h8wWq=pBa;p?+^xoZnEBX>NiMv~A&2)l-b4O8sxYu@t?hZ@Iaw$$ zqz!lc{K)}BZ7!||vr~%)8wqnL;s(b878!2D^^w^OmKdsUn)3`kqzcKL`D2;O0~zFR zt~b>Bt{Z5*sW4Wf3|1HtUPz_r$Fs0$3*T?O#+}-}=-Xz@ z3W=q+EEmpBR+Ktxc<2z3qUjU9Ok)bzN`j z{NDX?qp3G8!;dVE&qN0!81d|l1y{Y2=yGweCY z)mJUYw9ug-DG5)cTt*6MB+#UtL$hRkRV`jS#dTGEaf+K~_@JA3P+VSHi*~2@_?P0H zQ&fKblg=t=(U_-uX>cr3f4ocW@mrFWNLD1tr}&Ic6|h8_C9+8Ppq57S1Nx|OGh}J; z9epW!vos~~kVXYx;(K!O9i!js>zrpa{h@=hO#d&$gW4Vv9jG0wb+C@lJJ^8MK^^)Y kn2!eT?IGhM<>S6D7c|l@?c)plKqz@a`HH@;r>DR97n*cyZvX%Q literal 0 HcmV?d00001 diff --git a/authentication/target/classes/authentication/CheckTokenResponse.class b/authentication/target/classes/authentication/CheckTokenResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..977f339ab8fbaf29f36f159e97e09c45a904d6f3 GIT binary patch literal 2153 zcma)6TW=dh6#iy?TW_6Y4xOOV5J;6KRtw0$w2($#KvWCJ;Xob+3ba<6ZYVHP``@!?1@aq?danap z6|n057MYRs8DiD_?dt;LB=A&lBQ-zRC|`5bdLUgdEKASxRTO$yUh>sayVaW2%(E7` z9u_EQ{LzNi1o>Nhws)Q!LWg zrLMCRlto8v`i%wYHCj$MTJ!y8dwaIaETPz?+2^=&ecO40`C6BK++$4IV-d{DR%_W+ z4vX|0Ml77fXkQj%0*7=5bj%YD+Uofto4v%8Zpx6MHJqqFD+0Y8^P2B%9=KY)I;O>nXV_ID5DQ0bB$e2#u|2Avb>1y82>D9u6o2lx6ZBnM8X&SK+)q?6g z)z*w@9~epxifOU%;HwlJ3)J>d7LfTMztwVr(@oyKbX>i@n(H}B?X7huSkYP4N%iZpwJHNwuM?#m_vyPbkXw#& z0@m=@)i$5HEvMq`xS>naxz6<$=vh{>-dvR13Bc&1)_YL<+^l849n_sGu4ZyH@mYNW zzJ1B}Rj2~F9Wx7YhL=4ZRko<#M@lBM!qBR^0XJH@>7d%W`r?*&?DHitNOVzBcV z#8Ij>>Nqhoocm9tzqkccM{;p;_*Wc@(JS0aLFgnL#|cu_KBa`ZrLFH_0_aeQ1Adso zZUTa@!qncWapt1)e#7(~qISn`CZPyMJ(I-$aT5R75@;WSym$!rL4Tc1Vr$ zCp37O343J?sR~}L;I#@~$1FvhtKd8?tU-i$0~goOAEGbBT!>sWW<%JaRu)4HuyrHl V*$|VFa6B3>VUcI(9v7T=5$eVEjzdA z8b$t<D_FL^ zy;IaJ+vBcn6!fI+kr~1=$=)zShq=Yge3fn4kjBwNh8ywJSx+QtPSR3HjsS)cL92!q zL>U5cNvnuyXh0jo^|!M!j3#t6K|v=&gSTY~(teh+e#8a0qLe&pKIZ&8;cR=8NTGhP$f< zy^#TSOrx-7xR#`=heKy&os6c}ghnZ-TTb@ml14{M+B3}jf>EkU3MXxwyZ(UZbgiYG zvTO2rORDavYFT>&F9vBIHIP4o^pD8_Mf*$24M}UXE3~T!ApnD@6wwOp(Xm+bAuf%+ zLi_00Pw4u=f0>~*LN9|fCN;FuF9MU!Ix9TrMh{WMUDcDNZ0C$O&;0K6zfZ%-M z8&5z^%t)XQ3k3FMMY3;2J(K$AK7bsp8ojeI3%Y31GWG;vgzx7cefRt-DBTX_2(6?2NGK zE$%JpC25m3?dj)!>eu%4ge30i;pAg~R8ODTU4ghI`1FHjRx|Is@AF>fdFMa>{p{ZW zrtxQi^JYVpEl1e}Q`xR#2(R!<4N!2_U6^KvSj;*cHVX1YGr=(#zj;s8TN@KxQ3yo@ZGKo%lU2#>_c8rb9 znqh~28FY~Gm3BcUkP$dtC|iX}cRqs{;byr{k3G>xk1l#E;J8&*MS@XeJat)xW6 zX`I686rRR2NpvOAE%4fLNo**)YRtL>;;31(P^N+~fOkE!Ue`5nR$%1hVGmM$K8165 zR$$_Z>;|FTHGENE^dyGEGzOM0rI5vQjPt=d*RMlKpH;Hk)4K4ARFkX@Uw@6TdIirr%RR!Z{f6@*;3ZD=b2li z%7MYPnKZtRX?>w)1kN5QI50LgHkicgtkzcQc;jK6d?m^2D`vG}rEw#mg*VBq2WcaL zoWQA&oRsxY8Dut3T8fnP4T0F5`JSRP)MsTXZY5zNyxet9G~0-DlB)~x$p8ev?6GFz^+z<(}5}|(cuLhSrZL8 z=P*1?H@q&oN|xA%8%zM7AxynOL+@>}l$-oCk!6l3(wg*#y4&Us>pjNFA7mi#LxFVj zeGmW}I+Bhgo4MsGCXb!B#y1FiFFD|;e0cj<6=u;?Cf6dh%_zes^w6#cnh^|Cz-xzaWs z?}>4ab53wha&G6GnmaY$)6>x+k)F$Nr88X7vR!kT&;J(Zt0Phz7kK5!7<|bClCIO! zuKf>0vKCoj?|C{_Q7oBRw`d7;=WWMYXw=p%Z`oY0awU^@3ubl2^lbeiS$vHN(jpX0?5y9^{>TRGCA8iBO?cjyJ*bZL&6r)iL^|fu|rJ=sq zHeTtAeT-N4>|X#Mp?pD}$7x(fFPnECrf?QBiK{;TIdt(v#NX}4bt3pcI;ZIcF NMI$Am_`W}G{SPn7^*#Uq literal 0 HcmV?d00001 diff --git a/authentication/target/classes/authentication/SecurityConfig.class b/authentication/target/classes/authentication/SecurityConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..3d0bec9fbef7ef0a6ea6bacd72e445d179464ee1 GIT binary patch literal 7955 zcmcgx340sG8Gc80Bw0}sS>(bY9Kkd`l57Z9TZe$Hn8v{gAvO*n99>Hrdu@4F?5>=c z(h}%NDM#tuQrgm%(u=DgXeiW8Z=m-<@21z^=+k%huvUs9IdPsok5+T+%y-Q@^L_K} ztN%Uv3V>exM_{d5bjCHq(X*X%w$aCpgtCZ5J*j^)2fnJjWOlA(FrZ< z#Ly%V-Krb9vrS;EW3YA)wa20xqc&S=A`~tcXT$8#hNKNrV>n4 z_Eb_J(Tz0;WKFKbVJEa|N}r}09Dj9v2zmTQv$9nBGP0=R8N>MrTp-Q9bv~p{CVC7P z3Y-;S*TZ*aoKO?Er=zA$!C2y4?y0bDhqO^;w5aE4R9o5MIEBFWJq_$DCkA6fGSE)V z<0KQudV;qGNIOST=oC07kSR2`J+DrU=G6Ah0((zO5l_9MC3VTz)4FY{*TY)*^EhMN%>Cuhp~3)`e#W%85OP=U)ow3pwqutO-5$JmJR=N5t67Odxx zX4~}po(5A41j;(Pf)8Ss6nr-Yzb=JcY1S!tt6e=Ui6KwuVS$xWt#VAU$1uBA|Tid*LM4Q^P?ya7-ZK4(!;pX;Wt$y1<%n1lE7JV0pkBQS(JD ziAgWI$_rfD(3~~gWeoJ%JI|cc_IGp{vi`v!@MHs+o@m#q)%OMzEiX#1T>D_ly6+mT zU=`g;O1``dBcdL|I2a+0)wS)J6Fr8a!0Iv04f1Okv426wN1$60hj2K7Y0U8Ub24T= z0N){?pDH}63_SmZ6Bwv#=qkcF)l{~tX5|6~XKf7cO5iRT?5?mi=fwMzKz~C-&gW8= z#ND_@a(Z_XYjLhTl;6vX8F>cB)ZCq+w-LhzR|a`?dOtoOncd5~(5aZ}WH!1_AYPdB zPS@67=~FR3H&8@(1a{Sx^2D7}9feee(J?$E5X-A@ z4=LeAJ#$ti*uID_CGZ%&%+skF1bK5zH{$pTJ&-c4<@077Uu6_fJ?HafgCa`4xg z8Vc=BEtkYMJq}OO4vJdPH|ET&9mms*FH~d3kJFQQR)!sq;9COsEfn-;&^`j&=7Sb_ z&u0$64c{}C<~sj9W?s+o)?A|AL&Lqp{e%5OL(HAbOS_X32VO_SEWQyc?QGadr$ks$;btDl<%^pecC+mI@iL<-htbAGBimzHd zdt^&wv*=rqj;11QkXUIZrgby5wc$308X2<$Urb)(dYxWlTd1Oi(Fs5}|C-{5IUlf=a%P=F(C}B`H zwB5z2QOz3mqOK^ z-zEGEO2Dcs-zl00+ zzkqeKXn&ebPY9`-BrF*xy*QS<;M z^d7|ySzdb-du4e;R|)$|xVh^&teVBG>9?1V+t*#f`2O_7i9h3`%3s=_bfhC7ANh(bSu~TO5$f5QE}CrXmR4`emp>dNUp(Rwt=4>$XG7s zX3mgvqU89oePx__5IHXdktiO-$2syiADZ()7Hwb}*C$k>a8j2-SM$sGE~zhSP72@eNWWr`&x~@Z1g+yNGZh{M_&N>?7LUf{?hPnvX zbLlmzY*Ohm;tSN^dCGg7&zw3;?)vIn!BX0#rR!O|RKoW{eB_-T*hFqhh+Yfn9b^A- zK0du>{F4otA$|mJ;16hJi2nxuNV@-Ge*}MW@oN$c-)H*=e11r5{^$Uj2Jqtn{A2(> z#jC91wE?`2pB;d(@pJs*0G8YQV1-}Wh}leMAZ}x|ji`;=ZT!lHO<>v>vGHpgYi<0- l#zi)MYh%5Qf{owd-()0@n=ANqQHRZb?HatzukFG0{{#F{@Jj#y literal 0 HcmV?d00001 diff --git a/authentication/target/classes/authentication/jwt/JwtAuthFilter.class b/authentication/target/classes/authentication/jwt/JwtAuthFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..3a523cf294961fc3104f36116655416435690705 GIT binary patch literal 4349 zcmbtX`&S#s75+vNS|J3;N~n<^F@DtMWtKQe+kl=*~fcG`3$4Y06i@y-g{ zY27$|Bu&z$Zu(66P9LYg^oN|&U{mMxaQs7iPXDI1r{Am=ki@gi0nOv?ojZ5F@6Mf> zfBxsMe*E&zg3TNE9u{94`6Z4m&KzQ)`Jo^T7LChRifYa+Duzg{W_i}ZDH2IA1q`nofC33mmInzmOaw6+ zXeF>Ofwlzp3pDB_xSsuLzXZRC@OgpVwMrGt79wIzJ?&ba zSH6dVpm#|>jyIqWCm4RKTdj7%<=eVfK&HdcXIfj&CiX69`l1$-?<&8Teuy@nMX5g$qGl})AysxuXkx3$j5p*W; zJkAL`yLIBryWChhG{ST^SndzG4#UsDdFDMvV<;6k(cZC*WUztJ{uExo#Uw6ZOyKGN z+cyI*3hba)dYi4DF9J_)%em@N^yxBQYQQ+I2&8Ov$(@m!2fI*{YC~q%a;@Y38eZ0r ze@Wov*2~gI$Hr%kfmgUS9oH&oMh9*!^D1zDovpbYHa3`#E4Pqqz*mr`?M>aTiNa-< zE?7$OxGq#98X#yuZj0g#d^0e~jT2JLOzPW`Cq^sz4K`%Sw;glPbsQdk+%{Z^jp+tV zVMa%21x0Jm$0|v!o$?Vmo5Tc)0;8K^qOT}5xLlUGYABX32yV&CO9OLBT-RrBDp#_d zLikajv^HyPa60sFLHGaQ6ERcpwL>LtaV7l~cUsl~Py=%VH#IP~1bR0GCb&;k<6z*c z+_9XbS}gEX`!=#k^`PKta~ogRTlO^`!8(FgeE$?zJzh5IEhdy8d<9QT!Fd!`~x!`vcJ=j-&tGfl5b8x+tXzttrsxEgbU&TZ(1=N!+LHOdty zYhY|$nt2VAu77Jzas$rt@R6MuOkcoysbbpfnvxR!diUiJh%WcaBAR#Xw6Yo{sE_^hR07Sl2!L zFdj+A&$guv_7cb9>3Y^l)(xyvtQ%Q34Ly3XsXXqbhwsJo7*0h|V4_0w@K5n(?d>r} z?7DHW#e0QdaP3XiLBrcc)oZ9{hS#s%7fXCF&C228yshk0Pp@!}DUq&0Eg6<=MI)3J=xVT6slO8BLS2DYvllk%_i(%(wD0=d8KVQgSTF zV2lsWl?}~~uW=CjdBKm7+6XfG`M@>*g1tEFde#~J2B?um*sr5T6u+c~LAObnL{kQGKUw@ z9YJ3#8~Z!b*;uA0S|{$~$q$e@+O>qwbuZxyi+CoAkFv3}v4GQ8GH32%xUa7BFW8x_ zTfk^v{5~!%;;O(uFj|&o;|uum`#8zou55e}1x{c*z{HiTA+p9I9D#dq`x4p216;py z4_?;-<`?iP4P_Hc_}U`wL{Kw5{g2{9mKj9b-FGV!|2XTasuVv8ULMO*@-xz1w6ao%5J=9Oi>8q`?OEfYnR%J@b<_w% z@3U;n9~G!c^-d>Hi)b7X=mK|Gjxp~!_L7|Oodszd8Ee)y{gNxk^0SU>`EvywF@f5X znc=(c7TBM@`Gt`L>XC>cjs}{%mEV)u66LNKr{s#KV~0S3Bv<-8pKx4((bTQz=uIm} zmyN8uQuG}ob4>)5??h7^N!%u|vs!X$aB#4<4lM$E7aTutF?@>!!?Jzp+GgGuw|&>L zJu6G2b_sN3=VW$a%JHX4`TX(aqANX*A)hw$B`I(q6{xR{^GFpXqeRV)s8H`ldmL@( z5QtTb5oo)y^?R^41`S=cOgeD)e=Z3$$mOEt1}XO@JpnP1z&`9(Y7?==&5$%n#tR}5U4A8Dn#v&OviXIzufGECcc{IX?67_5;x z^b539$M0d&srjze(_D@^LM(m!JKyXg?u{3 z1md3bGo_%c1ct5~z8g!RrlUAkk0UrPP)|wYo>!8&F<)RX6jcev$W2Us5GR$OaVC|5 z2+t5637jhbNfZ1*d_8;ry1d_Qz)8Qn%~R_ zZ?v5dNeP_6ql$H!6&|vNCHOcqYdcG9R^@9OZnIMbSYHun+AdOHhg|ku>U^{U$l9Q7 z)!_m|Q8ZoB!-TO{T|e;z;|3R#Vq!+6KP%9Eo#bue)~p6;nkG8&O}-F}PjOTx-+f zT5|nTT&q)?SX^yMQ%kau)Ckvl9_x0stzR0}hQyKDs~<+Sq&AUE>h0Q4-EcG+Q|rlA zQsN<{KBTlI6Wldin3)=XZGZ44XEf}>83Vc(IqY&lgb%t-f)NgmZWoUECj zHeE}dL*o9evRI4dk+ex@l5wANa+RMffrgB4W)~*SVkjw|aY}Ahp0Jdz-J#g&Z3g0Y zA}hlDXlMdwIvxH8Pf@M|T$|JY=NjReuQ7iA$sZ~7CzlIYU2G%g4;our3HSlluIv!d>M#CB&6FA#+ zmX>`^d1ZTg5TpDSTG5Iw7RDWX{G`y%k>9}?-iZeohf}0q<_%?0BSvu!=Xtve2k``V z3eV}#Znf*jFKB;t+&&-&p9tk3e#k?uAeZuz#T53e>d+rqq%|xOyF_z9t7^4f>ac#^y%lZQ+m{E*Jni6@!qxXxSurcS5d-CZOB>KMkMGg;b6y@wXf)P+UCjAOlGASJ2Xc`w$Qob`~hVO+L zVh45Uyu9jz>*7L=ouQWf)=>0*Z(J7z18)jUw)@X<_q>{23X$hLmkoZ)s`y^xK?1)L zIJINd>`?rn<8P6YzUBHXx6e9{E<(9u`&(Xh-g2vTTTU)|Uah&?r7Jp8d0^w}gI&9e z`g(_cD}_fQn6v8j700({)0oAz6t3d>KpY%5w>uquxf*L5iS{Y%w=-%g@;tUI$%Itd zBOL=TR7~KVH0E$Vg?DjFV6Y9u@nUb*a70B43~DhN zpFDM|YWWuJXghm7%#Kj6qu{$OKHPeN;985Oz}@M`@_XZ zX~qEAUaq?F{8MB2*~81)C2{jyCT?n@+NB<@I@cK2c*G~v`uyv-W*Q4gb3k$PKY!Xo z+EkhmJ=h`7wCEZ01Zf&E3@tPeP=Sen3XB9)V1{5~;e>gTo3fV;b7)i_7MH~Q&ySS3 zQPFH`Q5Zzi7WSHH3im^aH2VT!;6huo-%LOMHqNU- zt8&IN!~F*bzrcVR)pEsd>^T+tVvUpT^m3E8_l{k5_Z;c4C~mYbMHXUM#siCvYcDl- zHtfc#Djaq2Ud5`fSq(?=k#O=bR_j_k0BVNQp!Jc}+_&OemD(L^H$qCSc+Ez|zU3%e zBN6Oc7YEIop65&c)YuI{C1yAjb(WNljJhnD1)E%)YcJP~x-x^67v_;~ygCob`pNT_ zKo9P7*WZX8<2pT+Nk2tqI&*^W5j}H~OYsMsDo#DYXz|Pwj1{M!V7xe@Kf%P`xk1Aw z-=hRNf%k9<^EkuCp1=ZL!);ukY>VHogy47;XUWk_6o8_X+gcz~j;o%TRyRGvbVz6Q zC_Z)SD$ek|O=?gl3b>z*$0wykn8Z1vsgO!kWvw7q{0BzABN4i)@&&r7+)9TEkz1YF z9Hjf_`Smc+*yBS$df?r z{sU%IE<@a~N^`9$&9$mD*Q(N-`aK#{X)dbLPUl~`V$CEj<8|6s9D>8?A(1VQ$pf z4=HFqV|>OH!jHHKv@;Pl#!#2W5bBPP{JqDPQk^@a(7wle*G`+`TMG3l7C+u+#`&Se zOoWVTqA=w{1Tav*9S#BI*i2+nUv+1wYQDb4XIQ0!;`s1m8LHh!+p2t(qpxsfn zFYtMa4+5dGPk!u6r9oz#%y`Gg3Gx&BydJi*N>?A^3FALFnShoa7zkQIIj2r#e`>Ab zF4pL#I%WPZCGZ;(Y7)f+zkp8G`PNXy4%Y`%_>d?1+jaDmaj%Sz%2>zmNaFWp`~iPl zhmiOf);dNd&Pr@ZB!agQyps|siMYgT66Yl*CC*6{B=QnPi7AN-64MeFC6)sHyApE} RZ%9<&(!4?QZ}Iu%{{U?w91;Kk literal 0 HcmV?d00001 diff --git a/authentication/target/classes/authentication/users/Roles.class b/authentication/target/classes/authentication/users/Roles.class new file mode 100644 index 0000000000000000000000000000000000000000..f6d560902be8fbc2f36e5f05e32359f3227340eb GIT binary patch literal 1775 zcmah}-%}e^6#nkbCc9a-kOoAcv{;Fn1Vd7^Y8#5AG}V<5Y65YbJT1u@7B;)i?uOAf zeDM$Q$w!45%jnd}@aP}qcC0dYtCb_;#K_x*)5({eUU$86y+U!L$T0ajUWUXFTelo5*kG7V zkC>|mp5=6kdZxh;NsCcUndBnn7+sU$#z1hrw&fVMh8ScOQA{vM!J*|dERG9>A$ipm z1Jfy*6T|MAWMCLln|q_~gWz_y&cD3c%d!|;>}|8UIl|8~uC#q~P*BQrSg49oHJ zhU2(F*pYs|>IT)GZIcTnRj%&UbWx9m>qF6yMn)7POFX7t7F*h{munhwm=s5=RF2Y< z9lffdFxa_A=GR-495t$foJybx1qBW7BPoQB8E%eNHsngi0}ACjQnmvb6!nB)>lKT+ z^c5>(Xw~ot8!FcEDY<`{@{So8Z6h$qHt(K9=qfWY#Ki#W@nhQm&Jt3AR&C1cLH|@! z`5aeyBB63cQZ9eI{DIH)PuG;Bl;nl}X@NbK6@K|sj3@XJS0eOFmp{j%!oV66W+z|2 z_!Q4Ry%ja{Ti3S&*ZY3;IH0S!<+iECrz)0XR(st8)7vu+Y}!dy+?HWC49^nsa5G-F zI*t+aJOU&rt3$W_%<$;;2lNOr+^Y5HVd|Q?b7J`xsg?fi3hK?e+w)rHQ%jhiA3_^f zfSdQIcv0d)+ME~F2WY061BnH3Yr~luh7d7A(kp`qc1bGJEI5?2D~r#e{Yp!YXCaLE zz%st1@vQ*_H-tg@WW+H=WQmoE1ZmW0&7q)9bDSfd095+pxQQeIg{Rq2f%eZZ`x_Sf zxcv+53d|iWk+Q&~X%=SHB+p)8xeqQdEDS;$oKP@Rv?m-z841Eb3hxZlNerDxXIL4S zA4K*p_6QlH)AvFusNHETTrQEOa5)`)0luA$oFQM&lKNUbJ20T&14?WFE<++HkoyDt z>*R-#=eU24d?B)RD8%jay|+^cK!jfuAEi? literal 0 HcmV?d00001 diff --git a/authentication/target/classes/authentication/users/User.class b/authentication/target/classes/authentication/users/User.class new file mode 100644 index 0000000000000000000000000000000000000000..0bd030113a5c23626e336f9c0195f0e9783763eb GIT binary patch literal 3307 zcma)8-A^3X760AYuVGlj>>4m;YwW}X!$Q26exxn_2!^;`2S{oh(u96w*qy+@GDG*y zqFSmVKjlxb+P+lkLz@Rbq*CozsZ_bnL#6&rRn^~_8J2-!T50FrbM8Io+~4`ScmMhC zum1*M9yoldyr`k~iwLND-Z9qqPt?E{VlC`F!$KR~Ix3TRu!U8f1`RktV zg*O$(CzcKcmI8lsF2%2gZI3JU$u$MTYbs=YXV+E8IGY^DmV)+XZQBhu+K%Vzn&bOH z7-7)0l}@YWY_!}th0CXj1))gJnJ^VbcY?6x`L*r+-J0izZrgWSwYo1DwAauDoKYBT zY`Kk{m00b4r%gB%RJf9MBlhzIM<&;b=!b2g4<&jrA$$&JEo3pkNTocFB2h#ELp?BX zPNAIIOu|xxiSx2OqM+(U^x#{{mR^|}#wEAuhIPiYJTaNF9UZJt;O0sc z>wzQN$7bU$@Etx&UKVjKkPr&3pcSu;bQZ#f89U7u|6hVbFe9z;_kS?K(Sdy!@dTZjsWVZlAUr3KeBKKcUi`5S4U-&cYoP&S`6!88ts9%AG2Ko-g4}8 z(`mc!i0uDt`mS;jD|kjyPu)&N`@X8z%J)?Yy8R+ zj^$=FuPOEBi$~*@F>F|d{o;|upJDgJQ(rupmSOgBwU=|&eEGRK{NmB9F{5r@ESt75 zk{wnvnR4FFjuO3YYm$x(M^t2*!YVQ~aPO==NR^>k(>@m+qwaq5Sd0$GMjtEE=SlOh$LfBm3(cfs zBU!V@w(bue97U5Bojk+!Ub{%)=vb~M!hLrC%P;c0D2*oXB!;r@=+&suFCD8_-S)oM zaIfz0CaK)-@KxJ&>;Ar{Jw7J$hYt)(Nve@*OP=qpbapq~_5*ovB*Q_&X{|YJPxxeU z?6|G&+i}FG9XD`yll6FJHFO#~%g$b6$yyCM?S^~Dle5kzX4g&tXx|QkP={@2FE*-i zjn`C`wUa?vUKU2dA(!WDaW2bql3MGH*7&G!E^?hWE;TpEwG%rd)8*oGl&fE1usZb= z!`11hs8laJ#ps_YWuU=vDAJqf3Ag$5EnonPJY^nD?o}f+Be;l5)5eVWK1ri7j z>4R{Ta2aDK7^)mMv~Y?cfmy;E80Rs^5sg0KW*X7r35H6z(sk!DjT~`DouF{kg^8{U zY30a;)0AV_lU>+pC`mGdeolIOiF*>97P8`x9S~|;s-Qy?dYRTCO z?_w$G-Onf^@5f?w>W|1}pG^H7#_y2JJehg{V_8m~=Jy;wjuz!~@|6@nN`CbBqLDoW z!T)0g^IsS!!00bVRVi3_N;kcWtcm+XCFv_j9m|y?{hL$VkvnONqk&K0asD+0RvGvQ z>&VpcK^<##e2AZr#7A{}jP-RWji2IY>!@g4()hVXAsWqS?1{#_#v2;r8n0=*t}&!> mSz}D&ipGS-q()U^O5@!~cv<6?#;nFKuuTLe5zO)X&VK-039I7( literal 0 HcmV?d00001 diff --git a/authentication/target/classes/authentication/users/UserEntity.class b/authentication/target/classes/authentication/users/UserEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..f6dbfd14fb0af1c885461cbc6f94a32549df238e GIT binary patch literal 5546 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 V1l<($wxA!-FM(MF<{S7e{vYu)S6To7 literal 0 HcmV?d00001 diff --git a/authentication/target/classes/authentication/users/UsersController.class b/authentication/target/classes/authentication/users/UsersController.class new file mode 100644 index 0000000000000000000000000000000000000000..ff8c1b7b21997e0c9442b6144685ce565ee8aeda GIT binary patch literal 1527 zcma)6TW=dh6#iy?S$lCD*KNqHl!k`ZNucAVEfgGrLM2+GZK&cBA?0aoPo0U^yV1_9 z!()B}KcP=Nf&>)tfTBF|qY!7-R@0>EMY88y=FBT?r*jcz6$GhD^=c zIaEAkalrz8dw(UkxLAaPOAJ}Ft2FWQhGQoTHyCm$FAUY%(g<2&RKR_u4Q=vQoNKSo z+gPU)cT!&UzU}O(CE_58`}{z*d0U0umuTh>q7yCntBWfPMH`)ZOSpjTm2$(Rps^GKY&bR&A2KM@v8HYD5(uFbLW zxXEzuotxT{+MJ^If=z(m8L#0(a zkQ*mMMXcVBy2R?FuR^(*4B9e&A}EG(`B6s%+agxh9y=G$=6W$!r;=8P*4?Q4Vv}Be zv88&UFiA|QXUAE#&%xuhq9pFfZ&e_%K(mug@1bf(iTL=8tUSpANrz;PtPDOU%O~3* zSy`zT|H9<*b5xgC{=n34Y2-ax%M_WXY4%8)#00(|-}|F8B&W%u)8jf{l1^WlQK1GI zIeK^`7-ld_m~6#WvgndfSpFSTf8wKGNq1l?S%e_GwnAwXGp?|f#?0X>l4aVNr~l<0 zFpUq+^tPTx-c2K0g!~#sE^2&?>$Gu$8n5jj)5KB}%T27{6H@VM6F0%rbamX?K~ZB` TV^zb|xTulWm`Tms8h8E&M*)P? literal 0 HcmV?d00001 diff --git a/authentication/target/classes/authentication/users/UsersRepository.class b/authentication/target/classes/authentication/users/UsersRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..d3917d0250f1e9152c75ade0d85eaa2354c31bbe GIT binary patch literal 1331 zcmbVLUr!T35TCs(?e&0q6u|=iLlA)nuac+_H71y7EUDE%+oK*7qx+yuaSs8s`Me%A{ka*Rv38~(Q}kx^z>R8H7gG6L%1Eb`Ren9v^`zZ~Rbf}i#;YS!Wr?!k8;gBk z-q5C?m8C1o#KV}yAA2MM1b~`X-3=Z){)ek=LFYr%{CXrK%$LOYzrrmxWxi%1E ztk#NjTS)(1pt)%`bk_cXjhSMGK&UCW!r zak}Dgmla&gv7E4Ua=cO~W{OtXN~v9DYm;7P+Ue@bLn~R_taA44!kXvhAUV+F!Ch#I z-tcs$#L8Ar_w!qJ#H6#rXkl=T`^F#Ndw#u9hv)2Ih|_6jrdEaXJAopb>F6!ZhXI*BndGwTVKWk0CO1EB<(yV@Hyv>C10iy9xeSxb#&#-?9%ID0(j>25?xyc4_; zZGcRj`fOf;zyet`gv4{`u8mD}C{H%c<7Sad55co|9R^>(88QZDVMk~bW`Cb=;OP-g z4#U!KTS#p^8bh!F?`L2(Eh2(NbF>7$38@G^j^u7`kzJ*UDos}D7L_2WltS=Qp^(xMMGyV}pM_=u literal 0 HcmV?d00001 diff --git a/authentication/target/classes/authentication/users/UsersService.class b/authentication/target/classes/authentication/users/UsersService.class new file mode 100644 index 0000000000000000000000000000000000000000..e16cb77f4eda59da86d44851ec59861d7c71546e GIT binary patch literal 5970 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 Ke&urf^}hjRGha3U literal 0 HcmV?d00001 diff --git a/ordering/src/main/kotlin/LoggingFilter.kt b/ordering/src/main/kotlin/LoggingFilter.kt index eba5c42..1dfcaed 100644 --- a/ordering/src/main/kotlin/LoggingFilter.kt +++ b/ordering/src/main/kotlin/LoggingFilter.kt @@ -1,3 +1,5 @@ +package ordering + import jakarta.servlet.FilterChain import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletResponse diff --git a/ordering/src/main/kotlin/client/AuthenticationClient.kt b/ordering/src/main/kotlin/client/AuthenticationClient.kt index 45ab472..ad85bf5 100644 --- a/ordering/src/main/kotlin/client/AuthenticationClient.kt +++ b/ordering/src/main/kotlin/client/AuthenticationClient.kt @@ -1,10 +1,9 @@ -package client +package ordering.client import authentication.CheckTokenResponse import jakarta.inject.Named import org.springframework.core.ParameterizedTypeReference import org.springframework.http.* -import org.springframework.util.MultiValueMap import org.springframework.web.client.RestTemplate import org.springframework.web.client.exchange diff --git a/ordering/src/main/kotlin/items/ItemsDTO.kt b/ordering/src/main/kotlin/items/ItemsDTO.kt index 7292246..15a99ff 100644 --- a/ordering/src/main/kotlin/items/ItemsDTO.kt +++ b/ordering/src/main/kotlin/items/ItemsDTO.kt @@ -1,4 +1,4 @@ -package items +package ordering.items data class CreateItemRequestDTO( diff --git a/ordering/src/main/kotlin/items/ItemsRepository.kt b/ordering/src/main/kotlin/items/ItemsRepository.kt index a756c29..6865742 100644 --- a/ordering/src/main/kotlin/items/ItemsRepository.kt +++ b/ordering/src/main/kotlin/items/ItemsRepository.kt @@ -1,6 +1,5 @@ -package items +package ordering.items -import orders.OrderEntity import jakarta.inject.Named import jakarta.persistence.* import org.springframework.data.jpa.repository.JpaRepository diff --git a/ordering/src/main/kotlin/orders/OrderController.kt b/ordering/src/main/kotlin/orders/OrderController.kt index 1f5880e..27d4190 100644 --- a/ordering/src/main/kotlin/orders/OrderController.kt +++ b/ordering/src/main/kotlin/orders/OrderController.kt @@ -1,19 +1,19 @@ -package orders +package ordering.orders import authentication.users.UsersService import io.swagger.v3.oas.annotations.tags.Tag -import items.ItemDTO import jakarta.servlet.http.HttpServletRequest +import ordering.items.ItemDTO + import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RestController -@Tag(name = "OrderAPI") +//@Tag(name = "OrderAPI") @RestController class OrderController( private val orderService: OrderService, - private val userService: UsersService ) { diff --git a/ordering/src/main/kotlin/orders/OrderRepository.kt b/ordering/src/main/kotlin/orders/OrderRepository.kt index b717808..b1a925c 100644 --- a/ordering/src/main/kotlin/orders/OrderRepository.kt +++ b/ordering/src/main/kotlin/orders/OrderRepository.kt @@ -1,10 +1,9 @@ -package orders +package ordering.orders -import authentication.users.UserEntity -import items.ItemEntity import jakarta.inject.Named import jakarta.persistence.* +import ordering.items.ItemEntity import org.springframework.data.jpa.repository.JpaRepository @Named @@ -19,7 +18,7 @@ data class OrderEntity( @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null, - @ManyToOne + @Column(name = "user_id") val userId: Long, // join diff --git a/ordering/src/main/kotlin/orders/OrderService.kt b/ordering/src/main/kotlin/orders/OrderService.kt index 7c17476..03a6c07 100644 --- a/ordering/src/main/kotlin/orders/OrderService.kt +++ b/ordering/src/main/kotlin/orders/OrderService.kt @@ -1,15 +1,15 @@ -package orders +package ordering.orders import authentication.users.UsersRepository -import items.ItemDTO -import items.ItemEntity -import items.ItemsRepository + import jakarta.inject.Named +import ordering.items.ItemDTO +import ordering.items.ItemEntity +import ordering.items.ItemsRepository @Named class OrderService( private val orderRepository: OrderRepository, - private val userRepository: UsersRepository, private val itemsRepository: ItemsRepository ) { diff --git a/ordering/src/main/kotlin/orders/OrdersDTO.kt b/ordering/src/main/kotlin/orders/OrdersDTO.kt index 34ac72b..5cd6086 100644 --- a/ordering/src/main/kotlin/orders/OrdersDTO.kt +++ b/ordering/src/main/kotlin/orders/OrdersDTO.kt @@ -1,6 +1,6 @@ -package orders +package ordering.orders -import items.ItemDTO +import ordering.items.ItemDTO // return this when user asking for order list data class OrderDTO( diff --git a/ordering/src/main/kotlin/security/RemoteAuthenticationFilter.kt b/ordering/src/main/kotlin/security/RemoteAuthenticationFilter.kt index 7a0d215..bd700b2 100644 --- a/ordering/src/main/kotlin/security/RemoteAuthenticationFilter.kt +++ b/ordering/src/main/kotlin/security/RemoteAuthenticationFilter.kt @@ -1,8 +1,8 @@ -package security +package ordering.security -import client.AuthenticationClient import jakarta.servlet.FilterChain import jakarta.servlet.http.* +import ordering.client.AuthenticationClient import org.springframework.stereotype.Component import org.springframework.web.filter.OncePerRequestFilter diff --git a/ordering/src/main/kotlin/security/SecurityConfig.kt b/ordering/src/main/kotlin/security/SecurityConfig.kt index 63cf9e1..5586252 100644 --- a/ordering/src/main/kotlin/security/SecurityConfig.kt +++ b/ordering/src/main/kotlin/security/SecurityConfig.kt @@ -1,4 +1,4 @@ -package security +package ordering.security import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/ordering/target/classes/META-INF/ordering.kotlin_module b/ordering/target/classes/META-INF/ordering.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..5d4bb7ccf0ff8bec820ae7d37c1c95269784d610 GIT binary patch literal 59 zcmZQzU|?ooU|AyI!Q%dwy!Co?&*Br`wHyF`gWiva-m C0Stuz literal 0 HcmV?d00001 diff --git a/ordering/target/classes/application.properties b/ordering/target/classes/application.properties new file mode 100644 index 0000000..2bf2893 --- /dev/null +++ b/ordering/target/classes/application.properties @@ -0,0 +1,10 @@ +spring.application.name=Kotlin.SpringbootV2 + +server.port=8083 + +spring.datasource.url=jdbc:postgresql://localhost:8080/myHelloDatabase +spring.datasource.username=postgres +spring.datasource.password=Barrak2000# +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect + +springdoc.api-docs.path=/api-docs diff --git a/ordering/target/classes/ordering/LoggingFilter.class b/ordering/target/classes/ordering/LoggingFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..0ea45660c34b5f55a11bbf3e61127db3d3615088 GIT binary patch literal 3647 zcmbtWYgZe`8Gc4W7lgP(u?^UcEhog`z7DwqwhJTI!X~}B z%{^_>TiVml`IN8e=?O{P)5FQf{-~Zlv%3OuYw+m@&8%kLdEe)~%=6B_|MShi08HSo z0;gQBV0pGvG-lmmk@GdXtSm19A@H2*6%AR{yLUaaV%>ASl5x*kHSYQ{#tkQL-L$-U z>&==aRsCR8AU)bj==abxfe6;0B6v4q-TESwQyA zuA3#(Q>Gy;Z=-A}V@;{5G0kBiSO_7E9Yau7T}N66B?GHdYo_gt^(_e`yudAiq-O<( z1X=>meJO#b=tj|4x74b~Q_?UU$5p1XX~39s)m*Jy9!sKC;9SX7W!o{bjLz8hm|aK`SW|aT+IZGKI%+ zDv7ov+67)YDt$F&myIcxKpZt?=GUko4B&0gtX6gQPYVnlKkPx0&!%t&PY8@YlHDM* zJBH5-3?0XCn8v{Jg%q-Ql5yT&Cwt2yfgXYLN6G{$6SydFX1`EFbtKTsny8nlz^e!0 z?lpU`)^_$Ayy(Y33;Hl9kSe?Nd(N#jL*>$7-Cpf%4TvkGC235@+8E(x^NwbeZt ze>8P_9TDg|25I;NM|SEzhHRjp!cQC!Zm1&epDbD`yoD2Ta#L9oo@Z{7BzyZ-Ce!#H zCiI1x6gYjTVDIqoa9|D8v?Ogi`VYFO#1=fIJRr#gZ;YPSQ^(c*Nj=*;LYk?nLJuDxT)VyVFvT; z5UjnUulpJyF_DrLKRbHxx8R2i&4#^kisgg_Biee%rpWGdrE`GBUc)2 zghE>NT88fnn}n=e!O_W0pu}>wox3h?LnDH^2kdGUI4vlH5-ncPku}kfa}L7Obi?bS zt7L(FxW)wV0m9TP)b!p4OS#TZqgm#NB8^GEue)vTpxz^#d@BQip9!Sv?}GqX|Dkjw z*~~3hF?sB~6}~~(d&vQh&4#y+RbduPWpXW2*@!ZHLJ!S)pc%nHMef`BADKK-cvj%k z?FW}qk*-MaOLFdrq_!XUfB*NC?CjcpFcP^WCS%`z7U!{Dl^!xY#pabCg}Na?XY=ZLaUU zt0s1zYP1tv$(>EsO=`idd3lS3P2Jt0nx#O=-m{agtEA$)DNrJDfn3$3v&NAeia5tl z_|MR34Ue@$rNO4L96PtI|!O%G%q`wE?dnJ$h) znQo2`ab|g73+G0g9wNIuxP_-iV?*6d+jzP=wvA`L#!wXf-A!9~w!b^Jg%`SGU*hFm z`{%&tC*O`|aS|8N$+q2%ah%2^S@dX2>HnhvEg@Fk{}Gp~Jx z>A8oPSswa3Zf;@WdjCIgn_DaV{bcYPtOH-88o{n}8UOfsoWgm!mZjO>db zgy#b_cHA%sW|SB;vKX6)kBBdw5K%2eG(eN`Xhipj=I2MC=^>gPT7Me-45bclfaU~# z5uzE`K{LRxjPIh+F^b~PKBkZHDd#)H^-IpbVm2PEAezIkbNEdTZ{r<);@uqH!}}`` z5+C5h6?90XBtDXeOSDM*R-#qnvP7H26^V9Yx16dXIrCYV6embNLBA`VEvf$hh!s8U)9DN+E5qFi!vcHQ7+V@GRm+hcwU zC$2pqaX?Xz{ZUn)w?X27xV$%SJbw1f&F!z>06KWVux0a9<=Twm&kN9*PBWcIudS(r zF|^L)xr{RzB*Qb6_&O>K(R*#QKV+!9e$#KFhDe}_Iz!ce(~e=g_rJvl42L8b#cmqj zKF#GsUD$ja53TjFEWAyuIn|>gSMfV}ZQ_s0%T#(v9G{$5$QcXe zK`3BgW8yD$n05%Iy9}@9v!>u}E_iD`6THD28}0dQkMFRf+V%H{xA^ssh)nWykA)SD zKVBHt{}I!>u_xchHdPEuJ#EydVlq_uS2@gxS?SqCW__9KFfT}PVv9UcA9PS`ekqLC z6V=yFlcZye^=1AJFTp9+g^`dl{pKl+`@tCX+S{LKToK@SMpaNJ=X6D2i%|1kM2sjk x&&#@rZR!W4eOPL0cr-wzi^p9ob0WcU zIm2Yxaktf7!>hXVo~xQ|JD!iu)fLBEX;@Y80uKn@Jvfxa9!;sNl+Lf zy0iasb&DZ;!mc)EDH}AlO^hRf3o=G9%5Wig-xeFi7{leW{2aw4hMe#d-xvPd5{A8S z+GIG$SZiGjF8kz@$D4RU`qX!)Y0abE1BLe>w$X>i>kHy?QFqGNBF+YMK%T1G$$ zk;Qc}j?1_rV**zh#z|=A>HNGdB;`fiZ>4e~(AgML3=_flEFJ8-2IrJV>zdUt;<(=O z{Uo_5ZKk)nH~d!q38`%5ct?@aeRUW86V?Q%CLTd zGWmR-GVB4_T5h+A$A+iXG*2U!OZ8@m`WX|SLGc0Q(w^8zba`Nk-3;w&1qScvRa!oJ zB}%_?h`QNv)F5j{z=gM+nvT&<#XTBiM-JYDCFWl`a?VB#={)^@Ue{Qni!!FS{ znRwE$J+p3C;%p zitx3^Y zPSL^`#{j(uVS`@Sw2BJJ;4Zxdp+9XJTB=Zm4*+_i& z8}7fxG|4^0;znYLEPjnSVRK6dnPdqa;xzBW_?Gq(p5i;Y{=WiSm4DXXNx#Co6^QT2 zf6vLY4=Eo%+eD~@M_#De6l<~NP6|8Q8ajfBsO$>A7IHou<99fPTjsi!XL**FY Zc)}6&zqE;PRQ!k!5&D<(TlZ0({SA&F18D#N literal 0 HcmV?d00001 diff --git a/ordering/target/classes/ordering/client/AuthenticationClient$checkToken$$inlined$exchange$1.class b/ordering/target/classes/ordering/client/AuthenticationClient$checkToken$$inlined$exchange$1.class new file mode 100644 index 0000000000000000000000000000000000000000..9bcc38afb24c79647840b1bf03e32cc9e6471f9a GIT binary patch literal 1799 zcmdT^OH&g;5dLO?1eOSbs31O2qC$8qK`q5lR8b+6DS}Xh;vlEVW=NK7W>dS90G{%5 zEN`B)JXk4i`j5O=_9g_e439!D9=5xuXS!#*`}^kGkI!EKEMk@+?zmauS~6#twk4!8 z7RxG6+A_Ja92u`W!)9KXg-xd*WH@X|+ma$17W-zN%bW;DgJ2AAQjVK5ypo@5$K^$_ z=ePyKbX;MqbAPSqnztgmc~BA?Vn?__nqof1f4k0zA78W~ypkh55nG5cJh?>fAlez` zS_STjOtV_LMXi;DTQAm2>?jI238>dzU8lG z$jU|;BDHF_UaRWbphhafYSm7CuvVSz>~HVaUeu~H?C@PcJNy)=Rs9Hp^U|f~eFD!6 z&ssL~957Q|dISGcgbIf6Mfw-SJqr89FNWu1Cx&~3obe0rB!v5Tz%YCoq^AptI@%n@ zZl!2gk~k^3ZKR#DYl-rga^_BXB^+x$}Ifr&0S%zFgD(SWvGPTuS2|46L%%Q-L zbwg7ep6N?wp z%Pn=ssxFfAlDq965d2~(z{ef{-~Ic2 zpY*qXe*6i5ar{ysV><=u7}lzmHw|fd+IZPpEAZmz&pg5lx${UAQ6Ll5M$?WE#DYLO1!YYImf!?C6H&YPx0FUZ9ez&D!2<*)+$J zXcahBv^~?Xv^yK?nqhg;v2;_*Sw2tK$h!(U1fB_Gt6aOTJNmlhL4nitVunT;ix8Z4 z>BM0bhj2uo-26>7+#xY0}$sieYWg&|2u5N!wz$T-NiR?QAJ{Uf|feUXD0#@aHY2|Dk`Vy_*O|VDh6=IH~pYMcT`l= zJT=99^k~?#lq%|A*)vRSrfhn~P2DWZ8NH-nn4#7aB*Fe*d;IiRn7Zdw4B@=MnJ6Cn zLUgVqoiLpgy!d;LipZDLP5AxvA@Ex1z*68 zW{hH9;9OPBp0Z;OqzT$YnSrz;|FQjBd12vVPjC9|cLvgZWrum=82U2Nr#Fc&GKHhu z6~RuyEdga!dJ}eGOW;UPJ-}2jrv;1nl8V=`B=Fomz@B`pgemy4z_WWOlQT`Zs+;qy zU2xxi8FU}0K}%L~l}&=*Z^(VU=3tQ}w6ChuBVF0NU3T*Fl3XsY zPHlRU{h4i1*~SgO=m{|~KQn$^eF9DOTF~aHee>z+?6TUQ9!fvyd{xY9Ulw(a1cuWD zAaAc4)&z5@h#CbWPt2CRtJgfWZ(1Gd9vT=K$quQ*=U(X^&W@bh6F#tk+V?-ufP99} zbq@v9r&QMGNxL8g+NW8{X3Oi#(pm6v(a$Hp^{nD#WwVvIlrOU1sH{)iDAS$mGG}cV zuEBfbdu=xnYyaC??R(@{M_B!9FWEG<G*-{We;PaHlQ`yL?qhv4=1IjTJ7k8w2P2b{Hp zhtR}5u+MMiPTVIT-iN{!@az80_J??82gep4;P^~u*X#~Xa{8HUJQeSJw*O=F10O-# z!O&tVzKf9ucq!XBu#3^G@<&`;?EKtAOk|VsKO>%PN;Ng?;1X|7&8M2OO=x&YO(|zm z$yDPGu5kP6E?!OX)F%&d{ZCj(V6pS2e?5^(e1z9`@y6m`(ROPGZ!UH&KY;wp?>|db>TAm+a=C#<9WQt=Y5!76R`I`6E(psoDb9b7;%m=$5trfs~j z4vRKFgb!e&L}9x~?JYR8@_F8L;n8XLNxzH@%0qiseBsYpc|+hw-1Xhs#^;auA##O_ zpK#Ggpby^vl%vWQm-qxy_!-9-zKx&Lm;VQty`Ka^bbI!e9`w literal 0 HcmV?d00001 diff --git a/ordering/target/classes/ordering/items/CreateItemRequestDTO.class b/ordering/target/classes/ordering/items/CreateItemRequestDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..f27631c71623fd99406ba9ab8e3f3044a620a798 GIT binary patch literal 3648 zcma)9ZBHE66@KpQ+psJ!y9OIC;5Ud_7VO1tnl{09Vn|#s1)La{IH7GaEE5=5X7JvD z)>2jZlhq$kSxvuG>W8WyT&b1n#7d>gb-wjCRaKueGwh4mDwcNUoO|zidCs}#o;&;R z|9k>J=`>t#tKtUEo~|r396NBTp>V3S)DlDhaZg8AUU_5wF}NH+BOnY&5%OMYXk zvf~6B4cql}#r8Zuumjg8zv2fg2le`#iHyRTT|cP1US;QSui|=v)9~zirRs?z?bdV# zIfbFxwo}`U)jqTv^h-g7$#!fJ__^a~r`B@l$3PZ+uoMy{8K+RlB8d|Uh2si2WH8hN z11A+!H3t*JGCIxCVh%kRkmN|>_2($sOU6wpTkL+ydZ zNtcvou2JODyEjZsDD=|aN6p+bt}5ra-kM96s-h)=cLZX%GZb8m1Y2{-Qn;hpn!mU2 zdyW@eQD_aWwhz9?xNH7CcYCf2NLI#cWkYr#on;znE+^(DHk~i*gLqOHZyTLX&9q>G{u71~^-`L8s6KwmNw{35;?&ygn z-`_ph?^5z@dFW8Q_i*3oBEH@x-^|;w2o~&meU;5*E{7X#+6Lq&3S-b!8aX;Zm zM8%}pV`VQS&0Z_V<uYwy zm2o^d@v5!n?bcz`iq3s=kyYEb8rZenWqUuilwI`?8a3yZE51(0X4kp^wB~(3&_ToA zkBn+uVdG1(bP}Yz`55~iM`_Y5sUi1YNO|*-4sf2$o6;Uf4bl{8ak|j^9QpFs7%Wde z!>RJ z+u^3Wz|EtCDN2d*JEQ_JT^`{Ebb^zRCD#$SbQ4^f5Qgcz15X*#O*{s2l5()Z}s5&c#D1n$^xrV4#mt+D*5X#VM_fk4W&{sU%Wn)%EbKGe3>Y}!Ve>q znp!C&a=pDY^>#D$vy4%aQ4mXfihRbt!3RJqxacSq;^5lhE4kBSXiE%D>U2UZeTBtq zBi7k%vG^Q!K0g|aJ;yx`OJba4^Qf*l)j-Q8GGvk_vvVX3YO!Fasmk*LH^H zn_D=K`}jFgHV^nGRErPPeXg3afb=(%{EP|yd>x4@>?$^@s9}>VoGQM+);g5N zHr#cb)$-fX{C6O4Gko`i@3h7_jq@58G{!Z`8q*px8kaOKYD{XBG^R8zYg9C5+2=LZ WLdE+Uw=~|?*u^2ym_#$rXYPMnr{J>y literal 0 HcmV?d00001 diff --git a/ordering/target/classes/ordering/items/ItemDTO.class b/ordering/target/classes/ordering/items/ItemDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..9578e32264dcf605fcdd09d91c90edb5c449a921 GIT binary patch literal 2773 zcmaJ@TT>iW5dO~WZFbne?1uX#kOU3vk}SDsRKOT=k&O$vfaHRj49f_^?#|%OK$#aS zPx%Qc^~EY5EFbcqRpwH$%EIK$AK@>tEWfie>@Kia#mwn*ru*yeue;Ck*T1j+0B{in zfljBgVpc4BHEVfh+0EwozPxZf1|guY8(T)UWbotl<#n^*#SjvRPFl9*eMr-hd|hGQ zlOPkh(M5r4K*CYjbY}58mH*U_*VZqrTnqy8G+$?Ls|BgQ#7-_=_SW57~WN*;5n6tF`N|WDjP-9KfY~wYm{7%-Ntf!+sICU zGHZHk&dQ8ouar!8IPW;c&5b6#(U9RT!-a<%W)tluGj)u89P)7}szL zr`w`nHFx!Ey^M8$;7r<`OL1V|A(?B2%VbwLUJcXfE5`6%0_QQP;eC7{kgNl7fXr31 z62l~WXe2kvEz|{CWtMCz=C1Bs zN4#F-z`4B7PZc@teYZAwAD7LXy=A!;i*&Jm4YM))wra~;wmG+1UN$QWvXHV6PQfTG z8Wl_KgTvvyShb6I7pU$}UhN~h>(IPs6pFLPMu4QvJDZh)dDW7>dIH$RCIRZxj^nvr z#n|vcU7Y3(6K07Oq~s;d-0yN1iUP4d5z~OY} z89LMb&(QNLKPXt@J4N6qO*OQjjSbmO=`)@W`Nrr)A9sWa97{>MQ}8)Y<4O<%@P)sP zaZ&js(T@RY$xyOXV#N?i|Ax+ADEO{r{GeOuF5xQ#?i#a8;s^%$buUoQ(>*|mCO}E% zu@l8{g6xVyG%?ui`Do2^qjA-9GvlQEH6Wid)M>7ge%+`4cPMu={V(vAOy9Tl8P;nI z>otb;fZ@hq{+De%j<<0lAn7dqM(AZ=ApFgDP$lR2fk+_sOrX2^Q*A*wrv8KW7!6v}uB%k|gjDC35XxaThq)ZC;|4|C%;6U1mmpj$;L|0vyXbSV=pt5qtJQbZMZb#y k7e`zSx)^eC)WtCu)77t+U7UB3c5xfabf(hTSw3U`0f}r%Y5)KL literal 0 HcmV?d00001 diff --git a/ordering/target/classes/ordering/items/ItemEntity.class b/ordering/target/classes/ordering/items/ItemEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..a9897c71bac425393a95cc718223a47195125a87 GIT binary patch literal 4804 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 D;0DKH literal 0 HcmV?d00001 diff --git a/ordering/target/classes/ordering/items/ItemsListDTO.class b/ordering/target/classes/ordering/items/ItemsListDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..9220d6d7fad6f429ec5f48785a2d5e3b798f7ba3 GIT binary patch literal 2735 zcma)7+fy4=82_EkZL_3g3B3TlSS>s z=~Mp%M}73c@u3eoqiv_oI7r`o@Go*4zq7l9C8gj@axUNbuD|cHfBpO74*=KjIm1!6 zRX1Cfvus$xYyZzRnGs6UXhPRkJ2ih%qEDTaG2JGW6%GK0{kr zwjt%pV+#zYyQ!C}yVxNU<*Pn_!Z*%virAKoRZ}drxaD{TcN|x6VYzgkam7sAw#zD1 zh7%1}*p_3gt~U+K5oXKbwo!2eMdDdCFNGe4L$wvN)(FM!@D^{H#Kj0}$Bgfu-&C<`~pD8s=mK%;r4I*HbN-mkrZ-%5-9~$Dml}-3y+d&R;hMP%`(lK@gVQS!+~Br7M^TnD7{_T1MV!ed zVNkH$sV9`TrNg$6LT7U{J!#lyl?=|~UD+S+(R?t!Y;&8UKNO9A%c=Ve z30JJhW~AU>-|^J$e91Otuke<6ORC(reLFTXxQr{ZeQ8SNB7uYq426K$nOu8RIzwMI zoH&#^Ugv_7Q%Z9^Mo2KZq~!tz)*$*y|k&DkJW*VN9U9hyWXG6=*p0qi|3S5ycFB~A*twzsjRMU(>=LcOXI6`)5p)vs&x*mF+RGehwKR$`Mczllwy^#erhr8A>*md?67&mM`&lR@d( zP+U#wsm-5~eKIOaKE*n)TNlfrPWjpz_Y6ILdlC6egIYg5XDvHiv|Cg(M`zoPu$pGY zS+_ik5`ArZ+|vjPDl1#H9CN1KTrykpvKVAC-5R$Sc*~OakT~3}t26L-DAj|`>pW70 z9+(rn)|lpNp(bt4ZMSOXge7eahH4jfaZtbRy22AJz7{C;aF#|++%JQi{2b8j6S^t% zrJbccNsy&!S81owNSt$YtJ1qdyI#y`&!HEdp}$c44Tparnu2*+dl4h64ZXdZs)gQTP>yf2KoVPP!=- zN;8>&Av6;Nb96^AeK^)pc&b|=``=1vUK1wLs|)0v#3LKv@jH}z#b-1_nKiw;;Wh21m%8Oj_Tu_}AY-m0(m0#iw{XF!>oh#lU)qdjzAzD`oOw zq?+V@fp>sy{{qak(7$NnnH-QEs{#1Fy{EYFgtSKCQbT!$i+Ddw*aNaI2g_)o_#+bW zC&fRZe2+xzNpSh{?GA&PmD{I3Z(xUVkz|>98A%DyLv`D5RT#!J|y!UxXL6H zR?Q_k#&FNqbqDup=fruPvUOt-u?lWhaI1m|d_+e~R#3szBAADdQC&pN!+?ir530Y; lcu0B}^f2V%n1|yYF8cIK9?tuR5r4gnMKUAXq(uL*{{RhAbH)Gw literal 0 HcmV?d00001 diff --git a/ordering/target/classes/ordering/items/ItemsRepository.class b/ordering/target/classes/ordering/items/ItemsRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..e073984ad50d20ebc5feb8a22c7e077bc7660a10 GIT binary patch literal 698 zcmbVJ%T8M{5Iu7Pa@rI^2Q~5{i+HNW*6U#1RTV^- z_6Bk)#ZdCElZ%164Beh}h4AB8_|?gg`et1zav7u;jHPh@>cywAyzlmb%l>2gXo3z` z-3J^!Yl`k+m(YC7Tg3w5-Ltr>SR$-5ODP?XsZHENeBs%1W@`0H8;075&nn2c2j`N} zw8An`gn9%JsO0>29it9=`CEdR&(cQHPVQf`-k8s7MSDIwSWOqwq?6oYr9;<0mUw|A zKOpQqrNsl~d4TuNQ<*Ebo@#z4G{rq?e-A-OADw)^421fbE{qHlrwENRJ8_rlSPwba zIGymlM(SL9eKAx=#@HZ(w#Ku(2^P6`HA;mFHW?GPTeo%t+iVXxQ)64_pN&2$8J07w gWO#v9cCnVBiB=!vk>X_^iyp5$UVE&2yzyxN0q5_-_W%F@ literal 0 HcmV?d00001 diff --git a/ordering/target/classes/ordering/orders/CreateOrderRequest.class b/ordering/target/classes/ordering/orders/CreateOrderRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..cd22645fb5e7e6e2a597f7d490943f80312d63a0 GIT binary patch literal 2784 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 literal 0 HcmV?d00001 diff --git a/ordering/target/classes/ordering/orders/OrderEntity.class b/ordering/target/classes/ordering/orders/OrderEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..63393e1aa61d39069be17a5f3db6dd5f34b0a6cf GIT binary patch literal 4360 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 OmWKPV@kdd7P(>BR2cPf(M4b1gN7GsYNxt|% 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 Tn_G%FEtL>8m-xFZ4bA@>gTl(P literal 0 HcmV?d00001 diff --git a/ordering/target/classes/ordering/orders/OrdersListDTO.class b/ordering/target/classes/ordering/orders/OrdersListDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..b61b493c72a7f2f7365baa482b1e2af03e8b2fb0 GIT binary patch literal 2762 zcma)7+jA3D82_EkZLUC?)U-ufi%@5r(`0S8+3eQrNk?8B zp7;|S_0b2%2Oe}rfx#K4!kZ8NMULZl_AF@{3Uwyg^L^j>?zi*Tzfb-Ea0#C=9QNA{ zyX|-@RtN;voWz5g6Nsw|b15(ebB%9s%jLu~x4dT8MG7&77SI*Y7e+_Sd5_v8!h@{W7n#yPH0lxuikKImVEY zPK`C}FL=il4E4e;zVs)h+EXgkle>nK!C@Sc=EoRx;j02O?0ufx-m)_s*fs_Q)tVRC zgpLBk*w#Qe-iF__Ev4;>@71}u&g;T&-%X)NYFfN$EAlNztP&Im?g{FPZ+rVM(lTR< zRlhOCy@qQCV>RDzcGh=j%AVM_2`=1Sw|8J)>f!I^>V*idaMzu8gk8ztB;GVo!l`T$ z76sei1eED5>1a-*&}5Ew%4tgODi0{qh8+$}HG?yFTMo=Sv@`54JKUw{_w`2q+^IVZ z316(r>7?Laz5;0e`Lb)%=;*v{Uy~|#o#(EN3@+fJoM+lxxt>5G28NT0*xhEY?0JTv zTC{|yc)Y;{C%3fLMvQX7jZU|>z6f8|K5Oi+U+^Y6`jMME3W49(oUXV6bGk11SF z5vWlSxv=i)i7952V7{*ctn#B|oww`fz(?#HG_ z&2(NXlhB~9^$O4>n;td|x*RyIo0)ukgq7LUvu|S4X>$)z2MJ~bX9+eXeDgrBJQPwNOg;T6IV7W^@>8t&ou^r@da7ACOSD{R3#cI@`l%*uf%Lqy;&IVwQ|BDK+3|$a zva8;P6F5}uOIwcs?KIV1*_z|ovz^wm-CmF#AuHIG4Sii3BGq6pmsm8B+ zNo~4kUhsNzhObAOjCsG)uG`lgX=^l6ySRgc=4Ia(foSt}r8K}KZJv182|4*l5cV-) z8a=`{=}c1A(sb%{(v~F7dBSRRuhD6ia>iqr#YY$}mVU$jUx=n*fxd%?5%&PX2a3*5 zh_+wJ-~dJlBk9l{i|nPaNVF6+WN7dfAqgr99YYvJp7cq}7F|;*ktqI({XY|+%t<#v zvm?!96hmZ21#@s)Fhe-hRd~E#A^YD-Xl+wYq*rIjJDHEH%E#}}ZkHb6HR+#Hr$Wzm zL(gst{pdFDUXlhgjn^T)l?G3cIa#!!L-DV_gD#U%E0!MO4Q29Ex{84f5cdg;6R(sh zM3EYj`w89xw)|5$Ga~{?aH5A8j~*$1SxH(h!p&u|X!Mg{wvtjpapUM&5H zMEpVNPiWsG5qnVDgf=5xIZ6M=ct0e@rAiIbe*>|U{tx!12;b_S@ooyoaULI#`EI%@ zBouYcc>-g&9qPJ)J9Kj5yiC=)vV>R_SF5;I#dUm0Af~FQVtNTIz(=SpAs1jIz)S!= m{LThQ1{e*H4{#{J;Q;4C`uPB7Lf}OBox>8Dkz-P(|HOZ#Tz^mi literal 0 HcmV?d00001 diff --git a/ordering/target/classes/ordering/security/RemoteAuthenticationFilter.class b/ordering/target/classes/ordering/security/RemoteAuthenticationFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..f203fadb57867fe2ca0048fbd9137de704ddefe6 GIT binary patch literal 3085 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 literal 0 HcmV?d00001 diff --git a/target/classes/META-INF/Ordering.kotlin_module b/target/classes/META-INF/Ordering.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..7f5d5693c3548d1ea4d36c5fd5fa481bb8a52319 GIT binary patch literal 123 zcmZQzU|?ooU|6ushtqRhN>z5Jq-R1iam*Rh}=Co?&* uBr`wHyM)V>OA)79z2fAe%z~0)Apy_4%#zUJ)S{r$yu8#R?-C^jEd~HE@*|r7 literal 0 HcmV?d00001 diff --git a/target/classes/RegistrationRequest.class b/target/classes/RegistrationRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..f3623e0e36e756a9679d7ba62df0036ec6fc5d0b GIT binary patch literal 3682 zcmb7H-&5Sy75=W!?rMcFVlf!72}_M*b}?S#xM^$bwlvGN>|)T`tZcjC zM$7ShS#f+n2%{inWhn@k_L|Lk137`W8bR3f{L1$JPQ~*>1=XxneHD@PYBGmDfuY)# zTWcg{51bagQ&Hf2cM@@y^Jx)V=!b3M1O^P`4VVmly0m5?gCP?-h6M`8%`D_Fl81&- z0a3MJ;I!h-Sjflnw=9@3Rb)xREl)Di#gzS+7sze8;ZjtzlhdW+zPK?|xS`6)$f^Rp zWIt-xRdEm6r8R58&TinlemE!4VJ>$w?{qU)7+x*deJrrlU9dOW_0+sn1+ylLa!J5a z9;WK~(RW$SzjP zK^rUjppUPMl7SxxOm)tR=kEs%w-O^S1b)p4Z#%UxXg$v1M*^pIoQ4~VKlZ{cQZjV> zkgf5@?%F3P_uOzRsNZq?defCti$T!X+fC`9?zOEQ1B7*)s>-|}9GYgk>Hu~Je~|nq0+}G(QX_*! z{@-(nL&@1_x;(Fj({kTakgpvwZ66kvv7&~|>fv#cC@`tTWYlrjow^e`^rP+U_pmxb zz4Gb>4x0w$zx5QybEVbigt+zcNzv3sG*h!*J~8>H*(c(~Fg2r}Y%f>cc=eev^76@L z?UJ~8u8_60G3`Dy28T*6HOvKlFCos=x0^kF9W{b8WHx;^ysN^n7<|Z)d}8t*UlW+a1)L=9<&; z6rTvEj$*Yhu0x=9JOkPv*~5J+p;K$zb9NIXb0yeo)!f^j@->>kuB8NM-wc9K^2fk# z3@S0lQK++#bQIKe#@tH_o!Yt$))@iPL*e#W2}7UImXMg&oNOR)t_VX?=;Y`$@dt626>mB;w^fH;Y`B9 z+vvju%C`9ZN(_$g;Ve12NfJ<$3R{b0DsXjDX4PHHG(FNodXk^oYn5mG-X=Am69u&A zapPku5vFjCXey-&RoNlPl>dRTzmbSTRrONJDl98jNW$u_<^aP#&#y;;#-AMl>P-O} zz;tR96Gx-4Qj8BrQA!1xJPOqJTA*?p=q%GZR2T7D05+O|jRN!8NDl$QP{w1+ciW=Hj}FsEu6MzBZK6fA=RCs&N;GGMR)Pzdn@7CG^D7 zP{uaMLos_7VHtc0sSOHfryO6*Ql5J`)PzYup4nm52|< zaLU0D>Sj;keaIuFPVSsS`x5V8J8e&FDbyEO{PcjC;DLL{{Q$iSrUu66YjJ64Mf8i5ZCt60;H)C6*%n2NDYs?@H9*)4f6WKjHJk?*KZ^ B>SO=_ literal 0 HcmV?d00001 diff --git a/target/classes/RegistrationRequestDTO.class b/target/classes/RegistrationRequestDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..74ee73796fb353764ed870effb836d65b0421b9b GIT binary patch literal 3700 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/HelloWorldController.class b/target/classes/com/coded/spring/ordering/HelloWorldController.class new file mode 100644 index 0000000000000000000000000000000000000000..ed6e39d80ae3e84f5b691499941743cf13377687 GIT binary patch literal 4403 zcmb7GTT>jz75-+~Wrt;fVJ*zfmO&yCtbjpCmL;Jm21PO`fE19?h1`bS28NxTA=9%+ zL~*R#>^M$d@{mei^O8IyRY_GyY(Jz_dd!bXwrO!Ei{`b zd}nP-6oNFGG&EncT|2n0;nU&yqd_ZD_|kk|jZ0$NlXl?wyHm#;2-T719i>(L#DNaW zfl_zs(fpyMkrfRcp~QoeTnQoLEA5YkLzTsXkkZ-^8rs%{4D21T99Tg`YUqmQ_v`pB z&U^kwySWZPuX-MrTLc__Sr*y=Q@W&zr z#>!O?x z)%9~4lEJ3UpqV&Ec%$56VB|JLP?sATE)0(xgVfjwRj9h8(Qxrts3Sb0p_6LWhyDpd z9ZERX2D09&O&(t9BMq6&{c=J*8s^Pov1YE>ZZQ^?=6fPou(r2Vg0sY!AxIW)<5GrR zznaAbTvXIG4Z1ckWBH789V|ja2fEqrj#m<9HSSo-3RZBdnwx37tD(DWl|*&hY#+-Bq!EI(jdYLBPu+ON+UDK))mh zb+AUK88nM5AH;bXRh7VYOa;nofA`ShwO2}rn{HqSyHnQ*p_}F1F_$8;FfpMb<~thr z?j7~^HO#6szDHfx8KKjTlf@74uod5jMQ227!{g)QBRUEi`s20n=96u@Me+p*AAl@G zweGFcDYQJyQaWhnE14Nj)|jE`>iaFTIFCtXXNiUAXglL52QOk8$|QOcnS}BD zS%yDF$38}TI5S!^2|Y`u!8k)gPwL%0&!0^uCbXFgxn?8LmzZecH_2}*r|X*0Oe!5x zI;obB%BZy$e`-z`t+#dKgqqEE-)=X$`t)2fmze0Dcs-o=MDyNot{Z(3r*8D`Q*TtM zr4vSo|KP>%lSJ03bYD`>8f{DMMkwyVi{GgYWgB@z{c3sJjSg;v2GnjCMkhByJ8Cy_ z#%nMB(#(f5QJmD2dq=-Ys<0nChCLoEQOGf~!tiB^vywJ?)y7M#7X3>V=3-gQxjVMB z*}qKhH$@Emd&c)|nYFSYZrMt4W5)9W8Ti(ARe;1G zQ!&X9Pa&uJ6JE?uIcw&(li!?bIu5O|(>S!oek0^(w^6s(%6W>2N&Ji)f1|u+ey^O% zXyA3U7E&pDo? z!o6t6n=q(kC(g2E8$~xJ(TB_Ez%R&iy($c280U;)BO?{1OiP4o${>~JS5(^+y5ov! zo2d3Lxq2qWL4|CV|29d9`((!fY2YI=^{2R^JQp8d&OYXPSBe^dvRP>O&+y;MKZ`yl zsEu-w$r)1wsr)}N_;(UjbJd-IrYf_PChE?rX2oxeohcn~7-*;-sPjvK*updbI$ICa z^`$`Uil}eBY5Bj_nby+)NW(kSqA5JQN)TmsPySz+`Xe%Q&*-0#rtz&XOmg9c4sdahS9h8LG87Zk6Z!BH9#a>4ng2FQk_?7gzs~O~G8QS)l)F>! zjNuq`(~-~%b{9et?HjQeUOt)y){Zi|>Ap zH4P7Q#m}%&FXvKBjuCn1*F2ZNBOJbf)jD~b4dpqX!#hge^pW!H2J*IQHJkR%|Xr~m_r3SB=L9-Pp}(?&5!VO6(=ReC4MZCmUv6D+r%k}mT)B# zj;#{S5^qafk~l9hDPc-XNL-M(C^0YbAY}VMVpHNL67NXdmAEJIA$~(Obh`T%|KIpO DCc6rW literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/LoggingFilter.class b/target/classes/com/coded/spring/ordering/LoggingFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..64c5e3ae9e67eda112fdc796e97ec8bf9553cd24 GIT binary patch literal 3681 zcmbtWYgZe`8Gc4W7lgP(v4gQ4TTY0>eI3%Y31B-w;vgbp7cdT?t-DBTu}Iogc1GCr z>ZbQ5y(CR@@;RUSwLLu{iFH`vn$H-5)c9}x?U+1yX%=%>z?bCjeFL* zao3kIZa4+&rsXYK@6;`+8V92S@hRJ})fIv0z~D+6F~n17LqecUZP-#^Fn>%KlL9?O zH_)7Oh|4i60&*a~X_ie-nTE8yt%{|L4W(+v9EYV~A;dI!3_)3Q9cdkv46M#>n6@)H zxFV470zU z+c7q`s)illtSyy(&m~{!nQL|=Yg9^d`-uBE|O_#%Ifsx~fJ;?gm z6wcsjfr-bm8-#Yx@OgpJ;}{Op7+AiLLKe?3&WG#dV0k3aFL1u4OrSD>ivnj33pG_o z0t2jxMwtq{b`wR)m)*tiuB7ozO#@kcOQ5sBBD0EN zjR{QtA1(=WHMBK6nR+~R2OZJubU4|q*hOII7_xzWQrXi-gqx~}`zK453UA@GoY_{^ zwC9=IWX*xWwV5UjNrjeI3ZLMvvaZl!T8poKTc zt%qqNft*i)J`wp?kp5ejM58yUVpY!b3=1+9~tK$+!kJ9k~)hGql}57^bJa5_){B|5yI zBWt1|=NyHn>4w)uSIH9laGeR@i-f6HsO!BgmU4riCbG;CMVga-Uw7NwQN1mk{6Pi+ zKNLte-Uk7&p-0k@WHYy1#pJQ`R`~{D?VltHLar%H&$4x)o*kgdW=UKr@1Y zirlyLKQeiw_=3PkyALjPgYn2EF%$dh(>RaKXM3Wj zBbVC7<2^CXan1?ONzUz@Q*$TgdwM#WB+_#ku5^YgTDEI0^VMJDe04;M;{q=|G6rAs zmZaQyjw6UE2d}b|KVc) zV%<@8)yg?rwzRpv_pX}Wf2z?=a3%LPSvRRAx9$}z5;k@Bg=$s;B?r&WxUQ0l@1{VB z#07Fyo6Z_Xawy^)|GJ+<3|L4_lv|uWc94^~HAa{1+IFVyLfe z2QLiu#dh#gU+goyyl?*;`26JC@hnc_B6``j`!I#mm?4Y4!Bvgx3T>ao2wuSiQC-9{ zn50Zh;|a0quTEU{@z0@)CnElCH?9)-2mF3A%FP~rG>;$he`k~@!81TNe-ZG-!cm88 zo7QwFjp5HQyPA3ZbIdI~#Qf^$-*IyXOV@|~f!o|#0!=^B z^waut7-A@Ocmp&i@Z%88@E)3BhGl9WjgCYY-B@!Ee{lBaxE$okU!sL*hM&PKnDBT@qI$x+Shkj7dyLj7v;O SypO+7c^8e8h~oSHxcy(WzWP`I literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/OrderRequest.class b/target/classes/com/coded/spring/ordering/OrderRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..0708a137e3de4758f8e484137523714a30f1f1e8 GIT binary patch literal 2151 zcma)6U2hvj6g{(c?DfWJ*6CN86e!dbCnX)FpH zX@wj0R@heUdfbh?V67fTZIvh&jdEFi-czwILI}9m<)*CrlAw#L*Hw$woIv4(7kK)V zK)%+PS{5kwVikSnwFPpuspT?;U^~d8Bp@1P6fsg?hSz%^4NLM!_6>St6x`oHIiNs*JTidT52z(ej(HsdcHqzk|;Q& zy-%QQ4ym@)HQDpEz_lIoZ#0@u)^C2tJj>XPJ%+)AfUUzNZ8{{dr#3YZG_|r&`v+TB z%ldIrOxbu=pxS5Q1)E_<)l3X-hS`uEm71@5dYxLVWuV!#uWAFw zW>FTEUJu&~GHClMt~SH4)9cO;z%q6Nmd6~g+~}&Oz*h$F>Cmxg|HDU$I?d0}Qh$B-8AK+V_Gw>nht)O9HKp z%^X<^vy{vNUaAi5UwCFWORdd&aA)i0A;%iG9LwFh>F{T{wqw}^%3;bJ%NwW$+m+g1vqSLb*5(Jn4mw!_;zdLnNRxrGNm6h;l@Ibjm9lc7zR3mzn=*@WoOe2(G;++mjnr(`g3k@@XSq8^X;C`U_xPXu1tULkXW>1ryI{J0k^YxZ zqI{pbeJPsXM!BP35>+q`FvQ21q5_wHk%X_C2{NCif5ymNDrw|GV!V_@ET@1hVg+N{ z&WE3L7Eg8H%SEClnd6iunbPmDKAyaX{XcS(I;Ffz+q_E|?+=JDZ1z(2b8t%-#{rs6 z)FX^(N?19V|MF|tCX*A>lfPmzjlRH7If!AR58@eOjZcj`lec5g_b~cvyC7(9Kkav(P+JB=`q<6o?)$LMMF^5-qc7xcWN$V9VS*_-%=5U^?g){h&a)p4` zIAE`@AlJYf4ZPXFTX>r)<{LPHlLW*#g?Coq#u$z9Zj55G7Gh(m#2AaQJH~8coQp9X R<6xqnMw17a`8CCP?q5%(+BpCK literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/SayMyNameRequest.class b/target/classes/com/coded/spring/ordering/SayMyNameRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..77b20236101d4753566798c2b93f1756a9031e8a GIT binary patch literal 2879 zcmb7GTT>iG6#jblHoI(K*l@oDlAwWI%#w>n1&ol3ELli|NK8-R}Fv3)lJ*W>$dIqx^Fs^ zXB~fb!?H$IBm|CC9N#kS{Oaaf-n4zgwRJ0BuqCc%mb?TS1X@cgMyV2--Oye7p`yU4 z`cQ&cM-K)!w2;OTG^UV76T=&n>lm6-h$179IcShZ0xd}>XcZ8JG*q<9RR>e_S4>Y} zxcL7m9Ti9{8@?o2pk;9ApgVF)g$cJ3|oWQ_tYnt|^Q!(;^`6b6L>Hbx{w0!Wlo`WcamrJ=UA7Ewpy)W2jrBuXtuFIDhBvp?jYHHI>-1|(9mwF4ZdvoD zZ;Ymq$4CmNai%E_cEg_b-))0kfN)RRozL(&c$0*#=pK_Tv)StId7zlU+i6@tUkdNw zU4iCZAl^q~*>DpWV-F4%hIlD1;Jp;aagp8Y8eX+?;(SDOiww5bGx##GI|4DsUy=8g z1pfQuz?VT^vJBoERd-Ie>T|C}$`W`hl2ht~pg1XjfECXeu|W5iyc*GpVJX z{}?|ivt&~-clCPs`@mZ=WmuMT%W)dz8-*jIKvkw%5p2n$oHQ-+~z9IImtOAe+4+F zxaQM|2<~uom)f#LT63AyQ)t;IIGW8pLR+@y5jub7fr3Sj83M;KP2+25LXqIp_=NlY zfib$!%@tun$5N8+6nx6vq!Pved=@MdoK$|z=s_>FWGHzmv3iJQe?i+%6av>We$cIS zmkty{clFsd;~4sQx*w?X;Xa_^AwbQ{<7E^l39=^&afrcQ&&O+?>y4|P4>N9-zYgS6 zhC0bv(ys;d{|e=HuIC9}lj#Sx0mE92VXeln7BXBP%zv`2CGk2=g(RJ$-x$60_C~+@ z2CC$|*c%JQ&hc!n=P`zYFz!+<3Z+4IPPRtWFzX|UYLuq@I-lV!U^nofR*i?$O2{WV z4C5kE6r!|Cl*bqy>(=^KB-&HFe{ZZ?RxjY8jcO`;Z-QMV-L{9of*f9AE|SeP>PR-v zXLCOw7JZoe9m=x z!~7zIhnx6l5iK6NJuG-gR7bTs#yuSK(C4AYL$8N^563;6@Gx0Dz3kzFhpdNNSfVqP J&d%{0{s*PMb|3%% literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/authentication/AuthController.class b/target/classes/com/coded/spring/ordering/authentication/AuthController.class new file mode 100644 index 0000000000000000000000000000000000000000..be11d80c67a417ba41aa8ae88e27ad721818d295 GIT binary patch literal 4097 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/authentication/SecurityConfig.class b/target/classes/com/coded/spring/ordering/authentication/SecurityConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..4c5b499f212fd583bbf64b59914c02d227eddad1 GIT binary patch literal 8019 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/authentication/jwt/JwtAuthFilter.class b/target/classes/com/coded/spring/ordering/authentication/jwt/JwtAuthFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..148c5fc02e52ba34d14beaf799918e2647e71df9 GIT binary patch literal 4473 zcmbtX`&S#s75+vNS|J3Ml~5x;VjR0RFSEo+ng;B|2FC>lgJT>V+iBC4G?;}&i+5IF zr*-1=oup0O^qKUXK2Cq>4>_m7rq1c%_=onK{!ML9zgaCH2{70>pn2TAbLY-?Uo-#y z-{1cM-~|38(3^K>%)DEW1yjv>cJYeodIcE_tdc(|i@u$=eA_LWQ}e!gdfq=l>M7gt zrDs40Jn4E@!j%)AH6!O;Z`z!fIddZ5F-MDec~*MoVm(wEgD<-e?jJT~q6j!mrQW=y+CjEa_H4i$aksqDNm z&>+y9pOpFOaM@W)gGNSyLv6!T)|_QJ7L72Po056IuYxkBg(#9ALop&cC!XhSDe?U$A(J?e6pt{1weFR%G#dA)kkH(=85l}{Aa1>2uIP>>T= z$?*mH*4c0Ec9(`KXrbe_UrON#97&=FPckfO4_s{;15XR=-H@jYuz_a;cGWUfSjND! zw8yfG2%KE&8r9pbwe!mN&=GWG_2Fm(dU1^Iw;G;h>0Y*1+htd+lJaJum~-b zVy5j+;y4BbnpU{my1TpE6L^7#s!RwkT$`m!DJI-;%PGkezElqOL4ju;GEEvdEwGIy z_pH3Hb6}AvCxu~jB=I872t2=e8qK>5IqfuIavdno2VIAbX<(FDlztjg1&+0~Zy|wf zAha)qmvAnLvlwGKduZJZyezPtTIm2>tz!aDZArQ6Rn+MMUTMHME()Y5wp+Cp}r zCUJ*0U+V=rA}-@q4f&S^j&FV}U5GZWTn1ia&^oSF&=&2#zHC>4(RG4$E7sUxKc3t| zt^r>~p0e+&wp9gmP;RxWowbzWwV+UqXn>#rxg`^Cpqqg!45`q>%(1>LS!G&i-yl>= zzU`O;uH&$jGN5=88&eIK#I*L%3KOlZwpEl`Ipu;olf(py0weduL|=t!aJe9J)le*7 zH{6n!mj-5&xT-68Dp#_dLikajv^Jk@P&fKEG4})LM9dU?tx$;}uB5-BPV+hdYGCGZ zO#^dXpy$581h=zl91MJo5z9@g$pTNeZ6TXfFA6S7H}HlI**967wFj-}{uwTgyoS_U z^z*=d1zx(pVw!U`^=u^~C_kxJEtmXEg`0-CMWD{t>4()$pGt?AfOh%Kt~bFIoEvm( zfj6vx0(;glSJd1<*t%xs1x>pC^;yXPoZ+>KD3E#kaCieb!)tiK@-5OLGjmbCMucwa zbprvx2#s8`^{j`Z!V?02Ub@+njI>08-_p&>E|MTM9Z6PGS7wPFElW3#M0!Mjb0(gS z?2Pn8*~i$|-TNpWNyksOrVY*#N8;&v_DS{)>{IL;**6V7dakLw?v;D*$MhO*MN%N5 zf^_dM@oie$BlOsH{bG}M5y9Zu6Qkh+j5m&|_g42buVlN+a0 z@SZ)ummG`zuw9fRrJ0=c&RgVRr5JYemNRa7ww{N?1GTbNUL#dP(=^tkTUhzX6x%rF zTlwiT)@&##ITqwDdItB(hGNIpD2RQ04#a5G2r~My!PEYVvpD;D_8I+RsG&tTuOmkk zzb1#|O6?T8Iy1>TNOxtnv+cNzM>{${!H$luPq6c2evaTbfw&l7NooEyajR|E$%oT# zNpCHSz%K0OjKV@y^hhfZ!S6_I)H`df%I)tts*jKp0&=J7zO z{cI0s4zTUa99%?K1ii6r?4L+yW0~$~ow$RiK1Akl=MuiqwS+G&;<+e3&c@Ql0#07c zoVtUd-nx#zVMn%Z0VBQfJ2=0HO9KDGNST_AFW@U5;5cVHv++d~xPfsO6Bo0F$Qp}q z1a8CaO=J^yarNSDc%2KFTfplSluaz*>x;M`u(U4aE& zC0;l9Gx_xJG!zW}jj&-ll0ZtrhRk zW_q-bJ4OTRJrb?5-l`27qg)BD0lBrO{2^$6i9fP`jq~rb{{i=X?=qr8_~8(44dF+4 zpF{k32tUD3FGDE&3_rh&w8CzMUnm#~%?b&H7KOON9)%AS_A0!s(5mo`!ajv}6+Zkw DGmbwe literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/authentication/jwt/JwtService.class b/target/classes/com/coded/spring/ordering/authentication/jwt/JwtService.class new file mode 100644 index 0000000000000000000000000000000000000000..a28c871e8c95bdacf8cd111f78af5b0d795324be GIT binary patch literal 3373 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/items/ItemDTO.class b/target/classes/com/coded/spring/ordering/items/ItemDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..b64ad17783ca5170f0e75bd4c77c8ab66d43fa8d GIT binary patch literal 3874 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/items/ItemsController.class b/target/classes/com/coded/spring/ordering/items/ItemsController.class new file mode 100644 index 0000000000000000000000000000000000000000..27e6fee1893b9c839a7c88cec6d66d7bd49a4a39 GIT binary patch literal 2126 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 QxEg0P@{}bNS2S+_2hDMhumAu6 literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/menu/MenuEntity.class b/target/classes/com/coded/spring/ordering/menu/MenuEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..2292ccc889d766235a736d33ee6d9a34129c1674 GIT binary patch literal 5260 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 Am;e9( literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/orders/CreateOrderRequest.class b/target/classes/com/coded/spring/ordering/orders/CreateOrderRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..1b921d56bc2b4178ebef29324f0089767a46b782 GIT binary patch literal 2228 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 R^4}}?30+FkrK^0-{TpVS(IWr= literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/orders/OrderRepository.class b/target/classes/com/coded/spring/ordering/orders/OrderRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..14e775945b00ecada38d118cb628b8f9c380db6c GIT binary patch literal 772 zcmbVK$xa(V5PdZUyo7)mmY9(I0_|9eI5f!Od0n zk@Y%QcUuM#?vlQ|l42nF|Jh|<^+G$bE_*KV$H}3(wk{W`3{vz*Qn;6VaXOOoYCn?2 z@Q+Q<;kNw>HnApaAGQhgx2=@1MEL%$cFI^G>@Z3$9e1uxK~4N(Iw>PH%(eSFov!p^)3jqS<9KX?p*JLaGMiA3UT#Fjf{MD7xXeLWd zy8pYv1fsM>Xe~IN`9Qg)gZHh1GxrySd)@{WWGl1#;KL!rZ%$=D4}|K4&WsFWrwFwR zJ9a&Fq6h5ko{xE{L-kvGeK}A^#@HZ(w#M@gA}n+5axqVo@R?=AdT*w8@rCsvM=GqV p{Ik|Yse=z4tak7bYiwe@gE}_4AdeWET`YTSd2D;^czp6`JOReR;1vJ> literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/orders/OrderService.class b/target/classes/com/coded/spring/ordering/orders/OrderService.class new file mode 100644 index 0000000000000000000000000000000000000000..2a09901fba6372f3a8f60cd11f0282495b29298a GIT binary patch literal 5378 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 AE&u=k literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/orders/OrdersListDTO.class b/target/classes/com/coded/spring/ordering/orders/OrdersListDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..f4be656bee2adb6fb07635565ec6bb0f528b8827 GIT binary patch literal 2949 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 B`9=T$ literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/profiles/ProfileResponseDto.class b/target/classes/com/coded/spring/ordering/profiles/ProfileResponseDto.class new file mode 100644 index 0000000000000000000000000000000000000000..e245afbf832c9608c67564a1aefa4bc6b5c1eca9 GIT binary patch literal 3912 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/scripts/InitUserRunner.class b/target/classes/com/coded/spring/ordering/scripts/InitUserRunner.class new file mode 100644 index 0000000000000000000000000000000000000000..fff4b840ef8d92bab0822cfe07952114bad52ec1 GIT binary patch literal 3772 zcmb_eS#ujj5dLN*Te2+2ijrVEfH6T3$4Az7xSfQ=CLsdZ32|@;<{GcY_DZW=u`@Ce zXSnaui!6Cal;AGeyeH5v z3AN~R+m#UwY0i3Tw&pmKNpvyvmp$d!u31{Gm^NASUG7lq6va~7mP{bau*+HzRykaD zifcefkzwy(;lB}`j7a9Rk>yDp)ScLs!VcV)#5RW81{YdsWzffvU5{JN;g!WA&y6vB zFxc|+Hyw{HhrgwNY21!GQZR65cRTtS_B79KyQ^MVn1#UO8KL+RxAZ+qV1S{M&{`8P z{29e8Tt_Qbyy6ME7mkp*g6EZM)fPZTK-;kJOuZ_i>Nh{x*z(3}_if&Gnmf*%t;A#+ zdvH$*cOyrT+)FRmuerf{yQSx|<#283y``}igIOZ7eGKDU-iqPyt=&ap!Q7_Toyl#Y z0K-;Ej3%+4F3_6(_{4!ECg=e*Z{G9@_vgebHQ`z!f%_Q_-U{>yJV<;@wur_UMxs|W zx)Bjv(}VDpr|~cz>BK{Llws)lgx#duW3D1DP2eDr^$FoPp61{rC=Vo+kV-2iafBfq zB_HCVs8fwB5-`jZrZvMn&QOnP6g*;}&EDoWi#AL0g;w17xLD#fM@@UKRDMlA^BL}! zHR}h->v#%>@B{^ISp@mVC9-7LIoJ}iJf76*Pccw3y;zh5f=;}7MwmtI{B}PT71+Ng~9E%-z z85YBi!1hLk1nB-GbdjYTH;rX|&zG=5<&os8G_}FW7KaQ)X_Qdbk#)!sePagL0C&iP zVtqiIx22LvxLL|>bcnbPIKBU^+#GT~igpOiMnHmkAOV7+HHiil60a%G^4ukRx#kOV zE~qZ2sB}77tvWW{F)DJXzS+L^Hg&cwa>YqzR90ie>r6Ktx}lJ;GRe=|`ilw)qd3lR z=IVw1l+kOXjLg*wDI-Y(`q0B@m+a}idSSvCV^eL{zH2u!#*@97*luGiKGB|OqrRQ` z1og=iJ=cC{@6fi1nQ6z7mighj#b5GdSUA&}HkQo$%LG(>I-ufiT`wXslAtzb}fum55M78U!{en?*jbg-yz8@hz# zPc$&_5w*JB0y=3)8Xwar-B3aY&1kecNzxV=m?upg=AFaY?Z2RBB-^Xo;VT#dek6I* zUK-t$DeesH4K&t-_GmS_FdXc$6WcICt3IK%+R1L}KMltj>OZ4jmq8QyqtSj&qYi^C zfYt)Lb-_p$^zr_p9oncb4Q0p3ui@-CwL{qhSMk7QOd5DJ{wofhW7)?t+3eB2_%Art z7mu?`I59gsdJ%=oIBno}^y~2zya@b^;!77{5073(#lYF`v7<3nU7ykz#_$ETX&8Uw zTmpv@sC5UZPLM2381#|z{n(BHI`F(FByT7-;`SY(oUID0~&QP-4zG1l?-ZA9B z6HeD~y$&A}((=T>mqy(Y{*RJ-KMWm*dwYHaj3It(j!eTg>A^w!m|MgRFa-Oia2S>| zhmEWArmx_t*%qCfURN@t8m`whj=A6V=)N>e$8mkr7cSBJuD?ID?P?SehWkC&w}oRI zkNSpieC|1>P5LN6DJ&U*&T!9q!L8o(*)!8K`nNz{fMv-J# zn~mAd$-v`MQuJG)TbG>J!wp>mV0|4f|-K4u76wktXLAd_vy@Bo?H_yk!BNm`_j z(xl^z84Qf-A)=H_ixIt%->fod{ZW7_hpFk7nn165iqPorL@262RHsO~ zpPw%2=cl?B*Cxv%kqf#O)mB&H=clV$ft6x$Z8e$*CbUAZ5P1DdSc`{V{~8V}gc4KW z(SvCC9mb@rFN36(Qk_N&3S$Gj*xQ=y_hO)l(#BHy}Xqw zRmu;qY#2L1&;5snkhpR=RUAv%q4pEprsm0Try(4^KkT=;_gvKnL!#kYrrk0LpgcQWTY*@9c9!PzNa_)uOxjdwvsZXN1D-`z9O(CYLo1(WS*mIC;Z%Upy zMG+c;DxE3iRuDoM0X(MNh*p);8@a@-Gu+ALUY+6IIo@pq9wk=t`RVQqAO4hBKSTO= zt# literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/users/RegistrationRequest.class b/target/classes/com/coded/spring/ordering/users/RegistrationRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..cbcd90db5225b476464d20030de14adb3595f60d GIT binary patch literal 3846 zcmbVPQF9a575?seC9T#nUJGPwgJZdvV96L^AZd%C2{@sM7(;Ex32~cbEiLw1@~*49 zcFRkKr@ZE&Gfa|~&h(+v2Oip)LYQ=>L&;lzQ>WAK?yjY^tqy@1YwtN{&pqcm=bm%! z`rrTk{+|G@!56q#^S3HBzwXp4a=Ybv>lMFMcS2%EIxSgQbkW#vfu{`JI&^-fsDW#4L@kQUS)H4 ztKxcrGS#e9J%vcRHJL%5K%utb)Ee=&yLOA-sVHzJ8AKH2Y&XO?^usc71Oo=L224Vq zEUn~_LcxTNL4o|?Z8>Bxl!b<20a4AtzzM~j%pn`e-^js?s3KDmY`9Y3t@+nDuUUc2 zx)UsfNj)}MI*f$}M}=!D-9%m$=q3AMJMW6S+fKbn2;08rc)^T7hq;hsE+&~vgkSTw z9|(BKguYT$yjI-m1kxsxdR`!>5KPpa`}R&V5O_NIS{4td?nf1MQYo&Z(rfw8;T$R| zBIeWx{3wO&wk};dse0zBI9p^Fsb#N?6us9+S4GLdPX#7Az3O_qe#5Cmmgju0W(POy zTHv=HWbku=<6CyaiNqhd!3HTA*j~WW{5pBIv6b6Su;JHl+Frfs$ccI1Z|rP$>7Ybb z_ibE$uA(-luH8n^(h> z=doc+CZx_LN({$HF@yJVn8O(p@8gERK*tbAk+bf!GPubunXHyL3FdIiL=_*fD_f2X z%Qel(Yd4wYLK6I5@Sg~z{9r?kEGGH?&qWSJd#&kk9vF7Zd0&})>5yyt$YBvnYRE0` zA7`-wgPM;=El=I9+ks6#+SYClvm?|as~+I6Yf%1sS8?o1tv(~fd(R&hO>IasHS769 zlYg3ZBw7qpGy2K)a@CC&Um8QtA70STi|eQJX-gZ?&i8QDxu&?LV?LwS7k^4?mT@a< z^(*e?4`23>wv=W}4O@#}FH8`RV ziSy#-508|)Kww%uyH58!v*@)6qid*YuBwg=Ng=RCl+_Sz}<4H-mWWMmczBq)yWc! z3b=pX^_+#Btu?2$tV%{5xnHxJD|X9Od@P(eXsdmB?lWpdbD;f_b=b{2PcT}ZeuA;` zu>J(&f8z!X>wJ#T&{4dD<9HV*`N1`g>v)s>eU`EfzP}V1$4_vI9NokLC`!TBLYV@t zx@B5@4=_xZbU}~fQ|GPXjGmjM26S2h_p{~rGnEJvI8AFRqzYA8B}kS3j*-8Th@h%` zfiM-UT%-`gN@jC_@Xzq=K|`aD4;Z@E#n1pIyP_C7h~j#e&HGW5x*8fkXlU-GhRSV2 zrx@10yoi@>o@(bJxjD>5x6K1Q_q|g{ZV2P=wqbwF(_J@*F~58>KO0y%>e%kHCRIrn zyOi`lpxv7~IX$d@hZ&X2$Zk}n#dehz+f`a@S7}jwwT4w%jH@&W{*^1%%Hjep(!WBy zOuVY1uM|@H7vI28g*#tJrDA&YY9W=0>9K`E$}-4gsWg6BFNe`Q#amG{4O&S<&-M29 z(e~TzgkEB9)Y%Uz)BKI{H>NCn&xS=O6H#Lfc4-WuZuc1PJ+_qU+!O(qX{0GM}&~p9# zVM{1*>Qwfo)-vv5g)r4A^FJsndpRGbjd=7gRBNC@1)+93F(+Hng2~#31@utKXi3y3*5+#XAiL%6$#94`H biE|PQq5fToIf=I=YVhdZp!;|D``P~hEl(_k literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/users/Roles.class b/target/classes/com/coded/spring/ordering/users/Roles.class new file mode 100644 index 0000000000000000000000000000000000000000..41c35f8edbc1d168bd5199e9b67f197b444da00e GIT binary patch literal 1846 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/users/UsersController.class b/target/classes/com/coded/spring/ordering/users/UsersController.class new file mode 100644 index 0000000000000000000000000000000000000000..d26b022e0fefeb0fbe6599e9580c685132d63c21 GIT binary patch literal 3262 zcmbVOYgZFj6x}z0Oc)}@s728#;tRnt_^KAv78Eral!8(%)^;+vhJndUoSC5ZNguzU zKcS!c(RQ^;+qJq}e(aCx>b{c!6H9A!1?Jv!ALs0|?>Xn*zyALHPXJ^1PQb9d3ja&8 zWCT^;cFTt6mt@qb1=0_U8|r(`b3@;A9O-Ki0@(#~$uu03tFILoq!nsN3Zzckt{t8g zIMQEeN$ZUCmuyRp9-0-%MAqUFfxQLKFB=OoEc&MH28QXnUTB84$Np6>yjpXd(KIxH zU5j4m*sig#R55Hfl)h^^MxJQ7%eDdyy1-UzURsOswkgv$E0PNZ4)zybbY!$)WJW0| z6I})wY|zn(E`emflG~Bh(S}U|L$Bs)1{yYZAb~9cZQ;Bfkge7}Lpyvpn!#bbrOskVpu3scpvsh#=R;4! zu)t0Qs&^HkEcFI8%aTEGm-+fIjiUkst((sqQ9QT|MS(4=p&cD!oS+%JjgvY~ z;M5B#9nY_y((M@0aRem)pei*lM*MsjR*h*{cdt%^hBE?s(JaMhCvcK*THL%(o%DFk zc351==eu}M$61UqbENNkej4Yfo4!txEwd~$m{2|q;DW%$xWrwrRUH{zVX?g=kO)12 zWB*^k>b041A1jzLZDsp1uIR|4Ah122uvBTc>eZDw9oe`_Xce=1?JjFCVgJz35Yy&EfgO!^z{G>9 zPo9}ov#M-maJydLKO&A=RALUdR59c95D<*beGPH;UrEepJMmJ@%?VboT>||D+cSdu zX1OeVW9gXTna#IiXqE%xx~YnBTRmAcm5gIkd4W^wM(KJ*oe>{4-87q4kA6~yX2}dq z>Q7Xbl6*f1_32O_kby;xKd_a=I*=$G5%}Wia-W{qme3Q~r^`D3qJBCVwMxwP#@%%H zwx`QS6T@PBLoSs~^dyFp&wfZHvTc`h*>+0eXgV#jDfYBW-Iu$v>7I11EteS9hdVBH zPj}UK+gaHPlt`EYq1aeOt-#;Jz1it-Vs3 zlxBGd^ImCflCOu38N2M7Va=!N?Xi~Gb?|JM2~BH}=^9(?YhJsivdLa1@4C`I=a@kt zX-l8+YQ7~e*p9>=zG2#;lh3Iq4QYNrDaAI;Hp#Y~QW6g-6}UFRHanQ>Si#1DC& z{)(+XaV&vP`R(G$6kl07HuBen&p7r*eGl7iO57dW`J8<|{OX3jpwP}+oQ=RXY$qmV z@hBypJ<4mjHL-;+qcuJFiftEXcJP1a97KROn|$Nr6#Ix) z+4-6FRLGAE<_75*l)1sjFed-Nkz2WAhacmeCpi6Ras}hL^OP>Gfc=@@a4UgZxw#eG zc|bGey5NdX_~Gaql47o$U2Qdv^0qR$L7bN0z8R#wYZ1 zH&>Y`M*NMe@i&6~uxM@7zXNOj9c=RNYwC;m?Pq5_viEa5iEsGTsp1B&v87Z8zNMVN z{Yd?7&X+hR1KdTK6Z4D)dk)Dw7V=ok!$E~zxOsS}MjYRRKZi_!?f^jmEx_ggsQ`Ne P>cm~+mYIhSwF<@=8>Ux{dqmKpi`aSJC9fv?($jOu=z1R@nW zN+imEXXut_$4crrInEJd^r_b1hujZ2%s2NMVqaHkaZ>L^I7oO)e2kN(A8^h6Mw|P| znZLi@=KW|-YnMs?GSX5XR|b;S;;3GER$=6w2a=-{=zOf4sbVdg5B% zERNF^hr6ucT8`z^OQ$ERg<_^?m93Q8Wwt))Wu~33t~|7w#my>bUoWhCUJjB2O&;8Z zrsxe%XG*MW^>yDqXGaX2RYoh9D)+#u;HOXiZ!O^Y@KV`&o54&4oz33jqUdID`djv> zsTt+BWj*4$lVF-=wmMj;mZ(ODQb{y>tv`imJ6iQ24&HLJ#~RzuX#Tvz+2e1X?snWs z_Qfk1BFR+GXXio+teHhafSg0OZS1Q=ILSlWy(OsG{47?kKveXjYMvQV3ou6jC~(=-yAmn0lxH literal 0 HcmV?d00001 diff --git a/target/classes/com/coded/spring/ordering/users/UsersService.class b/target/classes/com/coded/spring/ordering/users/UsersService.class new file mode 100644 index 0000000000000000000000000000000000000000..e3edb6748af103804f9758e23742e44a92c956a5 GIT binary patch literal 5828 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 n4>3EByo4d~NFpQgI06ny!8+61@_)CBFU_uw3V{ literal 0 HcmV?d00001 diff --git a/target/test-classes/com/coded/spring/ordering/ApplicationTests.class b/target/test-classes/com/coded/spring/ordering/ApplicationTests.class new file mode 100644 index 0000000000000000000000000000000000000000..0941ff655a9b3e4f40b51ee39440a6ad73dc9cd6 GIT binary patch literal 11634 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 literal 0 HcmV?d00001