From 453aca56d1599605b43babc64d13b8032d2a6c19 Mon Sep 17 00:00:00 2001 From: ncastejon <castejon.nicolas@gmail.com> Date: Thu, 6 Jun 2019 15:26:13 +0200 Subject: [PATCH] Init the cms documentation (with ghost logo) --- architecture/cms.md | 19 +++++++++++++++++++ assets/ghost-logo.png | Bin 0 -> 7223 bytes 2 files changed, 19 insertions(+) create mode 100644 assets/ghost-logo.png diff --git a/architecture/cms.md b/architecture/cms.md index e69de29..1424d65 100644 --- a/architecture/cms.md +++ b/architecture/cms.md @@ -0,0 +1,19 @@ +# Content Management System (CMS) + +For all the editorial content on the portal one CMS is used to offer the possibility to non-developper person to add content. + +## Ghost: headless CMS + + + +The choice went for the open source CMS [Ghost](https://ghost.org/), replacing Wordpress as our first choice at the beginning of the project. +Whereas it's not perfect and there is still room for improvement, this is a great tool to use to create content in a beautiful user interface. The API allows us to get all the information needed for the web application by a REST API. + + + ## Hooks for indexing it inside Elasticsearch +The CMS offers a hooks functionnality. Put it simply, you can trigger any API call after some events. +In our case, after saving a page or an article, the Elasticsearch (ES) indexer service will be called to re-index the article or the page which was just modified. In few seconds the modification will be visible inside the webapp without any manual manipulation. + +## Integration into the webapp + After the content is indexed inside ES, very little work is needed to integrate it into the web application. + The content actually retrieved as HTML, and the code is pretty clean, so very few CSS adjustment is needed to display a nice article. diff --git a/assets/ghost-logo.png b/assets/ghost-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..14777f97d9a5d790b50ef0a8ae4e4a0e6e1ff8b1 GIT binary patch literal 7223 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 literal 0 HcmV?d00001 -- GitLab