dev #1
@@ -9,6 +9,7 @@ import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
|||||||
import org.springframework.web.filter.CorsFilter;
|
import org.springframework.web.filter.CorsFilter;
|
||||||
import ru.soune.nocopy.adminpanel.handler.AdminUserHandler;
|
import ru.soune.nocopy.adminpanel.handler.AdminUserHandler;
|
||||||
import ru.soune.nocopy.adminpanel.handler.CreateAdminTemplateHandler;
|
import ru.soune.nocopy.adminpanel.handler.CreateAdminTemplateHandler;
|
||||||
|
import ru.soune.nocopy.adminpanel.handler.LoginHandler;
|
||||||
import ru.soune.nocopy.adminpanel.handler.RequestHandler;
|
import ru.soune.nocopy.adminpanel.handler.RequestHandler;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -43,4 +44,12 @@ public class AppConfig {
|
|||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Map<Integer, RequestHandler> loginHandlers(LoginHandler loginHandler) {
|
||||||
|
Map<Integer, RequestHandler> map = new HashMap<>();
|
||||||
|
map.put(101, loginHandler);
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ public class SecurityConfig {
|
|||||||
.sessionManagement(session ->
|
.sessionManagement(session ->
|
||||||
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
|
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
|
||||||
.authorizeHttpRequests(auth -> auth
|
.authorizeHttpRequests(auth -> auth
|
||||||
|
.requestMatchers("/api/admin/login").permitAll()
|
||||||
|
.requestMatchers("/api/admin").permitAll()
|
||||||
.anyRequest().authenticated()
|
.anyRequest().authenticated()
|
||||||
)
|
)
|
||||||
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
|
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ public class AdminController {
|
|||||||
|
|
||||||
private final Map<Integer, RequestHandler> handlers;
|
private final Map<Integer, RequestHandler> handlers;
|
||||||
|
|
||||||
|
private final Map<Integer, RequestHandler> loginHandlers;
|
||||||
|
|
||||||
private final DashBoardAppClient dashBoardAppClient;
|
private final DashBoardAppClient dashBoardAppClient;
|
||||||
|
|
||||||
private final AdminSectionPermissionService adminSectionPermissionService;
|
private final AdminSectionPermissionService adminSectionPermissionService;
|
||||||
@@ -65,6 +67,41 @@ public class AdminController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@PostMapping("/login")
|
||||||
|
public ResponseEntity<BaseResponse> handleLoginRequest(@RequestBody BaseRequest request) {
|
||||||
|
log.info("Received request: msg_id={}, version={}", request.getMsgId(), request.getVersion());
|
||||||
|
|
||||||
|
try {
|
||||||
|
RequestHandler handler = loginHandlers.get(request.getMsgId());
|
||||||
|
|
||||||
|
if (handler == null) {
|
||||||
|
log.warn("No handler found for msg_id: {}", request.getMsgId());
|
||||||
|
return ResponseEntity.ok(
|
||||||
|
BaseResponse.builder()
|
||||||
|
.msgId(request.getMsgId())
|
||||||
|
.messageCode(MessageCode.INVALID_ACTION.getCode())
|
||||||
|
.messageDesc("No handler for msg_id: " + request.getMsgId())
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseResponse response = handler.handle(request);
|
||||||
|
log.info("Request processed successfully: msg_id={}", request.getMsgId());
|
||||||
|
return ResponseEntity.ok(response);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Error processing request: msg_id={}", request.getMsgId(), e);
|
||||||
|
return ResponseEntity.ok(
|
||||||
|
BaseResponse.builder()
|
||||||
|
.msgId(request.getMsgId())
|
||||||
|
.messageCode(MessageCode.INVALID_ACTION.getCode())
|
||||||
|
.messageDesc("Internal server error: " + e.getMessage())
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@PostMapping("/info")
|
@PostMapping("/info")
|
||||||
public ResponseEntity<BaseResponse> handleInfo(@RequestBody BaseRequest request) {
|
public ResponseEntity<BaseResponse> handleInfo(@RequestBody BaseRequest request) {
|
||||||
Long currentUserId = (Long) httpServletRequest.getAttribute("userId");
|
Long currentUserId = (Long) httpServletRequest.getAttribute("userId");
|
||||||
|
|||||||
@@ -33,8 +33,6 @@ public class AdminUserHandler implements RequestHandler {
|
|||||||
|
|
||||||
private final AdminUserService adminUserService;
|
private final AdminUserService adminUserService;
|
||||||
|
|
||||||
private final JwtUtil jwtUtil;
|
|
||||||
|
|
||||||
private final AdminSectionPermissionService permissionService;
|
private final AdminSectionPermissionService permissionService;
|
||||||
|
|
||||||
private final HttpServletRequest httpServletRequest;
|
private final HttpServletRequest httpServletRequest;
|
||||||
@@ -47,7 +45,6 @@ public class AdminUserHandler implements RequestHandler {
|
|||||||
String action = adminRequest.getAction();
|
String action = adminRequest.getAction();
|
||||||
|
|
||||||
return switch (action) {
|
return switch (action) {
|
||||||
case "login" -> handleLogin(request, adminRequest);
|
|
||||||
case "create" -> handleCreate(request, adminRequest);
|
case "create" -> handleCreate(request, adminRequest);
|
||||||
case "get_all" -> handleGetAll(request, adminRequest);
|
case "get_all" -> handleGetAll(request, adminRequest);
|
||||||
case "get_by_id" -> handleGetById(request, adminRequest);
|
case "get_by_id" -> handleGetById(request, adminRequest);
|
||||||
@@ -61,60 +58,12 @@ public class AdminUserHandler implements RequestHandler {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private BaseResponse handleLogin(BaseRequest request, AdminUserRequest adminRequest) {
|
|
||||||
String email = adminRequest.getEmail();
|
|
||||||
String password = adminRequest.getPassword();
|
|
||||||
|
|
||||||
boolean authenticated = adminUserService.authenticate(email, password);
|
|
||||||
|
|
||||||
if (!authenticated) {
|
|
||||||
return BaseResponse.builder()
|
|
||||||
.msgId(request.getMsgId())
|
|
||||||
.messageCode(MessageCode.INVALID_CREDENTIALS.getCode())
|
|
||||||
.messageDesc(MessageCode.INVALID_CREDENTIALS.getDescription())
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
AdminUser admin = adminUserService.findByEmail(email);
|
|
||||||
|
|
||||||
if (!admin.getIsActive()) {
|
|
||||||
return BaseResponse.builder()
|
|
||||||
.msgId(request.getMsgId())
|
|
||||||
.messageCode(MessageCode.ADMIN_INACTIVE.getCode())
|
|
||||||
.messageDesc(MessageCode.ADMIN_INACTIVE.getDescription())
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
String token = jwtUtil.generateToken(admin.getEmail(), admin.getId());
|
|
||||||
|
|
||||||
LoginResponse loginResponse = LoginResponse.builder()
|
|
||||||
.success(true)
|
|
||||||
.token(token)
|
|
||||||
.admin(convertToResponse(admin))
|
|
||||||
.build();
|
|
||||||
|
|
||||||
return BaseResponse.builder()
|
|
||||||
.msgId(request.getMsgId())
|
|
||||||
.messageCode(MessageCode.SUCCESS.getCode())
|
|
||||||
.messageDesc(MessageCode.SUCCESS.getDescription())
|
|
||||||
.messageBody(loginResponse)
|
|
||||||
.build();
|
|
||||||
} catch (AdminUserNotFoundException e) {
|
|
||||||
return BaseResponse.builder()
|
|
||||||
.msgId(request.getMsgId())
|
|
||||||
.messageCode(MessageCode.ADMIN_NOT_FOUND.getCode())
|
|
||||||
.messageDesc(MessageCode.ADMIN_NOT_FOUND.getDescription())
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private BaseResponse handleCreate(BaseRequest request, AdminUserRequest adminRequest) {
|
private BaseResponse handleCreate(BaseRequest request, AdminUserRequest adminRequest) {
|
||||||
try {
|
try {
|
||||||
Long currentUserId = (Long) httpServletRequest.getAttribute("userId");
|
Long currentUserId = (Long) httpServletRequest.getAttribute("userId");
|
||||||
|
|
||||||
if (!adminSectionPermissionService.canWrite(currentUserId,
|
if (!adminSectionPermissionService.canWrite(currentUserId,
|
||||||
AdminSection.USERS)) {
|
AdminSection.STAFF)) {
|
||||||
return BaseResponse.builder()
|
return BaseResponse.builder()
|
||||||
.msgId(request.getMsgId())
|
.msgId(request.getMsgId())
|
||||||
.messageCode(MessageCode.PERMISSION_DENIED.getCode())
|
.messageCode(MessageCode.PERMISSION_DENIED.getCode())
|
||||||
|
|||||||
@@ -0,0 +1,127 @@
|
|||||||
|
package ru.soune.nocopy.adminpanel.handler;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
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.AdminSection;
|
||||||
|
import ru.soune.nocopy.adminpanel.entity.AdminUser;
|
||||||
|
import ru.soune.nocopy.adminpanel.exceptions.AdminUserNotFoundException;
|
||||||
|
import ru.soune.nocopy.adminpanel.permission.AdminPermission;
|
||||||
|
import ru.soune.nocopy.adminpanel.service.AdminSectionPermissionService;
|
||||||
|
import ru.soune.nocopy.adminpanel.service.AdminUserService;
|
||||||
|
import ru.soune.nocopy.adminpanel.util.JwtUtil;
|
||||||
|
import ru.soune.nocopy.adminpanel.util.MessageCode;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class LoginHandler implements RequestHandler {
|
||||||
|
private final ObjectMapper objectMapper;
|
||||||
|
|
||||||
|
private final AdminUserService adminUserService;
|
||||||
|
|
||||||
|
private final JwtUtil jwtUtil;
|
||||||
|
|
||||||
|
private final AdminSectionPermissionService permissionService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BaseResponse handle(BaseRequest request) {
|
||||||
|
AdminUserRequest adminRequest = objectMapper.convertValue(request.getMessageBody(), AdminUserRequest.class);
|
||||||
|
String action = adminRequest.getAction();
|
||||||
|
|
||||||
|
return switch (action) {
|
||||||
|
case "login" -> handleLogin(request, adminRequest);
|
||||||
|
default -> handleInvalidAction(request, action);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private BaseResponse handleLogin(BaseRequest request, AdminUserRequest adminRequest) {
|
||||||
|
String email = adminRequest.getEmail();
|
||||||
|
String password = adminRequest.getPassword();
|
||||||
|
|
||||||
|
boolean authenticated = adminUserService.authenticate(email, password);
|
||||||
|
|
||||||
|
if (!authenticated) {
|
||||||
|
return BaseResponse.builder()
|
||||||
|
.msgId(request.getMsgId())
|
||||||
|
.messageCode(MessageCode.INVALID_CREDENTIALS.getCode())
|
||||||
|
.messageDesc(MessageCode.INVALID_CREDENTIALS.getDescription())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
AdminUser admin = adminUserService.findByEmail(email);
|
||||||
|
|
||||||
|
if (!admin.getIsActive()) {
|
||||||
|
return BaseResponse.builder()
|
||||||
|
.msgId(request.getMsgId())
|
||||||
|
.messageCode(MessageCode.ADMIN_INACTIVE.getCode())
|
||||||
|
.messageDesc(MessageCode.ADMIN_INACTIVE.getDescription())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String token = jwtUtil.generateToken(admin.getEmail(), admin.getId());
|
||||||
|
|
||||||
|
LoginResponse loginResponse = LoginResponse.builder()
|
||||||
|
.success(true)
|
||||||
|
.token(token)
|
||||||
|
.admin(convertToResponse(admin))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
return BaseResponse.builder()
|
||||||
|
.msgId(request.getMsgId())
|
||||||
|
.messageCode(MessageCode.SUCCESS.getCode())
|
||||||
|
.messageDesc(MessageCode.SUCCESS.getDescription())
|
||||||
|
.messageBody(loginResponse)
|
||||||
|
.build();
|
||||||
|
} catch (AdminUserNotFoundException e) {
|
||||||
|
return BaseResponse.builder()
|
||||||
|
.msgId(request.getMsgId())
|
||||||
|
.messageCode(MessageCode.ADMIN_NOT_FOUND.getCode())
|
||||||
|
.messageDesc(MessageCode.ADMIN_NOT_FOUND.getDescription())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private AdminUserResponse convertToResponse(AdminUser admin) {
|
||||||
|
Map<AdminSection, Integer> sectionPermissions = permissionService.getAllPermissions(admin.getId());
|
||||||
|
|
||||||
|
Map<String, Integer> permissionsMap = new HashMap<>();
|
||||||
|
sectionPermissions.forEach((section, value) ->
|
||||||
|
permissionsMap.put(section.name().toLowerCase(), value));
|
||||||
|
|
||||||
|
return AdminUserResponse.builder()
|
||||||
|
.id(admin.getId())
|
||||||
|
.fullName(admin.getFullName())
|
||||||
|
.email(admin.getEmail())
|
||||||
|
.isActive(admin.getIsActive())
|
||||||
|
.isSuperAdmin(AdminPermission.isSuperAdmin(admin.getPermissions()))
|
||||||
|
.createdAt(admin.getCreatedAt().toString())
|
||||||
|
.permissions(permissionsMap)
|
||||||
|
.activePassword(admin.getIsActivePassword())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BaseResponse handleInvalidAction(BaseRequest request, String action) {
|
||||||
|
ActionResponse response = ActionResponse.builder()
|
||||||
|
.action(action)
|
||||||
|
.availableActions(Arrays.asList(
|
||||||
|
"login"))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
return BaseResponse.builder()
|
||||||
|
.msgId(request.getMsgId())
|
||||||
|
.messageCode(MessageCode.INVALID_ACTION.getCode())
|
||||||
|
.messageDesc(MessageCode.INVALID_ACTION.getDescription())
|
||||||
|
.messageBody(response)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user