AdminUserController.java

package com.hwhub.backend.presentation.rest.admin;

import com.hwhub.backend.application.service.AdminUserService;
import com.hwhub.backend.application.service.UserRoleService;
import com.hwhub.backend.domain.enums.Permission;
import com.hwhub.backend.domain.model.AdminUserSearchCondition;
import com.hwhub.backend.domain.model.UserModel;
import com.hwhub.backend.presentation.rest.admin.dto.AdminCreateUserRequest;
import com.hwhub.backend.presentation.rest.admin.dto.AdminUpdateUserRequest;
import com.hwhub.backend.presentation.rest.admin.dto.AdminUserResponse;
import com.hwhub.backend.presentation.rest.admin.dto.AdminUserRolesResponse;
import com.hwhub.backend.security.CurrentUserId;
import com.hwhub.backend.security.RequiresPermission;
import jakarta.validation.Valid;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/admin")
public class AdminUserController {

  private final UserRoleService userRoleService;
  private final AdminUserService adminUserService;

  /** メールアドレスでユーザーを検索する。 ロール管理に使用。 ROLE_MANAGEMENT パーミッション必須。 */
  @RequiresPermission(Permission.ROLE_MANAGEMENT)
  @GetMapping("/users")
  public List<AdminUserRolesResponse> searchUsers(@RequestParam("email") String email) {
    return userRoleService.searchUsers(email).stream().map(AdminUserRolesResponse::from).toList();
  }

  /** 管理者: ユーザー一覧検索 */
  @RequiresPermission(Permission.USER_LIST_VIEW)
  @GetMapping("/users/search")
  public List<AdminUserResponse> searchUsers(
      @RequestParam(name = "email", required = false) String email,
      @RequestParam(name = "isActive", required = false) Boolean isActive,
      @RequestParam(name = "locale", required = false) String locale) {

    AdminUserSearchCondition condition = new AdminUserSearchCondition(email, isActive, locale);

    return adminUserService.searchUsers(condition).stream().map(AdminUserResponse::from).toList();
  }

  /** 管理者: ユーザー登録 */
  @RequiresPermission(Permission.USER_LIST_VIEW)
  @PostMapping("/users")
  public AdminUserResponse createUser(
      @RequestBody @Valid AdminCreateUserRequest request, @CurrentUserId Long operatorUserId) {
    UserModel created =
        adminUserService.createUser(
            request.email(),
            request.password(),
            request.displayName(),
            request.locale(),
            operatorUserId);
    return AdminUserResponse.from(created);
  }

  /** 管理者: ユーザー更新 */
  @RequiresPermission(Permission.USER_LIST_VIEW)
  @PutMapping("/users/{userId}")
  public AdminUserResponse updateUser(
      @PathVariable("userId") Long userId,
      @RequestBody @Valid AdminUpdateUserRequest request,
      @CurrentUserId Long operatorUserId) {
    UserModel updated =
        adminUserService.updateUser(
            userId,
            request.displayName(),
            request.locale(),
            request.password(),
            request.isActive(),
            operatorUserId);
    return AdminUserResponse.from(updated);
  }
}