(defmodule lamina_router
(behaviour nova_router)
(export all))
(defun routes (_environment)
(let* ((main-routes
(list
(tuple "/" #'lamina_pages:index/1 #M(methods (get)))
(tuple "/docs" #'lamina_docs_pages:show/1 #M(methods (get)))
(tuple "/docs/[...]" #'lamina_docs_pages:show/1 #M(methods (get) extra_state #M()))
(tuple "/library" #'lamina_library_pages:show/1 #M(methods (get)))
(tuple "/library/[...]" #'lamina_library_pages:show/1 #M(methods (get) extra_state #M()))
(tuple "/setup" #'lamina_setup_pages:show/1 #M(methods (get)))
(tuple "/setup/step/:n" #'lamina_setup_pages:step/1 #M(methods (post)))
(tuple "/login" #'lamina_login_pages:show/1 #M(methods (get)))
(tuple "/login" #'lamina_login_pages:do-login/1 #M(methods (post)))
(tuple "/logout" #'lamina_login_pages:do-logout/1 #M(methods (get)))
(tuple 500 #'lamina_error_pages:server-error/1 #M())
;; 未匹配的公开路径交给反代;具体是否是仓库由 h_proxy 查询 DB 决定。
;; Nova augments wildcard routes with pathinfo and expects a map
;; in extra_state before doing so.
(tuple "/[...]" #'h_proxy:handle/1 #M(methods (get head post) extra_state #M()))
))
(admin-routes
(list
(tuple "/" #'lamina_admin_pages:dashboard/1 #M(methods (get)))
(tuple "/repos" #'lamina_admin_pages:repos/1 #M(methods (get)))
(tuple "/repos/new" #'lamina_admin_pages:repo-new/1 #M(methods (get)))
(tuple "/repos/new" #'lamina_admin_pages:repo-create/1 #M(methods (post)))
(tuple "/repos/:id/edit" #'lamina_admin_pages:repo-edit/1 #M(methods (get)))
(tuple "/repos/:id/edit" #'lamina_admin_pages:repo-update/1 #M(methods (post)))
(tuple "/repos/:id/delete" #'lamina_admin_pages:repo-delete-confirm/1 #M(methods (get)))
(tuple "/repos/:id/delete" #'lamina_admin_pages:repo-delete/1 #M(methods (post)))
(tuple "/repos/:id/sync" #'lamina_admin_pages:repo-sync/1 #M(methods (post)))
(tuple "/repos/:id/push" #'lamina_admin_pages:repo-push/1 #M(methods (post)))
(tuple "/orgs" #'lamina_admin_pages:orgs/1 #M(methods (get)))
(tuple "/docs" #'lamina_docs_admin:show/1 #M(methods (get)))
(tuple "/docs" #'lamina_docs_admin:save/1 #M(methods (post)))
(tuple "/library" #'lamina_library_admin:show/1 #M(methods (get)))
(tuple "/library" #'lamina_library_admin:save/1 #M(methods (post)))
(tuple "/settings" #'lamina_admin_pages:settings/1 #M(methods (get)))
(tuple "/settings" #'lamina_admin_pages:settings-update/1 #M(methods (post)))
(tuple "/orgs/new" #'lamina_admin_pages:org-new/1 #M(methods (get)))
(tuple "/orgs/new" #'lamina_admin_pages:org-create/1 #M(methods (post)))
(tuple "/orgs/:id/edit" #'lamina_admin_pages:org-edit/1 #M(methods (get)))
(tuple "/orgs/:id/edit" #'lamina_admin_pages:org-update/1 #M(methods (post)))
(tuple "/orgs/:id/delete" #'lamina_admin_pages:org-delete-confirm/1 #M(methods (get)))
(tuple "/orgs/:id/delete" #'lamina_admin_pages:org-delete/1 #M(methods (post)))
))
(plugin-opts
(maps:from_list
(list (tuple 'read_urlencoded_body 'true)
(tuple 'parse_qs 'true))))
(request-plugins
(list
(tuple 'pre_request 'nova_request_plugin plugin-opts)
(tuple 'post_request 'nova_request_plugin plugin-opts)))
(public-group
(maps:from_list
(list (tuple 'prefix "")
(tuple 'security 'false)
(tuple 'plugins request-plugins)
(tuple 'routes main-routes))))
(admin-group
(maps:from_list
(list (tuple 'prefix "/admin")
(tuple 'security #'lamina_admin_pages:auth-check/1)
(tuple 'plugins request-plugins)
(tuple 'routes admin-routes)))))
(list public-group admin-group)))