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