Концепция
Я позаимствовал "mount" из мира Rails. Вот что я концептуально пытаюсь сделать:
- Напишите мини-веб-приложение в Servant, которое другие могут «включать / монтировать» в более крупных приложениях Servant
- Они должны иметь возможность указывать «точку монтирования» для URL-адресов этого мини-приложения (в основном префикс URL). Они также должны иметь возможность указывать аутентификацию для доступа к этому мини-приложению (настоятельно рекомендуется!)
- Различные
safeLinks
, используемые в этом мини-приложении, должны учитывать эту «точку монтирования» (иначе все ссылки будут заканчиваться - до 404).
Особенности
А вот особенности:
У меня есть группа Слуг маршруты в odd-jobs
библиотеке , которые выглядят так:
data Routes route = Routes
{ rFilterResults :: route :- QueryParam "filters" Filter :> Get '[HTML] (Html ())
, rStaticAssets :: route :- "assets" :> Raw
, rEnqueue :: route :- "enqueue" :> Capture "jobId" JobId :> Post '[HTML] NoContent
, rRunNow :: route :- "run" :> Capture "jobId" JobId :> Post '[HTML] NoContent
, rCancel :: route :- "cancel" :> Capture "jobId" JobId :> Post '[HTML] NoContent
, rRefreshJobTypes :: route :- "refresh-job-types" :> Post '[HTML] NoContent
, rRefreshJobRunners :: route :- "refresh-job-runners" :> Post '[HTML] NoContent
} deriving (Generic)
У меня есть отдельный OddJobs.Links
модуль , который использует трюк RecordWildCards
, чтобы получить кучу Функции генерации безопасных ссылок в пространстве имен верхнего уровня:
Routes{..} = allFieldLinks' absText :: Routes (AsLink Text)
absText :: Link -> Text
absText l = "/" <> (toS $ show $ linkURI l)
HTML, сгенерированный веб-интерфейсом очереди заданий, использует эту функцию верхнего уровня как таковую :
form_ [ action_ (Links.rCancel jobId), method_ "post" ] $ do
Вопросы
- Я смотрел на
safeLink
и связанные с ним функции в Servant.Links , и я не могу понять, * Первый аргумент 1048 * в основном определяет "точку монтирования" автоматически или нет? Если да, то каким будет соответствующий способ использования fieldLink
(и связанных функций)? - Как вы «комбинируете» несколько API, каждый из которых определен с помощью общей c -записи, чтобы вы может генерировать функции безопасной ссылки (и обслуживающие клиенты) для комбинированного API?
- Должны ли мои HTML функции генерации в основном принимать "точку монтирования" в качестве аргумента, генерировать функции безопасной ссылки , и их везде разносят? то есть я не смогу использовать трюк
RecordWildCards
, чтобы получить эти функции в пространстве имен верхнего уровня, верно? - Что произойдет с моими фактическими обработчиками, если пользователь моей библиотеки решит добавить basi c -auth при объединении этого мини-приложения в более крупное служебное приложение?