Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add get and create methods #58

Open
wants to merge 3 commits into
base: bank
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions bank/.idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions bank/.idea/kotlinc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 9 additions & 4 deletions bank/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ dependencies {
kapt("io.micronaut.data:micronaut-data-document-processor")
kapt("io.micronaut.micrometer:micronaut-micrometer-annotation")
kapt("io.micronaut.openapi:micronaut-openapi")
kapt("io.micronaut.security:micronaut-security-annotations")
// kapt("io.micronaut.security:micronaut-security-annotations")
implementation("io.micronaut:micronaut-http-client")
implementation("io.micronaut:micronaut-jackson-databind")
implementation("io.micronaut:micronaut-management")
Expand All @@ -29,7 +29,7 @@ dependencies {
implementation("io.micronaut.kotlin:micronaut-kotlin-extension-functions")
implementation("io.micronaut.kotlin:micronaut-kotlin-runtime")
implementation("io.micronaut.micrometer:micronaut-micrometer-core")
implementation("io.micronaut.security:micronaut-security-jwt")
// implementation("io.micronaut.security:micronaut-security-jwt")
implementation("io.swagger.core.v3:swagger-annotations")
implementation("jakarta.annotation:jakarta.annotation-api")
implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
Expand All @@ -40,6 +40,10 @@ dependencies {

runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin")

kaptTest("io.micronaut:micronaut-inject-java")
testImplementation("io.micronaut.test:micronaut-test-kotest:3.5.0")
testImplementation("io.mockk:mockk")
testImplementation("io.kotest:kotest-runner-junit5-jvm")
}


Expand Down Expand Up @@ -72,5 +76,6 @@ micronaut {
}
}



tasks.named<Test>("test") {
useJUnitPlatform()
}
14 changes: 0 additions & 14 deletions bank/src/main/kotlin/com/example/BankController.kt

This file was deleted.

48 changes: 48 additions & 0 deletions bank/src/main/kotlin/com/example/controller/AccountController.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.example.controller

import com.example.model.AccountResponse
import com.example.model.CreateCustomerRequest
import com.example.model.CustomerResponse
import com.example.service.CustomerService
import io.micronaut.http.HttpResponse
import io.micronaut.http.annotation.*
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.responses.ApiResponses
import java.util.UUID

@Controller("/bank/customer/{customerId}/account")
class AccountController(
) {

@Get(uri = "/", produces = ["application/json"])
@ApiResponses(
ApiResponse(
description = "Display accounts for a customer",
responseCode = "200",
)
)
fun getAccounts(@PathVariable customerId: UUID): List<AccountResponse> =
TODO("Unimplemented")

@Get("/{accountId}")
fun getAccount(@PathVariable customerId: UUID, @PathVariable accountId: UUID): AccountResponse =
TODO("Unimplemented")

@Post("/")
fun createAccount(@PathVariable customerId: UUID): AccountResponse =
TODO("Unimplemented")


@Post("/{accountId}")
fun updateAccountPost(@PathVariable customerId: UUID, @PathVariable accountId: UUID): AccountResponse =
TODO("Unimplemented")

@Put("/{accountId}")
fun updateAccountPut(@PathVariable customerId: UUID, @PathVariable accountId: UUID): AccountResponse =
TODO("Unimplemented")

@Delete("/{accountId}")
fun deleteAccount(@PathVariable customerId: UUID, @PathVariable accountId: UUID): Unit =
TODO("Unimplemented")
}
28 changes: 28 additions & 0 deletions bank/src/main/kotlin/com/example/controller/BankController.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.example.controller

import com.example.model.CreateCustomerRequest
import com.example.model.CustomerResponse
import com.example.service.CustomerService
import io.micronaut.http.HttpResponse
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.http.annotation.PathVariable
import io.micronaut.http.annotation.Post
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.responses.ApiResponses
import java.util.UUID

@Controller("/bank")
class BankController() {

@Get(uri = "/", produces = ["text/plain"])
@ApiResponses(
ApiResponse(
description = "Display bank welcome message",
responseCode = "200",
)
)
fun index(): String = "Welcome to my simple banking application!"

}
81 changes: 81 additions & 0 deletions bank/src/main/kotlin/com/example/controller/CustomerController.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.example.controller

import com.example.model.CreateCustomerRequest
import com.example.model.CustomerResponse
import com.example.model.PaginatedCustomerResponse
import com.example.service.CustomerService
import io.micronaut.http.HttpResponse
import io.micronaut.http.annotation.*
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.responses.ApiResponses
import java.util.UUID

@Controller("/bank/customer")
class CustomerController(
private val customerService: CustomerService
) {

@Get(uri = "/{id}", produces = ["application/json"])
@Operation(
summary = "Get a customer",
description = "Get a customer by ID"
)
@ApiResponses(
ApiResponse(
description = "The customer corresponding to the ID",
responseCode = "200",
),
ApiResponse(
description = "Customer not found",
responseCode = "404",
),
)
// TODO: Convert Customer into Customer Response, mask SSN
// TODO: Return error as JSON
fun getCustomer(@PathVariable id: UUID) = customerService.get(id)
?: HttpResponse.notFound("Customer $id not found.")

@Post(uri = "/", produces = ["application/json"], consumes = ["application/json"])
@Operation(
summary = "Create a customer",
description = "Create a customer with basic information and no ID"
)
@ApiResponses(
ApiResponse(
description = "Successful creation of a new customer",
responseCode = "201",
),
ApiResponse(
description = "Invalid customer creation request",
responseCode = "400",
),
)
fun createCustomer(request: CreateCustomerRequest) =
customerService.create(
request.toCustomer()
).let {
HttpResponse.created(
CustomerResponse(
it
).also { response ->
println(response)
}
)
}

@Get("/")
fun searchCustomers(
@QueryValue(value = "offset", defaultValue = "0") offset: Int,
@QueryValue(value = "count", defaultValue = "10") count: Int,
): PaginatedCustomerResponse = PaginatedCustomerResponse(offset, count, customerService.getAll(offset, count).map { CustomerResponse(it) })

@Post("/{id}")
fun updateAsPost(@PathVariable id: UUID): CustomerResponse = TODO("Unimplemented")

@Put("/{id}")
fun updateAsPut(@PathVariable id: UUID): CustomerResponse = TODO("Unimplemented")

@Delete("/{id}")
fun delete(@PathVariable id: UUID): Unit = customerService.delete(id)
}
32 changes: 32 additions & 0 deletions bank/src/main/kotlin/com/example/controller/TransferController.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.example.controller

import com.example.data.TransferStatus
import com.example.model.*
import com.example.service.CustomerService
import io.micronaut.http.HttpResponse
import io.micronaut.http.annotation.*
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.responses.ApiResponses
import java.util.UUID

@Controller("/bank/transfer")
class TransferController(
) {

@Get(uri = "/", produces = ["application/json"])
fun getTransfers(@QueryValue(value = "status", defaultValue = "PENDING") status: TransferStatus): PaginatedTransferResponse =
TODO("Unimplemented")

@Post(uri = "/", produces = ["application/json"])
fun createTransfer(request: CreateTransferRequest): TransferResponse =
TODO("Unimplemented")

@Post(uri = "/{transferId}", produces = ["application/json"])
fun updateTransfer(@PathVariable transferId: UUID, request: UpdateTransferRequest): TransferResponse =
TODO("Unimplemented")

@Get(uri = "/{transferId}", produces = ["application/json"])
fun getTransfer(@PathVariable transferId: UUID): TransferResponse =
TODO("Unimplemented")
}
11 changes: 11 additions & 0 deletions bank/src/main/kotlin/com/example/data/Customer.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.example.data

import java.util.UUID

data class Customer(
val customerId: UUID,
val firstName: String,
val middleName: String?,
val lastName: String,
val socialSecurityNumber: String,
)
7 changes: 7 additions & 0 deletions bank/src/main/kotlin/com/example/data/TransferStatus.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.example.data

enum class TransferStatus {
PENDING,
COMPLETE,
REJECTED,
}
8 changes: 8 additions & 0 deletions bank/src/main/kotlin/com/example/model/AccountResponse.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.example.model

import java.util.UUID

class AccountResponse(
val id: UUID,
val balance: Int = 0,
)
19 changes: 19 additions & 0 deletions bank/src/main/kotlin/com/example/model/CreateCustomerRequest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.example.model

import com.example.data.Customer
import java.util.UUID

data class CreateCustomerRequest(
val firstName: String,
val middleName: String?,
val lastName: String,
val socialSecurityNumber: String,
) {
fun toCustomer(): Customer = Customer(
UUID.randomUUID(),
firstName,
middleName,
lastName,
socialSecurityNumber
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.example.model

import java.util.UUID

data class CreateTransferRequest(
val toAccount: UUID,
val fromAccount: UUID,
val amount: Int,
)
25 changes: 25 additions & 0 deletions bank/src/main/kotlin/com/example/model/CustomerResponse.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.example.model

import com.example.data.Customer
import java.util.UUID

data class CustomerResponse(
val customerId: UUID?,
val uri: String,
val firstName: String,
val middleName: String?,
val lastName: String,
val socialSecurityNumber: String, // TODO: may need to be masked in response
) {
constructor(customer: Customer) : this(
customerId = customer.customerId,
uri = "/customer/${customer.customerId}",
firstName = customer.firstName,
middleName = customer.middleName,
lastName = customer.lastName,
socialSecurityNumber = customer.socialSecurityNumber.let {
it.substring(it.length - 4, it.length)
.padStart(8, 'X')
}
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.example.model

class PaginatedCustomerResponse(
val offset: Int,
val count: Int,
val customers: List<CustomerResponse>,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.example.model

data class PaginatedTransferResponse(
val offset: Int,
val count: Int,
val transfers: List<TransferResponse>,
)
12 changes: 12 additions & 0 deletions bank/src/main/kotlin/com/example/model/TransferResponse.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.example.model

import com.example.data.TransferStatus
import java.util.UUID

data class TransferResponse(
val id: UUID,
val sourceAccount: UUID,
val destinationAccount: UUID,
val amount: UUID,
val status: TransferStatus,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.example.model

import com.example.data.TransferStatus
import java.util.UUID

data class UpdateTransferRequest(
val id: UUID,
val status: TransferStatus,
)
Loading