# Rust Template Project for Development with Actix-Web and SeaORM ## A lot of Thanks to these projects This project template is made of: - Rust - [actix-web](https://actix.rs): Async web framework for rust - [SeaORM](https://www.sea-ql.org/SeaORM/): async ORM for integrating a Rust code base with relational databases And I won't reach this without the help of: - sqlx - askama - clap - clap_complete - serde - env_logger - log ## Project strucutre - [src](src) - [main.rs](src/main.rs): entrypoint - [completion.rs](src/completion.rs): shell completion - [migrations](src/migrations): migration scripts - [web](src/web/): web apis - [urls.rs](src/web/urls.rs): routes - [model](src/web/model/): models generated by sea-orm-cli - [view.rs](src/web/view.rs): url handlers - [controller.rs](src/web/controller.rs): logics - [README](README.md) - [build](build): build tools - [scripts](scripts): automation scripts ## Start from here ### Run the server Simply use cargo to run the project ### Package into container The template provides a simple [Dockerfile](build/Dockerfile) and [script](scripts/build-container.sh) to build container image. ## Development ### Define a new model 1. Install sea-orm-cli first ``` cargo install sea-orm-cli ``` 2. Define migration in [migrations](src/migrations) ```rust #[derive(Iden)] pub enum User { // Identifiers for User table Table, // Table Identifier Id, // Id Column Identifier Name, // Name Column Identifier Password, // Password Column Identifier } impl MigrationName for Migration { fn name(&self) -> &str { "m20220804_000001_create_user_table" // A migration name `m$(date +%Y%m%d)_8digitno_desc` } } #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: & sea_orm_migration::SchemaManager) -> Result<(),sea_orm::DbErr> { manager.create_table( Table::create() .table(User::Table) // Table .col(ColumnDef::new(User::Id).integer().primary_key().auto_increment().not_null()) // And each col .col(ColumnDef::new(User::Name).string().unique_key().not_null()) .col(ColumnDef::new(User::Password).string().not_null()) .to_owned() ).await } async fn down(&self, manager: & sea_orm_migration::SchemaManager) -> Result<(),sea_orm::DbErr> { manager.drop_table(Table::drop().table(User::Table).to_owned()).await } } ``` 3. Add migration into migrator > TODO 4. Run migrator > TODO 5. Generate models > TODO ## Roadmap - [x] Web - [x] ORM - [x] Packaging - [ ] React