115 lines
4.0 KiB
Markdown
115 lines
4.0 KiB
Markdown
|
|
# Copilot Coding Agent Instructions
|
||
|
|
|
||
|
|
This document provides instructions for AI coding agents working on this repository.
|
||
|
|
|
||
|
|
## Project Overview
|
||
|
|
|
||
|
|
This is a **Golang/Gin** implementation of the [RealWorld](https://github.com/gothinkster/realworld) example application. It demonstrates a fully fledged fullstack application including CRUD operations, authentication, routing, pagination, and more.
|
||
|
|
|
||
|
|
## Technology Stack
|
||
|
|
|
||
|
|
- **Go**: 1.21+ required
|
||
|
|
- **Web Framework**: [Gin](https://github.com/gin-gonic/gin) v1.10+
|
||
|
|
- **ORM**: [GORM v2](https://gorm.io/) (gorm.io/gorm)
|
||
|
|
- **Database**: SQLite (for development/testing)
|
||
|
|
- **Authentication**: JWT using [golang-jwt/jwt/v5](https://github.com/golang-jwt/jwt)
|
||
|
|
- **Validation**: [go-playground/validator/v10](https://github.com/go-playground/validator)
|
||
|
|
|
||
|
|
## Directory Structure
|
||
|
|
|
||
|
|
```
|
||
|
|
.
|
||
|
|
├── hello.go # Main entry point
|
||
|
|
├── common/ # Shared utilities
|
||
|
|
│ ├── database.go # Database connection manager
|
||
|
|
│ ├── utils.go # Helper functions (JWT, validation, etc.)
|
||
|
|
│ └── unit_test.go # Common package tests
|
||
|
|
├── users/ # User module
|
||
|
|
│ ├── models.go # User data models & DB operations
|
||
|
|
│ ├── serializers.go # Response formatting
|
||
|
|
│ ├── routers.go # Route handlers
|
||
|
|
│ ├── middlewares.go # Auth middleware
|
||
|
|
│ ├── validators.go # Input validation
|
||
|
|
│ └── unit_test.go # User package tests
|
||
|
|
├── articles/ # Articles module
|
||
|
|
│ ├── models.go # Article data models & DB operations
|
||
|
|
│ ├── serializers.go # Response formatting
|
||
|
|
│ ├── routers.go # Route handlers
|
||
|
|
│ ├── validators.go # Input validation
|
||
|
|
│ └── unit_test.go # Article package tests
|
||
|
|
└── scripts/ # Build/test scripts
|
||
|
|
```
|
||
|
|
|
||
|
|
## Development Commands
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Install dependencies
|
||
|
|
go mod download
|
||
|
|
|
||
|
|
# Build
|
||
|
|
go build ./...
|
||
|
|
|
||
|
|
# Run tests
|
||
|
|
go test ./...
|
||
|
|
|
||
|
|
# Run tests with coverage
|
||
|
|
go test -coverprofile=coverage.out ./...
|
||
|
|
|
||
|
|
# Format code
|
||
|
|
go fmt ./...
|
||
|
|
|
||
|
|
# Run linter
|
||
|
|
golangci-lint run
|
||
|
|
|
||
|
|
# Start the server
|
||
|
|
go run hello.go
|
||
|
|
```
|
||
|
|
|
||
|
|
## Code Style Guidelines
|
||
|
|
|
||
|
|
1. **Error Handling**: Always handle errors explicitly. Do not ignore errors with `_`.
|
||
|
|
2. **GORM v2 Patterns**:
|
||
|
|
- Use `Preload()` instead of `Related()` for eager loading
|
||
|
|
- Use `Association().Find()` for many-to-many relationships
|
||
|
|
- Use `Updates()` instead of `Update()` for struct/map updates
|
||
|
|
- Use pointers with `Delete()`: `Delete(&Model{})`
|
||
|
|
- Count returns `int64`, handle overflow when converting to `uint`
|
||
|
|
3. **Validation Tags**: Use `required` instead of deprecated `exists` tag
|
||
|
|
4. **JWT**: Use `jwt.NewWithClaims()` for token creation
|
||
|
|
|
||
|
|
## Testing
|
||
|
|
|
||
|
|
- Tests are in `*_test.go` files alongside source code
|
||
|
|
- Use `common.TestDBInit()` and `common.TestDBFree()` for test database setup/teardown
|
||
|
|
- Run `go test ./...` before committing changes
|
||
|
|
|
||
|
|
## API Endpoints
|
||
|
|
|
||
|
|
The API follows the [RealWorld API Spec](https://realworld-docs.netlify.app/docs/specs/backend-specs/endpoints):
|
||
|
|
|
||
|
|
- `POST /api/users` - Register
|
||
|
|
- `POST /api/users/login` - Login
|
||
|
|
- `GET /api/user` - Get current user
|
||
|
|
- `PUT /api/user` - Update user
|
||
|
|
- `GET /api/profiles/:username` - Get profile
|
||
|
|
- `POST /api/profiles/:username/follow` - Follow user
|
||
|
|
- `DELETE /api/profiles/:username/follow` - Unfollow user
|
||
|
|
- `GET /api/articles` - List articles
|
||
|
|
- `GET /api/articles/feed` - Feed articles
|
||
|
|
- `GET /api/articles/:slug` - Get article
|
||
|
|
- `POST /api/articles` - Create article
|
||
|
|
- `PUT /api/articles/:slug` - Update article
|
||
|
|
- `DELETE /api/articles/:slug` - Delete article
|
||
|
|
- `POST /api/articles/:slug/comments` - Add comment
|
||
|
|
- `GET /api/articles/:slug/comments` - Get comments
|
||
|
|
- `DELETE /api/articles/:slug/comments/:id` - Delete comment
|
||
|
|
- `POST /api/articles/:slug/favorite` - Favorite article
|
||
|
|
- `DELETE /api/articles/:slug/favorite` - Unfavorite article
|
||
|
|
- `GET /api/tags` - Get tags
|
||
|
|
|
||
|
|
## Security Considerations
|
||
|
|
|
||
|
|
- JWT secret is defined in `common/utils.go` - do not expose in production
|
||
|
|
- Always validate user input using validator tags
|
||
|
|
- Use parameterized queries (GORM handles this automatically)
|