Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/main/java/com/be08/smart_notes/common/DefaultConstants.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.be08.smart_notes.common;

public class DefaultConstants {
// Pagination
public static final String PAGE_NUMBER = "1";
public static final String PAGE_SIZE = "6";

// Sorting
public static final String SORT_BY = "updatedAt";
public static final String SORT_ORDER = "desc";
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.be08.smart_notes.controller;

import com.be08.smart_notes.common.DefaultConstants;
import com.be08.smart_notes.dto.request.AttemptDetailUpdateRequest;
import com.be08.smart_notes.dto.response.ApiResponse;
import com.be08.smart_notes.dto.response.AttemptResponse;
import com.be08.smart_notes.dto.response.PageResponse;
import com.be08.smart_notes.dto.view.AttemptView;
import com.be08.smart_notes.service.AttemptService;
import com.fasterxml.jackson.annotation.JsonView;
Expand All @@ -15,8 +17,6 @@
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
@RequestMapping("/api/quizzes")
@RequiredArgsConstructor
Expand All @@ -37,8 +37,10 @@ public ResponseEntity<Object> createAttempt(@PathVariable int quizId) {

@GetMapping("/{quizId}/attempts")
@JsonView(AttemptView.Basic.class)
public ResponseEntity<Object> getAllAttemptsForQuiz(@PathVariable int quizId) {
List<AttemptResponse> attemptResponseList = attemptService.getAllAttemptsByQuizId(quizId);
public ResponseEntity<Object> getAllAttemptsForQuiz(@PathVariable int quizId,
@RequestParam(required = false, defaultValue = DefaultConstants.PAGE_NUMBER) int page,
@RequestParam(required = false, defaultValue = DefaultConstants.PAGE_SIZE) int size) {
PageResponse<AttemptResponse> attemptResponseList = attemptService.getAllAttemptsByQuizId(quizId, page, size);
ApiResponse<Object> apiResponse = ApiResponse.builder()
.message("All attempts for quiz fetched successfully")
.data(attemptResponseList)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
package com.be08.smart_notes.controller;

import java.util.List;

import com.be08.smart_notes.common.DefaultConstants;
import com.be08.smart_notes.dto.response.PageResponse;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

import com.be08.smart_notes.dto.response.ApiResponse;
import com.be08.smart_notes.model.Document;
Expand All @@ -25,8 +21,10 @@ public class DocumentController {
DocumentService documentService;

@GetMapping
public ResponseEntity<Object> getAllDocuments() {
List<Document> documentList = documentService.getAllDocuments();
public ResponseEntity<Object> getAllDocuments(
@RequestParam(required = false, defaultValue = DefaultConstants.PAGE_NUMBER) int page,
@RequestParam(required = false, defaultValue = DefaultConstants.PAGE_SIZE) int size) {
PageResponse<Document> documentList = documentService.getAllDocuments(page, size);
ApiResponse<Object> apiResponse = ApiResponse.builder()
.message("All document fetched successfully")
.data(documentList)
Expand Down
18 changes: 12 additions & 6 deletions src/main/java/com/be08/smart_notes/controller/NoteController.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.be08.smart_notes.controller;

import com.be08.smart_notes.common.DefaultConstants;
import com.be08.smart_notes.dto.filter.BasicFilterDTO;
import com.be08.smart_notes.dto.response.NoteResponse;
import com.be08.smart_notes.dto.response.PageResponse;
import jakarta.validation.Valid;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
Expand All @@ -13,8 +16,6 @@
import com.be08.smart_notes.dto.response.ApiResponse;
import com.be08.smart_notes.service.NoteService;

import java.util.List;

@RestController
@RequestMapping("/api/documents/notes")
@RequiredArgsConstructor
Expand Down Expand Up @@ -43,11 +44,16 @@ public ResponseEntity<Object> getNote(@PathVariable int id) {
}

@GetMapping
public ResponseEntity<Object> getAllNotes() {
List<NoteResponse> noteList = noteService.getAllNotes();
public ResponseEntity<Object> getAllNotes(
@ModelAttribute BasicFilterDTO filterDTO,
@RequestParam(required = false, defaultValue = DefaultConstants.SORT_BY) String sortBy,
@RequestParam(required = false, defaultValue = DefaultConstants.SORT_ORDER) String sortOrder,
@RequestParam(required = false, defaultValue = DefaultConstants.PAGE_NUMBER) int page,
@RequestParam(required = false, defaultValue = DefaultConstants.PAGE_SIZE) int size) {
PageResponse<NoteResponse> pageResponse = noteService.getAllNotes(filterDTO, sortBy, sortOrder, page, size);
ApiResponse<Object> apiResponse = ApiResponse.builder()
.message("Notes fetched successfully")
.data(noteList)
.message("Note fetched successfully")
.data(pageResponse)
.build();
return ResponseEntity.status(HttpStatus.OK).body(apiResponse);
}
Expand Down
14 changes: 11 additions & 3 deletions src/main/java/com/be08/smart_notes/controller/QuizController.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.be08.smart_notes.controller;

import com.be08.smart_notes.common.DefaultConstants;
import com.be08.smart_notes.dto.QuizUpsertDTO;
import com.be08.smart_notes.dto.filter.QuizFilterDTO;
import com.be08.smart_notes.dto.response.ApiResponse;
import com.be08.smart_notes.dto.response.PageResponse;
import com.be08.smart_notes.dto.response.QuizResponse;
import com.be08.smart_notes.dto.view.QuizView;
import com.be08.smart_notes.dto.view.View;
import com.be08.smart_notes.service.QuizService;
import com.be08.smart_notes.validation.group.OnCreate;
import com.be08.smart_notes.validation.group.OnUpdate;
Expand Down Expand Up @@ -39,8 +41,14 @@ public ResponseEntity<Object> createQuiz(@RequestBody @Validated(OnCreate.class)

@GetMapping
@JsonView(QuizView.Basic.class)
public ResponseEntity<Object> getAllQuizzes() {
List<QuizResponse> quizResponseList = quizService.getAllQuizzes();
public ResponseEntity<Object> getAllQuizzes(
@ModelAttribute QuizFilterDTO filterDTO,
@RequestParam(required = false, defaultValue = DefaultConstants.SORT_BY) String sortBy,
@RequestParam(required = false, defaultValue = DefaultConstants.SORT_ORDER) String sortOrder,
@RequestParam(required = false, defaultValue = DefaultConstants.PAGE_NUMBER) int page,
@RequestParam(required = false, defaultValue = DefaultConstants.PAGE_SIZE) int size
) {
PageResponse<QuizResponse> quizResponseList = quizService.getAllQuizzes(filterDTO, sortBy, sortOrder, page, size);
ApiResponse<Object> apiResponse = ApiResponse.builder()
.message("Quizzes fetched successfully")
.data(quizResponseList)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.be08.smart_notes.controller;

import com.be08.smart_notes.common.DefaultConstants;
import com.be08.smart_notes.dto.filter.BasicFilterDTO;
import com.be08.smart_notes.dto.request.QuizSetUpsertRequest;
import com.be08.smart_notes.dto.response.ApiResponse;
import com.be08.smart_notes.dto.response.PageResponse;
import com.be08.smart_notes.dto.response.QuizSetResponse;
import com.be08.smart_notes.dto.view.QuizView;
import com.be08.smart_notes.enums.OriginType;
Expand All @@ -15,8 +18,6 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/quiz-sets")
@RequiredArgsConstructor
Expand All @@ -37,8 +38,13 @@ public ResponseEntity<Object> createQuizSet(@RequestBody @Valid QuizSetUpsertReq

@GetMapping
@JsonView(QuizView.Basic.class)
public ResponseEntity<Object> getAllQuizSets() {
List<QuizSetResponse> quizSetResponseList = quizSetService.getAllQuizSets();
public ResponseEntity<Object> getAllQuizSets(
@ModelAttribute BasicFilterDTO filterDTO,
@RequestParam(required = false, defaultValue = DefaultConstants.SORT_BY) String sortBy,
@RequestParam(required = false, defaultValue = DefaultConstants.SORT_ORDER) String sortOrder,
@RequestParam(required = false, defaultValue = DefaultConstants.PAGE_NUMBER) int page,
@RequestParam(required = false, defaultValue = DefaultConstants.PAGE_SIZE) int size) {
PageResponse<QuizSetResponse> quizSetResponseList = quizSetService.getAllQuizSets(filterDTO, sortBy, sortOrder, page, size);
ApiResponse<Object> apiResponse = ApiResponse.builder()
.message("Quiz set fetched successfully")
.data(quizSetResponseList)
Expand All @@ -60,7 +66,18 @@ public ResponseEntity<Object> getDefaultQuizSet() {
@GetMapping("/{id}")
@JsonView(QuizView.Detail.class)
public ResponseEntity<Object> getQuizSet(@PathVariable int id) {
QuizSetResponse quizSetResponse = quizSetService.getQuizSetById(id);
QuizSetResponse quizSetResponse = quizSetService.getQuizSetById(id, false);
ApiResponse<Object> apiResponse = ApiResponse.builder()
.message("Quiz set fetched successfully")
.data(quizSetResponse)
.build();
return ResponseEntity.status(HttpStatus.OK).body(apiResponse);
}

@GetMapping("/{id}/quizzes")
@JsonView(QuizView.Detail.class)
public ResponseEntity<Object> getQuizSetWithQuizzes(@PathVariable int id) {
QuizSetResponse quizSetResponse = quizSetService.getQuizSetById(id, true);
ApiResponse<Object> apiResponse = ApiResponse.builder()
.message("Quiz set fetched successfully")
.data(quizSetResponse)
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/com/be08/smart_notes/dto/filter/BasicFilterDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.be08.smart_notes.dto.filter;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.FieldDefaults;

import java.time.LocalDate;

@Data
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class BasicFilterDTO {
String keyword;
LocalDate createdFrom;
LocalDate createdTo;
LocalDate updatedFrom;
LocalDate updatedTo;
}
15 changes: 15 additions & 0 deletions src/main/java/com/be08/smart_notes/dto/filter/QuizFilterDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.be08.smart_notes.dto.filter;

import lombok.*;
import lombok.experimental.FieldDefaults;

import java.time.LocalDate;

@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class QuizFilterDTO extends BasicFilterDTO{
Integer quizSetId;
}
21 changes: 8 additions & 13 deletions src/main/java/com/be08/smart_notes/dto/response/NoteResponse.java
Original file line number Diff line number Diff line change
@@ -1,25 +1,20 @@
package com.be08.smart_notes.dto.response;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.*;
import lombok.experimental.FieldDefaults;

import java.time.LocalDateTime;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE)
public class NoteResponse {
private Integer id;
private String title;
private String content;

@JsonFormat(pattern = "dd-MM-yyyy HH:mm:ss")
private LocalDateTime createdAt;

@JsonFormat(pattern = "dd-MM-yyyy HH:mm:ss")
private LocalDateTime updatedAt;
Integer id;
String title;
String content;
LocalDateTime createdAt;
LocalDateTime updatedAt;
}
32 changes: 32 additions & 0 deletions src/main/java/com/be08/smart_notes/dto/response/PageResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.be08.smart_notes.dto.response;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.*;
import lombok.experimental.FieldDefaults;

import java.util.Collections;
import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PageResponse<T> {
@Builder.Default
List<T> pageData = Collections.emptyList();

PageInfo pageInfo;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class PageInfo {
int pageSize;
int currentPage;
int totalPages;
long totalElements;
}
}
13 changes: 9 additions & 4 deletions src/main/java/com/be08/smart_notes/mapper/QuizSetMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@
import com.be08.smart_notes.dto.request.QuizSetUpsertRequest;
import com.be08.smart_notes.dto.response.QuizSetResponse;
import com.be08.smart_notes.model.QuizSet;
import org.mapstruct.BeanMapping;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.*;

import java.util.List;

Expand All @@ -18,6 +15,14 @@ public interface QuizSetMapper {
void updateQuizSet(@MappingTarget QuizSet quizSet, QuizSetUpsertRequest request);

// QuizSet entity <--> QuizSetResponse dto
@Named("basic")
@Mapping(target = "quizzes", ignore = true)
QuizSetResponse toQuizSetResponse(QuizSet quizSet);

@IterableMapping(qualifiedByName = "basic")
List<QuizSetResponse> toQuizSetResponseList(List<QuizSet> quizSet);

// QuizSet with Quizzes
@Named("detail")
QuizSetResponse toQuizSetResponseWithQuizzes(QuizSet quizSet);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.be08.smart_notes.repository;

import com.be08.smart_notes.model.Attempt;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

Expand All @@ -12,4 +14,5 @@ public interface AttemptRepository extends JpaRepository<Attempt, Integer> {
Optional<Attempt> findByIdAndQuiz_QuizSet_UserId(int id, int userId);

List<Attempt> findByQuizIdAndQuiz_QuizSet_UserId(int quizId, int userId);
Page<Attempt> findByQuizIdAndQuiz_QuizSet_UserId(int quizId, int userId, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,23 @@
import java.util.List;
import java.util.Optional;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;

import com.be08.smart_notes.model.Document;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;

@Repository
public interface DocumentRepository extends JpaRepository<Document, Integer> {
List<Document> findAllByUserId(Integer userId);
public interface DocumentRepository extends JpaRepository<Document, Integer>, JpaSpecificationExecutor<Document> {
List<Document> findAllByUserId(int userId);
Page<Document> findAllByUserId(int userId, Pageable pageable);

Optional<Document> findByIdAndUserId(int documentId, int userId);
Optional<Document> findFirstByTitleAndUserId(String title, int userId);

List<Document> findAllByIdIn(List<Integer> ids);
List<Document> findAllByUserIdAndIdIn(Integer userId, List<Integer> ids);
List<Document> findAllByUserIdAndIdIn(int userId, List<Integer> ids);
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package com.be08.smart_notes.repository;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

import com.be08.smart_notes.model.Quiz;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

import java.util.List;
import java.util.Optional;

public interface QuizRepository extends JpaRepository<Quiz, Integer> {
public interface QuizRepository extends JpaRepository<Quiz, Integer>, JpaSpecificationExecutor<Quiz> {
Optional<Quiz> findByIdAndQuizSetUserId(int id, int userId);
List<Quiz> findAllByQuizSetUserId(int userId);
Page<Quiz> findAllByQuizSetUserId(int userId, Pageable pageable);
}
Loading