feat: review model to retrieve all the questions with a single query

- update initial data
- add description field to the axe
pull/1/head
Nicolas Doby 2022-11-02 11:16:17 +01:00
parent 075a508bb5
commit 3c4928ae61
20 changed files with 269 additions and 155 deletions

View File

@ -31,6 +31,10 @@
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-data</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.hateoas</groupId>
<artifactId>spring-hateoas</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>

View File

@ -9,9 +9,11 @@ import org.hibernate.Hibernate;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.Objects;
import java.util.Set;
@Getter
@Setter
@ -34,9 +36,16 @@ public class Axe {
@Size(max = 100)
private String title;
@Size(max = 500)
private String description;
@NotBlank
private String color;
@OneToMany(mappedBy = "axe")
@ToString.Exclude
private Set<Question> questions;
@Override
public boolean equals(Object o) {
if (this == o) return true;

View File

@ -7,12 +7,12 @@ import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.Hibernate;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.context.SecurityContextHolder;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.PrePersist;
import javax.validation.constraints.NotBlank;
@ -31,6 +31,8 @@ public class Question {
private Long id;
@ManyToOne
@JoinColumn(name = "axe_id")
@JsonIgnore
private Axe axe;
@JsonIgnore

View File

@ -19,6 +19,7 @@ import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.PrePersist;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Set;
@ -44,6 +45,10 @@ public class Quiz {
@ToString.Exclude
private Set<Response> responses;
@OneToMany(mappedBy = "quiz")
@ToString.Exclude
private List<QuizScore> scores;
@PrePersist
public void prePersist() {
var userDetails = (UserDetailsImpl) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

View File

@ -9,6 +9,8 @@ import org.hibernate.annotations.Immutable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Getter
@Setter
@ -24,6 +26,11 @@ public class QuizScore {
private Float scoreAvg;
private Integer axeIdentifier;
// @JsonIgnore
// private Long quizId;
@ManyToOne
@JoinColumn(name = "quiz_id")
@JsonIgnore
private Long quizId;
private Quiz quiz;
}

View File

@ -0,0 +1,15 @@
package fr.itsonus.bousoleplussbackend.payload.response;
import fr.itsonus.bousoleplussbackend.models.Question;
import lombok.Data;
import org.springframework.hateoas.RepresentationModel;
@Data
public class AxeWithQuestion extends RepresentationModel<AxeWithQuestion> {
private Integer identifier;
private String shortTitle;
private String title;
private String color;
private Iterable<Question> questions;
}

View File

@ -0,0 +1,24 @@
package fr.itsonus.bousoleplussbackend.projections;
import fr.itsonus.bousoleplussbackend.models.Axe;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.rest.core.config.Projection;
import java.util.List;
@Projection(name = "axeWithQuestion", types = {Axe.class})
public interface AxeWithQuestion {
Integer getIdentifier();
String getShortTitle();
String getTitle();
String getDescription();
String getColor();
@Value("#{target.getQuestions()}")
List<QuestionProj> getQuestions();
}

View File

@ -0,0 +1,11 @@
package fr.itsonus.bousoleplussbackend.projections;
import fr.itsonus.bousoleplussbackend.models.Question;
import org.springframework.data.rest.core.config.Projection;
@Projection(types = {Question.class})
public interface QuestionProj {
Long getId();
String getLabel();
String getDescription();
}

View File

@ -0,0 +1,20 @@
package fr.itsonus.bousoleplussbackend.projections;
import fr.itsonus.bousoleplussbackend.models.Quiz;
import fr.itsonus.bousoleplussbackend.models.QuizScore;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.rest.core.config.Projection;
import java.util.Date;
import java.util.List;
@Projection(name = "quizWithScore", types = {Quiz.class})
public interface QuizWithScore {
Long getId();
Date getCreatedDate();
@Value("#{target.getScores()}")
List<QuizScore> getScores();
}

View File

@ -1,13 +1,16 @@
package fr.itsonus.bousoleplussbackend.repositories;
import fr.itsonus.bousoleplussbackend.models.Axe;
import fr.itsonus.bousoleplussbackend.projections.AxeWithQuestion;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.data.rest.core.annotation.RestResource;
import java.util.Optional;
@RepositoryRestResource
@RepositoryRestResource(excerptProjection = AxeWithQuestion.class)
public interface AxeRepository extends CrudRepository<Axe, Long> {
Optional<Axe> findByIdentifier(Integer identifier);
@RestResource(path = "me", rel = "me")
@Query("SELECT DISTINCT a FROM Axe a INNER JOIN a.questions as q WHERE q.userId = ?#{principal.id}")
Iterable<Axe> findAllWithQuestionsOfCurrentUser();
}

View File

@ -1,22 +1,18 @@
package fr.itsonus.bousoleplussbackend.repositories;
import fr.itsonus.bousoleplussbackend.models.Quiz;
import fr.itsonus.bousoleplussbackend.models.Response;
import fr.itsonus.bousoleplussbackend.projections.QuizWithResponses;
import fr.itsonus.bousoleplussbackend.projections.QuizWithScore;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.data.rest.core.annotation.RestResource;
import java.util.Set;
@RepositoryRestResource(excerptProjection = QuizWithResponses.class)
@RepositoryRestResource(excerptProjection = QuizWithScore.class)
public interface QuizRepository extends PagingAndSortingRepository<Quiz, Long> {
@RestResource(path = "me", rel = "me")
@Query("SELECT q FROM Quiz q WHERE q.userId = ?#{principal.id}")
Page<Quiz> findAllOfCurrentUser(final Pageable pageable);
Page<Quiz> findAllWithScoresOfCurrentUser(final Pageable pageable);
}

View File

@ -24,6 +24,7 @@ CREATE TABLE axe
identifier INTEGER NOT NULL,
short_title VARCHAR(100) NOT NULL,
title VARCHAR(200) NOT NULL,
description VARCHAR(500) NULL,
color VARCHAR(7) NOT NULL,
CONSTRAINT pk_axe PRIMARY KEY (id),
CONSTRAINT uc_axe_identifier UNIQUE (identifier, title, short_title)
@ -35,7 +36,7 @@ CREATE TABLE question
axe_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
label VARCHAR(200) NOT NULL,
description VARCHAR(500),
description VARCHAR(500) NULL,
CONSTRAINT question_quiz PRIMARY KEY (id)
);
@ -56,14 +57,14 @@ CREATE TABLE response
comment VARCHAR(500),
CONSTRAINT pk_response PRIMARY KEY (id)
);
-- FIXME id may be wrong
CREATE VIEW quiz_score AS
SELECT
r.quiz_id + a.identifier AS id
SELECT
DENSE_RANK() OVER(ORDER BY a.identifier, r.quiz_id) AS id
,a.identifier AS axe_identifier
,r.quiz_id as quiz_id
,AVG(r.score) as score_avg
FROM response r
FROM response r
INNER JOIN QUESTION q ON q.id = r.question_id
INNER JOIN AXE a ON a.id = q.axe_id
GROUP BY r.quiz_id, a.identifier;
GROUP BY r.quiz_id, a.identifier;

View File

@ -1,15 +1,15 @@
INSERT INTO axe (id, identifier, short_title, title, color)
INSERT INTO axe (id, identifier, short_title, title, description, color)
VALUES
(nextval('hibernate_sequence'), '1', 'Pouvoir dagir', 'AGIR en (re)donnant du pouvoir dagir aux territoires et à leurs habitants', '#CA8AE8'),
(nextval('hibernate_sequence'), '2', 'Multi-secteur', 'AGIR sur tous les secteurs de léconomie et lensemble des chaînes de valeur', '#22B9A6'),
(nextval('hibernate_sequence'), '3', 'Local global', 'AGIR localement en pensant globalement', '#E7E145'),
(nextval('hibernate_sequence'), '4', 'Utilité (sociale et écologique)', 'AGIR de manière utile et sobre socialement et écologiquement', '#F39345'),
(nextval('hibernate_sequence'), '5', 'Communs', 'AGIR pour préserver et se réapproprier les communs', '#9FCC8B'),
(nextval('hibernate_sequence'), '6', 'Démocratie', 'AGIR démocratiquement', '#FDA6C5'),
(nextval('hibernate_sequence'), '7', 'Coopération', 'AGIR en encourageant la coopération à tous les niveaux', '#7E91F1'),
(nextval('hibernate_sequence'), '8', 'Finances', 'AGIR pour maîtriser les outils de production', '#F37665'),
(nextval('hibernate_sequence'), '9', 'Moyens de production', 'AGIR sur les instruments financiers', '#E9D280'),
(nextval('hibernate_sequence'), '10','Travail', 'AGIR pour redonner au travail sa valeur véritable', '#7BD1F5');
(nextval('hibernate_sequence'), '1', 'Pouvoir dagir', 'AGIR en (re)donnant du pouvoir dagir aux territoires et à leurs habitants', null, '#CA8AE8'),
(nextval('hibernate_sequence'), '2', 'Multi-secteur', 'AGIR sur tous les secteurs de léconomie et lensemble des chaînes de valeur*', '* ensemble des activités concourant à la création et la vente dun produit ou dun service : de lapprovisionnement à la vente en passant par la production même, la distribution, les services associés, ...', '#22B9A6'),
(nextval('hibernate_sequence'), '3', 'Local global', 'AGIR localement en pensant globalement', null, '#E7E145'),
(nextval('hibernate_sequence'), '4', 'Utilité (sociale et écologique)', 'AGIR de manière utile et sobre socialement et écologiquement', null, '#F39345'),
(nextval('hibernate_sequence'), '5', 'Communs', 'AGIR pour préserver et se réapproprier les communs*', '* ressources partagées, gérées et maintenues collectivement par une communauté ; celle-ci établit des règles dans le but de préserver et pérenniser ces ressources tout en fournissant aux membres de cette communauté la possibilité et le droit de les utiliser', '#9FCC8B'),
(nextval('hibernate_sequence'), '6', 'Démocratie', 'AGIR démocratiquement', null, '#FDA6C5'),
(nextval('hibernate_sequence'), '7', 'Coopération', 'AGIR en encourageant la coopération à tous les niveaux', null, '#7E91F1'),
(nextval('hibernate_sequence'), '8', 'Finances', 'AGIR pour maîtriser les outils de production', null, '#F37665'),
(nextval('hibernate_sequence'), '9', 'Moyens de production', 'AGIR sur les instruments financiers', null, '#E9D280'),
(nextval('hibernate_sequence'), '10','Travail', 'AGIR pour redonner au travail sa valeur véritable', null, '#7BD1F5');
INSERT INTO users (id, username, password)
VALUES
@ -17,64 +17,73 @@ VALUES
INSERT INTO question (id, axe_id, user_id, label, description)
VALUES
(nextval('hibernate_sequence'), 1, 11, 'Le projet favorise-t-il la montée en compétence des parties prenantes?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 1, 11, 'Le projet permet-il la participation active des parties prenantes?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 1, 11, 'Le projet est il accessible à différentes parties prenantes?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 1, 11, 'Le projet a-t-il une animation des liens sociaux?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 1, 11, 'Le projet favorise-t-il l''inclusion? la mixité sociale? les liens sociaux?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 1, 11, 'Le projet permet-il la participation active de plusieurs parties prenantes ?', null),
(nextval('hibernate_sequence'), 1, 11, 'Le projet favorise-t-il la participation active des (futurs) usagers ?', null),
(nextval('hibernate_sequence'), 1, 11, 'Le projet est il accessible financièrement au plus grand nombre ?', null),
(nextval('hibernate_sequence'), 1, 11, 'Lanimation du projet est-elle organisée et continue ?', null),
(nextval('hibernate_sequence'), 1, 11, 'Le projet favorise-t-il la mixité sociale et/ou les liens sociaux ?', null),
(nextval('hibernate_sequence'), 1, 11, 'Le projet prend -il en compte les enjeux sociaux et environnementaux locaux ?', null),
(nextval('hibernate_sequence'), 1, 11, 'Le projet favorise-t-il la montée en compétences des parties prenantes ?', null),
(nextval('hibernate_sequence'), 1, 11, 'Le projet favorise-t-il linclusion de personnes en situation de vulnérabilité ?', null),
(nextval('hibernate_sequence'), 2, 11, 'Les ressources locales sont-elles prises en compte?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 2, 11, 'Plusieurs filières ou thématiques sont-elles abordées dans le projet?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 2, 11, 'Quel est le degré d''indépendance du projet vis à vis des ressources extèrieures?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 2, 11, 'Les approvisionnements via des ressources locales sont-ils à lœuvre ou envisagés ?', null),
(nextval('hibernate_sequence'), 2, 11, 'Plusieurs filières ou thématiques sont-elles abordées dans le projet ?', null),
(nextval('hibernate_sequence'), 2, 11, 'Le projet est-il suffisamment émancipé de lapport de ressources extérieures ?', null),
(nextval('hibernate_sequence'), 2, 11, 'Une analyse systémique du projet (connaissance des différentes interactions) est-elle à lœuvre ?', null),
(nextval('hibernate_sequence'), 2, 11, 'Le projet est-il ouvert et propice à linnovation ?', null),
(nextval('hibernate_sequence'), 3 ,11, 'Êtes-vous en lien avec des écosystèmes locaux?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 3 ,11, 'Le projet contribue-t-il au développement économique d''autres acteurs du territoire?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 3 ,11, 'Le projet contribue-t-il au rééquilibrage territorial?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 3 ,11, 'Les parties prenantes du projet contribuent-elles à essaimer les bonnes pratiques liées au projet?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 3 ,11, 'Les parties prenantes du projet sont-elles en lien avec dautres écosystèmes locaux ?', null),
(nextval('hibernate_sequence'), 3 ,11, 'Le projet prévoit-il de sassocier officiellement (contrat, convention, charte commune, …) avec dautres écosystèmes locaux ?', null),
(nextval('hibernate_sequence'), 3 ,11, 'Le projet contribue-t-il au développement économique dautres acteurs en dehors du territoire ?', null),
(nextval('hibernate_sequence'), 3 ,11, 'Le projet contribue-t-il à un rééquilibrage territorial en faveur de territoires moins favorisés ?', null),
(nextval('hibernate_sequence'), 3 ,11, 'Les parties prenantes du projet contribuent-elles à essaimer les bonnes pratiques liées au projet ?', null),
(nextval('hibernate_sequence'), 3 ,11, 'Des ressources extérieures utiles et complémentaires au projet ont-elles été identifiées ?', null),
(nextval('hibernate_sequence'), 4 ,11, 'Les besoins auxquels répond le projet ont-ils été définis collectivement?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 4 ,11, 'Avez-vous une politique d''achat responsable?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 4 ,11, 'Le projet cherche-t-il à réduire les impacts environnementaux négatifs?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 4 ,11, 'Le projet contribue-t-il à une boucle d''économie circulaire?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 4 ,11, 'Le projet a-t-il intégré un objectif de sobriété sur un ou plusieurs aspects ?', null),
(nextval('hibernate_sequence'), 4 ,11, 'Les besoins auxquels répond le projet ont-ils été définis en concertation avec les parties prenantes ?', null),
(nextval('hibernate_sequence'), 4 ,11, 'Le projet a-t-il défini une politique dachats responsables ?', null),
(nextval('hibernate_sequence'), 4 ,11, 'Les impacts environnementaux de la production et de la consommation liées au projet ont-ils été identifiés ?', null),
(nextval('hibernate_sequence'), 4 ,11, 'Le projet est-il associé à une boucle déconomie circulaire ?', null),
(nextval('hibernate_sequence'), 4 ,11, 'Le projet prend-il en compte la gestion des déchets et leur transformation en ressources ?', null),
(nextval('hibernate_sequence'), 5 ,11, 'Existe-t-il autour du projet une(des) ressource(s) partageable(s) préexistante(s) ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 5 ,11, 'Le projet va-t-il produire une(des) ressource(s) partageable(s) ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 5 ,11, 'Le projet est-il considéré lui-même comme une ressource partageable ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 5 ,11, 'Existe-t-il autour du projet une communauté souhaitant s''occuper de cette ressource partageable ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 5 ,11, 'Existe-t-il des règles d''accès et/ou d''usage à ces ressources ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 5 ,11, 'Existe-t-il autour du projet une(des) ressource(s) partageable(s) préexistante(s) ?', null),
(nextval('hibernate_sequence'), 5 ,11, 'Le projet va-t-il produire une(des) ressource(s) partageable(s) ?', null),
(nextval('hibernate_sequence'), 5 ,11, 'Le projet est-il considéré lui-même comme une ressource partageable ?', null),
(nextval('hibernate_sequence'), 5 ,11, 'Existe-t-il autour du projet une communauté souhaitant administrer et gérer cette ressource partageable ?', null),
(nextval('hibernate_sequence'), 5 ,11, 'Existe-t-il des règles daccès et/ou dusage à ces ressources ?', null),
(nextval('hibernate_sequence'), 6 ,11, 'Existe t-il des lieux et des temps d''expression et de débat ouverts autour du projet ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 6 ,11, 'Les phases essentielles de développement et d''évaluation du projet sont elles soumises au débat ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 6 ,11, 'Tous les groupes représentatifs sont ils invités au débat: élu.e.s, producteur.ices, consommateur.ices, bénéficiaires, chargé.e.s de projet, encadrant.e.s, ....', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 6 ,11, 'Le droit à la parole est-il équitable lors des débats ? (ou les moyens mobilisés permettent-ils l''expression de chacun.e de manière équitable ?)', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 6 ,11, 'La gouvernance permet-elle une prise de décision partagée avec tous les groupes de parties prenantes ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 6 ,11, 'L''accès à la gouvernance par chacun.e est-il lisible et accessible ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 6 ,11, 'Existe t-il des lieux et des temps dexpression et de débat ouverts autour du projet ?', null),
(nextval('hibernate_sequence'), 6 ,11, 'Les phases essentielles de développement et dévaluation du projet sont elles soumises au débat ?', null),
(nextval('hibernate_sequence'), 6 ,11, 'Tous les groupes représentatifs sont ils invités au débat : élu.e.s, producteur.ices, consommateur.ices, bénéficiaires, chargé.e.s de projet, encadrant.e.s, ....', null),
(nextval('hibernate_sequence'), 6 ,11, 'Le droit à la parole est-il équitable lors des débats ? (ou les moyens mobilisés permettent-ils lexpression de chacun.e de manière équitable ?', null),
(nextval('hibernate_sequence'), 6 ,11, 'La gouvernance permet-elle une prise de décision partagée avec tous les groupes de parties prenantes ?', null),
(nextval('hibernate_sequence'), 6 ,11, 'Les modalités de participation à la gouvernance par chacun.e sont-elles lisibles et accessibles ?', null),
(nextval('hibernate_sequence'), 7 ,11, 'Le projet prend-il en compte les contraintes des différentes parties prenantes?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 7 ,11, 'La prise en compte des contraintes des parties prenantes fait-elle évoluer le projet ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 7 ,11, 'La coopération des acteurs permet-elle d''identifier les ressources matérielles et immatérielles locales mobilisables ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 7 ,11, 'La coopération permet-elle de réintégrer les externalités négatives du projet ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 7 ,11, 'La coopération permet-elle le financement des externalités positives du projet de manière monétaire ou non monétaire ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 7 ,11, 'Le processus de coopération fait-il évoluer la façon de travailler de chacun.e ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 7 ,11, 'Existe t-il un processus de partage et de transmission de l''information qui favorise la coopération?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 7 ,11, 'Le projet prend-il en compte les contraintes des différentes parties prenantes ?', null),
(nextval('hibernate_sequence'), 7 ,11, 'La prise en compte des contraintes des parties prenantes fait-elle évoluer le projet ?', null),
(nextval('hibernate_sequence'), 7 ,11, 'La coopération des acteurs permet-elle didentifier les ressources matérielles et immatérielles locales mobilisables ?', null),
(nextval('hibernate_sequence'), 7 ,11, 'La coopération permet-elle de mieux prendre en compte les externalités négatives du projet ?', null),
(nextval('hibernate_sequence'), 7 ,11, 'La coopération permet-elle le financement des externalités positives du projet de manière monétaire ou non monétaire ?', null),
(nextval('hibernate_sequence'), 7 ,11, 'Le processus de coopération fait-il évoluer la façon de travailler de chacun.e ?', null),
(nextval('hibernate_sequence'), 7 ,11, 'Existe t-il un processus de partage et de transmission de linformation qui favorise la coopération ?', null),
(nextval('hibernate_sequence'), 8 ,11, 'Existe-t-il une réflexion autour de la propriété du foncier/l''immobilier utile au projet ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 8 ,11, 'Existe-t-il une réflexion autour de la propriété des machines et des équipements utiles au projet ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 8 ,11, 'Existe-t-il une réflexion autour de la propriété des process de production et d''innovation ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 8 ,11, 'Êtes-vous libre de décider de l''emploi des outils de production nécessaires au projet ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 8 ,11, 'Êtes-vous libre de décider quel est le niveau souhaitable de productivité du projet ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 8 ,11, 'Un processus d''acquisition en propriété collective est-il à l''œuvre ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 8 ,11, 'Vous sentez vous protégé contre d''éventuelles opérations de délocalisation ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 8 ,11, 'Le projet contribue-t-il à une reprise en main de l''économie locale ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 8 ,11, 'Existe-t-il une réflexion autour de la propriété du foncier/limmobilier utile au projet ?', null),
(nextval('hibernate_sequence'), 8 ,11, 'Existe-t-il une réflexion autour de la propriété des machines et des équipements utiles au projet ?', null),
(nextval('hibernate_sequence'), 8 ,11, 'Existe-t-il une réflexion autour de la propriété des process de production et dinnovation ?', null),
(nextval('hibernate_sequence'), 8 ,11, 'Êtes-vous libre de décider de lemploi des outils de production nécessaires au projet ?', null),
(nextval('hibernate_sequence'), 8 ,11, 'Êtes-vous libre de décider quel est le niveau souhaitable de productivité du projet ?', null),
(nextval('hibernate_sequence'), 8 ,11, 'Un processus dacquisition en propriété collective est-il à lœuvre ?', null),
(nextval('hibernate_sequence'), 8 ,11, 'Le projet permet-il de mieux de sentir protégés contre déventuelles opérations de délocalisation ?', null),
(nextval('hibernate_sequence'), 8 ,11, 'Le projet contribue-t-il à une reprise en main de léconomie locale ?', null),
(nextval('hibernate_sequence'), 9 ,11, 'Le projet mobilise-t-il du financement solidaire et/ou participatif (épargne solidaire, crowdfunding, ...) ?','Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 9 ,11, 'Le projet mobilise-t-il des financements locaux (micro-crédit, capital-risque solidaire, clubs d''investisseurs locaux, ...) ?','Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 9 ,11, 'Le projet intègre-t-il le recours à des boucles locales d''échanges (monnaie complémentaire, troc inter-entreprise, système d''échange local, ...) ?','Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 9 ,11, 'Le projet mobilise-t-il du soutien auprès de fondations ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 9 ,11, 'Le projet cherche-t-il à favoriser la création d''une fondation territoriale ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 9 ,11, 'Le projet mobilise-t-il du financement solidaire et/ou participatif (épargne solidaire, crowdfunding, ...) ?', null),
(nextval('hibernate_sequence'), 9 ,11, 'Le projet mobilise-t-il des financements locaux (micro-crédit, capital-risque solidaire, clubs dinvestisseurs locaux, ...) ?', null),
(nextval('hibernate_sequence'), 9 ,11, 'Le projet intègre-t-il le recours à des boucles locales déchanges (monnaie complémentaire, troc inter-entreprise, système déchange local, ...) ?', null),
(nextval('hibernate_sequence'), 9 ,11, 'Le projet mobilise-t-il du soutien auprès de fondations ?', null),
(nextval('hibernate_sequence'), 9 ,11, 'Le projet cherche-t-il à favoriser la création dune fondation territoriale ?', null),
(nextval('hibernate_sequence'), 10 ,11, 'Le projet valorise-t-il les ressources immatérielles (intentions, initiatives, compétences, savoir-faire) des contributeur.ices ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 10 ,11, 'Le projet contribue-t-il à développer les ressources immatérielles des contributeur.ices? (formation, santé, bien-être, confiance) ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 10 ,11, 'Le projet mobilise-t-il différentes formes de contribution : bénévolat, insertion, salariat, ... ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 10 ,11, 'Le projet mobilise-t-il différentes formes de rétribution des contributions : salariat., rétribution contributive,échanges, ...', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.'),
(nextval('hibernate_sequence'), 10 ,11, 'La rémunération juste des parties prenantes est-elle prise en compte ?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus.');
(nextval('hibernate_sequence'), 10 ,11, 'Le projet valorise-t-il les ressources immatérielles (intentions, initiatives, compétences, savoir-faire) des contributeur.ices ?', null),
(nextval('hibernate_sequence'), 10 ,11, 'Le projet contribue-t-il à développer les ressources immatérielles des contributeur.ices? (formation, santé, bien-être, confiance) ?', null),
(nextval('hibernate_sequence'), 10 ,11, 'Le projet mobilise-t-il différentes formes de contribution : bénévolat, insertion, salariat, ... ?', null),
(nextval('hibernate_sequence'), 10 ,11, 'Le projet mobilise-t-il différentes formes de rétribution des contributions : salariat, rétribution contributive,échanges, ...', null),
(nextval('hibernate_sequence'), 10 ,11, 'La rémunération juste des parties prenantes est-elle prise en compte ?', null);

View File

@ -6,15 +6,19 @@
<span class="part-number">{{ axeNumber }}</span>
<span>{{ title }}</span>
</h1>
<div v-if="description" class="description">{{ description }}</div>
<div class="icon">
<img :src="icon" width="200px" alt="" aria-hidden="true"/>
</div>
</header>
<section v-for="question in questions" :key="question._links.self.href" class="question">
<details>
<details v-if="question.description">
<summary> {{ question.label }}</summary>
<p>{{ question.description }}</p>
</details>
<div v-else class="title">
{{ question.label }}
</div>
<div class="rating">
<rating :color="color" :initial-value="getCurrentScore(question)" @rate="rate => onRate(rate, question)" />
</div>
@ -36,6 +40,11 @@ export default class Quiz extends Vue {
})
private title!: string;
@Prop({
required: false
})
private description!: string;
@Prop({
required: true
})
@ -132,15 +141,26 @@ $size: 31px;
margin: $small;
}
.description {
color: $gray_3;
font-weight: 400;
font-size: 0.875rem;
}
.question {
width: 100%;
}
.question details {
.question details,
.question .title {
margin-bottom: $x_small;
}
.question details summary {
.question details summary,
.question .title {
font-weight: 700;
font-size: $title-font-size;
}
.question details summary {
margin-bottom: $xxx_small;
}

View File

@ -37,7 +37,7 @@ import {Component, Vue} from "vue-property-decorator";
import {AxiosResponse} from "axios";
import {RepositoryFactory} from "~/repositories/RepositoryFactory";
import {RestResponse} from "~/repositories/models/rest-response.model";
import {Quiz, Score} from "~/repositories/models/quiz.model";
import {Quiz} from "~/repositories/models/quiz.model";
@Component
export default class History extends Vue {
@ -52,12 +52,6 @@ export default class History extends Vue {
await this.quizRepository.findMine().then((response: AxiosResponse<RestResponse<Quiz>>) => {
this.quizzes = response.data._embedded.quizzes;
});
for (const quiz of this.quizzes) {
await this.quizRepository.findScores(quiz.id)
.then((value: AxiosResponse<Score[]>) => {
quiz.scores = value.data;
});
}
this.currentResult = this.quizzes.length > 0 ? this.quizzes[0] : null;
this.loading = false;
}

View File

@ -26,6 +26,7 @@ import {Quiz, ResponseWithQuestion, Score} from "~/repositories/models/quiz.mode
import QuizAxeDetails from "~/components/QuizAxeDetails.vue";
import {Axe} from "~/repositories/models/axe.model";
import {RestResponse} from "~/repositories/models/rest-response.model";
@Component({
components: {QuizAxeDetails}
})
@ -36,7 +37,6 @@ export default class Result extends Vue {
private axes: Axe[] = [];
private quiz: Quiz | null = null;
private scores: Score[] = [];
private responses: ResponseWithQuestion[] = [];
private loading = false;
@ -50,22 +50,9 @@ export default class Result extends Vue {
this.quizRepository.findById(quizId)
.then((response: AxiosResponse<Quiz>) => {
this.quiz = response.data;
return response;
})
.then(() => {
return this.quizRepository.findScores(quizId)
.then((response: AxiosResponse<Score[]>) => {
this.scores = response.data;
return response;
})
})
.then(() => {
return this.quizRepository.findResponses(quizId)
.then((response: AxiosResponse<RestResponse<ResponseWithQuestion>>) => {
this.responses = response.data._embedded.responses;
return response;
})
})
.then(() => {
return this.axeRepository.findAll()
.then((response: AxiosResponse<RestResponse<Axe>>) => {
@ -82,8 +69,12 @@ export default class Result extends Vue {
}
}
getScore(axe: Axe) {
return this.scores.find(value => value.axeIdentifier === axe.identifier);
getScore(axe: Axe): Score {
const responses = this.getResponses(axe);
return {
axeIdentifier: axe.identifier,
scoreAvg: responses.reduce((total, response) => total + response.score, 0) / responses.length
};
}
getResponses(axe: Axe) {

View File

@ -7,6 +7,7 @@
<quiz-part
:key="currentAxe.identifier" :axe-number="currentAxe.identifier" :total-axes="axes.length"
:title="currentAxe.title"
:description="currentAxe.description"
:color="currentAxe.color"
:icon="'balise_' + currentAxe.identifier + '.svg'"
:questions="questions.get(currentAxe.identifier)"
@ -43,7 +44,7 @@
import {AxiosResponse} from "axios";
import {Component, Vue} from "nuxt-property-decorator";
import {RepositoryFactory} from "~/repositories/RepositoryFactory";
import {Axe} from "~/repositories/models/axe.model";
import {AxeWithQuestions} from "~/repositories/models/axe.model";
import {RestResponse} from "~/repositories/models/rest-response.model";
import {Question} from "~/repositories/models/question.model";
import {Quiz} from "~/repositories/models/quiz.model";
@ -53,10 +54,9 @@ import {quizStore} from "~/utils/store-accessor";
export default class Login extends Vue {
readonly axeRepository = RepositoryFactory.get("axe");
readonly questionRepository = RepositoryFactory.get("question");
private axes: Axe[] = [];
private currentAxe?: Axe;
private axes: AxeWithQuestions[] = [];
private currentAxe?: AxeWithQuestions | undefined;
private currentAxeIdentifier = 1;
private questions: Map<number, Question[]> = new Map<number, []>();
private loading = true;
@ -67,29 +67,18 @@ export default class Login extends Vue {
this.loading = true;
this.axeRepository
.findAll()
.then((response: AxiosResponse<RestResponse<Axe>>) => {
.then((response: AxiosResponse<RestResponse<AxeWithQuestions>>) => {
this.axes = response.data._embedded.axes;
const promises: any[] = [];
this.axes.forEach(axe => {
promises.push(
this.questionRepository
.findAllByAxeId(axe.identifier)
.then((response: AxiosResponse<RestResponse<Question>>) => {
return {
axeId: axe.identifier,
questions: response.data._embedded.questions
};
}));
this.questions.set(axe.identifier, axe.questions);
});
Promise.all(promises).then((axeQuestions) => {
axeQuestions.forEach(axeQuestion => {
this.questions.set(axeQuestion.axeId, axeQuestion.questions)
});
quizStore.initialize(this.questions);
this.initializeState();
quizStore.initialize(this.questions);
})
.finally(() => {
this.loading = false;
});
});
}
showPrevious() {

View File

@ -1,9 +1,9 @@
import {Axe} from "~/repositories/models/axe.model";
import {RestResponse} from "~/repositories/models/rest-response.model";
import {$axios} from "~/utils/api";
import {AxeWithQuestions} from "~/repositories/models/axe.model";
export default {
findAll() {
return $axios.get<RestResponse<Axe>>("/axes");
return $axios.get<RestResponse<AxeWithQuestions>>("/axes/search/me");
}
}

View File

@ -1,8 +1,19 @@
import {RestLinks} from "~/repositories/models/rest-response.model";
import {Question} from "~/repositories/models/question.model";
export interface Axe extends RestLinks {
identifier: number;
shortTitle: string;
description: string;
title: string;
color: string;
}
export interface AxeWithQuestions extends RestLinks {
identifier: number;
shortTitle: string;
description: string;
title: string;
color: string;
questions: Question[];
}

View File

@ -5,19 +5,6 @@ export interface Score {
axeIdentifier: number;
}
export interface Quiz extends RestLinks {
id: number;
createdDate: string;
scores: Score[];
}
export interface Response {
axeId: number;
questionId: number;
score?: number;
comment?: string;
}
export interface ResponseWithQuestion extends RestLinks {
axeIdentifier: number;
question: string;
@ -25,6 +12,22 @@ export interface ResponseWithQuestion extends RestLinks {
comment: string;
}
export interface Quiz extends RestLinks {
id: number;
createdDate: string;
scores: Score[];
_embedded: {
responses: ResponseWithQuestion[]
};
}
export interface Response {
axeId: number;
questionId: number;
score?: number;
comment?: string;
}
export interface QuizRate {
score?: number;
comment?: string;