Skip to content

すでに締め切られている注文に対して、何度も締め切り操作ができてしまう #147

@yucao24hours

Description

@yucao24hours

https://idobata.io/ja/archives/organization/esm/room/bento-user/2017-05-26#message_22209863

発生した事象

ブラウザで管理画面を開いたまま PC をスリーブさせ、数日後またその PC を起動してブラウザを開いたところ、管理画面が表示されていた(日をまたいでいるので表示されている日付は相対的に過去のもの)ので 締め切る ボタンを押した。
すると画面に表示されている日付で「正常に締め切りがされた」挙動になった。(エラーメッセージも出ずに idobata に成立メッセージが投稿された)

期待する挙動

  • ユーザとして、すでに締め切られている注文に対しては何度も成立通知メッセージが来てほしくない。なぜなら、どのメッセージが正常なのか判断がつかずに混乱するからだ。
  • 管理者として、すでに締め切られている注文を締め切ろうとしたら、すでに操作済みであることを知らせてほしい。なぜなら、もう既に締め切りをしてあることが明確にわかるので、安心できるからだ。

考えたこと

今回はふたつの要因が混ざっているため、分けて考えます。

1. すでに締め切られている注文に対して締め切り操作をした

今のコードを見ると、締め切り処理前に「既に締め切られているか」の確認はしておらず、どんな場合でも update! するようになっています。
ここでその確認をしないために今回のような二重更新処理が行われてしまっています。

2. 画面に表示されている(その画面で対象としている)日付と現在日時が異なる状態で締め切り操作をした

基本的には 1. であげた確認をすれば今回と同様のことは起こらなくなると思います。
ただ、この bento の運用フローから考えると、「クライアント側から締め切り処理時に送信される日付とサーバの現在日付が違う」という状態はないはず、という前提を挙げることができます。
(なぜなら営業日は毎日必ず成立・非成立を人力で判断するという要件だから)

そう考えると、「クライアント側から締め切り処理時に送信される日付とサーバの現在日付が違う」という場合には「あなたなにかイレギュラーなことしようとしてますよ」とエラーを出す(たとえ、送信されてきた日付の注文が何らかの理由で締め切り処理をされていなかったとしても)というふうにも作れると思います。

ただし今回起きた事象は、日付をまたがず同日内に、開きっぱなしの別ブラウザから 2 度目の 締め切る をしても起きうることなので、1 の対応を取ることがベターだと思っています。

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions