{"id":15180322,"url":"https://github.com/raofin/topictalks","last_synced_at":"2026-02-08T11:39:12.508Z","repository":{"id":221772076,"uuid":"753733867","full_name":"Raofin/TopicTalks","owner":"Raofin","description":"ASP.NET Core full-stack application - An educational discussion platform for students and teachers, featuring many beautiful features.","archived":false,"fork":false,"pushed_at":"2024-05-15T02:52:22.000Z","size":15102,"stargazers_count":3,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-13T00:17:32.052Z","etag":null,"topics":["asp-net-core-mvc","asp-net-core-web-api","bootstrap-5","clean-architecture","clean-code","discussion-platform","dotnet-8","entity-framework-core","full-stack-application","jquery","ms-sql-server","repository-pattern","rnd"],"latest_commit_sha":null,"homepage":"https://projects.rawfin.net/TopicTalks","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Raofin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2024-02-06T17:36:10.000Z","updated_at":"2025-01-08T15:42:04.000Z","dependencies_parsed_at":"2024-05-11T21:43:36.512Z","dependency_job_id":null,"html_url":"https://github.com/Raofin/TopicTalks","commit_stats":null,"previous_names":["raofin/osl","raofin/topictalks"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Raofin/TopicTalks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Raofin%2FTopicTalks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Raofin%2FTopicTalks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Raofin%2FTopicTalks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Raofin%2FTopicTalks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Raofin","download_url":"https://codeload.github.com/Raofin/TopicTalks/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Raofin%2FTopicTalks/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267961973,"owners_count":24172534,"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","status":"online","status_checked_at":"2025-07-30T02:00:09.044Z","response_time":70,"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-mvc","asp-net-core-web-api","bootstrap-5","clean-architecture","clean-code","discussion-platform","dotnet-8","entity-framework-core","full-stack-application","jquery","ms-sql-server","repository-pattern","rnd"],"created_at":"2024-09-27T16:03:23.611Z","updated_at":"2026-02-08T11:39:12.446Z","avatar_url":"https://github.com/Raofin.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align= \"center\"\u003e\n    \u003cimg src=\"src\\TopicTalks.Web\\wwwroot\\img\\logo.svg\" title=\"TopicTalks Logo\" alt=\"TopicTalks Logo\" width=\"500px\"\u003e\n    \u003cbr/\u003e\n    Talk about it. Learn about it.\n\u003c/p\u003e\n\n## 🔴 Live Demo\n\n- **Web:** https://projects.rawfin.net/TopicTalks\n- **Api:** https://projects.rawfin.net/TopicTalks/api\n\n## 📚 Table of Contents\n\n- 💎 [Features](#-features)\n- 🚀 [How to Run](#-how-to-run)\n  - I. 📝 [Requirements](#i-requirements-)\n  - II. ⚙️ [Installation](#ii-installation-%EF%B8%8F)\n    - [Clone the Repository](#1-clone-the-repository)\n    - [Database Migration](#2-database-migration)\n    - [Configure Email Settings](#3-configure-email-settings-via-user-secrets-)\n    - [Setup Google Cloud API Credentials (Optional)️](#4-setup-google-cloud-api-credentials-optional-%EF%B8%8F)\n    - [Build the Projects](#5-build-the-projects)\n    - [Run the Projects](#6-run-the-projects-seperately)\n    - [Access the Projects](#7-access-the-projects-)\n- 🛠️ [Technologies and Design Patterns](#%EF%B8%8F-technologies-and-design-patterns)\n- 📦 [Nuget Packages](#-nuget-packages)\n- 📊 [ER Diagram](#-er-diagram)\n- 📸 [Screenshots](#-screenshots)\n- 🪪 [License](#-license)\n\n## ⭐ Give It a Star\n\nIf you find this project useful or interesting, please consider giving it a star. Thank you! 🤗\n\n[![GitHub stars](https://img.shields.io/github/stars/Raofin/TopicTalks?style=social)](https://github.com/Raofin/TopicTalks/stargazers)\n\n## 💎 Key Features\n\n- **Threaded Q\\\u0026A**: Ask questions, get answers, and engage in deep, organized discussions.\n- **Real-Time Alerts**: Stay updated with instant and email notifications on thread activity.\n- **PDF Export**: Download full discussions with user and question details for offline access.\n- **Excel Export**: Export user data in spreadsheet format.\n- **Secure Access**: Role-based authorization ensure a safe, controlled environment.\n- **Clean UI**: Modern, user-friendly design that’s intuitive and distraction-free.\n\n## 🚀 How to Run\n\n### I. Requirements 📝\n\n- [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) (or higher)\n- [Microsoft SQL Server](https://www.microsoft.com/en-us/sql-server/sql-server-downloads#:~:text=Download%20now-,Express,-SQL%20Server%202022)\n- [JetBrains Rider](https://www.jetbrains.com/community/education/#students) (edu), [Visual Studio](https://visualstudio.microsoft.com/vs/community), or [VS Code](https://code.visualstudio.com)\n\n### II. Installation ⚙️\n\n#### 1. Clone the Repository\n\n  ```powershell\n  git clone https://github.com/Raofin/TopicTalks\n  ```\n\n#### 2. Database Migration\n\nThe project is configured to automatically apply migrations with some seed data on its **first run**. To create a database with dummy data, including the beautiful [user portraits](assets/portraits) and question covers, execute the [TopicTalks.sql](src/TopicTalks.Infrastructure/Persistence/DatabaseScripts/TopicTalks.sql) script. You can manually apply migrations using the following commands:\n\n- For Package Manager 👇\n  ```powershell\n  Update-Database -Context AppDbContext -Project TopicTalks.Infrastructure -StartupProject TopicTalks.Api\n  ```\n- For CLI 👇\n  ```powershell\n  dotnet ef database update --project TopicTalks.Infrastructure/TopicTalks.Infrastructure.csproj --startup-project TopicTalks.Api/TopicTalks.Api.csproj\n  ```\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003e🌻 Useful Commands\u003c/b\u003e\u003c/summary\u003e\n\n```powershell\nAdd-Migration Init -Context AppDbContext -Project TopicTalks.Infrastructure -StartupProject TopicTalks.Api\n```\n\n```powershell\nRemove-Migration -Project TopicTalks.Infrastructure -StartupProject TopicTalks.Api -Force\n```\n\n```powershell\nUpdate-Database -Context AppDbContext -Project TopicTalks.Infrastructure -StartupProject TopicTalks.Api\n```\n\n```powershell\nUpdate-Database -Migration Init -Context AppDbContext -Project TopicTalks.Infrastructure -StartupProject TopicTalks.Api\n```\n\n\u003c/details\u003e\n\n#### 3. Configure Email Settings via User Secrets 📬\n\nTo use Gmail's smtp server, you will need to use an [app password](https://myaccount.google.com/apppasswords). Note that this requires having [2-step verification](https://myaccount.google.com/signinoptions/two-step-verification/enroll-welcome) enabled in your account.\n\nUse the following Commands to store the credentials in user secrets 👇\n\n```powershell\ndotnet user-secrets --project src/TopicTalks.Api set \"EmailSettings:Email\" \"you@gmail.com\"\ndotnet user-secrets --project src/TopicTalks.Api set \"EmailSettings:Password\" \"app-password\"\n```\n\n\u003e If your SQL server is running on a different port, set the [server and port](src/TopicTalks.Api/appsettings.json#L11-L17) as well accordingly.\n\n#### 4. Setup Google Cloud API Credentials (Optional) ☁️\n\n✅ Free forever.\u003cbr\u003e\n\nAfter researching free cloud storage options, Google Drive storage through Google Cloud seemed to be the best fit for this project. With the limited resources available on the internet for interacting with the Google Drive APIs, it took me a while to understand and [implement the functionalities](src/TopicTalks.Infrastructure/Services/Cloud/GoogleCloud.cs).\n\nHowever, in order for the project to run with full functionality, you'll need to have your own Google Drive API credentials inserted in the [GoogleCredentials.json](src/TopicTalks.Api/GoogleCredentials.json). \u003cb\u003eHere are the steps to follow to create a free Google Cloud project and get the credentials\u003c/b\u003e\n\n1. Create a project in the [Google Cloud Console](https://console.cloud.google.com/projectcreate)\n2. Enable [Google Drive API](https://console.cloud.google.com/apis/library/drive.googleapis.com) for the project\u003cbr\u003e\n   \u003cimg src=\"assets/google/1.png\" style=\"width: 35%\"\u003e\u003cbr\u003e\n3. Select `Create Credentials`\u003cbr\u003e\n   \u003cimg src=\"assets/google/2.png\" style=\"width: 35%\"\u003e\u003cbr\u003e\n4. Select `Application Data` -\u003e Click `Next`\u003cbr\u003e\n   \u003cimg src=\"assets/google/3.png\" style=\"width: 35%\"\u003e\u003cbr\u003e\n5. Fill out the details -\u003e Select `Owner` in Role -\u003e Click `Done`\u003cbr\u003e\n   \u003cimg src=\"assets/google/4.png\" style=\"width: 35%\"\u003e\u003cbr\u003e\n6. Go to [Service Accounts](https://console.cloud.google.com/iam-admin/serviceaccounts) -\u003e Select the newly created service account\n7. Select `Keys` -\u003e Click `Add Key` -\u003e Choose JSON -\u003e Click `Create`\u003cbr\u003e(The credentials `json` file should be automatically downloaded)\u003cbr\u003e\n   \u003cimg src=\"assets/google/5.png\" style=\"width: 35%\"\u003e\u003cbr\u003e\n8. Open the file and copy the value of `client_email`\n9. Go to [Google Drive](https://drive.google.com/drive) -\u003e Create a folder named `TopicTalks`\n10. Share the folder with the `client_email`\u003cbr\u003e\n    \u003cimg src=\"assets/google/6.png\" style=\"width: 35%\"\u003e\u003cbr\u003e\n    and **General Access** to `Anyone with the link` \u003cbr\u003e\n11. Finally, paste everything from the downloaded `json` file into [GoogleCredentials.json](src/TopicTalks.Api/GoogleCredentials.json)\n12. [Star this project](https://github.com/Raofin/TopicTalks)\n\n#### 5. Build the Projects\n\n```powershell\ncd TopicTalks/src\ndotnet build TopicTalks.Api/TopicTalks.Api.csproj\ndotnet build TopicTalks.Web/TopicTalks.Web.csproj\n\n```\n\n#### 6. Run the Projects (Seperately)\n\n```powershell\ndotnet run --project TopicTalks.Api/TopicTalks.Api.csproj --urls \"https://localhost:9998\"\n```\n\n```powershell\ndotnet run --project TopicTalks.Web/TopicTalks.Web.csproj --urls \"https://localhost:9999\"\n```\n\n\u003cp align= \"center\"\u003e\n  \u003cimg src=\"assets/18.jpg\" width=\"49%\"\u003e\n  \u003cimg src=\"assets/19.jpg\" width=\"49%\"\u003e\n\u003c/p\u003e\n\n#### 7. Access the Projects 🌐\n\n- API: https://localhost:9998\n- Web: https://localhost:9999\n\n## 🛠️ Technologies and Design Patterns\n\n### Frameworks 🔧\n\n- ASP.NET Core 8.0 Web API\n- ASP.NET Core 8.0 MVC\n- Entity Framework Core 8.0\n\n### Database 🛢\n\n- Microsoft SQL Server\n\n### Frontend Library 📑\n\n- jQuery\n- jQuery Validate\n- Bootstrap 5\n- Popper.js\n- Tippy.js\n- FontFace Observer\n\n### Architectural and Design Patterns 📐\n\n- Clean Architecture 🦾\n- Result Pattern\n- Database Code First Approach with Fluent API\n- Repository Pattern\n- Unit of Work (UoW)\n\n## 📦 Nuget Packages\n\n| Package Name                                                                   | Used to 👇                                                           |\n| ------------------------------------------------------------------------------ | -------------------------------------------------------------------- |\n| [Swashbuckle](https://www.nuget.org/packages/Swashbuckle.AspNetCore/)          | Generate API documentation from Web API controllers                  |\n| [ErrorOr](https://www.nuget.org/packages/ErrorOr)                              | Handle errors and return results efficiently                         |\n| [Serilog](https://www.nuget.org/packages/Serilog)                              | Log events in a very structured way                                  |\n| [FluentValidation](https://www.nuget.org/packages/FluentValidation.AspNetCore) | Apply server-side data validation rules                              |\n| [FluentEmail](https://www.nuget.org/packages/FluentEmail.Smtp)                 | Send emails using SMTP servers                                       |\n| [Google Apis](https://www.nuget.org/packages/Google.Apis.Drive.v3)             | Interact with cloud storage                                          |\n| [RazorTemplating](https://www.nuget.org/packages/Razor.Templating.Core)        | Render `.cshtml` files into `string`                                 |\n| [DinkToPdf](https://www.nuget.org/packages/DinkToPdf)                          | Generate beautiful PDFs from HTML                                    |\n| [ClosedXML](https://www.nuget.org/packages/ClosedXML)                          | Generate Excel (`.xlsx`) files                                       |\n| [WebOptimizer](https://www.nuget.org/packages/LigerShark.WebOptimizer.Core)    | Bundle and minify CSS \u0026 JavaScript files for faster loading          |\n| [WebMarkupMin](https://www.nuget.org/packages/WebMarkupMin.AspNetCore8)        | Minify MVC HTML content to reduce file size for improved performance |\n\n## 📊 ER Diagram\n\n\u003cimg src=\"assets/diagram.svg\" title=\"TopicTalks Logo\" alt=\"TopicTalks Logo\" width=\"1200\"\u003e\n\n## 📸 Screenshots\n\nView at 👉 [be.net/TopicTalks](https://www.be.net/gallery/195808869/TopicTalks)\n\n\u003cp align= \"center\"\u003e\n    \u003cimg src=\"assets/01.jpg\"\u003e\n    \u003cimg src=\"assets/02.jpg\"\u003e\n    \u003cimg src=\"assets/03.jpg\"\u003e\n    \u003cimg src=\"assets/04.jpg\"\u003e\n    \u003cimg src=\"assets/05.jpg\"\u003e\n    \u003cimg src=\"assets/06.jpg\"\u003e\n    \u003cimg src=\"assets/07.jpg\"\u003e\n    \u003cimg src=\"assets/08.jpg\"\u003e\n    \u003cimg src=\"assets/09.jpg\"\u003e\n    \u003cimg src=\"assets/10.jpg\"\u003e\n    \u003cimg src=\"assets/11.jpg\"\u003e\n    \u003cimg src=\"assets/12.jpg\"\u003e\n    \u003cimg src=\"assets/13.jpg\"\u003e\n    \u003cimg src=\"assets/14.jpg\"\u003e\n    \u003cimg src=\"assets/15.jpg\"\u003e\n    \u003cimg src=\"assets/16.jpg\"\u003e\n    \u003cimg src=\"assets/17.jpg\"\u003e\n\u003cp/\u003e\n\n## 🪪 License\n\nDistributed under the BSD 3-Clause License. See [LICENSE](LICENSE) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraofin%2Ftopictalks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fraofin%2Ftopictalks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraofin%2Ftopictalks/lists"}