diff --git a/src/main/java/ru/soune/nocopy/adminpanel/dto/AdminCreateTemplateRequest.java b/src/main/java/ru/soune/nocopy/adminpanel/dto/AdminCreateTemplateRequest.java new file mode 100644 index 0000000..141a2a7 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/adminpanel/dto/AdminCreateTemplateRequest.java @@ -0,0 +1,22 @@ +package ru.soune.nocopy.adminpanel.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.Map; + +@Data +public class AdminCreateTemplateRequest { + + @JsonProperty("permissions") + private Map permissions; + + @JsonProperty("change_password") + private Boolean changePassword; + + @JsonProperty("action") + private String action; + + @JsonProperty("id") + private Long id; +} diff --git a/src/main/java/ru/soune/nocopy/adminpanel/dto/AdminCreateTemplateResponse.java b/src/main/java/ru/soune/nocopy/adminpanel/dto/AdminCreateTemplateResponse.java new file mode 100644 index 0000000..41a37a6 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/adminpanel/dto/AdminCreateTemplateResponse.java @@ -0,0 +1,18 @@ +package ru.soune.nocopy.adminpanel.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class AdminCreateTemplateResponse { + @JsonProperty("id") + private Long id; + + @JsonProperty("permissions") + private String permissions; + + @JsonProperty("change_password") + private Boolean changePassword; +} diff --git a/src/main/java/ru/soune/nocopy/adminpanel/entity/AdminCreateTemplate.java b/src/main/java/ru/soune/nocopy/adminpanel/entity/AdminCreateTemplate.java new file mode 100644 index 0000000..8a405ab --- /dev/null +++ b/src/main/java/ru/soune/nocopy/adminpanel/entity/AdminCreateTemplate.java @@ -0,0 +1,24 @@ +package ru.soune.nocopy.adminpanel.entity; + +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Table(name = "admin_create_template") +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AdminCreateTemplate { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "permission", columnDefinition = "TEXT") + String permission; + + @Column(name = "change_password") + Boolean changePassword; +} diff --git a/src/main/java/ru/soune/nocopy/adminpanel/entity/AdminSectionPermission.java b/src/main/java/ru/soune/nocopy/adminpanel/entity/AdminSectionPermission.java index e1aeff9..0d661e3 100644 --- a/src/main/java/ru/soune/nocopy/adminpanel/entity/AdminSectionPermission.java +++ b/src/main/java/ru/soune/nocopy/adminpanel/entity/AdminSectionPermission.java @@ -66,7 +66,7 @@ public class AdminSectionPermission { @CreatedDate @Column(name = "created_at", updatable = false) - private LocalDateTime createdAt; + private LocalDateTime createdAt = LocalDateTime.now(); @LastModifiedDate @Column(name = "updated_at") diff --git a/src/main/java/ru/soune/nocopy/adminpanel/handler/AdminUserHandler.java b/src/main/java/ru/soune/nocopy/adminpanel/handler/AdminUserHandler.java index 85acc93..9b802c4 100644 --- a/src/main/java/ru/soune/nocopy/adminpanel/handler/AdminUserHandler.java +++ b/src/main/java/ru/soune/nocopy/adminpanel/handler/AdminUserHandler.java @@ -408,7 +408,7 @@ public class AdminUserHandler implements RequestHandler { if (permissionsMap == null || permissionsMap.isEmpty()) { return BaseResponse.builder() .msgId(request.getMsgId()) - .messageCode(MessageCode.INVALID_ACTION.getCode()) + .messageCode(MessageCode.PERMISSION_IS_EMPTY.getCode()) .messageDesc("Permissions map is required") .build(); } diff --git a/src/main/java/ru/soune/nocopy/adminpanel/handler/CreateAdminTemplateHandler.java b/src/main/java/ru/soune/nocopy/adminpanel/handler/CreateAdminTemplateHandler.java new file mode 100644 index 0000000..34b12c6 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/adminpanel/handler/CreateAdminTemplateHandler.java @@ -0,0 +1,194 @@ +package ru.soune.nocopy.adminpanel.handler; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import ru.soune.nocopy.adminpanel.dto.*; +import ru.soune.nocopy.adminpanel.entity.AdminCreateTemplate; +import ru.soune.nocopy.adminpanel.service.AdminCreateTemplateService; +import ru.soune.nocopy.adminpanel.util.MessageCode; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +@Component +@RequiredArgsConstructor +@Slf4j +public class CreateAdminTemplateHandler implements RequestHandler { + + private final ObjectMapper objectMapper; + + private final AdminCreateTemplateService adminCreateTemplateService; + + @Override + public BaseResponse handle(BaseRequest request) { + AdminCreateTemplateRequest adminCreateTemplateRequest = objectMapper.convertValue(request.getMessageBody(), + AdminCreateTemplateRequest.class); + String action = adminCreateTemplateRequest.getAction(); + + return switch (action) { + case "create" -> handleCreate(request, adminCreateTemplateRequest); + case "update" -> handleUpdate(request, adminCreateTemplateRequest); + case "delete" -> handleDelete(request, adminCreateTemplateRequest); + case "get_all" -> handleGetAll(request); + case "get_by_id" -> handleGetById(request, adminCreateTemplateRequest); + default -> handleInvalidAction(request, action); + }; + } + + private BaseResponse handleDelete(BaseRequest request, AdminCreateTemplateRequest adminCreateTemplateRequest) { + Long adminCreateTemplateRequestId = adminCreateTemplateRequest.getId(); + + if (adminCreateTemplateRequestId == null || adminCreateTemplateService.existById(adminCreateTemplateRequestId)) { + return BaseResponse.builder() + .msgId(request.getMsgId()) + .messageCode(MessageCode.TEMPLATE_NOT_FOUND.getCode()) + .messageDesc(MessageCode.TEMPLATE_NOT_FOUND.getDescription()) + .messageBody(Map.of("id", adminCreateTemplateRequest.getId())) + .build(); + } + + adminCreateTemplateService.deleteTemplate(adminCreateTemplateRequestId); + + + return BaseResponse.builder() + .msgId(request.getMsgId()) + .messageCode(MessageCode.SUCCESS.getCode()) + .messageDesc(MessageCode.SUCCESS.getDescription()) + .messageBody(Map.of("id", adminCreateTemplateRequestId)) + .build(); + } + + private BaseResponse handleUpdate(BaseRequest request, AdminCreateTemplateRequest adminCreateTemplateRequest) { + Map permissionsMap = adminCreateTemplateRequest.getPermissions(); + + if (permissionsMap == null || permissionsMap.isEmpty()) { + return BaseResponse.builder() + .msgId(request.getMsgId()) + .messageCode(MessageCode.TEMPLATE_NOT_FOUND.getCode()) + .messageDesc(MessageCode.TEMPLATE_NOT_FOUND.getDescription()) + .messageBody(Map.of("id", adminCreateTemplateRequest.getId())) + .build(); + } + + ObjectNode node = objectMapper.createObjectNode(); + + for (Map.Entry entry: permissionsMap.entrySet()) { + node.put(entry.getKey(), entry.getValue()); + } + + Boolean changePassword = adminCreateTemplateRequest.getChangePassword(); + + AdminCreateTemplate adminTemplate = + adminCreateTemplateService.updateCreateTemplate(node.toString(), changePassword, + adminCreateTemplateRequest.getId()); + + if (adminTemplate == null) { + return BaseResponse.builder() + .msgId(request.getMsgId()) + .messageCode(MessageCode.TEMPLATE_NOT_FOUND.getCode()) + .messageDesc(MessageCode.TEMPLATE_NOT_FOUND.getDescription()) + .messageBody(Map.of("id", adminCreateTemplateRequest.getId())) + .build(); + } + + return BaseResponse.builder() + .msgId(request.getMsgId()) + .messageCode(MessageCode.SUCCESS.getCode()) + .messageDesc(MessageCode.SUCCESS.getDescription()) + .messageBody(convertToResponse(adminTemplate)) + .build(); + } + + private BaseResponse handleCreate(BaseRequest request, AdminCreateTemplateRequest adminCreateTemplateRequest) { + Map permissionsMap = adminCreateTemplateRequest.getPermissions(); + + if (permissionsMap == null || permissionsMap.isEmpty()) { + return BaseResponse.builder() + .msgId(request.getMsgId()) + .messageCode(MessageCode.PERMISSION_IS_EMPTY.getCode()) + .messageDesc("Permissions map is required") + .build(); + } + + ObjectNode node = objectMapper.createObjectNode(); + + for (Map.Entry entry: permissionsMap.entrySet()) { + node.put(entry.getKey(), entry.getValue()); + } + + Boolean changePassword = adminCreateTemplateRequest.getChangePassword(); + + AdminCreateTemplate adminTemplate = + adminCreateTemplateService.createAdminTemplate(node.toString(), changePassword); + + + return BaseResponse.builder() + .msgId(request.getMsgId()) + .messageCode(MessageCode.SUCCESS.getCode()) + .messageDesc(MessageCode.SUCCESS.getDescription()) + .messageBody(convertToResponse(adminTemplate)) + .build(); + } + + private BaseResponse handleGetAll(BaseRequest request) { + List templateResponses = adminCreateTemplateService.getAllTemplates() + .stream() + .map(this::convertToResponse) + .toList(); + + return BaseResponse.builder() + .msgId(request.getMsgId()) + .messageCode(MessageCode.SUCCESS.getCode()) + .messageDesc(MessageCode.SUCCESS.getDescription()) + .messageBody(templateResponses) + .build(); + } + + private BaseResponse handleGetById(BaseRequest request, AdminCreateTemplateRequest adminCreateTemplateRequest) { + Long id = adminCreateTemplateRequest.getId(); + + if (id == null || !adminCreateTemplateService.existById(id)) { + return BaseResponse.builder() + .msgId(request.getMsgId()) + .messageCode(MessageCode.TEMPLATE_NOT_FOUND.getCode()) + .messageDesc(MessageCode.TEMPLATE_NOT_FOUND.getDescription()) + .messageBody(Map.of("id", adminCreateTemplateRequest.getId())) + .build(); + } + + AdminCreateTemplate template = adminCreateTemplateService.getTemplateById(adminCreateTemplateRequest.getId()); + + return BaseResponse.builder() + .msgId(request.getMsgId()) + .messageCode(MessageCode.SUCCESS.getCode()) + .messageDesc(MessageCode.SUCCESS.getDescription()) + .messageBody(convertToResponse(template)) + .build(); + } + + private BaseResponse handleInvalidAction(BaseRequest request, String action) { + ActionResponse response = ActionResponse.builder() + .action(action) + .availableActions(Arrays.asList("create", "update", "delete")) + .build(); + + return BaseResponse.builder() + .msgId(request.getMsgId()) + .messageCode(MessageCode.INVALID_ACTION.getCode()) + .messageDesc(MessageCode.INVALID_ACTION.getDescription()) + .messageBody(response) + .build(); + } + + private AdminCreateTemplateResponse convertToResponse(AdminCreateTemplate adminTemplate) { + return AdminCreateTemplateResponse.builder() + .id(adminTemplate.getId()) + .changePassword(adminTemplate.getChangePassword()) + .permissions(adminTemplate.getPermission()) + .build(); + } +} diff --git a/src/main/java/ru/soune/nocopy/adminpanel/repository/AdminCreateTemplateRepository.java b/src/main/java/ru/soune/nocopy/adminpanel/repository/AdminCreateTemplateRepository.java new file mode 100644 index 0000000..91a5040 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/adminpanel/repository/AdminCreateTemplateRepository.java @@ -0,0 +1,11 @@ +package ru.soune.nocopy.adminpanel.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import ru.soune.nocopy.adminpanel.entity.AdminCreateTemplate; + +@Repository +public interface AdminCreateTemplateRepository extends JpaRepository { + + boolean existsById(Long id); +} diff --git a/src/main/java/ru/soune/nocopy/adminpanel/service/AdminCreateTemplateService.java b/src/main/java/ru/soune/nocopy/adminpanel/service/AdminCreateTemplateService.java new file mode 100644 index 0000000..2598335 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/adminpanel/service/AdminCreateTemplateService.java @@ -0,0 +1,60 @@ +package ru.soune.nocopy.adminpanel.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.soune.nocopy.adminpanel.entity.AdminCreateTemplate; +import ru.soune.nocopy.adminpanel.repository.AdminCreateTemplateRepository; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Slf4j +public class AdminCreateTemplateService { + + private final AdminCreateTemplateRepository adminCreateTemplateRepository; + + public AdminCreateTemplate createAdminTemplate(String permissionsMap, Boolean changePassword) { + AdminCreateTemplate adminCreateTemplate = AdminCreateTemplate.builder() + .permission(permissionsMap) + .changePassword(changePassword) + .build(); + + return adminCreateTemplateRepository.save(adminCreateTemplate); + } + + public AdminCreateTemplate updateCreateTemplate(String permissionsMap, Boolean changePassword, Long id) { + AdminCreateTemplate adminCreateTemplate = adminCreateTemplateRepository.findById(id).orElse(null); + + if (adminCreateTemplate == null) { + return null; + } + + if (!permissionsMap.isEmpty()) { + adminCreateTemplate.setPermission(permissionsMap); + } + + if (changePassword != null) { + adminCreateTemplate.setChangePassword(changePassword); + } + + return adminCreateTemplateRepository.save(adminCreateTemplate); + } + + public void deleteTemplate(Long id) { + adminCreateTemplateRepository.deleteById(id); + } + + public boolean existById(Long id) { + return adminCreateTemplateRepository.existsById(id); + } + + public List getAllTemplates() { + return adminCreateTemplateRepository.findAll(); + } + + public AdminCreateTemplate getTemplateById(Long id) { + return adminCreateTemplateRepository.findById(id).orElse(null); + } +} diff --git a/src/main/java/ru/soune/nocopy/adminpanel/util/MessageCode.java b/src/main/java/ru/soune/nocopy/adminpanel/util/MessageCode.java index 05a0dc6..eee9f6b 100644 --- a/src/main/java/ru/soune/nocopy/adminpanel/util/MessageCode.java +++ b/src/main/java/ru/soune/nocopy/adminpanel/util/MessageCode.java @@ -7,11 +7,13 @@ public enum MessageCode { SUCCESS(0, "Success"), INVALID_ACTION(2, "Invalid action"), ADMIN_NOT_FOUND(4, "Admin not found"), + TEMPLATE_NOT_FOUND(4, "Template not found or id is null"), EMAIL_ALREADY_EXISTS(2, "Email already exists"), WRONG_PASSWORD(2, "Wrong password"), INVALID_CREDENTIALS(2, "Invalid credentials"), PERMISSION_DENIED(2, "Permission denied"), - ADMIN_INACTIVE(2, "Admin is inactive"); + ADMIN_INACTIVE(2, "Admin is inactive"), + PERMISSION_IS_EMPTY(2, "Permission is empty"); private final int code; private final String description;