Fosi Fossil Service
Small teams. Open source. Built on Fossil.

CaaS / Lamina

Unified Management for Fossil Repositories

Public | Owner: CaaS | Default branch: trunk | Last update: 2026-10-25 00:41

Artifact 93147b503e040bed23ac5d0cbf466fcb4d17662fd5ad6a3518f50e9f1a9fd7c9:


(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)))

Clone

You can clone this repository with the following command:

fossil clone https://fosi.dev/CaaS/Lamina

Contribute

The best way to contribute is through e-mail. See the project documentation for more details.