{-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE OverloadedStrings #-} module Endpoints.ProfileEndpoint (ProfileAPI, profileServer) where import Servant import Data.Aeson import Data.Text (Text) import qualified Data.Text as T import Database.Persist import Database (runDb) import Control.Monad.IO.Class (liftIO) import Data.User (User(..), Unique(UniqueName)) import Model.Profile import Model.MatrixErrorResponse ---------------------------------------------------------------------------------------------------- type ProfileAPI = GetProfile profileServer :: Server ProfileAPI profileServer = handleProfileGet --- GET /_matrix/client/v3/profile/{userId} -------------------------------------------------------- type GetProfile = "_matrix" :> "client" :> "v3" :> "profile" :> Capture "userId" Text :> Get '[JSON] ProfileResponse handleProfileGet :: Text -> Handler ProfileResponse handleProfileGet user_id = do let username = T.takeWhile (/= ':') $ T.drop 1 user_id maybe_user <- liftIO $ runDb $ getBy $ UniqueName username case maybe_user of Just (Entity _ db_user) -> return $ ProfileResponse { display_name = (userDisplayName db_user) , avatar_url = userAvatarUrl db_user , tz = Nothing } Nothing -> throwError err404 { errBody = encode user_not_found_error } where user_not_found_error = (MatrixErrorResponse "M_NOT_FOUND" "Profile not found")