Browse Source

Merge pull request 'develop' (#3) from develop into master

Reviewed-on: http://vsa-jino.my.to:49272/pi20/restapi/pulls/3
master
Verevkin Sergey 3 years ago
parent
commit
ad34af0bd9
  1. 22
      20230415.3/w230415/CinemaHall.cs
  2. 105
      20230415.3/w230415/Hall.cs
  3. 17
      20230415.3/w230415/HallPlace.cs
  4. 13
      20230415.3/w230415/Intf/IHall.cs
  5. 10
      20230415.3/w230415/Intf/IHallPlace.cs
  6. 43
      20230415.3/w230415/w230415.sln
  7. 9
      20230415.3/w230415/w230415_classes.csproj
  8. 22
      20230415.3/w230415_console/Program.cs
  9. 14
      20230415.3/w230415_console/w230415_console.csproj
  10. 42
      20230415.3/w230415_consoleapi/Program.cs
  11. 18
      20230415.3/w230415_consoleapi/w230415_consoleapi.csproj
  12. 78
      20230415.3/w230415_webapi/Controllers/HallController.cs
  13. 34
      20230415.3/w230415_webapi/Program.cs
  14. 31
      20230415.3/w230415_webapi/Properties/launchSettings.json
  15. 8
      20230415.3/w230415_webapi/appsettings.Development.json
  16. 9
      20230415.3/w230415_webapi/appsettings.json
  17. 17
      20230415.3/w230415_webapi/w230415_webapi.csproj
  18. 212
      20230415.3/webApp230415_hall.postman_collection.json

22
20230415.3/w230415/CinemaHall.cs

@ -0,0 +1,22 @@
namespace w230415_classes
{
public class CinemaHall : Hall
{
public CinemaHall()
{
int iW = 10;
int iH = 3;
for (int iX = 0; iX < iW; iX++)
{
for (int iY = 0; iY < iH; iY++)
{
HallPlaceList.Add(new HallPlace()
{
SeatPosition = iX,
SeatRow = iY
});
}
}
}
}
}

105
20230415.3/w230415/Hall.cs

@ -0,0 +1,105 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using w230415_classes.Intf;
namespace w230415_classes
{
public class Hall : IHall
{
public string Name { get; set; }
protected List<HallPlace> HallPlaceList { get; set; } = new List<HallPlace>();
/// <summary>
/// Read [R]
/// </summary>
/// <returns></returns>
public IEnumerable<IHallPlace> GetNotBookedPlaceList()
{
List<HallPlace> hpl = new List<HallPlace>();
foreach (var item in HallPlaceList)
{
if (item.FlagBooked) continue;
hpl.Add(item);
}
return hpl;
}
/// <summary>
/// Read [R]
/// </summary>
/// <param name="iRow"></param>
/// <param name="iPosition"></param>
/// <returns></returns>
public IHallPlace? ReadPlace(int iRow, int iPosition)
{
var el = HallPlaceList.FirstOrDefault(hp => hp.SeatPosition == iPosition && hp.SeatRow == iRow);
return el;
}
/// <summary>
/// Update [U]
/// </summary>
/// <param name="iRow"></param>
/// <param name="iPosition"></param>
/// <returns></returns>
public bool BookPlace(int iRow, int iPosition)
{
var el = HallPlaceList.FirstOrDefault(hp => hp.SeatPosition == iPosition && hp.SeatRow == iRow);
if (el == null)
{
return false;
}
if (el.FlagBooked)
{
return false;
}
el.FlagBooked = true;
return true;
}
/// <summary>
/// Create [C]
/// </summary>
/// <param name="iRow"></param>
/// <param name="iPosition"></param>
/// <returns></returns>
public bool AddPlace(int iRow, int iPosition)
{
var el = HallPlaceList.FirstOrDefault(hp => hp.SeatPosition == iPosition && hp.SeatRow == iRow);
if (el != null)
{
return false;
}
HallPlaceList.Add(new HallPlace()
{
SeatPosition = iPosition,
SeatRow = iRow,
});
return true;
}
/// <summary>
/// Delete [D]
/// </summary>
/// <param name="iRow"></param>
/// <param name="iPosition"></param>
/// <returns></returns>
public bool DeletePlace(int iRow, int iPosition)
{
var el = HallPlaceList.FirstOrDefault(hp => hp.SeatPosition == iPosition && hp.SeatRow == iRow);
if (el == null)
{
return false;
}
return HallPlaceList.Remove(el);
}
}
}

17
20230415.3/w230415/HallPlace.cs

@ -0,0 +1,17 @@
using w230415_classes.Intf;
namespace w230415_classes
{
public class HallPlace : IHallPlace
{
public HallPlace()
{
Uid = Guid.NewGuid().ToString("N");
}
public string Uid { get; set; }
public int SeatPosition { get; set; }
public int SeatRow { get; set; }
public bool FlagBooked { get; set; }
}
}

13
20230415.3/w230415/Intf/IHall.cs

@ -0,0 +1,13 @@
namespace w230415_classes.Intf
{
public interface IHall
{
string Name { get; set; }
bool AddPlace(int iRow, int iPosition);
bool BookPlace(int iRow, int iPosition);
bool DeletePlace(int iRow, int iPosition);
IEnumerable<IHallPlace> GetNotBookedPlaceList();
IHallPlace? ReadPlace(int iRow, int iPosition);
}
}

10
20230415.3/w230415/Intf/IHallPlace.cs

@ -0,0 +1,10 @@
namespace w230415_classes.Intf
{
public interface IHallPlace
{
bool FlagBooked { get; set; }
int SeatPosition { get; set; }
int SeatRow { get; set; }
string Uid { get; set; }
}
}

43
20230415.3/w230415/w230415.sln

@ -0,0 +1,43 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.2.32616.157
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "w230415_classes", "w230415_classes.csproj", "{3B2A3797-78B5-42F6-9C7E-5F9F20838C3F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "w230415_console", "..\w230415_console\w230415_console.csproj", "{9A1651B3-A3D4-49ED-9257-419F42F66FF2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "w230415_webapi", "..\w230415_webapi\w230415_webapi.csproj", "{465CAE58-3BB5-4933-8AB8-FE30DDCFB9C4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "w230415_consoleapi", "..\w230415_consoleapi\w230415_consoleapi.csproj", "{96A7178E-082A-4E3B-A377-948D0B1E66DA}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3B2A3797-78B5-42F6-9C7E-5F9F20838C3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3B2A3797-78B5-42F6-9C7E-5F9F20838C3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3B2A3797-78B5-42F6-9C7E-5F9F20838C3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3B2A3797-78B5-42F6-9C7E-5F9F20838C3F}.Release|Any CPU.Build.0 = Release|Any CPU
{9A1651B3-A3D4-49ED-9257-419F42F66FF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9A1651B3-A3D4-49ED-9257-419F42F66FF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9A1651B3-A3D4-49ED-9257-419F42F66FF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9A1651B3-A3D4-49ED-9257-419F42F66FF2}.Release|Any CPU.Build.0 = Release|Any CPU
{465CAE58-3BB5-4933-8AB8-FE30DDCFB9C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{465CAE58-3BB5-4933-8AB8-FE30DDCFB9C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{465CAE58-3BB5-4933-8AB8-FE30DDCFB9C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{465CAE58-3BB5-4933-8AB8-FE30DDCFB9C4}.Release|Any CPU.Build.0 = Release|Any CPU
{96A7178E-082A-4E3B-A377-948D0B1E66DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{96A7178E-082A-4E3B-A377-948D0B1E66DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{96A7178E-082A-4E3B-A377-948D0B1E66DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{96A7178E-082A-4E3B-A377-948D0B1E66DA}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {819D4FAE-A124-443D-B564-39D533244A18}
EndGlobalSection
EndGlobal

9
20230415.3/w230415/w230415_classes.csproj

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

22
20230415.3/w230415_console/Program.cs

@ -0,0 +1,22 @@
using w230415_classes;
using w230415_classes.Intf;
namespace w230415_console
{
internal class Program
{
static void Main(string[] args)
{
IHall ch = new CinemaHall();
h_Process(ch);
}
private static void h_Process(IHall ch)
{
foreach (IHallPlace item in ch.GetNotBookedPlaceList())
{
Console.WriteLine($"{item.SeatRow}/{item.SeatPosition}: {item.Uid}");
}
}
}
}

14
20230415.3/w230415_console/w230415_console.csproj

@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\w230415\w230415_classes.csproj" />
</ItemGroup>
</Project>

42
20230415.3/w230415_consoleapi/Program.cs

@ -0,0 +1,42 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using w230415_classes;
namespace w230415_consoleapi
{
internal class Program
{
static void Main(string[] args)
{
h_Process();
}
private static void h_Process()
{
HttpClient client = new HttpClient();
var res = client.GetAsync("http://localhost:5095/v1/hall").Result;
if (res.StatusCode == System.Net.HttpStatusCode.OK)
{
string sJson = res.Content.ReadAsStringAsync().Result;
//// 1. self
List<HallPlace>? chList = JsonConvert.DeserializeObject<List<HallPlace>>(sJson);
foreach (HallPlace item in chList)
{
Console.WriteLine($"{item.SeatRow}/{item.SeatPosition}: {item.Uid}");
}
// 2. dynamic
//dynamic json = JsonConvert.DeserializeObject(sJson);
//foreach (dynamic item in json)
//{
// Console.WriteLine($"{item.seatRow}/{item.seatPosition}: {item.uid}");
//}
// 3. JToken
//JToken json = JsonConvert.DeserializeObject<JToken>(sJson);
//foreach (JToken item in json)
//{
// Console.WriteLine($"{item["seatRow"]}/{item["seatPosition"]}: {item["uid"]}");
//}
}
}
}
}

18
20230415.3/w230415_consoleapi/w230415_consoleapi.csproj

@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\w230415\w230415_classes.csproj" />
</ItemGroup>
</Project>

78
20230415.3/w230415_webapi/Controllers/HallController.cs

@ -0,0 +1,78 @@
using Microsoft.AspNetCore.Mvc;
using w230415_classes.Intf;
namespace w230415_webapi.Controllers
{
[ApiController]
[Route("v1/hall")]
public class HallController : ControllerBase
{
private readonly IHall _hall;
public HallController(IHall hall)
{
_hall = hall;
}
[HttpGet(Name = "GetNotBookedPlaces")]
public IEnumerable<IHallPlace> GetNotBooked()
{
return _hall.GetNotBookedPlaceList();
}
[HttpGet("seat/{iRow}/{iPosition}", Name = "GetPlace")]
public IHallPlace GetHallPlace(
int iRow,
int iPosition)
{
var place = _hall.ReadPlace(iRow, iPosition);
Response.StatusCode = place != null ? 200 : 404;
return place;
}
[HttpGet("seat", Name = "GetPlace by query params")]
public IHallPlace GetHallPlace2(
int iRow,
int iPosition)
{
var place = _hall.ReadPlace(iRow, iPosition);
Response.StatusCode = place != null ? 200 : 404;
return place;
}
[HttpPost("seat", Name = "Add place by form params")]
public void AddHallPlace(
[FromForm]
int iRow,
[FromForm]
int iPosition)
{
bool result = _hall.AddPlace(iRow, iPosition);
Response.StatusCode = result ? 200 : 500;
}
[HttpDelete("seat", Name = "Remove place by form params")]
public void RemoveHallPlace(
[FromHeader]
int iRow,
[FromHeader]
int iPosition)
{
bool result = _hall.DeletePlace(iRow, iPosition);
Response.StatusCode = result ? 200 : 500;
}
[HttpPatch("seat/booking/{iRow}/{iPosition}", Name = "Set booking status by params")]
public void SetBooking(
int iRow,
int iPosition)
{
bool result = _hall.BookPlace(iRow, iPosition);
Response.StatusCode = result ? 200 : 500;
}
}
}

34
20230415.3/w230415_webapi/Program.cs

@ -0,0 +1,34 @@
using w230415_classes;
using w230415_classes.Intf;
namespace w230415_webapi
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
var pHall = new CinemaHall();
builder.Services.AddSingleton<IHall>(pHall);
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.MapControllers();
app.Run();
}
}
}

31
20230415.3/w230415_webapi/Properties/launchSettings.json

@ -0,0 +1,31 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:21569",
"sslPort": 0
}
},
"profiles": {
"w230415_webapi": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:5095",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

8
20230415.3/w230415_webapi/appsettings.Development.json

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

9
20230415.3/w230415_webapi/appsettings.json

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

17
20230415.3/w230415_webapi/w230415_webapi.csproj

@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\w230415\w230415_classes.csproj" />
</ItemGroup>
</Project>

212
20230415.3/webApp230415_hall.postman_collection.json

@ -0,0 +1,212 @@
{
"info": {
"_postman_id": "ed89b8b7-813e-4589-970c-0b6090d7e7cd",
"name": "webApp230415_hall",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
"_exporter_id": "26683763"
},
"item": [
{
"name": "get not booked",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/",
"host": [
"{{baseurl}}"
],
"path": [
""
]
}
},
"response": []
},
{
"name": "seat info",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/seat/1/5",
"host": [
"{{baseurl}}"
],
"path": [
"seat",
"1",
"5"
]
}
},
"response": []
},
{
"name": "seat add",
"request": {
"method": "POST",
"header": [],
"body": {
"mode": "formdata",
"formdata": [
{
"key": "iRow",
"value": "1",
"type": "text"
},
{
"key": "iPosition",
"value": "11",
"type": "text"
}
]
},
"url": {
"raw": "{{baseurl}}/seat",
"host": [
"{{baseurl}}"
],
"path": [
"seat"
]
}
},
"response": []
},
{
"name": "seat de3lete",
"request": {
"method": "DELETE",
"header": [
{
"key": "iRow",
"value": "1",
"type": "text"
},
{
"key": "iPosition",
"value": "11",
"type": "text"
}
],
"body": {
"mode": "formdata",
"formdata": [
{
"key": "iRow",
"value": "1",
"type": "text",
"disabled": true
},
{
"key": "iPosition",
"value": "11",
"type": "text",
"disabled": true
}
]
},
"url": {
"raw": "{{baseurl}}/seat",
"host": [
"{{baseurl}}"
],
"path": [
"seat"
]
}
},
"response": []
},
{
"name": "seat booking",
"request": {
"method": "PATCH",
"header": [],
"body": {
"mode": "formdata",
"formdata": [
{
"key": "iRow",
"value": "1",
"type": "text"
},
{
"key": "iPosition",
"value": "11",
"type": "text"
}
]
},
"url": {
"raw": "{{baseurl}}/seat/booking/1/2",
"host": [
"{{baseurl}}"
],
"path": [
"seat",
"booking",
"1",
"2"
]
}
},
"response": []
},
{
"name": "seat info query",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/seat?iRow=1&iPosition=1",
"host": [
"{{baseurl}}"
],
"path": [
"seat"
],
"query": [
{
"key": "iRow",
"value": "1"
},
{
"key": "iPosition",
"value": "1"
}
]
}
},
"response": []
}
],
"event": [
{
"listen": "prerequest",
"script": {
"type": "text/javascript",
"exec": [
""
]
}
},
{
"listen": "test",
"script": {
"type": "text/javascript",
"exec": [
""
]
}
}
],
"variable": [
{
"key": "baseurl",
"value": "http://localhost:5095/v1/hall",
"type": "string"
}
]
}
Loading…
Cancel
Save