From 677cc3d865345cc1282789e187cb2fcbd97f2896 Mon Sep 17 00:00:00 2001 From: Sergey Verevkin Date: Sun, 6 Feb 2022 11:40:46 +0700 Subject: [PATCH] initial commit --- .gitignore | 423 +----------------- .idea/.idea.ooya.ga_api/.idea/encodings.xml | 4 + .idea/.idea.ooya.ga_api/.idea/indexLayout.xml | 8 + .../.idea/projectSettingsUpdater.xml | 6 + .idea/.idea.ooya.ga_api/.idea/vcs.xml | 6 + .idea/.idea.ooya.ga_api/.idea/workspace.xml | 123 +++++ Controllers/ApiController.cs | 81 ++++ Model/Game.cs | 41 ++ Model/GameDto.cs | 24 + Model/Mapper.cs | 32 ++ Model/Witch.cs | 36 ++ Model/WitchDto.cs | 14 + Program.cs | 25 ++ Properties/launchSettings.json | 31 ++ appsettings.Development.json | 8 + appsettings.json | 9 + ooya.ga_api.csproj | 13 + ooya.ga_api.sln | 16 + 18 files changed, 482 insertions(+), 418 deletions(-) create mode 100644 .idea/.idea.ooya.ga_api/.idea/encodings.xml create mode 100644 .idea/.idea.ooya.ga_api/.idea/indexLayout.xml create mode 100644 .idea/.idea.ooya.ga_api/.idea/projectSettingsUpdater.xml create mode 100644 .idea/.idea.ooya.ga_api/.idea/vcs.xml create mode 100644 .idea/.idea.ooya.ga_api/.idea/workspace.xml create mode 100644 Controllers/ApiController.cs create mode 100644 Model/Game.cs create mode 100644 Model/GameDto.cs create mode 100644 Model/Mapper.cs create mode 100644 Model/Witch.cs create mode 100644 Model/WitchDto.cs create mode 100644 Program.cs create mode 100644 Properties/launchSettings.json create mode 100644 appsettings.Development.json create mode 100644 appsettings.json create mode 100644 ooya.ga_api.csproj create mode 100644 ooya.ga_api.sln diff --git a/.gitignore b/.gitignore index 97c70f2..add57be 100644 --- a/.gitignore +++ b/.gitignore @@ -1,418 +1,5 @@ -# ---> VisualStudio -## 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/master/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 Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# 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 - -# Nuget personal access tokens and Credentials -nuget.config - -# 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 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/ - -# 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 -.idea/ -*.sln.iml - -# ---> macOS -# 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 - +bin/ +obj/ +/packages/ +riderModule.iml +/_ReSharper.Caches/ \ No newline at end of file diff --git a/.idea/.idea.ooya.ga_api/.idea/encodings.xml b/.idea/.idea.ooya.ga_api/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.ooya.ga_api/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.ooya.ga_api/.idea/indexLayout.xml b/.idea/.idea.ooya.ga_api/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.ooya.ga_api/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.ooya.ga_api/.idea/projectSettingsUpdater.xml b/.idea/.idea.ooya.ga_api/.idea/projectSettingsUpdater.xml new file mode 100644 index 0000000..4bb9f4d --- /dev/null +++ b/.idea/.idea.ooya.ga_api/.idea/projectSettingsUpdater.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/.idea.ooya.ga_api/.idea/vcs.xml b/.idea/.idea.ooya.ga_api/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/.idea.ooya.ga_api/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/.idea.ooya.ga_api/.idea/workspace.xml b/.idea/.idea.ooya.ga_api/.idea/workspace.xml new file mode 100644 index 0000000..580a097 --- /dev/null +++ b/.idea/.idea.ooya.ga_api/.idea/workspace.xml @@ -0,0 +1,123 @@ + + + + ooya.ga_api.csproj + ooya.ga_api.csproj + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1644119899867 + + + + + + + + + + + \ No newline at end of file diff --git a/Controllers/ApiController.cs b/Controllers/ApiController.cs new file mode 100644 index 0000000..88830c1 --- /dev/null +++ b/Controllers/ApiController.cs @@ -0,0 +1,81 @@ +using Microsoft.AspNetCore.Mvc; + +namespace ooya.ga_api.Controllers; + +[ApiController] +[Microsoft.AspNetCore.Mvc.Route("/api/v1")] +public class ApiController : ControllerBase +{ + private static readonly Random Random = new Random(); + private static readonly List GameList = new List(); + + private readonly ILogger _logger; + + public ApiController(ILogger logger) + { + _logger = logger; + } + + [HttpGet("version", Name = "version", Order = 1)] + public string Version() + { + return "1.0.0"; + } + + [HttpGet("game", Name = "game", Order = 2)] + public GameDto NewGame() + { + Game pGame = h_NewGame(0); + GameList.Add(pGame); + return Mapper.ToGameDto(pGame); + } + + [HttpGet("turn", Name = "turn", Order = 3)] + public GameDto? Turn( + string gameGuid, + string witchGuid + ) + { + Game pGame = GameList.FirstOrDefault(p => p.Guid == gameGuid); + if (pGame == null) return null; + Witch pWitch = pGame.Witches.FirstOrDefault(p => p.Guid == witchGuid); + if (pWitch == null) return null; + if (pWitch.FlagReal) + { + Game pNewGame = h_NewGame(pGame.Score + pGame.Witches.Count()); + GameList.Add(pNewGame); + return Mapper.ToGameDto(pNewGame); + } + else + { + pGame.Score--; + return Mapper.ToGameDto(pGame); + } + } + + #region private methods + + private Game h_NewGame(int iScore) + { + Game pGame = new Game(iScore) + { + Witches = h_CreateWitches(Random.Next(2, 5)) + }; + return pGame; + } + + private IEnumerable h_CreateWitches(int count) + { + List witches = new List(); + for (int ii = 0; ii < count; ii++) + { + witches.Add(new Witch(ii)); + } + + int iIndex = Random.Next(0, count); + witches[iIndex].FlagReal = true; + return witches; + } + + #endregion +} \ No newline at end of file diff --git a/Model/Game.cs b/Model/Game.cs new file mode 100644 index 0000000..f5cff0d --- /dev/null +++ b/Model/Game.cs @@ -0,0 +1,41 @@ +using System.ComponentModel.DataAnnotations; + +namespace ooya.ga_api; + +public class Game +{ + /// + /// Текущая дата и время + /// + [Required] + public DateTime Date { get; set; } + + /// + /// Идентификатор игры + /// + [Required] + public string Guid { get; set; } + + /// + /// Количество очков + /// + [Required] + public int Score { get; set; } + + /// + /// Ведьмы раунда + /// + [Required] + public IEnumerable Witches { get; set; } + + /// + /// Конструктор + /// + /// первоначальное количество очков + public Game(int score = 0) + { + Date = DateTime.Now; + Score = score; + Witches = new List(); + } +} \ No newline at end of file diff --git a/Model/GameDto.cs b/Model/GameDto.cs new file mode 100644 index 0000000..cfb2f94 --- /dev/null +++ b/Model/GameDto.cs @@ -0,0 +1,24 @@ +namespace ooya.ga_api; + +public class GameDto +{ + /// + /// Текущая дата и время + /// + public DateTime Date { get; set; } + + /// + /// Идентификатор игры + /// + public string Guid { get; set; } + + /// + /// Количество очков + /// + public int Score { get; set; } + + /// + /// Ведьмы раунда + /// + public IEnumerable Witches { get; set; } +} \ No newline at end of file diff --git a/Model/Mapper.cs b/Model/Mapper.cs new file mode 100644 index 0000000..7fd324f --- /dev/null +++ b/Model/Mapper.cs @@ -0,0 +1,32 @@ +namespace ooya.ga_api; + +public static class Mapper +{ + /// + /// Для передачи в сторону пользователя + /// + /// + /// + public static GameDto ToGameDto(Game pGame) + { + GameDto pGameDto = new GameDto(); + pGameDto.Guid = pGame.Guid; + pGameDto.Date = pGame.Date; + pGameDto.Score = pGame.Score; + pGameDto.Witches = pGame.Witches.Select(p => ToWitchDto(p)); + return pGameDto; + } + /// + /// Для передачи в сторону пользователя + /// + /// + /// + public static WitchDto ToWitchDto(Witch pWitch) + { + WitchDto pWitchDto = new WitchDto(); + pWitchDto.Guid = pWitch.Guid; + pWitchDto.Position = pWitch.Position; + return pWitchDto; + } + +} \ No newline at end of file diff --git a/Model/Witch.cs b/Model/Witch.cs new file mode 100644 index 0000000..ac8dbdf --- /dev/null +++ b/Model/Witch.cs @@ -0,0 +1,36 @@ +using System.ComponentModel.DataAnnotations; + +namespace ooya.ga_api; + +public class Witch +{ + /// + /// Идентификатор ведьмы + /// + [Required] + public string Guid { get; set; } + + /// + /// Является ли настоящей + /// + [Required] + public bool FlagReal { get; set; } + + /// + /// Позиция ведьмы + /// + [Required] + public int Position { get; set; } + + + /// + /// Конструктор + /// + /// + public Witch(int position) + { + Guid = (new Guid()).ToString("N"); + Position = position; + FlagReal = false; + } +} \ No newline at end of file diff --git a/Model/WitchDto.cs b/Model/WitchDto.cs new file mode 100644 index 0000000..9c4840a --- /dev/null +++ b/Model/WitchDto.cs @@ -0,0 +1,14 @@ +namespace ooya.ga_api; + +public class WitchDto +{ + /// + /// Идентификатор ведьмы + /// + public string Guid { get; set; } + + /// + /// Позиция ведьмы + /// + public int Position { get; set; } +} \ No newline at end of file diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..8264bac --- /dev/null +++ b/Program.cs @@ -0,0 +1,25 @@ +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. + +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(); + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.UseHttpsRedirection(); + +app.UseAuthorization(); + +app.MapControllers(); + +app.Run(); \ No newline at end of file diff --git a/Properties/launchSettings.json b/Properties/launchSettings.json new file mode 100644 index 0000000..de8c836 --- /dev/null +++ b/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:24043", + "sslPort": 44355 + } + }, + "profiles": { + "ooya.ga_api": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:7115;http://localhost:5001", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/appsettings.Development.json b/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/appsettings.json b/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/ooya.ga_api.csproj b/ooya.ga_api.csproj new file mode 100644 index 0000000..b9baca3 --- /dev/null +++ b/ooya.ga_api.csproj @@ -0,0 +1,13 @@ + + + + net6.0 + enable + enable + + + + + + + diff --git a/ooya.ga_api.sln b/ooya.ga_api.sln new file mode 100644 index 0000000..196a9d6 --- /dev/null +++ b/ooya.ga_api.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ooya.ga_api", "ooya.ga_api.csproj", "{8046F827-FD8E-4F3A-9921-ADC42F935B12}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8046F827-FD8E-4F3A-9921-ADC42F935B12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8046F827-FD8E-4F3A-9921-ADC42F935B12}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8046F827-FD8E-4F3A-9921-ADC42F935B12}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8046F827-FD8E-4F3A-9921-ADC42F935B12}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal