mirror of
				https://github.com/TheAnachronism/docspell.git
				synced 2025-10-25 22:50:12 +00:00 
			
		
		
		
	Streamline routing
- put openapi doc behind `api/doc` instead of `app/doc` - don't require `index.html` for the webapp
This commit is contained in:
		| @@ -45,7 +45,7 @@ server. If it is deployed at `http://localhost:7880`, then check this | ||||
| url: | ||||
|  | ||||
| ``` | ||||
| http://localhost:7880/app/doc | ||||
| http://localhost:7880/api/doc | ||||
| ``` | ||||
|  | ||||
| ## Examples | ||||
|   | ||||
| @@ -150,8 +150,8 @@ $ ./docspell-joex*/bin/docspell-joex /path/to/joex-config.conf | ||||
| ``` | ||||
|  | ||||
| After starting the rest server, you can reach the web application at | ||||
| path `/app/index.html`, so using default values it would be | ||||
| `http://localhost:7880/app/index.html`. | ||||
| path `/app`, so using default values it would be | ||||
| `http://localhost:7880/app`. | ||||
|  | ||||
| You should be able to create a new account and sign in. Check the | ||||
| [configuration page](configure.html) to further customize docspell. | ||||
|   | ||||
| @@ -53,7 +53,7 @@ Example screenshot: | ||||
|  | ||||
| This example shows a source with name "test". It defines two urls: | ||||
|  | ||||
| - `/app/index.html#/upload/<id>` | ||||
| - `/app#/upload/<id>` | ||||
| - `/api/v1/open/upload/item/<id>` | ||||
|  | ||||
| The first points to a web page where everyone could upload files into | ||||
|   | ||||
| @@ -42,7 +42,7 @@ really required, but improves OCR. | ||||
|    $ ./docspell-joex*/bin/docspell-joex | ||||
|    ``` | ||||
|    in the other. | ||||
| 4. Point your browser to: <http://localhost:7880/app/index.html> | ||||
| 4. Point your browser to: <http://localhost:7880/app> | ||||
| 5. Register a new account, sign in and try it. | ||||
|  | ||||
| Check the [documentation](doc.html) for more information on how to use | ||||
|   | ||||
| @@ -22,17 +22,18 @@ object RestServer { | ||||
|       blocker: Blocker | ||||
|   )(implicit T: Timer[F], CS: ContextShift[F]): Stream[F, Nothing] = { | ||||
|  | ||||
|     val templates = TemplateRoutes[F](blocker, cfg) | ||||
|     val app = for { | ||||
|       restApp <- RestAppImpl.create[F](cfg, connectEC, httpClientEc, blocker) | ||||
|  | ||||
|       httpApp = Router( | ||||
|         "/api/info"     -> routes.InfoRoutes(), | ||||
|         "/api/v1/open/" -> openRoutes(cfg, restApp), | ||||
|         "/api/v1/sec/" -> Authenticate(restApp.backend.login, cfg.auth) { token => | ||||
|           securedRoutes(cfg, restApp, token) | ||||
|         }, | ||||
|         "/api/doc" -> templates.doc, | ||||
|         "/app/assets" -> WebjarRoutes.appRoutes[F](blocker), | ||||
|         "/app"        -> TemplateRoutes[F](blocker, cfg) | ||||
|         "/app"        -> templates.app | ||||
|       ).orNotFound | ||||
|  | ||||
|       finalHttpApp = Logger.httpApp(logHeaders = false, logBody = false)(httpApp) | ||||
|   | ||||
| @@ -21,7 +21,7 @@ object Flags { | ||||
|       cfg.appName, | ||||
|       cfg.baseUrl, | ||||
|       cfg.backend.signup.mode, | ||||
|       s"assets/docspell-webapp/${BuildInfo.version}" | ||||
|       s"/app/assets/docspell-webapp/${BuildInfo.version}" | ||||
|     ) | ||||
|  | ||||
|   implicit val jsonEncoder: Encoder[Flags] = | ||||
|   | ||||
| @@ -21,25 +21,36 @@ object TemplateRoutes { | ||||
|  | ||||
|   val `text/html` = new MediaType("text", "html") | ||||
|  | ||||
|   trait InnerRoutes[F[_]] { | ||||
|     def doc: HttpRoutes[F] | ||||
|     def app: HttpRoutes[F] | ||||
|   } | ||||
|  | ||||
|   def apply[F[_]: Effect](blocker: Blocker, cfg: Config)( | ||||
|       implicit C: ContextShift[F] | ||||
|   ): HttpRoutes[F] = { | ||||
|   ): InnerRoutes[F] = { | ||||
|     val indexTemplate = memo(loadResource("/index.html").flatMap(loadTemplate(_, blocker))) | ||||
|     val docTemplate   = memo(loadResource("/doc.html").flatMap(loadTemplate(_, blocker))) | ||||
|  | ||||
|     val dsl = new Http4sDsl[F] {} | ||||
|     import dsl._ | ||||
|     HttpRoutes.of[F] { | ||||
|       case GET -> Root / "index.html" => | ||||
|         for { | ||||
|           templ <- indexTemplate | ||||
|           resp  <- Ok(IndexData(cfg).render(templ), `Content-Type`(`text/html`)) | ||||
|         } yield resp | ||||
|       case GET -> Root / "doc" => | ||||
|         for { | ||||
|           templ <- docTemplate | ||||
|           resp  <- Ok(DocData().render(templ), `Content-Type`(`text/html`)) | ||||
|         } yield resp | ||||
|     new InnerRoutes[F] { | ||||
|       def doc = | ||||
|         HttpRoutes.of[F] { | ||||
|           case GET -> Root  => | ||||
|             for { | ||||
|               templ <- docTemplate | ||||
|               resp  <- Ok(DocData().render(templ), `Content-Type`(`text/html`)) | ||||
|             } yield resp | ||||
|         } | ||||
|       def app = | ||||
|         HttpRoutes.of[F] { | ||||
|           case GET -> _ => | ||||
|             for { | ||||
|               templ <- indexTemplate | ||||
|               resp  <- Ok(IndexData(cfg).render(templ), `Content-Type`(`text/html`)) | ||||
|             } yield resp | ||||
|         } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -196,7 +196,7 @@ urlInfoMessage flags model = | ||||
|                 , dd [] | ||||
|                     [ let | ||||
|                         url = | ||||
|                             flags.config.baseUrl ++ "/app/index.html#/upload/" ++ model.source.id | ||||
|                             flags.config.baseUrl ++ "/app#/upload/" ++ model.source.id | ||||
|                       in | ||||
|                       a [ href url, target "_blank" ] [ code [] [ text url ] ] | ||||
|                     ] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user