#4 [SpringBoot/KotlinでBFF]Frontend向けのモデル追加

FrontendにGETの結果として返すデータとして使用する以下のようなフィールドを持ったモデルを追加する。
エンドポイントにidを指定してタスク情報を返す想定のAPIのデータ管理クラス。POSTやPUTなどでも使用する。

  • id:String タスクの一意なID
  • title : String タスクのタイトル
  • description: String タスクの詳細説明
  • userName: String タスクの担当者

package

このモデルはfrontend向けのモデルで、外部APIで使用するモデルは別途packageを分けて作る方が良いかと思のでmodel.forfrontendとして作成する。frontend向けのモデルと外部APIのモデルはフィールドが全く同じでなければ、基本的には別のクラスとして扱う方が将来的に拡張する場合のことを考えても良いと思っている。

モデルクラス

タスクを管理するクラスとしてTaskクラスをmodel.forfrontend下に追加。この段階ではデータを保持するだけのクラスなのでdataをつけておく。

package com.example.bffsample.model.forfrontend

data class Task (
    val taskId: Int,
    val title: String,
    val description: String,
    val userName: String
)

コントローラークラス

ひとまずコントローラー層に追加したTaskクラスのオブジェクトを作ってGET APIのレスポンスとして返す。

@RestController
@RequestMapping("/tasks")
class TasksController {

    @GetMapping("/{taskId}")
    @ResponseBody
    @ResponseStatus(HttpStatus.OK)
    fun getItem(@PathVariable("taskId") taskId: Int): Task {
        return Task(
                taskId = taskId,
                title = "タスクのタイトル",
                description = "タスクの詳細説明",
                userName = "タスク担当者A")
    }
}

UnitTest

コントローラーを変更したので、UnitTestも変更する。これくらいのJSONデータであれば各フィールドをチェックすれば良いかと思う。

@WebMvcTest
@DisplayName("TasksController")
internal class TasksControllerTest {
    @Autowired
    lateinit var mockMvc: MockMvc

    @Nested
    @DisplayName("getTask")
    inner class GetTask {

        @DisplayName("should return task data when get task api is called with task id.")
        @Test
        fun getTask() {
            mockMvc.perform(get("/tasks/12345"))
                    .andExpect(status().isOk)
                    .andExpect(jsonPath("taskId").value(12345))
                    .andExpect(jsonPath("title").value("タスクのタイトル"))
                    .andExpect(jsonPath("description").value("タスクの詳細説明"))
                    .andExpect(jsonPath("userName").value("タスク担当者A"))
                    }
    }
}

サービス起動時の結果

http://localhost:8080/items/12345

{"taskId":12345,"title":"タスクのタイトル","description":"タスクの詳細説明","userName":"タスク担当者A"}

コード

https://github.com/little-engineer/bff-sample/pull/6/files

コメントを残す

メールアドレスが公開されることはありません。

ABOUT US
little
15年以上プログラマーをしているエンジニアです。Kotlin, Java, Python, C++を使用したServerSideの開発に携わってきました。とりあえずやってみるスタイルで記事を更新していきます。