{"id":16428523,"url":"https://github.com/buraksenyurt/tiny-board","last_synced_at":"2026-05-03T21:33:59.356Z","repository":{"id":173929039,"uuid":"651488715","full_name":"buraksenyurt/tiny-board","owner":"buraksenyurt","description":"Bu örnekte Rust, Actix, SeaORM ve Electron kullanılarak basit bir todo uygulaması geliştirmeye çalışıyoruz.","archived":false,"fork":false,"pushed_at":"2023-06-14T14:20:59.000Z","size":1731,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-07-20T03:38:01.699Z","etag":null,"topics":["actix-web","electron","rust","rust-la","sea-orm","self-learning","udemy-tutorial","vue"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/buraksenyurt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-06-09T10:50:27.000Z","updated_at":"2023-06-10T18:11:48.000Z","dependencies_parsed_at":"2023-07-13T09:00:25.129Z","dependency_job_id":null,"html_url":"https://github.com/buraksenyurt/tiny-board","commit_stats":null,"previous_names":["buraksenyurt/tiny-board"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/buraksenyurt/tiny-board","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Ftiny-board","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Ftiny-board/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Ftiny-board/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Ftiny-board/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/buraksenyurt","download_url":"https://codeload.github.com/buraksenyurt/tiny-board/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Ftiny-board/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266255244,"owners_count":23900098,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["actix-web","electron","rust","rust-la","sea-orm","self-learning","udemy-tutorial","vue"],"created_at":"2024-10-11T08:17:22.598Z","updated_at":"2026-05-03T21:33:53.901Z","avatar_url":"https://github.com/buraksenyurt.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tiny-Board\n\nBu örnekte amacım Rust, Actix, SeaORM ve Electron kullanılarak basit bir todo uygulaması geliştirmeye çalışmak. Örneği takip ettiğim [Udemy](https://www.udemy.com/course/build-a-todolist-with-actix-web-rust-and-electron-vue) kursundan esinlenerek geliştirmeye çalışıyorum.\n\n## Database\n\nÖrnekte PostgreSQL kullanılmakta. Ben her zamanki gibi docker imajını tercih edeceğim.\n\n```bash\nsudo docker run -p 5434:5432 --name tinyboard -e POSTGRES_PASSWORD=tiger -d postgres\n```\n\nBuna göre uygulamanın veritabanı bağlantısını da tutan .env dosyasında aşağıdaki tanımı kullanmamız yeterli olacak.\n\n```.env\nDATABASE_URL=postgres://localhost:5434/tiny-board?user=postgres\u0026password=tiger\n```\n\n## Rust Projesinin Oluşturulması\n\nİlk olarak rust projesini oluşturuyoruz.\n\n```bash\ncargo new tiny-board-api\ncd tiny-board-api\n\n# Gerekli küfeler(crates) yüklenir\n# Servis arayüzü ve CORS izinleri için Actix, \n# Ortam parametrelerini kullanabilmek için dotnev\n# loglama için env_logger ve log\n\ncargo add actix-web actix-cors dotenv serde_json env_logger log futures\n\n# ORM aracı olarak da SeaORM\n# ki örnekte postgresql kullanılıyor, asenkron çalışma zamanı içinse actix-runtime\ncargo add sea-orm -F sqlx-postgres,runtime-actix-native-tls,macros\n\n# ???\ncargo add async-std -F attributes,tokio1\n\n# json serileştirme desteği için standart serde\ncargo add serde -F derive\n\n# ???\ncargo add tracing-subscriber -F env-filter\n```\n\n_**Not:** cargo.toml dosyasına eklenen bazı crate'ler için feature bildirilmleri söz konusu. Bu, ilgili crate'in hangi özelliklerinin aktifleştirileceği anlamına gelir. Yani sadece ihtiyacımız olan özellikleri alıp gereksiz bağımlılıklarının indirilmemesini sağlar._\n\n## Migration İşlemleri\n\nPekçok ORM aracında olduğu gibi (diesel mesela) SeaORM için de migration işlerini kolaylaştıran bir tool var. Önce bunu sisteme yüklüyoruz.\n\n```bash\ncargo install sea-orm-cli\n\n# istemci aracı kurduktan sonra aşağıdaki komut çalıştırılır\nsea-orm-cli migrate init\n```\n\nBu işlem migration isimli bir klasörün oluşturulmasını sağlar. İçerisinde yine bir rust kütüphanesi yer alır. Tablo tanımlamalarını, göç planlarını burada ayarlarız. Bu tabii geliştirme ortamı için de bir bağımlılıktır bu nedenle cargo.toml'a aşağıdaki dependencies bildiriminin de eklenmesi gerekir.\n\n```toml\nmigration = { path = \"migration\" }\n\n[dependencies.sea-orm-migration]\nversion = \"^0\"\nfeatures = [\n    \"runtime-actix-native-tls\",\n    \"sqlx-postgres\"\n]\n```\n\nBundan sonra ilk migration planını hazırlayabiliriz. Örneğin workitem tablosunun oluşturulması söz konusu olabilir.\n\n```bash\nsea-orm-cli migrate generate create_workitem_table\n```\n\nOluşan dosyada tablo için gerekli alan bildirimleri yapıldıktan ve .env içeriği ayarlandıktan sonra migration klasörü altındayken cargo run ile planın yürütülmesi sağlanabilir.\n\n```bash\ncd migration\ncargo run\n```\n\nBen docker üzerinden başlattığım Postgresql örneğinde tiny-board isimli bir veritabanı oluşturmuştum. Dolayısıyla migration plan çalıştıktan sonra WorkItem tablosu burada üretildi. Ayrıca migration planlarına ait seaql_migrations isimli bir tablo da eklendi.\n\n![assets/db_state_01.png](assets/db_state_01.png)\n\n## Entity Oluşturma\n\nYukarıdaki işlemler bir migration planını işletip postgresql tarafında work_item isimli tablonun oluşturulmasını sağlamıştır. Yine sea-orm-cli aracını kullanarak bu tabloya karşılık gelecek entity veri yapısını da kolayca üretebiliriz. Proje ana klasörüne çıktıktan sonra aşağıdaki komutla ilerlenebilir.\n\n```bash\ncd ..\nsea-orm-cli generate entity -o src/entity\n```\n\nBu komut src/entity klasörü içerisinde work_item isimli veri yapısının oluşturulmasını sağlayacaktır. Elebette birden fazla tablo olması halinde her biri için birer entity modeli üretilir.\n\n## Servis Tarafı için Testler\n\nWeb API tarafı tamamlandıktan sonra CRUD operasyonlarını test edebiliriz. Bunun için Postman veya curl gibi araçlar kullanılabilir. Tabii işlemlere başlamadan önce docker container olarak kullandığımız postgresql örneğinin çalıştığından emin olmalıyız.\n\n**Yeni bir WorkItem eklemek için**\n\n```text\nAdres : 127.0.0.1:7000/workitems\nMetot : HTTP Post\nÖrnek İçerik : \n{\n    \"title\": \"Hafta sonu 10 Km koşu\",\n    \"summary\": \"Berlin maratonu öncesi hazırlıklar kapsamında yapılması planlanan koşudur.\",\n    \"business_value\": 100,\n    \"completed\": false\n}\n```\n\n![assets/api_request_01.png](assets/api_request_01.png)\n\n**Tüm WorkItem'ları listelemek için**\n\n```text\nAdres : 127.0.0.1:7000/workitems\nMetot : HTTP Get\n```\n\n![assets/api_request_02.png](assets/api_request_02.png)\n\n**Belli bir ID bilgisine sahip WorkItem'ı getirmek için**\n\n```text\nAdres : 127.0.0.1:7000/workitems/4\nMetot : HTTP Get\n```\n\n![assets/api_request_03.png](assets/api_request_03.png)\n\n**Bir ID bilgisine sahip WorkItem'ı güncellemek için**\n\n```text\nAdres : 127.0.0.1:7000/workitems/4\nMetot : HTTP Put\nÖrnek İçerik : \n{\n    \"title\": \"Rust X 5\",\n    \"summary\": \"5 Pomodore'luk Rust çalışması\",\n    \"business_value\": 250,\n    \"completed\": true\n}\n```\n\n![assets/api_request_04.png](assets/api_request_04.png)\n\n**Bir WorktItem'ı silmek için**\n\n```text\nAdres : 127.0.0.1:7000/workitems/3\nMetot : HTTP Delete\n```\n\n![assets/api_request_05.png](assets/api_request_05.png)\n\nBu arada tüm bu işlemler sırasında debug moda ait tüm logları da terminal penceresinden görebiliriz.\n\n![assets/api_request_runtime.png](assets/api_request_runtime.png)\n\n## Electron Projesinin Oluşturulması\n\nÖnyüz uygulamamız Vue tabanlı bir Electron projesi. Eğer sistemde npm yüklü ise projenin kendisini scaffold şablonunu kullanarak kolayca oluşturabiliriz.\n\n```bash\nnpm create @quick-start/electron\n```\n\nCLI tarafında sorulan soruları aşağıdaki gibi cevaplandırarak ilerleyebiliriz.\n\n![assets/electron_setup.png](assets/electron_setup.png)\n\nÖnyüz uygulamasının ihtiyaç duyacağı npm paketlerini de yüklemek gerekiyor. Bunun için proje klasöründe aşağıdaki komutu vermek yeterli olacaktır.\n\n```bash\ncd tiny-board-app\nnpm i\n```\n\nEğitimde [element-plus](https://element-plus.org/en-US/guide/installation.html) isimli bir bileşen seti kullanılmakta. Ayrıca rust ile yazılmış servis ile ilişim için axios paketi kullanılmakta. Bu paketleri yüklemek için aşağıdaki komutlarla ilerlenebilir.\n\n```bash\nnpm install element-plus --save\nnpm install axios vue-axios --save\n```\n\n## Çalışma Zamanı\n\nÖrnek uygulama Postgresql veritabanını kullanmakta ve o da docker container olarak servis edilmekte. Dolayısıyla sistemde ilgili container'ın çalışır olduğundan emin olmak lazım. Bunun haricinde backend taraf servisinin de çalışır olması gerekiyor. Sonrasında eğer geliştirme modunda ilerleyeceksek **npm run dev** komutunu kullanabiliriz. Bu komut ile Electron uygulaması çalıştırılacaktır. Ayrıca localhost:5137 adresinden bu electron uygulamasının tarayıcıda çalışan versiyonuna da geçiş yapabiliriz. Bu özellikle uygulama ile servis tarafı arasındaki haberleşmeleri monitör etmek için idealdir. Çalıştığım örnekte CORS ihlallerine takıldığımdan rust uygulamasında buna yönelik bir değişiklik yapmak durumunda kaldım. İşte çalışma zamanına ait birkaç ekran görüntüsü.\n\nUygulama ilk açıldığında;\n\n![assets/runtime_01.png](assets/runtime_01.png)\n\nÖrnek bir değişiklik yapıldıktan sonra;\n\n![assets/runtime_02.png](assets/runtime_02.png)\n\nYeni bir Work Item eklendiğinde;\n\n![assets/runtime_03.png](assets/runtime_03.png)\n\nBir Work Item silindiğinde;\n\n![assets/runtime_04.png](assets/runtime_04.png)\n\n![assets/runtime_05.png](assets/runtime_05.png)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fburaksenyurt%2Ftiny-board","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fburaksenyurt%2Ftiny-board","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fburaksenyurt%2Ftiny-board/lists"}