Как работать с generi c маршрутами и «монтировать» их в более крупные приложения-слуги? - PullRequest
2 голосов
/ 07 мая 2020

Концепция

Я позаимствовал "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 при объединении этого мини-приложения в более крупное служебное приложение?
...