Help us understand the problem. What is going on with this article?

Webサービスバックエンドライブラリー Materia

Materia とは

弊社カラビナテクノロジーで開発中のElixir/Phoenix製サービスバックエンドライブラリーです。

私の所属チームでは複数のお客様のWebシステム構築をElixir/Phoenixを使って行っており、
Webサービス構築において共通する要件(ユーザー認証/権限管理/トランザクション制御)などをより効率的に実装したいという想いから開発をはじめました。

SPA(Single Page Application)での開発を想定したバックエンドAPIを提供します。

ElixirにはPhoenixという優れたWebフレームワークがありますが、
サービスとして公開するためにはPhoenix上で様々なライブラリーを駆使して実装が必要な要件があります。
そういった一般的に必要な機能(というか弊社で必要だった機能)をモデル&エンドポイント(API)レベルで汎用化したものとなります。

Mateiaを導入することで、サービスとして特色のないユーザー管理や認証といった部分のバックエンド機能を個別開発せずに、本来実装したいサービスの特色となる機能の開発に注力することができます。

現在Docの整備などOSSとして正式に公開する為の準備を進めております。

Materia
|> Materiaを導入してログイン認証してみる
|> Materia.Grantsを使って実行権限チェックを行う

構成

現状は以下の2つのライブラリから構成されます。

  • MateriaUtils ・・・ Mateira内で共通で使用する関数をまとめたユーティリティー集(単独でも利用可能)
  • Materia・・・Webサービスで共通して必要となるモデルおよびJsonAPIを提供するサービス基盤(MateiaUtilsに依存)

今後、ユーザー間のメッセージング機能など、異なる分野ごとに必要に応じて選択・追加する周辺ライブラリを実装していく予定です。

MateriaUtils機能

MateriaUtils.Calendar.CalendarUtil

現在日時、翌日日時の取得や、ローカル時刻<-->UTCの時刻変換機能などを提供
デフォルトでは正しく時刻関係を解釈できないEmum.max_by()に変わるmax_by関数も提供
時刻操作ライブラリとしてTimexを使用

MateriaUtils.Ecto.EctoUtil

Ecto関連のWrapper実装を提供

  • Ecto.Adapters.SQLをWrappしたSQLの直接実装
  • フロント側で検索条件を指定できる汎用検索API用関数

MateriaUtils.Enum.EnumLikeSqlUtil

Enumでのgrup_by,count,sumをSQLライクに書く為の関数を提供

MateriaUtils.Perser.TsvPerser

テストやpriv/repo/seeds.exsでのデータ定義をTSVで楽に行う為のパース機能を提供

Materia基本機能

認証Pipeline

Routerに設定するだけでjwt認証を提供するplug pipeline実装

  • Materia.AuthenticatePipeline ・・・ ログイン認証後のjwt認証用
  • Materia.UserRegistrationAuthPipeline ・・・ユーザー仮登録用
  • Materia.PasswordResetAuthPipeline・・・パスワードリセット用

権限チェックPipeline

Routerに設定するだけでAPIの実行権限チェックを提供するplug pipeline実装

  • Materia.Plug.GrantChecker ・・・ユーザーのroleとgrantsテーブルの設定によってAPIの実行権限チェックを行う

トランザクション制御&エラーハンドリング

Ecto.Multiを使ったトランザクション制御、および、共通エラーハンドリング

  • MateriaWeb.ControllerBase ・・・ 各Controllerで使用することで呼び出した関数のトランザクション制御および共通エラーハンドリングを提供するEcto.MultiのWrapper実装
  • Materia.Errors.BusinessError ・・・ 任意で業務エラーを返したい場合に使用する独自Errorモジュール。MateriaWeb.FallbackControllerに対応
  • MateriaWeb.FallbackController ・・・ 各Controllerでaction_fallbackに設定することで、ControllerBaseでハンドリングしたErrorをJsonフォーマットに整形する後処理

Materiaコンポーネント

Materia.Accounts

メール認証をベースとしてユーザー、権限管理APIを提供

  • 管理者向けのユーザー情報の参照・更新API
  • 管理者向けの権限情報管理API
  • 自身のユーザー情報のみ参照更新なエンドユーザー向けAPI
  • メールによる本人確認付きのユーザー仮登録&本登録API
  • メールによる本人確認付きのパスワードリセットAPI

Mateia.Authenticator

Materia.Accountsで実装されたユーザーに対するjwt認証機能を提供
認証ライブラリとしてguardianを使用し以下のAPIを提供

  • メールアドレス、パスワードによるaccess_token、refresh_tokenの発行
  • refresh_tokenによるaccess_token認証の再取得
  • アカウントステータスによるログイン認証の妥当性チェック

Materia.Mails

認証やユーザー通知の為のメール送信およびメールテンプレート管理機能
ユーザー登録やパスワードリセット時の本人認証やユーザー個別への通知を目的としたメール送信を想定
マーケッティングメールなどバルク送信には現在未対応

  • メール送信機能。AWS SES(要AWSCLI)、SendGridおよびテスト用Stubに対応
  • メールテンプレート管理API
  • メール送信機能は登録されたテンプレート(定型文)に対するユーザー名等置換機能を提供

そのほかAccounts周辺モデル

  • Materia.Organizations ・・・複数のユーザーを所属管理する組織情報APIを提供
  • Materia.Locations ・・・ AccountsおよびOrganizationsに紐づく複数の住所情報管理APIを提供
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away