# Repository Guidelines

This repository is a Maven multi-module Spring Boot microservices system for an Online Judge (AIOJ). Use the notes below as the contributor guide for structure, workflow, and expectations.

## Tech Stack (Reference)

- Java 17
- Spring Boot 3.5.7
- Spring Cloud 2025.0.0
- Spring Cloud Alibaba 2025.0.0.0
- Maven build, Spring Java Format, JIB for Docker images

## Project Structure & Module Organization

- Root `pom.xml` aggregates all modules.
- Shared libraries live in `aioj-backend-common`:
  - `aioj-backend-common-bom` (dependency management)
  - `aioj-backend-common-core` (core utilities + Spring extensions)
  - `aioj-backend-common-security` (JWT/Spring Security)
  - `aioj-backend-common-feign` (OpenFeign + Sentinel integration)
  - `aioj-backend-common-log` (AOP logging)
  - `aioj-backend-common-mybatis` (MyBatis extensions)
  - `aioj-backend-common-starter` (auto-config starter)
- Service modules live at the repo root:
  - `aioj-backend-gateway`, `aioj-backend-auth`, `aioj-backend-user-service`,
    `aioj-backend-upms`, `aioj-backend-file-service`,
    `aioj-backend-judge-service`, `aioj-backend-question-service`,
    `aioj-backend-ai-service`, `aioj-backend-blog-service`
- Supporting folders include `docs`, `db`, `sentinel`, `logs`, `uploads`, and `generator`.

## Build, Test, and Development Commands

Use Maven from the repo root:

```bash
mvn clean compile                         # build all modules (no tests)
mvn clean install                         # build + run tests
mvn clean compile -pl aioj-backend-auth   # build a single module
mvn clean install -DskipTests             # build all modules, skip tests
mvn spring-boot:run -pl aioj-backend-gateway  # run a single service
mvn test -pl aioj-backend-user-service        # test a single service
mvn spring-javaformat:apply               # format code
mvn spring-javaformat:check               # verify formatting
```

Docker image build (JIB):

```bash
mvn package jib:build -pl <module-name>      # build & push
mvn package jib:buildTar -pl <module-name>   # build tar
```

## Coding Style & Naming Conventions

- Follow existing formatting and run `mvn spring-javaformat:apply` before submitting changes.
- Indentation follows Java defaults (4 spaces; no tabs unless already present).
- Use standard Java naming: `PascalCase` for classes, `camelCase` for methods/fields, `UPPER_SNAKE_CASE` for constants.
- Controllers: `<Resource>Controller`; Services: `<Resource>Service` / `<Resource>ServiceImpl`;
  Mappers: `<Resource>Mapper`; DTOs: `<Operation><Resource>DTO`.
- Module names follow the `aioj-backend-*` pattern; keep new module names consistent.

## Development Guidelines

- Service modules should depend on common modules, not on other service modules.
- Use Feign clients for inter-service communication.
- Keep classes focused and single-purpose; prefer Lombok to reduce boilerplate.
- Validate and sanitize user input; use `@PreAuthorize` for method security.
- Use custom exceptions + global handlers; return consistent DTO responses.
- Externalize configuration; use Nacos for centralized config management.
- Never commit sensitive credentials.

## Architecture Notes

- Auth uses JWT via `common-security`.
- Gateway handles routing, auth checks, Sentinel-based flow control.
- Question service uses Chain of Responsibility for validation.
- Sentinel + Nacos provide dynamic flow control and rules.
- Redis used for cache/session; MyBatis for persistence.
- Blog service supports Markdown (Flexmark) + Redis caching.

## Testing Guidelines

- Tests live under `src/test/java` in each module.
- Name tests clearly after the unit under test (e.g., `UserServiceTest`).
- Run `mvn test` for full coverage or `mvn test -pl <module>` for targeted runs.

## Commit & Pull Request Guidelines

- Commit messages follow a conventional prefix pattern (e.g., `feat: add rate limiting`, `refactor: simplify DTO mapping`). Keep the subject imperative and concise.
- PRs should include: a short summary, affected services/modules, testing performed, and any config or port changes.
- If a change affects API behavior or configuration, update `README.md` or relevant docs.

## Local Service Ports (Reference)

- Gateway `18085`, Auth `18081`, User `18082`, UPMS `18083`, File `18066`.
  Update this list if you add or change service ports.
