shortener-server

Copyright(c) Mansur Ziiatdinov 2018-2019
LicenseBSD-3
Maintainerchgk@pm.me
Stabilityexperimental
PortabilityPOSIX
Safe HaskellNone
LanguageHaskell2010

Api

Contents

Description

В этом модуле содержатся типы, которые описывают API всего приложения, всевозможные параметры, типы тел запросов и ответов и т.п.

Реализация приложения с таким API разбита на два модуля:

  • в модуле Auth содержится реализация API для авторизации, описанного типом AuthApi, и вспомогательные функции для работы с авторизацией;
  • в модуле Server реализовано API для работы, которое описано типом LinkApi;
  • кроме того, статические файлы отдаются при помощи функции staticFiles.

Реализованное приложение запускается в модуле Main

Synopsis

Весь API приложения

type Api = ("auth" :> AuthApi) :<|> (("u" :> LinkApi) :<|> HomepageApi) Source #

Описание всего API приложения.

Весь API поделён на три части:

  • API для авторизации (по пути /auth);
  • собственно API приложения (по /u);
  • статические файлы (все остальные пути).

api :: Proxy Api Source #

Для построения серверов, клиентов, документации и прочего в типобезопасном режиме мы будем использовать следующее свидетельство о типе API.

API для авторизации

type AuthApi = RedirectAS :<|> CallbackAS Source #

API для авторизации

В приложении для авторизации через сервер авторизации нужно реализовать две страницы: первая перенаправляет запрос к серверу авторизации, вторую будет вызывать сервер авторизации после попытки логина

type RedirectAS = Get '[HTML] NoContent Source #

Страница для перенаправления к серверу авторизации просто возвращает код 301 и не возвращает содержимого

type CallbackAS = "cb" :> (QueryParam "error" Text :> (QueryParam "code" Text :> Get '[HTML] Html)) Source #

Страница, которую вызывает сервер авторизации после попытки логина, может принимать два параметра. В случае неуспешного логина сервер передаёт параметр error с ошибкой. В случае успешного логина сервер передаёт параметр code с кодом авторизации. Код авторизации путём запроса к token endpoint можно поменять на идентификационный токен и токен доступа.

Приложение в дальнейшем использует свой собственный JWT-токен для авторизации.

В нашем случае страница возвращает HTML, в котором в локальное хранилище сохраняется JWT-токен и информация о пользователе.

API для работы

type LinkApi = ListAllLinks :<|> (CreateLink :<|> RedirectLink) Source #

API собственно демонстрационного приложения. Приложение умеет сокращать ссылки и перенаправлять на них.

Существуют три возможных запроса:

  • запрос на получение списка ссылок (требует авторизации); обычный пользователь получает список своих ссылок, пользователь с ролью администратора получает список всех ссылок;
  • запрос на создание ссылки (требует авторизации);
  • запрос на перенаправление по сокращенной ссылке.

type ListAllLinks = Auth '[JWT] User :> Get '[JSON] [(Short, Long)] Source #

GET-запрос на получение списка ссылок (требует авторизации при помощи JWT-токена, см. CallbackAS).

Обычный пользователь получает список своих ссылок, пользователь с ролью администратора получает список всех ссылок.

Список возвращается в формате JSON в виде пар «сокращенная ссылка, обычная ссылка». Например,

  [
    ["vhptmblb", "https://yandex.ru"],
    ["nzpjidqq", "https://google.ru"]
  ]

type CreateLink = Auth '[JWT] User :> (ReqBody '[JSON] Long :> Post '[JSON] Short) Source #

POST-запрос на создание ссылки (требует авторизации при помощи JWT-токена, см CallbackAS).

В теле запроса передаётся обычная ссылка (в формате JSON, т.е. текст в кавычках). Валидация ссылки не проводится.

В ответе возвращается сокращённая ссылка в формате JSON (точнее, часть ссылки после https://s.chgk.me/u/).

Пример запроса и ответа:

   > "https://yandex.ru"
   < "vhptmblb"

type RedirectLink = Capture "short" Short :> Get '[JSON] NoContent Source #

GET-запрос для перенаправления. В ответ возвращается код 301 без содержимого.

Например, GET /u/vhptmblb.

Главная страница

type HomepageApi = Raw Source #

По остальным запросам ищутся статические файлы