2017年8月12日土曜日

Yesod Middleware とか

YesodのMiddleware


DjangoのMiddlewareとか、SpringFrameworkのfilterみたいなもんの、Yesodのやつ、前処理をフックするための機能、コードはgithubに置いときます。

Yesod Middleware sample

認証されたユーザーのログを出力するという簡単なサンプルです。

動かしてみる


手順どおりに初期化できたら、ユーザーを作成する


作成すればログインされるので、適当なリンクをアクセスしてみる


ログを確認


mysql> select * from acc_log;
+----+---------+---------------------+
| id | user_id | acc_time            |
+----+---------+---------------------+
|  1 |       1 | 2017-08-11 20:55:32 |
|  2 |       1 | 2017-08-11 20:56:00 |
+----+---------+---------------------+
2 rows in set (0.00 sec)

簡単な説明


Yesod Middlewareの設置方法は、まず、middlewareを書く
-- src/Foundation.hs 抜粋
dbAccessMiddleware ::
         (YesodAuth site,
          YesodPersist site,
          YesodAuthPersist site,
          AuthId site ~ Key (AuthEntity site),
          PersistEntity (AuthEntity site),
          Typeable (AuthEntity site),
          AuthEntity site ~ User,
          YesodPersistBackend site ~ SqlBackend) =>
          HandlerT site IO res -> HandlerT site IO res
dbAccessMiddleware handler = do
     mauth <- maybeAuth
     case mauth of
         Nothing -> handler
         Just (Entity uid u) -> do
             runDB $ do
                 si <- get ((toSqlKey 1) :: Key SystemInfo)
                 case si of
                     Just entity -> do
                         case systemInfoInit entity of
                             True  -> liftIO getCurrentTime >>= \t ->
                                              (insert $ AccLog { accLogUserId = uid
                                                               , accLogAccTime = t }) >> return ()
                             False -> return ()
                     _ -> $(logInfo) "system_info no initialized.." >> return ()
             handler
で、Yesod Middlewareにくっつける
-- src/Foundation.hs 抜粋
yesodMiddleware = defaultYesodMiddleware . dbAccessMiddleware
こんな感じで実装できる、ちなみにmaybeAuthで認証済みユーザーのEntityが取得出きる。