From 737baa82ff723860dd1dacaad131541636be5ab8 Mon Sep 17 00:00:00 2001 From: Alessandro Cerioni <acerioni@grandlyon.com> Date: Mon, 20 Jan 2020 10:52:57 +0100 Subject: [PATCH] Converged tree, naming ... --- docs/assets/mail-service.png | Bin 30655 -> 0 bytes docs/components/core/legacy-auth.md | 2 + .../admin-gui.md | 5 +++ .../{specific-apps => custom-apps}/web-app.md | 9 +++++ ...gacy-auth-middleware.md => legacy-auth.md} | 0 .../miscellaneous/maintenance-page.md | 0 .../off-the-shelf-apps/elasticsearch.md | 1 + .../proxies/web-mapping-services.md | 0 docs/components/services/changelog.md | 8 ++-- docs/components/services/credits.md | 12 ++++-- .../services/csv-catalog-downloader.md | 22 +++++++++++ .../services/{mail.md => mailer.md} | 37 +++++++++++------- .../{resources.md => resources-helper.md} | 0 docs/components/services/reuses.md | 0 .../services/social-media-share-helper.md | 0 docs/overview/index.md | 24 +++++++++--- 16 files changed, 91 insertions(+), 29 deletions(-) delete mode 100644 docs/assets/mail-service.png rename docs/components/{specific-apps => custom-apps}/admin-gui.md (95%) rename docs/components/{specific-apps => custom-apps}/web-app.md (97%) rename docs/components/middlewares/{legacy-auth-middleware.md => legacy-auth.md} (100%) create mode 100644 docs/components/miscellaneous/maintenance-page.md create mode 100644 docs/components/proxies/web-mapping-services.md rename docs/components/services/{mail.md => mailer.md} (57%) rename docs/components/services/{resources.md => resources-helper.md} (100%) create mode 100644 docs/components/services/reuses.md create mode 100644 docs/components/services/social-media-share-helper.md diff --git a/docs/assets/mail-service.png b/docs/assets/mail-service.png deleted file mode 100644 index 8729bfa95ca0ba053de7fc93efe1c81dae7db2db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30655 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 Hl+XkK9eX5- diff --git a/docs/components/core/legacy-auth.md b/docs/components/core/legacy-auth.md index b641de0..63139e1 100644 --- a/docs/components/core/legacy-auth.md +++ b/docs/components/core/legacy-auth.md @@ -1 +1,3 @@ # Legacy AUTH + +aliases & ES diff --git a/docs/components/specific-apps/admin-gui.md b/docs/components/custom-apps/admin-gui.md similarity index 95% rename from docs/components/specific-apps/admin-gui.md rename to docs/components/custom-apps/admin-gui.md index 7cd0892..4422a95 100644 --- a/docs/components/specific-apps/admin-gui.md +++ b/docs/components/custom-apps/admin-gui.md @@ -81,3 +81,8 @@ docker-compose --project-name admin-gui up ## Authentication It uses the same authentication methods as the portail data web app, so if you have an account you will be able to log in. However only a user belongging to the admin group will be able to create, modify and delete entities. The groups are managed by the api gateway, for more information refer to the [Authentication and Authorization](../../miscellaneous/authentication&authorization.md) section. + + +## TO DEVELOP + +The management of images w/ respect to the Organizations and Credits services on the one hand, the Media Library on the other. diff --git a/docs/components/specific-apps/web-app.md b/docs/components/custom-apps/web-app.md similarity index 97% rename from docs/components/specific-apps/web-app.md rename to docs/components/custom-apps/web-app.md index 66c7600..a226ecb 100644 --- a/docs/components/specific-apps/web-app.md +++ b/docs/components/custom-apps/web-app.md @@ -53,3 +53,12 @@ So we used...Elasticsearch. It is super fast and even have geographical research ## Credits ## Licence + + +### TODO + +bannière accés restreint +drafts +MVT+WMS +listing of data accesses ? +button for license ? diff --git a/docs/components/middlewares/legacy-auth-middleware.md b/docs/components/middlewares/legacy-auth.md similarity index 100% rename from docs/components/middlewares/legacy-auth-middleware.md rename to docs/components/middlewares/legacy-auth.md diff --git a/docs/components/miscellaneous/maintenance-page.md b/docs/components/miscellaneous/maintenance-page.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/components/off-the-shelf-apps/elasticsearch.md b/docs/components/off-the-shelf-apps/elasticsearch.md index e69de29..7af3f92 100644 --- a/docs/components/off-the-shelf-apps/elasticsearch.md +++ b/docs/components/off-the-shelf-apps/elasticsearch.md @@ -0,0 +1 @@ +Quid de la couche AUTHZ ? diff --git a/docs/components/proxies/web-mapping-services.md b/docs/components/proxies/web-mapping-services.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/components/services/changelog.md b/docs/components/services/changelog.md index 1d58de4..d81dd7b 100644 --- a/docs/components/services/changelog.md +++ b/docs/components/services/changelog.md @@ -2,13 +2,13 @@ ## Features -This service allows end-users to keep track of the improvements that are applied to this project throughout its development. improvements are classified by three categories: +This service allows end-users to keep track of the improvements that are applied to this project throughout its development. Such improvements are classified by three categories: 1. bugfixes 2. minor improvements 3. major improvements -Information it typically entered by developers and eventually presented to end-users via a dedicated page of data.grandlyon.com Web Portal. +Information is typically entered by developers and presented to end-users via a dedicated page of data.grandlyon.com Web Portal. A record in the underlying database includes the following information: @@ -20,7 +20,7 @@ A record in the underlying database includes the following information: * `bugFixes`: a list of bugfixes; * `minorImprovements`: a list of minor improvements; * `majorImprovements`: a list of major improvements; -* `language`: the language it is typed in, either French of English. In fact, each changelog event is entered twice, once in French, once in English, in order for the log to be bilingual. +* `language`: the language in which information is typed in, either French of English. In fact, each changelog event is entered twice, once in French, once in English, in order for the resulting log to be bilingual. Bugfixes, minor and major improvements are simply modeled as strings of characters. @@ -30,7 +30,7 @@ This service has no dependency on other components. ## Endpoints -This service exposes one single endpoint, `/changelog`, supporting all the CRUD methods in a RESTful fashion. +This service exposes one single endpoint, `/changelog`, supporting all the CRUD methods in a RESTful fashion. An healthcheck endpoint is exposed as well, `/health`, returning a `200` HTTP code when all indicators are healthy, `503` in the opposite case. The service is considered to be healthy if the underlying database is up. ## Implementation The service is implemented using the [NestJS](https://nestjs.com/) framework. We refer the reader to the [NestJS-based micro-services](../../miscellaneous/nestjs-micro-services.md) page for further details concerning the latter framework and the features it provides. diff --git a/docs/components/services/credits.md b/docs/components/services/credits.md index 1fbced9..7a3da9f 100644 --- a/docs/components/services/credits.md +++ b/docs/components/services/credits.md @@ -2,7 +2,7 @@ ## Features -This service allows one to manage a catalog of the Open Source initiatives enabling and powering this development project. +This service allows the editorial team to manage a catalog of the Open Source initiatives enabling and powering this development project. Each record of the catalog includes the following information: @@ -22,10 +22,14 @@ This service has no dependency on other components. The service provides two endpoints, -1. `/credits` -2. `/links` +1. `/credits`; +2. `/links`, -allowing one to perform CRUD operations on credits and links in a RESTful manner. +allowing one to perform CRUD operations on credits and links in a RESTful manner. Moreover, an healtcheck endpoint is provided, + +3. `/health`, + +returning a `200` HTTP code if the API is healthy, `503` otherwise. For the service to be healthy, the underlying database must be up. ## Implementation diff --git a/docs/components/services/csv-catalog-downloader.md b/docs/components/services/csv-catalog-downloader.md index e69de29..060155d 100644 --- a/docs/components/services/csv-catalog-downloader.md +++ b/docs/components/services/csv-catalog-downloader.md @@ -0,0 +1,22 @@ +# CSV Catalog Downloader + +## Features + +This service allows end-users to download a CSV export of the metadata catalog. Such export is generated by submitting a query to a dedicated endpoint of one of the HTTP APIs exposed by GeoNetwork. As the latter query is typically resolved by GeoNetwork in a few minutes time, this service was initially conceived as a **cache layer**, preventing end-users from waiting for such a considerable amount of time. Beyond acting as a cache layer, this service also performs the following transformations: + +* the column separator used by GeoNetwork, `###`, is replaced by a more conventional comma; +* the exported CSV file is encoded either in UTF-8 or WINDOWS-1252 depending on the `User-Agent` header of the incoming requests. + +data.grandlyon.com's metadata catalog being refreshed at most once per day, overnight, this service refreshes its cache with the same frequency. + +## Dependencies + +This service only depends on GeoNetwork. + +## Endpoints + +The service exposes only one endpoint, `/`, returning a CSV file as attachment. + +## Implementation + +The service is implemented in the Python language, using [Flask](https://palletsprojects.com/p/flask/) as Web framework, [Gunicorn](https://gunicorn.org/) as WSGI HTTP Server and the [Advanced Python Scheduler](https://apscheduler.readthedocs.io/en/stable/) to schedule daily updates of the cache. diff --git a/docs/components/services/mail.md b/docs/components/services/mailer.md similarity index 57% rename from docs/components/services/mail.md rename to docs/components/services/mailer.md index f744854..b4ec516 100644 --- a/docs/components/services/mail.md +++ b/docs/components/services/mailer.md @@ -1,9 +1,27 @@ # Mail service -## What it does +## Features This service allow to deliver mails to any email address from the address specified in the configuration. It also provides two particular endpoints, one for the user to give a feedback and another one for general contact purpose. Those endpoints will both send an email to the admin address specified in the configuration. + +## Dependencies + +## Endpoints + +`/contact`: formulaire de contact + +`/feedback`: + +`/send` + + +`/health` This service will return a `200` http status code when all indicators are healthy. Otherwise it will return a `503` http status code. +For this service we declared an health indicator that verify that the connection to the SMTP Server is available. + +## Implementation + + ## How it works  @@ -16,21 +34,10 @@ However the service does not send this JSON directly to the distant SMTP server. NestJS provides a [swagger module](https://docs.nestjs.com/recipes/swagger) that can be easily integrated. Using specific annotations alongside your endpoints declaration, this module will automatically generates a swagger documentation, reachable at `/api-doc`. -## Service health - -NestJS provides a [health module](https://github.com/nestjs/terminus) based on Terminus, that gives you the opportunity to declare predefined or custom health indicators. It exposes the health status of the service at `/health`. -This service will return a `200` http status code when all indicators are healthy. Otherwise it will return a `503` http status code. - -For this service we declared an health indicator that verify that the connection to the RabbitMQ is available. -## Stats -We are using a Node module called [swagger-stats](http://swaggerstats.io/). -It traces API calls, monitors API performance and usage statistics. It exposes the metrics in different formats, such as Prometheus format, so you may use Prometheus and Graphana for API monitoring and alerting. -Those metrics are available at `/swagger-stats/metrics`. +## Templates -For more information about this module, visit the [official swagger-stat page](http://swaggerstats.io/docs.html). +## AUTHZ -## Docker -It is possible to run this service using Docker containers, using the `docker-compose.yml` and `Dockerfile` files. -For more information, refer to the project [service-email][add a link] \ No newline at end of file +email-writer diff --git a/docs/components/services/resources.md b/docs/components/services/resources-helper.md similarity index 100% rename from docs/components/services/resources.md rename to docs/components/services/resources-helper.md diff --git a/docs/components/services/reuses.md b/docs/components/services/reuses.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/components/services/social-media-share-helper.md b/docs/components/services/social-media-share-helper.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/overview/index.md b/docs/overview/index.md index f672c19..855d87c 100644 --- a/docs/overview/index.md +++ b/docs/overview/index.md @@ -40,7 +40,7 @@ The data.grandlyon.com's Web Portal includes the following main features: Concerned entity | ID - Description | Users --- | --- | --- -Datasets | F1 - Presenting metadata (title, description, terms, ...) <br> F2 - Showing tabular views of data (if applicable) <br> F3 - Showing map views of data (if applicable) <br> F4 - Showing linked resources (APIs, files) <br> F5 - Performing full-text searches against data and metadata <br> F6 - Performing faceted searches against metadata <br> F7 - Composing custom queries against the Core APIs | end-users +Datasets | F0 - Download the entire dataset catalog as a CSV file <br> F1 - Presenting metadata (title, description, terms, ...) <br> F2 - Showing tabular views of data (if applicable) <br> F3 - Showing map views of data (if applicable) <br> F4 - Showing linked resources (APIs, files) <br> F5 - Performing full-text searches against data and metadata <br> F6 - Performing faceted searches against metadata <br> F7 - Composing custom queries against the Core APIs | end-users Users | F8 - Creating/updating/deleting accounts <br> F9 - Performing logins and logouts <br> F10 - Gaining access to restricted-access resources <br> | end-users Editorial Content | F11 - Editing static pages (approach, terms of use, ...) <br> F12 - Displaying static pages (approach, terms of use, ...) <br> F13 - Editing articles <br> F14 - Displaying articles <br> F15 - Editing the catalog of partners (data producers, ...) <br> F16 - Displaying the catalog of partners (data producers, ...) <br> F17 - Editing the catalog of data reuses (applications, websites, articles, ...) <br> F18 - Displaying the catalog of data reuses (applications, websites, articles, ...) <br> F19 - Editing the catalog of the Open Source initiatives powering this project <br> F20 - Displaying the catalog of the Open Source initiatives powering this project | back-office <br> end-users <br> back-office <br> end-users <br> back-office <br> end-users <br> back-office <br> end-users <br> back-office <br> end-users Support | F21 - Allowing users to contact the user support | end-users @@ -79,7 +79,7 @@ The following table lists, in alphabetical order, the components of data.grandly ID | Name | Type | Website | Usage --- | --- | --- | --- | --- -C1 | Legacy AUTH | specific | | AUTHN/AUTHZ service +C1 | Legacy AUTH | custom | | AUTHN/AUTHZ service C2 | PostgreSQL + PostGIS | off-the-shelf | [Link](https://postgis.net/) | Data Source C3 | GeoNetwork | off-the-shelf | [Link](https://www.geonetwork-opensource.org/) | Metadata Catalog C4 | MapServer | off-the-shelf | [Link](https://mapserver.org/) | WMS and MVT Server @@ -112,7 +112,7 @@ M1 | Legacy AUTH | ... | ... | Facilitating the interaction between the Web Port ID | Name | Repo | Doc | Usage | Deps --- | --- | --- | --- | --- | --- -P1 | Map Proxy | ... | ... | Proxying requests that the Web Portal performs against the cartographic Web Services (WMS, MVT) hosted by data.grandlyon.com's Core macro-component| C4 +P1 | Map Proxy | ... | ... | Proxying requests that the Web Portal performs against the cartographic Web Services (WMS, MVT) hosted by data.grandlyon.com's Core macro-component| A1, C4 @@ -142,19 +142,31 @@ ID | Name | Repo | Doc | Usage | Deps S1 | Authentication | ... | [Link](../components/services/authentication.md) | Allowing users to create accounts and to perform logins and logouts | A3, S5 S2 | Changelog | [Link](https://gitlab.alpha.grandlyon.com/refonte-data/service-changelog) | [Link](../components/services/changelog.md) | Keeping track of the new features available to users throughout the developments| S3 | Credits | ... | [Link](../components/services/credits.md) | Catalog of the Open Source initiatives powering the data.grandlyon.com project | | -S4 | CSV Catalog Downloader | ... | ... | Allowing users to download cached CSV exports of the metadata catalog | C3 | -S5 | Mail | ... | [Link](../components/services/mail.md) | Sending e-mails to both end- and back-office users | A6 +S4 | CSV Catalog Downloader | ... | [Link](../components/services/csv-catalog-downloader.md) | Allowing users to download cached CSV exports of the metadata catalog | C3 | +S5 | Mailer | ... | [Link](../components/services/mail.md) | Sending e-mails to both end- and back-office users | A6 S6 | Media Library | ... | ... | Managing the images shown across the various pages of the Web Portal (organizations, posts, ...) | S7 | Organizations | ... | ... | A catalog of the partners of the data.grandlyon.com, typically Data Providers | S6 S8 | Resources Helper | ... | ... | Assisting users in the composition of custom queries against the Core APIs | S9 | Reuses | ... | ... | A catalog of the known reuses of the data shared through data.grandlyon.com | S6 +S10 | Social Media Share Helper -### Specific applications +### Custom applications ID | Name | Repo | Doc | Usage | Deps --- | --- | --- | --- | --- | --- D1 | Web App | ... | ... | Web Application representing the actual Web Portal as seen by its end-users | S[1,9] D2 | Admin GUI | ... | ... | Back-office oriented web application allowing users to administrate some of the editorial content as well as the configuration of some functionality | S[1,3], S[6,9] +### Miscellaneous + +ID | Name | Repo | Doc | Usage | Deps +--- | --- | --- | --- | --- | --- +M1 | Maintenance Page | ... | ... | <!-- <span id="test">mon test</span> <a href='#test'>link</a> --> + + +# TODO + +* Elasticsearch -> off-the-shelf app + custom cache & AUTHZ layer +* Scripts related to the Kong setup -- GitLab