├── .github ├── Docs │ └── ProjectSpec.md └── workflows │ └── dotnetcore.yml ├── .gitignore ├── Application Structure.txt ├── CSInn.sln ├── Docs └── ProjectSpec.md ├── LICENSE ├── README.md ├── azure-pipelines.yml ├── src ├── CSInn.Application │ └── CSInn.Application.csproj ├── CSInn.Discord.Authentication │ └── CSInn.Discord.Authentication.csproj ├── CSInn.Domain.Repositories │ ├── CSInn.Domain.Repositories.csproj │ ├── ILessonsRepository.cs │ └── IRepository.cs ├── CSInn.Infrastructure.Repositories │ └── CSInn.Infrastructure.Repositories.csproj ├── CSInn.Models │ ├── CSInn.Models.csproj │ ├── Exceptions │ │ └── InvalidLessonException.cs │ └── Lesson.cs └── CSInn.UI │ ├── App.razor │ ├── CSInn.UI.csproj │ ├── Data │ ├── WeatherForecast.cs │ └── WeatherForecastService.cs │ ├── Pages │ ├── Counter.razor │ ├── Error.razor │ ├── FetchData.razor │ ├── Index.razor │ └── _Host.cshtml │ ├── Program.cs │ ├── Shared │ ├── MainLayout.razor │ └── NavMenu.razor │ ├── Startup.cs │ ├── _Imports.razor │ ├── appsettings.Development.json │ ├── appsettings.json │ └── wwwroot │ ├── css │ ├── bootstrap │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map │ ├── mainpage.css │ ├── open-iconic │ │ ├── FONT-LICENSE │ │ ├── ICON-LICENSE │ │ ├── README.md │ │ └── font │ │ │ ├── css │ │ │ └── open-iconic-bootstrap.min.css │ │ │ └── fonts │ │ │ ├── open-iconic.eot │ │ │ ├── open-iconic.otf │ │ │ ├── open-iconic.svg │ │ │ ├── open-iconic.ttf │ │ │ └── open-iconic.woff │ └── site.css │ ├── favicon.ico │ └── res │ └── csinnLogo.png └── tests ├── CSInn.Application.Tests └── CSInn.Application.Tests.csproj ├── CSInn.Discord.Authentication.Tests └── CSInn.Discord.Authentication.Tests.csproj ├── CSInn.Infrastructure.Repositories.Tests └── CSInn.Infrastructure.Repositories.Tests.csproj └── CSInn.UI.Tests ├── CSInn.UI.Tests.csproj └── ReadMe.txt /.github/Docs/ProjectSpec.md: -------------------------------------------------------------------------------- 1 | [![CINN](./ProjectSpecs_files/58613885-8dbf4e00-82bf-11e9-9f0c-6926bd2b660c.png)](https://github.com/csinn/CSInn) 2 | 3 |
4 | 5 | ## Navigation 6 | 7 | * [Project Source](https://github.com/csinn/CSInn) 8 | * [Project Workflow](https://github.com/csinn/CSInn/projects/1) 9 | 10 |
11 | 12 |
13 | 14 | ## Project Requirements 15 | 16 | ### Guest Specifications 17 | 18 | #### What should be included: 19 | 20 | 1. **Login-** logging in would be nothing else than getting info about user account (if user has a discord account and if he or she is a member of C# Inn). Successful login redirects user to home page. Unsuccessful login will suggest creating a discord account and / or becoming a member of C# Inn. 21 | 22 | 3. **View lesson material-** consists of a search bar for filtering and ordering lesson by name, category, rating, author, popularity. The content for lesson is made of a combination of: slides, video, description, raw recording, author, category tag, lesson length (time you will need to learn), views and rating (maybe). 23 | 24 | 5. **View code reviews (View PR, video) -** code review is at least 2 elements: link to repository and comments about it. Ideally, it would be nice to render the PR request which was done during code review and display changes like a different tool. 25 | 26 | 7. **View Community events calendar-** community events include: lesson, code review, challenges (range of dates), other events (game night, meetup, etc) 27 | 28 | 9. **View Feedback page-** all the good words about us community should be put publicly in the feedback. Author should be seen (?). Feedback page should have a playful look and should not be just a list of responses. It should support different rotations, sizes, fonts to illustrate the variety of members that we have. 29 | 30 | 11. **View Projects page-** should contain link to repository, author, description and comments (?) 31 | 32 | #### What could be included: 33 | 34 | 1. **Rate content-** from the search page (or from specific content view page) there should be a button to like content. Content likes count should be displayed with it. 35 | 36 | 3. **Comment on project-** by opening a specific project, there could be a forum like structure, where comments could be posted. It could be a comment about the project, request for join, insight, etc. 37 | 38 | 5. **Apply to be admin-** application to be admin works the same as for other things, but such member needs to qualify before this option is visible. They need to be a member for at least half a quarter of year, have talked at least weekly. On top of that, it needs to get approved by not one, but at least 3 other admins. Approval status will be visible in either case. 39 | 40 | 7. **See other members online-** just like discord, it might be a good idea to see other members online: their avatars, names, logging in time, status. A minimalistic version of this is to see a summary of logged, idle and total members. 41 | 42 | #### What won't be included: 43 | 44 | 1. Manage their discord account form our website- our website is not supposed to replace discord. Our goal is to supplement discord with this website. 45 | 46 | 3. Offer paid work- offering money for our services is against our way of thinking. Two 3rd parties can get in touch, however, we will not be responsible for the outcome and we will not support either of the two. We want to be accessible, we don’t seek for profit. 47 | 48 | * * * 49 | 50 | ### Member Specification 51 | 52 | #### What should be included: 53 | 54 | 1. **View Partners page-** page with related entities such as people (youtubers, twitcher.. ). Should contain link to partner, their name, description, type of contact (Discord, YouTube, twitch..) 55 | 56 | 3. **Request code review-** code review request should be done by flagging a range of datetime that suits you. Along with the code review user should provide link to public repository, short description about the project. Sent request has a pending status by default. 57 | 58 | 5. **Request lesson-** request will contain a name, short description, discord id of the requestor. A new request will have a default status pending, which can later be accepted or declined. 59 | 60 | 7. **Apply to become a mentor-** members can become mentors. By becoming a mentor you will have to provide your discord id, short motivational description, topics you are interested in mentoring. It will come with the status pending. You will need to have a talk with an admin to get your status approved and double checked in terms of your skill 61 | 62 | 9. **Add project to projects board-** other than the things described before, project submission will have a status: pending, declined, accepted. 63 | 64 | 11. **Subscribe to community events-** community events: lesson, code review, game night, meeting, challenge (date range) should contain a start time and end time. Ideally, they should be displayed in local time of the viewer. Subscribing to an event should be done from calendar view, just by clicking a day and selecting event (if there are more than one event) 65 | 66 | 13. **Be notified about subscribed events-** a day and an hour before and at the start of an event you will get a notification (to email, probably) that event is happening in that much time. 67 | 68 | 15. **Post on feedback page-** only verified members can post on the feedback page. After feedback has been posted, it will have the statuses: pending, closed, accepted. Accepted feedback is automatically composed on the feedback page. 69 | 70 | #### What would be nice to include: 71 | 72 | 1. **Flag self as ready to chat-** for the chatting requested by others, mentors can flag themselves as ready to answer the question or join a conversation. 73 | 74 | 3. **Join a requested chat-** mentors who flagged themselves as ready to converse should form a matchmaking relation with those who requested to chat. Chat should be private, secure and there will not be any history of it afterwards. 75 | 76 | 5. **Content review (to accept or decline posting review, add suggestions)-** as mentioned, content posted by mentors will have to be approved by at least two other mentors. Pending content will be a separate page. 77 | 78 | * * * 79 | 80 | ### Administrator Specification 81 | 82 | #### What should be included: 83 | 84 | 1. **Moderate content:** delete, archive, edit- administrator can do a full CRUD for content. 85 | 86 | 3. **Manage users (promote to mentor, ban, kick) -** admins can promote members to mentors and mentors to admins. For a member to become a mentor, they need to be approved by 2 other mentors or admins. For a mentor or member to be an admin, they need to be approved by 3 others admins. 87 | 88 | #### What could be included: 89 | 90 | 1. **Accept other admin applications-** within pending requests page admins can decline or accept a submission for admin position. 91 | 92 | 3. **View website analytics, member Flow, other stats-** maybe a direct reference to google analytics, maybe our own way of integrating it. In any case, a page with stats such as retention rate, member flow, graphic of demographics, messaging, content posting, request stats, event stats, etc. 93 | 94 | 5. **Answer question sent by guest or a member (from website)-** there could be a menu section for requests, where all the pending status would be visible. In this case that would be just a pending answer. 95 | 96 | #### What would be nice to be included: 97 | 98 | 1. Sync discord content with website- syncing content is a heavy task, which is risky to automate. Thus it should be done at will, rather than periodically. There would be a special page for managing content sync, with options to sync roles, channels, users. 99 | 100 |
-------------------------------------------------------------------------------- /.github/workflows/dotnetcore.yml: -------------------------------------------------------------------------------- 1 | name: .NET Core (ASP.NET/Blazor) 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ubuntu-latest 9 | 10 | steps: 11 | - uses: actions/checkout@v1 12 | - name: Setup .NET Core 13 | uses: actions/setup-dotnet@v1 14 | with: 15 | dotnet-version: 3.1.100 16 | - name: Build with dotnet 17 | run: dotnet build --configuration Release 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.suo 8 | *.user 9 | *.userosscache 10 | *.sln.docstates 11 | 12 | # User-specific files (MonoDevelop/Xamarin Studio) 13 | *.userprefs 14 | 15 | # Build results 16 | [Dd]ebug/ 17 | [Dd]ebugPublic/ 18 | [Rr]elease/ 19 | [Rr]eleases/ 20 | x64/ 21 | x86/ 22 | bld/ 23 | [Bb]in/ 24 | [Oo]bj/ 25 | [Ll]og/ 26 | 27 | # Visual Studio 2015/2017 cache/options directory 28 | .vs/ 29 | # Uncomment if you have tasks that create the project's static files in wwwroot 30 | #wwwroot/ 31 | 32 | # Visual Studio 2017 auto generated files 33 | Generated\ Files/ 34 | 35 | # MSTest test Results 36 | [Tt]est[Rr]esult*/ 37 | [Bb]uild[Ll]og.* 38 | 39 | # NUNIT 40 | *.VisualState.xml 41 | TestResult.xml 42 | 43 | # Build Results of an ATL Project 44 | [Dd]ebugPS/ 45 | [Rr]eleasePS/ 46 | dlldata.c 47 | 48 | # Benchmark Results 49 | BenchmarkDotNet.Artifacts/ 50 | 51 | # .NET Core 52 | project.lock.json 53 | project.fragment.lock.json 54 | artifacts/ 55 | **/Properties/launchSettings.json 56 | 57 | # StyleCop 58 | StyleCopReport.xml 59 | 60 | # Files built by Visual Studio 61 | *_i.c 62 | *_p.c 63 | *_i.h 64 | *.ilk 65 | *.meta 66 | *.obj 67 | *.iobj 68 | *.pch 69 | *.pdb 70 | *.ipdb 71 | *.pgc 72 | *.pgd 73 | *.rsp 74 | *.sbr 75 | *.tlb 76 | *.tli 77 | *.tlh 78 | *.tmp 79 | *.tmp_proj 80 | *.log 81 | *.vspscc 82 | *.vssscc 83 | .builds 84 | *.pidb 85 | *.svclog 86 | *.scc 87 | 88 | # Chutzpah Test files 89 | _Chutzpah* 90 | 91 | # Visual C++ cache files 92 | ipch/ 93 | *.aps 94 | *.ncb 95 | *.opendb 96 | *.opensdf 97 | *.sdf 98 | *.cachefile 99 | *.VC.db 100 | *.VC.VC.opendb 101 | 102 | # Visual Studio profiler 103 | *.psess 104 | *.vsp 105 | *.vspx 106 | *.sap 107 | 108 | # Visual Studio Trace Files 109 | *.e2e 110 | 111 | # TFS 2012 Local Workspace 112 | $tf/ 113 | 114 | # Guidance Automation Toolkit 115 | *.gpState 116 | 117 | # ReSharper is a .NET coding add-in 118 | _ReSharper*/ 119 | *.[Rr]e[Ss]harper 120 | *.DotSettings.user 121 | 122 | # JustCode is a .NET coding add-in 123 | .JustCode 124 | 125 | # TeamCity is a build add-in 126 | _TeamCity* 127 | 128 | # DotCover is a Code Coverage Tool 129 | *.dotCover 130 | 131 | # AxoCover is a Code Coverage Tool 132 | .axoCover/* 133 | !.axoCover/settings.json 134 | 135 | # Visual Studio code coverage results 136 | *.coverage 137 | *.coveragexml 138 | 139 | # NCrunch 140 | _NCrunch_* 141 | .*crunch*.local.xml 142 | nCrunchTemp_* 143 | 144 | # MightyMoose 145 | *.mm.* 146 | AutoTest.Net/ 147 | 148 | # Web workbench (sass) 149 | .sass-cache/ 150 | 151 | # Installshield output folder 152 | [Ee]xpress/ 153 | 154 | # DocProject is a documentation generator add-in 155 | DocProject/buildhelp/ 156 | DocProject/Help/*.HxT 157 | DocProject/Help/*.HxC 158 | DocProject/Help/*.hhc 159 | DocProject/Help/*.hhk 160 | DocProject/Help/*.hhp 161 | DocProject/Help/Html2 162 | DocProject/Help/html 163 | 164 | # Click-Once directory 165 | publish/ 166 | 167 | # Publish Web Output 168 | *.[Pp]ublish.xml 169 | *.azurePubxml 170 | # Note: Comment the next line if you want to checkin your web deploy settings, 171 | # but database connection strings (with potential passwords) will be unencrypted 172 | *.pubxml 173 | *.publishproj 174 | 175 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 176 | # checkin your Azure Web App publish settings, but sensitive information contained 177 | # in these scripts will be unencrypted 178 | PublishScripts/ 179 | 180 | # NuGet Packages 181 | *.nupkg 182 | # The packages folder can be ignored because of Package Restore 183 | **/[Pp]ackages/* 184 | # except build/, which is used as an MSBuild target. 185 | !**/[Pp]ackages/build/ 186 | # Uncomment if necessary however generally it will be regenerated when needed 187 | #!**/[Pp]ackages/repositories.config 188 | # NuGet v3's project.json files produces more ignorable files 189 | *.nuget.props 190 | *.nuget.targets 191 | 192 | # Microsoft Azure Build Output 193 | csx/ 194 | *.build.csdef 195 | 196 | # Microsoft Azure Emulator 197 | ecf/ 198 | rcf/ 199 | 200 | # Windows Store app package directories and files 201 | AppPackages/ 202 | BundleArtifacts/ 203 | Package.StoreAssociation.xml 204 | _pkginfo.txt 205 | *.appx 206 | 207 | # Visual Studio cache files 208 | # files ending in .cache can be ignored 209 | *.[Cc]ache 210 | # but keep track of directories ending in .cache 211 | !*.[Cc]ache/ 212 | 213 | # Others 214 | ClientBin/ 215 | ~$* 216 | *~ 217 | *.dbmdl 218 | *.dbproj.schemaview 219 | *.jfm 220 | *.pfx 221 | *.publishsettings 222 | orleans.codegen.cs 223 | 224 | # Including strong name files can present a security risk 225 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 226 | #*.snk 227 | 228 | # Since there are multiple workflows, uncomment next line to ignore bower_components 229 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 230 | #bower_components/ 231 | 232 | # RIA/Silverlight projects 233 | Generated_Code/ 234 | 235 | # Backup & report files from converting an old project file 236 | # to a newer Visual Studio version. Backup files are not needed, 237 | # because we have git ;-) 238 | _UpgradeReport_Files/ 239 | Backup*/ 240 | UpgradeLog*.XML 241 | UpgradeLog*.htm 242 | ServiceFabricBackup/ 243 | *.rptproj.bak 244 | 245 | # SQL Server files 246 | *.mdf 247 | *.ldf 248 | *.ndf 249 | 250 | # Business Intelligence projects 251 | *.rdl.data 252 | *.bim.layout 253 | *.bim_*.settings 254 | *.rptproj.rsuser 255 | 256 | # Microsoft Fakes 257 | FakesAssemblies/ 258 | 259 | # GhostDoc plugin setting file 260 | *.GhostDoc.xml 261 | 262 | # Node.js Tools for Visual Studio 263 | .ntvs_analysis.dat 264 | node_modules/ 265 | 266 | # Visual Studio 6 build log 267 | *.plg 268 | 269 | # Visual Studio 6 workspace options file 270 | *.opt 271 | 272 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 273 | *.vbw 274 | 275 | # Visual Studio LightSwitch build output 276 | **/*.HTMLClient/GeneratedArtifacts 277 | **/*.DesktopClient/GeneratedArtifacts 278 | **/*.DesktopClient/ModelManifest.xml 279 | **/*.Server/GeneratedArtifacts 280 | **/*.Server/ModelManifest.xml 281 | _Pvt_Extensions 282 | 283 | # Paket dependency manager 284 | .paket/paket.exe 285 | paket-files/ 286 | 287 | # FAKE - F# Make 288 | .fake/ 289 | 290 | # JetBrains Rider 291 | .idea/ 292 | *.sln.iml 293 | 294 | # CodeRush 295 | .cr/ 296 | 297 | # Python Tools for Visual Studio (PTVS) 298 | __pycache__/ 299 | *.pyc 300 | 301 | # Cake - Uncomment if you are using it 302 | # tools/** 303 | # !tools/packages.config 304 | 305 | # Tabs Studio 306 | *.tss 307 | 308 | # Telerik's JustMock configuration file 309 | *.jmconfig 310 | 311 | # BizTalk build output 312 | *.btp.cs 313 | *.btm.cs 314 | *.odx.cs 315 | *.xsd.cs 316 | 317 | # OpenCover UI analysis results 318 | OpenCover/ 319 | 320 | # Azure Stream Analytics local run output 321 | ASALocalRun/ 322 | 323 | # MSBuild Binary and Structured Log 324 | *.binlog 325 | 326 | # NVidia Nsight GPU debugger configuration file 327 | *.nvuser 328 | 329 | # MFractors (Xamarin productivity tool) working folder 330 | .mfractor/ 331 | /src/CSInn.UI/Pages/LessonSearch.cshtml.cs 332 | /src/CSInn.UI/Pages/LessonSearch.cshtml 333 | /src/CSInn.UI/Pages/LessonView.cshtml 334 | /src/CSInn.UI/Pages/LessonView.cshtml.cs 335 | -------------------------------------------------------------------------------- /Application Structure.txt: -------------------------------------------------------------------------------- 1 | Foot note entirely here for how the actual file layout 2 | will be for the entire solution. I will personally put what 3 | the general layout is and hopefully get a feedback of where 4 | things in general like databases will go to properly insert 5 | intended items for functionality. 6 | 7 | Things needed: 8 | -Controller 9 | -Database 10 | -Database Context 11 | -Possible additional file structures within the seperate projects??? 12 | 13 | Possible Ways to see denote what we might want in this structure? 14 | 15 | [X] = Needs to be deleted 16 | [O] = Needs to be added 17 | [E] = Needs to be edited 18 | [T] = Needs to be tested 19 | 20 | (CSFILE) = C# Code File 21 | (JSON) = Java Script Notation File 22 | (CSHTML) = C# Html File. Mainly handles html, with some c# embedded 23 | (Razor) 24 | 25 | 26 | ******* Solution Structure ******* 27 | 28 | [1]Solution CSINN 29 | (folder) Solution Items 30 | (txt)Application Structure 31 | ------------------------ 32 | (folder) SRC 33 | (project) CSInn.Application 34 | -Dependencies 35 | *Projects 36 | -(project)CSInn.Domain.Repositories 37 | ************************** 38 | (project) CSInn.Discord.Authentication 39 | -Dependencies 40 | *SDK 41 | ************************** 42 | (Project) CSInn.Domain.Repositories 43 | -Depndencies 44 | *Projects 45 | -(project)CSInn.Models 46 | *SDK 47 | (CSFILE) ILessonRepository 48 | (CSFILE) IRepository 49 | ************************** 50 | (Project) CSInn.Infrastructure.Rrepositories 51 | -Dependencies 52 | *Projects 53 | -(Project) CSInn.Domain.Repositories 54 | *SDK 55 | ************************** 56 | (Project) CSInn.Models 57 | -Dependencies 58 | *SDK 59 | (Folder) Exceptions 60 | -(CSFILE) InvalidLessionException 61 | (CSFile) Lesson 62 | ************************** 63 | (Project) CSInn.UI 64 | *Connected Services 65 | *Dependencies 66 | -Analyzers 67 | -Frameworks 68 | *Properties 69 | -(JSON)LaunchSettings 70 | *wwwroot(Just for bootstraps, css files for now) 71 | 72 | (Folder) Data 73 | -(CSFILE) WeatherForecast 74 | -(CSFILE) WeatherForecastService 75 | 76 | (Folder) Pages 77 | -(CSHTML) _Host 78 | -(Razor) Couter 79 | -(Razor) Error 80 | -(Razor) FetchData 81 | -(Razor) Index 82 | -(CSHTML) LessonSearch 83 | *(CSFILE) LessonSearch.cshtml 84 | -(CSHTML) LessonView 85 | *(CSFILE) LessonView.cshtml 86 | 87 | (Folder) Shared 88 | -(Razor) Main Layout 89 | -(Razor) NavMenu 90 | 91 | (Razor) _Imports 92 | (Razor) App 93 | (JSON) appsettings 94 | (CSFILE) Program 95 | (CSFILE) Startup 96 | 97 | [2](Folder) tests [These just seem to correspond in dependencies with respective projects] 98 | 99 | (Test Solution) CSInn.Application.Tests 100 | 101 | (Test Solution) CSInn.Discord.Authentication.Tests 102 | 103 | (Test Solution) CSInn.Infrastructure.Repositories.Tests 104 | 105 | (Test Solution) CSInn.UI.Tests 106 | -ReadMe.Txt 107 | 108 | ******* Bracket Notes ******* 109 | [1]: Entire Solution structure for view. More or less for easier visual view? 110 | 111 | [2] Tests for the projects. As things are added more will have to be tested. -------------------------------------------------------------------------------- /CSInn.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.29306.81 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{186B0C3C-02E4-416C-9CD1-067E7662A53E}" 7 | EndProject 8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{399E33DB-3837-48F0-BFFA-B756D995BD2D}" 9 | EndProject 10 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CSInn.UI", "src\CSInn.UI\CSInn.UI.csproj", "{B6E0D216-88C8-4BA1-A71C-7C6BDB4247BB}" 11 | EndProject 12 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CSInn.Discord.Authentication", "src\CSInn.Discord.Authentication\CSInn.Discord.Authentication.csproj", "{4BA8C0D8-A2CA-4E84-B018-644C2859F5A5}" 13 | EndProject 14 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CSInn.Application.Tests", "tests\CSInn.Application.Tests\CSInn.Application.Tests.csproj", "{B92834CE-81D2-4E82-86CA-4940CFB8A102}" 15 | EndProject 16 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CSInn.Domain.Repositories", "src\CSInn.Domain.Repositories\CSInn.Domain.Repositories.csproj", "{C0BCA68B-7CD7-4037-8DEF-3C1DFA0FFA64}" 17 | EndProject 18 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CSInn.Infrastructure.Repositories", "src\CSInn.Infrastructure.Repositories\CSInn.Infrastructure.Repositories.csproj", "{68360ABC-FFEC-4A14-94EC-DCA6B96C044E}" 19 | EndProject 20 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CSInn.Application", "src\CSInn.Application\CSInn.Application.csproj", "{9FC69081-2A6A-4990-ACC3-4D1A1D08AA73}" 21 | EndProject 22 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CSInn.Discord.Authentication.Tests", "tests\CSInn.Discord.Authentication.Tests\CSInn.Discord.Authentication.Tests.csproj", "{989E16D6-A255-4AC5-BAE1-3D78B38EE258}" 23 | EndProject 24 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CSInn.UI.Tests", "tests\CSInn.UI.Tests\CSInn.UI.Tests.csproj", "{2159A971-3858-48F0-99B4-6F40C4F50863}" 25 | EndProject 26 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CSInn.Infrastructure.Repositories.Tests", "tests\CSInn.Infrastructure.Repositories.Tests\CSInn.Infrastructure.Repositories.Tests.csproj", "{1B2CDA69-B45A-4F95-B5C9-7AC3F834A7B7}" 27 | EndProject 28 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CSInn.Models", "src\CSInn.Models\CSInn.Models.csproj", "{A4D369D6-4937-4BB4-8F90-89DBCADE1481}" 29 | EndProject 30 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B5F618A9-1866-46A2-BE84-A376650ABF71}" 31 | ProjectSection(SolutionItems) = preProject 32 | Application Structure.txt = Application Structure.txt 33 | EndProjectSection 34 | EndProject 35 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{64B27306-8169-42BA-97CE-6436C9969359}" 36 | ProjectSection(SolutionItems) = preProject 37 | ..\ProjectSpec.md = ..\ProjectSpec.md 38 | EndProjectSection 39 | EndProject 40 | Global 41 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 42 | Debug|Any CPU = Debug|Any CPU 43 | Release|Any CPU = Release|Any CPU 44 | EndGlobalSection 45 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 46 | {B6E0D216-88C8-4BA1-A71C-7C6BDB4247BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 47 | {B6E0D216-88C8-4BA1-A71C-7C6BDB4247BB}.Debug|Any CPU.Build.0 = Debug|Any CPU 48 | {B6E0D216-88C8-4BA1-A71C-7C6BDB4247BB}.Release|Any CPU.ActiveCfg = Release|Any CPU 49 | {B6E0D216-88C8-4BA1-A71C-7C6BDB4247BB}.Release|Any CPU.Build.0 = Release|Any CPU 50 | {4BA8C0D8-A2CA-4E84-B018-644C2859F5A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 51 | {4BA8C0D8-A2CA-4E84-B018-644C2859F5A5}.Debug|Any CPU.Build.0 = Debug|Any CPU 52 | {4BA8C0D8-A2CA-4E84-B018-644C2859F5A5}.Release|Any CPU.ActiveCfg = Release|Any CPU 53 | {4BA8C0D8-A2CA-4E84-B018-644C2859F5A5}.Release|Any CPU.Build.0 = Release|Any CPU 54 | {B92834CE-81D2-4E82-86CA-4940CFB8A102}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 55 | {B92834CE-81D2-4E82-86CA-4940CFB8A102}.Debug|Any CPU.Build.0 = Debug|Any CPU 56 | {B92834CE-81D2-4E82-86CA-4940CFB8A102}.Release|Any CPU.ActiveCfg = Release|Any CPU 57 | {B92834CE-81D2-4E82-86CA-4940CFB8A102}.Release|Any CPU.Build.0 = Release|Any CPU 58 | {C0BCA68B-7CD7-4037-8DEF-3C1DFA0FFA64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 59 | {C0BCA68B-7CD7-4037-8DEF-3C1DFA0FFA64}.Debug|Any CPU.Build.0 = Debug|Any CPU 60 | {C0BCA68B-7CD7-4037-8DEF-3C1DFA0FFA64}.Release|Any CPU.ActiveCfg = Release|Any CPU 61 | {C0BCA68B-7CD7-4037-8DEF-3C1DFA0FFA64}.Release|Any CPU.Build.0 = Release|Any CPU 62 | {68360ABC-FFEC-4A14-94EC-DCA6B96C044E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 63 | {68360ABC-FFEC-4A14-94EC-DCA6B96C044E}.Debug|Any CPU.Build.0 = Debug|Any CPU 64 | {68360ABC-FFEC-4A14-94EC-DCA6B96C044E}.Release|Any CPU.ActiveCfg = Release|Any CPU 65 | {68360ABC-FFEC-4A14-94EC-DCA6B96C044E}.Release|Any CPU.Build.0 = Release|Any CPU 66 | {9FC69081-2A6A-4990-ACC3-4D1A1D08AA73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 67 | {9FC69081-2A6A-4990-ACC3-4D1A1D08AA73}.Debug|Any CPU.Build.0 = Debug|Any CPU 68 | {9FC69081-2A6A-4990-ACC3-4D1A1D08AA73}.Release|Any CPU.ActiveCfg = Release|Any CPU 69 | {9FC69081-2A6A-4990-ACC3-4D1A1D08AA73}.Release|Any CPU.Build.0 = Release|Any CPU 70 | {989E16D6-A255-4AC5-BAE1-3D78B38EE258}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 71 | {989E16D6-A255-4AC5-BAE1-3D78B38EE258}.Debug|Any CPU.Build.0 = Debug|Any CPU 72 | {989E16D6-A255-4AC5-BAE1-3D78B38EE258}.Release|Any CPU.ActiveCfg = Release|Any CPU 73 | {989E16D6-A255-4AC5-BAE1-3D78B38EE258}.Release|Any CPU.Build.0 = Release|Any CPU 74 | {2159A971-3858-48F0-99B4-6F40C4F50863}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 75 | {2159A971-3858-48F0-99B4-6F40C4F50863}.Debug|Any CPU.Build.0 = Debug|Any CPU 76 | {2159A971-3858-48F0-99B4-6F40C4F50863}.Release|Any CPU.ActiveCfg = Release|Any CPU 77 | {2159A971-3858-48F0-99B4-6F40C4F50863}.Release|Any CPU.Build.0 = Release|Any CPU 78 | {1B2CDA69-B45A-4F95-B5C9-7AC3F834A7B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 79 | {1B2CDA69-B45A-4F95-B5C9-7AC3F834A7B7}.Debug|Any CPU.Build.0 = Debug|Any CPU 80 | {1B2CDA69-B45A-4F95-B5C9-7AC3F834A7B7}.Release|Any CPU.ActiveCfg = Release|Any CPU 81 | {1B2CDA69-B45A-4F95-B5C9-7AC3F834A7B7}.Release|Any CPU.Build.0 = Release|Any CPU 82 | {A4D369D6-4937-4BB4-8F90-89DBCADE1481}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 83 | {A4D369D6-4937-4BB4-8F90-89DBCADE1481}.Debug|Any CPU.Build.0 = Debug|Any CPU 84 | {A4D369D6-4937-4BB4-8F90-89DBCADE1481}.Release|Any CPU.ActiveCfg = Release|Any CPU 85 | {A4D369D6-4937-4BB4-8F90-89DBCADE1481}.Release|Any CPU.Build.0 = Release|Any CPU 86 | EndGlobalSection 87 | GlobalSection(SolutionProperties) = preSolution 88 | HideSolutionNode = FALSE 89 | EndGlobalSection 90 | GlobalSection(NestedProjects) = preSolution 91 | {B6E0D216-88C8-4BA1-A71C-7C6BDB4247BB} = {186B0C3C-02E4-416C-9CD1-067E7662A53E} 92 | {4BA8C0D8-A2CA-4E84-B018-644C2859F5A5} = {186B0C3C-02E4-416C-9CD1-067E7662A53E} 93 | {B92834CE-81D2-4E82-86CA-4940CFB8A102} = {399E33DB-3837-48F0-BFFA-B756D995BD2D} 94 | {C0BCA68B-7CD7-4037-8DEF-3C1DFA0FFA64} = {186B0C3C-02E4-416C-9CD1-067E7662A53E} 95 | {68360ABC-FFEC-4A14-94EC-DCA6B96C044E} = {186B0C3C-02E4-416C-9CD1-067E7662A53E} 96 | {9FC69081-2A6A-4990-ACC3-4D1A1D08AA73} = {186B0C3C-02E4-416C-9CD1-067E7662A53E} 97 | {989E16D6-A255-4AC5-BAE1-3D78B38EE258} = {399E33DB-3837-48F0-BFFA-B756D995BD2D} 98 | {2159A971-3858-48F0-99B4-6F40C4F50863} = {399E33DB-3837-48F0-BFFA-B756D995BD2D} 99 | {1B2CDA69-B45A-4F95-B5C9-7AC3F834A7B7} = {399E33DB-3837-48F0-BFFA-B756D995BD2D} 100 | {A4D369D6-4937-4BB4-8F90-89DBCADE1481} = {186B0C3C-02E4-416C-9CD1-067E7662A53E} 101 | EndGlobalSection 102 | GlobalSection(ExtensibilityGlobals) = postSolution 103 | SolutionGuid = {6BBE2057-901B-474F-9140-0D045DF18046} 104 | EndGlobalSection 105 | EndGlobal 106 | -------------------------------------------------------------------------------- /Docs/ProjectSpec.md: -------------------------------------------------------------------------------- 1 | [![CINN](./ProjectSpecs_files/58613885-8dbf4e00-82bf-11e9-9f0c-6926bd2b660c.png)](https://github.com/csinn/CSInn) 2 | 3 |
4 | 5 | ## Navigation 6 | 7 | * [Project Source](https://github.com/csinn/CSInn) 8 | * [Project Workflow](https://github.com/csinn/CSInn/projects/1) 9 | 10 |
11 | 12 |
13 | 14 | ## Project Requirements 15 | 16 | ### Guest Specifications 17 | 18 | #### What should be included: 19 | 20 | 1. **Login-** logging in would be nothing else than getting info about user account (if user has a discord account and if he or she is a member of C# Inn). Successful login redirects user to home page. Unsuccessful login will suggest creating a discord account and / or becoming a member of C# Inn. 21 | 22 | 3. **View lesson material-** consists of a search bar for filtering and ordering lesson by name, category, rating, author, popularity. The content for lesson is made of a combination of: slides, video, description, raw recording, author, category tag, lesson length (time you will need to learn), views and rating (maybe). 23 | 24 | 5. **View code reviews (View PR, video) -** code review is at least 2 elements: link to repository and comments about it. Ideally, it would be nice to render the PR request which was done during code review and display changes like a different tool. 25 | 26 | 7. **View Community events calendar-** community events include: lesson, code review, challenges (range of dates), other events (game night, meetup, etc) 27 | 28 | 9. **View Feedback page-** all the good words about us community should be put publicly in the feedback. Author should be seen (?). Feedback page should have a playful look and should not be just a list of responses. It should support different rotations, sizes, fonts to illustrate the variety of members that we have. 29 | 30 | 11. **View Projects page-** should contain link to repository, author, description and comments (?) 31 | 32 | #### What could be included: 33 | 34 | 1. **Rate content-** from the search page (or from specific content view page) there should be a button to like content. Content likes count should be displayed with it. 35 | 36 | 3. **Comment on project-** by opening a specific project, there could be a forum like structure, where comments could be posted. It could be a comment about the project, request for join, insight, etc. 37 | 38 | 5. **Apply to be admin-** application to be admin works the same as for other things, but such member needs to qualify before this option is visible. They need to be a member for at least half a quarter of year, have talked at least weekly. On top of that, it needs to get approved by not one, but at least 3 other admins. Approval status will be visible in either case. 39 | 40 | 7. **See other members online-** just like discord, it might be a good idea to see other members online: their avatars, names, logging in time, status. A minimalistic version of this is to see a summary of logged, idle and total members. 41 | 42 | #### What won't be included: 43 | 44 | 1. Manage their discord account form our website- our website is not supposed to replace discord. Our goal is to supplement discord with this website. 45 | 46 | 3. Offer paid work- offering money for our services is against our way of thinking. Two 3rd parties can get in touch, however, we will not be responsible for the outcome and we will not support either of the two. We want to be accessible, we don’t seek for profit. 47 | 48 | * * * 49 | 50 | ### Member Specification 51 | 52 | #### What should be included: 53 | 54 | 1. **View Partners page-** page with related entities such as people (youtubers, twitcher.. ). Should contain link to partner, their name, description, type of contact (Discord, YouTube, twitch..) 55 | 56 | 3. **Request code review-** code review request should be done by flagging a range of datetime that suits you. Along with the code review user should provide link to public repository, short description about the project. Sent request has a pending status by default. 57 | 58 | 5. **Request lesson-** request will contain a name, short description, discord id of the requestor. A new request will have a default status pending, which can later be accepted or declined. 59 | 60 | 7. **Apply to become a mentor-** members can become mentors. By becoming a mentor you will have to provide your discord id, short motivational description, topics you are interested in mentoring. It will come with the status pending. You will need to have a talk with an admin to get your status approved and double checked in terms of your skill 61 | 62 | 9. **Add project to projects board-** other than the things described before, project submission will have a status: pending, declined, accepted. 63 | 64 | 11. **Subscribe to community events-** community events: lesson, code review, game night, meeting, challenge (date range) should contain a start time and end time. Ideally, they should be displayed in local time of the viewer. Subscribing to an event should be done from calendar view, just by clicking a day and selecting event (if there are more than one event) 65 | 66 | 13. **Be notified about subscribed events-** a day and an hour before and at the start of an event you will get a notification (to email, probably) that event is happening in that much time. 67 | 68 | 15. **Post on feedback page-** only verified members can post on the feedback page. After feedback has been posted, it will have the statuses: pending, closed, accepted. Accepted feedback is automatically composed on the feedback page. 69 | 70 | #### What would be nice to include: 71 | 72 | 1. **Flag self as ready to chat-** for the chatting requested by others, mentors can flag themselves as ready to answer the question or join a conversation. 73 | 74 | 3. **Join a requested chat-** mentors who flagged themselves as ready to converse should form a matchmaking relation with those who requested to chat. Chat should be private, secure and there will not be any history of it afterwards. 75 | 76 | 5. **Content review (to accept or decline posting review, add suggestions)-** as mentioned, content posted by mentors will have to be approved by at least two other mentors. Pending content will be a separate page. 77 | 78 | * * * 79 | 80 | ### Administrator Specification 81 | 82 | #### What should be included: 83 | 84 | 1. **Moderate content:** delete, archive, edit- administrator can do a full CRUD for content. 85 | 86 | 3. **Manage users (promote to mentor, ban, kick) -** admins can promote members to mentors and mentors to admins. For a member to become a mentor, they need to be approved by 2 other mentors or admins. For a mentor or member to be an admin, they need to be approved by 3 others admins. 87 | 88 | #### What could be included: 89 | 90 | 1. **Accept other admin applications-** within pending requests page admins can decline or accept a submission for admin position. 91 | 92 | 3. **View website analytics, member Flow, other stats-** maybe a direct reference to google analytics, maybe our own way of integrating it. In any case, a page with stats such as retention rate, member flow, graphic of demographics, messaging, content posting, request stats, event stats, etc. 93 | 94 | 5. **Answer question sent by guest or a member (from website)-** there could be a menu section for requests, where all the pending status would be visible. In this case that would be just a pending answer. 95 | 96 | #### What would be nice to be included: 97 | 98 | 1. Sync discord content with website- syncing content is a heavy task, which is risky to automate. Thus it should be done at will, rather than periodically. There would be a special page for managing content sync, with options to sync roles, channels, users. 99 | 100 |
-------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 CSInn Team and Contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CSInn 2 | 3 | ![CSInn logo](https://user-images.githubusercontent.com/40486932/58613885-8dbf4e00-82bf-11e9-9f0c-6926bd2b660c.png) 4 | 5 | [![Codacy Badge](https://api.codacy.com/project/badge/Grade/58c28c51e66d4168a3b31f0104d6cafb)](https://www.codacy.com/app/Almantask/CSInn?utm_source=github.com&utm_medium=referral&utm_content=csinn/CSInn&utm_campaign=Badge_Grade) 6 | 7 | The C# community website is built to introduce people to the C# Inn as it's a community specialising in C# where you can learn more about 8 | C#, object orienated programming and more. We also provide certain features such as: 9 | - Projects 10 | - Lessons taught by experienced developers/engineers 11 | - Code reviews 12 | - Questions that can be answered 13 | - Mentors 14 | 15 | And much more! 16 | 17 | # How to get started? 18 | [Link to how to get started](https://github.com/csinn/CSInn/wiki/How-to-get-started-working-on-the-project%3F) 19 | 20 | For full requirements refer to [specification](https://docs.google.com/document/d/1USzxRzPjm1Gs2aI3mVR4uFf0GjdWn55gD-u3ezwEjdI/edit#heading=h.bko0h4vmadol) for the project: 21 | 22 | For questions regarding project information, it'd be highly recommended to contact Kaisnel or any high ranking project member within the C# Inn [discord](https://discord.gg/rCMKcUU). 23 | 24 | --- 25 | This project is licensed under the MIT license. See the [license file](LICENSE) for more information. 26 | -------------------------------------------------------------------------------- /azure-pipelines.yml: -------------------------------------------------------------------------------- 1 | # ASP.NET Core (.NET Framework) 2 | # Build and test ASP.NET Core projects targeting the full .NET Framework. 3 | # Add steps that publish symbols, save build artifacts, and more: 4 | # https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core 5 | 6 | trigger: 7 | - master 8 | 9 | pool: 10 | vmImage: 'windows-latest' 11 | 12 | variables: 13 | solution: '**/*.sln' 14 | buildPlatform: 'Any CPU' 15 | buildConfiguration: 'Release' 16 | 17 | steps: 18 | - task: UseDotNet@2 19 | displayName: 'Use .NET Core sdk' 20 | inputs: 21 | packageType: sdk 22 | version: 3.x 23 | installationPath: $(Agent.ToolsDirectory)/dotnet 24 | 25 | - task: NuGetToolInstaller@1 26 | 27 | - task: NuGetCommand@2 28 | inputs: 29 | restoreSolution: '$(solution)' 30 | 31 | - task: MSBuild@1 32 | inputs: 33 | solution: '$(solution)' 34 | msbuildVersion: 'latest' 35 | platform: '$(buildPlatform)' 36 | configuration: '$(buildConfiguration)' 37 | 38 | - task: VSTest@2 39 | inputs: 40 | platform: '$(buildPlatform)' 41 | configuration: '$(buildConfiguration)' 42 | -------------------------------------------------------------------------------- /src/CSInn.Application/CSInn.Application.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | netstandard2.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/CSInn.Discord.Authentication/CSInn.Discord.Authentication.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netstandard2.0 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/CSInn.Domain.Repositories/CSInn.Domain.Repositories.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | netstandard2.0 5 | CSInn.Domain.Repositories 6 | CSInn.Domain.Repositories 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/CSInn.Domain.Repositories/ILessonsRepository.cs: -------------------------------------------------------------------------------- 1 | using CSInn.Domain.Models.Content; 2 | using System; 3 | using System.Collections.Generic; 4 | 5 | namespace CSInn.Domain.Repositories 6 | { 7 | public interface ILessonsRepository : IRepository 8 | { 9 | // TODO: Specification pattern so we can mix criterias. 10 | IEnumerable GetByTags(params string[] tags); 11 | IEnumerable GetByName(string name); 12 | IEnumerable GetByAuthors(params string[] authors); 13 | IEnumerable GetByDate(DateTime from, DateTime to); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/CSInn.Domain.Repositories/IRepository.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace CSInn.Domain.Repositories 6 | { 7 | public interface IRepository where TModel : class 8 | { 9 | void Create(TModel model); 10 | void Update(TModel model); 11 | void Delete(int key); 12 | IEnumerable Get(); 13 | TModel Get(int id); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/CSInn.Infrastructure.Repositories/CSInn.Infrastructure.Repositories.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | netcoreapp2.2 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/CSInn.Models/CSInn.Models.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | netstandard2.0 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/CSInn.Models/Exceptions/InvalidLessonException.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace CSInn.Domain.Models.Content.Exceptions 6 | { 7 | public class InvalidLessonException : Exception 8 | { 9 | public InvalidLessonException(bool isTitleEmpty, bool isDescriptionEmpty, bool areNoTags, bool areNoAuthors): 10 | base(BuildErrorMessage(isTitleEmpty, isDescriptionEmpty, areNoTags, areNoAuthors)) 11 | { 12 | 13 | } 14 | 15 | private static string BuildErrorMessage(bool isTitleEmpty, bool isDescriptionEmpty, bool areNoTags, bool areNoAuthors) 16 | { 17 | var missing = new List(); 18 | 19 | if (!isTitleEmpty) 20 | { 21 | missing.Add("title"); 22 | } 23 | 24 | if (!isDescriptionEmpty) 25 | { 26 | missing.Add("description"); 27 | } 28 | 29 | if (!areNoTags) 30 | { 31 | missing.Add("tags"); 32 | } 33 | 34 | if (!areNoAuthors) 35 | { 36 | missing.Add("authors"); 37 | } 38 | 39 | var error = $"Lesson is missing: {string.Join(",", missing)}"; 40 | 41 | return error; 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/CSInn.Models/Lesson.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * should we allow users to upload attachments that they may think help users in theirendeavor for learning? 3 | * 4 | * Example: User uploads a database for another user to use, or uploads code snippets/examples for users 5 | * to play with or understand the code? 6 | * 7 | */ 8 | 9 | 10 | 11 | using System; 12 | using System.Collections.Generic; 13 | using System.Linq; 14 | using System.Text; 15 | using CSInn.Domain.Models.Content.Exceptions; 16 | 17 | namespace CSInn.Domain.Models.Content 18 | { 19 | public class Lesson 20 | { 21 | public string Title { get; } 22 | public string Description { get; set; } 23 | public string Video { get; set; } 24 | public string Slides { get; set; } 25 | public IList Tags { get; set; } 26 | public IList Authors { get; } 27 | 28 | public Lesson(string title, string description, IEnumerable tags, IEnumerable authors) 29 | { 30 | Title = title; 31 | Description = description; 32 | Tags = tags?.ToList(); 33 | Authors = authors?.ToList(); 34 | 35 | var isTitleEmpty = string.IsNullOrEmpty(title); 36 | var isDescriptionEmpty = string.IsNullOrEmpty(description); 37 | var areNoTags = Tags == null || !Tags.Any(); 38 | var areNoAuthors = Authors == null || Authors.Any(); 39 | 40 | if (isTitleEmpty || isDescriptionEmpty || areNoTags || areNoAuthors) 41 | { 42 | throw new InvalidLessonException(isTitleEmpty, isDescriptionEmpty, areNoTags, areNoAuthors); 43 | } 44 | 45 | } 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/CSInn.UI/App.razor: -------------------------------------------------------------------------------- 1 | @using CSInn.UI.Shared 2 | 3 | 4 | 5 | 6 | 7 | 8 |

Sorry, there's nothing at this address.

9 |
10 |
11 |
12 | -------------------------------------------------------------------------------- /src/CSInn.UI/CSInn.UI.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | netcoreapp3.0 5 | preview 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/CSInn.UI/Data/WeatherForecast.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace CSInn.Data 4 | { 5 | public class WeatherForecast 6 | { 7 | public DateTime Date { get; set; } 8 | 9 | public int TemperatureC { get; set; } 10 | 11 | public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); 12 | 13 | public string Summary { get; set; } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/CSInn.UI/Data/WeatherForecastService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Threading.Tasks; 4 | 5 | namespace CSInn.Data 6 | { 7 | public class WeatherForecastService 8 | { 9 | private static readonly string[] Summaries = new[] 10 | { 11 | "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" 12 | }; 13 | 14 | public Task GetForecastAsync(DateTime startDate) 15 | { 16 | var rng = new Random(); 17 | return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast 18 | { 19 | Date = startDate.AddDays(index), 20 | TemperatureC = rng.Next(-20, 55), 21 | Summary = Summaries[rng.Next(Summaries.Length)] 22 | }).ToArray()); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/CSInn.UI/Pages/Counter.razor: -------------------------------------------------------------------------------- 1 | @page "/counter" 2 | 3 |

Counter

4 | 5 |

Current count: @currentCount

6 | 7 | 8 | 9 | @code { 10 | int currentCount = 0; 11 | 12 | void IncrementCount() 13 | { 14 | currentCount++; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/CSInn.UI/Pages/Error.razor: -------------------------------------------------------------------------------- 1 | @page "/error" 2 | 3 | 4 |

Error.

5 |

An error occurred while processing your request.

6 | 7 |

Development Mode

8 |

9 | Swapping to Development environment will display more detailed information about the error that occurred. 10 |

11 |

12 | The Development environment shouldn't be enabled for deployed applications. 13 | It can result in displaying sensitive information from exceptions to end users. 14 | For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development 15 | and restarting the app. 16 |

-------------------------------------------------------------------------------- /src/CSInn.UI/Pages/FetchData.razor: -------------------------------------------------------------------------------- 1 | @page "/fetchdata" 2 | 3 | @using CSInn.Data 4 | @inject WeatherForecastService ForecastService 5 | 6 |

Weather forecast

7 | 8 |

This component demonstrates fetching data from a service.

9 | 10 | @if (forecasts == null) 11 | { 12 |

Loading...

13 | } 14 | else 15 | { 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | @foreach (var forecast in forecasts) 27 | { 28 | 29 | 30 | 31 | 32 | 33 | 34 | } 35 | 36 |
DateTemp. (C)Temp. (F)Summary
@forecast.Date.ToShortDateString()@forecast.TemperatureC@forecast.TemperatureF@forecast.Summary
37 | } 38 | 39 | @code { 40 | WeatherForecast[] forecasts; 41 | 42 | protected override async Task OnInitializedAsync() 43 | { 44 | forecasts = await ForecastService.GetForecastAsync(DateTime.Now); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/CSInn.UI/Pages/Index.razor: -------------------------------------------------------------------------------- 1 | @page "/" 2 | 3 | 4 | 5 | 6 | 7 | C# Inn 8 | 9 | 10 | 13 | 19 | 26 | 27 |
28 | 29 |

Welcome to C# Inn!

30 |

31 | C# inn- a friendly discord community would like to invite you to join! We’re a young and growing community with over 2500 members, with dozens of new members joining daily. Our members help each other out and we try to keep as friendly atmosphere as possible. Your opinion matters to us, our staff listens to your needs and suggestions, so we’re constantly changing and trying to be a bit better than we were yesterday, by adding/removing channels, coming up with ideas, planning the future. As the name implies, we're mostly focused on C#. We have a lot of people who advocate profesionalism and we want not only to help you do stuff, but do it the right way. 32 |

33 | 34 |

Our goal

35 |

36 | We want to spread our passion of programming and C# to more people. We don't want to see people being discouraged by being stuck, left alone. We're here for each and everyone who wants to learn. We're here for those who want to help. Our dream is to create a community, where everyone would have fun learning to program, collaborate, feel free to ask any question. A sanctum for all kinds of programmers is what we aim to become. 37 | 38 |

39 | 40 | 41 | 42 |
43 | 44 | -------------------------------------------------------------------------------- /src/CSInn.UI/Pages/_Host.cshtml: -------------------------------------------------------------------------------- 1 | @page "/" 2 | @using CSInn.UI 3 | @namespace CSInn.Pages 4 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 5 | 6 | 7 | 8 | 9 | 10 | 11 | CSInn 12 | 13 | 14 | 15 | 16 | 17 | 18 | @(await Html.RenderComponentAsync(RenderMode.ServerPrerendered)) 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/CSInn.UI/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | using Microsoft.AspNetCore; 7 | using Microsoft.AspNetCore.Hosting; 8 | using Microsoft.Extensions.Configuration; 9 | using Microsoft.Extensions.Hosting; 10 | using Microsoft.Extensions.Logging; 11 | 12 | namespace CSInn 13 | { 14 | public class Program 15 | { 16 | public static void Main(string[] args) 17 | { 18 | CreateHostBuilder(args).Build().Run(); 19 | } 20 | 21 | public static IHostBuilder CreateHostBuilder(string[] args) => 22 | Host.CreateDefaultBuilder(args) 23 | .ConfigureWebHostDefaults(webBuilder => 24 | { 25 | webBuilder.UseStartup(); 26 | }); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/CSInn.UI/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits Microsoft.AspNetCore.Components.LayoutComponentBase 2 | 3 | 6 | 7 |
8 |
9 | About 10 |
11 | 12 |
13 | @Body 14 |
15 |
16 | -------------------------------------------------------------------------------- /src/CSInn.UI/Shared/NavMenu.razor: -------------------------------------------------------------------------------- 1 |  7 | 8 |
9 | 16 |
17 | 18 | @code { 19 | bool collapseNavMenu = true; 20 | 21 | string NavMenuCssClass => collapseNavMenu ? "collapse" : null; 22 | 23 | void ToggleNavMenu() 24 | { 25 | collapseNavMenu = !collapseNavMenu; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/CSInn.UI/Startup.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Builder; 6 | using Microsoft.AspNetCore.Components; 7 | using Microsoft.AspNetCore.Hosting; 8 | using Microsoft.AspNetCore.HttpsPolicy; 9 | using Microsoft.Extensions.Configuration; 10 | using Microsoft.Extensions.DependencyInjection; 11 | using Microsoft.Extensions.Hosting; 12 | using CSInn.Data; 13 | 14 | namespace CSInn 15 | { 16 | public class Startup 17 | { 18 | public Startup(IConfiguration configuration) 19 | { 20 | Configuration = configuration; 21 | } 22 | 23 | public IConfiguration Configuration { get; } 24 | 25 | // This method gets called by the runtime. Use this method to add services to the container. 26 | // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 27 | public void ConfigureServices(IServiceCollection services) 28 | { 29 | services.AddRazorPages(); 30 | services.AddServerSideBlazor(); 31 | services.AddSingleton(); 32 | } 33 | 34 | // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 35 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 36 | { 37 | if (env.IsDevelopment()) 38 | { 39 | app.UseDeveloperExceptionPage(); 40 | } 41 | else 42 | { 43 | app.UseExceptionHandler("/Error"); 44 | // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. 45 | app.UseHsts(); 46 | } 47 | 48 | app.UseHttpsRedirection(); 49 | app.UseStaticFiles(); 50 | 51 | app.UseRouting(); 52 | 53 | app.UseEndpoints(endpoints => 54 | { 55 | endpoints.MapBlazorHub(); 56 | endpoints.MapFallbackToPage("/_Host"); 57 | }); 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/CSInn.UI/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using Microsoft.AspNetCore.Authorization 3 | @using Microsoft.AspNetCore.Components.Authorization 4 | @using Microsoft.AspNetCore.Components.Forms 5 | @using Microsoft.AspNetCore.Components.Routing 6 | @using Microsoft.AspNetCore.Components.Web 7 | @using Microsoft.JSInterop 8 | @using CSInn.UI 9 | @using CSInn.UI.Shared 10 | @using CSInn.UI.Pages 11 | -------------------------------------------------------------------------------- /src/CSInn.UI/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/CSInn.UI/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft": "Warning", 6 | "Microsoft.Hosting.Lifetime": "Information" 7 | } 8 | }, 9 | "AllowedHosts": "*" 10 | } 11 | -------------------------------------------------------------------------------- /src/CSInn.UI/wwwroot/css/mainpage.css: -------------------------------------------------------------------------------- 1 | .MainContent { 2 | width:800px; 3 | margin-left:85px; 4 | text-align:center; 5 | } 6 | 7 | .mainpage-btn-div { 8 | background-color: blueviolet; 9 | background-clip: inherit; 10 | text-align: center; 11 | } 12 | 13 | .NavSpace { 14 | text-align: center; 15 | background-color: #4125da; 16 | } 17 | 18 | .NavSpace button { 19 | height: auto; 20 | display: inline-block; 21 | margin-left: 50px; 22 | margin-right: auto; 23 | padding: 0, 40px, 0, 20px; 24 | border: 0; 25 | background-color: blueviolet; 26 | background-clip:inherit; 27 | text-align:center; 28 | } 29 | 30 | /* 31 | C# Logo 32 | */ 33 | 34 | .mainpage-cslogo { 35 | display: block; 36 | margin-left: auto; 37 | margin-right: auto; 38 | width: 50%; 39 | padding-top: 80px; 40 | max-width: 500px; 41 | max-height: 500px; 42 | } 43 | 44 | /* 45 | Buttons 46 | */ 47 | 48 | .mainpage-btn { 49 | padding: 2px; 50 | font-family: 'Manjari', sans-serif; 51 | font-size: 16px; 52 | color: blanchedalmond; 53 | height: 25px; 54 | border: none; 55 | display: inline-block; 56 | background-color: blueviolet; 57 | } 58 | 59 | /* 60 | Text 61 | */ 62 | 63 | .mainpage-Header { 64 | margin-top: 25px; 65 | font-family: 'Roboto', sans-serif; 66 | } 67 | 68 | .mainpage-ContentBlock{ 69 | width:650px; 70 | padding-left: 175px; 71 | text-align:justify; 72 | font-size: 22px; 73 | font-family: '-apple-system', sans-serif; 74 | margin-right: 225px; 75 | display:inline-block; 76 | border-width:0; 77 | } 78 | -------------------------------------------------------------------------------- /src/CSInn.UI/wwwroot/css/open-iconic/FONT-LICENSE: -------------------------------------------------------------------------------- 1 | SIL OPEN FONT LICENSE Version 1.1 2 | 3 | Copyright (c) 2014 Waybury 4 | 5 | PREAMBLE 6 | The goals of the Open Font License (OFL) are to stimulate worldwide 7 | development of collaborative font projects, to support the font creation 8 | efforts of academic and linguistic communities, and to provide a free and 9 | open framework in which fonts may be shared and improved in partnership 10 | with others. 11 | 12 | The OFL allows the licensed fonts to be used, studied, modified and 13 | redistributed freely as long as they are not sold by themselves. The 14 | fonts, including any derivative works, can be bundled, embedded, 15 | redistributed and/or sold with any software provided that any reserved 16 | names are not used by derivative works. The fonts and derivatives, 17 | however, cannot be released under any other type of license. The 18 | requirement for fonts to remain under this license does not apply 19 | to any document created using the fonts or their derivatives. 20 | 21 | DEFINITIONS 22 | "Font Software" refers to the set of files released by the Copyright 23 | Holder(s) under this license and clearly marked as such. This may 24 | include source files, build scripts and documentation. 25 | 26 | "Reserved Font Name" refers to any names specified as such after the 27 | copyright statement(s). 28 | 29 | "Original Version" refers to the collection of Font Software components as 30 | distributed by the Copyright Holder(s). 31 | 32 | "Modified Version" refers to any derivative made by adding to, deleting, 33 | or substituting -- in part or in whole -- any of the components of the 34 | Original Version, by changing formats or by porting the Font Software to a 35 | new environment. 36 | 37 | "Author" refers to any designer, engineer, programmer, technical 38 | writer or other person who contributed to the Font Software. 39 | 40 | PERMISSION & CONDITIONS 41 | Permission is hereby granted, free of charge, to any person obtaining 42 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 43 | redistribute, and sell modified and unmodified copies of the Font 44 | Software, subject to the following conditions: 45 | 46 | 1) Neither the Font Software nor any of its individual components, 47 | in Original or Modified Versions, may be sold by itself. 48 | 49 | 2) Original or Modified Versions of the Font Software may be bundled, 50 | redistributed and/or sold with any software, provided that each copy 51 | contains the above copyright notice and this license. These can be 52 | included either as stand-alone text files, human-readable headers or 53 | in the appropriate machine-readable metadata fields within text or 54 | binary files as long as those fields can be easily viewed by the user. 55 | 56 | 3) No Modified Version of the Font Software may use the Reserved Font 57 | Name(s) unless explicit written permission is granted by the corresponding 58 | Copyright Holder. This restriction only applies to the primary font name as 59 | presented to the users. 60 | 61 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 62 | Software shall not be used to promote, endorse or advertise any 63 | Modified Version, except to acknowledge the contribution(s) of the 64 | Copyright Holder(s) and the Author(s) or with their explicit written 65 | permission. 66 | 67 | 5) The Font Software, modified or unmodified, in part or in whole, 68 | must be distributed entirely under this license, and must not be 69 | distributed under any other license. The requirement for fonts to 70 | remain under this license does not apply to any document created 71 | using the Font Software. 72 | 73 | TERMINATION 74 | This license becomes null and void if any of the above conditions are 75 | not met. 76 | 77 | DISCLAIMER 78 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 79 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 80 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 81 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 82 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 83 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 84 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 85 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 86 | OTHER DEALINGS IN THE FONT SOFTWARE. 87 | -------------------------------------------------------------------------------- /src/CSInn.UI/wwwroot/css/open-iconic/ICON-LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Waybury 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /src/CSInn.UI/wwwroot/css/open-iconic/README.md: -------------------------------------------------------------------------------- 1 | [Open Iconic v1.1.1](http://useiconic.com/open) 2 | =========== 3 | 4 | ### Open Iconic is the open source sibling of [Iconic](http://useiconic.com). It is a hyper-legible collection of 223 icons with a tiny footprint—ready to use with Bootstrap and Foundation. [View the collection](http://useiconic.com/open#icons) 5 | 6 | 7 | 8 | ## What's in Open Iconic? 9 | 10 | * 223 icons designed to be legible down to 8 pixels 11 | * Super-light SVG files - 61.8 for the entire set 12 | * SVG sprite—the modern replacement for icon fonts 13 | * Webfont (EOT, OTF, SVG, TTF, WOFF), PNG and WebP formats 14 | * Webfont stylesheets (including versions for Bootstrap and Foundation) in CSS, LESS, SCSS and Stylus formats 15 | * PNG and WebP raster images in 8px, 16px, 24px, 32px, 48px and 64px. 16 | 17 | 18 | ## Getting Started 19 | 20 | #### For code samples and everything else you need to get started with Open Iconic, check out our [Icons](http://useiconic.com/open#icons) and [Reference](http://useiconic.com/open#reference) sections. 21 | 22 | ### General Usage 23 | 24 | #### Using Open Iconic's SVGs 25 | 26 | We like SVGs and we think they're the way to display icons on the web. Since Open Iconic are just basic SVGs, we suggest you display them like you would any other image (don't forget the `alt` attribute). 27 | 28 | ``` 29 | icon name 30 | ``` 31 | 32 | #### Using Open Iconic's SVG Sprite 33 | 34 | Open Iconic also comes in a SVG sprite which allows you to display all the icons in the set with a single request. It's like an icon font, without being a hack. 35 | 36 | Adding an icon from an SVG sprite is a little different than what you're used to, but it's still a piece of cake. *Tip: To make your icons easily style able, we suggest adding a general class to the* `` *tag and a unique class name for each different icon in the* `` *tag.* 37 | 38 | ``` 39 | 40 | 41 | 42 | ``` 43 | 44 | Sizing icons only needs basic CSS. All the icons are in a square format, so just set the `` tag with equal width and height dimensions. 45 | 46 | ``` 47 | .icon { 48 | width: 16px; 49 | height: 16px; 50 | } 51 | ``` 52 | 53 | Coloring icons is even easier. All you need to do is set the `fill` rule on the `` tag. 54 | 55 | ``` 56 | .icon-account-login { 57 | fill: #f00; 58 | } 59 | ``` 60 | 61 | To learn more about SVG Sprites, read [Chris Coyier's guide](http://css-tricks.com/svg-sprites-use-better-icon-fonts/). 62 | 63 | #### Using Open Iconic's Icon Font... 64 | 65 | 66 | ##### …with Bootstrap 67 | 68 | You can find our Bootstrap stylesheets in `font/css/open-iconic-bootstrap.{css, less, scss, styl}` 69 | 70 | 71 | ``` 72 | 73 | ``` 74 | 75 | 76 | ``` 77 | 78 | ``` 79 | 80 | ##### …with Foundation 81 | 82 | You can find our Foundation stylesheets in `font/css/open-iconic-foundation.{css, less, scss, styl}` 83 | 84 | ``` 85 | 86 | ``` 87 | 88 | 89 | ``` 90 | 91 | ``` 92 | 93 | ##### …on its own 94 | 95 | You can find our default stylesheets in `font/css/open-iconic.{css, less, scss, styl}` 96 | 97 | ``` 98 | 99 | ``` 100 | 101 | ``` 102 | 103 | ``` 104 | 105 | 106 | ## License 107 | 108 | ### Icons 109 | 110 | All code (including SVG markup) is under the [MIT License](http://opensource.org/licenses/MIT). 111 | 112 | ### Fonts 113 | 114 | All fonts are under the [SIL Licensed](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web). 115 | -------------------------------------------------------------------------------- /src/CSInn.UI/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css: -------------------------------------------------------------------------------- 1 | @font-face{font-family:Icons;src:url(../fonts/open-iconic.eot);src:url(../fonts/open-iconic.eot?#iconic-sm) format('embedded-opentype'),url(../fonts/open-iconic.woff) format('woff'),url(../fonts/open-iconic.ttf) format('truetype'),url(../fonts/open-iconic.otf) format('opentype'),url(../fonts/open-iconic.svg#iconic-sm) format('svg');font-weight:400;font-style:normal}.oi{position:relative;top:1px;display:inline-block;speak:none;font-family:Icons;font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.oi:empty:before{width:1em;text-align:center;box-sizing:content-box}.oi.oi-align-center:before{text-align:center}.oi.oi-align-left:before{text-align:left}.oi.oi-align-right:before{text-align:right}.oi.oi-flip-horizontal:before{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.oi.oi-flip-vertical:before{-webkit-transform:scale(1,-1);-ms-transform:scale(-1,1);transform:scale(1,-1)}.oi.oi-flip-horizontal-vertical:before{-webkit-transform:scale(-1,-1);-ms-transform:scale(-1,1);transform:scale(-1,-1)}.oi-account-login:before{content:'\e000'}.oi-account-logout:before{content:'\e001'}.oi-action-redo:before{content:'\e002'}.oi-action-undo:before{content:'\e003'}.oi-align-center:before{content:'\e004'}.oi-align-left:before{content:'\e005'}.oi-align-right:before{content:'\e006'}.oi-aperture:before{content:'\e007'}.oi-arrow-bottom:before{content:'\e008'}.oi-arrow-circle-bottom:before{content:'\e009'}.oi-arrow-circle-left:before{content:'\e00a'}.oi-arrow-circle-right:before{content:'\e00b'}.oi-arrow-circle-top:before{content:'\e00c'}.oi-arrow-left:before{content:'\e00d'}.oi-arrow-right:before{content:'\e00e'}.oi-arrow-thick-bottom:before{content:'\e00f'}.oi-arrow-thick-left:before{content:'\e010'}.oi-arrow-thick-right:before{content:'\e011'}.oi-arrow-thick-top:before{content:'\e012'}.oi-arrow-top:before{content:'\e013'}.oi-audio-spectrum:before{content:'\e014'}.oi-audio:before{content:'\e015'}.oi-badge:before{content:'\e016'}.oi-ban:before{content:'\e017'}.oi-bar-chart:before{content:'\e018'}.oi-basket:before{content:'\e019'}.oi-battery-empty:before{content:'\e01a'}.oi-battery-full:before{content:'\e01b'}.oi-beaker:before{content:'\e01c'}.oi-bell:before{content:'\e01d'}.oi-bluetooth:before{content:'\e01e'}.oi-bold:before{content:'\e01f'}.oi-bolt:before{content:'\e020'}.oi-book:before{content:'\e021'}.oi-bookmark:before{content:'\e022'}.oi-box:before{content:'\e023'}.oi-briefcase:before{content:'\e024'}.oi-british-pound:before{content:'\e025'}.oi-browser:before{content:'\e026'}.oi-brush:before{content:'\e027'}.oi-bug:before{content:'\e028'}.oi-bullhorn:before{content:'\e029'}.oi-calculator:before{content:'\e02a'}.oi-calendar:before{content:'\e02b'}.oi-camera-slr:before{content:'\e02c'}.oi-caret-bottom:before{content:'\e02d'}.oi-caret-left:before{content:'\e02e'}.oi-caret-right:before{content:'\e02f'}.oi-caret-top:before{content:'\e030'}.oi-cart:before{content:'\e031'}.oi-chat:before{content:'\e032'}.oi-check:before{content:'\e033'}.oi-chevron-bottom:before{content:'\e034'}.oi-chevron-left:before{content:'\e035'}.oi-chevron-right:before{content:'\e036'}.oi-chevron-top:before{content:'\e037'}.oi-circle-check:before{content:'\e038'}.oi-circle-x:before{content:'\e039'}.oi-clipboard:before{content:'\e03a'}.oi-clock:before{content:'\e03b'}.oi-cloud-download:before{content:'\e03c'}.oi-cloud-upload:before{content:'\e03d'}.oi-cloud:before{content:'\e03e'}.oi-cloudy:before{content:'\e03f'}.oi-code:before{content:'\e040'}.oi-cog:before{content:'\e041'}.oi-collapse-down:before{content:'\e042'}.oi-collapse-left:before{content:'\e043'}.oi-collapse-right:before{content:'\e044'}.oi-collapse-up:before{content:'\e045'}.oi-command:before{content:'\e046'}.oi-comment-square:before{content:'\e047'}.oi-compass:before{content:'\e048'}.oi-contrast:before{content:'\e049'}.oi-copywriting:before{content:'\e04a'}.oi-credit-card:before{content:'\e04b'}.oi-crop:before{content:'\e04c'}.oi-dashboard:before{content:'\e04d'}.oi-data-transfer-download:before{content:'\e04e'}.oi-data-transfer-upload:before{content:'\e04f'}.oi-delete:before{content:'\e050'}.oi-dial:before{content:'\e051'}.oi-document:before{content:'\e052'}.oi-dollar:before{content:'\e053'}.oi-double-quote-sans-left:before{content:'\e054'}.oi-double-quote-sans-right:before{content:'\e055'}.oi-double-quote-serif-left:before{content:'\e056'}.oi-double-quote-serif-right:before{content:'\e057'}.oi-droplet:before{content:'\e058'}.oi-eject:before{content:'\e059'}.oi-elevator:before{content:'\e05a'}.oi-ellipses:before{content:'\e05b'}.oi-envelope-closed:before{content:'\e05c'}.oi-envelope-open:before{content:'\e05d'}.oi-euro:before{content:'\e05e'}.oi-excerpt:before{content:'\e05f'}.oi-expand-down:before{content:'\e060'}.oi-expand-left:before{content:'\e061'}.oi-expand-right:before{content:'\e062'}.oi-expand-up:before{content:'\e063'}.oi-external-link:before{content:'\e064'}.oi-eye:before{content:'\e065'}.oi-eyedropper:before{content:'\e066'}.oi-file:before{content:'\e067'}.oi-fire:before{content:'\e068'}.oi-flag:before{content:'\e069'}.oi-flash:before{content:'\e06a'}.oi-folder:before{content:'\e06b'}.oi-fork:before{content:'\e06c'}.oi-fullscreen-enter:before{content:'\e06d'}.oi-fullscreen-exit:before{content:'\e06e'}.oi-globe:before{content:'\e06f'}.oi-graph:before{content:'\e070'}.oi-grid-four-up:before{content:'\e071'}.oi-grid-three-up:before{content:'\e072'}.oi-grid-two-up:before{content:'\e073'}.oi-hard-drive:before{content:'\e074'}.oi-header:before{content:'\e075'}.oi-headphones:before{content:'\e076'}.oi-heart:before{content:'\e077'}.oi-home:before{content:'\e078'}.oi-image:before{content:'\e079'}.oi-inbox:before{content:'\e07a'}.oi-infinity:before{content:'\e07b'}.oi-info:before{content:'\e07c'}.oi-italic:before{content:'\e07d'}.oi-justify-center:before{content:'\e07e'}.oi-justify-left:before{content:'\e07f'}.oi-justify-right:before{content:'\e080'}.oi-key:before{content:'\e081'}.oi-laptop:before{content:'\e082'}.oi-layers:before{content:'\e083'}.oi-lightbulb:before{content:'\e084'}.oi-link-broken:before{content:'\e085'}.oi-link-intact:before{content:'\e086'}.oi-list-rich:before{content:'\e087'}.oi-list:before{content:'\e088'}.oi-location:before{content:'\e089'}.oi-lock-locked:before{content:'\e08a'}.oi-lock-unlocked:before{content:'\e08b'}.oi-loop-circular:before{content:'\e08c'}.oi-loop-square:before{content:'\e08d'}.oi-loop:before{content:'\e08e'}.oi-magnifying-glass:before{content:'\e08f'}.oi-map-marker:before{content:'\e090'}.oi-map:before{content:'\e091'}.oi-media-pause:before{content:'\e092'}.oi-media-play:before{content:'\e093'}.oi-media-record:before{content:'\e094'}.oi-media-skip-backward:before{content:'\e095'}.oi-media-skip-forward:before{content:'\e096'}.oi-media-step-backward:before{content:'\e097'}.oi-media-step-forward:before{content:'\e098'}.oi-media-stop:before{content:'\e099'}.oi-medical-cross:before{content:'\e09a'}.oi-menu:before{content:'\e09b'}.oi-microphone:before{content:'\e09c'}.oi-minus:before{content:'\e09d'}.oi-monitor:before{content:'\e09e'}.oi-moon:before{content:'\e09f'}.oi-move:before{content:'\e0a0'}.oi-musical-note:before{content:'\e0a1'}.oi-paperclip:before{content:'\e0a2'}.oi-pencil:before{content:'\e0a3'}.oi-people:before{content:'\e0a4'}.oi-person:before{content:'\e0a5'}.oi-phone:before{content:'\e0a6'}.oi-pie-chart:before{content:'\e0a7'}.oi-pin:before{content:'\e0a8'}.oi-play-circle:before{content:'\e0a9'}.oi-plus:before{content:'\e0aa'}.oi-power-standby:before{content:'\e0ab'}.oi-print:before{content:'\e0ac'}.oi-project:before{content:'\e0ad'}.oi-pulse:before{content:'\e0ae'}.oi-puzzle-piece:before{content:'\e0af'}.oi-question-mark:before{content:'\e0b0'}.oi-rain:before{content:'\e0b1'}.oi-random:before{content:'\e0b2'}.oi-reload:before{content:'\e0b3'}.oi-resize-both:before{content:'\e0b4'}.oi-resize-height:before{content:'\e0b5'}.oi-resize-width:before{content:'\e0b6'}.oi-rss-alt:before{content:'\e0b7'}.oi-rss:before{content:'\e0b8'}.oi-script:before{content:'\e0b9'}.oi-share-boxed:before{content:'\e0ba'}.oi-share:before{content:'\e0bb'}.oi-shield:before{content:'\e0bc'}.oi-signal:before{content:'\e0bd'}.oi-signpost:before{content:'\e0be'}.oi-sort-ascending:before{content:'\e0bf'}.oi-sort-descending:before{content:'\e0c0'}.oi-spreadsheet:before{content:'\e0c1'}.oi-star:before{content:'\e0c2'}.oi-sun:before{content:'\e0c3'}.oi-tablet:before{content:'\e0c4'}.oi-tag:before{content:'\e0c5'}.oi-tags:before{content:'\e0c6'}.oi-target:before{content:'\e0c7'}.oi-task:before{content:'\e0c8'}.oi-terminal:before{content:'\e0c9'}.oi-text:before{content:'\e0ca'}.oi-thumb-down:before{content:'\e0cb'}.oi-thumb-up:before{content:'\e0cc'}.oi-timer:before{content:'\e0cd'}.oi-transfer:before{content:'\e0ce'}.oi-trash:before{content:'\e0cf'}.oi-underline:before{content:'\e0d0'}.oi-vertical-align-bottom:before{content:'\e0d1'}.oi-vertical-align-center:before{content:'\e0d2'}.oi-vertical-align-top:before{content:'\e0d3'}.oi-video:before{content:'\e0d4'}.oi-volume-high:before{content:'\e0d5'}.oi-volume-low:before{content:'\e0d6'}.oi-volume-off:before{content:'\e0d7'}.oi-warning:before{content:'\e0d8'}.oi-wifi:before{content:'\e0d9'}.oi-wrench:before{content:'\e0da'}.oi-x:before{content:'\e0db'}.oi-yen:before{content:'\e0dc'}.oi-zoom-in:before{content:'\e0dd'}.oi-zoom-out:before{content:'\e0de'} -------------------------------------------------------------------------------- /src/CSInn.UI/wwwroot/css/open-iconic/font/fonts/open-iconic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/csinn/CSInn/7ac7a9042ae43574cf566dbca73180e0471b348d/src/CSInn.UI/wwwroot/css/open-iconic/font/fonts/open-iconic.eot -------------------------------------------------------------------------------- /src/CSInn.UI/wwwroot/css/open-iconic/font/fonts/open-iconic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/csinn/CSInn/7ac7a9042ae43574cf566dbca73180e0471b348d/src/CSInn.UI/wwwroot/css/open-iconic/font/fonts/open-iconic.otf -------------------------------------------------------------------------------- /src/CSInn.UI/wwwroot/css/open-iconic/font/fonts/open-iconic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | Created by FontForge 20120731 at Tue Jul 1 20:39:22 2014 9 | By P.J. Onori 10 | Created by P.J. Onori with FontForge 2.0 (http://fontforge.sf.net) 11 | 12 | 13 | 14 | 27 | 28 | 30 | 32 | 34 | 36 | 38 | 40 | 42 | 45 | 47 | 49 | 51 | 53 | 55 | 57 | 59 | 61 | 63 | 65 | 67 | 69 | 71 | 74 | 76 | 79 | 81 | 84 | 86 | 88 | 91 | 93 | 95 | 98 | 100 | 102 | 104 | 106 | 109 | 112 | 115 | 117 | 121 | 123 | 125 | 127 | 130 | 132 | 134 | 136 | 138 | 141 | 143 | 145 | 147 | 149 | 151 | 153 | 155 | 157 | 159 | 162 | 165 | 167 | 169 | 172 | 174 | 177 | 179 | 181 | 183 | 185 | 189 | 191 | 194 | 196 | 198 | 200 | 202 | 205 | 207 | 209 | 211 | 213 | 215 | 218 | 220 | 222 | 224 | 226 | 228 | 230 | 232 | 234 | 236 | 238 | 241 | 243 | 245 | 247 | 249 | 251 | 253 | 256 | 259 | 261 | 263 | 265 | 267 | 269 | 272 | 274 | 276 | 280 | 282 | 285 | 287 | 289 | 292 | 295 | 298 | 300 | 302 | 304 | 306 | 309 | 312 | 314 | 316 | 318 | 320 | 322 | 324 | 326 | 330 | 334 | 338 | 340 | 343 | 345 | 347 | 349 | 351 | 353 | 355 | 358 | 360 | 363 | 365 | 367 | 369 | 371 | 373 | 375 | 377 | 379 | 381 | 383 | 386 | 388 | 390 | 392 | 394 | 396 | 399 | 401 | 404 | 406 | 408 | 410 | 412 | 414 | 416 | 419 | 421 | 423 | 425 | 428 | 431 | 435 | 438 | 440 | 442 | 444 | 446 | 448 | 451 | 453 | 455 | 457 | 460 | 462 | 464 | 466 | 468 | 471 | 473 | 477 | 479 | 481 | 483 | 486 | 488 | 490 | 492 | 494 | 496 | 499 | 501 | 504 | 506 | 509 | 512 | 515 | 517 | 520 | 522 | 524 | 526 | 529 | 532 | 534 | 536 | 539 | 542 | 543 | 544 | -------------------------------------------------------------------------------- /src/CSInn.UI/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/csinn/CSInn/7ac7a9042ae43574cf566dbca73180e0471b348d/src/CSInn.UI/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf -------------------------------------------------------------------------------- /src/CSInn.UI/wwwroot/css/open-iconic/font/fonts/open-iconic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/csinn/CSInn/7ac7a9042ae43574cf566dbca73180e0471b348d/src/CSInn.UI/wwwroot/css/open-iconic/font/fonts/open-iconic.woff -------------------------------------------------------------------------------- /src/CSInn.UI/wwwroot/css/site.css: -------------------------------------------------------------------------------- 1 | @import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); 2 | 3 | html, body { 4 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 5 | } 6 | 7 | a, .btn-link { 8 | color: #0366d6; 9 | } 10 | 11 | .btn-primary { 12 | color: #fff; 13 | background-color: #1b6ec2; 14 | border-color: #1861ac; 15 | } 16 | 17 | app { 18 | position: relative; 19 | display: flex; 20 | flex-direction: column; 21 | } 22 | 23 | .top-row { 24 | height: 3.5rem; 25 | display: flex; 26 | align-items: center; 27 | } 28 | 29 | .main { 30 | flex: 1; 31 | } 32 | 33 | .main .top-row { 34 | background-color: #f7f7f7; 35 | border-bottom: 1px solid #d6d5d5; 36 | justify-content: flex-end; 37 | } 38 | 39 | .main .top-row > a { 40 | margin-left: 1.5rem; 41 | } 42 | 43 | .sidebar { 44 | background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); 45 | } 46 | 47 | .sidebar .top-row { 48 | background-color: rgba(0,0,0,0.4); 49 | } 50 | 51 | .sidebar .navbar-brand { 52 | font-size: 1.1rem; 53 | } 54 | 55 | .sidebar .oi { 56 | width: 2rem; 57 | font-size: 1.1rem; 58 | vertical-align: text-top; 59 | top: -2px; 60 | } 61 | 62 | .nav-item { 63 | font-size: 0.9rem; 64 | padding-bottom: 0.5rem; 65 | } 66 | 67 | .nav-item:first-of-type { 68 | padding-top: 1rem; 69 | } 70 | 71 | .nav-item:last-of-type { 72 | padding-bottom: 1rem; 73 | } 74 | 75 | .nav-item a { 76 | color: #d7d7d7; 77 | border-radius: 4px; 78 | height: 3rem; 79 | display: flex; 80 | align-items: center; 81 | line-height: 3rem; 82 | } 83 | 84 | .nav-item a.active { 85 | background-color: rgba(255,255,255,0.25); 86 | color: white; 87 | } 88 | 89 | .nav-item a:hover { 90 | background-color: rgba(255,255,255,0.1); 91 | color: white; 92 | } 93 | 94 | .content { 95 | padding-top: 1.1rem; 96 | } 97 | 98 | .navbar-toggler { 99 | background-color: rgba(255, 255, 255, 0.1); 100 | } 101 | 102 | .valid.modified:not([type=checkbox]) { 103 | outline: 1px solid #26b050; 104 | } 105 | 106 | .invalid { 107 | outline: 1px solid red; 108 | } 109 | 110 | .validation-message { 111 | color: red; 112 | } 113 | 114 | @media (max-width: 767.98px) { 115 | .main .top-row { 116 | display: none; 117 | } 118 | } 119 | 120 | @media (min-width: 768px) { 121 | app { 122 | flex-direction: row; 123 | } 124 | 125 | .sidebar { 126 | width: 250px; 127 | height: 100vh; 128 | position: sticky; 129 | top: 0; 130 | } 131 | 132 | .main .top-row { 133 | position: sticky; 134 | top: 0; 135 | } 136 | 137 | .main > div { 138 | padding-left: 2rem !important; 139 | padding-right: 1.5rem !important; 140 | } 141 | 142 | .navbar-toggler { 143 | display: none; 144 | } 145 | 146 | .sidebar .collapse { 147 | /* Never collapse the sidebar for wide screens */ 148 | display: block; 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /src/CSInn.UI/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/csinn/CSInn/7ac7a9042ae43574cf566dbca73180e0471b348d/src/CSInn.UI/wwwroot/favicon.ico -------------------------------------------------------------------------------- /src/CSInn.UI/wwwroot/res/csinnLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/csinn/CSInn/7ac7a9042ae43574cf566dbca73180e0471b348d/src/CSInn.UI/wwwroot/res/csinnLogo.png -------------------------------------------------------------------------------- /tests/CSInn.Application.Tests/CSInn.Application.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.1 5 | 6 | false 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | all 15 | runtime; build; native; contentfiles; analyzers; buildtransitive 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /tests/CSInn.Discord.Authentication.Tests/CSInn.Discord.Authentication.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.1 5 | 6 | false 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | all 15 | runtime; build; native; contentfiles; analyzers; buildtransitive 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /tests/CSInn.Infrastructure.Repositories.Tests/CSInn.Infrastructure.Repositories.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.2 5 | 6 | false 7 | 8 | 9 | 10 | 11 | 12 | 13 | all 14 | runtime; build; native; contentfiles; analyzers; buildtransitive 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /tests/CSInn.UI.Tests/CSInn.UI.Tests.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | netcoreapp3.0 5 | 6 | false 7 | 8 | 9 | 10 | 11 | 12 | 13 | all 14 | runtime; build; native; contentfiles; analyzers; buildtransitive 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /tests/CSInn.UI.Tests/ReadMe.txt: -------------------------------------------------------------------------------- 1 | UI testing will involve BDD. --------------------------------------------------------------------------------