Added deleting package from internal service

This commit is contained in:
Mikhail Trofimov 2025-06-18 16:42:27 +03:00
parent b6f4f47715
commit a78e49f1e0
8 changed files with 109 additions and 2 deletions

View file

@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import ru.nbch.credit_tracker.entities.request.active_packages.MonitoringActivePackagesRequest; import ru.nbch.credit_tracker.entities.request.active_packages.MonitoringActivePackagesRequest;
import ru.nbch.credit_tracker.entities.response.active_packages.MonitoringActivePackagesResponse; import ru.nbch.credit_tracker.entities.response.active_packages.MonitoringActivePackagesResponse;
import ru.nbch.credit_tracker.entities.response.success.MonitoringPackageDeleteResponse;
import ru.nbch.credit_tracker.facade.SignalFacade; import ru.nbch.credit_tracker.facade.SignalFacade;
@RestController @RestController
@ -24,10 +25,15 @@ public class SignalController {
return signalFacade.setupMonitoring(file); return signalFacade.setupMonitoring(file);
} }
@PostMapping(value = "active_packages", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE) @PostMapping(value = "/active_packages", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<MonitoringActivePackagesResponse> findActivePackages(@RequestBody MonitoringActivePackagesRequest activePackagesRequest) { public ResponseEntity<MonitoringActivePackagesResponse> findActivePackages(@RequestBody MonitoringActivePackagesRequest activePackagesRequest) {
return signalFacade.findActivePackages(activePackagesRequest); return signalFacade.findActivePackages(activePackagesRequest);
} }
@PostMapping(value = "/delete", params = {"username", "packageName"}, produces = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<MonitoringPackageDeleteResponse> deletePackage(@RequestParam("username") String username, @RequestParam("packageName") String packageName) {
return signalFacade.deletePackage(username, packageName);
}
} }

View file

@ -0,0 +1,25 @@
package ru.nbch.credit_tracker.entities.response.errors;
import jakarta.xml.bind.annotation.*;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MonitoringPackageDeleteResponse", propOrder = {
"status",
"errorCode",
"errorText"
})
@XmlRootElement(name = "MonitoringPackageDeleteResponse")
public class MonitoringPackageDeleteError implements CommonError {
@XmlElement(name = "Status", required = true)
protected String status;
@XmlElement(name = "ErrorCode",required = true)
protected String errorCode;
@XmlElement(name = "ErrorText",required = true)
protected String errorText;
}

View file

@ -0,0 +1,24 @@
package ru.nbch.credit_tracker.entities.response.success;
import jakarta.xml.bind.annotation.*;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MonitoringPackageDeleteResponse", propOrder = {
"packageName",
"status",
"deactivatedAt"
})
@XmlRootElement(name = "MonitoringPackageDeleteResponse")
public class MonitoringPackageDeleteResponse {
@XmlElement(name = "PackageName", required = true)
protected String packageName;
@XmlElement(name = "Status", required = true)
protected String status;
@XmlElement(name = "deactivated_at", required = true)
protected String deactivatedAt;
}

View file

@ -18,6 +18,8 @@ public enum SignalError {
ERROR_013("013", "На стороне сервиса произошла ошибка, попробуйте повторить запрос позже или сообщите в техническую поддержку"), ERROR_013("013", "На стороне сервиса произошла ошибка, попробуйте повторить запрос позже или сообщите в техническую поддержку"),
ERROR_015("015", "Клиент с указанным membercode не найден"), ERROR_015("015", "Клиент с указанным membercode не найден"),
ERROR_016("016", "Нет активного пакета с именем "),
ERROR_017("017", "При обработке запроса произошла ошибка. Повторите запрос позже или обратитесь в службу технической поддержки"), // TODO get rid of duplicate?
ERROR_100("100", "Непредвиденная ошибка"); ERROR_100("100", "Непредвиденная ошибка");

View file

@ -12,6 +12,8 @@ import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequ
import ru.nbch.credit_tracker.entities.request.monitoring_request.Subject; import ru.nbch.credit_tracker.entities.request.monitoring_request.Subject;
import ru.nbch.credit_tracker.entities.response.active_packages.MonitoringActivePackagesResponse; import ru.nbch.credit_tracker.entities.response.active_packages.MonitoringActivePackagesResponse;
import ru.nbch.credit_tracker.entities.response.errors.MonitoringActivePackagesError; import ru.nbch.credit_tracker.entities.response.errors.MonitoringActivePackagesError;
import ru.nbch.credit_tracker.entities.response.errors.MonitoringPackageDeleteError;
import ru.nbch.credit_tracker.entities.response.success.MonitoringPackageDeleteResponse;
import ru.nbch.credit_tracker.entities.response.success.MonitoringResponse; import ru.nbch.credit_tracker.entities.response.success.MonitoringResponse;
import ru.nbch.credit_tracker.entities.signal_package.Signals; import ru.nbch.credit_tracker.entities.signal_package.Signals;
import ru.nbch.credit_tracker.enums.SignalError; import ru.nbch.credit_tracker.enums.SignalError;
@ -280,4 +282,20 @@ public class SignalFacade {
throw new SignalErrorException(SignalError.ERROR_013, null, new MonitoringActivePackagesError(), false); throw new SignalErrorException(SignalError.ERROR_013, null, new MonitoringActivePackagesError(), false);
} }
} }
public ResponseEntity<MonitoringPackageDeleteResponse> deletePackage(String username, String packageName) {
try {
if(!signalService.isPackageExists(username, packageName)) {
throw new SignalErrorException(SignalError.ERROR_016, packageName, new MonitoringPackageDeleteError(), true);
}
MonitoringPackageDeleteResponse response = signalService.deletePackage(username, packageName);
return ResponseEntity.ok(response);
} catch (Exception e) {
if (e instanceof SignalErrorException) {
throw (SignalErrorException) e;
}
log.error(e.getMessage(), e);
throw new SignalErrorException(SignalError.ERROR_017, null, new MonitoringPackageDeleteError(), false);
}
}
} }

View file

@ -14,6 +14,10 @@ public interface SignalMapper {
boolean isPackageNotUnique(@Param("userId") String userId, @Param("packageName") String packageName); boolean isPackageNotUnique(@Param("userId") String userId, @Param("packageName") String packageName);
boolean isPackageExists(@Param("userId") String userId, @Param("packageName") String packageName, @Param("status") String status);
void deletePackage(@Param("userId") String userId, @Param("packageName") String packageName, @Param("status") String newStatus, @Param("previousStatus") String previousStatus, @Param("deactivatedAt") LocalDateTime deactivatedAt);
Integer registerPackage(@Param("request") MonitoringRequest request, @Param("creadedAt") LocalDateTime creadedAt, @Param("status") String status); Integer registerPackage(@Param("request") MonitoringRequest request, @Param("creadedAt") LocalDateTime creadedAt, @Param("status") String status);
void registerSubjects(@Param("subjects") List<Subject> subjects, @Param("packageId") Integer packageId); void registerSubjects(@Param("subjects") List<Subject> subjects, @Param("packageId") Integer packageId);
@ -28,5 +32,5 @@ public interface SignalMapper {
SignalService.PackageData findPackageData(@Param("id") Integer id); SignalService.PackageData findPackageData(@Param("id") Integer id);
List<SignalService.PackageData> findPackageDataList(@Param("userId") String userId); List<SignalService.PackageData> findPackageDataList(@Param("userId") String userId);
} }

View file

@ -9,6 +9,7 @@ import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequ
import ru.nbch.credit_tracker.entities.response.active_packages.MonitoringActivePackagesResponse; import ru.nbch.credit_tracker.entities.response.active_packages.MonitoringActivePackagesResponse;
import ru.nbch.credit_tracker.entities.response.active_packages.Package; import ru.nbch.credit_tracker.entities.response.active_packages.Package;
import ru.nbch.credit_tracker.entities.response.active_packages.Packages; import ru.nbch.credit_tracker.entities.response.active_packages.Packages;
import ru.nbch.credit_tracker.entities.response.success.MonitoringPackageDeleteResponse;
import ru.nbch.credit_tracker.entities.signal_package.Auth; import ru.nbch.credit_tracker.entities.signal_package.Auth;
import ru.nbch.credit_tracker.entities.signal_package.Person; import ru.nbch.credit_tracker.entities.signal_package.Person;
import ru.nbch.credit_tracker.entities.signal_package.Signals; import ru.nbch.credit_tracker.entities.signal_package.Signals;
@ -180,6 +181,21 @@ public class SignalService {
return activePackages; return activePackages;
} }
public boolean isPackageExists(String username, String packageName) {
return mapper.isPackageExists(username.substring(0, 6), packageName, Status.ON_MONITORING.name());
}
public MonitoringPackageDeleteResponse deletePackage(String username, String packageName) {
LocalDateTime deactivatedAt = LocalDateTime.now();
mapper.deletePackage(username.substring(0, 6), packageName, Status.DELETED.name(), Status.ON_MONITORING.name(), deactivatedAt);
MonitoringPackageDeleteResponse deleteResponse = new MonitoringPackageDeleteResponse();
deleteResponse.setStatus("Deleted");
deleteResponse.setPackageName(packageName);
deleteResponse.setDeactivatedAt(deactivatedAt.toString());
return deleteResponse;
}
@Getter @Getter
@Setter @Setter
public static class PackageData { public static class PackageData {

View file

@ -23,6 +23,18 @@
WHERE membercode IS NOT NULL AND LEFT(membercode, 6) = #{userId} AND package_name = #{packageName} WHERE membercode IS NOT NULL AND LEFT(membercode, 6) = #{userId} AND package_name = #{packageName}
</select> </select>
<select id="isPackageExists" resultType="boolean">
SELECT COUNT(*) > 0
FROM signals_user_packages
WHERE membercode IS NOT NULL AND LEFT(membercode, 6) = #{userId} AND package_name = #{packageName} AND status = #{status}
</select>
<update id="deletePackage">
UPDATE signals_user_packages
SET status = #{status}, deactivated_at = #{deactivatedAt}
WHERE membercode IS NOT NULL AND LEFT(membercode, 6) = #{userId} AND package_name = #{packageName} AND status = #{previousStatus}
</update>
<select id="registerPackage" resultType="java.lang.Integer" parameterType="ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequest" > <select id="registerPackage" resultType="java.lang.Integer" parameterType="ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequest" >
INSERT INTO signals_user_packages (membercode, package_name, created_at, status) INSERT INTO signals_user_packages (membercode, package_name, created_at, status)
values (#{request.userId}, #{request.packageName}, #{creadedAt}, #{status}) values (#{request.userId}, #{request.packageName}, #{creadedAt}, #{status})