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.MessageResponse;
|
||||
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.service.NewsService;
|
||||
import org.cmh.backend.Utils.JwtUtil;
|
||||
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.dao.DataIntegrityViolationException;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/news")
|
||||
public class NewsController {
|
||||
@Autowired
|
||||
private NewsService newsService;
|
||||
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
|
||||
@GetMapping
|
||||
@JwtVerify
|
||||
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) {
|
||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
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}")
|
||||
|
||||
@ -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
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
// TODO:添加外键绑定
|
||||
private String tenant;
|
||||
}
|
||||
|
||||
@ -5,6 +5,19 @@ import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface NewsRepository extends JpaRepository<News, Long> {
|
||||
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;
|
||||
|
||||
import jakarta.persistence.EntityManager;
|
||||
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.SearchNewsRequest;
|
||||
import org.cmh.backend.NewsManagement.model.News;
|
||||
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.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
@ -18,7 +28,13 @@ public class NewsService {
|
||||
@Autowired
|
||||
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) {
|
||||
throw new IllegalArgumentException("Invalid start or end range");
|
||||
}
|
||||
@ -31,7 +47,12 @@ public class NewsService {
|
||||
|
||||
for (int pageNumber = startPageNumber; pageNumber <= endPageNumber; pageNumber++) {
|
||||
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()) {
|
||||
result.addAll(newsPage.getContent());
|
||||
@ -92,4 +113,63 @@ public class NewsService {
|
||||
public long getNewsCount() {
|
||||
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