Skip to content

Task 1-2: Guard TestController và InitController

Phase: 1 - Security Priority: High Module: admin Depends on: Không có Reference: SPEC.md — xem mục 4 (ADM-F-10 Init data) và mục 5 (Acceptance Criteria: "Unauthorized request → 401")

Background

TestControllerInitController là development/setup endpoints không nên tồn tại trên production.

Tasks

TestController

File: admin/controller/health_check/TestController.java

  • [ ] Thêm @Profile("!main"):
    @Profile("!main")
    @RestController
    @RequestMapping("/api/admin/test")
    public class TestController { ... }
    

    Note: @Profile("!main") yêu cầu Spring profile main được set trong production application.properties / environment variable SPRING_PROFILES_ACTIVE=main. Xác nhận profile name được dùng nhất quán trong project (có thể là prod, production, hoặc main).

InitController

File: admin/controller/init/InitController.java

  • [ ] Xác nhận InitController làm gì (có thể trigger InitializeData manually)
  • [ ] Option A: @Profile("!main") nếu chỉ cần cho dev
  • [ ] Option B: Thêm guard kiểm tra flag "already initialized" trong DB:
    @PostMapping("/init")
    public Result<?> init() {
        if (systemSettingRepository.isInitialized()) {
            throw new BadRequestException("ALREADY_INITIALIZED");
        }
        initializeData.run();
        systemSettingRepository.markInitialized();
        return Result.OK();
    }
    

    Injection note: InitController cần inject các dependency sau nếu chưa có:

    @Autowired
    private SystemSettingRepository systemSettingRepository;
    
    @Autowired
    private InitializeData initializeData;
    
    Xác nhận SystemSettingRepository có method isInitialized()markInitialized() hoặc tạo thêm nếu chưa có. InitializeData là bean trong admin/init/ — kiểm tra đây là @Component hay @Service.

    BadRequestException — kiểm tra package import đúng trong project:

    import com.figpop.common.exception.BadRequestException; // điều chỉnh theo package thực tế
    

Verification / Acceptance Criteria

  • [ ] Code compiles: Cả TestController.javaInitController.java build thành công; @Profile, BadRequestException, SystemSettingRepository, InitializeData đều resolve đúng
  • [ ] TestController ẩn trên production: Deploy với SPRING_PROFILES_ACTIVE=mainGET /api/admin/test/* trả về 404 (bean không được load)
  • [ ] InitController guard - lần đầu: Gọi POST /api/admin/init khi DB chưa initialized → 200 OK, data được seed
  • [ ] InitController guard - lần hai: Gọi lại POST /api/admin/init sau khi đã initialized → 400 Bad Request với message ALREADY_INITIALIZED
  • [ ] Option A nếu chọn: @Profile("!main") trên InitController → endpoint biến mất trên production profile
  • [ ] Test class tham khảo: InitControllerTest hoặc integration test trong task-3-1.md

Files to Modify

  • admin/controller/health_check/TestController.java
  • admin/controller/init/InitController.java