Craft CMS のプレビューターゲットで Cloudflare Workers KV のデータを削除する

先日の続きで Cloudflare Workers。

KV にデータ保存しておけばパフォーマンス的にはいいんだろうけど、削除、更新が必要になる。
引き続き

Cloudflare WorkersでちゃんとしたWebを作る - ゆーすけべー日記
https://yusukebe.com/posts/202...

を読ませてもらって用意する。

どのタイミングで削除するかは場合によるんだろうけど。
全削除かエントリ更新時に、トップとタグアーカイブ、月別アーカイブのキャッシュを purge する方向で考えてみる。

purge用のルート app/routes/purge.jsx を用意する。

コードとしてはこんな感じにしてみた。

export async function loader({ request }) {
  const url = new URL(request.url);
  const hoge = url.searchParams.get("hoge")
  if(!hoge){
    return hoge;
  }
  if(hoge == "all"){
    const list = await MY_KV.list({ prefix: KV_PREFIX })
    for (const key of list.keys) {
      await MY_KV.delete(key.name)
    }
    return "キャッシュを全てクリア";
  }
  if(hoge){
    await MY_KV.delete(`v1:api_cache:entry:/${hoge}`)
    await MY_KV.delete(`v1:api_cache:entry:/`)
    let res = await fetch(END_POINT, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': API_TOKEN,
      },
      body: JSON.stringify({
        query: `
        query($uri: [String]) {
          entry(siteId:1,uri:$uri){
            postDate @formatDateTime(format: "Y/n")
            ... on article_article_Entry {
              contentTag{
                title
              }
            }
          }
        }`,
        variables: {
          "uri": hoge,
        },
      })
    })
    const json = await res.json()
    await MY_KV.delete(`v1:api_cache:list:/archive/${json.data.entry.postDate}`)
    const tags = await json.data.entry.contentTag
    for (const key of tags) {
      await MY_KV.delete(`v1:api_cache:list:/tag/${encodeURI(key.title)}`)
    }
    return await `${hoge} のキャッシュをクリア`;
  }
}

purge用のURLに all のパラメータ渡してきたら全削除。
詳細ページの場合はそのURIつけつつ、詳細ページと関連しそうなトップページ、一覧系を削除。

自動で色々やれればいいんだろうけど、CMS の管理画面から消す方法として、 Craft CMS のプレビューを使うようにしてみる。

ライブプレビュー(プレビュー)のURLとして、上記 purge のURLを追加して

20220514 1525

こんな感じで選択できるようにしたうえで、キャッシュを消せるようにする

とりあえずは動いてそう、、、な気がする。
もう少し色々調整してみて、問題無ければサイトは Cloudflare Workers ベースでの表示にしてもいい気はするが。

Cache warm 的なのも考えてもいいのかもなぁ。。。

色々ドメイン関係丸っと移さないとだったような気がするのが若干面倒かもしれない。