Hypertopic / Porphyry

Corpus analyses confrontation
https://hypertopic.org/porphyry
GNU Affero General Public License v3.0
21 stars 165 forks source link

Get notified on corpus changes #501

Open cedricleandres opened 3 years ago

cedricleandres commented 3 years ago

Description

A given user, interested in a corpus, could register to a corpus in order to be notified whenever something has been modified in this corpus.

What is the valuable outcome that cannot be achieved with current features?

For which stakeholder (people, role, project, domain) is it important?

Which user action should be enabled (or restricted)? For who?

Additional details (solutions you think about, or workarounds you tried)

Deliverables status

Phase 1

Phase 2

Phase 3

sarah-ngn commented 3 years ago

Dans le cadre de Graines d'artistes, cette fonctionnalité permettra en quelque sorte de fidéliser le visiteur en lui permettant d'être informé lorsqu'un changement a été fait sur le corpus comme par exemple l'ajout d'une nouvelle œuvre.

cedricleandres commented 3 years ago

Dans le cadre de Graines d'artistes, ce ticket est assigné aux binômes: Rédaction de scenario : @sarah-ngn et @cedricleandres Conception de la maquette : @TristanGdc et @therealdarkflamemaster Stratégie d'implémentation : @ThomasSobrecases et @lildelfino

cedricleandres commented 3 years ago

Pour le groupe graines d'artistes :

Les scénarios "Etre informé de l'ajout d'un item" et "Etre informé de la modification d'un item" ont pu être validés. Cependant dans un soucis de cohérence avec le second ticket "Subscribe to a topic" de notre groupe, nous devons encore ajouter un scénario correspondant à l'abonnement de l'utilisateur à un corpus, avant de passer au livrable suivant.

Concernant les maquettes, il faudra rajouter une maquette utilisant un autre lecteur RSS.

Enfin la rédaction de la stratégie d'implémentation n'est pas encore achevée, il reste à déterminer la meilleure manière de récupérer les attributs d'un item notamment la date de modification du dernier contributeur. @benel

benel commented 3 years ago

@cedricleandres @sarah-ngn N'oubliez pas de mettre les scénario finaux (vous auriez même pu les faire avec des brouillons), directement dans le ticket. C'est une bonne manière de documenter la fonctionnalité.

sarah-ngn commented 3 years ago

Ancienne version des scénarios :

Fonctionnalité: S'abonner à un corpus
Scénario: 
Soit l'utilisateur sur la page d'accueil
Et l'utilisateur s'abonne au corpus “Dessins”
Alors l'utilisateur est abonné au corpus “Dessins”  dans son client RSS

Fonctionnalité: Être informé de l'ajout d'un item
Scénario :
Soit l'utilisateur est abonné au corpus "Dessins"
Quand l'item "1994_6-9_11_ROM_R_C" est ajouté au corpus
Alors l'utilisateur est informé de l'ajout de l'item "1994_6-9_11_ROM_R_C" par une notification dans son client RSS

Fonctionnalité: Être informé de la modification d'un item
Scénario : 
Soit l'utilisateur est  abonné au corpus "Dessins"
Quand l'item "1994_6-9_11_ROM_R_C" est modifié
Alors l'utilisateur est informé de l'ajout de l'item  "1994_6-9_11_ROM_R_C" par une notification dans son client RSS
sarah-ngn commented 3 years ago

Nouvelle version des scénarios :

Fonctionnalité : Etre informé, recevoir une notification 

Scénario 1 : Être informé de l'ajout de l'item
Suite à  l'abonnement au corpus "Dessins"
Suite à l'ajout de l'item "1994_6-9_11_ROM_R_C" 
Alors l'utilisateur sera informé par une notification dans son client RSS

Scénario 2 : Être informé de la modification d'un item
Suite à  l'abonnement au corpus "Dessins"
Suite à la modification de l'item "1994_6-9_11_ROM_R_C" 
Alors l'utilisateur sera informé par une notification dans son client RSS
benel commented 3 years ago

Voir commentaires dans l'autre discussion...

benel commented 3 years ago

@ThomasSobrecases @lildelfino

Bonne nouvelle : pour vous faciliter le travail, j'ai développé la partie backend (Argos) de votre fonctionnalité :
désormais, à chaque modification d'un objet, le nom de l'auteur et la date de la dernière modification sont ajoutés automatiquement à l'objet.

Ça ressemple à cela :

  "record":{
    "contributor":"alice",
    "modified":"2021-06-01T18:48:36.381Z"
  }

Vous retrouverez donc dans la vue du corpus ces données pour tout item modifié (à partir de maintenant). Ce sont les données qui vous manquaient pour générer le flux RSS dans le frontend (Porphyry).

lildelfino commented 3 years ago

Ce serait bien de tenir cette discussion dans le ticket lui-même. En effet, les livrables bien que faisables en parallèle ne sont pas complètement indépendant. Il est important de savoir ce que font les autres à côté.

@benel

Je copie la discussion ici, je vous ai également répondu tout en bas de cette publication :

Bonjour, voici la stratégie d'implémentation à laquelle nous avons réfléchi avec @ThomasSobrecases :

L’idée générale pour implémenter cette fonctionnalité serait de créer un flux RSS pour chaque corpus du site, afin que n’importe qui puisse les récupérer et le consulter via des sites comme Feedly, The old reader, etc… Créer notre propre lecteur RSS semble trop compliqué à implémenter en même temps, mais pourrait faire l’objet d’un autre ticket.

Quelle partie du code sera impactée (classes, méthodes) ?

La première chose à faire est de créer le bouton permettant au visiteur de récupérer le flux. Il faut donc ajouter une nouvelle classe FluxRSS afin de définir les différentes méthodes du flux. On ajoutera ensuite un bouton dans la classe Header.jsx.

Le bouton donne un lien comme https://dessins.porphyry.org/corpus.xml, lien vers le fichier XML lié au flux RSS de notre corpus entier.

Ensuite il faudra : Écrire une fonction (probablement dans un nouveau fichier .js dans le dossier src) de création de flux (voir librairie utilisée) Écrire une fonction qui transforme les informations d’un items en un fichier XML compatible avec un lecteur de flux RSS (voir librairie utilisée). Ainsi à chaque création d’un nouvel item la fonction sera appelée, mais aussi à chaque modification d’un item. Cette fonction sera implémentée dans la classe Item (item.jsx) pour avoir facilement accès aux attributs et être facilement appelée quand on en a besoin. En effet, elle serait appelée dans les fonctions de construction et de modification d’un item.

Si le code est fonctionnel, le un fichier xml pour le feed créé sera mis à jour à chaque modification/création d’un item, permettant, à partir d’un agrégateur de flux rss, d’avoir un aperçu de l’item et un lien vers porphyry pour constater les changements.

Y aura-t-il des difficultés d'un point de vue algorithmique ? Avez-vous des pistes pour les résoudre ?

Non, la difficulté réside plus dans l’organisation des fichiers, des classes et des méthodes que dans un quelconque algorithme.

Les données dont vous avez besoin sont-elles déjà chargées par la page ? Si oui, quelle est la structure des données et comment allez-vous récupérer précisément celles qui vous intéressent ? Si non, quelle sera la requête la plus efficace et comment allez-vous récupérer dans la structure de données précisément celles qui vous intéressent ?

Les données envoyées sont celles entrées à la création d’un item, quand l’item est créé on peut donc directement les récupérer pour créer notre flux RSS avant de les envoyer dans la bdd. Par contre lors de la modification d’un item on devra sûrement faire appel aux fonctions _getAttributes(), getString(this.state.item.name), etc… pour que toutes les informations sur l’item soient ajoutées dans le flux, pas seulement les informations sur les modifications effectuées.

Existe-t-il des bibliothèques qui pourraient simplifier l'implémentation ?

https://github.com/phi-jp/rss-generator : cette bibliothèque JS permet de simplifier la génération de fichier XML adaptés aux flux RSS. Elle permettait de :

Créer un feed (un feed par corpus)
Créer un item de feed (ici il s’agirait d’un item décrivant donc les items de porphyry)
Créer/mettre à jour un code XML lié au feed

Probablement que ce code XML devra être stocké dans la bdd aux côtés des items, et non dans les fichiers source du projet React. Sinon il ne pourrait pas être récupéré et mis à jour facilement pour le client.

Doit-on intégrer des services extérieurs (ex : cartographie) ? De quelles fonctionnalités en particulier aura-t-on besoin ? Est-ce que le service choisi les propose ou doit-on passer chez un concurrent ? Comment s'utilisent ces fonctionnalités ? avec quels paramètres ?

Des services extérieurs seront nécessaires pour utiliser la fonctionnalité mais ils ne seront pas à intégrer dans notre application ; on fournit simplement le fichier permettant aux services de lire notre flux.

Des étapes préalables de développement, testables, sont-elles envisageables afin de diminuer la complexité de la livraison ? Refactoring (livrable à part entière, isofonctionnel) ? Code développable et testable de manière externe au logiciel ? Étape du scénario (non livrable en tant que tel mais dont l’effet peut être testé) ?

Il faudrait tester en amont la librairie de création de XML pour obtenir le rendu que l’on souhaite facilement en terme de flux RSS, une fois satisfait du rendu on pourra implémenter ce que l’on a fait dans le code final.

@lildelfino @ThomasSobrecases

L'idée serait donc d'ajouter la fonction updatefun(), avec dans l'argument doc l'ensemble des attributs de l'item, et dans req l'id de l'item crée/modifié ?

C'est ça. Je vous ai fait un premier prototype : https://lists.apache.org/thread.html/r90d3419fba70abb64629666387e534ecae15436bb4e2eb2b638c4a66%40%3Cuser.couchdb.apache.org%3E Comme cette partie backend est un petit peu plus difficile que prévue (comme l'indique la discussion, la correction de petits problèmes nécessite une autre stratégie), je m'en charge. Vous pouvez donc la considérer comme une boîte noire qui sera bientôt disponible.

Maintenant que la question de la production des données est à peu près réglée, se pose celle de la consultation. Dans quelle vue espéreriez-vous obtenir la date et le contributeur de la dernière modification de chaque item

Nickel merci pour ça.

Je pense que la date et le contributeur de la dernière modification seront considérés comme des attributs d'un item. Dans ce cas une requête GET /item/ID/"attribut"/ pour obtenir un attribut lié à un item me parait adapté.

En fait on évite de faire une requête par "objet". Si vous avez 1780 items comme dans le portfolio des vitraux, ça ferait 1750 requêtes... Inspectez les méthodes Ajax (XHR) qui sont lancées dans cette page et repérez dans quelle ressource vous vous attendriez à trouver les données de dernière modification de chaque item (une fois que vous aurez trouvé, vous verrez c"était très logique, vu le titre de votre ticket...).

Sur la page principale on a : GET https://argos.utt.fr/corpus/Graines%20d'artistes et GET https://steatite.utt.fr/corpus/Graines%20d'artistes qui semblent permettre de récupérer l'ensemble du corpus dans un fichier JSON. Grâce à votre modification du back-end (merci pour ça) on pourra récupérer les infos sur les contributeurs et les dates de modifications, et donc organiser correctement notre fichier XML pour le flux RSS. Les attributs sont récupérables dans le json à ce niveau là : ["rows"][index]["value"][nom_attribut], par exemple pour graine d'artiste: ["rows"][1]["value"]["name"] ="1994_6-9_11_ROM_R_C".

Maintenant qu'on sait comment récupérer la date de modification et les attributs, il faudrait trier le corpus par date de modification pour pouvoir récupérer seulement les derniers items dans notre flux RSS. Je pense que la manière la plus logique pour ne pas ralentir porphyry est de le faire en back-end à chaque modification. Cependant je ne sais pas si cela est possible, qu'en dites vous ?

benel commented 3 years ago

Merci @lildelfino @ThomasSobrecases pour cette mise à jour de votre stratégie d'implémentation.

Il faut donc ajouter une nouvelle classe FluxRSS afin de définir les différentes méthodes du flux. On ajoutera ensuite un bouton dans la classe Header.jsx.

Je ne sais pas si vous avez vu les recherches du binôme qui travaille sur les maquettes, mais il est possible aussi de référencer les flux RSS dans l'entête du fichier HTML (ce qui présente une petite difficulté avec React mais pas insurmontable). Du coup, vous n'avez pas besoin de modifier le design de votre page. C'est le navigateur qui gère lui-même l'affichage du menu RSS (en général à droite de la barre d'adresse).

Créer notre propre lecteur RSS semble trop compliqué à implémenter

Bien sûr. L'intérêt des standards, c'est que l'on peut être compatible avec des outils qui existent déjà.

Par contre lors de la modification d’un item on devra sûrement faire appel aux fonctions _getAttributes(), getString(this.state.item.name), etc… pour que toutes les informations sur l’item soient ajoutées dans le flux, pas seulement les informations sur les modifications effectuées.

Si vous choisissez de générer votre RSS avec React, elle aura sa propre URI. Donc a priori ce ne sera pas dans la même "page". Vous partirez donc directement de ce que vous récupérez dans le backend...

https://dessins.porphyry.org/corpus.xml

Je l'ai déjà écrit quelque part (ça m'inquiète, je ne le retrouve plus), mais si vous voulez que ce soit l'URI du flux d'un corpus. Il va falloir absolument que vous ayez l'identifiant de ce corpus dans l'URI... Par ailleurs, il est préférable de ne jamais mentionner le format dans l'URI elle-même (c'est parce que dans la spécification de HTTP il y a la distinction entre une "ressource" et ses "représentations").

Des services extérieurs seront nécessaires pour utiliser la fonctionnalité mais ils ne seront pas à intégrer dans notre application ; on fournit simplement le fichier permettant aux services de lire notre flux.

Du coup (voir plus haut), vous allez vous appuyer directement sur la vue "corpus" produite par Argos.

Je pense que la date et le contributeur de la dernière modification seront considérés comme des attributs d'un item. Dans ce cas une requête GET /item/ID/"attribut"/ pour obtenir un attribut lié à un item me parait adapté.

Pas à proprement parler. Un attribut est de la forme {"creator":"bob"} alors que la trace à propos de la dernière modification des données est de la forme {"record":{"creator":"bob"}}. C'est fait exprès pour faire la différence entre par exemple le créateur de la photographie et le créateur de la description de la photographie.

Maintenant qu'on sait comment récupérer la date de modification et les attributs, il faudrait trier le corpus par date de modification pour pouvoir récupérer seulement les derniers items dans notre flux RSS. Je pense que la manière la plus logique pour ne pas ralentir porphyry est de le faire en back-end à chaque modification. Cependant je ne sais pas si cela est possible, qu'en dites vous ?

À ralentir quelque chose, il vaut mieux le faire sur une requête qui sera utilisée peut-être une fois par jour (RSS sur le frontend) plutôt que sur qui est utilisée toutes les minutes (corpus sur la backend). Notez par ailleurs que la spécification de RSS ne requiert pas de tri particulier.

Probablement que ce code XML devra être stocké dans la bdd aux côtés des items

Je ne comprends pas cette phrase. Par ailleurs, j'ai un doute sur l'intégration de votre bibliothèque dans React. Apparemment il est possible de générer du XML en React (donc sans bibliothèque spécifique pour RSS), mais ce n'est pas très courant et je ne sais pas s'il y a des limites...

Une autre alternative serait de générer le RSS directement dans CouchDB... Si certains d'entre vous ont fait LO10, c'est comparable à ce que l'on avait fait ensemble. Si vous avez besoin d'aide, on peut regarder ensemble... Dans ce cas, la partie React serait limitée à la référence au RSS dans l'entête du fichier HTML, mais la génération du RSS serait faite par CouchDB.

lildelfino commented 3 years ago

@benel

Pour le front-end :

link rel="alternate" type="application/rss+xml" href="https://www.lemonde.fr/entreprises/rss_full.xml" title="Test2" Voilà à quoi ressemblerait la balise à ajouter au header. Pour la modifier en react on travaille encore dessus.

Pour la back-end :

Voilà ce qu'on a compris avec les nouveaux assignés à la stratégie d'implémentation : il faudrait déjà classer la base de données par date de modification, pour simplifier la récupération des items qui nous intéressent. Ensuite on utilisera la librairie JS dans argos pour générer le fichier XML lié à un flux RSS, en fonction du corpus. On créera ensuite une vue pour récupérer le lien du fichier généré sur le coup. Le problème qu'on a c'est qu'on ne voit vraiment pas où est fait le lien entre la front-end porphyry et argos dans le code. Également nous ne sommes pas sur de ce que vous entendiez par "rewrite couchDB".

benel commented 3 years ago

@Hypertopic/graines-d-artistes-1

<link rel="alternate" type="application/rss+xml" href="https://www.lemonde.fr/entreprises/rss_full.xml" title="Test2"/>

Il faudrait faire un petit test (avec du HTML statique en local) pour voir :

Pour la modifier en react on travaille encore dessus.

OK.

Voilà ce qu'on a compris avec les nouveaux assignés à la stratégie d'implémentation : il faudrait déjà classer la base de données par date de modification, pour simplifier la récupération des items qui nous intéressent. Ensuite on utilisera la librairie JS dans argos pour générer le fichier XML lié à un flux RSS, en fonction du corpus. On créera ensuite une vue pour récupérer le lien du fichier généré sur le coup.

On avait dit qu'on générait le XML dans CouchDB... Vous avec regardé la documentation des listes CouchDB ?

Également nous ne sommes pas sur de ce que vous entendiez par "rewrite couchDB".

C'est une autre fonctionnalité de CouchDB : réécrire une URI sur mesure pour la faire correspondre à une URI interne

Pour la partie vue CouchDB. On peut le faire ensemble, si vous voulez... Je suis encore là jusqu'à midi...

therealdarkflamemaster commented 3 years ago

@benel

Après une tentative dans le projet Porphyry, on a réussi à le faire : image

benel commented 3 years ago

@therealdarkflamemaster

Comment changer le header en React

Il est possible d'ajouter un node <link ... > directement dans le fichier index.html dans le dossier public mais on ne peut pas le changer comme on veut.

Il existe une bibliothèque qui permet de le faire dynamiquement c'est react-helmet.

therealdarkflamemaster commented 3 years ago

@benel Oui, en fait, je l'ai trouvé. ce sera pratique d'utiliser un wheel déjà développé. Merci

benel commented 3 years ago

@therealdarkflamemaster

Pour vous faciliter un peu le travail concernant react-helmet, je viens de l'utiliser dans un FIX: 953380ef6cccb25e8a925ff2e091e4d55b8cca3d.

lildelfino commented 3 years ago

@benel

On avait dit qu'on générait le XML dans CouchDB... Vous avec regardé la documentation des listes CouchDB ?

J'ai regardé mais je vois que la fonction est dépréciée, cela ne pose-t-il pas un gros problème pour le futur de porphyry ? Sinon de ce que j'ai compris il s'agirait d'utiliser cette fonction pour générer un fichier xml, en remplaçant "Content/Type" = "text/xml" j'imagine. Cependant on n'utilisera pas la librairie JS extérieure au final.

C'est une autre fonctionnalité de CouchDB : réécrire une URI sur mesure pour la faire correspondre à une URI interne

Même problème de dépréciation ici. Normalement on aurait une URI relativement "moche" pour le client qu'il faudrait rendre "jolie" comme sur les maquettes. Reste à voir à quoi ressemblerait ce qu'on récupérerait de la fonction list.

Pour la partie vue CouchDB. On peut le faire ensemble, si vous voulez... Je suis encore là jusqu'à midi...

Demain nous aurions vraiment besoin de votre aide pour comprendre comment implémenter la fonctionnalité car on a du mal à comprendre comment sont effectués les échanges entre couchdb et la front-end dans le code. @sarah-ngn et moi-même seront présent toute la matinée après notre réunion pour en parler.

benel commented 3 years ago

@lildelfino

J'ai regardé mais je vois que la fonction est dépréciée, cela ne pose-t-il pas un gros problème pour le futur de porphyry ?

Pour Argos plutôt ?

Vous faites bien de vous poser la question, mais la réponse est plutôt non :

Aujourd'hui, la solution la plus simple est de le faire avec CouchDB. C'est pour cela que je vous oriente vers ce choix technologique.

benel commented 3 years ago

@lildelfino @sarah-ngn

Demain nous aurions vraiment besoin de votre aide pour comprendre comment implémenter la fonctionnalité car on a du mal à comprendre comment sont effectués les échanges entre couchdb et la front-end dans le code. @sarah-ngn et moi-même seront présent toute la matinée après notre réunion pour en parler.

Ça vous va si on le fait en tout début de matinée ? Ça vous laissera du temps pour avancer avant la réunion de suivi...

Quel est votre sujet exactement ? Est-ce réellement le lien entre backend et frontend ? Ou est-ce la partie backend ?

benel commented 3 years ago

@lildelfino @sarah-ngn

Je vois dans votre compte-rendu (qui vient d'arriver) que vous étiez affectés au backend. Donc j'imagine que c'est bien sur cela que vous voulez être briefés.

therealdarkflamemaster commented 3 years ago

@benel


Il faut d'abord installer `react-helmet` avec la commande `npm install react-helmet` ou `yarn add react-helmet` et importer ensuite dans le début de fichier 

import { Helmet } from 'react-helmet';

Pour la version de `react-helmet`, dans le fichier `package.json`
"react-helmet": "^6.1.0",
...
benel commented 3 years ago

Merci @therealdarkflamemaster pour cette partie de stratégie d'implémentation.

Par contre, j'imagine que vous avez lu la discussion à propos de la gestion devenue très chaotique dans les navigateurs des html/head/link et en particulier la conclusion de @TristanGdc d'avoir plutôt des liens dans le corps des pages.

sarah-ngn commented 3 years ago

Stratégie d'implémentation backend :

{
    "from": "feed/:corpus",
    "to": "_list/feed/feed",
    "query": {
      "include_docs": "true",
      "startkey": [":corpus"],
      "endkey": [":corpus",{}]
    }
function(head, req){
        start({
                    'headers': {
                                'Content-Type': 'application/rss+xml'
                            }
                });
        send('<rss><channel><title>Modifications</title><link>https://dessins.porphyry.org/</link><description>IF05</description>');
        while(row = getRow()){
                    send(''.concat(
                                '<item>',
                                '<title>' + row.item_name + '</title>',
                                '<created>' + row.created + '</created>',
                                '<spatial>' + row.spatial + '</spatial>',
                                '</item>'
                            ));
                }
        send('</channel></rss>');
}

Pour ce qui est du lien du corpus dans le titre, nous continuons de chercher un moyen de le récupérer de manière dynamique. Nous nous posions la question s'il n'existe pas déjà un attribut qui permettrai de récupérer le nom du corpus ou bien si l'on pouvait directement récupérer l'URI vers la page de l'item en attribut ?

@benel co-writer : @lildelfino

benel commented 3 years ago

Merci @sarah-ngn et @lildelfino pour ce début de stratégie d'implémentation (et même un début d'implémentation !).

Pour ce qui est du lien du corpus dans le titre, nous continuons de chercher un moyen de le récupérer de manière dynamique. Nous nous posions la question s'il n'existe pas déjà un attribut qui permettrai de récupérer le nom du corpus ou bien si l'on pouvait directement récupérer l'URI vers la page de l'item en attribut ?

Ne perdez pas de vue le problème à résoudre.

Dans votre flux (https://argos.utt.fr/feed/Graines d'artistes), vous savez que le premier élément modifié est par exemple :

Or vous voulez générer un lien de votre flux RSS vers https://dessins.porphyry.org/item/Graines%20d'artistes/379c510401214c97968b15affb6eba1ed6a03db0

Donc, ce qui vous manque c'est https://dessins.porphyry.org.

La solution la plus simple est, comme je vous le disais la semaine dernière, est de passer cette chaîne de caractères en paramètre à l'URI de votre liste. Elle deviendrait par exemple https://argos.utt.fr/feed/Graines d'artistes?app=https://dessins.porphyry.org.

Avant d'y arriver, vous avez deux informations à chercher dans la documentation de CouchDB :

lildelfino commented 3 years ago

comment récupérer les paramètres de requête dans la fonction liste (ici : app),

D'après ce lien : https://guide.couchdb.org/draft/transforming.html, il semblerait que via le paramètre req, on peut récupérer les requêtes http : "query": {"foo":"bar"}, Dans notre cas dans la fonction list ça donnerait :
uri = req.query.app

comment transmettre les paramètres lors de la réécriture (il me semble que ça se fait tout seul, mais il faut vérifier).

https://docs.couchdb.org/en/1.5.1/api/ddoc/rewrites.html : D'après l'exemple suivant il semblerait que les "queries" non-considérées dans le rewrites sont gardées à la réécriture : {“from”: “/a/b”, “to”: “/some”} : /a/b?k=v => /some?k=v

J'ai malheureusement pas pu tester ces solutions car j'ai un problème avec argos et couchdb : quand je modifie un fichier js en local et que je fais docker-compose up --detach, rien ne se met à jour sur couchdb. Je n'arrive donc pas à créer la fonction liste. D'ailleurs cette fois-ci, quand je "up", les items modifiés restent modifiés (avant ça les remettait à l'état initial). Je ne comprends vraiment pas d'où vient ce problème sachant que je vérifie à chaque fois que couchdb est éteint avant de up.

@benel

benel commented 3 years ago

Dans notre cas dans la fonction list ça donnerait : uri = req.query.app

Tout à fait !

D'après l'exemple suivant il semblerait que les "queries" non-considérées dans le rewrites sont gardées à la réécriture

C'est bien ce qu'il me semblait. Heureux que vous ayez trouvé confirmation dans la documentation.

Je ne comprends vraiment pas d'où vient ce problème sachant que je vérifie à chaque fois que couchdb est éteint avant de up.

Vous pouvez réinitialiser vos données de la manière suivante :

  1. faites un down
  2. supprimez le dossier data
  3. faites un up
therealdarkflamemaster commented 3 years ago

@benel Pour la partie Front-end d'Implémentation, voici ce que j'ai fait : le dossier src : image

<header className="row align-items-center">
        <div className="col-lg-4 d-none d-lg-block logo"></div>
        <h1 className="col-lg-4">
          <Link to="/">{this.state.user}</Link>
        </h1>
        <div className="col-lg-2">
          <Rss/>
        </div>
        <div className="col-lg-2">
          <Authenticated conf={this.props.conf} />
        </div>
</header>

Pour le button RSS, il y a deux parties :

  1. la partie icon, j'ai utilisé une image SVG
  2. la partie de texte, c'est simplement Flux RSS

    
    class Rss extends Component {
    
    constructor(props) {
    super(props);
    this.state = {rss: ''};
    }
    
    render() {
    return (
      <div className="rss-btn">
        <Link to="/rss">
          <div className="rss-icon">
            <RssIcon/> // l'image svg
          </div>
          <Trans>Flux RSS</Trans>
        </Link>
      </div>
    );
    }

}

export default Rss;


- Faire la page `Rss.jsx` 
J'ai créé un dossier rssPage. Je l'ai fait comme [la maquette](https://user-images.githubusercontent.com/65378394/121902701-da034c80-cd27-11eb-9a84-dfcfdbc7c084.jpg) envoyée par Cédric. 
![image](https://user-images.githubusercontent.com/50511796/122277515-902d8880-cf18-11eb-9048-d56cb09ad22f.png)

- Faire la page `RssTopic.jsx`
Je l'ai fait comme [la maquette](https://user-images.githubusercontent.com/65378394/121659676-d1e6ab00-caa2-11eb-8d2c-b34c985061e1.png) envoyée par Cédric. En outre, j'ai crée deux components Topic et Viewpoint pour démontrer les catégories. 
![image](https://user-images.githubusercontent.com/50511796/122277581-a20f2b80-cf18-11eb-936e-d61ce511bbb2.png)

- Configuration du routage
J'ai changé un peu de codes dans le fichier index.js :
```jsx
 <Router>
      <Switch>
        <Route path="/item/:corpus/:item" component={Item} />
        <Route path="/viewpoint/:id" component={Outliner} />
        <Route path="/rss/topic/" component={RSSTopic} />  // nouveau
        <Route path="/rss/" component={RSS} /> // nouveau
        <Route path="/" component={Portfolio} />
      </Switch>
</Router>

En outre, j'ai quelques problèmes sur le style de button Rss que j'ai fait et la transciption de textes en anglais. Ces problèmes ont été résolus par @TristanGdc

TristanGdc commented 3 years ago

@benel Je me suis occupé de l'ajout des textes explicatifs présents dans la maquette et des différentes traductions en anglais en modifiant les "messages.po" et en utilisant les balises Trans :

image

image

image

Merci à @therealdarkflamemaster de m'avoir aider pour l'écriture du CSS et l'utilisation des Link.

benel commented 3 years ago

OK, merci pour vos traductions @TristanGdc.