diff --git a/tasks/klementeva-ja/lab_3/.gitignore b/tasks/klementeva-ja/lab_3/.gitignore new file mode 100644 index 0000000..71ec0d1 --- /dev/null +++ b/tasks/klementeva-ja/lab_3/.gitignore @@ -0,0 +1,226 @@ +# The following command works for downloading when using Git for Windows: +# curl -LOf http://gist.githubusercontent.com/kmorcinek/2710267/raw/.gitignore +# +# Download this file using PowerShell v3 under Windows with the following comand: +# Invoke-WebRequest https://gist.githubusercontent.com/kmorcinek/2710267/raw/ -OutFile .gitignore +# +# or wget: +# wget --no-check-certificate http://gist.githubusercontent.com/kmorcinek/2710267/raw/.gitignore + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +x64/ +[Bb]in/ +[Oo]bj/ +# build folder is nowadays used for build scripts and should not be ignored +#build/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# 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 +*.Publish.xml + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings +modulesbin/ +tempbin/ + +# EPiServer Site file (VPP) +AppData/ + +# 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 + +# vim +*.txt~ +*.swp +*.swo + +# Temp files when opening LibreOffice on ubuntu +.~lock.* + +# svn +.svn + +# CVS - Source Control +**/CVS/ + +# Remainings from resolving conflicts in Source Control +*.orig + +# SQL Server files +**/App_Data/*.mdf +**/App_Data/*.ldf +**/App_Data/*.sdf + + +#LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml + +# ========================= +# Windows detritus +# ========================= + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# OS generated files # +Icon? + +# Mac desktop service store files +.DS_Store + +# SASS Compiler cache +.sass-cache + +# Visual Studio 2014 CTP +**/*.sln.ide + +# Visual Studio temp something +.vs/ + +# dotnet stuff +project.lock.json + +# VS 2015+ +*.vc.vc.opendb +*.vc.db + +# Rider +.idea/ + +# Visual Studio Code +.vscode/ + +# Output folder used by Webpack or other FE stuff +**/node_modules/* +**/wwwroot/* + +# SpecFlow specific +*.feature.cs +*.feature.xlsx.* +*.Specs_*.html + +# UWP Projects +AppPackages/ + +##### +# End of core ignore list, below put you custom 'per project' settings (patterns or path) +##### \ No newline at end of file diff --git a/tasks/klementeva-ja/lab_3/README.md b/tasks/klementeva-ja/lab_3/README.md new file mode 100644 index 0000000..36c2f90 --- /dev/null +++ b/tasks/klementeva-ja/lab_3/README.md @@ -0,0 +1,76 @@ +# Отчет по лабораторной работе №3 REST API, Gateway и синхронный обмен между микросервисами +Выполнила студентка гр. ИСЭбд-41 Клементьева Ж.А. + +## Создание микросервисов +Создание микросервисов было реализовано следующим образом: + +1. С помощью команды `dotnet new web -n worker-2` в терминале создала первый микросервис, где решение добавила командой `dotnet new sln`. +2. Также использовала данную команду: `dotnet sln worker-2.sln add worker-2.csproj` с целью связки решения и проекта. +3. Аналогичные действия были совершены со вторым микросервисом. +4. Были добавлены библиотеки Swagger и OpenAi в проекты. +5. Также проект был запущен с помощью команды `dotnet run`. + +Скриншоты микросервисов worker 1 и worker 2: +![](pic/1.png) +![](pic/2.png) + +Путь localhost:8080: + +![](pic/3.png) + + +![](pic/4.png) + +## Синхронный обмен +Также мною был реализован код, вызывающий сихронно данные из соседнего микросервиса. +```cs +//worker-2 +app.MapGet("/Requests/", async () => +{ + var httpClient = new HttpClient(); + var secondWorkerResponse = await httpClient.GetStringAsync("http://worker-1:8080/"); + + return secondWorkerResponse.ToArray(); +}) +.WithName("GetRequests") +.WithOpenApi(); +``` +## Реализация gateway, используя nginx + +Мною был добавлен nginx.conf: + +```conf +server { + listen 8080; + listen [::]:8080; + server_name localhost; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + location /worker-1/ { + proxy_pass http://worker-1:8080/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Prefix /worker-1; + } + + location /worker-2/ { + proxy_pass http://worker-2:8080/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Prefix /worker-2; + } +} + +``` +После выполнения команды `docker-compose up` были получены такие результаты: + +Результат worker1: +![](pic/5.png) +Результат worker2: +![](pic/6.png) \ No newline at end of file diff --git a/tasks/klementeva-ja/lab_3/docker-compose.yml b/tasks/klementeva-ja/lab_3/docker-compose.yml new file mode 100644 index 0000000..e9ca4b9 --- /dev/null +++ b/tasks/klementeva-ja/lab_3/docker-compose.yml @@ -0,0 +1,15 @@ +version: "3.1" +services: + worker-1: + build: ./worker-1 + worker-2: + build: ./worker-2 + depends_on: + - worker-1 + gateway: + image: nginx:latest + ports: + - 8080:8080 + volumes: + - ./static:/usr/share/nginx/html:ro + - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro \ No newline at end of file diff --git a/tasks/klementeva-ja/lab_3/nginx.conf b/tasks/klementeva-ja/lab_3/nginx.conf new file mode 100644 index 0000000..f649a4a --- /dev/null +++ b/tasks/klementeva-ja/lab_3/nginx.conf @@ -0,0 +1,26 @@ +server { + listen 8080; + listen [::]:8080; + server_name localhost; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + location /worker-1/ { + proxy_pass http://worker-1:8080/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Prefix /worker-1; + } + + location /worker-2/ { + proxy_pass http://worker-2:8080/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Prefix /worker-2; + } +} \ No newline at end of file diff --git a/tasks/klementeva-ja/lab_3/pic/1.png b/tasks/klementeva-ja/lab_3/pic/1.png new file mode 100644 index 0000000..69077f2 Binary files /dev/null and b/tasks/klementeva-ja/lab_3/pic/1.png differ diff --git a/tasks/klementeva-ja/lab_3/pic/2.png b/tasks/klementeva-ja/lab_3/pic/2.png new file mode 100644 index 0000000..2bd8760 Binary files /dev/null and b/tasks/klementeva-ja/lab_3/pic/2.png differ diff --git a/tasks/klementeva-ja/lab_3/pic/3.png b/tasks/klementeva-ja/lab_3/pic/3.png new file mode 100644 index 0000000..4548fd8 Binary files /dev/null and b/tasks/klementeva-ja/lab_3/pic/3.png differ diff --git a/tasks/klementeva-ja/lab_3/pic/4.png b/tasks/klementeva-ja/lab_3/pic/4.png new file mode 100644 index 0000000..2b04e09 Binary files /dev/null and b/tasks/klementeva-ja/lab_3/pic/4.png differ diff --git a/tasks/klementeva-ja/lab_3/pic/5.png b/tasks/klementeva-ja/lab_3/pic/5.png new file mode 100644 index 0000000..0969a27 Binary files /dev/null and b/tasks/klementeva-ja/lab_3/pic/5.png differ diff --git a/tasks/klementeva-ja/lab_3/pic/6.png b/tasks/klementeva-ja/lab_3/pic/6.png new file mode 100644 index 0000000..06a68db Binary files /dev/null and b/tasks/klementeva-ja/lab_3/pic/6.png differ diff --git a/tasks/klementeva-ja/lab_3/static/index.html b/tasks/klementeva-ja/lab_3/static/index.html new file mode 100644 index 0000000..9e75aa0 --- /dev/null +++ b/tasks/klementeva-ja/lab_3/static/index.html @@ -0,0 +1,13 @@ + + + + + + Тестовое приложение по лабораторной работе №3 + + +

Клементьева Ж.А. ИСЭбд-41.

+

Запрос к worker-1

+

Запрос к worker-2

+ + \ No newline at end of file diff --git a/tasks/klementeva-ja/lab_3/worker-1/Dockerfile b/tasks/klementeva-ja/lab_3/worker-1/Dockerfile new file mode 100644 index 0000000..7a8ce23 --- /dev/null +++ b/tasks/klementeva-ja/lab_3/worker-1/Dockerfile @@ -0,0 +1,11 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env +WORKDIR /app + +COPY . ./ +RUN dotnet restore +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 +WORKDIR /app +COPY --from=build-env /app/out . +ENTRYPOINT ["dotnet", "worker-1.dll"] \ No newline at end of file diff --git a/tasks/klementeva-ja/lab_3/worker-1/Program.cs b/tasks/klementeva-ja/lab_3/worker-1/Program.cs new file mode 100644 index 0000000..60c42a4 --- /dev/null +++ b/tasks/klementeva-ja/lab_3/worker-1/Program.cs @@ -0,0 +1,124 @@ +List requests = new() +{ + new Request() { Uuid= Guid.Parse("7184fa5f-b786-4478-863a-99cc000eb752"), Title = "Расход на внедрение системы менеджмента качества", SourceOfFunds = "Шуреков", Sum = 100000, IsCompleted = false }, + new Request() { Uuid= Guid.Parse("55a9aed1-218a-468e-92b9-99f6a6a34543"), Title = "Расход на сопровождение проекта", SourceOfFunds = "Клементьев", Sum = 25000, IsCompleted = true }, +}; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); + +var app = builder.Build(); + +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.UseHttpsRedirection(); + +app.MapGet("/", () => +{ + return requests.Select(r => new RequestEntityDto() + { + Uuid = r.Uuid, + Title = r.Title, + Sum = r.Sum, + SourceOfFunds = r.SourceOfFunds, + IsCompleted = r.IsCompleted, + }); +}) +.WithName("GetRequests") +.WithOpenApi(); + +app.MapGet("/{uuid}", (Guid uuid) => +{ + var request = requests.FirstOrDefault(r => r.Uuid == uuid); + if (request == null) + return Results.NotFound(); + return Results.Json(new RequestEntityDto() + { + Uuid = request.Uuid, + Title = request.Title, + Sum = request.Sum, + SourceOfFunds = request.SourceOfFunds, + IsCompleted = request.IsCompleted, + }); +}) +.WithName("GetRequestByGUID") +.WithOpenApi(); + +app.MapPost("/{title}/{sourceOfFunds}/{sum}/{isCompleted}", (string title, string sourceOfFunds, decimal sum, bool isCompleted) => +{ + Guid NewGuid = Guid.NewGuid(); + requests.Add(new Request() { Uuid = NewGuid, Title = (string)title, SourceOfFunds = (string)sourceOfFunds, Sum = (decimal)sum, IsCompleted = (bool)isCompleted}); + + var request = requests.FirstOrDefault(r => r.Uuid == NewGuid); + if (request == null) + return Results.NotFound(); + return Results.Json(new RequestEntityDto() + { + Uuid = request.Uuid, + Title = request.Title, + Sum = request.Sum, + SourceOfFunds = request.SourceOfFunds, + IsCompleted = request.IsCompleted, + }); +}) +.WithName("PostRequest") +.WithOpenApi(); + +app.MapPatch("/{uuid}/{title}/{sourceOfFunds}/{sum}/{isCompleted}", (Guid uuid, string ?title, string ?sourceOfFunds, decimal sum, bool isCompleted) => +{ + var request = requests.FirstOrDefault(r => r.Uuid == uuid); + if (request == null) + return Results.NotFound(); + if (title != null) request.Title = title; + if (sourceOfFunds != ",") request.SourceOfFunds = sourceOfFunds; + if (sum != request.Sum && sum != 0) request.Sum = sum; + if (isCompleted != request.IsCompleted) request.IsCompleted = isCompleted; + + return Results.Json(new RequestEntityDto() + { + Uuid = request.Uuid, + Title = request.Title, + Sum = request.Sum, + SourceOfFunds = request.SourceOfFunds, + IsCompleted = request.IsCompleted, + }); +}) +.WithName("UpdateRequest") +.WithOpenApi(); + +app.MapDelete("/{uuid}", (Guid uuid) => +{ + var request = requests.FirstOrDefault(r => r.Uuid == uuid); + if (request == null) + return Results.NotFound(); + requests.Remove(request); + return Results.Json(new RequestEntityDto() + { + Uuid = request.Uuid, + Title = request.Title, + Sum = request.Sum, + SourceOfFunds = request.SourceOfFunds, + IsCompleted = request.IsCompleted, + }); +}) +.WithName("DeleteRequestByGUID") +.WithOpenApi(); + +app.Run(); + +public class Request +{ + public Guid Uuid { get; set; } + public string Title { get; set; } = string.Empty; + public string SourceOfFunds { get; set; } = string.Empty; + public decimal Sum { get; set; } = 0; + public bool IsCompleted { get; set; } +} + +public class RequestEntityDto : Request { } \ No newline at end of file diff --git a/tasks/klementeva-ja/lab_3/worker-1/Properties/launchSettings.json b/tasks/klementeva-ja/lab_3/worker-1/Properties/launchSettings.json new file mode 100644 index 0000000..bab6706 --- /dev/null +++ b/tasks/klementeva-ja/lab_3/worker-1/Properties/launchSettings.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:51956", + "sslPort": 44303 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5197", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7027;http://localhost:5197", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/tasks/klementeva-ja/lab_3/worker-1/appsettings.Development.json b/tasks/klementeva-ja/lab_3/worker-1/appsettings.Development.json new file mode 100644 index 0000000..3b823ef --- /dev/null +++ b/tasks/klementeva-ja/lab_3/worker-1/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/tasks/klementeva-ja/lab_3/worker-1/appsettings.json b/tasks/klementeva-ja/lab_3/worker-1/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/tasks/klementeva-ja/lab_3/worker-1/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/tasks/klementeva-ja/lab_3/worker-1/worker-1.csproj b/tasks/klementeva-ja/lab_3/worker-1/worker-1.csproj new file mode 100644 index 0000000..795c30e --- /dev/null +++ b/tasks/klementeva-ja/lab_3/worker-1/worker-1.csproj @@ -0,0 +1,15 @@ + + + + net8.0 + enable + enable + worker_1 + + + + + + + + diff --git a/tasks/klementeva-ja/lab_3/worker-1/worker-1.sln b/tasks/klementeva-ja/lab_3/worker-1/worker-1.sln new file mode 100644 index 0000000..fc4131f --- /dev/null +++ b/tasks/klementeva-ja/lab_3/worker-1/worker-1.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-1", "worker-1.csproj", "{90F6C7BD-78E2-47C8-A702-DD47E74D3865}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {90F6C7BD-78E2-47C8-A702-DD47E74D3865}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90F6C7BD-78E2-47C8-A702-DD47E74D3865}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90F6C7BD-78E2-47C8-A702-DD47E74D3865}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90F6C7BD-78E2-47C8-A702-DD47E74D3865}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/tasks/klementeva-ja/lab_3/worker-2/Dockerfile b/tasks/klementeva-ja/lab_3/worker-2/Dockerfile new file mode 100644 index 0000000..7f6b963 --- /dev/null +++ b/tasks/klementeva-ja/lab_3/worker-2/Dockerfile @@ -0,0 +1,11 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env +WORKDIR /app + +COPY . ./ +RUN dotnet restore +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 +WORKDIR /app +COPY --from=build-env /app/out . +ENTRYPOINT ["dotnet", "worker-2.dll"] \ No newline at end of file diff --git a/tasks/klementeva-ja/lab_3/worker-2/Program.cs b/tasks/klementeva-ja/lab_3/worker-2/Program.cs new file mode 100644 index 0000000..a432b93 --- /dev/null +++ b/tasks/klementeva-ja/lab_3/worker-2/Program.cs @@ -0,0 +1,145 @@ + +List agrs = new() +{ + new Agreement() { Uuid= Guid.NewGuid(), Number = "ISO-13485", Date = new DateOnly(), Sum = 50000, IdRequest = Guid.Parse("7184fa5f-b786-4478-863a-99cc000eb752") } +}; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); + +var app = builder.Build(); + +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.UseHttpsRedirection(); + +app.MapGet("/", () => +{ + return agrs.Select(r => new AgreementEntityDto() + { + Uuid = r.Uuid, + Number = r.Number, + Sum = r.Sum, + Date = r.Date, + IdRequest = r.IdRequest, + }); +}) +.WithName("GetAgreements") +.WithOpenApi(); + +app.MapGet("/{uuid}", (Guid uuid) => +{ + var agr = agrs.FirstOrDefault(r => r.Uuid == uuid); + if (agr == null) + return Results.NotFound(); + return Results.Json(new AgreementEntityDto() + { + Uuid = agr.Uuid, + Number = agr.Number, + Sum = agr.Sum, + Date = agr.Date, + IdRequest = agr.IdRequest, + }); +}) +.WithName("GetAgreementByGUID") +.WithOpenApi(); + +app.MapPost("/{number}/{date}/{sum}/{idRequest}", (string? number, DateOnly date, decimal sum, Guid idRequest) => +{ + Guid NewGuid = Guid.NewGuid(); + agrs.Add(new Agreement() { Uuid = NewGuid, Number = (string)number, Date = (DateOnly)date, Sum = (decimal)sum, IdRequest = (Guid)idRequest }); + + var agr = agrs.FirstOrDefault(r => r.Uuid == NewGuid); + if (agr == null) + return Results.NotFound(); + return Results.Json(new AgreementEntityDto() + { + Uuid = agr.Uuid, + Number = agr.Number, + Sum = agr.Sum, + Date = agr.Date, + IdRequest = agr.IdRequest, + }); +}) +.WithName("PostAgreement") +.WithOpenApi(); + +app.MapPatch("/{uuid}/{number}/{date}/{sum}/{idRequest}", (Guid uuid, string ?number, DateOnly date, decimal sum, Guid idRequest) => +{ + var agr = agrs.FirstOrDefault(r => r.Uuid == uuid); + if (agr == null) + return Results.NotFound(); + if (number != ",") agr.Number = number; + if (date != null)agr.Date = date; + if (sum != agr.Sum && sum != 0) agr.Sum = sum; + if (idRequest != agr.IdRequest) agr.IdRequest = idRequest; + + return Results.Json(new AgreementEntityDto() + { + Uuid = agr.Uuid, + Number = agr.Number, + Sum = agr.Sum, + Date = agr.Date, + IdRequest = agr.IdRequest, + }); +}) +.WithName("UpdateAgreement") +.WithOpenApi(); + +app.MapDelete("/{uuid}", (Guid uuid) => +{ + var agr = agrs.FirstOrDefault(r => r.Uuid == uuid); + if (agr == null) + return Results.NotFound(); + agrs.Remove(agr); + return Results.Json(new AgreementEntityDto() + { + Uuid = agr.Uuid, + Number = agr.Number, + Sum = agr.Sum, + Date = agr.Date, + IdRequest = agr.IdRequest, + }); +}) +.WithName("DeleteAgreement") +.WithOpenApi(); + +app.MapGet("/Requests/", async () => +{ + var httpClient = new HttpClient(); + var secondWorkerResponse = await httpClient.GetStringAsync("http://worker-1:8080/"); + + return secondWorkerResponse.ToArray(); +}) +.WithName("GetRequests") +.WithOpenApi(); + +app.Run(); + +public class Agreement +{ + public Guid Uuid { get; set; } + public string Number { get; set; } = string.Empty; + public DateOnly Date { get; set; } + public Guid IdRequest { get; set; } + public decimal Sum { get; set; } = 0; +} + +public class AgreementEntityDto : Agreement { } + +public class Request +{ + public Guid Uuid { get; set; } + public string Title { get; set; } = string.Empty; + public string SourceOfFunds { get; set; } = string.Empty; + public decimal Sum { get; set; } = 0; + public bool IsCompleted { get; set; } +} + +public class RequestEntityDto : Request { } \ No newline at end of file diff --git a/tasks/klementeva-ja/lab_3/worker-2/Properties/launchSettings.json b/tasks/klementeva-ja/lab_3/worker-2/Properties/launchSettings.json new file mode 100644 index 0000000..c0a3346 --- /dev/null +++ b/tasks/klementeva-ja/lab_3/worker-2/Properties/launchSettings.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:36404", + "sslPort": 44384 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5101", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7125;http://localhost:5101", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/tasks/klementeva-ja/lab_3/worker-2/appsettings.Development.json b/tasks/klementeva-ja/lab_3/worker-2/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/tasks/klementeva-ja/lab_3/worker-2/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/tasks/klementeva-ja/lab_3/worker-2/appsettings.json b/tasks/klementeva-ja/lab_3/worker-2/appsettings.json new file mode 100644 index 0000000..b41ccef --- /dev/null +++ b/tasks/klementeva-ja/lab_3/worker-2/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/tasks/klementeva-ja/lab_3/worker-2/worker-2.csproj b/tasks/klementeva-ja/lab_3/worker-2/worker-2.csproj new file mode 100644 index 0000000..9e8d22f --- /dev/null +++ b/tasks/klementeva-ja/lab_3/worker-2/worker-2.csproj @@ -0,0 +1,15 @@ + + + + net8.0 + enable + enable + worker_2 + + + + + + + + diff --git a/tasks/klementeva-ja/lab_3/worker-2/worker-2.sln b/tasks/klementeva-ja/lab_3/worker-2/worker-2.sln new file mode 100644 index 0000000..8f8c96d --- /dev/null +++ b/tasks/klementeva-ja/lab_3/worker-2/worker-2.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-2", "worker-2.csproj", "{C9D63524-2C63-4E86-91B6-D86955CFA5F8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C9D63524-2C63-4E86-91B6-D86955CFA5F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9D63524-2C63-4E86-91B6-D86955CFA5F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9D63524-2C63-4E86-91B6-D86955CFA5F8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9D63524-2C63-4E86-91B6-D86955CFA5F8}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal