スクコマ@ ScrollPanelSpec

カラム

name和名typedefaultnulllimitnote
scroll_idスクロールinteger FALSE スクロールid
panel_idコマinteger FALSE コマid
tNo.integer FALSE ソート順
created_at作成datetime
updated_at更新datetime

作成手順

スクロールの台紙にコマを貼り付けていくイメージのモデル。

スクロールから「このスクロールにコマを追加」するか、コマから「このコマをスクロールに追加」する。

作成条件として、スクロールへの編集権限とコマの表示権限を合わせを持つこと。スクコマはスクロールの補助的モデルなので、権限は基本的にはスクロールに従う。スクロールが非公開であればスクコマは見えず、スクロールのオーナーでなければスクコマ追加もできない。コマは他人のコマでもスクコマに利用できるが、公開されているコマに限る。

検証

カラム別

scroll_id

  • nullでないこと。
  • 数値であること
  • 存在するスクロールであること。
  • 重複の禁止。
    • scroll_idとtでユニークであること。

panel_id

  • nullでないこと。
  • 数値であること
  • 存在するコマであること。

t

  • nullでないこと。
  • 数値であること
  • 0以上の整数であること。

author_id

  • nullでないこと。
  • 数値であること
  • 存在する作家であること。

全体

デフォルト値補充

supply_default()

パラメータ

解説

  • tをnilにする。
    • dbのデフォルト値が0だから明示的にnilにしないと追加ができない。

上書き補充

overwrite(au)

パラメータ

  • au:作家データ

解説

ログイン中の作家idを補充する。

  • パラメータがnilならFalseを返す。
  • 作者idをセットする。

プレイリスト取得

play_list(comic, author, offset = 0, limit = Story.default_panel_size)

パラメータ

  • comic:スクロールデータ
  • author:作家データ
  • offset:何コマ目か
  • limit:取得するコマ数

解説

コマの公開フラグに注意。一度スクコマに利用されたコマを後から非公開にされてしまうこともある。この場合、スクコマとして存在するが、コマは表示しないという半端な具合になる。そのため戻り値は関連モデルでコマを含んでいるので、受け側は非公開コマの扱いに注意すること。

  • スクコマをt順に取得する。
  • 関連データとして一覧取得オプションで定義されたモデルを含む。
  • スクロールとコマが公開されたストーリーを取得する。
  • オフセット処理に対応し、オフセット値からコマ数ぶんを取得することができる。

単体取得オプション

下記の関連テーブルを含む

  • author
  • comic
    • author
  • panel
    • author
    • panel_pictures
      • picture
        • artist
        • license
    • speech_balloons
      • balloons
      • speeches

json単体出力オプション

スクコマのjson出力に吸収されている。

権限チェック

allow?

戻り

真偽またはnil

解説

  • スクロール・コマともに許可ならTrueを返す。
    • スクロールは自作スクロールであれば許可
    • コマは利用可能(自分のものか公開されたもの)であれば許可

スクロールまたはコマが指定されていなかった場合、許可でも拒否でもなく、入力ミスをユーザに返す。ここで拒否にしてしまうとユーザには権限エラーが返ってしまいミスの原因をわかりにくくしてしまう。

作成・更新

store old_t = nil

パラメータ

  • old_t:書き換え前のt

解説

  • 権限チェックする。
  • ここから先はトランザクションを張る。
  • 順序入れ替えで挿入スペースを作る。
  • 自身を保存してスペースを埋める。
  • tチェックでスクコマの順序が破綻していないかチェックする。
  • Trueを返す。
  • 例外ケース
    • 権限チェックに失敗したらForbidden例外を発生する。
    • 自身の保存に失敗したなら、ロールバックしてFalseを返す。
    • tチェックに失敗したなら、エラーメッセージをセットして、ロールバックしてFalseを返す。