今回から詳細設計時に実装も細かく決めてメンション
subtasks
entity
Reportid: UUID: IDreport_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: 通報を登録するCreateReportRequestDtoreporterUserId: StringreportedUserId: StringreportType: Char通報種別text: String: 内容- 未入力の場合は空文字列
-
Report.createreporterUser = 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
ReportDtoid: UUID: IDreport_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 UpdateReportRequestDtoreportActionStatus: String: 確認状態reportActionType: String?: 処置内容- (
dealは取引と紛らわしいので使わない方が良い?)
- (
reportActionMessage: String?: 処置メッセージ
-
Report.createreportActionStatus = .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は kebab-case とされていることに気づいたのですが、リクエストパラメータにも適用されるのでしょうか?
大きな理由は無いので camelCase に統一しても良いかもしれませんね.
コンフリクト解消時に併せて修正いたしますが camelCase に統一するべきでしょうか?
- JPA Entity をモデルにマッピングするの筋が悪い気がしてならない
-
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>
お手すきの際にご確認お願いいたします。