背景
セール情報をまとめているサイトを運用しています。
毎日「新しいセールを追加する」ことばかり考えていて、追加したあとのことをあまり考えていませんでした。
今日たまたま中身を数えてみたら、けっこうな数の記事が残っていました…。
数えてみた
下記を実行しただけです。
const arr = require('./data/articles.json');
const T = '2026-07-23';
const expired = arr
.filter(a => !a.ended)
.filter(a => a.metrics?.deadline && a.metrics.deadline < T);
console.log(expired.length);
結果は 24 件でした。
「終了扱いになっていない記事のうち、自分で書いた終了日が今日より前のもの」が24件、という意味です。
7月13日に終わったセールが、7月23日のトップページにまだ並んでいたことになります。
気づきにくい理由
このバグ(というか漏れ)が10日以上気づかれなかったのは、たぶん見た目が壊れないからだと思います。
記事は正しく表示される。
リンクも切れていない。
日付も「7/13まで」と正直に書いてある。
読んだ人が「これもう終わってるじゃないか」と気づくだけで、システム側は何も異常を報告しない…。
直したもの
判定に外部の情報は要りませんでした。
記事自身が「7月13日まで」と書いているので、7月23日にはもう終わっている。
これは調べ物ではなく、ただの比較です。
for (const a of arr) {
if (a.ended) continue;
const d = a.metrics?.deadline;
if (d && d < T) { a.ended = true; a.endedAt = d; }
}
ended を立てると、ビルド側がトップ・カテゴリ・タグ・RSS・sitemap から外してくれる仕組みは元からありました。
記事の直URLと検索では残るので、記録としては消えません。
つまり受け皿は用意してあったのに、そこへ流し込む処理だけが無かった、ということになります。
思ったこと
deadline というフィールドを持たせた時点で、その日を過ぎたときに何が起きるかまで決めておくべきだったのだと思います。
持たせたけれど使っていない日付フィールドは、たぶんどのプロジェクトにも1つくらいあるのではないでしょうか。
期限を持つデータを作ったら、期限が来たときの処理も同じ日に書いてしまうのがよさそうです。
本記事はAI補助で執筆した、個人開発の紹介記事です。