Open10
【Elixir】DashbitのプロダクトコードがOSSとして公開されたのでコードリーディングしてみる
joseさんがtwitterでアナウンス。
- dashbit社はOSSに集中していくためにBytepackというプロダクトの開発を止めるよ
- そのBytepackというプロダクトのコードをOSSとして公開するよ
的なことが書いてありそう。
リポジトリはここ
ぱっと見面白そうなところ
- umbrella projectで作られている
- あまり使ったことのないlibraryが使ってある
- LiveViewガッツリ利用してる
- 問い合わせフォームとか管理画面dashboardとかある
- ディレクトリ構成
- https://github.com/dashbitco/bytepack_archive/blob/main/apps/bytepack/lib/bytepack/extensions/ecto/validations.ex とか
-
Extensions
というnamespaceを用意して依存モジュールに足りてない部分を足していっている
HTTP clientの話はこの記事が学べそう感
stripeを使った課金機能もあるのかな。実践的。
mix cmd
なんてコマンドがあるのね。root directoryで mix setup
てやると子applicationの全部でmix setup
を実行する感じだ。
EctoのSchemaを定義してるファイルにクエリを作る関数を書いて、それをcontextから読んでたりしてる。そんな書き方もアリなのね。
contextでのinsert/update系の関数の第1引数にaudit_context
ってのが渡してあって、監査ログを都度insertするようにしてる。
plugを介してconnにログインユーザーとかipの情報をassignしといて、actionのなかで引っ張り出してるな。
へぇーこんなforの書き方が。ネストしてるのを一発でreduceできるのは良き
for {package_id, deps} <- package_id_to_deps,
%{repository: nil, package: dep_name} <- deps,
reduce: %{} do
acc ->
dep_id = Map.fetch!(names_to_ids, dep_name)
Map.update(acc, package_id, MapSet.new([dep_id]), &MapSet.put(&1, dep_id))
end
Recordなるモジュールがあるのか。初見。Erlangにあるデータ構造みたい。