Added new quizz button and role

This commit is contained in:
Samy Avrillon 2025-06-13 19:46:26 +02:00
parent 225b5df774
commit 08262f3dfd
Signed by: Mysaa
GPG Key ID: 0220AC4A3D6A328B
7 changed files with 42 additions and 16 deletions

View File

@ -4,7 +4,7 @@ import org.springframework.security.core.GrantedAuthority;
public enum Privilege implements GrantedAuthority {
LIST_USERS,ADD_USERS,LIST_QUIZZ;
LIST_USERS,ADD_USERS,LIST_QUIZZ,CREATE_QUIZZ,VIEW_ALL_FORMS;
@Override
public String getAuthority() {

View File

@ -12,6 +12,8 @@ public interface QuizzManager {
public JsonNode answer(User user, long quizzId,JsonNode data);
public JsonNode next(User user, long quizzId);
public Quizz newQuizz(User user);
public boolean canAccessQuizz(User user, long quizzId);
public List<Quizz> editableQuizz(User user);
public List<Quizz> answerableQuizz(User user);

View File

@ -65,6 +65,8 @@ public class QuizzManagerImpl implements QuizzManager {
Optional<Quizz> oquizz = qRepository.findById(quizzId);
if(!oquizz.isPresent())
return errorNode("Could not find the quizz with id "+quizzId);
if(!oquizz.get().isComplete())
return errorNode("Quizz is not complete");
Quizz quizz = oquizz.get();
QuizzForm qf = qfRepository.findByUserAndQuizz(user, quizz);
if(qf == null)
@ -124,6 +126,8 @@ public class QuizzManagerImpl implements QuizzManager {
Optional<Quizz> oquizz = qRepository.findById(quizzId);
if(!oquizz.isPresent())
return errorNode("Could not find quizz with id "+quizzId);
if(!oquizz.get().isComplete())
return errorNode("Quizz is not complete");
Quizz quizz = oquizz.get();
QuizzForm qf = qfRepository.findByUserAndQuizz(user, quizz);
if(qf == null){
@ -165,7 +169,7 @@ public class QuizzManagerImpl implements QuizzManager {
return out;
}
public QuizzForm newQuizzForm(User user, Quizz quizz) {
private QuizzForm newQuizzForm(User user, Quizz quizz) {
QuizzForm qf = new QuizzForm();
qf.setUser(user);
qf.setQuizz(quizz);
@ -176,7 +180,16 @@ public class QuizzManagerImpl implements QuizzManager {
return qf;
}
public static final JsonNode errorNode(String err){
@Override
public Quizz newQuizz(User user) {
Quizz q = new Quizz();
q.setName("Super questions de "+user.getName()+" ("+Integer.toHexString((int)(Math.random()*0xFFFFFFF))+")");
q.setOwner(user);
q = qRepository.save(q);
return q;
}
private static final JsonNode errorNode(String err){
ObjectNode out = JsonNodeFactory.instance.objectNode();
out.set("success", JsonNodeFactory.instance.booleanNode(false));
out.set("message", JsonNodeFactory.instance.textNode(err));

View File

@ -41,18 +41,6 @@ public class AuthController {
return "login";
}
public User getLoggedInUser() {
if(SecurityContextHolder.getContext().getAuthentication().getPrincipal()
instanceof org.springframework.security.core.userdetails.User){
org.springframework.security.core.userdetails.User user
= (org.springframework.security.core.userdetails.User)
SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return userService.findUserByName(user.getUsername());
} else {
return null;
}
}
@GetMapping("/")
public String index(Model model) {

View File

@ -11,10 +11,12 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.bernard.misael.model.Privilege;
import com.bernard.misael.model.Quizz;
import com.bernard.misael.model.User;
import com.bernard.misael.questions.QTypes;
@ -57,6 +59,7 @@ public class QuestionsController {
model.addAttribute("answerableQuizz",qm.answerableQuizz(u));
model.addAttribute("editableQuizz",qm.editableQuizz(u));
}
return "quizz.html";
}
@ -99,6 +102,18 @@ public class QuestionsController {
return new ResponseEntity<>(out, HttpStatus.OK);
}
@GetMapping("/new-quizz")
@Secured("CREATE_QUIZZ")
public Object newQuizz(Principal p, Model m) {
if (p==null)
return "redirect:/login?restricted";
User u = ur.findByName(p.getName());
if (u==null)
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
Quizz q = qm.newQuizz(u);
return "redirect:/questions/quizz-edit/"+Long.toString(q.getId());
}
Logger logger = LoggerFactory.getLogger(QuestionsController.class);
@GetMapping("/quizz-edit/{q}")
@ -106,7 +121,6 @@ public class QuestionsController {
if (p==null)
return "redirect:/login?restricted";
User u = ur.findByName(p.getName());
logger.info("An INFO Message");
if (u==null || !qm.canEditQuizz(u, quizzId))
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
m.addAttribute("quizzId", quizzId);

View File

@ -0,0 +1,8 @@
alter table role_privileges drop constraint role_privileges_privileges_check;
alter table role_privileges add constraint role_privileges_privileges_check
check (privileges in ('LIST_USERS','ADD_USERS','LIST_QUIZZ','CREATE_QUIZZ','VIEW_ALL_FORMS'));
insert into role_privileges VALUES
((select id from roles where "name" = 'ADMIN'),'CREATE_QUIZZ');
insert into role_privileges VALUES
((select id from roles where "name" = 'ADMIN'),'VIEW_ALL_FORMS');

View File

@ -17,6 +17,7 @@
<li th:if="${#lists.isEmpty(editableQuizz)}">Aucun quizz de disponible malheureusement :(</li>
<li th:each="q : ${editableQuizz}"><a th:href="@{/questions/quizz-edit/{id}(id=${q.id})}">Quizz <span th:text="${q.name}"/></a></li>
</ul>
<a sec:authorize="hasAuthority('CREATE_QUIZZ')" th:href="@{/questions/new-quizz}">Nouveau Quizz</a>
</main>
</body>
</html>