bytepack code reading
bytepackってなに?
Bytepack helps you package and
deliver software products to
developers and enterprises.
パッケージやライブラリを売買するPhoenix アプリケーション
使用ライブラリ
eqrcode QRCodeのライブラリ
sentry バグ通知
cmark markdown(commonMark)のパーサー
bcrypt_elixir Elixir wrapper for the Bcrypt password hashing function.
Finch HTTP Client
Goth Google + Auth = Goth
NimbleTOTP Two-factor authentication (2FA)
Swoosh Mailer
hex_core hexパッケージをいろいろする
libcluster サーバークラスタリング
bypass railsのvrcのようなもの テストで他のサーバーレスポンスを必要とする時に使う
mox テストモック
mix phx.gen.auth Accounts User users --binary-id
mix ecto.gen.migration add_is_staff_to_users
swoosh設定
config/dev.exs
config :bytepacked, Bytepacked.Mailer, adapter: Swoosh.Adapters.Local
config/test.exs
config :bytepacked, Bytepacked.Mailer, adapter: Swoosh.Adapters.Test
config/prod.exs
config :bytepacked, Bytepacked.Mailer,
adapter: Swoosh.Adapters.Sendgrid,
api_key: "your api ky"
lib/bytepacked/accounts/user_notifier.ex
defmodule Bytepacked.Accounts.UserNotifier do
import Swoosh.Email
alias Bytepacked.Mailer
defp deliver(to, body) do
case new()
|> to({to, to})
|> from({"Bytepacked Support", "noreply@bytepacked.com"})
|> subject("Bytepacked Support")
|> text_body(body)
|> Mailer.deliver
do
{:ok, _} ->
{:ok, %{to: to, body: body}}
:error ->
:error
end
end
lib/bytepacked/mailer.ex
defmodule Bytepacked.Mailer do
use Swoosh.Mailer, otp_app: :bytepacked
end
以下のパスを追加すると /mailboxでswooshが送信したメールを見ることができます
lib/bytepacked_web/router.ex
if Mix.env() in [:dev, :test] do
import Phoenix.LiveDashboard.Router
scope "/" do
pipe_through :browser
live_dashboard "/dashboard", metrics: BytepackedWeb.Telemetry
forward "/mailbox", Plug.Swoosh.MailboxPreview # add this
end
end
helperを作って全体から読み込む(Bytepacked. なしで呼び出せる)
mount helper
assign_defaults -> mount時に最初に実行したいものをまとめている
1 assign_current_user
-> sessionにはtokenしか無いため毎回 userを取得する必要があるので、予め取得してsocketに入れておく
2 ensure_access(acl)
-> confirmed_atがnilの場合に特定の場所にアクセスした場合にエラーを出してダッシュボードにredirectする
lib/bytepacked_web/live/mount_helpers.ex
defmodule BytepackedWeb.MountHelpers do
import Phoenix.LiveView
alias Bytepacked.Accounts
alias BytepackedWeb.Router.Helpers, as: Routes
@doc """
Assign default values on the socket.
"""
def assign_defaults(socket, _params, session, acl) do
socket
|> assign_current_user(session)
|> ensure_access(acl)
end
defp assign_current_user(socket, session) do
assign_new(socket, :current_user, fn ->
Accounts.get_user_by_session_token(session["user_token"])
end)
end
defp ensure_access(socket, [:user, _] = acl) do
assign(socket, :acl, acl)
end
defp ensure_access(socket, acl) do
cond do
is_nil(socket.assigns.current_user.confirmed_at) ->
socket
|> put_flash(:error, "You need to confirm your account to access this page")
|> push_redirect(to: Routes.dashboard_index_path(socket, :index))
true ->
assign(socket, :acl, acl)
end
end
end
通常はBytepackedWeb.MountHelpersで呼び出す必要があるので、
live_viewとlive_componentでaliasを設定して MountHelpersで呼び出せるようにする
lib/bytepacked_web.ex
def live_view do
quote do
use Phoenix.LiveView,
layout: {BytepackedWeb.LayoutView, "live.html"}
alias BytepackedWeb.MountHelpers # add this
unquote(view_helpers())
end
end
def live_component do
quote do
use Phoenix.LiveComponent
alias BytepackedWeb.MountHelpers # add this
unquote(view_helpers())
end
end
mix ecto.gen.migration create_audit_logs
監査ログの追加
ログを取る対象を ecto_multiにしたあと AuditLog.multiの第一引数に入れて入れ子のEcto Multiにした後 Repo.transactionを実行している