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