{"id":31542170,"url":"https://github.com/yelenasam/todoapp","last_synced_at":"2026-04-11T08:02:27.363Z","repository":{"id":295358355,"uuid":"989542256","full_name":"yelenasam/TodoApp","owner":"yelenasam","description":"TodoApp - Real-time Task Management (WPF + ASP.NET + SignalR)","archived":false,"fork":false,"pushed_at":"2025-08-03T09:26:45.000Z","size":967,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-07T20:47:21.482Z","etag":null,"topics":["asp-net-core","mssql","mvvm","rest-api","signalr","wpf"],"latest_commit_sha":null,"homepage":"","language":"C#","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/yelenasam.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,"zenodo":null}},"created_at":"2025-05-24T10:05:58.000Z","updated_at":"2025-08-26T17:37:41.000Z","dependencies_parsed_at":null,"dependency_job_id":"42ad7ca9-e31e-4ea8-b18c-d3181a1eaa2e","html_url":"https://github.com/yelenasam/TodoApp","commit_stats":null,"previous_names":["yelenasam/todoapp"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/yelenasam/TodoApp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yelenasam%2FTodoApp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yelenasam%2FTodoApp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yelenasam%2FTodoApp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yelenasam%2FTodoApp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yelenasam","download_url":"https://codeload.github.com/yelenasam/TodoApp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yelenasam%2FTodoApp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31673068,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T17:19:37.612Z","status":"online","status_checked_at":"2026-04-11T02:00:05.776Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["asp-net-core","mssql","mvvm","rest-api","signalr","wpf"],"created_at":"2025-10-04T11:31:48.232Z","updated_at":"2026-04-11T08:02:27.357Z","avatar_url":"https://github.com/yelenasam.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TodoApp – Real-Time Synchronized To-Do List\n\n\u003e **Tech stack:** WPF (.NET 8) • ASP.NET Core 8 Web API • SignalR • SQL Server • EF Core 8\n\n---\n\n## 1 · Architecture Overview\n\n### Use-Case Diagram\n![Use Cases](docs/img/usecase.png)\n\n### Logical Components\n![High-Level Design](docs/img/architecture.png)\n\n| Tier        | Technology                | Responsibility                                  |\n|-------------|---------------------------|-------------------------------------------------|\n| **Client**  | WPF + MVVM                | UI, state, commands                             |\n| **Server**  | ASP.NET Core API + SignalR| CRUD + real-time broadcast + business rules     |\n| **Data**    | SQL Server + EF Core 8    | Persistence, migrations, transactions           |\n\n---\n\n## 2 · Communication Protocol\n\n| Channel | reasoning |\n|---------|---------------------|\n| **HTTPS REST API** | Ideal for CRUD – stateless, cacheable, discoverable via Swagger / Postman. Can be secured later with cookies or bearer tokens. |\n| **SignalR (WebSocket)** | Real-time events: `TaskAdded`, `TaskUpdated`, `TaskDeleted`, `TaskLocked`, `TaskUnlocked`. \u003cbr\u003e Keeps every client in sync without polling, minimises traffic, auto-reconnects.\u003cbr\u003eHas built-in scalability, simplicity of use, and easy integration with .NET ecosystems. |\n\n---\n\n### Edit and Update Sequence Diagram\n![Sequences](docs/img/sequence.png)\n---\n\n### 2.1 · REST Endpoints\n\n| HTTP Verb | URL                                | Payload / Params        | Purpose                               |\n|-----------|------------------------------------|-------------------------|---------------------------------------|\n| **GET**   | `/api/tasks`                       | –                       | Retrieve all tasks                    |\n| **POST**  | `/api/tasks`                       | `TaskItem` JSON         | Add new task                          |\n| **PUT**   | `/api/tasks/{id}`                  | `TaskItem` JSON         | Update entire task                    |\n| **DELETE**| `/api/tasks/{id}`                  | `\"task id\"` (int)       | Delete task                           |\n| **POST**  | `/api/tasks/{id}/lock`             | `\"task id\"` (int)       | Lock task for editing                 |\n| **POST**  | `/api/tasks/{id}/unlock`           | `\"task id\"` (int)       | Unlock task                          |\n| **PUT**   | `/api/tasks/{id}/complete`         | `\"task id\"` (int), `iscompleted` JSON | Set completion state                  |\n| **GET**   | `/api/users`                       | –                       | List users (mock auth/demo)           |\n| **GET**   | `/api/tags`                        | –                       | List available tags                   |\n\n---\n\n## 3 · Design Patterns\n\n| Pattern | In Code | Benefit |\n|---------|---------|---------|\n| **MVVM** | `TasksViewModel`, etc. | Testable UI, clear separation, data binding. |\n| **Repository + Unit of Work** | `TaskItemsService` ⇢ `TodoDbContext` | Single gateway to DB; one atomic transaction per request. |\n| **Pub/Sub** | SignalR hub | Decoupled event distribution to all clients. |\n| **Singleton** | `ErrorHandler` | One global policy for logging \u0026 user feedback. |\n| **Dependency Injection** | Built-in DI, WPF ServiceCollection | Loose coupling, easy mocking. |\n| **Observer** | `INotifyPropertyChanged`, `ObservableCollection` | Automatic UI refresh when data changes. |\n\n---\n\n## 4 · Prerequisites\n\n* .NET 8 SDK  \n* SQL Server / Express / LocalDB  \n* Visual Studio 2022 (17.8+) or VS Code  \n* Git\n## 5. Setup\n\n### 5.1 Clone \u0026 prerequisites\n```bash\ngit clone https://github.com/yelenasam/TodoApp.git\ncd TodoApp\n```\n### 5.2 Trust the local HTTPS dev-certificate (one-time)\n```bash\ndotnet dev-certs https --trust\n```\n### 5.3 Create the database\n```bash\n# applies EF Core 8 migrations\ndotnet ef database update -p TodoApp.Server   \n```\n### 5.4 Run the back-end\n```bash\ndotnet run --project TodoApp.Server --launch-profile https\n# Now listening on:\n#   https://localhost:7186\n#   http://localhost:5097\n```\n\u003e Open https://localhost:7186/swagger to test the API.\n\n### 5.5 Run the WPF client in a second terminal\n```bash\ndotnet run --project TodoApp.Client\n```\n---\n\n## 6 TodoApp running:\n### 6.1. Login View:\n![LoginView](docs/img/LoginView.png)\n---\n\n### 6.2. Tasks View:\nThe Tasks view displays the all tasks table and selected or new task details.\n\u003cbe\u003eAll tasks that are locked by someone else will be colored in grey, and all the tasks locked by the user will be green.\n\n![TasksView](docs/img/TasksView.png)\n---\n\n### Selected task locked by someone else:\n![lockedByAnotherClient](docs/img/lockedByAnotherClient.png)\n---\n\n### Selected task locked by the user:\n![editing](docs/img/editing.png)\n---\n\n### Creating New Task:\n![newTask](docs/img/newTask.png)\n---\n\n### 6.3. Swagger:\n![swagger](docs/img/swagger.png)\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyelenasam%2Ftodoapp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyelenasam%2Ftodoapp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyelenasam%2Ftodoapp/lists"}