package com.mydreamjob.company; import com.mydreamjob.company.dto.CompanyCreateRequest; import com.mydreamjob.company.dto.CompanyPublicView; import com.mydreamjob.company.dto.CompanyUpdateRequest; import com.mydreamjob.common.api.ApiResponse; import com.mydreamjob.job.dto.JobSearchItem; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map; @Tag(name = "企业", description = "企业资料创建、查询与更新") @RestController @RequestMapping("/companies") @RequiredArgsConstructor public class CompanyController { /** R01-A2:身份只来自安全上下文,不接受请求参数传入的 userId。 */ private final com.mydreamjob.security.CurrentUserAccessor currentUserAccessor; /** R01-A2:requestId 只来自过滤器规范化后的唯一产出点。 */ private final com.mydreamjob.common.logging.RequestIdAccessor requestIdAccessor; private final CompanyService companyService; private final CompanyOnboardingService companyOnboardingService; @Operation(summary = "查询企业入驻状态", description = "返回当前企业资料、认证状态和允许动作") @GetMapping("/me/onboarding") public ResponseEntity> getMyOnboarding(HttpServletRequest request) { Long userId = currentUserAccessor.requireUserId(); return ResponseEntity.ok(ApiResponse.ok(companyOnboardingService.get(userId), requestIdAccessor.get(request))); } // ── 创建 ────────────────────────────────────────────────── @Operation(summary = "创建企业资料", description = "仅 COMPANY 角色可调用;已存在时返回 409") @PostMapping("/me") public ResponseEntity>> createMyCompany( @Valid @RequestBody CompanyCreateRequest req, HttpServletRequest request) { Long userId = currentUserAccessor.requireUserId(); Company company = companyService.createCompany(userId, req); return ResponseEntity.ok(ApiResponse.ok(companyService.toView(company), requestIdAccessor.get(request))); } // ── 查询 ────────────────────────────────────────────────── @Operation(summary = "查询当前企业资料", description = "返回当前登录用户绑定的企业资料,未绑定企业返回 404") @GetMapping("/me") public ResponseEntity>> getMyCompany(HttpServletRequest request) { Long userId = currentUserAccessor.requireUserId(); Map view = companyService.toView(companyService.findCompanyByOwnerUserId(userId)); if (view == null) { return ResponseEntity.status(404).body( ApiResponse.error(404, "company not found", requestIdAccessor.get(request))); } return ResponseEntity.ok(ApiResponse.ok(view, requestIdAccessor.get(request))); } // ── 更新 ────────────────────────────────────────────────── @Operation(summary = "更新企业资料", description = "仅更新传入的非 null 字段;未绑定企业时返回 404") @PutMapping("/me") public ResponseEntity>> updateMyCompany( @Valid @RequestBody CompanyUpdateRequest req, HttpServletRequest request) { Long userId = currentUserAccessor.requireUserId(); Map view = companyService.toView(companyService.updateCompany(userId, req)); return ResponseEntity.ok(ApiResponse.ok(view, requestIdAccessor.get(request))); } // ── 公开端:企业详情 ──────────────────────────────────────── @Operation(summary = "查询企业公开详情", description = "匿名可访问,仅返回 6 个公开字段") @GetMapping("/{companyId}") public ResponseEntity> getPublicCompany( @PathVariable Long companyId, HttpServletRequest request) { CompanyPublicView view = companyService.getPublicCompany(companyId); return ResponseEntity.ok(ApiResponse.ok(view, requestIdAccessor.get(request))); } // ── 公开端:企业岗位列表 ──────────────────────────────────── @Operation(summary = "查询企业公开岗位列表", description = "匿名可访问,仅返回 PUBLISHED 岗位") @GetMapping("/{companyId}/jobs") public ResponseEntity>> getCompanyJobs( @PathVariable Long companyId, @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int size, @RequestParam(defaultValue = "latest") String sort, HttpServletRequest request) { Page result = companyService.getCompanyJobs(companyId, sort, page, size); Map data = new HashMap<>(); data.put("items", result.getContent()); data.put("total", result.getTotalElements()); data.put("page", result.getNumber()); data.put("size", result.getSize()); data.put("totalPages", result.getTotalPages()); return ResponseEntity.ok(ApiResponse.ok(data, requestIdAccessor.get(request))); } }