vibeStonk/.junie/guidelines.md
2025-06-12 16:57:42 -04:00

215 lines
6.0 KiB
Markdown

# VibeStonk Development Guidelines
This document provides essential information for developers working on the VibeStonk project.
## Build/Configuration Instructions
### Prerequisites
- Go 1.23.0 or later
- Node.js and npm (for client development)
- Protocol Buffers compiler (protoc)
- Go Plugin for Protocol Buffers compiler
### Project Structure
- `client/`: Frontend code
- `proto/`: Protocol Buffer definitions
- `server/`: Backend Go code
- `scripts/`: Build and utility scripts
- `dist/`: Build artifacts
- `kubes/`: Kubernetes deployment configurations
### Building the Project
The project can be built using the provided build script:
```bash
./scripts/build.sh
```
This script:
1. Cleans the dist directory
2. Generates Go code from Protocol Buffer definitions
3. Builds the Go server
4. Builds the client using npm
5. Copies client build artifacts to the dist/content directory
### Docker Build
For containerized deployment, use the Docker build script:
```bash
./scripts/build_docker.sh
```
This builds Docker images for both the API server and static content server.
### Protocol Buffer Generation
Protocol Buffer code is generated using:
```bash
./scripts/generate_proto.sh
```
This script:
1. Removes old generated files
2. Creates directories for TypeScript definitions
3. Generates Go code from Protocol Buffer definitions
4. Generates TypeScript definitions for client-side use
### Configuration
The server uses a configuration system defined in `server/repository/config.go`. The default configuration can be obtained using `repository.GetDefaultConfig()`, which sets up:
- Database engine (SQLite)
- Data directories
- Server listen address (0.0.0.0:8080)
## Testing Information
### Test Configuration
Tests use a separate configuration obtained via `repository.GetTestConfigs()`, which:
- Uses the "test-data/" directory for test databases
- Creates separate test databases for each supported database engine
### Running Tests
Tests can be run using the standard Go test command:
```bash
# Run all tests in a package
cd server/util && go test
# Run tests with verbose output
cd server/util && go test -v
# Run a specific test
cd server/util && go test -v -run TestReverseString
```
### Test Cleanup
After running tests, you can clean up test databases using:
```bash
./scripts/remove_test_dbs.sh
```
### Creating Tests
Tests follow the standard Go testing pattern:
1. Create a file with the `_test.go` suffix
2. Import the `testing` package
3. Create test functions with the `Test` prefix
Below are examples of tests in this project. Note that these are simplified examples for illustration purposes.
**Example of a simple utility test using table-driven testing:**
```
// In file: server/util/string_utils_test.go
package util
import (
"testing"
)
// TestReverseString tests the ReverseString function
func TestReverseString(t *testing.T) {
// Define test cases with input and expected output
testCases := []struct {
name string
input string
expected string
}{
{"empty string", "", ""},
{"normal string", "hello", "olleh"},
}
// Run each test case
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
result := ReverseString(tc.input)
if result != tc.expected {
t.Errorf("Expected %q, got %q", tc.expected, result)
}
})
}
}
```
**Example of a service test:**
```
// In file: server/services/authService_test.go
package services
import (
"testing"
"vibeStonk/server/repository"
"vibeStonk/server/util"
)
// TestAuthService_RegisterUser tests user registration
func TestAuthService_RegisterUser(t *testing.T) {
// Get test configurations and credentials
configs := repository.GetTestConfigs()
testUserName, testUserPassword := util.GetTestUserCredentials()
// Test with each configuration
for _, config := range configs {
// Create service
service, err := NewAuthService(config)
if err != nil {
t.Errorf("error creating service: %v", err)
}
// Register user
user, err := service.RegisterUser(testUserName, "Test", testUserPassword)
if err != nil {
t.Errorf("expected no error, got: %+v", err)
}
// Verify user properties
if user.UserName != testUserName || user.PrefName != "Test" {
t.Fail()
}
}
}
```
### Test Utilities
The project provides test utilities in:
- `server/util/testDB.go`: Provides test user credentials
- `server/repository/config.go`: Provides test configurations
## Additional Development Information
### Code Organization
- **Routes**: Defined in `server/routes/`, using the Echo framework
- **Services**: Business logic in `server/services/`
- **Repository**: Data access in `server/repository/`
- **Models**: Generated from Protocol Buffers in `server/models/`
- **Utilities**: Helper functions in `server/util/`
### API Server
The API server is created using `routes.NewAPIServer(config)` and routes are added using the `AddRoute` or `AddRoutesBulk` methods.
### Authentication
The project uses a token-based authentication system:
- Tokens are provided in the "Bearer" header
- Authentication is handled by the `AuthenticationMiddleware`
- User registration and authentication are managed by the `AuthService`
### Database
The project uses SQLite for data storage:
- Database files are stored in the "data/" directory
- Test databases are stored in the "test-data/" directory
- The database engine is configurable in the `Config` struct
### Error Handling
Errors are propagated up the call stack and wrapped with context using `fmt.Errorf("context: %w", err)`.
### Generics
The project uses Go generics for type-safe utility functions, as seen in `server/util/func.go` and `server/util/string_utils.go`.
### Kubernetes Deployment
The project includes Kubernetes deployment configurations in the `kubes/` directory:
- Namespace configuration
- Deployment configurations for API and static content servers
- Service configurations
- Ingress configuration for routing external traffic