Commit f0ef0f59 authored by aimagambetov_an's avatar aimagambetov_an

issue-23 refactor tempalate/getAll

parent 8d1241ec
Pipeline #380 failed with stage
......@@ -2,8 +2,10 @@ package kz.project.printedFormsService.config;
import kz.project.printedFormsService.exception.AccessDeniedException;
import lombok.experimental.UtilityClass;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.jwt.Jwt;
import java.util.ArrayList;
import java.util.List;
......@@ -34,25 +36,33 @@ public class SecurityContextUtils {
}
public static Map<String, List<String>> getProjectRoleMap() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return SecurityContextHolder
.getContext()
.getAuthentication()
.getAuthorities()
.stream()
.map(GrantedAuthority::getAuthority)
.map(role -> role.replace("ROLE_", ""))
.filter(role -> role.contains(PROJECT_ROLE_SPLITTER))
.filter(role -> !role.contains("gitlab_"))
.collect(Collectors.toMap(
role -> role.split(PROJECT_ROLE_SPLITTER)[0],
role -> new ArrayList<>(List.of(role.split(PROJECT_ROLE_SPLITTER)[1])),
(existing, addition) -> {
existing.addAll(addition);
return existing;
}
)
);
if (authentication != null && authentication.getPrincipal() instanceof Jwt jwt) {
// Access resource_access claims
Map<String, Object> resourceAccess = jwt.getClaim("resource_access");
// Extract roles or permissions from resource_access
if (resourceAccess != null && resourceAccess.containsKey("print_form")) {
Map<String, Object> yourResourceAccess = (Map<String, Object>) resourceAccess.get("print_form");
// Extract roles from yourResourceAccess
if (yourResourceAccess != null && yourResourceAccess.containsKey("roles")) {
List<String> roles = (List<String>) yourResourceAccess.get("roles");
return roles.stream().collect(Collectors.toMap(
role -> role.split(PROJECT_ROLE_SPLITTER)[0],
role -> new ArrayList<>(List.of(role.split(PROJECT_ROLE_SPLITTER)[1])),
(existing, addition) -> {
existing.addAll(addition);
return existing;
}
)
);
}
}
}
return null;
}
public static String getGitlabProjectBranchFromRole() {
......
......@@ -22,6 +22,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.HttpStatus;
import org.springframework.data.domain.Sort;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
......@@ -275,7 +276,7 @@ public class TemplateController {
try {
processLogger.start(TemplateController.class, new Throwable().getStackTrace()[0].getMethodName(), "Получение списка шаблонов");
Page<TemplateShortDto> allTemplates = service.getAllTemplate(isActive, PageRequest.of(page, size), search);
Page<TemplateShortDto> allTemplates = service.getAllTemplate(isActive, PageRequest.of(page, size, Sort.Direction.ASC, "id"), search);
processLogger.finish(TemplateController.class, new Throwable().getStackTrace()[0].getMethodName(), "Получение списка шаблонов");
return ResponseEntity.ok(allTemplates);
} catch (Exception e) {
......
......@@ -10,9 +10,11 @@ import lombok.NoArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Data
@Builder
......@@ -43,7 +45,11 @@ public class TemplateShortDto {
@Schema(name ="version", description = "Версия активности")
private Integer version;
public static TemplateShortDto toDto(TemplateEntity te) {
@NotBlank
@Schema(name ="rights", description = "Права в проекте")
private List<String> rights;
public static TemplateShortDto toDto(TemplateEntity te, List<String> projectRoleMap) {
return TemplateShortDto.builder()
.templateId(te.getId())
.name(te.getName())
......@@ -52,15 +58,18 @@ public class TemplateShortDto {
.project(te.getProject())
.type(te.getType().getCode())
.version(te.getVersion())
.rights(projectRoleMap)
.build();
}
public static Page<TemplateShortDto> toDtoList(Page<TemplateEntity> all) {
if(all.getContent()==null)return null;
public static Page<TemplateShortDto> toDtoList(Page<TemplateEntity> all, Map<String, List<String>> projectRoleMap) {
List<TemplateShortDto> dtos = new ArrayList<>();
for (TemplateEntity te:all.getContent()) {
dtos.add(TemplateShortDto.toDto(te));
if (all != null) {
for (TemplateEntity te : all.getContent()) {
dtos.add(TemplateShortDto.toDto(te, projectRoleMap.get(te.getProject())));
}
all.getTotalElements();
}
return new PageImpl<>(dtos, PageRequest.of(all.getNumber(),all.getSize()),all.getTotalElements());
return new PageImpl<>(dtos, all.getPageable(), all.getTotalElements());
}
}
package kz.project.printedFormsService.data.repository;
import kz.project.printedFormsService.data.entity.TemplateEntity;
import kz.project.printedFormsService.data.entity.dict.DTemplateType;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@RequiredArgsConstructor
public class TemplateJdbcRepository {
private final JdbcTemplate jdbcTemplate;
public Page<TemplateEntity> findAllByStatusAndFilter(Boolean isActive,
Pageable pageable,
String search,
List<String> projects) {
StringBuilder inClause = new StringBuilder("t.project IN (?");
inClause.append(", ?".repeat(Math.max(0, projects.size() - 1)));
inClause.append(")");
String sql = "SELECT t.*, type.id as typeId, type.code as typeCode, type.name as typeName FROM template_schema.template t " +
"INNER JOIN template_schema.d_template_type type ON t.type_id = type.id " +
"WHERE " + inClause;
if (isActive != null) {
sql += " AND t.status = " + isActive;
}
if (search != null) {
sql += " AND (t.code = '" + search + "' OR t.name = '" + search + "')";
}
sql += " LIMIT ? OFFSET ?";
Object[] queryParams = projects.toArray();
Object[] additionalParams = {pageable.getPageSize(), pageable.getOffset()};
Object[] allParams = ArrayUtils.addAll(queryParams, additionalParams);
List<TemplateEntity> result = jdbcTemplate.query(sql, allParams, (rs, rowNum) -> {
DTemplateType type = new DTemplateType();
type.setId(rs.getLong("typeId"));
type.setCode(rs.getString("typeCode"));
type.setName(rs.getString("typeName"));
TemplateEntity templateEntity = new TemplateEntity();
templateEntity.setId(rs.getLong("id"));
templateEntity.setCode(rs.getString("code"));
templateEntity.setName(rs.getString("name"));
templateEntity.setStatus(rs.getBoolean("status"));
templateEntity.setProject(rs.getString("project"));
templateEntity.setVersion(rs.getInt("version"));
templateEntity.setType(type);
return templateEntity;
});
return new PageImpl<>(result, pageable, 100L);
}
}
......@@ -6,12 +6,16 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
@Repository
public interface TemplateRepository extends JpaRepository<TemplateEntity, Long> {
Optional<TemplateEntity> findByCode(String code);
Page<TemplateEntity> findByCodeContainingIgnoreCaseOrNameContainingIgnoreCaseAndStatusAndProjectIsIn(String code, String name, Boolean status, List<String> projects, Pageable pageable);
Page<TemplateEntity> findByStatusAndProjectIsIn(Boolean status, List<String> projects, Pageable pageable);
Page<TemplateEntity> findAllByStatusTrue(Pageable pageable);
Page<TemplateEntity> findAllByStatusFalse(Pageable pageable);
......
......@@ -7,6 +7,7 @@ import kz.project.printedFormsService.data.dto.TemplateShortDto;
import kz.project.printedFormsService.data.entity.TemplateEntity;
import kz.project.printedFormsService.exception.ValidationException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.web.multipart.MultipartFile;
......
......@@ -24,14 +24,10 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class TemplateServiceImpl implements TemplateService {
private final TemplateRepository repository;
private final TemplateJdbcRepository templateJdbcRepository;
private final TemplateVersionRepository versionRepository;
private final DTemplateTypeRepository dTemplateTypeRepository;
......@@ -40,14 +36,12 @@ public class TemplateServiceImpl implements TemplateService {
private ProcessLogger processLogger;
public TemplateServiceImpl(TemplateRepository repository,
TemplateJdbcRepository templateJdbcRepository,
TemplateVersionRepository versionRepository,
DTemplateTypeRepository dTemplateTypeRepository,
TemplateFileInfoRepository fileInfoRepository,
DocumentRepository documentRepository,
ProcessLogger processLogger) {
this.repository = repository;
this.templateJdbcRepository = templateJdbcRepository;
this.versionRepository = versionRepository;
this.dTemplateTypeRepository = dTemplateTypeRepository;
this.fileInfoRepository = fileInfoRepository;
......@@ -134,12 +128,18 @@ public class TemplateServiceImpl implements TemplateService {
public Page<TemplateShortDto> getAllTemplate(Boolean isActive, Pageable pageable, String search) {
Map<String, List<String>> projectRoleMap = SecurityContextUtils.getProjectRoleMap();
List<String> valuesToCheck = Arrays.asList("creator", "editor", "delete", "admin");
List<String> projects = projectRoleMap.entrySet()
.stream()
.filter(entry -> valuesToCheck.stream().anyMatch(entry.getValue()::contains))
.map(Map.Entry::getKey)
.toList();
return TemplateShortDto.toDtoList(templateJdbcRepository.findAllByStatusAndFilter(isActive, pageable, search, projects));
List<String> projects = new ArrayList<>();
if (projectRoleMap != null) {
projects = projectRoleMap.entrySet()
.stream()
.filter(entry -> valuesToCheck.stream().anyMatch(entry.getValue()::contains))
.map(Map.Entry::getKey)
.toList();
}
if (search != null) {
return TemplateShortDto.toDtoList(repository.findByCodeContainingIgnoreCaseOrNameContainingIgnoreCaseAndStatusAndProjectIsIn(search, search, isActive, projects, pageable), projectRoleMap);
}
return TemplateShortDto.toDtoList(repository.findByStatusAndProjectIsIn(isActive, projects, pageable), projectRoleMap);
}
@Override
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment