415 lines
No EOL
18 KiB
Markdown
415 lines
No EOL
18 KiB
Markdown
# Sharenet Project Index
|
|
|
|
## Project Overview
|
|
|
|
Sharenet is a full-stack application for managing users and products, built with Rust (backend) and Next.js (frontend). It demonstrates clean architecture principles with multiple interface options and configurable storage backends.
|
|
|
|
## Architecture
|
|
|
|
### Backend Architecture (Clean Architecture)
|
|
|
|
The backend follows clean architecture principles with clear separation of concerns:
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Interface Layer │
|
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
│ │ API │ │ CLI │ │ TUI │ │
|
|
│ │ (Axum) │ │ (Clap) │ │ (Ratatui) │ │
|
|
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Application Layer │
|
|
│ ┌─────────────────────────────────────────────────────┐ │
|
|
│ │ Service/UseCase Layer │ │
|
|
│ │ - UserService │ │
|
|
│ │ - ProductService │ │
|
|
│ └─────────────────────────────────────────────────────┘ │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Domain Layer │
|
|
│ ┌─────────────────────────────────────────────────────┐ │
|
|
│ │ - User Entity │ │
|
|
│ │ - Product Entity │ │
|
|
│ │ - Repository Traits │ │
|
|
│ │ - Domain Errors │ │
|
|
│ └─────────────────────────────────────────────────────┘ │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Infrastructure Layer │
|
|
│ ┌─────────────┐ ┌─────────────┐ │
|
|
│ │ Memory │ │ PostgreSQL │ │
|
|
│ │ Repository │ │ Repository │ │
|
|
│ └─────────────┘ └─────────────┘ │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
sharenet/
|
|
├── backend/ # Rust backend
|
|
│ ├── Cargo.toml # Workspace configuration
|
|
│ ├── README.md # Backend documentation
|
|
│ ├── crates/ # Backend modules
|
|
│ │ ├── domain/ # Domain entities and traits
|
|
│ │ │ ├── Cargo.toml
|
|
│ │ │ └── src/lib.rs # Core domain logic
|
|
│ │ ├── application/ # Application services
|
|
│ │ │ ├── Cargo.toml
|
|
│ │ │ └── src/lib.rs # Use case implementations
|
|
│ │ ├── api/ # HTTP API (Axum)
|
|
│ │ │ ├── Cargo.toml
|
|
│ │ │ └── src/lib.rs # REST API endpoints
|
|
│ │ ├── cli/ # CLI interface (Clap)
|
|
│ │ │ ├── Cargo.toml
|
|
│ │ │ └── src/lib.rs # Command-line interface
|
|
│ │ ├── tui/ # TUI interface (Ratatui)
|
|
│ │ │ ├── Cargo.toml
|
|
│ │ │ └── src/lib.rs # Text user interface
|
|
│ │ ├── memory/ # In-memory storage
|
|
│ │ │ ├── Cargo.toml
|
|
│ │ │ └── src/lib.rs # Memory repository implementation
|
|
│ │ ├── postgres/ # PostgreSQL storage
|
|
│ │ │ ├── Cargo.toml
|
|
│ │ │ └── src/lib.rs # PostgreSQL repository implementation
|
|
│ │ ├── sharenet-api-memory/ # API binary (memory)
|
|
│ │ │ ├── Cargo.toml
|
|
│ │ │ └── src/main.rs # API entry point
|
|
│ │ ├── sharenet-api-postgres/ # API binary (PostgreSQL)
|
|
│ │ │ ├── Cargo.toml
|
|
│ │ │ └── src/main.rs # API entry point
|
|
│ │ ├── sharenet-cli-memory/ # CLI binary (memory)
|
|
│ │ │ ├── Cargo.toml
|
|
│ │ │ └── src/main.rs # CLI entry point
|
|
│ │ ├── sharenet-cli-postgres/ # CLI binary (PostgreSQL)
|
|
│ │ │ ├── Cargo.toml
|
|
│ │ │ └── src/main.rs # CLI entry point
|
|
│ │ ├── sharenet-tui-memory/ # TUI binary (memory)
|
|
│ │ │ ├── Cargo.toml
|
|
│ │ │ └── src/main.rs # TUI entry point
|
|
│ │ └── sharenet-tui-postgres/ # TUI binary (PostgreSQL)
|
|
│ │ ├── Cargo.toml
|
|
│ │ └── src/main.rs # TUI entry point
|
|
│ ├── migrations/ # Database migrations
|
|
│ │ └── 20240101000000_create_tables.sql
|
|
│ └── config/ # Configuration files
|
|
│ ├── api-memory.env # API with memory storage
|
|
│ ├── api-postgres.env # API with PostgreSQL
|
|
│ ├── cli-memory.env # CLI with memory storage
|
|
│ ├── cli-postgres.env # CLI with PostgreSQL
|
|
│ ├── tui-memory.env # TUI with memory storage
|
|
│ └── tui-postgres.env # TUI with PostgreSQL
|
|
├── frontend/ # Next.js frontend
|
|
│ ├── package.json # Frontend dependencies
|
|
│ ├── README.md # Frontend documentation
|
|
│ ├── src/ # Source code
|
|
│ │ ├── app/ # Next.js app directory
|
|
│ │ │ ├── layout.tsx # Root layout
|
|
│ │ │ ├── page.tsx # Dashboard page
|
|
│ │ │ ├── users/ # Users pages
|
|
│ │ │ │ └── page.tsx # Users management
|
|
│ │ │ └── products/ # Products pages
|
|
│ │ │ └── page.tsx # Products management
|
|
│ │ ├── components/ # React components
|
|
│ │ │ └── ui/ # shadcn/ui components
|
|
│ │ │ ├── button.tsx # Button component
|
|
│ │ │ ├── card.tsx # Card component
|
|
│ │ │ ├── dialog.tsx # Dialog component
|
|
│ │ │ ├── form.tsx # Form component
|
|
│ │ │ ├── input.tsx # Input component
|
|
│ │ │ ├── label.tsx # Label component
|
|
│ │ │ └── table.tsx # Table component
|
|
│ │ └── lib/ # Utility functions
|
|
│ │ ├── api.ts # API client
|
|
│ │ └── utils.ts # Utility functions
|
|
│ ├── public/ # Static assets
|
|
│ │ ├── file.svg # File icon
|
|
│ │ ├── globe.svg # Globe icon
|
|
│ │ ├── next.svg # Next.js logo
|
|
│ │ ├── vercel.svg # Vercel logo
|
|
│ │ └── window.svg # Window icon
|
|
│ ├── components.json # shadcn/ui configuration
|
|
│ ├── next.config.ts # Next.js configuration
|
|
│ ├── postcss.config.mjs # PostCSS configuration
|
|
│ ├── tailwind.config.js # Tailwind CSS configuration
|
|
│ └── tsconfig.json # TypeScript configuration
|
|
├── README.md # Project documentation
|
|
├── LICENSE.md # Project license
|
|
└── .gitignore # Git ignore rules
|
|
```
|
|
|
|
## Key Components
|
|
|
|
### Domain Layer (`backend/crates/domain/`)
|
|
|
|
**Core Entities:**
|
|
- `User`: User entity with id, username, email, timestamps
|
|
- `Product`: Product entity with id, name, description, timestamps
|
|
- `CreateUser`/`UpdateUser`: DTOs for user operations
|
|
- `CreateProduct`/`UpdateProduct`: DTOs for product operations
|
|
|
|
**Traits:**
|
|
- `Entity`: Base trait for domain entities
|
|
- `Repository<T>`: Generic repository trait for CRUD operations
|
|
|
|
**Error Handling:**
|
|
- `DomainError`: Domain-specific error types (NotFound, InvalidInput, Internal)
|
|
|
|
### Application Layer (`backend/crates/application/`)
|
|
|
|
**Services:**
|
|
- `Service<T, R>`: Generic service implementation
|
|
- `UseCase<T>`: Use case trait for business operations
|
|
- `Repository<T>`: Repository trait for data access
|
|
|
|
**Features:**
|
|
- Generic implementations for easy extension
|
|
- Static dispatch with generic traits
|
|
- Comprehensive test coverage with mock repositories
|
|
|
|
### Infrastructure Layer
|
|
|
|
#### Memory Repository (`backend/crates/memory/`)
|
|
- In-memory storage using `HashMap` and `RwLock`
|
|
- Suitable for development and testing
|
|
- No external dependencies
|
|
|
|
#### PostgreSQL Repository (`backend/crates/postgres/`)
|
|
- SQLx-based PostgreSQL implementation
|
|
- Connection pooling with PgPool
|
|
- Prepared query caching for performance
|
|
- Migration support
|
|
|
|
### Interface Layer
|
|
|
|
#### HTTP API (`backend/crates/api/`)
|
|
- **Framework**: Axum
|
|
- **Features**:
|
|
- RESTful endpoints for users and products
|
|
- CORS support
|
|
- Request/response logging
|
|
- JSON serialization/deserialization
|
|
- **Endpoints**:
|
|
- `POST /users` - Create user
|
|
- `GET /users/:id` - Get user by ID
|
|
- `GET /users` - List all users
|
|
- `PUT /users/:id` - Update user
|
|
- `DELETE /users/:id` - Delete user
|
|
- `POST /products` - Create product
|
|
- `GET /products/:id` - Get product by ID
|
|
- `GET /products` - List all products
|
|
- `PUT /products/:id` - Update product
|
|
- `DELETE /products/:id` - Delete product
|
|
|
|
#### CLI (`backend/crates/cli/`)
|
|
- **Framework**: Clap
|
|
- **Features**:
|
|
- Subcommand-based interface
|
|
- User and product management commands
|
|
- JSON output support
|
|
- **Commands**:
|
|
- `user create --username <name> --email <email>`
|
|
- `user get --id <id>`
|
|
- `user list`
|
|
- `user update --id <id> [--username <name>] [--email <email>]`
|
|
- `user delete --id <id>`
|
|
- `product create --name <name> --description <desc>`
|
|
- `product get --id <id>`
|
|
- `product list`
|
|
- `product update --id <id> [--name <name>] [--description <desc>]`
|
|
- `product delete --id <id>`
|
|
|
|
#### TUI (`backend/crates/tui/`)
|
|
- **Framework**: Ratatui
|
|
- **Features**:
|
|
- Interactive terminal interface
|
|
- Table-based data display
|
|
- Form-based data entry
|
|
- Navigation between users and products
|
|
|
|
### Frontend (`frontend/`)
|
|
|
|
#### Technology Stack
|
|
- **Framework**: Next.js 15.3.3
|
|
- **Language**: TypeScript
|
|
- **UI Library**: React 19
|
|
- **Styling**: Tailwind CSS
|
|
- **Components**: shadcn/ui
|
|
- **Form Handling**: React Hook Form with Zod validation
|
|
- **HTTP Client**: Axios
|
|
|
|
#### Key Features
|
|
- **Dashboard**: Overview page with navigation to users and products
|
|
- **Users Management**:
|
|
- View all users in a table
|
|
- Create new users via dialog
|
|
- Edit existing users
|
|
- Delete users with confirmation
|
|
- **Products Management**:
|
|
- View all products in a table
|
|
- Create new products via dialog
|
|
- Edit existing products
|
|
- Delete products with confirmation
|
|
|
|
#### API Integration
|
|
- **Base URL**: `http://127.0.0.1:3000`
|
|
- **Client**: Axios-based API client in `src/lib/api.ts`
|
|
- **Type Safety**: Full TypeScript interfaces for API responses
|
|
|
|
## Database Schema
|
|
|
|
### Users Table
|
|
```sql
|
|
CREATE TABLE users (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
username TEXT NOT NULL,
|
|
email TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
```
|
|
|
|
### Products Table
|
|
```sql
|
|
CREATE TABLE products (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT NOT NULL,
|
|
description TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
```
|
|
|
|
## Configuration
|
|
|
|
### Backend Configuration
|
|
Configuration files are located in `backend/config/`:
|
|
- `api-memory.env` - API server with in-memory storage
|
|
- `api-postgres.env` - API server with PostgreSQL storage
|
|
- `cli-memory.env` - CLI with in-memory storage
|
|
- `cli-postgres.env` - CLI with PostgreSQL storage
|
|
- `tui-memory.env` - TUI with in-memory storage
|
|
- `tui-postgres.env` - TUI with PostgreSQL storage
|
|
|
|
### Environment Variables
|
|
- `SERVER_ADDR` - Server address (default: 127.0.0.1:3000)
|
|
- `DATABASE_URL` - PostgreSQL connection string
|
|
- `RUST_LOG` - Logging level (default: info)
|
|
|
|
## Development Workflow
|
|
|
|
### Backend Development
|
|
1. **Setup**: Install Rust and SQLx CLI
|
|
2. **Database**: Create database and run migrations
|
|
3. **Build**: `cargo build`
|
|
4. **Run**: Choose appropriate binary for your use case
|
|
5. **Test**: `cargo test`
|
|
|
|
### Frontend Development
|
|
1. **Setup**: Install Node.js and npm
|
|
2. **Install**: `npm install`
|
|
3. **Run**: `npm run dev`
|
|
4. **Build**: `npm run build`
|
|
|
|
### Running the Full Stack
|
|
1. Start backend: `cargo run --bin sharenet-api-postgres`
|
|
2. Start frontend: `cd frontend && npm run dev`
|
|
3. Access web interface at `http://localhost:3000`
|
|
|
|
## Testing
|
|
|
|
### Backend Testing
|
|
- **Unit Tests**: Each crate has comprehensive unit tests
|
|
- **Integration Tests**: Repository implementations are tested
|
|
- **Mock Testing**: Mock repositories for isolated testing
|
|
|
|
### Frontend Testing
|
|
- **Component Testing**: Individual React components
|
|
- **Integration Testing**: API integration and user flows
|
|
- **E2E Testing**: Full application workflows
|
|
|
|
## Deployment
|
|
|
|
### Backend Deployment
|
|
- **Docker**: Containerized deployment
|
|
- **Binary**: Standalone executables
|
|
- **Database**: PostgreSQL with connection pooling
|
|
|
|
### Frontend Deployment
|
|
- **Vercel**: Optimized for Next.js
|
|
- **Static Export**: Can be deployed to any static hosting
|
|
- **Docker**: Containerized deployment
|
|
|
|
## Performance Considerations
|
|
|
|
### Backend
|
|
- **Connection Pooling**: PostgreSQL connection pooling
|
|
- **Query Caching**: SQLx prepared query caching
|
|
- **Async/Await**: Non-blocking I/O operations
|
|
- **Generic Implementations**: Zero-cost abstractions
|
|
|
|
### Frontend
|
|
- **Code Splitting**: Next.js automatic code splitting
|
|
- **Static Generation**: Pre-rendered pages where possible
|
|
- **Optimized Images**: Next.js image optimization
|
|
- **Bundle Analysis**: Webpack bundle analysis
|
|
|
|
## Security
|
|
|
|
### Backend Security
|
|
- **Input Validation**: Domain-level validation
|
|
- **Error Handling**: Secure error messages
|
|
- **CORS**: Configurable CORS policies
|
|
- **SQL Injection**: SQLx prevents SQL injection
|
|
|
|
### Frontend Security
|
|
- **Type Safety**: TypeScript prevents type-related errors
|
|
- **Input Validation**: Client-side validation with Zod
|
|
- **XSS Prevention**: React automatic escaping
|
|
- **CSRF Protection**: Built-in Next.js protection
|
|
|
|
## Future Enhancements
|
|
|
|
### Planned Features
|
|
- **Authentication**: User authentication and authorization
|
|
- **Role-Based Access Control**: User roles and permissions
|
|
- **Product Categories**: Product categorization system
|
|
- **Inventory Tracking**: Stock management
|
|
- **Audit Logging**: Operation logging and history
|
|
- **API Documentation**: OpenAPI/Swagger documentation
|
|
- **Real-time Updates**: WebSocket support
|
|
- **File Uploads**: Product image uploads
|
|
- **Search and Filtering**: Advanced data filtering
|
|
- **Pagination**: Large dataset handling
|
|
|
|
### Technical Improvements
|
|
- **Caching**: Redis integration for caching
|
|
- **Monitoring**: Application monitoring and metrics
|
|
- **Logging**: Structured logging with correlation IDs
|
|
- **Health Checks**: Application health endpoints
|
|
- **Rate Limiting**: API rate limiting
|
|
- **Compression**: Response compression
|
|
- **CDN**: Static asset delivery optimization
|
|
|
|
## Contributing
|
|
|
|
### Development Guidelines
|
|
- **Code Style**: Follow Rust and TypeScript conventions
|
|
- **Testing**: Maintain high test coverage
|
|
- **Documentation**: Keep documentation up to date
|
|
- **Architecture**: Follow clean architecture principles
|
|
- **Error Handling**: Comprehensive error handling
|
|
- **Performance**: Consider performance implications
|
|
|
|
### Code Review Process
|
|
- **Pull Requests**: All changes via pull requests
|
|
- **Code Review**: Mandatory code review
|
|
- **Testing**: Automated testing on all changes
|
|
- **Documentation**: Update documentation as needed
|
|
|
|
## License
|
|
|
|
This project is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License - see the [LICENSE.md](LICENSE.md) file for details.
|
|
|
|
For more information about the license and compliance requirements, see [LICENSE_NOTICE.md](LICENSE_NOTICE.md). |