1 {-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-}
    2 module Databrary.Routes.JS
    3   ( jsRoutes
    4   , fakeBackendDepend1
    5   , fakeBackendDepend2
    6   , fakeBackendDepend3
    7   , fakeBackendDepend4
    8   ) where
    9 
   10 import qualified Data.ByteString.Builder as B
   11 import qualified Data.ByteString as BS
   12 import Data.Monoid ((<>))
   13 
   14 import Databrary.Model.Record (Record)
   15 import Databrary.Model.Asset (Asset)
   16 import Databrary.Model.Volume (Volume)
   17 import Databrary.Model.Party (Party)
   18 import Databrary.Model.Id.Types
   19 import Databrary.Model.Token (LoginToken)
   20 import Databrary.Model.Segment
   21 import Databrary.Model.Slot.Types
   22 import Databrary.Action
   23 import Databrary.Controller.Paths
   24 import Databrary.Controller.Root
   25 import Databrary.Controller.Login
   26 import Databrary.Controller.Register
   27 import Databrary.Controller.Token
   28 import Databrary.Controller.Party
   29 import Databrary.Controller.Volume
   30 -- import Databrary.Controller.Container
   31 import Databrary.Controller.Slot
   32 import Databrary.Controller.Record
   33 import Databrary.Controller.Format
   34 import Databrary.Controller.Asset
   35 import Databrary.Controller.AssetSegment
   36 import Databrary.Controller.Zip
   37 import Databrary.Controller.CSV
   38 import Databrary.Controller.Search
   39 import Databrary.Controller.Activity
   40 
   41 rt :: BS.ByteString -> B.Builder
   42 rt routeKeyVal = B.byteString ("\n" <> routeKeyVal)
   43 
   44 jsRoutes :: [B.Builder] -- should be mconcat, but BSB bug causes hangs
   45 jsRoutes =
   46   [ rt "\"viewRoot\":{method:\"GET\",route:function(){return \"/\";}},"
   47    -- jsRoute "viewRoot" viewRoot (HTML)
   48   , rt "\"viewLogin\":{method:\"GET\",route:function(){return \"/user/login\";}},"
   49    -- , jsRoute "viewLogin" viewLogin ()
   50   , rt "\"viewRegister\":{method:\"GET\",route:function(){return \"/user/register\";}},"
   51   -- , jsRoute "viewRegister" viewRegister ()
   52   , rt "\"viewPasswordReset\":{method:\"GET\",route:function(){return \"/user/password\";}},"
   53   -- , jsRoute "viewPasswordReset" viewPasswordReset ()
   54   , rt "\"viewLoginToken\":{method:\"GET\",route:function(byteString0){return \"/token/\"+byteString0+\"\";}},"
   55   -- , jsRoute "viewLoginToken" viewLoginToken (HTML, token)
   56 
   57   , rt "\"viewProfile\":{method:\"GET\",route:function(){return \"/profile\";}},"
   58   -- , jsRoute "viewProfile" viewParty (HTML, TargetProfile)
   59   , rt "\"viewProfileEdit\":{method:\"GET\",route:function(){return \"/profile/edit\";}},"
   60   -- , jsRoute "viewProfileEdit" viewPartyEdit (TargetProfile)
   61   , rt "\"viewParty\":{method:\"GET\",route:function(int320){return \"/party/\"+int320+\"\";}},"
   62   -- , jsRoute "viewParty" viewParty (HTML, TargetParty party)
   63   , rt "\"viewPartyEdit\":{method:\"GET\",route:function(int320){return \"/party/\"+int320+\"/edit\";}},"
   64   -- , jsRoute "viewPartyEdit" viewPartyEdit (TargetParty party)
   65   , rt "\"viewPartySearch\":{method:\"GET\",route:function(){return \"/party\";}},"
   66   -- , jsRoute "viewPartySearch" queryParties (HTML)
   67   , rt "\"partyAvatar\":{method:\"GET\",route:function(int320){return \"/party/\"+int320+\"/avatar\";}},"
   68   -- , jsRoute "partyAvatar" viewAvatar (party)
   69   , rt "\"viewPartyActivity\":{method:\"GET\",route:function(int320){return \"/party/\"+int320+\"/activity\";}},"
   70   -- , jsRoute "viewPartyActivity" viewPartyActivity (HTML, TargetParty party)
   71 
   72   , rt "\"viewVolume\":{method:\"GET\",route:function(int320){return \"/volume/\"+int320+\"\";}},"
   73   -- , jsRoute "viewVolume" viewVolume (HTML, volume)
   74   , rt "\"viewVolumeCreate\":{method:\"GET\",route:function(){return \"/volume/create\";}},"
   75   -- , jsRoute "viewVolumeCreate" viewVolumeCreate ()
   76   , rt "\"viewVolumeEdit\":{method:\"GET\",route:function(int320){return \"/volume/\"+int320+\"/edit\";}},"
   77   -- , jsRoute "viewVolumeEdit" viewVolumeEdit (volume)
   78   , rt "\"viewVolumeSearch\":{method:\"GET\",route:function(){return \"/volume\";}},"
   79   -- , jsRoute "viewVolumeSearch" queryVolumes (HTML)
   80   , rt "\"thumbVolume\":{method:\"GET\",route:function(int320){return \"/volume/\"+int320+\"/thumb\";}},"
   81   -- , jsRoute "thumbVolume" thumbVolume (volume)
   82   , rt "\"csvVolume\":{method:\"GET\",route:function(int320){return \"/volume/\"+int320+\"/csv\";}},"
   83   -- , jsRoute "csvVolume" csvVolume (volume)
   84   , rt "\"viewVolumeActivity\":{method:\"GET\",route:function(int320){return \"/volume/\"+int320+\"/activity\";}},"
   85   -- , jsRoute "viewVolumeActivity" viewVolumeActivity (HTML, volume)
   86 
   87   , rt "\"viewSlot\":{method:\"GET\",route:function(int320,int321,segment2){return \"/volume/\"+int320+\"/slot/\"+int321+\"/\"+segment2+\"\";}},"
   88   -- , jsRoute "viewSlot" (viewSlot False) (HTML, (Just volume, slot))
   89   , rt "\"viewSlotEdit\":{method:\"GET\",route:function(int320,int321){return \"/volume/\"+int320+\"/slot/\"+int321+\"/edit\";}},"
   90   -- , jsRoute "viewSlotEdit" viewContainerEdit (Just volume, container)
   91   , rt "\"viewSlotActivity\":{method:\"GET\",route:function(int320,int321){return \"/volume/\"+int320+\"/slot/\"+int321+\"/activity\";}},"
   92   -- , jsRoute "viewSlotActivity" viewContainerActivity (HTML, (Just volume, container))
   93   , rt "\"thumbSlot\":{method:\"GET\",route:function(int320,int321,segment2){return \"/volume/\"+int320+\"/slot/\"+int321+\"/\"+segment2+\"/thumb\";}},"
   94   -- , jsRoute "thumbSlot" thumbSlot (Just volume, slot)
   95 
   96   , rt "\"viewRecord\":{method:\"GET\",route:function(int320){return \"/record/\"+int320+\"\";}},"
   97   -- , jsRoute "viewRecord" viewRecord (record)
   98 
   99   , rt "\"viewFormats\":{method:\"GET\",route:function(){return \"/asset/formats\";}},"
  100   -- , jsRoute "viewFormats" viewFormats ()
  101   , rt "\"viewAssetSegment\":{method:\"GET\",route:function(int320,int321,segment2,int323){return \"/volume/\"+int320+\"/slot/\"+int321+\"/\"+segment2+\"/asset/\"+int323+\"\";}},"
  102   -- , jsRoute "viewAssetSegment" (viewAssetSegment False) (HTML, Just volume, slot, asset)
  103   , rt "\"viewOrigAssetSegment\":{method:\"GET\",route:function(int320,int321,segment2,int323){return \"/volume/\"+int320+\"/slot/\"+int321+\"/\"+segment2+\"/asset/\"+int323+\"\";}},"
  104   -- , jsRoute "viewOrigAssetSegment" (viewAssetSegment True) (HTML, Just volume, slot, asset)
  105   , rt "\"downloadAssetSegment\":{method:\"GET\",route:function(int320,segment1,int322){return \"/slot/\"+int320+\"/\"+segment1+\"/asset/\"+int322+\"/download\";}},"
  106   -- , jsRoute "downloadAssetSegment" downloadAssetSegment (slot, asset) --download transcoded asset segment
  107   , rt "\"downloadOrigAssetSegment\":{method:\"GET\",route:function(int320,segment1,int322){return \"/slot/\"+int320+\"/\"+segment1+\"/asset/\"+int322+\"/downloadOrig\";}},"
  108   -- , jsRoute "downloadOrigAssetSegment" downloadOrigAssetSegment (slot, asset) --download original asset segment 
  109   , rt "\"thumbAssetSegment\":{method:\"GET\",route:function(int320,segment1,int322){return \"/slot/\"+int320+\"/\"+segment1+\"/asset/\"+int322+\"/thumb\";}},"
  110   -- , jsRoute "thumbAssetSegment" (thumbAssetSegment False) (slot, asset)
  111   , rt "\"thumbOrigAssetSegment\":{method:\"GET\",route:function(int320,segment1,int322){return \"/slot/\"+int320+\"/\"+segment1+\"/asset/\"+int322+\"/thumb\";}},"
  112   -- , jsRoute "thumbOrigAssetSegment" (thumbAssetSegment True) (slot, asset)
  113   , rt "\"downloadAsset\":{method:\"GET\",route:function(int320){return \"/asset/\"+int320+\"/download\";}},"
  114   -- , jsRoute "downloadAsset" downloadAsset (asset, fullSegment)
  115   , rt "\"downloadOrigAsset\":{method:\"GET\",route:function(int320){return \"/asset/\"+int320+\"/downloadOrig\";}},"
  116   -- , jsRoute "downloadOrigAsset" downloadOrigAsset (asset, fullSegment) --download original asset
  117   , rt "\"thumbAsset\":{method:\"GET\",route:function(int320){return \"/asset/\"+int320+\"/thumb\";}},"
  118   -- , jsRoute "thumbAsset" thumbAsset (asset, fullSegment)
  119 
  120   , rt "\"viewSearch\":{method:\"GET\",route:function(){return \"/search\";}},"
  121   -- , jsRoute "viewSearch" postSearch (HTML)
  122 
  123   , rt "\"zipSlot\":{method:\"GET\",route:function(int320,int321){return \"/volume/\"+int320+\"/slot/\"+int321+\"/zip/false\";}},"
  124   -- , jsRoute "zipSlot" (zipContainer False) (Just volume, container) --zip transcoded slot
  125   , rt "\"zipOrigSlot\":{method:\"GET\",route:function(int320,int321){return \"/volume/\"+int320+\"/slot/\"+int321+\"/zip/true\";}},"
  126   -- , jsRoute "zipOrigSlot" (zipContainer True) (Just volume, container) --zip orignal slot
  127   , rt "\"zipVolume\":{method:\"GET\",route:function(int320){return \"/volume/\"+int320+\"/zip/false\";}},"
  128   -- , jsRoute "zipVolume" (zipVolume False) (volume) -- zip volume full of transcoded assets
  129   , rt "\"zipOrigVolume\":{method:\"GET\",route:function(int320){return \"/volume/\"+int320+\"/zip/true\";}},"
  130   -- , jsRoute "zipOrigVolume" (zipVolume True) (volume) -- zip volume full of original assets
  131   , rt "\"viewVolumeDescription\":{method:\"GET\",route:function(int320){return \"/volume/\"+int320+\"/description\";}},"
  132   -- , jsRoute "viewVolumeDescription" viewVolumeDescription (volume)
  133 
  134   , rt "\"get\":{method:\"GET\",route:function(){return \"/api\";}},"
  135   -- , jsRoute "get" viewRoot (JSON)
  136   , rt "\"getUser\":{method:\"GET\",route:function(){return \"/api/user\";}},"
  137   -- , jsRoute "getUser" viewUser ()
  138   , rt "\"postUser\":{method:\"POST\",route:function(){return \"/api/user\";}},"
  139   -- , jsRoute "postUser" postUser (JSON)
  140   , rt "\"postLogin\":{method:\"POST\",route:function(){return \"/api/user/login\";}},"
  141   -- , jsRoute "postLogin" postLogin (JSON)
  142   , rt "\"postLogout\":{method:\"POST\",route:function(){return \"/api/user/logout\";}},"
  143   -- , jsRoute "postLogout" postLogout (JSON)
  144   , rt "\"postRegister\":{method:\"POST\",route:function(){return \"/api/user/register\";}},"
  145   -- , jsRoute "postRegister" postRegister (JSON)
  146   , rt "\"postPasswordReset\":{method:\"POST\",route:function(){return \"/api/user/password\";}},"
  147   -- , jsRoute "postPasswordReset" postPasswordReset (JSON)
  148   , rt "\"getLoginToken\":{method:\"GET\",route:function(byteString0){return \"/api/token/\"+byteString0+\"\";}},"
  149   -- , jsRoute "getLoginToken" viewLoginToken (JSON, token)
  150   , rt "\"postPasswordToken\":{method:\"POST\",route:function(byteString0){return \"/api/token/\"+byteString0+\"\";}},"
  151   -- , jsRoute "postPasswordToken" postPasswordToken (JSON, token)
  152 
  153   , rt "\"getParty\":{method:\"GET\",route:function(int320){return \"/api/party/\"+int320+\"\";}},"
  154   -- , jsRoute "getParty" viewParty (JSON, TargetParty party)
  155   , rt "\"getProfile\":{method:\"GET\",route:function(){return \"/api/profile\";}},"
  156   -- , jsRoute "getProfile" viewParty (JSON, TargetProfile)
  157   , rt "\"postParty\":{method:\"POST\",route:function(int320){return \"/api/party/\"+int320+\"\";}},"
  158   -- , jsRoute "postParty" postParty (JSON, TargetParty party)
  159   , rt "\"getParties\":{method:\"GET\",route:function(){return \"/api/party\";}},"
  160   -- , jsRoute "getParties" queryParties (JSON)
  161   , rt "\"getPartyActivity\":{method:\"GET\",route:function(int320){return \"/api/party/\"+int320+\"/activity\";}},"
  162   -- , jsRoute "getPartyActivity" viewPartyActivity (JSON, TargetParty party)
  163 
  164   , rt "\"postAuthorizeApply\":{method:\"POST\",route:function(int320,int321){return \"/api/party/\"+int320+\"/apply/\"+int321+\"\";}},"
  165   -- , jsRoute "postAuthorizeApply" postAuthorize (JSON, TargetParty party, AuthorizeTarget True party)
  166   , rt "\"postAuthorize\":{method:\"POST\",route:function(int320,int321){return \"/api/party/\"+int320+\"/authorize/\"+int321+\"\";}},"
  167   -- , jsRoute "postAuthorize" postAuthorize (JSON, TargetParty party, AuthorizeTarget False party)
  168   , rt "\"deleteAuthorize\":{method:\"DELETE\",route:function(int320,int321){return \"/api/party/\"+int320+\"/authorize/\"+int321+\"\";}},"
  169   -- , jsRoute "deleteAuthorize" deleteAuthorize (JSON, TargetParty party, AuthorizeTarget False party)
  170   , rt "\"deleteAuthorizeParent\":{method:\"DELETE\",route:function(int320,int321){return \"/api/party/\"+int320+\"/apply/\"+int321+\"\";}},"
  171   -- , jsRoute "deleteAuthorizeParent" deleteAuthorize (JSON, TargetParty party, AuthorizeTarget True party)
  172   , rt "\"postAuthorizeNotFound\":{method:\"POST\",route:function(int320){return \"/api/party/\"+int320+\"/notfound\";}},"
  173   -- , jsRoute "postAuthorizeNotFound" postAuthorizeNotFound (TargetParty party)
  174 
  175   , rt "\"getVolume\":{method:\"GET\",route:function(int320){return \"/api/volume/\"+int320+\"\";}},"
  176   -- , jsRoute "getVolume" viewVolume (JSON, volume)
  177   , rt "\"postVolume\":{method:\"POST\",route:function(int320){return \"/api/volume/\"+int320+\"\";}},"
  178   -- , jsRoute "postVolume" postVolume (JSON, volume)
  179   , rt "\"createVolume\":{method:\"POST\",route:function(){return \"/api/volume\";}},"
  180   -- , jsRoute "createVolume" createVolume (JSON)
  181   , rt "\"getVolumes\":{method:\"GET\",route:function(){return \"/api/volume\";}},"
  182   -- , jsRoute "getVolumes" queryVolumes (JSON)
  183   , rt "\"postVolumeAccess\":{method:\"POST\",route:function(int320,int321){return \"/api/volume/\"+int320+\"/access/\"+int321+\"\";}},"
  184   -- , jsRoute "postVolumeAccess" postVolumeAccess (JSON, (volume, VolumeAccessTarget party))
  185   , rt "\"postVolumeFunding\":{method:\"POST\",route:function(int320,int641){return \"/api/volume/\"+int320+\"/funder/\"+int641+\"\";}},"
  186   -- , jsRoute "postVolumeFunding" postVolumeFunding (volume, funder)
  187   , rt "\"postVolumeLinks\":{method:\"POST\",route:function(int320){return \"/api/volume/\"+int320+\"/link\";}},"
  188   -- , jsRoute "postVolumeLinks" postVolumeLinks (JSON, volume)
  189   , rt "\"deleteVolumeFunder\":{method:\"DELETE\",route:function(int320,int641){return \"/api/volume/\"+int320+\"/funder/\"+int641+\"\";}},"
  190   -- , jsRoute "deleteVolumeFunder" deleteVolumeFunder (volume, funder)
  191   , rt "\"postVolumeAssist\":{method:\"POST\",route:function(int320){return \"/api/volume/\"+int320+\"/assist\";}},"
  192   -- , jsRoute "postVolumeAssist" postVolumeAssist (volume)
  193   , rt "\"getVolumeActivity\":{method:\"GET\",route:function(int320){return \"/api/volume/\"+int320+\"/activity\";}},"
  194   -- , jsRoute "getVolumeActivity" viewVolumeActivity (JSON, volume)
  195 
  196   , rt "\"postSearch\":{method:\"GET\",route:function(){return \"/api/search\";}},"
  197   -- , jsRoute "postSearch" postSearch (JSON)
  198   , rt "\"getFunders\":{method:\"GET\",route:function(){return \"/api/funder\";}},"  
  199   -- , jsRoute "getFunders" queryFunder ()
  200   , rt "\"getCitation\":{method:\"GET\",route:function(){return \"/api/cite\";}},"
  201   -- , jsRoute "getCitation" getCitation ()
  202 
  203   , rt "\"getSlot\":{method:\"GET\",route:function(int320,segment1){return \"/api/slot/\"+int320+\"/\"+segment1+\"\";}},"
  204   -- , jsRoute "getSlot" (viewSlot False) (JSON, (Nothing, slot))
  205   , rt "\"postContainer\":{method:\"POST\",route:function(int320){return \"/api/slot/\"+int320+\"\";}},"
  206   -- , jsRoute "postContainer" postContainer (container)
  207   , rt "\"deleteContainer\":{method:\"DELETE\",route:function(int320){return \"/api/slot/\"+int320+\"\";}},"
  208   -- , jsRoute "deleteContainer" deleteContainer (container)
  209   , rt "\"createContainer\":{method:\"POST\",route:function(int320){return \"/api/volume/\"+int320+\"/slot\";}},"
  210   -- , jsRoute "createContainer" createContainer (volume)
  211   , rt "\"getContainerActivity\":{method:\"GET\",route:function(int320){return \"/api/slot/\"+int320+\"/activity\";}},"
  212   -- , jsRoute "getContainerActivity" viewContainerActivity (JSON, (Nothing, container))
  213 
  214   , rt "\"getRecord\":{method:\"GET\",route:function(int320){return \"/api/record/\"+int320+\"\";}},"
  215   -- , jsRoute "getRecord" viewRecord (record)
  216   , rt "\"createRecord\":{method:\"POST\",route:function(int320){return \"/api/volume/\"+int320+\"/record\";}},"
  217   -- , jsRoute "createRecord" createRecord (JSON, volume)
  218   , rt "\"deleteRecord\":{method:\"DELETE\",route:function(int320){return \"/api/record/\"+int320+\"\";}},"
  219   -- , jsRoute "deleteRecord" deleteRecord (JSON, record)
  220   , rt "\"postRecordMeasure\":{method:\"POST\",route:function(int320,int321){return \"/api/record/\"+int320+\"/metric/\"+int321+\"\";}},"
  221   -- , jsRoute "postRecordMeasure" postRecordMeasure (JSON, record, metric)
  222   , rt "\"postRecordSlot\":{method:\"POST\",route:function(int320,segment1,int322){return \"/api/slot/\"+int320+\"/\"+segment1+\"/record/\"+int322+\"\";}},"
  223   -- , jsRoute "postRecordSlot" postRecordSlot (JSON, slot, record)
  224   , rt "\"deleteRecordAllSlot\":{method:\"DELETE\",route:function(int320){return \"/api/slot/all/record/\"+int320+\"\";}},"
  225   -- , jsRoute "deleteRecordAllSlot" deleteRecordAllSlot (JSON, record)
  226 
  227   , rt "\"addVolumeMetric\":{method:\"PUT\",route:function(int320,int321){return \"/api/volume/\"+int320+\"/metric/\"+int321+\"\";}},"
  228   -- , jsRoute "addVolumeMetric" postVolumeMetric (volume, Right metric)
  229   , rt "\"addVolumeCategory\":{method:\"PUT\",route:function(int320,int161){return \"/api/volume/\"+int320+\"/category/\"+int161+\"\";}},"
  230   -- , jsRoute "addVolumeCategory" postVolumeMetric (volume, Left category)
  231   , rt "\"deleteVolumeMetric\":{method:\"DELETE\",route:function(int320,int321){return \"/api/volume/\"+int320+\"/metric/\"+int321+\"\";}},"
  232   -- , jsRoute "deleteVolumeMetric" deleteVolumeMetric (volume, Right metric)
  233   , rt "\"deleteVolumeCategory\":{method:\"DELETE\",route:function(int320,int161){return \"/api/volume/\"+int320+\"/category/\"+int161+\"\";}},"
  234   -- , jsRoute "deleteVolumeCategory" deleteVolumeMetric (volume, Left category)
  235   , rt "\"postVolumeState\":{method:\"PUT\",route:function(int320,text1){return \"/api/volume/\"+int320+\"/state/\"+text1+\"\";}},"
  236   -- , jsRoute "postVolumeState" postVolumeState (volume, "")
  237   , rt "\"deleteVolumeState\":{method:\"DELETE\",route:function(int320,text1){return \"/api/volume/\"+int320+\"/state/\"+text1+\"\";}},"
  238   -- , jsRoute "deleteVolumeState" deleteVolumeState (volume, "")
  239 
  240   , rt "\"getAsset\":{method:\"GET\",route:function(int320){return \"/api/asset/\"+int320+\"\";}},"
  241   -- , jsRoute "getAsset" viewAsset (JSON, asset)
  242   , rt "\"getAssetSegment\":{method:\"GET\",route:function(int320,int321,segment2,int323){return \"/api/volume/\"+int320+\"/slot/\"+int321+\"/\"+segment2+\"/asset/\"+int323+\"\";}},"
  243   -- , jsRoute "getAssetSegment" (viewAssetSegment False) (JSON, Just volume, slot, asset)
  244   , rt "\"postAsset\":{method:\"POST\",route:function(int320){return \"/api/asset/\"+int320+\"\";}},"
  245   -- , jsRoute "postAsset" postAsset (asset)
  246   , rt "\"createAsset\":{method:\"POST\",route:function(int320){return \"/api/volume/\"+int320+\"/asset\";}},"
  247   -- , jsRoute "createAsset" createAsset (volume)
  248   , rt "\"deleteAsset\":{method:\"DELETE\",route:function(int320){return \"/api/asset/\"+int320+\"\";}},"
  249   -- , jsRoute "deleteAsset" deleteAsset (asset)
  250   , rt "\"postExcerpt\":{method:\"POST\",route:function(int320,segment1,int322){return \"/api/slot/\"+int320+\"/\"+segment1+\"/asset/\"+int322+\"/excerpt\";}},"
  251   -- , jsRoute "postExcerpt" postExcerpt (slot, asset)
  252   , rt "\"deleteExcerpt\":{method:\"DELETE\",route:function(int320,segment1,int322){return \"/api/slot/\"+int320+\"/\"+segment1+\"/asset/\"+int322+\"/excerpt\";}},"
  253   -- , jsRoute "deleteExcerpt" deleteExcerpt (slot, asset)
  254   , rt "\"uploadStart\":{method:\"POST\",route:function(int320){return \"/api/volume/\"+int320+\"/upload\";}},"
  255   -- , jsRoute "uploadStart" uploadStart (volume)
  256   , rt "\"uploadChunk\":{method:\"POST\",route:function(){return \"/api/upload\";}},"
  257   -- , jsRoute "uploadChunk" uploadChunk ()
  258 
  259   , rt "\"postComment\":{method:\"POST\",route:function(int320,segment1){return \"/api/slot/\"+int320+\"/\"+segment1+\"/comment\";}},"
  260   -- , jsRoute "postComment" postComment (slot)
  261   , rt "\"getTags\":{method:\"GET\",route:function(tagName0){return \"/api/tags/\"+tagName0+\"\";}},"
  262   -- , jsRoute "getTags" queryTags (Just tag)
  263   , rt "\"postTag\":{method:\"POST\",route:function(int320,segment1,tagName2){return \"/api/slot/\"+int320+\"/\"+segment1+\"/tag/\"+tagName2+\"\";}},"
  264   -- , jsRoute "postTag" postTag (JSON, slot, TagId False tag)
  265   , rt "\"postKeyword\":{method:\"POST\",route:function(int320,segment1,tagName2){return \"/api/slot/\"+int320+\"/\"+segment1+\"/keyword/\"+tagName2+\"\";}},"
  266   -- , jsRoute "postKeyword" postTag (JSON, slot, TagId True tag)
  267   , rt "\"deleteTag\":{method:\"DELETE\",route:function(int320,segment1,tagName2){return \"/api/slot/\"+int320+\"/\"+segment1+\"/tag/\"+tagName2+\"\";}},"
  268   -- , jsRoute "deleteTag" deleteTag (JSON, slot, TagId False tag)
  269   , rt "\"deleteKeyword\":{method:\"DELETE\",route:function(int320,segment1,tagName2){return \"/api/slot/\"+int320+\"/\"+segment1+\"/keyword/\"+tagName2+\"\";}},"
  270   -- , jsRoute "deleteKeyword" deleteTag (JSON, slot, TagId True tag)
  271   , rt "\"getTopTags\":{method:\"GET\",route:function(){return \"/api/tags\";}},"
  272   -- , jsRoute "getTopTags" queryTags Nothing
  273   , rt "\"getSiteActivity\":{method:\"GET\",route:function(){return \"/api/activity\";}},"
  274   -- , jsRoute "getSiteActivity" viewSiteActivity ()
  275 
  276   , rt "\"getNotifications\":{method:\"GET\",route:function(){return \"/api/notification\";}},"
  277   -- , jsRoute "getNotifications" viewNotifications ()
  278   , rt "\"deleteNotification\":{method:\"DELETE\",route:function(int320){return \"/api/notification/\"+int320+\"\";}},"
  279   -- , jsRoute "deleteNotification" deleteNotification (Id 0)
  280   , rt "\"deleteNotifications\":{method:\"DELETE\",route:function(){return \"/api/notification\";}},"
  281   -- , jsRoute "deleteNotifications" deleteNotifications ()
  282   , rt "\"getNotify\":{method:\"GET\",route:function(){return \"/api/notify\";}},"
  283   -- , jsRoute "getNotify" viewNotify ()
  284   , rt "\"postNotify\":{method:\"POST\",route:function(){return \"/api/notify\";}},"
  285   -- , jsRoute "postNotify" postNotify ()
  286 
  287   , rt "\"detectParticipantCSV\":{method:\"POST\",route:function(int320){return \"/api/volume/\"+int320+\"/detectParticipantCSV\";}},"
  288     -- , jsRoute "detectParticipantCSV" detectParticipantCSV (JSON, volume)
  289   , rt "\"runParticipantUpload\":{method:\"POST\",route:function(int320){return \"/api/volume/\"+int320+\"/runParticipantUpload\";}},"
  290     -- , jsRoute "runParticipantUpload" runParticipantUpload (JSON, volume)
  291   ]
  292 
  293 -- This type decl generated by copying out the text from GHC's warning message,
  294 -- then formatting with brittany.
  295 fakeBackendDepend1
  296     :: ( ActionRoute API
  297        , ActionRoute ()
  298        , ActionRoute ()
  299        , ActionRoute ()
  300        , ActionRoute (API, Id LoginToken)
  301        , ActionRoute (API, PartyTarget)
  302        , ActionRoute PartyTarget
  303        , ActionRoute API
  304        , ActionRoute (Id Party)
  305        , ActionRoute (API, PartyTarget)
  306        , ActionRoute (API, Id Volume)
  307        , Action
  308        , ActionRoute (Id Volume)
  309        , ActionRoute API
  310        , ActionRoute (Id Volume)
  311        , ActionRoute (Id Volume)
  312        , ActionRoute (API, Id Volume)
  313        , Bool -> ActionRoute (API, (Maybe (Id Volume), Id Slot))
  314        , ActionRoute (API, (Maybe (Id Volume), Id Slot))
  315        , ActionRoute (Maybe (Id Volume), Id Slot)
  316        , ActionRoute (Id Record)
  317        )
  318 fakeBackendDepend1 =
  319   ( viewRoot :: ActionRoute API
  320   , viewLogin :: ActionRoute ()
  321   , viewRegister :: ActionRoute ()
  322   , viewPasswordReset :: ActionRoute ()
  323   , viewLoginToken :: ActionRoute (API, Id LoginToken)
  324   , viewParty :: ActionRoute (API, PartyTarget)
  325   , viewPartyEdit :: ActionRoute PartyTarget
  326   , queryParties :: ActionRoute API
  327   , viewAvatar :: ActionRoute (Id Party)
  328   , viewPartyActivity :: ActionRoute (API, PartyTarget)
  329   , viewVolume :: ActionRoute (API, Id Volume)
  330   , viewVolumeCreateHandler :: Action
  331   , viewVolumeEdit :: ActionRoute (Id Volume)
  332   , queryVolumes :: ActionRoute (API)
  333   , thumbVolume :: ActionRoute (Id Volume)
  334   , csvVolume :: ActionRoute (Id Volume)
  335   , viewVolumeActivity :: ActionRoute (API, Id Volume)
  336   , viewSlot :: Bool -> ActionRoute (API, (Maybe (Id Volume), Id Slot))
  337   , viewContainerActivity :: ActionRoute (API, (Maybe (Id Volume), Id Slot))
  338   , thumbSlot :: ActionRoute (Maybe (Id Volume), Id Slot)
  339   , viewRecord :: ActionRoute (Id Record)
  340   )
  341 
  342 -- This type decl generated by copying out the text from GHC's warning message,
  343 -- then formatting with brittany.
  344 fakeBackendDepend2
  345     :: ( Action
  346        , Bool -> ActionRoute (API, Maybe (Id Volume), Id Slot, Id Asset)
  347        , ActionRoute (Id Slot, Id Asset)
  348        , ActionRoute (Id Slot, Id Asset)
  349        , Bool -> ActionRoute (Id Slot, Id Asset)
  350        , ActionRoute (Id Asset, Segment)
  351        , ActionRoute (Id Asset, Segment)
  352        , ActionRoute (Id Asset, Segment)
  353        , API -> Action
  354        , Bool -> ActionRoute (Maybe (Id Volume), Id Slot)
  355        , Bool -> ActionRoute (Id Volume)
  356        , ActionRoute (Id Volume)
  357        , ActionRoute API
  358        , API -> [(BS.ByteString, BS.ByteString)] -> Action
  359        , ActionRoute API
  360        , ActionRoute API
  361        , ActionRoute API
  362        , ActionRoute API
  363        , ActionRoute (API, Id LoginToken)
  364        , ActionRoute (API, Id LoginToken)
  365        )
  366 fakeBackendDepend2 =
  367   ( viewFormatsHandler :: Action
  368   , viewAssetSegment :: Bool -> ActionRoute (API, Maybe (Id Volume), Id Slot, Id Asset)
  369   , downloadAssetSegment :: ActionRoute (Id Slot, Id Asset)
  370   , downloadOrigAssetSegment :: ActionRoute (Id Slot, Id Asset)
  371   , thumbAssetSegment :: Bool -> ActionRoute (Id Slot, Id Asset)
  372   , downloadAsset :: ActionRoute (Id Asset, Segment)
  373   , downloadOrigAsset :: ActionRoute (Id Asset, Segment)
  374   , thumbAsset :: ActionRoute (Id Asset, Segment)
  375   , postSearchHandler :: API -> Action
  376   , zipContainer :: Bool -> ActionRoute (Maybe (Id Volume), Id Slot)
  377   , zipVolume :: Bool -> ActionRoute (Id Volume)
  378   , viewVolumeDescription :: ActionRoute (Id Volume)
  379   , viewRoot :: ActionRoute API
  380   , userHandler :: API -> [(BS.ByteString, BS.ByteString)] -> Action
  381   -- , postUser :: ActionRoute API
  382   , postLogin :: ActionRoute API
  383   , postLogout :: ActionRoute API
  384   , postRegister :: ActionRoute API
  385   , postPasswordReset :: ActionRoute API
  386   , viewLoginToken :: ActionRoute (API, Id LoginToken)
  387   , postPasswordToken :: ActionRoute (API, Id LoginToken)
  388   -- TODO: finish enumerating
  389   )
  390 
  391 fakeBackendDepend3, fakeBackendDepend4 :: ()
  392 fakeBackendDepend3 = ()
  393 fakeBackendDepend4 = ()