This commit is contained in:
@@ -35,7 +35,8 @@ public class HandlerConfig {
|
||||
ViolationNotionHandler violationNotionHandler,
|
||||
ComplaintEntityHandler complaintEntityHandler,
|
||||
UserInfoHandler userInfoHandler,
|
||||
NotificationHandler notificationHandler
|
||||
NotificationHandler notificationHandler,
|
||||
UserVerificationHandler userVerificationHandler
|
||||
) {
|
||||
Map<Integer, RequestHandler> map = new HashMap<>();
|
||||
map.put(20001, login);
|
||||
@@ -62,6 +63,7 @@ public class HandlerConfig {
|
||||
map.put(30013, complaintEntityHandler);
|
||||
map.put(30014, userInfoHandler);
|
||||
map.put(30015, notificationHandler);
|
||||
map.put(30016, userVerificationHandler);
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ import ru.soune.nocopy.repository.UserRepository;
|
||||
import ru.soune.nocopy.service.FileSimilarityService;
|
||||
import ru.soune.nocopy.service.file.*;
|
||||
import ru.soune.nocopy.service.register.AuthService;
|
||||
import ru.soune.nocopy.service.user.moderation.UserVerificationService;
|
||||
import ru.soune.nocopy.util.FileUtil;
|
||||
|
||||
import java.io.File;
|
||||
@@ -76,6 +77,8 @@ public class ApiController {
|
||||
|
||||
private final ZipService zipService;
|
||||
|
||||
private final UserVerificationService userVerificationService;
|
||||
|
||||
@PostMapping("/v{version}/data")
|
||||
public ResponseEntity<?> handlePostRequest(@RequestBody BaseRequest request,
|
||||
@PathVariable("version") int version) {
|
||||
|
||||
@@ -59,7 +59,9 @@ public enum MessageCode {
|
||||
USER_NOT_ACTIVE(2, "User not active"),
|
||||
NOTION_NOT_FOUND(4, "Notion not found"),
|
||||
NOT_FOUND(4, "Notion not found"),
|
||||
MESSAGE_IS_REQUIRED_FOR_NOTION(4, "Message is required for notion");
|
||||
MESSAGE_IS_REQUIRED_FOR_NOTION(4, "Message is required for notion"),
|
||||
USER_VERIFICATIONS_NOT_FOUND(4, "Verifications not found"),
|
||||
ADMIN_USER_NOT_FOUND(4, "Verifications ,user or admin not found");
|
||||
|
||||
private final Integer code;
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
package ru.soune.nocopy.dto.user.moderation;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class UserVerificationRequest {
|
||||
private String message;
|
||||
private Long userId;
|
||||
private Boolean verified;
|
||||
private Long adminId;
|
||||
private String action;
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package ru.soune.nocopy.dto.user.moderation;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
public class UserVerificationResponse {
|
||||
private Long userVerificationId;
|
||||
private Long userId;
|
||||
private LocalDateTime updateTime;
|
||||
private String moderationStatus;
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package ru.soune.nocopy.entity.user;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum ModerationStatus {
|
||||
NOT_VERIFIED("not_verified") , VERIFICATION_IN_PROGRESS("verification_in_progress"),
|
||||
VERIFIED("verified"), VERIFICATION_FAILED("verification_failed");
|
||||
|
||||
private final String name;
|
||||
|
||||
private ModerationStatus(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
@@ -106,6 +106,9 @@ public class User {
|
||||
@ToString.Exclude
|
||||
private UserNotActive userNotActive;
|
||||
|
||||
@Column(name = "verification_status")
|
||||
private ModerationStatus verificationStatus = ModerationStatus.NOT_VERIFIED;
|
||||
|
||||
public TariffInfo getActiveTariffInfo() {
|
||||
if (company != null && company.getTariffInfo() != null) {
|
||||
return company.getTariffInfo();
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
package ru.soune.nocopy.entity.user.moderation;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import org.springframework.data.annotation.CreatedDate;
|
||||
import org.springframework.data.annotation.LastModifiedDate;
|
||||
import ru.soune.nocopy.entity.user.ModerationStatus;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Entity
|
||||
@Table(name = "user_verification")
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
@Getter
|
||||
@Setter
|
||||
public class UserVerification {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(name = "user_id", unique = true, nullable = false)
|
||||
private Long userId;
|
||||
|
||||
@CreatedDate
|
||||
@Column(name = "created_at", updatable = false, nullable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@LastModifiedDate
|
||||
@Column(name = "updated_at")
|
||||
private LocalDateTime updatedAt;
|
||||
|
||||
@Column(name = "message")
|
||||
private String message;
|
||||
|
||||
@Column(name = "admin_id")
|
||||
private Long adminId;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "status")
|
||||
private ModerationStatus moderationStatus;
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
package ru.soune.nocopy.handler;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
import ru.soune.nocopy.dto.BaseRequest;
|
||||
import ru.soune.nocopy.dto.BaseResponse;
|
||||
import ru.soune.nocopy.dto.MessageCode;
|
||||
import ru.soune.nocopy.dto.file.ActionResponse;
|
||||
import ru.soune.nocopy.dto.user.moderation.UserVerificationRequest;
|
||||
import ru.soune.nocopy.dto.user.moderation.UserVerificationResponse;
|
||||
import ru.soune.nocopy.entity.user.moderation.UserVerification;
|
||||
import ru.soune.nocopy.service.user.moderation.UserVerificationService;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class UserVerificationHandler implements RequestHandler {
|
||||
|
||||
private final UserVerificationService userVerificationService;
|
||||
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
@Override
|
||||
public BaseResponse handle(BaseRequest request) throws Exception {
|
||||
UserVerificationRequest userVerificationRequest = objectMapper.convertValue(request.getMessageBody(),
|
||||
UserVerificationRequest.class);
|
||||
String action = userVerificationRequest.getAction();
|
||||
|
||||
switch (action) {
|
||||
case "get_all_verifications":
|
||||
return handleVerifications(request, userVerificationRequest);
|
||||
case "verified":
|
||||
return handleVerified(request, userVerificationRequest);
|
||||
default:
|
||||
ActionResponse response = ActionResponse.builder()
|
||||
.action(action)
|
||||
.availableActions(Arrays.asList(
|
||||
"get_all_verifications", "verified"))
|
||||
.build();
|
||||
return new BaseResponse(request.getMsgId(),
|
||||
MessageCode.INVALID_ACTION.getCode(),
|
||||
"Invalid action: " + action,
|
||||
response);
|
||||
}
|
||||
}
|
||||
|
||||
private BaseResponse handleVerifications(BaseRequest request, UserVerificationRequest userVerificationRequest) throws Exception {
|
||||
List<UserVerification> verifications = userVerificationService.verifications();
|
||||
|
||||
if (verifications.isEmpty()) {
|
||||
return new BaseResponse(request.getMsgId(), MessageCode.USER_VERIFICATIONS_NOT_FOUND.getCode(),
|
||||
MessageCode.USER_VERIFICATIONS_NOT_FOUND.getDescription(), null);
|
||||
}
|
||||
|
||||
List<UserVerificationResponse> verificationResponses = verifications.stream().map(this::convertDto).toList();
|
||||
|
||||
return BaseResponse.builder()
|
||||
.msgId(request.getMsgId())
|
||||
.messageBody(verificationResponses)
|
||||
.build();
|
||||
}
|
||||
|
||||
private BaseResponse handleVerified(BaseRequest request, UserVerificationRequest userVerificationRequest) throws Exception {
|
||||
UserVerification userVerification = userVerificationService.verifyUser(userVerificationRequest.getUserId(), userVerificationRequest.getMessage(),
|
||||
userVerificationRequest.getAdminId(), userVerificationRequest.getVerified());
|
||||
|
||||
if (userVerification == null) {
|
||||
return new BaseResponse(request.getMsgId(),
|
||||
MessageCode.ADMIN_USER_NOT_FOUND.getCode(),
|
||||
MessageCode.ADMIN_USER_NOT_FOUND.getDescription(),
|
||||
null);
|
||||
}
|
||||
|
||||
return BaseResponse.builder()
|
||||
.msgId(request.getMsgId())
|
||||
.messageBody(UserVerificationResponse.builder()
|
||||
.userVerificationId(userVerification.getId())
|
||||
.moderationStatus(userVerification.getModerationStatus().toString())
|
||||
.userId(userVerification.getUserId()))
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
private UserVerificationResponse convertDto(UserVerification userVerification) {
|
||||
return UserVerificationResponse.builder()
|
||||
.userVerificationId(userVerification.getId())
|
||||
.userId(userVerification.getUserId())
|
||||
.moderationStatus(userVerification.getModerationStatus().name())
|
||||
.updateTime(userVerification.getUpdatedAt())
|
||||
.build();
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package ru.soune.nocopy.repository;
|
||||
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import ru.soune.nocopy.entity.user.ModerationStatus;
|
||||
import ru.soune.nocopy.entity.user.moderation.UserVerification;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface UserVerificationRepository extends JpaRepository<UserVerification, Long> {
|
||||
List<UserVerification> findByUserId(Long userId);
|
||||
List<UserVerification>findByUserIdAndModerationStatus(Long userId, ModerationStatus moderationStatus);
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.soune.nocopy.entity.file.moderation.ModerationPassportFile;
|
||||
import ru.soune.nocopy.repository.ModerationFileRepository;
|
||||
import ru.soune.nocopy.service.user.moderation.UserVerificationService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -14,6 +15,8 @@ public class ModerationFileService {
|
||||
|
||||
private final ModerationFileRepository moderationFileRepository;
|
||||
|
||||
private final UserVerificationService userVerificationService;
|
||||
|
||||
public void addFiles(Long userId, Map<Integer, String> files) {
|
||||
List<ModerationPassportFile> moderationFileRepositoryByStatus =
|
||||
moderationFileRepository.findByStatus(ModerationFileStatus.ACTIVE.getName());
|
||||
@@ -33,6 +36,8 @@ public class ModerationFileService {
|
||||
|
||||
moderationFileRepository.save(moderationFile);
|
||||
}
|
||||
|
||||
userVerificationService.initUserVerification(userId);
|
||||
}
|
||||
|
||||
public List<ModerationPassportFile> getActiveFiles() {
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
package ru.soune.nocopy.service.user.moderation;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.soune.nocopy.entity.user.ModerationStatus;
|
||||
import ru.soune.nocopy.entity.user.User;
|
||||
import ru.soune.nocopy.entity.user.moderation.UserVerification;
|
||||
import ru.soune.nocopy.repository.UserRepository;
|
||||
import ru.soune.nocopy.repository.UserVerificationRepository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class UserVerificationService {
|
||||
|
||||
private final UserRepository userRepository;
|
||||
|
||||
private final UserVerificationRepository userVerificationRepository;
|
||||
|
||||
public void initUserVerification(Long userId) {
|
||||
User user = userRepository.findById(userId).orElse(null);
|
||||
|
||||
if (user == null) return;
|
||||
|
||||
UserVerification userVerification = UserVerification.builder()
|
||||
.moderationStatus(ModerationStatus.VERIFICATION_IN_PROGRESS)
|
||||
.build();
|
||||
|
||||
userVerificationRepository.save(userVerification);
|
||||
|
||||
user.setVerificationStatus(ModerationStatus.VERIFICATION_IN_PROGRESS);
|
||||
|
||||
userRepository.save(user);
|
||||
}
|
||||
|
||||
public UserVerification verifyUser(Long userId, String message, Long adminId, boolean verified) {
|
||||
User user = userRepository.findById(userId).orElse(null);
|
||||
|
||||
if (user == null) return null;
|
||||
|
||||
UserVerification userVerification = userVerificationRepository.findById(userId).orElse(null);
|
||||
|
||||
if (userVerification == null) return null;
|
||||
|
||||
ModerationStatus moderationStatus = verified ? ModerationStatus.VERIFIED: ModerationStatus.VERIFICATION_FAILED;
|
||||
|
||||
userVerification.setModerationStatus(moderationStatus);
|
||||
|
||||
if (message != null) userVerification.setMessage(message);
|
||||
|
||||
userVerification.setAdminId(adminId);
|
||||
|
||||
UserVerification save = userVerificationRepository.save(userVerification);
|
||||
|
||||
user.setVerificationStatus(moderationStatus);
|
||||
|
||||
userRepository.save(user);
|
||||
|
||||
return save;
|
||||
}
|
||||
|
||||
public List<UserVerification> verifications() {
|
||||
return userVerificationRepository.findAll();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user