AI Resume Analysis: Interview Schedule Module

Design and API implementation notes for the interview schedule module in the interview-guide project

InterviewSchedule Module Design and Implementation

This note records how I implemented the InterviewSchedule module in the interview-guide project. The goal is to integrate invitation parsing, record management, status maintenance, and reminder coordination into one stable and maintainable workflow.

Module Capability Overview

  • Invitation parsing: dual-channel parsing with rule engine + AI, supports Feishu/Tencent Meeting/Zoom text formats, automatically extracts company, role, interview time, and meeting link.
  • Calendar management: supports day/week/month view, drag-and-drop adjustment, and list view collaboration.
  • Status maintenance: supports manual status updates and scheduled auto-expiration.
  • Reminder mechanism: supports configurable reminders to reduce missed interviews.

State Transitions

Key API Design

POST /api/interview-schedule/parse Parse Interview Invitation Text

Core logic:

parseService.parse(request.getRawText(), request.getSource());
tryRuleParsing(rawText, source);
parseWithAI(rawText, source);
  • Rule parsing handles structured patterns from Feishu/Tencent/Zoom first.
  • AI parsing acts as a fallback channel for non-standard text.
  • Input boundary constraints and prompt-injection protection are applied before AI parsing.

POST /api/interview-schedule Create Interview Record

Purpose:

  • Allows users to directly create an interview schedule record from manual input.

Call chain:

scheduleService.create(request);

Request body (core fields):

public class CreateInterviewRequest {
    @NotBlank(message = "Company name cannot be empty")
    private String companyName;

    @NotBlank(message = "Position cannot be empty")
    private String position;

    @NotNull(message = "Interview time cannot be empty")
    @com.fasterxml.jackson.annotation.JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm[:ss]")
    private java.time.LocalDateTime interviewTime;

    private String interviewType; // ONSITE, VIDEO, PHONE
    private String meetingLink;
    private Integer roundNumber = 1;
    private String interviewer;
    private String notes;
}

GET /api/interview-schedule/{id} Get Interview Record by ID

Processing flow:

  • Controller receives id
  • Calls scheduleService.getById(id)
  • Service queries repository for one record and throws business exception if not found
  • Returns Result<InterviewScheduleDTO>

Call chain:

scheduleService.getById(id);

GET /api/interview-schedule Get Interview Record List

Processing flow:

  • Controller accepts optional filters: status/start/end
  • Calls scheduleService.getAll(status, start, end)
  • Service queries by conditions and converts to DTO
  • Returns Result<List<InterviewScheduleDTO>>

Call chain:

scheduleService.getAll(status, start, end);

PUT /api/interview-schedule/{id} Update Interview Record

Processing flow:

  • Controller receives id + CreateInterviewRequest (with @Valid validation)
  • Calls scheduleService.update(id, request)
  • Service loads existing record, updates fields, and saves
  • Returns updated Result<InterviewScheduleDTO>

Call chain:

scheduleService.update(id, request);

DELETE /api/interview-schedule/{id} Delete Interview Record

Processing flow:

  • Controller receives id
  • Calls scheduleService.delete(id)
  • Service deletes when found, throws exception when missing
  • Returns Result<Void>

Call chain:

scheduleService.delete(id);

PATCH/PUT /api/interview-schedule/{id}/status Update Interview Status

API implementation:

@RequestMapping(path = "/{id}/status", method = {RequestMethod.PATCH, RequestMethod.PUT})
public Result<InterviewScheduleDTO> updateStatus(
    @PathVariable Long id,
    @RequestParam InterviewStatus status
) {
    log.info("Update interview status: ID={}, status={}", id, status);
    InterviewScheduleDTO dto = scheduleService.updateStatus(id, status);
    return Result.success(dto);
}

Core call:

scheduleService.updateStatus(id, status);

Summary

The core value of the InterviewSchedule module is connecting invitation understanding with interview process management. For me, this layer is what enables frontend calendar interaction, reminder strategy, and downstream interview evaluation to form a continuous user experience, instead of scattering information across chats and manual notes.