Skip to content

レコードの移動を API・サーバースクリプトから行う ​

第1版作成 最終更新 (日本時間)
確認バージョン1.5.8.1

本体の標準機能ではありません

このページは本体を改修する場合の設計メモです。1.5.8.1 では、レコードの移動は画面(編集画面の「移動」、一覧の一括移動)からしか行えません。Web API、スクリプトの $p.api*、サーバースクリプトの items.* には移動の手段がありません。

前提にした現行の実装(1.5.8.1) ​

ソースへのリンクは Implem/Implem.Pleasanter の 1.5.8.1(コミット fdcbb3f8)固定です。

画面の移動 ​

項目内容
対象期限付きテーブル・記録テーブルのレコード。Wiki は対象外(ItemModel.Move() の既定分岐で NotFound。ItemModel.cs#L2559-L2579)
操作編集画面の単体移動(/items/{id}/Move)と、一覧の一括移動(/items/{id}/BulkMove)(ItemsController.cs#L922-L980)
移動先サイト設定の MoveTargets(移動先サイト ID の一覧)から画面で選び、フォームの MoveTargets として送る
権限移動元と移動先の両方に更新権限が要る(Permissions.CanMove。Permissions.cs#L587-L591)

ResultUtilities.Move() の流れは次のとおりです(ResultUtilities.cs#L5549-L5600)。

図を読み込み中…

OnMoving() が確かめるのは、テーブルのロック・レコードのロック・CanMove の 3 つです(ResultValidators.cs)。サーバー側では、移動先がそのサイトの MoveTargets に入っているかは確かめていません。MoveTargets の制限は、画面の選択肢で掛かっているだけです。

追加する箇所 ​

既存の Delete の API 版(DeleteByApi)とサーバースクリプト版(items.Delete)に倣います。単体移動を先に作り、一括移動は後回しにします(一括移動は一覧の選択状態からレコードを特定する処理が要るため)。

ファイル追加するもの
Libraries/Requests/Api.cs移動先サイト ID を受け取る MoveTargetId(手書きのクラスなので CodeDefiner の生成対象外)
Controllers/Api/ItemsController.cs[HttpPost("{id}/Move")] のアクション
Models/Items/ItemModel.csMoveByApi()・MoveByServerScript()(Issues・Results に振り分け、それ以外は NotFound / false)
Models/Issues/IssueUtilities.cs、Models/Results/ResultUtilities.csMoveByApi()・MoveByServerScript()
Libraries/ServerScripts/ServerScriptUtilities.csMove(context, id, destinationSiteId)(CreateContext でアクション Move の Context を作る)
Libraries/ServerScripts/ServerScriptModelApiItems.csitems.Move(id, destinationSiteId)(OnTesting のときは false)
Implem.PleasanterFrontend/.../_api.js$p.apiMove($p.apiExec($p.apiUrl(args.id, 'move'), args))

MoveByApi の処理 ​

ResultUtilities.Move() のうち、フォームから読んでいる移動先を Api.MoveTargetId に置き換え、応答を ApiResults にします。

  1. Mime.ValidateOnApi() で Content-Type を確かめる
  2. リクエストを Api として読み、MoveTargetId が 0 なら InvalidJsonData
  3. 移動先の件数上限(ItemsLimit)
  4. レコードを読み、AccessStatus が Selected でなければ NotFound
  5. OnMoving() で検証
  6. ResultModel.Move() を実行し、成功なら ApiResults.Success(メッセージは Displays.Moved)
json
{
    "ApiVersion": 1.1,
    "ApiKey": "your-api-key",
    "MoveTargetId": 67890
}
javascript
if (!items.Move(12345, 67890)) {
    context.Log('移動に失敗しました');
}

決めておくこと ​

  • 移動先の制限: 画面と同じく MoveTargets に入っているサイトだけを許すか、更新権限さえあればどこにでも移せるようにするか。現行のサーバー側処理は MoveTargets を見ていないので、API でも制限したいなら検証を足す必要があります。
  • API 用の検証: OnDeleting() は api: true のときに Validators.ValidateApi() を呼びますが(ResultValidators.cs#L792-L806)、OnMoving() にはこの引数がありません。OnMoving() に api 引数を足して同じ検証を通すのが揃った形です。
  • サーバースクリプトの再帰: items.Move の中でも移動元・移動先のサーバースクリプトが動く可能性があるので、既存の items.Update と同じく CreateContext() で作った Context に乗せ、ServerScriptDepth による深さの制限(10 段未満。ServerScriptUtilities.cs#L1189)を効かせます。

関連ページ ​

変更履歴

第1版サイト設定の変更履歴・拡張 SQL の外部 DB 接続・サイト名の解決・API ラッパー・ApiVersion の解説と、関連する改修・設計メモを追加