🏓

MicroCMSのAPIをActive Recordぽく扱えるRubyライブラリ作ってみた

2023/07/02に公開

https://github.com/kuredev/mc_record

なぜ作ったか

MicroCMS便利ですよね。自分も運営しているサイトの一つで使わせてもらっています。
https://microcms.io/

MicroCMSでは、Webダッシュボードが提供されていますが、エンジニア的にはAPIで触れた方が、データをまとめて触ったり整形したりするときには便利です。

MicroCMSでは主たる言語のSDKが公式で用意されており、自分の場合はRubyのものを使っていました。

ところが、Filterの書き方等を毎回忘れてしまい、使う度に調べる→忘れる→調べるを繰り返していて、普段触っている Active Record のように触れればなと思っていたのでした。

作ったもの概要

以下のように、1つのAPI=1つのモデルのような感じで、クラスを定義し、そのクラスの属性としてAPIのフィールドの値を扱うことができます。

require "mc_record"

# Credentials
McRecord::Base.config(
  service_domain: "[Domain Name]",
  api_key: "[API Key]",
  end_point: "[End Point]"
)

# Define a class that inherits `McRecord::Base`
class Content < McRecord::Base
end

# Examples
content = Content.find("[ID]") # => Content

# MicroCMS API fields can be read/written as attributes of defined classes.
puts content.name
content.category = ""

# Other Methods.
Content.all # => Array<Content>
Content.where(category: "[Name of Category]") # => Array<Content>

サポートしている機能

とりあえずデータ取得・検索関連の機能が欲しかったので、以下のメソッドを使えるようにしています。(ただし、後述のように実際のActive Recordの機能に比べると非常に貧弱です)

all
find
where

サポートしていない機能

実際のActive Recordは、特にActiveRecord::Relationはメソッドチェーンや遅延ロード等、非常に便利で多岐にわたる機能が提供されていますが、それらの機能は実装されていません。
上記の all メソッド等も、本来のActive Recordの返り値は ActiveRecord::Relation を継承したオブジェクトですが、現在は単純に対象のAPIのオブジェクトの配列が返るだけです。

また save のようなデータ保存系の機能はサポート出来ていません。(こちらは単純な機能ならそんなに実装が大変な類いでは無いので、必要に迫られれば実装するかもしれません)
関連してActiveModelの提供しているようなバリデーション機能もありません。

おわりに

というわけで、 Active Record ぽくと書いた割には非常に表面的な機能だけですが、とりあえずいつものインターフェースでデータを手っ取り早く手元にロードしたかったので、最低限だけ実装してみました。

今後、使いながら少しずつ機能を拡充していければと思います。

参考

https://railsguides.jp/active_record_basics.html

https://github.com/Dynamoid/dynamoid

https://blog.serverworks.co.jp/2023/06/13/124222

Discussion