hero.herofs_server #
HeroFS REST API Server
A comprehensive REST API server for the HeroFS distributed filesystem, built with V and VEB framework.
Features
- Complete CRUD Operations for all HeroFS entities (Filesystems, Directories, Files, Blobs, Symlinks)
- Advanced Filesystem Tools (find, copy, move, remove, import/export)
- CORS Support for frontend integration
- JSON Request/Response with consistent error handling
- RESTful Design following standard HTTP conventions
- Production Ready with proper error handling and validation
Quick Start
import incubaid.herolib.hero.herofs_server
// Create and start server
mut server := herofs_server.new(
port: 8080
host: 'localhost'
cors_enabled: true
allowed_origins: ['*']
)!
server.start()!
API Endpoints
Health & Info
GET /health
- Health checkGET /api
- API information and available endpoints
Filesystems (/api/fs
)
GET /api/fs
- List all filesystemsGET /api/fs/:id
- Get filesystem by IDPOST /api/fs
- Create new filesystemPUT /api/fs/:id
- Update filesystemDELETE /api/fs/:id
- Delete filesystemGET /api/fs/:id/exists
- Check if filesystem existsPOST /api/fs/:id/usage/increase
- Increase usage counterPOST /api/fs/:id/usage/decrease
- Decrease usage counterPOST /api/fs/:id/quota/check
- Check quota availability
Directories (/api/dirs
)
GET /api/dirs
- List all directoriesGET /api/dirs/:id
- Get directory by IDPOST /api/dirs
- Create new directoryPUT /api/dirs/:id
- Update directoryDELETE /api/dirs/:id
- Delete directoryPOST /api/dirs/create-path
- Create directory pathGET /api/dirs/:id/has-children
- Check if directory has childrenGET /api/dirs/:id/children
- Get directory children
Files (/api/files
)
GET /api/files
- List all filesGET /api/files/:id
- Get file by IDPOST /api/files
- Create new filePUT /api/files/:id
- Update fileDELETE /api/files/:id
- Delete filePOST /api/files/:id/add-to-directory
- Add file to directoryPOST /api/files/:id/remove-from-directory
- Remove file from directoryPOST /api/files/:id/metadata
- Update file metadataPOST /api/files/:id/accessed
- Update accessed timestampGET /api/files/by-filesystem/:fs_id
- List files by filesystem
Blobs (/api/blobs
)
GET /api/blobs
- List all blobsGET /api/blobs/:id
- Get blob by IDPOST /api/blobs
- Create new blobPUT /api/blobs/:id
- Update blobDELETE /api/blobs/:id
- Delete blobGET /api/blobs/:id/content
- Get blob raw contentGET /api/blobs/:id/verify
- Verify blob integrity
Symlinks (/api/symlinks
)
GET /api/symlinks
- List all symlinksGET /api/symlinks/:id
- Get symlink by IDPOST /api/symlinks
- Create new symlinkPUT /api/symlinks/:id
- Update symlinkDELETE /api/symlinks/:id
- Delete symlinkGET /api/symlinks/:id/is-broken
- Check if symlink is broken
Blob Membership (/api/blob-membership
)
GET /api/blob-membership
- List all blob membershipsGET /api/blob-membership/:id
- Get blob membership by IDPOST /api/blob-membership
- Create new blob membershipDELETE /api/blob-membership/:id
- Delete blob membership
Filesystem Tools (/api/tools
)
POST /api/tools/find
- Find files and directoriesPOST /api/tools/copy
- Copy files or directoriesPOST /api/tools/move
- Move files or directoriesPOST /api/tools/remove
- Remove files or directoriesPOST /api/tools/list
- List directory contentsPOST /api/tools/import/file
- Import file from real filesystemPOST /api/tools/import/directory
- Import directory from real filesystemPOST /api/tools/export/file
- Export file to real filesystemPOST /api/tools/export/directory
- Export directory to real filesystemPOST /api/tools/content/:fs_id
- Get file content as text
Request/Response Format
Standard Response Structure
{
'success': true,
'data': { ... },
'message': 'Operation completed successfully',
'error': ''
}
Error Response Structure
{
'success': false,
'error': 'Error description',
'message': 'User-friendly error message'
}
Example Usage
Create a Filesystem
curl -X POST http://localhost:8080/api/fs \
-H 'Content-Type: application/json'
Create a Directory
curl -X POST http://localhost:8080/api/dirs \
-H 'Content-Type: application/json'
Find Files
curl -X POST http://localhost:8080/api/tools/find \
-H 'Content-Type: application/json'
Import File
curl -X POST http://localhost:8080/api/tools/import/file \
-H 'Content-Type: application/json'
HTTP Status Codes
200 OK
- Successful operation201 Created
- Resource created successfully400 Bad Request
- Invalid request format or parameters404 Not Found
- Resource not found500 Internal Server Error
- Server error
CORS Support
The server supports CORS for frontend integration. Configure allowed origins when creating the server:
mut server := herofs_server.new(
cors_enabled: true
allowed_origins: ['http://localhost:3000', 'https://myapp.com']
)!
Error Handling
The API provides comprehensive error handling with:
- Input validation for all parameters
- Proper HTTP status codes
- Detailed error messages
- Consistent error response format
Integration with HeroFS
The server integrates seamlessly with the HeroFS module, providing:
- Full access to all HeroFS functionality
- Proper factory pattern usage
- Data integrity through BLAKE3 hashing
- Efficient Redis-based storage
- Complete filesystem operations
Production Deployment
For production use:
- Configure appropriate CORS origins
- Set up proper logging
- Configure Redis connection
- Set appropriate quotas and limits
- Monitor server performance
The server is designed to be production-ready with proper error handling, validation, and performance considerations.
fn error_response #
fn error_response(error string, message string) ErrorResponse
Helper function to create error response
fn new #
fn new(args NewFSServerArgs) !&FSServer
Create a new filesystem server
fn start_test_server #
fn start_test_server(port int) !string
Start server on a specific port and return the base URL
fn success_response #
fn success_response[T](data T, message string) APIResponse[T]
Helper function to create success response
struct APIResponse #
struct APIResponse[T] {
pub:
success bool
data T
message string
error string
}
Standard API response structure
struct Context #
struct Context {
veb.Context
}
Context struct for VEB
fn (Context) created #
fn (mut ctx Context) created[T](data T, message string) veb.Result
fn (Context) not_found #
fn (mut ctx Context) not_found(message ...string) veb.Result
fn (Context) request_error #
fn (mut ctx Context) request_error(message string) veb.Result
fn (Context) server_error #
fn (mut ctx Context) server_error(message string) veb.Result
fn (Context) success #
fn (mut ctx Context) success[T](data T, message string) veb.Result
Context extension methods for common HTTP responses
struct ErrorResponse #
struct ErrorResponse {
pub:
success bool
error string
message string
}
Error response structure
struct FSServer #
struct FSServer {
veb.Controller
pub mut:
fs_factory herofs.FsFactory
port int
host string
cors_enabled bool
allowed_origins []string
}
FSServer is the main server struct
fn (FSServer) add_file_to_directory #
fn (mut server FSServer) add_file_to_directory(mut ctx Context, id string) veb.Result
Add file to directory
fn (FSServer) add_filesystem_to_blob_membership #
fn (mut server FSServer) add_filesystem_to_blob_membership(mut ctx Context, hash string) veb.Result
Add filesystem to blob membership
fn (FSServer) api_info #
fn (mut server FSServer) api_info(mut ctx Context) veb.Result
API info endpoint
fn (FSServer) before_request #
fn (mut server FSServer) before_request(mut ctx Context)
Global error handler
fn (FSServer) blob_exists_by_hash #
fn (mut server FSServer) blob_exists_by_hash(mut ctx Context, hash string) veb.Result
Check if blob exists by hash
fn (FSServer) check_filesystem_quota #
fn (mut server FSServer) check_filesystem_quota(mut ctx Context, id string) veb.Result
Check filesystem quota
fn (FSServer) check_symlink_broken #
fn (mut server FSServer) check_symlink_broken(mut ctx Context, id string) veb.Result
Check if symlink is broken
fn (FSServer) copy_files #
fn (mut server FSServer) copy_files(mut ctx Context) veb.Result
Copy files or directories
fn (FSServer) cors_preflight #
fn (mut server FSServer) cors_preflight(mut ctx Context, path string) veb.Result
CORS preflight handler
fn (FSServer) create_blob #
fn (mut server FSServer) create_blob(mut ctx Context) veb.Result
Create new blob
fn (FSServer) create_blob_membership #
fn (mut server FSServer) create_blob_membership(mut ctx Context) veb.Result
Create new blob membership
fn (FSServer) create_directory #
fn (mut server FSServer) create_directory(mut ctx Context) veb.Result
Create new directory
fn (FSServer) create_directory_path #
fn (mut server FSServer) create_directory_path(mut ctx Context) veb.Result
Create directory path
fn (FSServer) create_file #
fn (mut server FSServer) create_file(mut ctx Context) veb.Result
Create new file
fn (FSServer) create_filesystem #
fn (mut server FSServer) create_filesystem(mut ctx Context) veb.Result
Create new filesystem
fn (FSServer) create_symlink #
fn (mut server FSServer) create_symlink(mut ctx Context) veb.Result
Create new symlink
fn (FSServer) decrease_filesystem_usage #
fn (mut server FSServer) decrease_filesystem_usage(mut ctx Context, id string) veb.Result
Decrease filesystem usage
fn (FSServer) delete_blob #
fn (mut server FSServer) delete_blob(mut ctx Context, id string) veb.Result
Delete blob
fn (FSServer) delete_blob_membership #
fn (mut server FSServer) delete_blob_membership(mut ctx Context, hash string) veb.Result
Delete blob membership
fn (FSServer) delete_directory #
fn (mut server FSServer) delete_directory(mut ctx Context, id string) veb.Result
Delete directory
fn (FSServer) delete_file #
fn (mut server FSServer) delete_file(mut ctx Context, id string) veb.Result
Delete file
fn (FSServer) delete_filesystem #
fn (mut server FSServer) delete_filesystem(mut ctx Context, id string) veb.Result
Delete filesystem
fn (FSServer) delete_symlink #
fn (mut server FSServer) delete_symlink(mut ctx Context, id string) veb.Result
Delete symlink
fn (FSServer) directory_has_children #
fn (mut server FSServer) directory_has_children(mut ctx Context, id string) veb.Result
Check if directory has children
fn (FSServer) export_directory #
fn (mut server FSServer) export_directory(mut ctx Context) veb.Result
Export directory to real filesystem
fn (FSServer) export_file #
fn (mut server FSServer) export_file(mut ctx Context) veb.Result
Export file to real filesystem
fn (FSServer) filesystem_exists #
fn (mut server FSServer) filesystem_exists(mut ctx Context, id string) veb.Result
Check if filesystem exists
fn (FSServer) find_files #
fn (mut server FSServer) find_files(mut ctx Context) veb.Result
Find files and directories
fn (FSServer) get_blob #
fn (mut server FSServer) get_blob(mut ctx Context, id string) veb.Result
Get blob by ID
fn (FSServer) get_blob_by_hash #
fn (mut server FSServer) get_blob_by_hash(mut ctx Context, hash string) veb.Result
Get blob by hash
fn (FSServer) get_blob_content #
fn (mut server FSServer) get_blob_content(mut ctx Context, id string) veb.Result
Get blob content (raw data)
fn (FSServer) get_blob_membership #
fn (mut server FSServer) get_blob_membership(mut ctx Context, hash string) veb.Result
Get blob membership by hash
fn (FSServer) get_directory #
fn (mut server FSServer) get_directory(mut ctx Context, id string) veb.Result
Get directory by ID
fn (FSServer) get_directory_children #
fn (mut server FSServer) get_directory_children(mut ctx Context, id string) veb.Result
Get directory children
fn (FSServer) get_file #
fn (mut server FSServer) get_file(mut ctx Context, id string) veb.Result
Get file by ID
fn (FSServer) get_file_by_path #
fn (mut server FSServer) get_file_by_path(mut ctx Context, dir_id string, name string) veb.Result
Get file by path
fn (FSServer) get_file_content #
fn (mut server FSServer) get_file_content(mut ctx Context, fs_id string) veb.Result
Get file content as text
fn (FSServer) get_filesystem #
fn (mut server FSServer) get_filesystem(mut ctx Context, id string) veb.Result
Get filesystem by ID
fn (FSServer) get_filesystem_by_name #
fn (mut server FSServer) get_filesystem_by_name(mut ctx Context, name string) veb.Result
Get filesystem by name
fn (FSServer) get_symlink #
fn (mut server FSServer) get_symlink(mut ctx Context, id string) veb.Result
Get symlink by ID
fn (FSServer) health_check #
fn (mut server FSServer) health_check(mut ctx Context) veb.Result
Health check endpoint
fn (FSServer) import_directory #
fn (mut server FSServer) import_directory(mut ctx Context) veb.Result
Import directory from real filesystem
fn (FSServer) import_file #
fn (mut server FSServer) import_file(mut ctx Context) veb.Result
Import file from real filesystem
fn (FSServer) increase_filesystem_usage #
fn (mut server FSServer) increase_filesystem_usage(mut ctx Context, id string) veb.Result
Increase filesystem usage
fn (FSServer) list_blob_memberships #
fn (mut server FSServer) list_blob_memberships(mut ctx Context) veb.Result
List all blob memberships
fn (FSServer) list_blobs #
fn (mut server FSServer) list_blobs(mut ctx Context) veb.Result
List all blobs
fn (FSServer) list_directories #
fn (mut server FSServer) list_directories(mut ctx Context) veb.Result
List all directories
fn (FSServer) list_directories_by_filesystem #
fn (mut server FSServer) list_directories_by_filesystem(mut ctx Context, fs_id string) veb.Result
List directories by filesystem
fn (FSServer) list_directory #
fn (mut server FSServer) list_directory(mut ctx Context) veb.Result
List directory contents
fn (FSServer) list_files #
fn (mut server FSServer) list_files(mut ctx Context) veb.Result
List all files
fn (FSServer) list_files_by_directory #
fn (mut server FSServer) list_files_by_directory(mut ctx Context, dir_id string) veb.Result
List files by directory
fn (FSServer) list_files_by_filesystem #
fn (mut server FSServer) list_files_by_filesystem(mut ctx Context, fs_id string) veb.Result
List files by filesystem
fn (FSServer) list_files_by_mime_type #
fn (mut server FSServer) list_files_by_mime_type(mut ctx Context, mime_type string) veb.Result
List files by MIME type
fn (FSServer) list_filesystems #
fn (mut server FSServer) list_filesystems(mut ctx Context) veb.Result
List all filesystems
fn (FSServer) list_symlinks #
fn (mut server FSServer) list_symlinks(mut ctx Context) veb.Result
List all symlinks
fn (FSServer) list_symlinks_by_filesystem #
fn (mut server FSServer) list_symlinks_by_filesystem(mut ctx Context, fs_id string) veb.Result
List symlinks by filesystem
fn (FSServer) middleware_error_handler #
fn (mut server FSServer) middleware_error_handler(mut ctx Context)
Error handling middleware
fn (FSServer) middleware_json_content_type #
fn (mut server FSServer) middleware_json_content_type(mut ctx Context)
Content type middleware for JSON APIs
fn (FSServer) middleware_log_request #
fn (mut server FSServer) middleware_log_request(mut ctx Context)
Request logging middleware
fn (FSServer) middleware_log_response #
fn (mut server FSServer) middleware_log_response(mut ctx Context)
Response logging middleware
fn (FSServer) middleware_validate_request #
fn (mut server FSServer) middleware_validate_request(mut ctx Context)
Request validation middleware
fn (FSServer) move_files #
fn (mut server FSServer) move_files(mut ctx Context) veb.Result
Move files or directories
fn (FSServer) remove_file_from_directory #
fn (mut server FSServer) remove_file_from_directory(mut ctx Context, id string) veb.Result
Remove file from directory
fn (FSServer) remove_files #
fn (mut server FSServer) remove_files(mut ctx Context) veb.Result
Remove files or directories
fn (FSServer) remove_filesystem_from_blob_membership #
fn (mut server FSServer) remove_filesystem_from_blob_membership(mut ctx Context, hash string) veb.Result
Remove filesystem from blob membership
fn (FSServer) start #
fn (mut server FSServer) start() !
fn (FSServer) symlink_is_broken #
fn (mut server FSServer) symlink_is_broken(mut ctx Context, id string) veb.Result
Check if symlink is broken
fn (FSServer) update_blob #
fn (mut server FSServer) update_blob(mut ctx Context, id string) veb.Result
Update blob
fn (FSServer) update_directory #
fn (mut server FSServer) update_directory(mut ctx Context, id string) veb.Result
Update directory
fn (FSServer) update_file #
fn (mut server FSServer) update_file(mut ctx Context, id string) veb.Result
Update file
fn (FSServer) update_file_accessed #
fn (mut server FSServer) update_file_accessed(mut ctx Context, id string) veb.Result
Update file accessed timestamp
fn (FSServer) update_file_metadata #
fn (mut server FSServer) update_file_metadata(mut ctx Context, id string) veb.Result
Update file metadata
fn (FSServer) update_filesystem #
fn (mut server FSServer) update_filesystem(mut ctx Context, id string) veb.Result
Update filesystem
fn (FSServer) update_symlink #
fn (mut server FSServer) update_symlink(mut ctx Context, id string) veb.Result
Update symlink
fn (FSServer) verify_blob_integrity #
fn (mut server FSServer) verify_blob_integrity(mut ctx Context, id string) veb.Result
Verify blob integrity
struct NewFSServerArgs #
struct NewFSServerArgs {
pub mut:
port int = 8080
host string = 'localhost'
cors_enabled bool = true
allowed_origins []string = ['*']
redis ?&redisclient.Redis
}
Factory args
- README
- fn error_response
- fn new
- fn start_test_server
- fn success_response
- struct APIResponse
- struct Context
- struct ErrorResponse
- struct FSServer
- fn add_file_to_directory
- fn add_filesystem_to_blob_membership
- fn api_info
- fn before_request
- fn blob_exists_by_hash
- fn check_filesystem_quota
- fn check_symlink_broken
- fn copy_files
- fn cors_preflight
- fn create_blob
- fn create_blob_membership
- fn create_directory
- fn create_directory_path
- fn create_file
- fn create_filesystem
- fn create_symlink
- fn decrease_filesystem_usage
- fn delete_blob
- fn delete_blob_membership
- fn delete_directory
- fn delete_file
- fn delete_filesystem
- fn delete_symlink
- fn directory_has_children
- fn export_directory
- fn export_file
- fn filesystem_exists
- fn find_files
- fn get_blob
- fn get_blob_by_hash
- fn get_blob_content
- fn get_blob_membership
- fn get_directory
- fn get_directory_children
- fn get_file
- fn get_file_by_path
- fn get_file_content
- fn get_filesystem
- fn get_filesystem_by_name
- fn get_symlink
- fn health_check
- fn import_directory
- fn import_file
- fn increase_filesystem_usage
- fn list_blob_memberships
- fn list_blobs
- fn list_directories
- fn list_directories_by_filesystem
- fn list_directory
- fn list_files
- fn list_files_by_directory
- fn list_files_by_filesystem
- fn list_files_by_mime_type
- fn list_filesystems
- fn list_symlinks
- fn list_symlinks_by_filesystem
- fn middleware_error_handler
- fn middleware_json_content_type
- fn middleware_log_request
- fn middleware_log_response
- fn middleware_validate_request
- fn move_files
- fn remove_file_from_directory
- fn remove_files
- fn remove_filesystem_from_blob_membership
- fn start
- fn symlink_is_broken
- fn update_blob
- fn update_directory
- fn update_file
- fn update_file_accessed
- fn update_file_metadata
- fn update_filesystem
- fn update_symlink
- fn verify_blob_integrity
- struct NewFSServerArgs