Compare commits
3 Commits
2c12fc075f
...
33f811e6b7
| Author | SHA1 | Date | |
|---|---|---|---|
| 33f811e6b7 | |||
| 9e03bb3873 | |||
| f104c89d08 |
@ -4,29 +4,55 @@ import jakarta.persistence.EntityNotFoundException;
|
|||||||
import org.cmh.backend.NewsManagement.dto.GetNewsListResponse;
|
import org.cmh.backend.NewsManagement.dto.GetNewsListResponse;
|
||||||
import org.cmh.backend.NewsManagement.dto.MessageResponse;
|
import org.cmh.backend.NewsManagement.dto.MessageResponse;
|
||||||
import org.cmh.backend.NewsManagement.dto.NewsRequest;
|
import org.cmh.backend.NewsManagement.dto.NewsRequest;
|
||||||
|
import org.cmh.backend.NewsManagement.dto.SearchNewsRequest;
|
||||||
import org.cmh.backend.NewsManagement.model.News;
|
import org.cmh.backend.NewsManagement.model.News;
|
||||||
import org.cmh.backend.NewsManagement.service.NewsService;
|
import org.cmh.backend.NewsManagement.service.NewsService;
|
||||||
|
import org.cmh.backend.Utils.JwtUtil;
|
||||||
import org.cmh.backend.Utils.JwtVerify;
|
import org.cmh.backend.Utils.JwtVerify;
|
||||||
|
import org.cmh.backend.authentication.model.UserHS;
|
||||||
|
import org.cmh.backend.authentication.service.UserService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.dao.DataIntegrityViolationException;
|
import org.springframework.dao.DataIntegrityViolationException;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/news")
|
@RequestMapping("/news")
|
||||||
public class NewsController {
|
public class NewsController {
|
||||||
@Autowired
|
@Autowired
|
||||||
private NewsService newsService;
|
private NewsService newsService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserService userService;
|
||||||
|
|
||||||
@GetMapping
|
@GetMapping
|
||||||
@JwtVerify
|
@JwtVerify
|
||||||
public ResponseEntity<GetNewsListResponse> getNewsByRange(@RequestParam Integer start, @RequestParam Integer end, @RequestParam String token) {
|
public ResponseEntity<GetNewsListResponse> getNewsByRange(@RequestParam Integer start, @RequestParam Integer end, @RequestParam String token) {
|
||||||
|
String username = JwtUtil.extractUsername(token);
|
||||||
|
UserHS user = userService.getUserByUsername(username);
|
||||||
|
// TODO:完善用户权限
|
||||||
|
if (user.getSuperAdmin()) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (start >= end) {
|
if (start >= end) {
|
||||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||||
}
|
}
|
||||||
long newsCount = newsService.getNewsCount();
|
long newsCount = newsService.getNewsCount();
|
||||||
return new ResponseEntity<>(new GetNewsListResponse(newsCount, newsService.getNewsByRange(start, end)), HttpStatus.OK);
|
return new ResponseEntity<>(new GetNewsListResponse(newsCount, newsService.getNewsByRange(start, end, user)), HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/search")
|
||||||
|
@JwtVerify
|
||||||
|
public ResponseEntity<GetNewsListResponse> searchNews(@RequestBody SearchNewsRequest request) {
|
||||||
|
List<News> newsList = newsService.searchNews(request);
|
||||||
|
long newsCount = newsList.size();
|
||||||
|
return new ResponseEntity<>(new GetNewsListResponse(newsCount, newsList), HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/{id}")
|
@GetMapping("/{id}")
|
||||||
|
|||||||
@ -0,0 +1,15 @@
|
|||||||
|
package org.cmh.backend.NewsManagement.dto;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.cmh.backend.Utils.JwtRequest;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class SearchNewsRequest extends JwtRequest {
|
||||||
|
private String author;
|
||||||
|
private String title;
|
||||||
|
private String imagePath;
|
||||||
|
private String summary;
|
||||||
|
private String sortBy;
|
||||||
|
}
|
||||||
@ -31,6 +31,6 @@ public class News {
|
|||||||
|
|
||||||
@CreationTimestamp
|
@CreationTimestamp
|
||||||
private LocalDateTime createdAt;
|
private LocalDateTime createdAt;
|
||||||
|
// TODO:添加外键绑定
|
||||||
private String tenant;
|
private String tenant;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,19 @@ import org.springframework.data.domain.Page;
|
|||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public interface NewsRepository extends JpaRepository<News, Long> {
|
public interface NewsRepository extends JpaRepository<News, Long> {
|
||||||
Page<News> findAllByOrderByIdDesc(Pageable pageable);
|
Page<News> findAllByOrderByIdDesc(Pageable pageable);
|
||||||
|
|
||||||
|
Page<News> findByTenantOrderByIdDesc(String tenant, Pageable pageable);
|
||||||
|
|
||||||
|
List<News> findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContainingAndTenantEquals(
|
||||||
|
String title,
|
||||||
|
String summary,
|
||||||
|
String author,
|
||||||
|
String imagePath,
|
||||||
|
String tenant);
|
||||||
|
|
||||||
|
List<News> findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContaining(String title, String summary, String author, String imagePath);
|
||||||
}
|
}
|
||||||
@ -1,9 +1,19 @@
|
|||||||
package org.cmh.backend.NewsManagement.service;
|
package org.cmh.backend.NewsManagement.service;
|
||||||
|
|
||||||
|
import jakarta.persistence.EntityManager;
|
||||||
import jakarta.persistence.EntityNotFoundException;
|
import jakarta.persistence.EntityNotFoundException;
|
||||||
|
import jakarta.persistence.PersistenceContext;
|
||||||
|
import jakarta.persistence.criteria.CriteriaBuilder;
|
||||||
|
import jakarta.persistence.criteria.CriteriaQuery;
|
||||||
|
import jakarta.persistence.criteria.Predicate;
|
||||||
|
import jakarta.persistence.criteria.Root;
|
||||||
import org.cmh.backend.NewsManagement.dto.NewsRequest;
|
import org.cmh.backend.NewsManagement.dto.NewsRequest;
|
||||||
|
import org.cmh.backend.NewsManagement.dto.SearchNewsRequest;
|
||||||
import org.cmh.backend.NewsManagement.model.News;
|
import org.cmh.backend.NewsManagement.model.News;
|
||||||
import org.cmh.backend.NewsManagement.repository.NewsRepository;
|
import org.cmh.backend.NewsManagement.repository.NewsRepository;
|
||||||
|
import org.cmh.backend.Utils.JwtUtil;
|
||||||
|
import org.cmh.backend.authentication.model.UserHS;
|
||||||
|
import org.cmh.backend.authentication.service.UserService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
import org.springframework.data.domain.PageRequest;
|
import org.springframework.data.domain.PageRequest;
|
||||||
@ -18,7 +28,13 @@ public class NewsService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private NewsRepository newsRepository;
|
private NewsRepository newsRepository;
|
||||||
|
|
||||||
public List<News> getNewsByRange(int start, int end) {
|
@Autowired
|
||||||
|
private UserService userService;
|
||||||
|
|
||||||
|
@PersistenceContext
|
||||||
|
private EntityManager entityManager;
|
||||||
|
|
||||||
|
public List<News> getNewsByRange(int start, int end, UserHS user) {
|
||||||
if (start < 0 || end <= start) {
|
if (start < 0 || end <= start) {
|
||||||
throw new IllegalArgumentException("Invalid start or end range");
|
throw new IllegalArgumentException("Invalid start or end range");
|
||||||
}
|
}
|
||||||
@ -31,7 +47,12 @@ public class NewsService {
|
|||||||
|
|
||||||
for (int pageNumber = startPageNumber; pageNumber <= endPageNumber; pageNumber++) {
|
for (int pageNumber = startPageNumber; pageNumber <= endPageNumber; pageNumber++) {
|
||||||
Pageable pageable = PageRequest.of(pageNumber, pageSize);
|
Pageable pageable = PageRequest.of(pageNumber, pageSize);
|
||||||
Page<News> newsPage = newsRepository.findAllByOrderByIdDesc(pageable);
|
Page<News> newsPage = null;
|
||||||
|
if (user.getSuperAdmin()) {
|
||||||
|
newsPage = newsRepository.findAllByOrderByIdDesc(pageable);
|
||||||
|
} else {
|
||||||
|
newsPage = newsRepository.findByTenantOrderByIdDesc(user.getUsername(), pageable);
|
||||||
|
}
|
||||||
|
|
||||||
if (newsPage.hasContent()) {
|
if (newsPage.hasContent()) {
|
||||||
result.addAll(newsPage.getContent());
|
result.addAll(newsPage.getContent());
|
||||||
@ -92,4 +113,63 @@ public class NewsService {
|
|||||||
public long getNewsCount() {
|
public long getNewsCount() {
|
||||||
return newsRepository.count();
|
return newsRepository.count();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO:完善用户权限
|
||||||
|
// public List<News> searchNews(SearchNewsRequest request) {
|
||||||
|
// String username = JwtUtil.extractUsername(request.getToken());
|
||||||
|
// UserHS user = userService.getUserByUsername(username);
|
||||||
|
// if (user.getSuperAdmin()) {
|
||||||
|
// return newsRepository.findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContaining(
|
||||||
|
// request.getTitle(),
|
||||||
|
// request.getSummary(),
|
||||||
|
// request.getAuthor(),
|
||||||
|
// request.getImagePath()
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// return newsRepository.findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContainingAndTenantEquals(
|
||||||
|
// request.getTitle(),
|
||||||
|
// request.getSummary(),
|
||||||
|
// request.getAuthor(),
|
||||||
|
// request.getImagePath(),
|
||||||
|
// user.getUsername()
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
public List<News> searchNews(SearchNewsRequest request) {
|
||||||
|
String username = JwtUtil.extractUsername(request.getToken());
|
||||||
|
UserHS user = userService.getUserByUsername(username);
|
||||||
|
|
||||||
|
// Create a list to hold predicates
|
||||||
|
List<Predicate> predicates = new ArrayList<>();
|
||||||
|
// Create the query
|
||||||
|
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
|
||||||
|
CriteriaQuery<News> criteriaQuery = criteriaBuilder.createQuery(News.class);
|
||||||
|
Root<News> root = criteriaQuery.from(News.class);
|
||||||
|
|
||||||
|
// Build the query conditionally based on non-empty fields
|
||||||
|
if (!request.getTitle().isEmpty()) {
|
||||||
|
predicates.add(criteriaBuilder.like(root.get("title"), "%" + request.getTitle() + "%"));
|
||||||
|
}
|
||||||
|
if (!request.getSummary().isEmpty()) {
|
||||||
|
predicates.add(criteriaBuilder.like(root.get("summary"), "%" + request.getSummary() + "%"));
|
||||||
|
}
|
||||||
|
if (!request.getAuthor().isEmpty()) {
|
||||||
|
predicates.add(criteriaBuilder.like(root.get("author"), "%" + request.getAuthor() + "%"));
|
||||||
|
}
|
||||||
|
if (!request.getImagePath().isEmpty()) {
|
||||||
|
predicates.add(criteriaBuilder.like(root.get("imagePath"), "%" + request.getImagePath() + "%"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (user.getSuperAdmin()) {
|
||||||
|
// Combine predicates with OR
|
||||||
|
criteriaQuery.where(criteriaBuilder.or(predicates.toArray(new Predicate[0])));
|
||||||
|
} else {
|
||||||
|
// Combine predicates with OR and add tenant condition
|
||||||
|
Predicate tenantPredicate = criteriaBuilder.equal(root.get("tenant"), user.getUsername());
|
||||||
|
predicates.add(tenantPredicate);
|
||||||
|
criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[0])));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute the query
|
||||||
|
return entityManager.createQuery(criteriaQuery).getResultList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user