Add Technical Handout (restrucktured)
parent
105fe30ba3
commit
c997776fc6
1 changed files with 263 additions and 0 deletions
263
Technical-Handout-%28restrucktured%29.md
Normal file
263
Technical-Handout-%28restrucktured%29.md
Normal file
|
@ -0,0 +1,263 @@
|
|||
# Technical Handout: PGG (Peer Group Grading) API
|
||||
|
||||
## 1. Why Do We Want to Implement APIs?
|
||||
|
||||
Based on our implementation, we chose to build APIs for the following reasons:
|
||||
|
||||
- **Separation of Frontend and Backend**: Our API provides a clean interface between the Web UI and the Rust backend, allowing independent development and deployment
|
||||
- **Security Layer**: We implemented session-based authentication with Redis session storage and password hashing using Argon2
|
||||
- **Modularity**: Our controller-based architecture (`auth.rs`, `user.rs`, `project.rs`, `group.rs`) allows for clean code organization
|
||||
- **Type Safety**: Using Rust with Actix-web and Sea-ORM provides compile-time guarantees and prevents common runtime errors
|
||||
- **Scalability**: The stateless API design with external session storage (Redis) allows horizontal scaling
|
||||
|
||||
## 2. Who Is the User?
|
||||
|
||||
**Primary Users:**
|
||||
- **Teachers**: Educational professionals managing peer group evaluations
|
||||
- Need to create and manage projects
|
||||
- Assign students to groups
|
||||
- Track and evaluate peer assessments
|
||||
|
||||
**System Users:**
|
||||
- **Administrators**: Can create user accounts with secure passwords
|
||||
- **Students** (Future): Will be able to view their group assignments and submit peer evaluations
|
||||
|
||||
## 3. What User Problems Are We Solving and What Benefits Are We Creating?
|
||||
|
||||
### Problems Solved:
|
||||
- **Manual Group Management**: Teachers currently track peer groups in spreadsheets or paper
|
||||
- **Security Issues**: No secure way to store sensitive grading data and user credentials
|
||||
- **Data Integrity**: Risk of data loss or corruption with manual systems
|
||||
- **Access Control**: No way to restrict access to sensitive grading information
|
||||
|
||||
### Benefits Created:
|
||||
- **Automated Workflows**: CRUD operations for projects, groups, and users
|
||||
- **Secure Authentication**: Session-based auth with Redis and Argon2 password hashing
|
||||
- **Data Persistence**: PostgreSQL database with migrations using Sea-ORM
|
||||
- **Audit Trail**: All changes tracked through database transactions
|
||||
- **RESTful Interface**: Standard HTTP methods for easy integration
|
||||
|
||||
## 4. What Concrete Outcomes Do We Want to Achieve?
|
||||
|
||||
### Implemented Features:
|
||||
- ✅ **User Management**: Create, read, update, delete users with secure password storage
|
||||
- ✅ **Authentication**: Login/logout with session management
|
||||
- ✅ **Project Management**: Full CRUD for projects
|
||||
- ✅ **Database Migrations**: Automated schema management
|
||||
- ✅ **API Documentation**: OpenAPI/Swagger UI integration
|
||||
- ✅ **Testing Infrastructure**: Unit and integration tests
|
||||
|
||||
### Technical Achievements:
|
||||
- **Response Times**: Fast API responses using Actix-web
|
||||
- **Security**: Argon2 for password hashing, session-based authentication
|
||||
- **Database Integrity**: Foreign key constraints and transactions
|
||||
- **Error Handling**: Comprehensive error types with proper HTTP status codes
|
||||
|
||||
## 5. How Do We Plan to Execute the API Program?
|
||||
|
||||
### Current Technology Stack:
|
||||
```toml
|
||||
# From Cargo.toml
|
||||
- Language: Rust (Edition 2021)
|
||||
- Web Framework: Actix-web 4
|
||||
- ORM: Sea-ORM with PostgreSQL
|
||||
- Session Storage: Redis with actix-session
|
||||
- Authentication: Argon2 for password hashing
|
||||
- API Documentation: utoipa with Swagger UI
|
||||
- Testing: Built-in Rust testing with testcontainers
|
||||
```
|
||||
|
||||
### Deployment Strategy:
|
||||
- **Static Binary**: Compiled as a statically linked Rust binary (as mentioned in original handout)
|
||||
- **Docker Support**: `backend.Dockerfile` for containerized deployment
|
||||
- **Environment Configuration**: `.env` file support with dotenvy
|
||||
|
||||
### Database Schema:
|
||||
```rust
|
||||
// Entities from our Sea-ORM models
|
||||
- User (id, username, name)
|
||||
- LocalAuth (id, hash, password_change_required)
|
||||
- Project (id, name)
|
||||
- Group (id, project_id, name)
|
||||
- UserGroupProject (user_id, group_id, project_id) // Junction table
|
||||
```
|
||||
|
||||
## 6. What Is the Architectural Style and Why Did We Choose It?
|
||||
|
||||
### REST (Representational State Transfer)
|
||||
|
||||
We implemented a RESTful API as evidenced by our route structure:
|
||||
```rust
|
||||
// From controller.rs
|
||||
cfg.service(web::scope("/project").configure(project::setup))
|
||||
.service(web::scope("/group").configure(group::setup))
|
||||
.service(web::scope("/user").configure(user::setup))
|
||||
.service(web::scope("/auth").configure(auth::setup))
|
||||
```
|
||||
|
||||
### Why REST?
|
||||
- **Simplicity**: Standard HTTP verbs (GET, POST, PUT, DELETE) as seen in our controllers
|
||||
- **Statelessness**: Sessions stored in Redis, not in application memory
|
||||
- **Tool Support**: Easy integration with Swagger UI for API documentation
|
||||
- **Industry Standard**: Familiar to developers, extensive ecosystem support
|
||||
|
||||
## 7. Implemented API Endpoints
|
||||
|
||||
### Authentication (`/api/v1/auth`)
|
||||
```rust
|
||||
POST /api/v1/auth/login // Login with username/password
|
||||
POST /api/v1/auth/logout // Logout and clear session
|
||||
```
|
||||
|
||||
### Users (`/api/v1/user`)
|
||||
```rust
|
||||
GET /api/v1/user // Get all users
|
||||
GET /api/v1/user/{id} // Get specific user
|
||||
POST /api/v1/user // Create user (with password)
|
||||
DELETE /api/v1/user/{id} // Delete user
|
||||
```
|
||||
|
||||
### Projects (`/api/v1/project`)
|
||||
```rust
|
||||
GET /api/v1/project // Get all projects
|
||||
GET /api/v1/project/{id} // Get specific project
|
||||
POST /api/v1/project // Create project
|
||||
PUT /api/v1/project/{id} // Update project
|
||||
DELETE /api/v1/project/{id} // Delete project
|
||||
```
|
||||
|
||||
### Groups (`/api/v1/group`) - Stubs implemented
|
||||
```rust
|
||||
GET /api/v1/group // Not implemented (returns 501)
|
||||
GET /api/v1/group/{project} // Not implemented
|
||||
POST /api/v1/group // Not implemented
|
||||
PUT /api/v1/group // Not implemented
|
||||
DELETE /api/v1/group/{id} // Not implemented
|
||||
```
|
||||
|
||||
## 8. Security Implementation
|
||||
|
||||
### Password Security:
|
||||
```rust
|
||||
// From user.rs
|
||||
- Argon2 hashing with salt generation
|
||||
- Password validation (minimum 8 characters)
|
||||
- Secure password verification on login
|
||||
```
|
||||
|
||||
### Session Management:
|
||||
```rust
|
||||
// From main.rs
|
||||
- Redis-based sessions with actix-session
|
||||
- Secure cookies (HTTPS in production)
|
||||
- Session purging on logout
|
||||
```
|
||||
|
||||
### Error Handling:
|
||||
```rust
|
||||
// From error.rs
|
||||
pub enum ApiError {
|
||||
Database(#[from] sea_orm::DbErr),
|
||||
Unauthorized,
|
||||
NotFound,
|
||||
BadRequest(String),
|
||||
ValidationError(#[from] validator::ValidationErrors),
|
||||
Argon2Error(String),
|
||||
SessionInsertError(#[from] actix_session::SessionInsertError),
|
||||
AlreadyLoggedIn,
|
||||
}
|
||||
```
|
||||
|
||||
## 9. Testing Strategy
|
||||
|
||||
### Unit Tests ✅
|
||||
Located in individual modules, for example:
|
||||
```rust
|
||||
// From main.rs tests
|
||||
#[test]
|
||||
fn build_database_url_with_defaults() { ... }
|
||||
#[test]
|
||||
fn build_database_url_with_all_vars() { ... }
|
||||
```
|
||||
|
||||
### Integration Tests ✅
|
||||
Located in `crates/backend/tests/`:
|
||||
```rust
|
||||
// From integration_tests.rs
|
||||
#[actix_web::test]
|
||||
async fn test_ok() { ... }
|
||||
|
||||
// From endpoints/user.rs
|
||||
#[actix_web::test]
|
||||
async fn test_create_user() { ... }
|
||||
```
|
||||
|
||||
### Test Infrastructure:
|
||||
- **Testcontainers**: Automated PostgreSQL and Redis containers for testing
|
||||
- **Test Helpers**: Reusable test app setup with `create_test_app!` macro
|
||||
- **Database Migrations**: Automatic migration in test setup
|
||||
|
||||
### No E2E Tests (Could-Have)
|
||||
As you mentioned, E2E tests are not implemented but would fall under the same category as integration tests.
|
||||
|
||||
## 10. Working Examples
|
||||
|
||||
### Login Request:
|
||||
```json
|
||||
// POST /api/v1/auth/login
|
||||
{
|
||||
"username": "teacher1",
|
||||
"password": "securepassword"
|
||||
}
|
||||
// Response: 200 OK
|
||||
{
|
||||
"message": "Login successful"
|
||||
}
|
||||
```
|
||||
|
||||
### Create User:
|
||||
```json
|
||||
// POST /api/v1/user
|
||||
{
|
||||
"username": "newteacher",
|
||||
"name": "New Teacher",
|
||||
"password": "password123"
|
||||
}
|
||||
// Response: 200 OK
|
||||
{
|
||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||
"username": "newteacher",
|
||||
"name": "New Teacher"
|
||||
}
|
||||
```
|
||||
|
||||
### Create Project:
|
||||
```json
|
||||
// POST /api/v1/project
|
||||
{
|
||||
"name": "Math Group Project 2024"
|
||||
}
|
||||
// Response: 200 OK
|
||||
{
|
||||
"id": "660e8400-e29b-41d4-a716-446655440001",
|
||||
"name": "Math Group Project 2024"
|
||||
}
|
||||
```
|
||||
|
||||
## 11. Future Enhancements
|
||||
|
||||
### Planned Features (from stubs):
|
||||
- Group management implementation
|
||||
- Class management system
|
||||
- Template system for reusable configurations
|
||||
- LDAP authentication integration (code exists in `crates/ldap/`)
|
||||
|
||||
### Potential Improvements:
|
||||
- WebSocket support for real-time updates
|
||||
- Batch operations for bulk user/group creation
|
||||
- Export functionality for grades
|
||||
- Email notifications for group assignments
|
||||
|
||||
## 12. Conclusion
|
||||
|
||||
The PGG API successfully provides a secure, type-safe foundation for peer group grading management. Using Rust with Actix-web ensures high performance and reliability, while Sea-ORM provides a robust database abstraction layer. The modular architecture allows for easy extension, and the comprehensive test suite ensures reliability. With session-based authentication and proper error handling, the API is ready for production use in educational environments.
|
Loading…
Add table
Reference in a new issue