Added quizz, answers and security

This commit is contained in:
Samy Avrillon 2025-02-23 10:25:27 +01:00
parent 4f3814bd7e
commit 001ff8b5cb
Signed by: Mysaa
GPG Key ID: 0220AC4A3D6A328B
11 changed files with 216 additions and 22 deletions

View File

@ -1,17 +1,26 @@
package com.bernard.misael; package com.bernard.misael;
import java.security.Principal;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import com.bernard.misael.model.User;
import com.bernard.misael.service.UserService;
@Configuration @Configuration
@EnableWebSecurity @EnableWebSecurity
public class SpringSecurity { public class SpringSecurity {

View File

@ -0,0 +1,37 @@
package com.bernard.misael.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.Lob;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="answers")
public class Answer {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private long id;
@ManyToOne
@JoinColumn(name = "question",nullable = false)
private Question question;
@Lob
private String value;
}

View File

@ -0,0 +1,32 @@
package com.bernard.misael.model;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="questions")
public class Question {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private long id;
@Column(nullable=false)
private int index;
@ManyToOne
@JoinColumn(name = "quizz",nullable = false)
private Quizz quizz;
@Lob
private String value;
}

View File

@ -0,0 +1,42 @@
package com.bernard.misael.model;
import java.util.Set;
import org.hibernate.annotations.ColumnDefault;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="quizz")
public class Quizz {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable=false, unique=true)
private String name;
@ManyToOne
@JoinColumn(name="owner")
private User owner;
@Column(nullable=false)
@ColumnDefault("false")
private boolean isPublic;
@Column(nullable=false)
@ColumnDefault("0")
private int questionCount;
@OneToMany(mappedBy="quizz")
private Set<Question> questions;
}

View File

@ -0,0 +1,40 @@
package com.bernard.misael.model;
import org.hibernate.annotations.GeneratedColumn;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="quizzf")
public class QuizzForm {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@ManyToOne
@JoinColumn(name = "answerer",nullable = false)
private User user;
@ManyToOne
@JoinColumn(name = "quizz",nullable=false)
private Quizz quizz;
private boolean done;
private int currentQuestion;
private int answerStep;
}

View File

@ -2,17 +2,22 @@ package com.bernard.misael.model;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set;
import org.hibernate.cache.spi.support.AbstractReadWriteAccess.Item;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import lombok.ToString;
@Getter @Getter
@Setter @Setter
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@ToString
@Entity @Entity
@Table(name="users") @Table(name="users")
public class User public class User
@ -34,4 +39,7 @@ public class User
inverseJoinColumns={@JoinColumn(name="ROLE_ID", referencedColumnName="ID")}) inverseJoinColumns={@JoinColumn(name="ROLE_ID", referencedColumnName="ID")})
private List<Role> roles = new ArrayList<>(); private List<Role> roles = new ArrayList<>();
@OneToMany(mappedBy="owner")
private Set<Quizz> myQuizzs;
} }

View File

@ -1,6 +1,5 @@
package com.bernard.misael.web; package com.bernard.misael.web;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;

View File

@ -1,8 +1,16 @@
package com.bernard.misael.web; package com.bernard.misael.web;
import java.security.Principal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import com.bernard.misael.model.User;
import com.bernard.misael.repository.UserRepository;
import com.bernard.misael.service.UserService;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@ -10,11 +18,22 @@ import org.springframework.web.bind.annotation.GetMapping;
@RequestMapping("/questions") @RequestMapping("/questions")
public class QuestionsController { public class QuestionsController {
@Autowired
UserRepository ur;
@GetMapping("/quizz") @GetMapping("/quizz")
/* /*
* List all quizz * List all quizz
*/ */
public String getQuizz() { public String getQuizz(Model model, Principal p) {
User u = null;
if (p!=null)
u = ur.findByName(p.getName());
System.out.println("Loaded as user "+u);
if(u!=null) {
model.addAttribute("quizz",u.getMyQuizzs());
}
return "quizz.html"; return "quizz.html";
} }
@ -24,7 +43,6 @@ public class QuestionsController {
*/ */
public String getForms() { public String getForms() {
return "forms.html"; return "forms.html";
} }
} }

View File

@ -11,17 +11,17 @@ spring:
validate-on-migrate: true validate-on-migrate: true
default-schema: misael default-schema: misael
# jpa: # jpa:
# properties: # properties:
# javax: # javax:
# persistence: # persistence:
# schema-generation: # schema-generation:
# create-source: metadata # create-source: metadata
# scripts: # scripts:
# action: update # action: update
# create-target: db-migration.sql # create-target: db-migration.sql
# database: # database:
# action: none # action: none
# hibernate: # hibernate:
# ddl-auto: none # ddl-auto: none
# generate-ddl: true # generate-ddl: true

View File

@ -0,0 +1,11 @@
create table answers (id bigint generated by default as identity, value oid, question bigint not null, primary key (id));
create table questions (id bigint generated by default as identity, index integer not null, value oid, quizz bigint not null, primary key (id));
create table quizz (id bigint generated by default as identity, is_public boolean default false not null, name varchar(255) not null, question_count integer default 0 not null, owner bigint, primary key (id));
create table quizzf (id bigint generated by default as identity, answer_step integer not null, current_question integer not null, done boolean not null, quizz bigint not null, answerer bigint not null, primary key (id));
alter table if exists quizz drop constraint if exists UKc1plspc0ecmwqqpfaf24avb4c;
alter table if exists quizz add constraint UKc1plspc0ecmwqqpfaf24avb4c unique (name);
alter table if exists answers add constraint FK54dobrdq2u51m4u8s7kg0as8v foreign key (question) references questions;
alter table if exists questions add constraint FKq12h25ynjok1m497gwos511te foreign key (quizz) references quizz;
alter table if exists quizz add constraint FKfeoogns8m4m4hvno1ttqb30wm foreign key (owner) references users;
alter table if exists quizzf add constraint FK4ukbg2yaa93gs5nx1s5d9rqu4 foreign key (quizz) references quizz;
alter table if exists quizzf add constraint FKuj3h8r3i4lnxukdqobapwbuq foreign key (answerer) references users;

View File

@ -7,11 +7,9 @@
<body> <body>
<div th:replace="~{header}"/> <div th:replace="~{header}"/>
<main> <main>
<ul> <ul>
<li><a href="/questions/newform?q=132">Quizz numéro 1</a></li> <li>Premier item ?</li>
<li><a href="/questions/newform?q=177">Quizz numéro 2</a></li> <li th:each="q : ${quizz}"><a th:href="@{/questions/newform/{id}(id=${q.id})}">Quizz <span th:text="${q.name}"/></a></li>
<li><a href="/questions/newform?q=16818">Quizz numéro 3</a></li>
</ul> </ul>
</main> </main>
</body> </body>