package ru.soune.nocopy.adminpanel.handler; import com.fasterxml.jackson.core.type.TypeReference; 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(), adminCreateTemplateRequest.getName()); 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, adminCreateTemplateRequest.getName()); 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", "get_all", "get_by_id")) .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) { Map permissionsMap = null; try { permissionsMap = objectMapper.readValue( adminTemplate.getPermission(), new TypeReference>() {} ); } catch (Exception e) { log.error("Failed to parse permissions", e); } return AdminCreateTemplateResponse.builder() .id(adminTemplate.getId()) .changePassword(adminTemplate.getChangePassword()) .permissions(permissionsMap) .name(adminTemplate.getName()) .build(); } }