今回から詳細設計時に実装も細かく決めてメンション

subtasks

entity

  • Report
    • id: UUID: ID
    • report_type: ReportType: 通報種別('1'..'7')
      • Sexual('1'): 性的、わいせつな表現
      • Violence('2'): 反社会的、暴力的である
      • Invitation('3'): 出会い目的、勧誘
      • Harassment('4'): 迷惑行為
      • Spam('5'): スパムや詐欺
      • Privacy('6'): プライバシーに関する内容を含む
      • Other('7'): その他
    • reporter_user_id: UserEntity? 通報ユーザー
    • reported_user_id: UserEntity?: 被通報ユーザー
    • text: String?: 内容
    • report_action_status: ReportActionStatus?: 確認状態(’1’..‘3’`)
      • New('1') 未対応
      • InProgress('2'): 対応中
      • Completed('3'): 完了
    • report_action_type: ReportActionType?: 処置内容('1'..'4')
      • Ignored('1'): 対応なし
      • UserAlerted('2'): 警告送信
      • UserIconInitialized('3'): アイコン初期化
      • UserRestricted('4'): ユーザー制限
    • report_action_message: String?: 処置メッセージ
    • created_at: Timestamp: 作成日
    • updated_at: Timestamp: 更新日

API

  • POST /report: 通報を登録する

    • CreateReportRequestDto
      • reporterUserId: String
      • reportedUserId: String
      • reportType: Char 通報種別
      • text: String: 内容
        • 未入力の場合は空文字列
  • Report.create

    • reporterUser = find(req.reporterUserId)?
    • reportedUser = find(req.reported_user_id)?
    • reportActionStatus = .New
  • reportRepo.save()

  • return ReportDto

{
  "reporterUserId": "d3420d95-c2c0-411f-acd3-2aeaba425b84",
  "reportedUserId": "fb096483-c26e-4a0c-b201-d1f22f6ebb3c",
  "reportType": "1",
  "text": "報告します。"
}
1. reports テーブルにデータを登録する
2. レスポンスを返却する

管理API

  • ReportDto
    • id: UUID: ID
    • report_type: ReportType: 通報種別('1'..'7')
    • reporter_user_id: UserEntity? 通報ユーザー
    • reported_user_id: UserEntity?: 被通報ユーザー
    • text: String?: 内容
    • report_action_status: ReportActionStatus: 確認状態('1'..'3')
    • report_action_type: ReportActionType: 処置内容('1'..'4')
    • report_action_message: String?: 処置メッセージ
    • created_at: Timestamp: 作成日
    • updated_at: Timestamp: 更新日
{
  "id": "d3420d95-c2c0-411f-acd3-2aeaba425b84",
  "reportType": "1",
  "reporterUserId": "d3420d95-c2c0-411f-acd3-2aeaba425b84",
  "reportedUserId": "fb096483-c26e-4a0c-b201-d1f22f6ebb3c",
  "text": "報告します。",
  "reportActionStatus": "1",
  "reportActionType": null,
  "reportActionMessage": null,
  "createdAt": "2022/01/01 0:00:00",
  "updatedAt": "2022/01/01 0:00:00"
}
  • GET /management/report/list: 通報情報一覧を取得する
    • return ReportDto[]
[
  {
    "id": "d3420d95-c2c0-411f-acd3-2aeaba425b84",
    "reportType": "1",
    "reporterUserId": "d3420d95-c2c0-411f-acd3-2aeaba425b84",
    "reportedUserId": "fb096483-c26e-4a0c-b201-d1f22f6ebb3c",
    "text": "報告します。",
    "reportActionStatus": "1",
    "reportActionType": null,
    "reportActionMessage": null,
    "createdAt": "2022/01/01 0:00:00",
    "updatedAt": "2022/01/01 0:00:00"
  },
  ...
]
1. reportsテーブルから全件取得する
2. データを返却する
  • GET /management/report/{id} 通報を取得する
    • return ReportDto
1. reportsテーブルからレコードを取得する
  reportsテーブル.ID     =     クエリパラメータ.id
2. データを返却する
  • PUT /management/report/{id} 通報を更新する

    • return UpdateReportRequestDto
      • reportActionStatus: String: 確認状態
      • reportActionType: String?: 処置内容
        • (deal は取引と紛らわしいので使わない方が良い?)
      • reportActionMessage: String?: 処置メッセージ
  • Report.create

    • reportActionStatus = .
    • reportActionType = .
    • reportActionMessage = .
  • reortRepo.save()

  • return ReportDto

{
  "reportActionStatus": "1",
  "reportActionType": null,
  "reportActionMessage": null
}
1. reports テーブルのレコードを取得する
  reportsテーブル.ID = クエリパラメータ.id
2. リクエストボディの値でレコードを更新
3. レスポンスを返却する

確認

  • Q: 通報ユーザー, 被通報ユーザーが削除された時, 通報は一緒に削除されるのか

  • A: 残したいので削除しない

  • Q: 処置内容は列挙型だと思われるがどのような種別があるか

    • 「対応なし」「警告送信」「アイコン初期化」「利用制限」
      • 管理画面デザイン案に書いてある
      • 「警告送信」の時だけメッセージが見えるように
      • 「ユーザー制限」は受発注が新規で出来なくなるだけで閲覧は可能
        • 今はログイン時に例外出していた気がする
    • Q: 例えば, アカウントBANの場合ユーザーに制限を行うか
      • A: 行わない, 管理画面で利用停止 -> 通報管理画面で完了(処置内容と処置メッセージ登録)にする想定なので通報テーブルのみ更新
  • Q: 確認状態は

    • A: 「未確認」「対応中」「確認済み」でよい
  • 林さんに見てもらう

- DB定義書: 通報テーブル(`reports`)
- API仕様書
  - `POST /report`: 通報登録API
- 管理API仕様書
  - `GET /management/report/list`: 通報一覧取得API
  - `GET /management/report/id={id}`: 通報取得API
  - `PUT /management/report/id={id}`: 通報更新API

の詳細設計を行いました. お手すきの際にご確認お願いいたします.
  • リクエストパラメータを sname_case にしないといけない理由

リクエストパラメータに snake_case が一般的に使われていて、かつアクセストークン更新API(?refresh_token) で snake_case だったので統一しました.

コーディング規約#URI

URIの単語はすべて小文字とし、キャメルケースは使用しない
単語間は「-」でつなぐ(ケバブケース)

コーディング規約の方を見たらURIは kebab-case とされていることに気づいたのですが、リクエストパラメータにも適用されるのでしょうか?

大きな理由は無いので camelCase に統一しても良いかもしれませんね.
コンフリクト解消時に併せて修正いたしますが camelCase に統一するべきでしょうか?

2022-10-21

2022-10-24

  • createReport: api, service テスト実装
  • REST CLIENT実装
  • PR作成
## 変更内容
通報関連のAPIを実装いたしました。
通報登録APIに関してはService層とAPI層の正常系のテストを書きました。

- DB: 通報テーブル(`reports`)
- 新規API
  - `POST /report`: 通報登録API
- 新規管理API
  - `GET /management/report/list`: 通報一覧取得
  - `GET /management/report/id={id}`: 通報取得
  - `PUT /management/report/id={id}`: 通報更新

## 検討事項
各種リソースが存在しない時の例外として `XXXNotFoundException` を送出したいのですが対応するエラーコードが無いので `throw Exception()` で妥協している所が多く見受けられます. APIとして404 Not Foundを返すためにも一度エラーコードと例外クラスを網羅させる機会があってもいいのではないかと思いました.

<summry>動作確認</summry>
<details>

```
@api_root = http://localhost:8081/api

###
# 通報を登録

@reporter_user_id = e7d016a0-be7b-4f64-b554-a79374b2363b
@reported_user_id = f62c748a-cd9d-4538-9b4e-75d69c422057

POST {{api_root}}/report
Content-Type: application/json

{
  "reporterUserId": "{{reporter_user_id}}",
  "reportedUserId": "{{reported_user_id}}",
  "reportType": "1",
  "text": "test"
}

###
# 通報一覧取得
# @name get_reports
GET {{api_root}}/management/report/list

# Response 200
# [
#   {
#     "id": "fe193ad2-2adc-4bf3-a11c-05a5b221f7c2",
#     "reportType": "1",
#     "reporterUserId": "e7d016a0-be7b-4f64-b554-a79374b2363b",
#     "reportedUserId": "f62c748a-cd9d-4538-9b4e-75d69c422057",
#     "text": "test",
#     "reportActionStatus": "1",
#     "reportActionMessage": null,
#     "createdAt": "2022/10/24 16:58:57",
#     "updatedAt": "2022/10/24 16:58:57"
#   }
# ]

###
@id = {{get_reports.response.body.0.id}}

# Response 200
#   {
#     "id": "fe193ad2-2adc-4bf3-a11c-05a5b221f7c2",
#     "reportType": "1",
#     "reporterUserId": "e7d016a0-be7b-4f64-b554-a79374b2363b",
#     "reportedUserId": "f62c748a-cd9d-4538-9b4e-75d69c422057",
#     "text": "test",
#     "reportActionStatus": "1",
#     "reportActionMessage": null,
#     "createdAt": "2022/10/24 16:58:57",
#     "updatedAt": "2022/10/24 16:58:57"
#   }

###
# 通報取得
GET {{api_root}}/management/report?id={{id}}

###
# 通報更新
PUT {{api_root}}/management/report?id={{id}}
Content-Type: application/json

{
  "reportActionStatus": "3",
  "reportActionType": "2",
  "reportActionMessage": "対応済み"
}

# Response
# {
#   "id": "fe193ad2-2adc-4bf3-a11c-05a5b221f7c2",
#   "reportType": "1",
#   "reporterUserId": "e7d016a0-be7b-4f64-b554-a79374b2363b",
#   "reportedUserId": "f62c748a-cd9d-4538-9b4e-75d69c422057",
#   "text": "test",
#   "reportActionStatus": "3",
#   "reportActionMessage": "対応済み",
#   "createdAt": "2022/10/24 16:58:57",
#   "updatedAt": "2022/10/24 16:58:57"
# }

# DB
# codedbuser@127:codedb> select * from reports
# -[ RECORD 1 ]-------------------------
# id                    | fe193ad2-2adc-4bf3-a11c-05a5b221f7c2
# created_at            | 2022-10-24 16:58:57.548
# report_action_message | 対応済み
# report_action_status  | 3
# report_action_type    | 2
# report_type           | 1
# text                  | test
# updated_at            | 2022-10-24 17:13:58.717
# reported_user_id      | f62c748a-cd9d-4538-9b4e-75d69c422057
# reporter_user_id      | e7d016a0-be7b-4f64-b554-a79374b2363b
# SELECT 1
```

</details>

お手すきの際にご確認お願いいたします。