make meetings
This commit is contained in:
		
							
								
								
									
										477
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										477
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,477 @@ | ||||
| ## Ignore Visual Studio temporary files, build results, and | ||||
| ## files generated by popular Visual Studio add-ons. | ||||
| ## | ||||
| ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore | ||||
|  | ||||
| # User-specific files | ||||
| *.rsuser | ||||
| *.suo | ||||
| *.user | ||||
| *.userosscache | ||||
| *.sln.docstates | ||||
|  | ||||
| # User-specific files (MonoDevelop/Xamarin Studio) | ||||
| *.userprefs | ||||
|  | ||||
| # Mono auto generated files | ||||
| mono_crash.* | ||||
|  | ||||
| # Build results | ||||
| [Dd]ebug/ | ||||
| [Dd]ebugPublic/ | ||||
| [Rr]elease/ | ||||
| [Rr]eleases/ | ||||
| x64/ | ||||
| x86/ | ||||
| [Ww][Ii][Nn]32/ | ||||
| [Aa][Rr][Mm]/ | ||||
| [Aa][Rr][Mm]64/ | ||||
| bld/ | ||||
| [Bb]in/ | ||||
| [Oo]bj/ | ||||
| [Ll]og/ | ||||
| [Ll]ogs/ | ||||
|  | ||||
| # Visual Studio 2015/2017 cache/options directory | ||||
| .vs/ | ||||
| # Uncomment if you have tasks that create the project's static files in wwwroot | ||||
| #wwwroot/ | ||||
|  | ||||
| # Visual Studio 2017 auto generated files | ||||
| Generated\ Files/ | ||||
|  | ||||
| # MSTest test Results | ||||
| [Tt]est[Rr]esult*/ | ||||
| [Bb]uild[Ll]og.* | ||||
|  | ||||
| # NUnit | ||||
| *.VisualState.xml | ||||
| TestResult.xml | ||||
| nunit-*.xml | ||||
|  | ||||
| # Build Results of an ATL Project | ||||
| [Dd]ebugPS/ | ||||
| [Rr]eleasePS/ | ||||
| dlldata.c | ||||
|  | ||||
| # Benchmark Results | ||||
| BenchmarkDotNet.Artifacts/ | ||||
|  | ||||
| # .NET | ||||
| project.lock.json | ||||
| project.fragment.lock.json | ||||
| artifacts/ | ||||
|  | ||||
| # Tye | ||||
| .tye/ | ||||
|  | ||||
| # ASP.NET Scaffolding | ||||
| ScaffoldingReadMe.txt | ||||
|  | ||||
| # StyleCop | ||||
| StyleCopReport.xml | ||||
|  | ||||
| # Files built by Visual Studio | ||||
| *_i.c | ||||
| *_p.c | ||||
| *_h.h | ||||
| *.ilk | ||||
| *.meta | ||||
| *.obj | ||||
| *.iobj | ||||
| *.pch | ||||
| *.pdb | ||||
| *.ipdb | ||||
| *.pgc | ||||
| *.pgd | ||||
| *.rsp | ||||
| *.sbr | ||||
| *.tlb | ||||
| *.tli | ||||
| *.tlh | ||||
| *.tmp | ||||
| *.tmp_proj | ||||
| *_wpftmp.csproj | ||||
| *.log | ||||
| *.tlog | ||||
| *.vspscc | ||||
| *.vssscc | ||||
| .builds | ||||
| *.pidb | ||||
| *.svclog | ||||
| *.scc | ||||
|  | ||||
| # Chutzpah Test files | ||||
| _Chutzpah* | ||||
|  | ||||
| # Visual C++ cache files | ||||
| ipch/ | ||||
| *.aps | ||||
| *.ncb | ||||
| *.opendb | ||||
| *.opensdf | ||||
| *.sdf | ||||
| *.cachefile | ||||
| *.VC.db | ||||
| *.VC.VC.opendb | ||||
|  | ||||
| # Visual Studio profiler | ||||
| *.psess | ||||
| *.vsp | ||||
| *.vspx | ||||
| *.sap | ||||
|  | ||||
| # Visual Studio Trace Files | ||||
| *.e2e | ||||
|  | ||||
| # TFS 2012 Local Workspace | ||||
| $tf/ | ||||
|  | ||||
| # Guidance Automation Toolkit | ||||
| *.gpState | ||||
|  | ||||
| # ReSharper is a .NET coding add-in | ||||
| _ReSharper*/ | ||||
| *.[Rr]e[Ss]harper | ||||
| *.DotSettings.user | ||||
|  | ||||
| # TeamCity is a build add-in | ||||
| _TeamCity* | ||||
|  | ||||
| # DotCover is a Code Coverage Tool | ||||
| *.dotCover | ||||
|  | ||||
| # AxoCover is a Code Coverage Tool | ||||
| .axoCover/* | ||||
| !.axoCover/settings.json | ||||
|  | ||||
| # Coverlet is a free, cross platform Code Coverage Tool | ||||
| coverage*.json | ||||
| coverage*.xml | ||||
| coverage*.info | ||||
|  | ||||
| # Visual Studio code coverage results | ||||
| *.coverage | ||||
| *.coveragexml | ||||
|  | ||||
| # NCrunch | ||||
| _NCrunch_* | ||||
| .*crunch*.local.xml | ||||
| nCrunchTemp_* | ||||
|  | ||||
| # MightyMoose | ||||
| *.mm.* | ||||
| AutoTest.Net/ | ||||
|  | ||||
| # Web workbench (sass) | ||||
| .sass-cache/ | ||||
|  | ||||
| # Installshield output folder | ||||
| [Ee]xpress/ | ||||
|  | ||||
| # DocProject is a documentation generator add-in | ||||
| DocProject/buildhelp/ | ||||
| DocProject/Help/*.HxT | ||||
| DocProject/Help/*.HxC | ||||
| DocProject/Help/*.hhc | ||||
| DocProject/Help/*.hhk | ||||
| DocProject/Help/*.hhp | ||||
| DocProject/Help/Html2 | ||||
| DocProject/Help/html | ||||
|  | ||||
| # Click-Once directory | ||||
| publish/ | ||||
|  | ||||
| # Publish Web Output | ||||
| *.[Pp]ublish.xml | ||||
| *.azurePubxml | ||||
| # Note: Comment the next line if you want to checkin your web deploy settings, | ||||
| # but database connection strings (with potential passwords) will be unencrypted | ||||
| *.pubxml | ||||
| *.publishproj | ||||
|  | ||||
| # Microsoft Azure Web App publish settings. Comment the next line if you want to | ||||
| # checkin your Azure Web App publish settings, but sensitive information contained | ||||
| # in these scripts will be unencrypted | ||||
| PublishScripts/ | ||||
|  | ||||
| # NuGet Packages | ||||
| *.nupkg | ||||
| # NuGet Symbol Packages | ||||
| *.snupkg | ||||
| # The packages folder can be ignored because of Package Restore | ||||
| **/[Pp]ackages/* | ||||
| # except build/, which is used as an MSBuild target. | ||||
| !**/[Pp]ackages/build/ | ||||
| # Uncomment if necessary however generally it will be regenerated when needed | ||||
| #!**/[Pp]ackages/repositories.config | ||||
| # NuGet v3's project.json files produces more ignorable files | ||||
| *.nuget.props | ||||
| *.nuget.targets | ||||
|  | ||||
| # Microsoft Azure Build Output | ||||
| csx/ | ||||
| *.build.csdef | ||||
|  | ||||
| # Microsoft Azure Emulator | ||||
| ecf/ | ||||
| rcf/ | ||||
|  | ||||
| # Windows Store app package directories and files | ||||
| AppPackages/ | ||||
| BundleArtifacts/ | ||||
| Package.StoreAssociation.xml | ||||
| _pkginfo.txt | ||||
| *.appx | ||||
| *.appxbundle | ||||
| *.appxupload | ||||
|  | ||||
| # Visual Studio cache files | ||||
| # files ending in .cache can be ignored | ||||
| *.[Cc]ache | ||||
| # but keep track of directories ending in .cache | ||||
| !?*.[Cc]ache/ | ||||
|  | ||||
| # Others | ||||
| ClientBin/ | ||||
| ~$* | ||||
| *~ | ||||
| *.dbmdl | ||||
| *.dbproj.schemaview | ||||
| *.jfm | ||||
| *.pfx | ||||
| *.publishsettings | ||||
| orleans.codegen.cs | ||||
|  | ||||
| # Including strong name files can present a security risk | ||||
| # (https://github.com/github/gitignore/pull/2483#issue-259490424) | ||||
| #*.snk | ||||
|  | ||||
| # Since there are multiple workflows, uncomment next line to ignore bower_components | ||||
| # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) | ||||
| #bower_components/ | ||||
|  | ||||
| # RIA/Silverlight projects | ||||
| Generated_Code/ | ||||
|  | ||||
| # Backup & report files from converting an old project file | ||||
| # to a newer Visual Studio version. Backup files are not needed, | ||||
| # because we have git ;-) | ||||
| _UpgradeReport_Files/ | ||||
| Backup*/ | ||||
| UpgradeLog*.XML | ||||
| UpgradeLog*.htm | ||||
| ServiceFabricBackup/ | ||||
| *.rptproj.bak | ||||
|  | ||||
| # SQL Server files | ||||
| *.mdf | ||||
| *.ldf | ||||
| *.ndf | ||||
|  | ||||
| # Business Intelligence projects | ||||
| *.rdl.data | ||||
| *.bim.layout | ||||
| *.bim_*.settings | ||||
| *.rptproj.rsuser | ||||
| *- [Bb]ackup.rdl | ||||
| *- [Bb]ackup ([0-9]).rdl | ||||
| *- [Bb]ackup ([0-9][0-9]).rdl | ||||
|  | ||||
| # Microsoft Fakes | ||||
| FakesAssemblies/ | ||||
|  | ||||
| # GhostDoc plugin setting file | ||||
| *.GhostDoc.xml | ||||
|  | ||||
| # Node.js Tools for Visual Studio | ||||
| .ntvs_analysis.dat | ||||
| node_modules/ | ||||
|  | ||||
| # Visual Studio 6 build log | ||||
| *.plg | ||||
|  | ||||
| # Visual Studio 6 workspace options file | ||||
| *.opt | ||||
|  | ||||
| # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) | ||||
| *.vbw | ||||
|  | ||||
| # Visual Studio 6 auto-generated project file (contains which files were open etc.) | ||||
| *.vbp | ||||
|  | ||||
| # Visual Studio 6 workspace and project file (working project files containing files to include in project) | ||||
| *.dsw | ||||
| *.dsp | ||||
|  | ||||
| # Visual Studio 6 technical files | ||||
| *.ncb | ||||
| *.aps | ||||
|  | ||||
| # Visual Studio LightSwitch build output | ||||
| **/*.HTMLClient/GeneratedArtifacts | ||||
| **/*.DesktopClient/GeneratedArtifacts | ||||
| **/*.DesktopClient/ModelManifest.xml | ||||
| **/*.Server/GeneratedArtifacts | ||||
| **/*.Server/ModelManifest.xml | ||||
| _Pvt_Extensions | ||||
|  | ||||
| # Paket dependency manager | ||||
| .paket/paket.exe | ||||
| paket-files/ | ||||
|  | ||||
| # FAKE - F# Make | ||||
| .fake/ | ||||
|  | ||||
| # CodeRush personal settings | ||||
| .cr/personal | ||||
|  | ||||
| # Python Tools for Visual Studio (PTVS) | ||||
| __pycache__/ | ||||
| *.pyc | ||||
|  | ||||
| # Cake - Uncomment if you are using it | ||||
| # tools/** | ||||
| # !tools/packages.config | ||||
|  | ||||
| # Tabs Studio | ||||
| *.tss | ||||
|  | ||||
| # Telerik's JustMock configuration file | ||||
| *.jmconfig | ||||
|  | ||||
| # BizTalk build output | ||||
| *.btp.cs | ||||
| *.btm.cs | ||||
| *.odx.cs | ||||
| *.xsd.cs | ||||
|  | ||||
| # OpenCover UI analysis results | ||||
| OpenCover/ | ||||
|  | ||||
| # Azure Stream Analytics local run output | ||||
| ASALocalRun/ | ||||
|  | ||||
| # MSBuild Binary and Structured Log | ||||
| *.binlog | ||||
|  | ||||
| # NVidia Nsight GPU debugger configuration file | ||||
| *.nvuser | ||||
|  | ||||
| # MFractors (Xamarin productivity tool) working folder | ||||
| .mfractor/ | ||||
|  | ||||
| # Local History for Visual Studio | ||||
| .localhistory/ | ||||
|  | ||||
| # Visual Studio History (VSHistory) files | ||||
| .vshistory/ | ||||
|  | ||||
| # BeatPulse healthcheck temp database | ||||
| healthchecksdb | ||||
|  | ||||
| # Backup folder for Package Reference Convert tool in Visual Studio 2017 | ||||
| MigrationBackup/ | ||||
|  | ||||
| # Ionide (cross platform F# VS Code tools) working folder | ||||
| .ionide/ | ||||
|  | ||||
| # Fody - auto-generated XML schema | ||||
| FodyWeavers.xsd | ||||
|  | ||||
| # VS Code files for those working on multiple tools | ||||
| .vscode/* | ||||
| !.vscode/settings.json | ||||
| !.vscode/tasks.json | ||||
| !.vscode/launch.json | ||||
| !.vscode/extensions.json | ||||
| *.code-workspace | ||||
|  | ||||
| # Local History for Visual Studio Code | ||||
| .history/ | ||||
|  | ||||
| # Windows Installer files from build outputs | ||||
| *.cab | ||||
| *.msi | ||||
| *.msix | ||||
| *.msm | ||||
| *.msp | ||||
|  | ||||
| # JetBrains Rider | ||||
| *.sln.iml | ||||
|  | ||||
| ## | ||||
| ## Visual studio for Mac | ||||
| ## | ||||
|  | ||||
|  | ||||
| # globs | ||||
| Makefile.in | ||||
| *.userprefs | ||||
| *.usertasks | ||||
| config.make | ||||
| config.status | ||||
| aclocal.m4 | ||||
| install-sh | ||||
| autom4te.cache/ | ||||
| *.tar.gz | ||||
| tarballs/ | ||||
| test-results/ | ||||
|  | ||||
| # Mac bundle stuff | ||||
| *.dmg | ||||
| *.app | ||||
|  | ||||
| # content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore | ||||
| # General | ||||
| .DS_Store | ||||
| .AppleDouble | ||||
| .LSOverride | ||||
|  | ||||
| # Icon must end with two \r | ||||
| Icon | ||||
|  | ||||
|  | ||||
| # Thumbnails | ||||
| ._* | ||||
|  | ||||
| # Files that might appear in the root of a volume | ||||
| .DocumentRevisions-V100 | ||||
| .fseventsd | ||||
| .Spotlight-V100 | ||||
| .TemporaryItems | ||||
| .Trashes | ||||
| .VolumeIcon.icns | ||||
| .com.apple.timemachine.donotpresent | ||||
|  | ||||
| # Directories potentially created on remote AFP share | ||||
| .AppleDB | ||||
| .AppleDesktop | ||||
| Network Trash Folder | ||||
| Temporary Items | ||||
| .apdisk | ||||
|  | ||||
| # content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore | ||||
| # Windows thumbnail cache files | ||||
| Thumbs.db | ||||
| ehthumbs.db | ||||
| ehthumbs_vista.db | ||||
|  | ||||
| # Dump file | ||||
| *.stackdump | ||||
|  | ||||
| # Folder config file | ||||
| [Dd]esktop.ini | ||||
|  | ||||
| # Recycle Bin used on file shares | ||||
| $RECYCLE.BIN/ | ||||
|  | ||||
| # Windows Installer files | ||||
| *.cab | ||||
| *.msi | ||||
| *.msix | ||||
| *.msm | ||||
| *.msp | ||||
|  | ||||
| # Windows shortcuts | ||||
| *.lnk | ||||
							
								
								
									
										144
									
								
								Controllers/UserController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								Controllers/UserController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,144 @@ | ||||
| using System.IdentityModel.Tokens.Jwt; | ||||
| using Mapster; | ||||
| using Microsoft.AspNetCore.Authentication; | ||||
| using Microsoft.AspNetCore.Authentication.Google; | ||||
| using Microsoft.AspNetCore.Authentication.JwtBearer; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using Microsoft.IdentityModel.Tokens; | ||||
|  | ||||
| namespace CyberBoom.Controllers; | ||||
|  | ||||
| [ApiController] | ||||
| [Route("[controller]")] | ||||
| public class UserController : ControllerBase | ||||
| { | ||||
|     private static readonly string[] Summaries = new[] | ||||
|     { | ||||
|         "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" | ||||
|     }; | ||||
|  | ||||
|     private readonly ILogger<UserController> _logger; | ||||
|  | ||||
|     private readonly ApplicationContext _applicationContext; | ||||
|  | ||||
|     public UserController(ILogger<UserController> logger, ApplicationContext applicationContext) | ||||
|     { | ||||
|         _logger = logger; | ||||
|         _applicationContext = applicationContext; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     // [HttpGet("google-auth")] | ||||
|     // public IActionResult Regiester() | ||||
|     // { | ||||
|     //     var properties = new AuthenticationProperties{ | ||||
|     //         RedirectUri = Url.Action("GoogleResponse") | ||||
|     //     }; | ||||
|     //     return Challenge(properties, GoogleDefaults.AuthenticationScheme); | ||||
|     // } | ||||
|  | ||||
|     // [Route("google-response")] | ||||
|     // public async Task<IActionResult> GoogleResponse() | ||||
|     // { | ||||
|     //     var result = await HttpContext.AuthenticateAsync(JwtBearerDefaults.AuthenticationScheme); | ||||
|  | ||||
|     //     var claims = result?.Principal?.Identities.First().Claims; | ||||
|     //     var jwt = new JwtSecurityToken( | ||||
|     //         issuer: AuthOptions.ISSUER, | ||||
|     //         audience: AuthOptions.AUDIENCE, | ||||
|     //         claims: claims, | ||||
|     //         expires: DateTime.UtcNow.Add(TimeSpan.FromMinutes(2)), | ||||
|     //         signingCredentials: new SigningCredentials(AuthOptions.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256)); | ||||
|              | ||||
|     //     var strJwt = new JwtSecurityTokenHandler().WriteToken(jwt); | ||||
|  | ||||
|     //     return Ok(new { | ||||
|     //         Token = strJwt | ||||
|     //     }); | ||||
|     // } | ||||
|  | ||||
|     [HttpGet] | ||||
|     public IEnumerable<WeatherForecast> Get() | ||||
|     { | ||||
|         return Enumerable.Range(1, 5).Select(index => new WeatherForecast | ||||
|         { | ||||
|             Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), | ||||
|             TemperatureC = Random.Shared.Next(-20, 55), | ||||
|             Summary = Summaries[Random.Shared.Next(Summaries.Length)] | ||||
|         }) | ||||
|         .ToArray(); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| [ApiController] | ||||
| [Route("[controller]")] | ||||
| public class MeetingController : ControllerBase | ||||
| { | ||||
|     private static readonly string[] Summaries = new[] | ||||
|     { | ||||
|         "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" | ||||
|     }; | ||||
|  | ||||
|     private readonly ILogger<UserController> _logger; | ||||
|  | ||||
|     private readonly ApplicationContext _applicationContext; | ||||
|  | ||||
|     public MeetingController(ILogger<UserController> logger, ApplicationContext applicationContext) | ||||
|     { | ||||
|         _logger = logger; | ||||
|         _applicationContext = applicationContext; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     [HttpPost] | ||||
|     public async Task<IActionResult> Post([FromForm]PostMeetingDto meeting) | ||||
|     { | ||||
|         await meeting.SpeackerImage.WriteFileToDirectory(); | ||||
|         var meetingWrite = meeting.Adapt<Meeting>(); | ||||
|         meetingWrite.SpeackerImage = meeting.SpeackerImage.JoinFileNames(); | ||||
|         meetingWrite.Splecializations = meeting.Splecializations.JoinStrings(); | ||||
|         await _applicationContext.Meetings.AddAsync(meetingWrite); | ||||
|  | ||||
|         await _applicationContext.SaveChangesAsync(); | ||||
|  | ||||
|          | ||||
|         return Ok(new { | ||||
|             meetingWrite.Id | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     [HttpPut] | ||||
|     public async Task<IActionResult> Put([FromForm]PutMeetingDto meeting) | ||||
|     { | ||||
|         await meeting.SpeackerImage.WriteFileToDirectory(); | ||||
|         var meetingWrite = meeting.Adapt<Meeting>(); | ||||
|         meetingWrite.SpeackerImage = meeting.SpeackerImage.JoinFileNames(); | ||||
|         meetingWrite.Splecializations = meeting.Splecializations.JoinStrings(); | ||||
|         var findedMeeting = await _applicationContext.Meetings.FirstAsync<Meeting>(s => s.Id == meeting.Id); | ||||
|         findedMeeting = meetingWrite; | ||||
|  | ||||
|         await _applicationContext.SaveChangesAsync(); | ||||
|         return Ok(); | ||||
|     } | ||||
|  | ||||
|     [HttpGet] | ||||
|     public async Task<IActionResult> Get(int id) | ||||
|     { | ||||
|         var meeting = await _applicationContext.Meetings.FirstOrDefaultAsync(s => s.Id == id); | ||||
|  | ||||
|          | ||||
|         return Ok(meeting); | ||||
|     } | ||||
|  | ||||
|      | ||||
|     [HttpGet("/list")] | ||||
|     public IActionResult GetList(int offset, int limit) | ||||
|     { | ||||
|         var meetings = _applicationContext.Meetings.Skip(offset).Take(limit); | ||||
|  | ||||
|          | ||||
|         return Ok(meetings); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										23
									
								
								CyberBoom.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								CyberBoom.csproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk.Web"> | ||||
|  | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net7.0</TargetFramework> | ||||
|     <Nullable>enable</Nullable> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <UserSecretsId>c28ad338-c527-4b98-b9a4-12b66b1a02dc</UserSecretsId> | ||||
|     <UseAppHost>false</UseAppHost> | ||||
|   </PropertyGroup> | ||||
|  | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="Mapster" Version="7.4.0" /> | ||||
|     <PackageReference Include="Microsoft.AspNetCore.Authentication.Google" Version="7.0.14" /> | ||||
|     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.14" /> | ||||
|     <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="7.0.14" /> | ||||
|     <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="7.0.14" /> | ||||
|     <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.3" /> | ||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.14" /> | ||||
|     <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.11" /> | ||||
|     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" /> | ||||
|   </ItemGroup> | ||||
|  | ||||
| </Project> | ||||
							
								
								
									
										25
									
								
								CyberBoom.sln
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								CyberBoom.sln
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
|  | ||||
| Microsoft Visual Studio Solution File, Format Version 12.00 | ||||
| # Visual Studio Version 17 | ||||
| VisualStudioVersion = 17.5.002.0 | ||||
| MinimumVisualStudioVersion = 10.0.40219.1 | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CyberBoom", "CyberBoom.csproj", "{A8F9D7D8-DDA5-479B-8735-00E706A5827F}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|Any CPU = Debug|Any CPU | ||||
| 		Release|Any CPU = Release|Any CPU | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||
| 		{A8F9D7D8-DDA5-479B-8735-00E706A5827F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{A8F9D7D8-DDA5-479B-8735-00E706A5827F}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{A8F9D7D8-DDA5-479B-8735-00E706A5827F}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{A8F9D7D8-DDA5-479B-8735-00E706A5827F}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ExtensibilityGlobals) = postSolution | ||||
| 		SolutionGuid = {674E1E42-AF3F-4DDA-A4F1-EDD84025DB24} | ||||
| 	EndGlobalSection | ||||
| EndGlobal | ||||
							
								
								
									
										75
									
								
								DbContext/User.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								DbContext/User.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | ||||
| using Microsoft.AspNetCore.Identity; | ||||
| using Microsoft.AspNetCore.Identity.EntityFrameworkCore; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
|  | ||||
| public class User : IdentityUser | ||||
| { | ||||
|      | ||||
| } | ||||
|  | ||||
| public class PostMeetingDto | ||||
| { | ||||
|     public DateTime Time { get; set; } | ||||
|  | ||||
|     public string Title { get; set; } = null!; | ||||
|  | ||||
|     public string Theme { get; set; } = null!; | ||||
|  | ||||
|     public string SpeakerName { get; set; } = null!; | ||||
|  | ||||
|     public IEnumerable<IFormFile> SpeackerImage { get; set; } = null!; | ||||
|  | ||||
|     public IEnumerable<string> Splecializations { get; set; } = null!; | ||||
| } | ||||
|  | ||||
|  | ||||
| public class PutMeetingDto | ||||
| { | ||||
|     public long Id { get; set; } | ||||
|  | ||||
|     public DateTime Time { get; set; } | ||||
|  | ||||
|     public string Title { get; set; } = null!; | ||||
|  | ||||
|     public string Theme { get; set; } = null!; | ||||
|  | ||||
|     public string SpeakerName { get; set; } = null!; | ||||
|  | ||||
|     public IEnumerable<IFormFile> SpeackerImage { get; set; } = null!; | ||||
|  | ||||
|     public IEnumerable<string> Splecializations { get; set; } = null!; | ||||
| } | ||||
|  | ||||
| public class Meeting | ||||
| { | ||||
|     public long Id { get; set; } | ||||
|  | ||||
|     public DateTime Time { get; set; } | ||||
|  | ||||
|     public string Title { get; set; } = null!; | ||||
|  | ||||
|     public string Theme { get; set; } = null!; | ||||
|  | ||||
|     public string SpeakerName { get; set; } = null!; | ||||
|  | ||||
|     public string SpeackerImage { get; set; } = null!; | ||||
|  | ||||
|     public string Splecializations { get; set; } = null!; | ||||
| } | ||||
|  | ||||
|  | ||||
| public class ApplicationContext : IdentityDbContext<User> | ||||
| { | ||||
|     public DbSet<Meeting> Meetings { get; set; } | ||||
|     public ApplicationContext(DbContextOptions<ApplicationContext> options) | ||||
|         : base(options) | ||||
|     { | ||||
|         Database.EnsureCreated(); | ||||
|     } | ||||
|  | ||||
|     protected override void OnModelCreating(ModelBuilder builder) | ||||
|     { | ||||
|         base.OnModelCreating(builder); | ||||
|         builder.Entity<Meeting>(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										128
									
								
								Program.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								Program.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,128 @@ | ||||
| using System.Text; | ||||
| using Microsoft.AspNetCore.Authentication.JwtBearer; | ||||
| using Microsoft.AspNetCore.Identity; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using Microsoft.IdentityModel.Tokens; | ||||
| using Mapster; | ||||
| using static Consts; | ||||
|  | ||||
|  | ||||
| TypeAdapterConfig<PutMeetingDto, Meeting>.NewConfig().Map(d => d.SpeackerImage, s => s.SpeackerImage.JoinFileNames());  | ||||
| TypeAdapterConfig<PostMeetingDto, Meeting>.NewConfig().Map(d => d.SpeackerImage, s => s.SpeackerImage.JoinFileNames()); | ||||
|  | ||||
|  | ||||
| TypeAdapterConfig<PostMeetingDto, Meeting>.NewConfig().Map(d => d.Splecializations, s => String.Join(FILES_SEPORATOR_IN_STORE, s.Splecializations)); | ||||
|  | ||||
| TypeAdapterConfig<PutMeetingDto, Meeting>.NewConfig().Map(d => d.Splecializations, s => String.Join(FILES_SEPORATOR_IN_STORE, s.Splecializations)); | ||||
|  | ||||
|  | ||||
| TypeAdapterConfig<PostMeetingDto, Meeting>.NewConfig().Map(d => d.Time, s => s.Time.ToUniversalTime()); | ||||
|  | ||||
| TypeAdapterConfig<PutMeetingDto, Meeting>.NewConfig().Map(d => d.Time, s => s.Time.ToUniversalTime()); | ||||
|  | ||||
| var builder = WebApplication.CreateBuilder(args); | ||||
| var configuration = builder.Configuration; | ||||
|  | ||||
| // Add services to the container. | ||||
| builder.Services.AddDbContext<ApplicationContext>(options => | ||||
|                 options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"))); | ||||
|  | ||||
| builder.Services.AddIdentity<User, IdentityRole>() | ||||
| .AddEntityFrameworkStores<ApplicationContext>(); | ||||
|  | ||||
| builder.Services.AddAuthorization(); | ||||
| builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) | ||||
|  .AddJwtBearer(options => | ||||
|     { | ||||
|         options.TokenValidationParameters = new TokenValidationParameters | ||||
|         { | ||||
|             // указывает, будет ли валидироваться издатель при валидации токена | ||||
|             ValidateIssuer = true, | ||||
|             // строка, представляющая издателя | ||||
|             ValidIssuer = AuthOptions.ISSUER, | ||||
|             // будет ли валидироваться потребитель токена | ||||
|             ValidateAudience = true, | ||||
|             // установка потребителя токена | ||||
|             ValidAudience = AuthOptions.AUDIENCE, | ||||
|             // будет ли валидироваться время существования | ||||
|             ValidateLifetime = true, | ||||
|             // установка ключа безопасности | ||||
|             IssuerSigningKey = AuthOptions.GetSymmetricSecurityKey(), | ||||
|             // валидация ключа безопасности | ||||
|             ValidateIssuerSigningKey = true, | ||||
|          }; | ||||
|     }) | ||||
| .AddGoogle(googleOptions => | ||||
| { | ||||
|     googleOptions.ClientId = configuration["Authentication:Google:ClientId"] ?? throw new NullReferenceException(""); | ||||
|     googleOptions.ClientSecret = configuration["Authentication:Google:ClientSecret"] ?? throw new NullReferenceException(""); | ||||
| }); | ||||
|  | ||||
| // builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) | ||||
| //     .AddEntityFrameworkStores<ApplicationContext>(); | ||||
| // builder.Services.AddRazorPages(); | ||||
|  | ||||
|  | ||||
|  | ||||
| builder.Services.AddControllers(); | ||||
| // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | ||||
| builder.Services.AddEndpointsApiExplorer(); | ||||
| builder.Services.AddSwaggerGen(); | ||||
|  | ||||
| var app = builder.Build(); | ||||
|  | ||||
| app.UseHttpsRedirection(); | ||||
|  | ||||
| // Configure the HTTP request pipeline. | ||||
| if (app.Environment.IsDevelopment()) | ||||
| { | ||||
|     app.UseSwagger(); | ||||
|     app.UseSwaggerUI(); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| app.UseAuthentication();    // подключение аутентификации | ||||
| app.UseAuthorization(); | ||||
|  | ||||
|  | ||||
|  | ||||
| app.MapControllers(); | ||||
| //app.MapRazorPages(); | ||||
|  | ||||
| app.Run(); | ||||
|  | ||||
| public class AuthOptions | ||||
| { | ||||
|     public const string ISSUER = "MyAuthServer"; // издатель токена | ||||
|     public const string AUDIENCE = "MyAuthClient"; // потребитель токена | ||||
|     const string KEY = "mysupersecret_secretkey!123";   // ключ для шифрации | ||||
|     public static SymmetricSecurityKey GetSymmetricSecurityKey() =>  | ||||
|         new SymmetricSecurityKey(Encoding.UTF8.GetBytes(KEY)); | ||||
| } | ||||
|  | ||||
| public static class Consts | ||||
| { | ||||
|     public const char FILES_SEPORATOR_IN_STORE = ';'; | ||||
| } | ||||
| public static class PhileDataHelpers | ||||
| { | ||||
|     public static string JoinFileNames(this IEnumerable<IFormFile> files) => files.Select(s => s.FileName).JoinStrings(); | ||||
|  | ||||
|     public static string JoinStrings(this IEnumerable<string> files) => String.Join(FILES_SEPORATOR_IN_STORE, files.Select(s => s)); | ||||
|  | ||||
|  | ||||
|     public static async Task WriteFileToDirectory(this IEnumerable<IFormFile> files) | ||||
|     { | ||||
|         var dir = Directory.CreateDirectory("cyber-boom-files"); | ||||
|          | ||||
|         foreach(var file in files) | ||||
|         { | ||||
|             var readStream = file.OpenReadStream(); | ||||
|             var memstream = new MemoryStream(); | ||||
|             await readStream.CopyToAsync(memstream); | ||||
|             await File.WriteAllBytesAsync(Path.Combine(dir.FullName, file.FileName), memstream.ToArray()); | ||||
|         } | ||||
|          | ||||
|     } | ||||
| } | ||||
							
								
								
									
										31
									
								
								Properties/launchSettings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								Properties/launchSettings.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| { | ||||
|   "$schema": "https://json.schemastore.org/launchsettings.json", | ||||
|   "iisSettings": { | ||||
|     "windowsAuthentication": false, | ||||
|     "anonymousAuthentication": true, | ||||
|     "iisExpress": { | ||||
|       "applicationUrl": "http://localhost:32609", | ||||
|       "sslPort": 44301 | ||||
|     } | ||||
|   }, | ||||
|   "profiles": { | ||||
|     "https": { | ||||
|       "commandName": "Project", | ||||
|       "dotnetRunMessages": true, | ||||
|       "launchBrowser": true, | ||||
|       "launchUrl": "swagger", | ||||
|       "applicationUrl": "https://localhost:7223;http://localhost:5115", | ||||
|       "environmentVariables": { | ||||
|         "ASPNETCORE_ENVIRONMENT": "Development" | ||||
|       } | ||||
|     }, | ||||
|     "IIS Express": { | ||||
|       "commandName": "IISExpress", | ||||
|       "launchBrowser": true, | ||||
|       "launchUrl": "swagger", | ||||
|       "environmentVariables": { | ||||
|         "ASPNETCORE_ENVIRONMENT": "Development" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										12
									
								
								WeatherForecast.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								WeatherForecast.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| namespace CyberBoom; | ||||
|  | ||||
| public class WeatherForecast | ||||
| { | ||||
|     public DateOnly Date { get; set; } | ||||
|  | ||||
|     public int TemperatureC { get; set; } | ||||
|  | ||||
|     public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); | ||||
|  | ||||
|     public string? Summary { get; set; } | ||||
| } | ||||
							
								
								
									
										8
									
								
								appsettings.Development.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								appsettings.Development.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| { | ||||
|   "Logging": { | ||||
|     "LogLevel": { | ||||
|       "Default": "Information", | ||||
|       "Microsoft.AspNetCore": "Warning" | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										13
									
								
								appsettings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								appsettings.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| { | ||||
|   "https_port": 7223, | ||||
|   "Logging": { | ||||
|     "LogLevel": { | ||||
|       "Default": "Information", | ||||
|       "Microsoft.AspNetCore": "Warning" | ||||
|     } | ||||
|   }, | ||||
|   "AllowedHosts": "*", | ||||
|   "ConnectionStrings": { | ||||
|     "DefaultConnection": "Host=localhost; Database=CyberBoomWellBeing; Username=postgres; Password=supper_password_123" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										21
									
								
								cyber-boom-files/_gitlab-ci.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								cyber-boom-files/_gitlab-ci.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| variables: | ||||
|   DOCKER_IMAGE_NAME: '$CI_REGISTRY_USER/$CI_COMMIT_BRANCH' | ||||
|  | ||||
| default: | ||||
|   image: docker:latest | ||||
|   services: | ||||
|     - docker:dind | ||||
|   before_script: | ||||
|     - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY | ||||
|  | ||||
| stages: | ||||
|   - build-docker-image | ||||
|  | ||||
|  | ||||
|  | ||||
| build-docker-image: | ||||
|   stage: build | ||||
|    | ||||
|   script: | ||||
|     - docker build -t '$DOCKER_IMAGE_NAME' . | ||||
|     - docker push '$DOCKER_IMAGE_NAME' | ||||
| @@ -0,0 +1,11 @@ | ||||
| {"web": | ||||
| 	{ | ||||
| 		"client_id":"1074677274720-anq59r07nlu1nh7r444pg7llstsu9qp3.apps.googleusercontent.com", | ||||
| 		"project_id":"charged-mind-237506", | ||||
| 		"auth_uri":"https://accounts.google.com/o/oauth2/auth", | ||||
| 		"token_uri":"https://oauth2.googleapis.com/token", | ||||
| 		"auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs", | ||||
| 		"client_secret":"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", | ||||
| 		"redirect_uris":["https://localhost:7223"] | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user