├── .editorconfig ├── .github └── workflows │ ├── main.yml │ └── smoke-test.yml ├── .gitignore ├── .runsettings ├── DotNetRu.Commune.BizLayer ├── DotNetRu.Commune.BizLayer.csproj └── Model │ ├── Community.cs │ ├── Friend.cs │ ├── Meetup.cs │ ├── MeetupSession.cs │ ├── Speaker.cs │ ├── Talk.cs │ └── Venue.cs ├── DotNetRu.Commune.GithubFilesystem ├── DotNetRu.Commune.GithubFilesystem.csproj ├── EditingContext.cs ├── GithubFileSystem.cs └── Net5HttpMessageHandlerFactory.cs ├── DotNetRu.Commune.WasmClient ├── App.razor ├── AssemblyInfo.cs ├── BizLayerServiceRegistry.cs ├── DotNetRu.Commune.WasmClient.csproj ├── Model │ └── AuditSettings.cs ├── Pages │ ├── AuthFailed.razor │ ├── AuthSuccess.razor │ └── Index.razor ├── Program.cs ├── Properties │ └── launchSettings.json ├── Shared │ ├── MainLayout.razor │ └── MainLayout.razor.css ├── _Imports.razor └── wwwroot │ ├── appsettings.json │ ├── css │ ├── app.css │ ├── bootstrap │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map │ └── 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 │ ├── favicon.ico │ └── index.html ├── DotNetRu.Commune.sln ├── LICENSE ├── README.md └── test ├── DotNetRu.Commune.Test.Fs.WasmClient ├── BizLayerServiceRegistryFsTests.fs ├── DotNetRu.Commune.Test.Fs.WasmClient.fsproj └── Program.fs └── DotNetRu.Commune.Test.WasmClient ├── BizLayerServiceRegistryTests.cs └── DotNetRu.Commune.Test.WasmClient.csproj /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Default settings: 7 | # A newline ending every file 8 | # Use 4 spaces as indentation 9 | [*] 10 | insert_final_newline = true 11 | indent_style = space 12 | indent_size = 4 13 | trim_trailing_whitespace = true 14 | 15 | [project.json] 16 | indent_size = 2 17 | 18 | # C# files 19 | [*.cs] 20 | # New line preferences 21 | csharp_new_line_before_open_brace = all 22 | csharp_new_line_before_else = true 23 | csharp_new_line_before_catch = true 24 | csharp_new_line_before_finally = true 25 | csharp_new_line_before_members_in_object_initializers = true 26 | csharp_new_line_before_members_in_anonymous_types = true 27 | csharp_new_line_between_query_expression_clauses = true 28 | 29 | # Indentation preferences 30 | csharp_indent_block_contents = true 31 | csharp_indent_braces = false 32 | csharp_indent_case_contents = true 33 | csharp_indent_case_contents_when_block = true 34 | csharp_indent_switch_labels = true 35 | csharp_indent_labels = one_less_than_current 36 | 37 | # Modifier preferences 38 | csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion 39 | 40 | # avoid this. unless absolutely necessary 41 | dotnet_style_qualification_for_field = false:suggestion 42 | dotnet_style_qualification_for_property = false:suggestion 43 | dotnet_style_qualification_for_method = false:suggestion 44 | dotnet_style_qualification_for_event = false:suggestion 45 | 46 | # Types: use keywords instead of BCL types, and permit var only when the type is clear 47 | csharp_style_var_for_built_in_types = false:suggestion 48 | csharp_style_var_when_type_is_apparent = false:none 49 | csharp_style_var_elsewhere = false:suggestion 50 | dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion 51 | dotnet_style_predefined_type_for_member_access = true:suggestion 52 | 53 | # name all constant fields using PascalCase 54 | dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion 55 | dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields 56 | dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style 57 | dotnet_naming_symbols.constant_fields.applicable_kinds = field 58 | dotnet_naming_symbols.constant_fields.required_modifiers = const 59 | dotnet_naming_style.pascal_case_style.capitalization = pascal_case 60 | 61 | # static fields should have s_ prefix 62 | dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion 63 | dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields 64 | dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style 65 | dotnet_naming_symbols.static_fields.applicable_kinds = field 66 | dotnet_naming_symbols.static_fields.required_modifiers = static 67 | dotnet_naming_symbols.static_fields.applicable_accessibilities = private, internal, private_protected 68 | dotnet_naming_style.static_prefix_style.required_prefix = s_ 69 | dotnet_naming_style.static_prefix_style.capitalization = camel_case 70 | 71 | # internal and private fields should be _camelCase 72 | dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion 73 | dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields 74 | dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style 75 | dotnet_naming_symbols.private_internal_fields.applicable_kinds = field 76 | dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal 77 | dotnet_naming_style.camel_case_underscore_style.required_prefix = _ 78 | dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case 79 | 80 | # Code style defaults 81 | csharp_using_directive_placement = outside_namespace:suggestion 82 | dotnet_sort_system_directives_first = true 83 | csharp_prefer_braces = true:refactoring 84 | csharp_preserve_single_line_blocks = true:none 85 | csharp_preserve_single_line_statements = false:none 86 | csharp_prefer_static_local_function = true:suggestion 87 | csharp_prefer_simple_using_statement = false:none 88 | csharp_style_prefer_switch_expression = true:suggestion 89 | 90 | # Code quality 91 | dotnet_style_readonly_field = true:suggestion 92 | dotnet_code_quality_unused_parameters = non_public:suggestion 93 | 94 | # Expression-level preferences 95 | dotnet_style_object_initializer = true:suggestion 96 | dotnet_style_collection_initializer = true:suggestion 97 | dotnet_style_explicit_tuple_names = true:suggestion 98 | dotnet_style_coalesce_expression = true:suggestion 99 | dotnet_style_null_propagation = true:suggestion 100 | dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion 101 | dotnet_style_prefer_inferred_tuple_names = true:suggestion 102 | dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion 103 | dotnet_style_prefer_auto_properties = true:suggestion 104 | dotnet_style_prefer_conditional_expression_over_assignment = true:refactoring 105 | dotnet_style_prefer_conditional_expression_over_return = true:refactoring 106 | csharp_prefer_simple_default_expression = true:suggestion 107 | 108 | # Expression-bodied members 109 | csharp_style_expression_bodied_methods = true:refactoring 110 | csharp_style_expression_bodied_constructors = true:refactoring 111 | csharp_style_expression_bodied_operators = true:refactoring 112 | csharp_style_expression_bodied_properties = true:refactoring 113 | csharp_style_expression_bodied_indexers = true:refactoring 114 | csharp_style_expression_bodied_accessors = true:refactoring 115 | csharp_style_expression_bodied_lambdas = true:refactoring 116 | csharp_style_expression_bodied_local_functions = true:refactoring 117 | 118 | # Pattern matching 119 | csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion 120 | csharp_style_pattern_matching_over_as_with_null_check = true:suggestion 121 | csharp_style_inlined_variable_declaration = true:suggestion 122 | 123 | # Null checking preferences 124 | csharp_style_throw_expression = true:suggestion 125 | csharp_style_conditional_delegate_call = true:suggestion 126 | 127 | # Other features 128 | csharp_style_prefer_index_operator = false:none 129 | csharp_style_prefer_range_operator = false:none 130 | csharp_style_pattern_local_over_anonymous_function = false:none 131 | 132 | # Space preferences 133 | csharp_space_after_cast = false 134 | csharp_space_after_colon_in_inheritance_clause = true 135 | csharp_space_after_comma = true 136 | csharp_space_after_dot = false 137 | csharp_space_after_keywords_in_control_flow_statements = true 138 | csharp_space_after_semicolon_in_for_statement = true 139 | csharp_space_around_binary_operators = before_and_after 140 | csharp_space_around_declaration_statements = do_not_ignore 141 | csharp_space_before_colon_in_inheritance_clause = true 142 | csharp_space_before_comma = false 143 | csharp_space_before_dot = false 144 | csharp_space_before_open_square_brackets = false 145 | csharp_space_before_semicolon_in_for_statement = false 146 | csharp_space_between_empty_square_brackets = false 147 | csharp_space_between_method_call_empty_parameter_list_parentheses = false 148 | csharp_space_between_method_call_name_and_opening_parenthesis = false 149 | csharp_space_between_method_call_parameter_list_parentheses = false 150 | csharp_space_between_method_declaration_empty_parameter_list_parentheses = false 151 | csharp_space_between_method_declaration_name_and_open_parenthesis = false 152 | csharp_space_between_method_declaration_parameter_list_parentheses = false 153 | csharp_space_between_parentheses = false 154 | csharp_space_between_square_brackets = false 155 | 156 | # Analyzers 157 | dotnet_code_quality.ca1802.api_surface = private, internal 158 | 159 | # C++ Files 160 | [*.{cpp,h,in}] 161 | curly_bracket_next_line = true 162 | indent_brace_style = Allman 163 | 164 | # Xml project files 165 | [*.{csproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}] 166 | indent_size = 2 167 | 168 | # Xml build files 169 | [*.builds] 170 | indent_size = 2 171 | 172 | # Xml files 173 | [*.{xml,stylecop,resx,ruleset}] 174 | indent_size = 2 175 | 176 | # Xml config files 177 | [*.{props,targets,config,nuspec}] 178 | indent_size = 2 179 | 180 | # Shell scripts 181 | [*.sh] 182 | end_of_line = lf 183 | [*.{cmd, bat}] 184 | end_of_line = crlf 185 | 186 | #YAML workflow files 187 | [*.{yaml,yml}] 188 | indent_size = 2 189 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to GitHubPages 2 | on: 3 | push: 4 | branches: [ master ] 5 | 6 | jobs: 7 | deploy-to-github-pages: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: get sources 11 | uses: actions/checkout@v2 12 | 13 | - name: Setup .NET 5.0 SDK 14 | uses: actions/setup-dotnet@v1.7.2 15 | with: 16 | dotnet-version: 5.0.x 17 | 18 | - name: restore dependencies 19 | run: dotnet restore 20 | 21 | - name: Build 22 | run: dotnet build --configuration Release --no-restore 23 | 24 | # тестирование со сборкой результатов покрытия по конфигурации в файле по умолчанию 25 | - name: Test 26 | run: dotnet test --no-restore --verbosity normal --collect:"XPlat code coverage" 27 | 28 | # публикация результатов покрытия тестами на code-cov 29 | - name: Upload coverage to Codecov 30 | uses: codecov/codecov-action@v1 31 | 32 | - name: Publish 33 | run: dotnet publish DotNetRu.Commune.WasmClient/DotNetRu.Commune.WasmClient.csproj -c Release -o release 34 | 35 | # заменить базовый URL с / на /Commune 36 | - name: Change base-tag in index.html from / to BlazorGitHubPagesDemo 37 | run: sed -i 's///g' release/wwwroot/index.html 38 | 39 | # добавить файл .nojekyll чтобы отвязаться от правила Jekyll по игнорированию путей начинающихся с нижнего подчеркивания. Это критично важно для blazor 40 | - name: Add .nojekyll file 41 | run: touch release/wwwroot/.nojekyll 42 | 43 | # наконец, закоммитить результаты в ветку gh-pages 44 | - name: Commit wwwroot to GitHub Pages 45 | uses: JamesIves/github-pages-deploy-action@3.7.1 46 | with: 47 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 48 | BRANCH: gh-pages 49 | FOLDER: release/wwwroot 50 | 51 | -------------------------------------------------------------------------------- /.github/workflows/smoke-test.yml: -------------------------------------------------------------------------------- 1 | name: Smoke-test 2 | 3 | on: 4 | pull_request: 5 | branches: [ master ] 6 | 7 | push: 8 | branches: [ master ] 9 | 10 | workflow_dispatch: 11 | 12 | jobs: 13 | test: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - uses: actions/checkout@v2 18 | 19 | - name: Setup .NET 20 | uses: actions/setup-dotnet@v1 21 | with: 22 | dotnet-version: 5.0.x 23 | 24 | - name: restore dependencies 25 | run: dotnet restore 26 | 27 | - name: Build 28 | run: dotnet build --configuration Release --no-restore 29 | 30 | # тестирование и сбор покрытия 31 | - name: Test 32 | run: dotnet test --no-restore --verbosity normal --collect:"XPlat code coverage" 33 | 34 | # публикация результатов покрытия тестами на code-cov 35 | - name: Upload coverage to Codecov 36 | uses: codecov/codecov-action@v1 37 | 38 | - name: Publish 39 | run: dotnet publish DotNetRu.Commune.WasmClient/DotNetRu.Commune.WasmClient.csproj -c Release -o release 40 | 41 | - name: Save 42 | uses: actions/upload-artifact@v2 43 | with: 44 | name: smoke-artifact 45 | path: ./release 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /Properties/launchSettings.json 2 | 3 | ## Ignore Visual Studio temporary files, build results, and 4 | ## files generated by popular Visual Studio add-ons. 5 | # pr-test-1 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 | build/ 23 | bld/ 24 | bin/ 25 | Bin/ 26 | obj/ 27 | Obj/ 28 | 29 | # Visual Studio 2015 cache/options directory 30 | .vs/ 31 | /wwwroot/dist/ 32 | /ClientApp/dist/ 33 | 34 | # MSTest test Results 35 | [Tt]est[Rr]esult*/ 36 | [Bb]uild[Ll]og.* 37 | 38 | # NUNIT 39 | *.VisualState.xml 40 | TestResult.xml 41 | 42 | # Build Results of an ATL Project 43 | [Dd]ebugPS/ 44 | [Rr]eleasePS/ 45 | dlldata.c 46 | 47 | *_i.c 48 | *_p.c 49 | *_i.h 50 | *.ilk 51 | *.meta 52 | *.obj 53 | *.pch 54 | *.pdb 55 | *.pgc 56 | *.pgd 57 | *.rsp 58 | *.sbr 59 | *.tlb 60 | *.tli 61 | *.tlh 62 | *.tmp 63 | *.tmp_proj 64 | *.log 65 | *.vspscc 66 | *.vssscc 67 | .builds 68 | *.pidb 69 | *.svclog 70 | *.scc 71 | 72 | # Chutzpah Test files 73 | _Chutzpah* 74 | 75 | # Visual C++ cache files 76 | ipch/ 77 | *.aps 78 | *.ncb 79 | *.opendb 80 | *.opensdf 81 | *.sdf 82 | *.cachefile 83 | 84 | # Visual Studio profiler 85 | *.psess 86 | *.vsp 87 | *.vspx 88 | *.sap 89 | 90 | # TFS 2012 Local Workspace 91 | $tf/ 92 | 93 | # Guidance Automation Toolkit 94 | *.gpState 95 | 96 | # ReSharper is a .NET coding add-in 97 | _ReSharper*/ 98 | *.[Rr]e[Ss]harper 99 | *.DotSettings.user 100 | 101 | # JustCode is a .NET coding add-in 102 | .JustCode 103 | 104 | # TeamCity is a build add-in 105 | _TeamCity* 106 | 107 | # DotCover is a Code Coverage Tool 108 | *.dotCover 109 | 110 | # NCrunch 111 | _NCrunch_* 112 | .*crunch*.local.xml 113 | nCrunchTemp_* 114 | 115 | # MightyMoose 116 | *.mm.* 117 | AutoTest.Net/ 118 | 119 | # Web workbench (sass) 120 | .sass-cache/ 121 | 122 | # Installshield output folder 123 | [Ee]xpress/ 124 | 125 | # DocProject is a documentation generator add-in 126 | DocProject/buildhelp/ 127 | DocProject/Help/*.HxT 128 | DocProject/Help/*.HxC 129 | DocProject/Help/*.hhc 130 | DocProject/Help/*.hhk 131 | DocProject/Help/*.hhp 132 | DocProject/Help/Html2 133 | DocProject/Help/html 134 | 135 | # Click-Once directory 136 | publish/ 137 | 138 | # Publish Web Output 139 | *.[Pp]ublish.xml 140 | *.azurePubxml 141 | # TODO: Comment the next line if you want to checkin your web deploy settings 142 | # but database connection strings (with potential passwords) will be unencrypted 143 | *.pubxml 144 | *.publishproj 145 | 146 | # NuGet Packages 147 | *.nupkg 148 | # The packages folder can be ignored because of Package Restore 149 | **/packages/* 150 | # except build/, which is used as an MSBuild target. 151 | !**/packages/build/ 152 | # Uncomment if necessary however generally it will be regenerated when needed 153 | #!**/packages/repositories.config 154 | 155 | # Microsoft Azure Build Output 156 | csx/ 157 | *.build.csdef 158 | 159 | # Microsoft Azure Emulator 160 | ecf/ 161 | rcf/ 162 | 163 | # Microsoft Azure ApplicationInsights config file 164 | ApplicationInsights.config 165 | 166 | # Windows Store app package directory 167 | AppPackages/ 168 | BundleArtifacts/ 169 | 170 | # Visual Studio cache files 171 | # files ending in .cache can be ignored 172 | *.[Cc]ache 173 | # but keep track of directories ending in .cache 174 | !*.[Cc]ache/ 175 | 176 | # Others 177 | ClientBin/ 178 | ~$* 179 | *~ 180 | *.dbmdl 181 | *.dbproj.schemaview 182 | *.pfx 183 | *.publishsettings 184 | orleans.codegen.cs 185 | 186 | /node_modules 187 | 188 | /yarn.lock 189 | 190 | # RIA/Silverlight projects 191 | Generated_Code/ 192 | 193 | # Backup & report files from converting an old project file 194 | # to a newer Visual Studio version. Backup files are not needed, 195 | # because we have git ;-) 196 | _UpgradeReport_Files/ 197 | Backup*/ 198 | UpgradeLog*.XML 199 | UpgradeLog*.htm 200 | 201 | # SQL Server files 202 | *.mdf 203 | *.ldf 204 | 205 | # Business Intelligence projects 206 | *.rdl.data 207 | *.bim.layout 208 | *.bim_*.settings 209 | 210 | # Microsoft Fakes 211 | FakesAssemblies/ 212 | 213 | # GhostDoc plugin setting file 214 | *.GhostDoc.xml 215 | 216 | # Node.js Tools for Visual Studio 217 | .ntvs_analysis.dat 218 | 219 | # Visual Studio 6 build log 220 | *.plg 221 | 222 | # Visual Studio 6 workspace options file 223 | *.opt 224 | 225 | # Visual Studio LightSwitch build output 226 | **/*.HTMLClient/GeneratedArtifacts 227 | **/*.DesktopClient/GeneratedArtifacts 228 | **/*.DesktopClient/ModelManifest.xml 229 | **/*.Server/GeneratedArtifacts 230 | **/*.Server/ModelManifest.xml 231 | _Pvt_Extensions 232 | 233 | # Paket dependency manager 234 | .paket/paket.exe 235 | 236 | # FAKE - F# Make 237 | .fake/ 238 | .vscode 239 | .idea 240 | .DS_Store 241 | /DotNetRuServer/Logs 242 | -------------------------------------------------------------------------------- /.runsettings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | opencover 8 | [*.Test]*,[*]*.Program,[*.Test.*],[*.test.*] 9 | Obsolete,GeneratedCodeAttribute,CompilerGeneratedAttribute,ExcludeFromCodeCoverageAttribute 10 | false 11 | true 12 | true 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /DotNetRu.Commune.BizLayer/DotNetRu.Commune.BizLayer.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | enable 6 | true 7 | 9999 8 | true 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /DotNetRu.Commune.BizLayer/Model/Community.cs: -------------------------------------------------------------------------------- 1 | namespace DotNetRu.Commune.BizLayer.Model 2 | { 3 | /// 4 | /// Community bizlayer model 5 | /// 6 | /// Community indentifier 7 | /// Community name 8 | /// Community city 9 | /// Time zone of community 10 | /// Link to vkontakte community's page 11 | /// Link to community's twitter 12 | /// Link to community's telegram channel 13 | /// Link to community's telegram chat 14 | /// Link to community page at Meetup.com 15 | /// Link to community's page at TimePad 16 | public record Community(string Id, 17 | string Name, 18 | string City, 19 | string TimeZone, 20 | string? VkUrl, 21 | string? TwitterUrl, 22 | string? TelegramChannelUrl, 23 | string? TelegramChatUrl, 24 | string? MeetupComUrl, 25 | string? TimePadUrl); 26 | } 27 | -------------------------------------------------------------------------------- /DotNetRu.Commune.BizLayer/Model/Friend.cs: -------------------------------------------------------------------------------- 1 | namespace DotNetRu.Commune.BizLayer.Model 2 | { 3 | /// 4 | /// Friend entity 5 | /// 6 | /// Friend identifier 7 | /// Friend name 8 | /// Friend website 9 | /// Friend description 10 | public record Friend(string Id, string Name, string Url, string Description); 11 | } 12 | -------------------------------------------------------------------------------- /DotNetRu.Commune.BizLayer/Model/Meetup.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace DotNetRu.Commune.BizLayer.Model 4 | { 5 | /// 6 | /// Meetup entity 7 | /// 8 | /// Meetup identifier 9 | /// Meetup name 10 | /// Community, that organized this meetup 11 | /// Friends, who helped with te meetup 12 | /// Venue, where meetup took place 13 | /// Sessions of the meetup. Should contain at lest one item 14 | public record Meetup(string Id, 15 | string Name, 16 | Community Community, 17 | IReadOnlyList Friends, 18 | Venue? Venue, 19 | IReadOnlyList Sessions); 20 | } 21 | -------------------------------------------------------------------------------- /DotNetRu.Commune.BizLayer/Model/MeetupSession.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace DotNetRu.Commune.BizLayer.Model 4 | { 5 | /// 6 | /// One session (time slot) at the meetup 7 | /// 8 | /// Talk, the happened at this session 9 | /// Session starts at this time (with offset from UTC) 10 | /// Session ends at this time (with offset from UTC) 11 | public record MeetupSession(Talk Talk, 12 | DateTimeOffset StartTime, 13 | DateTimeOffset EndTime); 14 | } 15 | -------------------------------------------------------------------------------- /DotNetRu.Commune.BizLayer/Model/Speaker.cs: -------------------------------------------------------------------------------- 1 | namespace DotNetRu.Commune.BizLayer.Model 2 | { 3 | /// 4 | /// Speaker entity 5 | /// 6 | /// Speaker's identitier 7 | /// Speaker's name 8 | /// Speaker's company, if present 9 | /// Speaker's company website, if present 10 | /// Speaker's description 11 | /// Speaker's blog url 12 | /// Speaker's contans page url 13 | /// Link to speaker's twitter account 14 | /// Link to speaker's account at habr.com 15 | /// Link to speaker's account at github.com 16 | public record Speaker(string Id, 17 | string Name, 18 | string? CompanyName, 19 | string? CompanyUrl, 20 | string Description, 21 | string? BlogUrl, 22 | string? ContactsUrl, 23 | string? TwitterUrl, 24 | string? HabrUrl, 25 | string? GitHubUrl); 26 | 27 | } 28 | -------------------------------------------------------------------------------- /DotNetRu.Commune.BizLayer/Model/Talk.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace DotNetRu.Commune.BizLayer.Model 4 | { 5 | /// 6 | /// Talk entity 7 | /// 8 | /// Talk id 9 | /// List of speakers. Should contain at least one item 10 | /// Talk short name 11 | /// Talk description 12 | /// List of connected talks 13 | /// Link to code, discussed at this talk 14 | /// Link to slides used at the talk 15 | /// Link to video of the talk 16 | public record Talk(string Id, 17 | IReadOnlyList Speakers, 18 | string Name, 19 | string Description, 20 | IReadOnlyList SeeAlsoTalks, 21 | string? CodeUrl, 22 | string? SlidesUrl, 23 | string? VideoUrl); 24 | } 25 | -------------------------------------------------------------------------------- /DotNetRu.Commune.BizLayer/Model/Venue.cs: -------------------------------------------------------------------------------- 1 | namespace DotNetRu.Commune.BizLayer.Model 2 | { 3 | /// 4 | /// Venue entity 5 | /// 6 | /// 7 | /// Venue is a place, where meetups can occur 8 | /// 9 | /// Venue's identifier 10 | /// Venue's name 11 | /// Venue's capacity (if known) 12 | /// Venue's address 13 | /// Short url for mapping service with Venue's location 14 | public record Venue(string Id, string Name, int? Capacity, string Address, string MapUrl); 15 | } 16 | -------------------------------------------------------------------------------- /DotNetRu.Commune.GithubFilesystem/DotNetRu.Commune.GithubFilesystem.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | enable 6 | true 7 | 9999 8 | true 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /DotNetRu.Commune.GithubFilesystem/EditingContext.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Octokit; 4 | 5 | namespace DotNetRu.Commune.GithubFileSystem 6 | { 7 | /// 8 | /// Represents a single session of work with filesystem. Actually - main part of it is a link to current branch of forked repository. 9 | /// 10 | internal class EditingContext 11 | { 12 | /// 13 | /// GitHub API client instance 14 | /// 15 | public IGitHubClient Client { get; } 16 | 17 | /// 18 | /// Sub-client for accessing API for manipulation with repository contents 19 | /// 20 | public virtual IRepositoryContentsClient ContentClient => Client.Repository.Content; 21 | 22 | /// 23 | /// Sub-client for accessing API for manipulation with pull requests 24 | /// 25 | public virtual IPullRequestsClient PullRequestsClient => Client.PullRequest; 26 | 27 | /// 28 | /// Original repository 29 | /// 30 | public Repository OriginRepo { get; } 31 | 32 | /// 33 | /// Original (source) branch 34 | /// 35 | /// HINT: It is "master" 36 | public Reference OriginBranch { get; } 37 | 38 | /// 39 | /// User's fork of original repo 40 | /// 41 | public Repository LocalRepo { get; } 42 | 43 | /// 44 | /// Current branch. All files are editing in it. 45 | /// 46 | public Reference CurrentBranch { get; } 47 | 48 | /// 49 | /// Commit the changes. 50 | /// Creates a pr from of to of 51 | /// 52 | /// Title of the creating pull request 53 | public Task Commit(string prTitle) 54 | { 55 | if (string.IsNullOrWhiteSpace(prTitle)) throw new ArgumentException("Pull request title must be not empty."); 56 | var head = $"{LocalRepo.Owner.Login}:{CurrentBranch.Ref}"; 57 | return PullRequestsClient.Create(OriginRepo.Id, 58 | new(prTitle, head, OriginBranch.Ref) {Draft = true}); 59 | } 60 | 61 | public EditingContext(IGitHubClient client, Repository originRepo, Reference originBranch, Repository localRepo, 62 | Reference currentBranch) 63 | { 64 | Client = client ?? throw new ArgumentNullException(nameof(client)); 65 | OriginRepo = originRepo ?? throw new ArgumentNullException(nameof(originRepo)); 66 | OriginBranch = originBranch ?? throw new ArgumentNullException(nameof(originBranch)); 67 | LocalRepo = localRepo ?? throw new ArgumentNullException(nameof(localRepo)); 68 | CurrentBranch = currentBranch ?? throw new ArgumentNullException(nameof(currentBranch)); 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /DotNetRu.Commune.GithubFilesystem/GithubFileSystem.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | using DotNetRu.Auditor.Storage.FileSystem; 5 | using Octokit; 6 | using Octokit.Helpers; 7 | using Octokit.Internal; 8 | 9 | namespace DotNetRu.Commune.GithubFileSystem 10 | { 11 | /// 12 | /// Virtual filesystem implementation using GitHub repositories for storing files. Implements 13 | /// 14 | public class GithubFileSystem : IFileSystem 15 | { 16 | private const string ProductName = "DotNetRuCommune"; 17 | private EditingContext? _editingContext; 18 | 19 | /// 20 | /// Begin work with filesytem. Creates a fork of original repository, then creates a new branch in this fork and 21 | /// stores all the data inside editing context. Without calling this method you can't do anything else - enumerate, read, create 22 | /// 23 | /// Personal access token 24 | /// Original repository name 25 | /// Original repository owner (user or organization) 26 | public async Task StartContext(string token, string originRepo, string originOwner) 27 | { 28 | var credStore = new InMemoryCredentialStore(new(token, AuthenticationType.Bearer)); 29 | var client = new GitHubClient(new Connection(new ProductHeaderValue(ProductName), 30 | GitHubClient.GitHubApiUrl, credStore, 31 | new HttpClientAdapter(Net5HttpMessageHandlerFactory.CreateDefault), 32 | new SimpleJsonSerializer())); 33 | 34 | var originalRepo = await client.Repository.Get(originOwner, originRepo).ConfigureAwait(false); 35 | var originalBranch = await client.Git.Reference.Get(originalRepo.Id, "heads/master").ConfigureAwait(false); 36 | var fork = await client.Repository.Forks.Create(originalRepo.Id, new ()).ConfigureAwait(false); 37 | var currentBranch = await client.Git.Reference.CreateBranch(fork.Owner.Login, fork.Name, Guid.NewGuid().ToString("N")).ConfigureAwait(false); 38 | _editingContext = new EditingContext(client, originalRepo, originalBranch, fork, currentBranch); 39 | } 40 | 41 | /// 42 | public string Name => "/"; 43 | 44 | /// 45 | public string FullName => "/"; 46 | 47 | /// 48 | public bool Exists => true; 49 | 50 | /// 51 | public ValueTask GetDirectoryInfoAsync(string subPath) => throw new System.NotImplementedException(); 52 | 53 | /// 54 | public ValueTask GetFileInfoAsync(string subPath) => throw new System.NotImplementedException(); 55 | 56 | /// 57 | public IAsyncEnumerable EnumerateDirectoriesAsync() => throw new System.NotImplementedException(); 58 | 59 | /// 60 | public IAsyncEnumerable EnumerateFilesAsync() => throw new System.NotImplementedException(); 61 | 62 | /// 63 | public ValueTask CreateFileAsync(string subPath) => throw new System.NotImplementedException(); 64 | 65 | /// 66 | public ValueTask DeleteFileAsync(string subPath) => throw new System.NotImplementedException(); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /DotNetRu.Commune.GithubFilesystem/Net5HttpMessageHandlerFactory.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics.CodeAnalysis; 2 | using System.Net; 3 | using System.Net.Http; 4 | 5 | namespace DotNetRu.Commune.GithubFileSystem 6 | { 7 | internal class Net5HttpMessageHandlerFactory 8 | { 9 | public static HttpMessageHandler CreateDefault() 10 | { 11 | return CreateDefault(null); 12 | } 13 | 14 | [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "proxy")] 15 | [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] 16 | public static HttpMessageHandler CreateDefault(IWebProxy? proxy) 17 | { 18 | var handler = new HttpClientHandler(); 19 | 20 | if (handler.SupportsAutomaticDecompression) 21 | { 22 | handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 23 | } 24 | 25 | if (handler.SupportsProxy && proxy != null) 26 | { 27 | handler.UseProxy = true; 28 | handler.Proxy = proxy; 29 | } 30 | 31 | return handler; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/App.razor: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Sorry, there's nothing at this address.

8 |
9 |
10 |
11 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.CompilerServices; 2 | 3 | [assembly:InternalsVisibleTo("DotNetRu.Commune.Test.WasmClient")] 4 | [assembly:InternalsVisibleTo("DotNetRu.Commune.Test.Fs.WasmClient")] 5 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/BizLayerServiceRegistry.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics.CodeAnalysis; 3 | using Microsoft.Extensions.DependencyInjection; 4 | using Microsoft.Extensions.DependencyInjection.Extensions; 5 | 6 | namespace DotNetRu.Commune.WasmClient 7 | { 8 | /// 9 | /// Класс регистрации сервисов бизнес-логики 10 | /// 11 | internal static class BizLayerServiceRegistry 12 | { 13 | /// 14 | /// Регистрация служб бизнеслогики в контейнере 15 | /// 16 | /// коллекция служб 17 | /// она же для соединения в цепочку 18 | /// если переданная коллекция была null 19 | [return:NotNull] public static IServiceCollection AddBizLogic([NotNull]this IServiceCollection services) 20 | { 21 | if (services is null) throw new ArgumentNullException(nameof(services)); 22 | // здесь регистрируются службы слоя бизнес-логики 23 | services.TryAddSingleton(); 24 | return services; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/DotNetRu.Commune.WasmClient.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 9999 6 | enable 7 | true 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | true 27 | Always 28 | Always 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/Model/AuditSettings.cs: -------------------------------------------------------------------------------- 1 | namespace DotNetRu.Commune.WasmClient.Model 2 | { 3 | /// 4 | /// Класс настроек расположения репозитория аудита 5 | /// 6 | public class AuditSettings 7 | { 8 | /// 9 | /// Наименование репозитория 10 | /// 11 | public string RepositoryName { get; set; } = string.Empty; 12 | 13 | /// 14 | /// Наименование оригинального владельца репозитория 15 | /// 16 | public string OriginalOwner { get; set; } = string.Empty; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/Pages/AuthFailed.razor: -------------------------------------------------------------------------------- 1 | @page "/AuthFailed" 2 |

Ошибка авторизации

3 | 4 | @code { 5 | 6 | } 7 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/Pages/AuthSuccess.razor: -------------------------------------------------------------------------------- 1 | @page "/AuthSuccess" 2 |

Успешная авторизация

3 | 4 | @code { 5 | 6 | } 7 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/Pages/Index.razor: -------------------------------------------------------------------------------- 1 | @page "/" 2 | @using Microsoft.Extensions.Logging 3 | @using Microsoft.Extensions.Options 4 | @using DotNetRu.Commune.WasmClient.Model 5 | @using DotNetRu.Commune.GithubFileSystem 6 | @inject ILogger _logger; 7 | @inject GithubFileSystem githubFs; 8 | @inject IOptions auditSettings; 9 | @inject NavigationManager _navigationManager; 10 | 11 |

DotNetRu Commune

12 | 13 |

14 | Это тестовое приложение DotNetRU.Commune.
15 | Введите свой PAT для авторизации клиента github:
16 | 17 | 18 |

19 | 20 | @code 21 | { 22 | string pat = string.Empty; 23 | 24 | private async Task ProvidePat() 25 | { 26 | try 27 | { 28 | await githubFs.StartContext(pat, auditSettings.Value.RepositoryName, auditSettings.Value.OriginalOwner); 29 | _navigationManager.NavigateTo("AuthSuccess"); 30 | } 31 | catch (Exception e) 32 | { 33 | _logger.LogError(e, "Ошибка старта контекста реадктирования"); 34 | _navigationManager.NavigateTo("AuthFailed"); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/Program.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using DotNetRu.Commune.WasmClient.Model; 3 | using Microsoft.AspNetCore.Components.WebAssembly.Hosting; 4 | using Microsoft.Extensions.Configuration; 5 | using Microsoft.Extensions.DependencyInjection; 6 | using Microsoft.Extensions.Logging; 7 | using Serilog; 8 | 9 | namespace DotNetRu.Commune.WasmClient 10 | { 11 | public class Program 12 | { 13 | public static async Task Main(string[] args) 14 | { 15 | var builder = WebAssemblyHostBuilder.CreateDefault(args); 16 | builder.RootComponents.Add("#app"); 17 | 18 | ConfigureLogging(builder.Logging, builder.Configuration); 19 | 20 | ConfigureServices(builder.Services, builder.Configuration); 21 | 22 | await builder.Build().RunAsync(); 23 | } 24 | 25 | /// 26 | /// Конфигурация DI-контейнера 27 | /// 28 | /// Коллекция служб - собственно контейнер 29 | /// Конфигурация 30 | private static void ConfigureServices(IServiceCollection services, IConfiguration configuration) 31 | { 32 | services.Configure(configuration.GetSection(nameof(AuditSettings))); 33 | services.AddBizLogic(); 34 | } 35 | 36 | /// 37 | /// Настройка логирования. 38 | /// По умолчанию используется Serilog. Конфигурация логгера задаётся через IConfiguration, из секции "Serilog" 39 | /// 40 | /// Билдер логгера 41 | /// Конфигурация 42 | private static void ConfigureLogging(ILoggingBuilder builderLogging, IConfiguration builderConfiguration) 43 | { 44 | builderLogging.ClearProviders(); 45 | Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(builderConfiguration, "Serilog").CreateLogger(); 46 | builderLogging.AddSerilog(); 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:2027", 7 | "sslPort": 44301 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 15 | "environmentVariables": { 16 | "ASPNETCORE_ENVIRONMENT": "Development" 17 | } 18 | }, 19 | "DotNetRu.Commune.WasmClient": { 20 | "commandName": "Project", 21 | "dotnetRunMessages": "true", 22 | "launchBrowser": true, 23 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 24 | "applicationUrl": "https://localhost:5001;http://localhost:5000", 25 | "environmentVariables": { 26 | "ASPNETCORE_ENVIRONMENT": "Development" 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | 3 |
4 |
5 |
6 | @Body 7 |
8 |
9 |
10 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/Shared/MainLayout.razor.css: -------------------------------------------------------------------------------- 1 | .page { 2 | position: relative; 3 | display: flex; 4 | flex-direction: column; 5 | } 6 | 7 | .main { 8 | flex: 1; 9 | } 10 | 11 | .sidebar { 12 | background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); 13 | } 14 | 15 | .top-row { 16 | background-color: #f7f7f7; 17 | border-bottom: 1px solid #d6d5d5; 18 | justify-content: flex-end; 19 | height: 3.5rem; 20 | display: flex; 21 | align-items: center; 22 | } 23 | 24 | .top-row ::deep a, .top-row .btn-link { 25 | white-space: nowrap; 26 | margin-left: 1.5rem; 27 | } 28 | 29 | .top-row a:first-child { 30 | overflow: hidden; 31 | text-overflow: ellipsis; 32 | } 33 | 34 | @media (max-width: 640.98px) { 35 | .top-row:not(.auth) { 36 | display: none; 37 | } 38 | 39 | .top-row.auth { 40 | justify-content: space-between; 41 | } 42 | 43 | .top-row a, .top-row .btn-link { 44 | margin-left: 0; 45 | } 46 | } 47 | 48 | @media (min-width: 641px) { 49 | .page { 50 | flex-direction: row; 51 | } 52 | 53 | .sidebar { 54 | width: 250px; 55 | height: 100vh; 56 | position: sticky; 57 | top: 0; 58 | } 59 | 60 | .top-row { 61 | position: sticky; 62 | top: 0; 63 | z-index: 1; 64 | } 65 | 66 | .main > div { 67 | padding-left: 2rem !important; 68 | padding-right: 1.5rem !important; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using System.Net.Http.Json 3 | @using Microsoft.AspNetCore.Components.Forms 4 | @using Microsoft.AspNetCore.Components.Routing 5 | @using Microsoft.AspNetCore.Components.Web 6 | @using Microsoft.AspNetCore.Components.Web.Virtualization 7 | @using Microsoft.AspNetCore.Components.WebAssembly.Http 8 | @using Microsoft.JSInterop 9 | @using DotNetRu.Commune.WasmClient 10 | @using DotNetRu.Commune.WasmClient.Shared 11 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/wwwroot/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Serilog": { 3 | "Using": [ "Serilog.Sinks.BrowserConsole" ], 4 | "MinimumLevel": "Verbose", 5 | "WriteTo": [ 6 | { "Name": "BrowserConsole" } 7 | ], 8 | "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ], 9 | "Properties": { 10 | "Application": "Sample" 11 | } 12 | }, 13 | "AuditSettings":{ 14 | "RepositoryName":"DEMO", 15 | "OriginalOwner":"SelectFromGroup-By" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/wwwroot/css/app.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 | .content { 18 | padding-top: 1.1rem; 19 | } 20 | 21 | .valid.modified:not([type=checkbox]) { 22 | outline: 1px solid #26b050; 23 | } 24 | 25 | .invalid { 26 | outline: 1px solid red; 27 | } 28 | 29 | .validation-message { 30 | color: red; 31 | } 32 | 33 | #blazor-error-ui { 34 | background: lightyellow; 35 | bottom: 0; 36 | box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); 37 | display: none; 38 | left: 0; 39 | padding: 0.6rem 1.25rem 0.7rem 1.25rem; 40 | position: fixed; 41 | width: 100%; 42 | z-index: 1000; 43 | } 44 | 45 | #blazor-error-ui .dismiss { 46 | cursor: pointer; 47 | position: absolute; 48 | right: 0.75rem; 49 | top: 0.5rem; 50 | } 51 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/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 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/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. -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/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 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/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'} -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/wwwroot/css/open-iconic/font/fonts/open-iconic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotNetRu/Commune/fd6377c83b565987f3f71e5ed1def447ae222965/DotNetRu.Commune.WasmClient/wwwroot/css/open-iconic/font/fonts/open-iconic.eot -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/wwwroot/css/open-iconic/font/fonts/open-iconic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotNetRu/Commune/fd6377c83b565987f3f71e5ed1def447ae222965/DotNetRu.Commune.WasmClient/wwwroot/css/open-iconic/font/fonts/open-iconic.otf -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/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 | -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotNetRu/Commune/fd6377c83b565987f3f71e5ed1def447ae222965/DotNetRu.Commune.WasmClient/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/wwwroot/css/open-iconic/font/fonts/open-iconic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotNetRu/Commune/fd6377c83b565987f3f71e5ed1def447ae222965/DotNetRu.Commune.WasmClient/wwwroot/css/open-iconic/font/fonts/open-iconic.woff -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotNetRu/Commune/fd6377c83b565987f3f71e5ed1def447ae222965/DotNetRu.Commune.WasmClient/wwwroot/favicon.ico -------------------------------------------------------------------------------- /DotNetRu.Commune.WasmClient/wwwroot/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | DotNetRu.Commune.WasmClient 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Loading...
16 | 17 |
18 | An unhandled error has occurred. 19 | Reload 20 | 🗙 21 |
22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /DotNetRu.Commune.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetRu.Commune.WasmClient", "DotNetRu.Commune.WasmClient\DotNetRu.Commune.WasmClient.csproj", "{62DA322F-1287-4B9F-B5A6-D262E9BADAB2}" 4 | EndProject 5 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{6632FB11-E205-404B-A564-F7D808E2F98D}" 6 | EndProject 7 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetRu.Commune.Test.WasmClient", "test\DotNetRu.Commune.Test.WasmClient\DotNetRu.Commune.Test.WasmClient.csproj", "{301379D1-48ED-4C60-8A37-F46BAFA1E870}" 8 | EndProject 9 | Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "DotNetRu.Commune.Test.Fs.WasmClient", "test\DotNetRu.Commune.Test.Fs.WasmClient\DotNetRu.Commune.Test.Fs.WasmClient.fsproj", "{16456F52-B529-469D-88D5-D2D668A2B2E3}" 10 | EndProject 11 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetRu.Commune.BizLayer", "DotNetRu.Commune.BizLayer\DotNetRu.Commune.BizLayer.csproj", "{82E6AD6B-6AE5-43BF-8E9E-A46AADB93BAA}" 12 | EndProject 13 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetRu.Commune.GithubFilesystem", "DotNetRu.Commune.GithubFilesystem\DotNetRu.Commune.GithubFilesystem.csproj", "{38F4DEA1-1739-40B6-8FA3-D14377A8FD45}" 14 | EndProject 15 | Global 16 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 17 | Debug|Any CPU = Debug|Any CPU 18 | Release|Any CPU = Release|Any CPU 19 | EndGlobalSection 20 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 21 | {62DA322F-1287-4B9F-B5A6-D262E9BADAB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 22 | {62DA322F-1287-4B9F-B5A6-D262E9BADAB2}.Debug|Any CPU.Build.0 = Debug|Any CPU 23 | {62DA322F-1287-4B9F-B5A6-D262E9BADAB2}.Release|Any CPU.ActiveCfg = Release|Any CPU 24 | {62DA322F-1287-4B9F-B5A6-D262E9BADAB2}.Release|Any CPU.Build.0 = Release|Any CPU 25 | {301379D1-48ED-4C60-8A37-F46BAFA1E870}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 26 | {301379D1-48ED-4C60-8A37-F46BAFA1E870}.Debug|Any CPU.Build.0 = Debug|Any CPU 27 | {301379D1-48ED-4C60-8A37-F46BAFA1E870}.Release|Any CPU.ActiveCfg = Release|Any CPU 28 | {301379D1-48ED-4C60-8A37-F46BAFA1E870}.Release|Any CPU.Build.0 = Release|Any CPU 29 | {16456F52-B529-469D-88D5-D2D668A2B2E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 30 | {16456F52-B529-469D-88D5-D2D668A2B2E3}.Debug|Any CPU.Build.0 = Debug|Any CPU 31 | {16456F52-B529-469D-88D5-D2D668A2B2E3}.Release|Any CPU.ActiveCfg = Release|Any CPU 32 | {16456F52-B529-469D-88D5-D2D668A2B2E3}.Release|Any CPU.Build.0 = Release|Any CPU 33 | {38F4DEA1-1739-40B6-8FA3-D14377A8FD45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 34 | {38F4DEA1-1739-40B6-8FA3-D14377A8FD45}.Debug|Any CPU.Build.0 = Debug|Any CPU 35 | {38F4DEA1-1739-40B6-8FA3-D14377A8FD45}.Release|Any CPU.ActiveCfg = Release|Any CPU 36 | {38F4DEA1-1739-40B6-8FA3-D14377A8FD45}.Release|Any CPU.Build.0 = Release|Any CPU 37 | {82E6AD6B-6AE5-43BF-8E9E-A46AADB93BAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 38 | {82E6AD6B-6AE5-43BF-8E9E-A46AADB93BAA}.Debug|Any CPU.Build.0 = Debug|Any CPU 39 | {82E6AD6B-6AE5-43BF-8E9E-A46AADB93BAA}.Release|Any CPU.ActiveCfg = Release|Any CPU 40 | {82E6AD6B-6AE5-43BF-8E9E-A46AADB93BAA}.Release|Any CPU.Build.0 = Release|Any CPU 41 | EndGlobalSection 42 | GlobalSection(NestedProjects) = preSolution 43 | {301379D1-48ED-4C60-8A37-F46BAFA1E870} = {6632FB11-E205-404B-A564-F7D808E2F98D} 44 | {16456F52-B529-469D-88D5-D2D668A2B2E3} = {6632FB11-E205-404B-A564-F7D808E2F98D} 45 | EndGlobalSection 46 | EndGlobal 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 DotNetRu 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 | # DotNetRu.Commune 2 | ![CI status](https://github.com/DotNetRu/Commune/actions/workflows/main.yml/badge.svg) 3 | [![codecov](https://codecov.io/gh/DotNetRu/Commune/branch/master/graph/badge.svg)](https://codecov.io/gh/DotNetRu/Commune) 4 | 5 | DotNetRu Commune - продукт семейства DotNetRu, обеспечивающий кроссплатформенный, serverless доустп к [Аудиту](https://github.com/DotNetRu/Audit) с целью удобного метода добавления и редактирования митапов. 6 | 7 | # Цели 8 | 9 | [Аудит](https://github.com/DotNetRu/Audit) является централизованным хранилищем всей информации о прошедших митапах всех сообществ DotNetRu. Данные в Аудите сохранены в формате связанных XML файлов. Их ручное редактирование чревато ошибками и нарушениями формата. 10 | 11 | Цель проекта DotNetRu Commune - обеспечить возможность редактирования Аудита без необходимости обращаться к GitHub-репозиторию [Аудита](https://github.com/DotNetRu/Audit) прямиком из браузера. В процессе редактирования поддерживается целостность данных и соответствие [форматам хранения](https://github.com/DotNetRu/Audit/tree/master/schemas) 12 | 13 | Последняя версия DotNetRu Commune всегда развернута на [общедоступном веб-сервере](https://dotnetru.github.io/Commune). 14 | 15 | # Связанные проекты 16 | 17 | ## Аудит 18 | 19 | Единое хранилище информации о митапах, площадках, спикерах и докладах. Реализовано как набор XML файлов в [GitHub репозитории](https://github.com/DotNetRu/Audit). 20 | 21 | # Текущее состояние и планы 22 | 23 | В настоящее время DotNetRu Commune имеет настроенный CI/CD и реализованные инфраструктурные фичи. 24 | 25 | # Дальнейшие планы (обсуждаемо) 26 | 27 | - Разработать это прекрасное приложение 28 | - ... 29 | -------------------------------------------------------------------------------- /test/DotNetRu.Commune.Test.Fs.WasmClient/BizLayerServiceRegistryFsTests.fs: -------------------------------------------------------------------------------- 1 | namespace DotNetRu.Commune.Test.Fs.WasmClient 2 | 3 | open System 4 | open DotNetRu.Commune.WasmClient 5 | open Xunit 6 | 7 | type BizLayerServiceRegistryFsTests() = 8 | [] 9 | let ``AddBizLogic when ServiceCollection is null Throws ArgumentNullException`` () = 10 | Assert.Throws(fun() -> BizLayerServiceRegistry.AddBizLogic(null) |> ignore) 11 | -------------------------------------------------------------------------------- /test/DotNetRu.Commune.Test.Fs.WasmClient/DotNetRu.Commune.Test.Fs.WasmClient.fsproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 6 | false 7 | false 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | runtime; build; native; contentfiles; analyzers; buildtransitive 20 | all 21 | 22 | 23 | runtime; build; native; contentfiles; analyzers; buildtransitive 24 | all 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /test/DotNetRu.Commune.Test.Fs.WasmClient/Program.fs: -------------------------------------------------------------------------------- 1 | module Program = let [] main _ = 0 2 | 3 | -------------------------------------------------------------------------------- /test/DotNetRu.Commune.Test.WasmClient/BizLayerServiceRegistryTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using DotNetRu.Commune.WasmClient; 3 | using Xunit; 4 | 5 | namespace DotNetRu.Commune.Test.WasmClient 6 | { 7 | public class BizLayerServiceRegistryTests 8 | { 9 | [Fact] 10 | public void AddBizLogic_WhenServiceCollectionIsNull_ThrowsArgumentNullException() 11 | { 12 | Assert.Throws(() => BizLayerServiceRegistry.AddBizLogic(null!)); 13 | } 14 | 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /test/DotNetRu.Commune.Test.WasmClient/DotNetRu.Commune.Test.WasmClient.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 6 | false 7 | 8 | 9 | 10 | 11 | 12 | 13 | runtime; build; native; contentfiles; analyzers; buildtransitive 14 | all 15 | 16 | 17 | runtime; build; native; contentfiles; analyzers; buildtransitive 18 | all 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | --------------------------------------------------------------------------------