diff --git a/.drone.yml b/.drone.yml index 1e06e702..fea8ae92 100644 --- a/.drone.yml +++ b/.drone.yml @@ -18,27 +18,23 @@ steps: from_secret: docker_login DOCKER_TOKEN: from_secret: docker_token - DOCKER_PASSWORD: - from_secret: docker_password commands: - - docker login git.kkknametrans.buzz -u $DOCKER_LOGIN -p $DOCKER_TOKEN - - docker build -t git.kkknametrans.buzz/danial/kami_backend_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER} -f manifest/docker/Dockerfile . --build-arg USE_PROXY=0 - - docker tag git.kkknametrans.buzz/danial/kami_backend_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER} git.kkknametrans.buzz/danial/kami_backend_${DRONE_BRANCH}:latest - - docker push git.kkknametrans.buzz/danial/kami_backend_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER} - - docker push git.kkknametrans.buzz/danial/kami_backend_${DRONE_BRANCH}:latest - - docker logout git.kkknametrans.buzz + - docker login git.oceanpay.cc -u $DOCKER_LOGIN -p $DOCKER_TOKEN + - docker build -t git.oceanpay.cc/danial/kami_backend_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER} -f manifest/docker/Dockerfile . --build-arg USE_PROXY=0 + - docker tag git.oceanpay.cc/danial/kami_backend_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER} git.oceanpay.cc/danial/kami_backend_${DRONE_BRANCH}:latest + - docker push git.oceanpay.cc/danial/kami_backend_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER} + - docker push git.oceanpay.cc/danial/kami_backend_${DRONE_BRANCH}:latest + - docker logout git.oceanpay.cc - name: deploy to docker compose environment: DOCKER_LOGIN: from_secret: docker_login DOCKER_TOKEN: from_secret: docker_token - DOCKER_PASSWORD: - from_secret: docker_password commands: - - docker login git.kkknametrans.buzz -u $DOCKER_LOGIN -p $DOCKER_TOKEN + - docker login git.oceanpay.cc -u $DOCKER_LOGIN -p $DOCKER_TOKEN - BRANCH=${DRONE_BRANCH} VERSION=${DRONE_BUILD_NUMBER} docker compose -f /data/kami/docker-compose.yaml --profile kami_backend up -d - - docker logout git.kkknametrans.buzz + - docker logout git.oceanpay.cc trigger: branch: diff --git a/CLAUDE.md b/CLAUDE.md index bfb7e747..0e3bdbd9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,86 +4,120 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Development Commands -This project uses GoFrame (GF) framework and includes a custom Makefile for common operations: +This project uses GoFrame (GF) framework and includes a custom Makefile that delegates to `hack/hack.mk`: ### Building and Running -- `make build` - Build binary using GoFrame CLI +- `make build` - Build binary using GoFrame CLI (`gf build -ew`) - `go run main.go` - Run the application directly -- `make up` - Update GoFrame and CLI to latest version +- `make up` - Update GoFrame and CLI to latest version (`gf up -a`) -### Code Generation +### Code Generation (GoFrame CLI) -- `make ctrl` - Generate controllers from API definitions -- `make dao` - Generate DAO/DO/Entity files from database schema -- `make service` - Generate service interfaces -- `make enums` - Generate enum files from Go code -- `make pb` - Generate protobuf files -- `make pbentity` - Generate protobuf files for database tables +- `make ctrl` - Generate controllers from API definitions (`gf gen ctrl`) +- `make dao` - Generate DAO/DO/Entity files from database schema (`gf gen dao`) +- `make service` - Generate service interfaces (`gf gen service`) +- `make enums` - Generate enum files from Go code (`gf gen enums`) +- `make pb` - Generate protobuf files (`gf gen pb`) +- `make pbentity` - Generate protobuf files for database tables (`gf gen pbentity`) ### Testing - `go test ./...` - Run all tests - `go test -v ./internal/logic/...` - Run tests for specific packages - `go test ./internal/logic/card_apple_account -v` - Run tests for specific module +- `go test -run TestName` - Run specific test -### Docker +### Docker & Deployment -- `make image` - Build Docker image with auto-generated tag +- `make image` - Build Docker image with auto-generated git-based tag - `make image.push` - Build and push Docker image -- `make deploy` - Deploy to kubernetes environment +- `make deploy` - Deploy to kubernetes environment using kustomize ## Architecture Overview -This is a Go-based backend service using the GoFrame framework with the following key components: +This is a Go-based backend service for a card redemption platform (卡密兑换平台) using the GoFrame framework: -### Core Structure +### Application Entry & Flow -- **main.go**: Entry point with OpenTelemetry tracing initialization -- **internal/cmd/**: Command definitions and HTTP server setup -- **internal/controller/**: HTTP handlers for different business domains -- **internal/logic/**: Business logic implementation -- **utility/**: Shared utilities including monitoring and tracing +- **main.go**: Entry point with OpenTelemetry initialization, sets service name from `serverName` env var, starts + `cmd.Main` +- **internal/cmd/cmd.go**: HTTP server setup, binds controllers under `/api` with middleware stack, registers monitoring + and cron tasks -### Key Business Domains +### Database Architecture (Dual Database Setup) -- **Card Management**: Multi-platform card support including Apple, JD, T-Mall, Walmart, C-Trip cards with account - management and configuration -- **Order Processing**: Complete order lifecycle with callback handling, status tracking, and order summary generation -- **User Management**: Authentication via JWT, TOTP support, role-based access control with Casbin -- **Payment Processing**: Payment method management, deduction tracking, and payment statistics -- **Merchant Management**: Merchant configurations, deployment management, and steal rule processing -- **Channel & Road Management**: Business routing logic with road pools and entrance management -- **Restriction Management**: IP and device ID tracking for access control -- **JDCookie Management**: JD cookie rotation, order processing, and account management +The system uses two MySQL databases configured in `manifest/config/config.yaml`: -### Technology Stack +- **default** (`kami_v2`): Primary database +- **v1** (`kami`): Legacy database with `v1` prefix for generated models -- **Framework**: GoFrame v2 with code generation capabilities -- **Database**: MySQL with GoFrame ORM (DAO/DO/Entity pattern) -- **Cache**: Redis for caching and session management -- **Tracing**: OpenTelemetry with OTLP exporter for observability -- **Monitoring**: Built-in metrics and health checks with Prometheus integration -- **Task Scheduling**: Cron jobs for periodic tasks with graceful shutdown -- **Authentication**: JWT tokens with TOTP support -- **Authorization**: Casbin for role-based access control -- **External Integrations**: T-Mall SDK, JD APIs, Walmart APIs, C-Trip APIs -- **Rate Limiting**: Built-in rate limiting with Redis backend +Code generation configuration in `hack/config.yaml` defines separate DAO generation for each database with appropriate +prefixes. -### Configuration +### Business Domain Structure -- Uses GoFrame's configuration system -- Environment variables supported (e.g., `serverName`) -- Docker deployment ready with Kubernetes manifests +**Card Platform Management**: -### Development Notes +- Apple cards (`card_apple_*`): Account management, order processing, steal rules +- T-Mall cards (`card_t_mall_*`): Account management, order processing, shop management +- JD cards (`card_jd_*`, `card_original_jd_*`): JD card variants +- Walmart cards (`card_walmart_*`): Walmart card management +- C-Trip cards (`card_c_trip_*`): Travel card management +- Redeem cards (`card_redeem_*`): Generic redemption system -- The project uses GoFrame's code generation capabilities heavily - always run `make dao` after database schema changes -- Controllers are auto-generated from API definitions in the `api/` directory -- Database access follows GoFrame's DAO/DO/Entity pattern with generated models -- OpenTelemetry tracing is configured for HTTP and gRPC exporters with custom headers -- Graceful shutdown handling for cron jobs and connection pools is implemented -- The service includes extensive external API integrations for various card platforms -- Rate limiting and restriction management are built-in for security -- All external integrations are located in `utility/integration/` with proper abstraction -- Business logic is separated by domain in `internal/logic/` with clear boundaries \ No newline at end of file +**Core Business Systems**: + +- **Order Processing**: Complete lifecycle with callbacks, status tracking, summaries +- **Merchant Management**: Configurations, deployments, hidden settings, steal rules +- **Channel & Road Management**: Business routing with road pools and entrance management +- **User Management**: Authentication (JWT + TOTP), roles, Casbin authorization +- **Payment Processing**: Payment methods, deductions, statistics +- **Restriction Management**: IP/device tracking for access control +- **JDCookie Management**: Cookie rotation, order processing, account management + +### Technology Stack Details + +- **Framework**: GoFrame v2 with heavy code generation usage +- **Database**: MySQL with GoFrame ORM (DAO/DO/Entity pattern), dual database support +- **Cache**: Redis for caching, sessions, rate limiting +- **Tracing**: OpenTelemetry with custom headers (`x-service-token`) +- **Monitoring**: Built-in metrics, health checks, monitor tasks +- **Task Scheduling**: Cron jobs with graceful shutdown +- **Authentication**: JWT with TOTP support, multi-login capability +- **Authorization**: Casbin RBAC with model/policy files +- **Rate Limiting**: Redis-based with configurable rules + +### External Integrations + +All external platform integrations are abstracted in `utility/integration/`: + +- **T-Mall**: OAuth gateway integration with eco.taobao.com +- **JD**: JD API integration with cookie management +- **Walmart**: Walmart API integration +- **C-Trip**: Travel platform API integration +- **Agiso**: App authentication service + +### Configuration System + +- **Primary Config**: `manifest/config/config.yaml` +- **Code Gen Config**: `hack/config.yaml` (database connections, generation paths) +- **Environment Support**: `serverName` variable for service identification +- **Secret Management**: Encryption keys for frontend/backend, token configuration + +### Critical Development Patterns + +- **Code Generation Workflow**: Database changes → `make dao` → `make service` → `make ctrl` +- **API-First**: Controllers generated from `api/` definitions +- **Domain Separation**: Each business domain has its own logic folder with clear boundaries +- **Graceful Shutdown**: Implemented for cron jobs and connection pools +- **Security**: Built-in rate limiting, IP/device restrictions, authentication middleware + +### Testing Strategy + +Focused test coverage in critical business logic areas: + +- Apple account management (`internal/logic/card_apple_account/`) +- T-Mall order processing (`internal/logic/card_t_mall_order/`) +- Rate limiting (`internal/logic/limiter/`) +- Business logic validation with comprehensive test coverage \ No newline at end of file diff --git a/go.work b/go.work index 028798da..5dd0d28e 100644 --- a/go.work +++ b/go.work @@ -1,4 +1,4 @@ -go 1.25.1 +go 1.25 use ( . diff --git a/manifest/docker/Dockerfile b/manifest/docker/Dockerfile index 22f94ddc..029a3d6e 100644 --- a/manifest/docker/Dockerfile +++ b/manifest/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24-alpine AS builder +FROM golang:1.25-alpine AS builder ARG USE_PROXY WORKDIR /build