Skip to content

Category の CRUD API を追加 - #123

Closed
oda-takuya-0123 wants to merge 2 commits into
bizgem-Inc:mainfrom
oda-takuya-0123:feature/category-crud-api
Closed

Category の CRUD API を追加#123
oda-takuya-0123 wants to merge 2 commits into
bizgem-Inc:mainfrom
oda-takuya-0123:feature/category-crud-api

Conversation

@oda-takuya-0123

@oda-takuya-0123 oda-takuya-0123 commented Aug 20, 2026

Copy link
Copy Markdown

概要

Category モデルの CRUD API を実装し、あわせて API のテストを追加しました。

エンドポイント

メソッド パス 動作 成功時
GET /api/categories/ 一覧取得 200
POST /api/categories/ 作成 201
GET /api/categories/{id}/ 取得 200
PUT /api/categories/{id}/ 更新 200
PATCH /api/categories/{id}/ 部分更新 200
DELETE /api/categories/{id}/ 削除 204

認証は不要との指示のため、パーミッション設定は行っていません。

対応内容

validate() で追加した整合性チェックは2点です

  1. 自分自身を親カテゴリに指定できない — 現状は素通りしてしまうため
  2. 異なる企業のカテゴリを親カテゴリに指定できない — 企業ごとに一意制約が張られたマルチテナント設計であるため、企業を跨いだ親子関係は不整合と判断しました

一覧の並び順を (company, name) にしています

Category.Metaindexes および UniqueConstraint がいずれも (company, name) であるため、インデックスに沿った並び順であり、かつ一意制約により順序が一意に定まります。

api/views/__init__.py を追加しています

models / serializers / tests の各ディレクトリには __init__.py が存在する一方、views にのみ存在しませんでした。既存の構成に合わせるための追加です。

テスト

正常系

  • 一覧取得・取得・作成・更新(PUT)・部分更新(PATCH)・削除がそれぞれ期待どおりのステータスと内容を返すこと
  • 親カテゴリを指定せずに作成できること
  • 作成時に読み取り専用フィールド(id)が書き込みで無視されること
  • 親カテゴリを削除しても子カテゴリは残り、parent_category が null になること(on_delete=SET_NULL の担保)
  • 別企業であれば同名のカテゴリを作成できること
  • 名前を変更しない更新が通ること(一意制約が自分自身を重複と誤判定しないこと)

異常系

  • 存在しない ID での取得・削除が 404 になること
  • 企業が未指定、または存在しない企業を指定した場合に 400 になること
  • 名前が未指定・空白のみ・255 文字超の場合に 400 になること
  • 同一企業内で名前が重複する場合に 400 になること(作成時・更新時)
  • 自分自身を親カテゴリに指定した場合に 400 になること(PUT・PATCH)
  • 別企業のカテゴリを親カテゴリに指定した場合に 400 になること(作成・PATCH)
  • PATCH で企業のみを変更し、既存の親カテゴリが別企業になる場合に 400 になること

今回スコープ外とした事項

  • カテゴリの企業を変更した際に、そのカテゴリを親として参照している子カテゴリとの整合性が検証されない点
    • 企業一致の検証は「更新対象のレコードから、その親カテゴリを見る」方向のみで行っており、そのレコードを親として参照している子カテゴリ側は参照していません。
    • そのため、親カテゴリの企業を変更すると、子カテゴリが別企業の親を参照する状態が生じ得ます。根本的に塞ぐには company を作成後は変更不可とするのが有効ですが、更新可能なフィールドの範囲は仕様確認が必要と判断し、本 PR では対応していません。

oda-takuya-0123 and others added 2 commits August 19, 2026 11:50
DRF の ModelViewSet で Category の一覧・取得・作成・更新・削除を実装。
serializer に企業単位の一意制約と親カテゴリの整合性検証を追加した。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
api アプリにマイグレーションが存在せず、migrate では
categories / companies テーブルが作成されない状態だったため、
既存のモデル定義から初期マイグレーションを生成した。
モデルの定義自体は変更していない。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants