# Codebase Structure

**Analysis Date:** 2026-03-27

## Directory Layout

```text
junhong_cmp_fiber/
├── cmd/                 # API、Worker、文档生成入口
├── internal/            # 核心业务代码（handler/service/store/model/routes/bootstrap/task）
├── pkg/                 # 可复用基础设施与跨模块工具
├── migrations/          # SQL 迁移脚本
├── docs/                # 业务文档、接入指南、架构说明
├── openspec/            # 当前能力规格与变更档案
├── specs/               # 早期 Speckit 规格文档
├── scripts/             # 检查与初始化脚本
├── docker/              # 部署相关辅助文件
├── logs/                # 运行期日志输出目录
└── .planning/codebase/  # 当前代码地图产物
```

## Directory Purposes

**`cmd/`:**
- Purpose: 进程级入口和独立命令。
- Contains: `cmd/api/main.go`, `cmd/api/docs.go`, `cmd/worker/main.go`, `cmd/gendocs/main.go`
- Key files: `cmd/api/main.go`, `cmd/worker/main.go`

**`internal/bootstrap/`:**
- Purpose: 依赖装配中心。
- Contains: API/Worker 的 stores、services、handlers、middlewares 初始化。
- Key files: `internal/bootstrap/bootstrap.go`, `internal/bootstrap/services.go`, `internal/bootstrap/worker.go`, `internal/bootstrap/types.go`

**`internal/routes/`:**
- Purpose: 路由域划分与 OpenAPI 绑定。
- Contains: 域入口 `admin.go`, `auth.go`, `personal.go` 以及各模块路由文件。
- Key files: `internal/routes/routes.go`, `internal/routes/registry.go`, `internal/routes/admin.go`, `internal/routes/personal.go`

**`internal/handler/`:**
- Purpose: HTTP Handler 层。
- Contains: `admin/`、`app/`、`auth/`、`callback/` 四个子域。
- Key files: `internal/handler/admin/account.go`, `internal/handler/auth/handler.go`, `internal/handler/callback/payment.go`

**`internal/service/`:**
- Purpose: 业务逻辑层。
- Contains: 按业务模块拆分的子目录，每个模块通常有一个 `service.go`。
- Key files: `internal/service/account/service.go`, `internal/service/order/service.go`, `internal/service/package/service.go`, `internal/service/polling/*.go`

**`internal/store/`:**
- Purpose: 数据访问层。
- Contains: 基础抽象 `store.go`、查询选项 `options.go`、以及 `postgres/` 下的具体实现。
- Key files: `internal/store/store.go`, `internal/store/options.go`, `internal/store/postgres/account_store.go`, `internal/store/postgres/order_store.go`

**`internal/model/`:**
- Purpose: 持久化模型与 DTO。
- Contains: 业务实体模型、基础模型、DTO 子目录。
- Key files: `internal/model/account.go`, `internal/model/order.go`, `internal/model/shop.go`, `internal/model/dto/account_dto.go`

**`internal/task/`:**
- Purpose: Asynq 任务处理逻辑。
- Contains: 轮询、导入、订单超时、邮件、佣金等任务处理器。
- Key files: `internal/task/polling_handler.go`, `internal/task/order_expire.go`, `internal/task/device_import.go`

**`internal/polling/`:**
- Purpose: 轮询调度器与专用运行时组件。
- Contains: `Scheduler`、激活处理器、流量重置处理器。
- Key files: `internal/polling/scheduler.go`

**`internal/gateway/`:**
- Purpose: 对外 Gateway HTTP 客户端封装。
- Contains: 请求签名、设备/卡查询与操作客户端。
- Key files: `internal/gateway/client.go`（由 `cmd/api/main.go`、`cmd/worker/main.go` 初始化）

**`pkg/`:**
- Purpose: 通用基础设施。
- Contains: 配置、数据库、日志、认证、错误、响应、OpenAPI、队列、对象存储、微信、短信、中间件辅助。
- Key files: `pkg/config/config.go`, `pkg/config/loader.go`, `pkg/database/postgres.go`, `pkg/middleware/auth.go`, `pkg/middleware/data_scope.go`, `pkg/openapi/generator.go`

**`migrations/`:**
- Purpose: 数据库结构演进。
- Contains: 成对的 `*.up.sql` / `*.down.sql` 与少量补数 SQL。
- Key files: `migrations/000000_create_legacy_tables.up.sql`, `migrations/000055_package_system_upgrade.up.sql`, `migrations/000088_rename_card_wallet_id_to_asset_wallet_id.up.sql`

**`docs/`:**
- Purpose: 面向开发和业务的说明文档。
- Contains: 功能总结、架构说明、接入指南、运维说明、第三方资料。
- Key files: `docs/api-documentation-guide.md`, `docs/auth-architecture.md`, `docs/polling-system/README.md`

**`openspec/`:**
- Purpose: 规范驱动开发资产。
- Contains: `config.yaml`、当前 specs、历史归档变更。
- Key files: `openspec/config.yaml`, `openspec/specs/**/spec.md`, `openspec/changes/archive/**`

## Key File Locations

**Entry Points:**
- `cmd/api/main.go`: API 服务主入口。
- `cmd/worker/main.go`: Worker 服务主入口。
- `cmd/gendocs/main.go`: 离线 OpenAPI 生成命令。

**Configuration:**
- `pkg/config/config.go`: 配置结构与校验规则。
- `pkg/config/loader.go`: 嵌入配置 + 环境变量覆盖加载。
- `openspec/config.yaml`: 规范生成器上下文与规则。

**Core Logic:**
- `internal/service/`: 所有业务服务主实现。
- `internal/store/postgres/`: 所有 PostgreSQL 访问实现。
- `internal/bootstrap/`: 依赖注入和装配。
- `internal/polling/scheduler.go`: 轮询核心调度逻辑。

**API Surface:**
- `internal/routes/`: 路由分组与注册。
- `internal/handler/admin/`, `internal/handler/app/`, `internal/handler/auth/`, `internal/handler/callback/`: 传输层处理器。

**Data Definitions:**
- `internal/model/*.go`: 表模型。
- `internal/model/dto/*.go`: 请求/响应 DTO。

**Documentation / Planning:**
- `docs/`: 功能文档。
- `openspec/specs/`: 现行规格。
- `openspec/changes/archive/`: 历史变更记录。

## Naming Conventions

**Files:**
- 模块按业务名命名：`internal/service/account/service.go`, `internal/handler/admin/account.go`
- 大部分 Store 文件采用 `{resource}_store.go`：`internal/store/postgres/account_store.go`
- DTO 文件采用 `{module}_dto.go`：`internal/model/dto/account_dto.go`
- 路由文件按模块命名：`internal/routes/account.go`, `internal/routes/polling_config.go`

**Directories:**
- 分层目录使用小写单数语义：`internal/service/`, `internal/store/`, `internal/model/`
- 传输域用子目录表达边界：`internal/handler/admin/`, `internal/handler/app/`, `internal/handler/callback/`
- 规格目录按能力名组织：`openspec/specs/account-management/`, `openspec/specs/order-payment/`

## Ownership / Responsibility Guide

**如果改接口路径或加新 API：**
- 先看 `internal/routes/registry.go` 与对应模块路由文件。
- 再同步检查 `docs/api-documentation-guide.md`、`cmd/api/docs.go`、`cmd/gendocs/main.go`、`pkg/openapi/handlers.go`。

**如果改业务规则：**
- 主要落点在 `internal/service/{module}/service.go`。
- 如涉及跨模块，先看 `internal/bootstrap/services.go` 中该服务依赖谁。

**如果改查询或权限过滤：**
- 主要落点在 `internal/store/postgres/*.go`。
- 数据范围辅助逻辑集中在 `pkg/middleware/data_scope.go` 与 `pkg/middleware/permission_helper.go`。

**如果改表结构或模型：**
- SQL 先改 `migrations/`。
- Go 模型同步改 `internal/model/*.go`。
- DTO 变更再改 `internal/model/dto/*.go`。

**如果改异步任务：**
- 任务实现放 `internal/task/*.go`。
- 注册入口在 `pkg/queue/handler.go`。
- Worker 依赖拼装在 `internal/bootstrap/worker*.go`。

**如果改轮询系统：**
- 调度逻辑看 `internal/polling/scheduler.go`。
- 执行逻辑看 `internal/task/polling_handler.go`。
- 配置/监控/清理相关服务看 `internal/service/polling/*.go`。

## Where to Add New Code

**New Admin API Feature:**
- Primary code: `internal/handler/admin/{module}.go`, `internal/service/{module}/service.go`, `internal/store/postgres/{module}_store.go`, `internal/routes/{module}.go`
- Models / DTOs: `internal/model/{module}.go`, `internal/model/dto/{module}_dto.go`
- Wiring: `internal/bootstrap/services.go`, `internal/bootstrap/handlers.go`, `internal/bootstrap/types.go`, `internal/routes/admin.go`

**New Personal Client Feature:**
- Primary code: `internal/handler/app/{feature}.go`, `internal/service/{feature}/service.go` 或复用现有服务
- Routes: `internal/routes/personal.go`
- Auth-sensitive DTOs: `internal/model/dto/` 下新增对应 DTO 文件

**New Worker Task:**
- Implementation: `internal/task/{task_name}.go`
- Registration: `pkg/queue/handler.go`
- Dependencies: `internal/bootstrap/worker_services.go` 或 `internal/bootstrap/worker_stores.go`
- Constants: `pkg/constants/` 中对应任务类型定义

**New Shared Utility:**
- Shared helpers: `pkg/{subsystem}/`
- 仅限跨多个业务模块复用的基础能力，不要把业务逻辑塞进 `pkg/`

**New Business Spec / Plan Artifact:**
- Current capability spec: `openspec/specs/{capability}/spec.md`
- Historical change proposal: `openspec/changes/...`
- Developer-facing long-form doc: `docs/{feature-id}/` 或现有专题目录

## Practical Navigation Guide

**从请求入口追代码：**
1. 在 `internal/routes/*.go` 找路径。
2. 跳到对应 `internal/handler/...` 方法。
3. 看该 Handler 注入了哪个 Service。
4. 到 `internal/service/...` 看业务编排。
5. 再进入 `internal/store/postgres/...` 看 SQL 过滤与分页。
6. 最后回到 `internal/model/` / `internal/model/dto/` 看字段定义。

**从一个模块反查装配方式：**
1. 先找 `internal/bootstrap/services.go` 是否实例化该 Service。
2. 再看 `internal/bootstrap/handlers.go` 是否把它交给 Handler。
3. 再看 `internal/routes/admin.go` 或 `internal/routes/personal.go` 是否挂载了该模块。

**从一个异步任务反查来源：**
1. 看 `pkg/queue/handler.go` 的 `registerXxxHandler()`。
2. 跳到 `internal/task/{task}.go`。
3. 若任务由调度器触发，再看 `internal/polling/scheduler.go` 或 `cmd/worker/main.go` 的 Asynq Scheduler 注册。

## Special Directories

**`logs/`:**
- Purpose: 运行日志输出目录。
- Generated: Yes
- Committed: No（运行期产物）

**`migrations/`:**
- Purpose: 数据库迁移脚本。
- Generated: No
- Committed: Yes

**`docs/第三方文档/`:**
- Purpose: 外部供应商或接口资料归档。
- Generated: No
- Committed: Yes

**`openspec/changes/archive/`:**
- Purpose: 已归档历史变更。
- Generated: No
- Committed: Yes

**`.planning/codebase/`:**
- Purpose: 供规划/执行命令消费的代码地图文档。
- Generated: Yes
- Committed: Yes

## Structural Notes for Contributors

- 这个仓库的“物理结构”严格围绕 Go 后端单体展开；新增代码优先放进现有层级，不要新造平行架构。
- `internal/bootstrap/handlers.go` 当前会为客户端能力额外 new 一批 Store，这意味着某些接口不是纯 Service 注入；新增客户端功能前先确认是否要复用现有 `services` 聚合，还是遵循当前适配方式。
- OpenAPI 不是完全自动发现；新增 Handler、Route 之后，必须同步维护 `internal/bootstrap/types.go`、`internal/bootstrap/handlers.go`、`internal/routes/*.go`、`cmd/api/docs.go`、`cmd/gendocs/main.go`、`pkg/openapi/handlers.go`。
- 数据权限过滤不在统一 GORM 查询回调中自动生效；新增 Store 查询时，要主动选对 `ApplyShopFilter`、`ApplyEnterpriseFilter`、`ApplySellerShopFilter`、`ApplyOwnerShopFilter` 等函数。

---

*Structure analysis: 2026-03-27*
