215 lines
6.0 KiB
Markdown
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
|