From 1fddc2a3658001e8a1d92f9fe351391f6882bcb9 Mon Sep 17 00:00:00 2001 From: Vukasin Markovic Date: Wed, 1 Oct 2025 14:12:07 +0200 Subject: [PATCH 001/118] Add GitHub Action to prevent .env files in PRs to the main branch and delete unnecessary files --- .github/workflows/prevent-env-file.yml | 22 +++++++++++++++ ...2e89363d-bed5-4084-bbc4-9b3589b5bdad.vsidx | Bin 154934 -> 0 bytes .vs/FitPlusPlus/v17/.wsuo | Bin 11776 -> 0 bytes .vs/FitPlusPlus/v17/DocumentLayout.json | 12 --------- .vs/VSWorkspaceState.json | 10 ------- .vs/slnx.sqlite | Bin 237568 -> 0 bytes README.md | 25 +++++++----------- assets/admin.png | Bin 42533 -> 0 bytes assets/izbortrenera.png | Bin 50504 -> 0 bytes assets/login.png | Bin 22214 -> 0 bytes assets/registracija.png | Bin 34336 -> 0 bytes assets/trener.png | Bin 43754 -> 0 bytes assets/zakazivanje.png | Bin 56159 -> 0 bytes 13 files changed, 32 insertions(+), 37 deletions(-) create mode 100644 .github/workflows/prevent-env-file.yml delete mode 100644 .vs/FitPlusPlus/FileContentIndex/2e89363d-bed5-4084-bbc4-9b3589b5bdad.vsidx delete mode 100644 .vs/FitPlusPlus/v17/.wsuo delete mode 100644 .vs/FitPlusPlus/v17/DocumentLayout.json delete mode 100644 .vs/VSWorkspaceState.json delete mode 100644 .vs/slnx.sqlite delete mode 100644 assets/admin.png delete mode 100644 assets/izbortrenera.png delete mode 100644 assets/login.png delete mode 100644 assets/registracija.png delete mode 100644 assets/trener.png delete mode 100644 assets/zakazivanje.png diff --git a/.github/workflows/prevent-env-file.yml b/.github/workflows/prevent-env-file.yml new file mode 100644 index 0000000..a627e02 --- /dev/null +++ b/.github/workflows/prevent-env-file.yml @@ -0,0 +1,22 @@ +name: Prevent .env files in PRs + +on: + pull_request: + branches: + - main + +jobs: + check-env-files: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Search for .env files + run: | + if git diff --name-only origin/main...HEAD | grep -E '(^|/)\.env'; then + echo "❌ PR contain .env file, merge is forbiden." + exit 1 + else + echo "✅ There are no .env files in this PR-u." + fi diff --git a/.vs/FitPlusPlus/FileContentIndex/2e89363d-bed5-4084-bbc4-9b3589b5bdad.vsidx b/.vs/FitPlusPlus/FileContentIndex/2e89363d-bed5-4084-bbc4-9b3589b5bdad.vsidx deleted file mode 100644 index 433cd05fc36119392334d4fb2e6aea5f10b849dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154934 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 diff --git a/.vs/FitPlusPlus/v17/.wsuo b/.vs/FitPlusPlus/v17/.wsuo deleted file mode 100644 index 2e93c53d3d42eeb0243a1f75fbbee2a7b0d08d69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11776 zcmeHN+in|082+77pqxr61Smy{P=tC>M@~wdq=+h~a*!}7b(&P7T-aVGO=HKF?NV|F zNIVEa+#+}b-k@A_!{L%Q0EvX}o856{H|xoGHzcX>MC08#el!0+|7kWqKRox_H$PtZ zT_Wk4oRXd0GxE4mpE2I$d66ekX5G&2?k=17j@LnYgeY)R8u;tTh+LN~JX^9&RywC) zIo;*?=>tanF!|NrxBvVl^ECSX6dbG@Ky1i8`2gr^c)Kp2A23U}d02+J_#}I{HNJEK z)i}N?X?)@~rG^!>q>5YwElSAMpkJ@Ys0?LHcK7OM)<1{BW>B#t_kmKA4eXzJ-9TPM zP0Jh@^G^K7P(Ot1y8mJH)pE_X{9|qa?=J>(v6`~2(=(_)hfLa$*K9kB=S#@XBD3EM zLA@R`c%Ezu9Hsovj(*vd|1XYF{$Irz9mqe3fTU078N5>uP^QV6Cy=#FYgsqtUypkV z{mvt^Z0ZW#K6svN3Xo@Unf#Bd*LBqU`rYMuvZ?U@UELx)o(g=BIy@cvf2+z1@lg9f zZs50#atFDA);4$^O*!}<^dYp*5N(eu(?^&L8j6^?rhFhDV?iOU0dXC*E#-sxEpao6 zTn4_@KjdP3uW&7Wm|Re`BxQJ?1)#OW$EMFmO0;D~ro#hcN^bz4dXYY@D?V)x{WYcq z?7jpnqHO^A!M;`a{d)bv|Lf{-SA5E=o^KJDWl(w@fAo7-6~!xZ7o|9U>v8%yk^rA} zh3ADSia(DvRI!Flc;gLFgq(N}bq%bs8MC4Z(4YH$1#`LXpZucTVsgQ^(cu#Cd7fxL zUGaHVE+aEV@fn9yK!K)J>in_%eKP_5xp&6yOmXE`?5daTK5Y9>oIyHy6qv_ZYe3u9p>tb!y54(ep|}Y7tJ^}R~?HO&lEB<-(<(iqO@2PKF!8)jaYACni zefc+IRjjDf(<``|K>khr!~IqQtj~Z=t>2O{rGHJoYz!QtpVARp=n_^-A3r5#VXNrO*W=J>rinzJZ6r?l&L2C{V2 zv4GhnO`SQ+g0gF+AQB$K`C#vN&LgTliN%-{1vtH4t(_zA`$H& zafAoT+*K=q{mop&JlY1RNe}p;@1f(Lf&Vw~|BloDD?r+BL4!x{0Y{WB_dQ|TaZYmo zL0zHc&o;Mfo0dIS{o^{XYri!3HvO{-9YZa=q~al84@TF7`?s#{aos-CQlTVo<=tFDXK}|D=D(|7kJBW8_b>7|w z#qR*LMWbt_{IoajRkG!BWhVPpIiJgxsx#H>RCTgCHRFxvuT&?LQxx{N!lixFA6Rkw zAw96!ppY`M>`7KI!?Xt$z1yn(_Ml4xYzDf#~@geE-}3 q{V^Qzh52*>zW??8|A(}A+EApGfBI3>zr6WOVt)quBYd8Yy7VtGmlOv8 diff --git a/.vs/FitPlusPlus/v17/DocumentLayout.json b/.vs/FitPlusPlus/v17/DocumentLayout.json deleted file mode 100644 index b498df4..0000000 --- a/.vs/FitPlusPlus/v17/DocumentLayout.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "Version": 1, - "WorkspaceRootPath": "D:\\FitPlusPlus\\", - "Documents": [], - "DocumentGroupContainers": [ - { - "Orientation": 0, - "VerticalTabListWidth": 256, - "DocumentGroups": [] - } - ] -} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json deleted file mode 100644 index 29908f2..0000000 --- a/.vs/VSWorkspaceState.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ExpandedNodes": [ - "", - "\\Fitness", - "\\Fitness\\Backend", - "\\Fitness\\Backend\\Services" - ], - "SelectedNode": "\\Fitness\\Backend\\Services\\ClientService", - "PreviewInSolutionExplorer": false -} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite deleted file mode 100644 index eef363683f6683059eadf5426017a0ef592becf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237568 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%0A7Mvy`O|97}g7ZFAi4B@qFqg|Wp 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 diff --git a/README.md b/README.md index 3b604f8..5d03ecd 100644 --- a/README.md +++ b/README.md @@ -12,17 +12,16 @@ This project is an **extension of the previous FitPlusPlus application**, which ### Current Development Team (2024): -1. **Aleksandra Labović** – Student ID: 1025/2024 -2. **Vukašin Marković** – Student ID: 1051/2024 -3. **Stefan Milenković** – Student ID: 1076/2024 -4. **Milan Mitreski** – Student ID: 1073/2024 -5. **Natalija Filipović** – Student ID: 1013/2024 +1. **Marković Vukašin** – Student ID: 1051/2024 +2. **Milenković Stefan** – Student ID: 1076/2024; +3. **Mitreski Milan** – Student ID: 1073/2024 +4. **Filipović Natalija** – Student ID: 1013/2024 ### Previous Development Team (2023): -1. **Lazar Stanojević** – Student ID: 1013/2023 -2. **Vasilije Todorović** – Student ID: 1015/2023 -3. **Nikola Belaković** – Student ID: 1023/2023 +3. **Belaković Nikola** – Student ID: 1023/2023 +1. **Stanojević Lazar** – Student ID: 1013/2023 +2. **Todorović Vasilije** – Student ID: 1015/2023 GitHub Repository of the Previous Project: [FitPlusPlus](https://github.com/lazars01/FitPlusPlus) @@ -77,19 +76,15 @@ The FitPlusPlus application consists of multiple microservices, some developed b - Enables **booking of individual and group training sessions**. - Supports **real-time scheduling, cancellation, and availability tracking**. -4. **ManagerService** - - A service for **gym administrators**, providing tools for managing trainers, clients, and finances. - - Generates **performance reports and financial summaries**. - -5. **NotificationService** +4. **NotificationService** - Sends **push and email notifications** to clients, trainers, and administrators. - Includes **reservation confirmations, training reminders, and membership renewal alerts**. -6. **AnalyticsService** +5. **AnalyticsService** - Creates **detailed statistics** on training sessions, client engagement, and trainer performance. - Provides insights into **popular training types and user activity trends**. -7. **Gateway and Discovery Service** +6. **Gateway and Discovery Service** - A **centralized API gateway** that directs requests to the correct microservice. - Facilitates **automatic detection and scaling** of microservices. diff --git a/assets/admin.png b/assets/admin.png deleted file mode 100644 index e7aed6ebc26314b491468c4d4f833f54785839b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42533 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

x^`OGyg0!GX@aiWt|0rdE#+tj)shf0v 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 diff --git a/assets/izbortrenera.png b/assets/izbortrenera.png deleted file mode 100644 index 2f2a8eab2b1ac2eec656fe406ee99858194e70b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50504 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 diff --git a/assets/registracija.png b/assets/registracija.png deleted file mode 100644 index 0082baeb8621bff5b2ada8202582dfba8cd23c6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34336 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�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 Q!~M+DsZZ7aa{EjF0kdR=5C8xG From ef136d7558f9c4e369f66f065a3f6365eddcb150 Mon Sep 17 00:00:00 2001 From: milanmitreski Date: Mon, 17 Feb 2025 14:26:40 +0100 Subject: [PATCH 002/118] Basic skeleton for Reservation Service. Relates to #74. --- .gitignore | 4 +- Fitness/Backend/Fitness.sln | 6 + .../Controllers/ReservationController.cs | 117 ++++++++++++++++++ .../ReservationService.API/Data/Context.cs | 20 +++ .../ReservationService.API/Data/IContext.cs | 10 ++ .../ReservationService.API/Dockerfile | 23 ++++ .../Entities/GroupReservation.cs | 20 +++ .../Entities/IndividualReservation.cs | 16 +++ .../ReservationService.API/Program.cs | 42 +++++++ .../Properties/launchSettings.json | 31 +++++ .../Repository/IReservationRepository.cs | 19 +++ .../Repository/ReservationRepository.cs | 70 +++++++++++ .../ReservationService.API.csproj | 30 +++++ .../ReservationService.API.http | 6 + .../appsettings.Development.json | 8 ++ .../ReservationService.API/appsettings.json | 9 ++ 16 files changed, 429 insertions(+), 2 deletions(-) create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/Data/Context.cs create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/Data/IContext.cs create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/Dockerfile create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/GroupReservation.cs create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/IndividualReservation.cs create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/Program.cs create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/Properties/launchSettings.json create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/IReservationRepository.cs create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/ReservationRepository.cs create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.csproj create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.http create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/appsettings.Development.json create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/appsettings.json diff --git a/.gitignore b/.gitignore index 5a73fbc..7c4902f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -# MacOS -.DS_Store +**/.DS_Store +**/.idea/** diff --git a/Fitness/Backend/Fitness.sln b/Fitness/Backend/Fitness.sln index f07503b..bd2c542 100644 --- a/Fitness/Backend/Fitness.sln +++ b/Fitness/Backend/Fitness.sln @@ -25,6 +25,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventBus.Messages", "Common EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PaymentService.API", "Services\PaymentService\PaymentService.API\PaymentService.API.csproj", "{39B7B5E9-F9D8-4A1F-B4E5-216248755CCA}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReservationService.API", "Services\ReservationService\ReservationService.API\ReservationService.API.csproj", "{F3C942A5-0892-4451-9092-900F63365EC1}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotificationService.API", "Services\NotificationService\NotificationService.API\NotificationService.API.csproj", "{42D48CA2-5675-47F2-BAE7-91E595258CBA}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClientService.Common", "Services\ClientService\ClientService.Common\ClientService.Common.csproj", "{FA536695-2D2D-4B71-8883-95B6EEF320F6}" @@ -83,6 +85,10 @@ Global {39B7B5E9-F9D8-4A1F-B4E5-216248755CCA}.Debug|Any CPU.Build.0 = Debug|Any CPU {39B7B5E9-F9D8-4A1F-B4E5-216248755CCA}.Release|Any CPU.ActiveCfg = Release|Any CPU {39B7B5E9-F9D8-4A1F-B4E5-216248755CCA}.Release|Any CPU.Build.0 = Release|Any CPU + {F3C942A5-0892-4451-9092-900F63365EC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F3C942A5-0892-4451-9092-900F63365EC1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3C942A5-0892-4451-9092-900F63365EC1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F3C942A5-0892-4451-9092-900F63365EC1}.Release|Any CPU.Build.0 = Release|Any CPU {42D48CA2-5675-47F2-BAE7-91E595258CBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {42D48CA2-5675-47F2-BAE7-91E595258CBA}.Debug|Any CPU.Build.0 = Debug|Any CPU {42D48CA2-5675-47F2-BAE7-91E595258CBA}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs new file mode 100644 index 0000000..ace351f --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs @@ -0,0 +1,117 @@ +using AutoMapper; +using MassTransit; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using ReservationService.API.Entities; +using ReservationService.API.Repository; + +namespace ReservationService.API.Controllers; + +[Authorize] +[ApiController] +[Route("api/v1/[controller]")] +public class ReservationController : ControllerBase +{ + private readonly IReservationRepository _repository; + private readonly IMapper _mapper; + private readonly IPublishEndpoint _publishEndpoint; + + public ReservationController(IReservationRepository repository, IMapper mapper, IPublishEndpoint publishEndpoint) + { + _repository = repository ?? throw new ArgumentNullException(nameof(repository)); + _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); + _publishEndpoint = publishEndpoint ?? throw new ArgumentNullException(nameof(publishEndpoint)); + } + + [Authorize(Roles = "Admin")] + [HttpGet("individual")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetIndividualReservations([FromQuery] string? clientId, [FromQuery] string? trainerId) + { + var reservations = await _repository.GetIndividualReservationsAsync(clientId, trainerId); + return Ok(reservations); + } + + [Authorize(Roles = "Admin")] + [HttpGet("group")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetGroupReservations([FromQuery] string? clientId, [FromQuery] string? trainerId) + { + var reservations = await _repository.GetGroupReservationsAsync(clientId, trainerId); + return Ok(reservations); + } + + [HttpGet("individual/{id}")] + public async Task> GetIndividualReservation(string id) + { + var reservation = await _repository.GetIndividualReservationByIdAsync(id); + if (reservation == null) return NotFound(); + return Ok(reservation); + } + + [HttpGet("group/{id}")] + public async Task> GetGroupReservation(string id) + { + var reservation = await _repository.GetGroupReservationByIdAsync(id); + if (reservation == null) return NotFound(); + return Ok(reservation); + } + + [HttpPost("individual")] + public async Task CreateIndividualReservation([FromBody] IndividualReservation reservation) + { + await _repository.CreateIndividualReservationAsync(reservation); + return CreatedAtAction(nameof(GetIndividualReservation), new { id = reservation.Id }, reservation); + } + + [HttpPost("group")] + public async Task CreateGroupReservation([FromBody] GroupReservation reservation) + { + await _repository.CreateGroupReservationAsync(reservation); + return CreatedAtAction(nameof(GetGroupReservation), new { id = reservation.Id }, reservation); + } + + [HttpPut("individual/{id}")] + public async Task UpdateIndividualReservation(string id, [FromBody] IndividualReservation reservation) + { + await _repository.UpdateIndividualReservationAsync(id, reservation); + return NoContent(); + } + + [HttpPut("group/{id}")] + public async Task UpdateGroupReservation(string id, [FromBody] GroupReservation reservation) + { + await _repository.UpdateGroupReservationAsync(id, reservation); + return NoContent(); + } + + [HttpDelete("individual/{id}")] + public async Task DeleteIndividualReservation(string id) + { + await _repository.DeleteIndividualReservationAsync(id); + return NoContent(); + } + + [HttpDelete("group/{id}")] + public async Task DeleteGroupReservation(string id) + { + await _repository.DeleteGroupReservationAsync(id); + return NoContent(); + } + + [Authorize(Roles = "Client")] + [HttpPost("group/book/{id}")] + public async Task BookGroupReservation(string id, [FromQuery] string clientId) + { + await _repository.BookGroupReservationAsync(id, clientId); + return Ok(); + } + + [Authorize(Roles = "Client")] + [HttpPost("group/cancel/{id}")] + public async Task CancelGroupReservation(string id, [FromQuery] string clientId) + { + await _repository.CancelGroupReservationAsync(id, clientId); + return Ok(); + } +} \ No newline at end of file diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Data/Context.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Data/Context.cs new file mode 100644 index 0000000..e95b383 --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Data/Context.cs @@ -0,0 +1,20 @@ +using MongoDB.Driver; +using ReservationService.API.Entities; + +namespace ReservationService.API.Data; + +public class Context : IContext +{ + public IMongoCollection IndividualReservations { get; } + public IMongoCollection GroupReservations { get; } + + public Context(IConfiguration configuration) + { + var client = new MongoClient(configuration.GetValue("DatabaseSettings:ConnectionString")); + var database = client.GetDatabase("Reservations"); + + IndividualReservations = database.GetCollection("IndividualReservations"); + GroupReservations = database.GetCollection("GroupReservations"); + } + +} \ No newline at end of file diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Data/IContext.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Data/IContext.cs new file mode 100644 index 0000000..065d867 --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Data/IContext.cs @@ -0,0 +1,10 @@ +using MongoDB.Driver; +using ReservationService.API.Entities; + +namespace ReservationService.API.Data; + +public interface IContext +{ + IMongoCollection IndividualReservations { get; } + IMongoCollection GroupReservations { get; } +} \ No newline at end of file diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Dockerfile b/Fitness/Backend/Services/ReservationService/ReservationService.API/Dockerfile new file mode 100644 index 0000000..a1a44c7 --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Dockerfile @@ -0,0 +1,23 @@ +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +USER $APP_UID +WORKDIR /app +EXPOSE 8080 +EXPOSE 8081 + +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["Services/ReservationService/ReservationService.API/ReservationService.API.csproj", "Services/ReservationService/ReservationService.API/"] +RUN dotnet restore "Services/ReservationService/ReservationService.API/ReservationService.API.csproj" +COPY . . +WORKDIR "/src/Services/ReservationService/ReservationService.API" +RUN dotnet build "ReservationService.API.csproj" -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "ReservationService.API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "ReservationService.API.dll"] diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/GroupReservation.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/GroupReservation.cs new file mode 100644 index 0000000..28ff217 --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/GroupReservation.cs @@ -0,0 +1,20 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace ReservationService.API.Entities; + +public class GroupReservation +{ + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string Id { get; set; } + + public string Name { get; set; } + public string About { get; set; } + public string TrainerId { get; set; } + public int Capacity { get; set; } + public List Clients { get; set; } + public TimeSpan StartTime { get; set; } + public TimeSpan EndTime { get; set; } + public DateOnly Date { get; set; } +} \ No newline at end of file diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/IndividualReservation.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/IndividualReservation.cs new file mode 100644 index 0000000..9a5474e --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/IndividualReservation.cs @@ -0,0 +1,16 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace ReservationService.API.Entities; + +public class IndividualReservation +{ + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string Id { get; set; } + public string ClientId { get; set; } + public string TrainerId { get; set; } + public TimeSpan StartTime { get; set; } + public TimeSpan EndTime { get; set; } + public DateOnly Date { get; set; } +} \ No newline at end of file diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Program.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Program.cs new file mode 100644 index 0000000..60184ac --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Program.cs @@ -0,0 +1,42 @@ +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +// 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(); +} + +var summaries = new[] +{ + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" +}; + +app.MapGet("/weatherforecast", () => + { + var forecast = Enumerable.Range(1, 5).Select(index => + new WeatherForecast + ( + DateOnly.FromDateTime(DateTime.Now.AddDays(index)), + Random.Shared.Next(-20, 55), + summaries[Random.Shared.Next(summaries.Length)] + )) + .ToArray(); + return forecast; + }) + .WithName("GetWeatherForecast") + .WithOpenApi(); + +app.Run(); + +record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) +{ + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); +} \ No newline at end of file diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Properties/launchSettings.json b/Fitness/Backend/Services/ReservationService/ReservationService.API/Properties/launchSettings.json new file mode 100644 index 0000000..d83a849 --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:36095", + "sslPort": 0 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5055", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/IReservationRepository.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/IReservationRepository.cs new file mode 100644 index 0000000..598490e --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/IReservationRepository.cs @@ -0,0 +1,19 @@ +using ReservationService.API.Entities; + +namespace ReservationService.API.Repository; + +public interface IReservationRepository +{ + Task> GetIndividualReservationsAsync(string? clientId, string? trainerId); + Task> GetGroupReservationsAsync(string? clientId, string? trainerId); + Task GetIndividualReservationByIdAsync(string id); + Task GetGroupReservationByIdAsync(string id); + Task CreateIndividualReservationAsync(IndividualReservation reservation); + Task CreateGroupReservationAsync(GroupReservation reservation); + Task UpdateIndividualReservationAsync(string id, IndividualReservation reservation); + Task UpdateGroupReservationAsync(string id, GroupReservation reservation); + Task DeleteIndividualReservationAsync(string id); + Task DeleteGroupReservationAsync(string id); + Task BookGroupReservationAsync(string reservationId, string clientId); + Task CancelGroupReservationAsync(string reservationId, string clientId); +} \ No newline at end of file diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/ReservationRepository.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/ReservationRepository.cs new file mode 100644 index 0000000..2e751f3 --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/ReservationRepository.cs @@ -0,0 +1,70 @@ +using ReservationService.API.Entities; + +namespace ReservationService.API.Repository; + +public class ReservationRepository : IReservationRepository + { + public async Task> GetIndividualReservationsAsync(string? clientId, string? trainerId) + { + // Implement database query logic here + return new List(); + } + + public async Task> GetGroupReservationsAsync(string? clientId, string? trainerId) + { + // Implement database query logic here + return new List(); + } + + public async Task GetIndividualReservationByIdAsync(string id) + { + // Implement database query logic here + return new IndividualReservation(); + } + + public async Task GetGroupReservationByIdAsync(string id) + { + // Implement database query logic here + return new GroupReservation(); + } + + public async Task CreateIndividualReservationAsync(IndividualReservation reservation) + { + // Implement create logic here + } + + public async Task CreateGroupReservationAsync(GroupReservation reservation) + { + // Implement create logic here + } + + public async Task UpdateIndividualReservationAsync(string id, IndividualReservation reservation) + { + // Implement update logic here + } + + public async Task UpdateGroupReservationAsync(string id, GroupReservation reservation) + { + // Implement update logic here + } + + public async Task DeleteIndividualReservationAsync(string id) + { + // Implement delete logic here + } + + public async Task DeleteGroupReservationAsync(string id) + { + // Implement delete logic here + } + + public async Task BookGroupReservationAsync(string reservationId, string clientId) + { + // Implement booking logic here + } + + public async Task CancelGroupReservationAsync(string reservationId, string clientId) + { + // Implement cancel logic here + } + } \ No newline at end of file diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.csproj b/Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.csproj new file mode 100644 index 0000000..1837657 --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.csproj @@ -0,0 +1,30 @@ + + + + net8.0 + enable + enable + Linux + + + + + + + + + + + + + + + .dockerignore + + + + + + + + diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.http b/Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.http new file mode 100644 index 0000000..f6e5109 --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.http @@ -0,0 +1,6 @@ +@ReservationService.API_HostAddress = http://localhost:5055 + +GET {{ReservationService.API_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/appsettings.Development.json b/Fitness/Backend/Services/ReservationService/ReservationService.API/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/appsettings.json b/Fitness/Backend/Services/ReservationService/ReservationService.API/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} From 2a55df494931027198dd78dd83ac4bdd0eefeb91 Mon Sep 17 00:00:00 2001 From: milanmitreski Date: Mon, 17 Feb 2025 15:24:22 +0100 Subject: [PATCH 003/118] Reservation Controller and Repository methods changed and implemented. Relates to #75. --- .../Controllers/ReservationController.cs | 114 +++++++++++++----- .../Repository/IReservationRepository.cs | 38 +++--- .../Repository/ReservationRepository.cs | 98 ++++++++++----- .../ReservationService.API.csproj | 2 +- 4 files changed, 176 insertions(+), 76 deletions(-) diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs index ace351f..344a02a 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs @@ -26,92 +26,142 @@ public ReservationController(IReservationRepository repository, IMapper mapper, [Authorize(Roles = "Admin")] [HttpGet("individual")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - public async Task>> GetIndividualReservations([FromQuery] string? clientId, [FromQuery] string? trainerId) + public async Task>> GetIndividualReservations() { - var reservations = await _repository.GetIndividualReservationsAsync(clientId, trainerId); + var reservations = await _repository.GetIndividualReservationsAsync(); return Ok(reservations); } [Authorize(Roles = "Admin")] [HttpGet("group")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - public async Task>> GetGroupReservations([FromQuery] string? clientId, [FromQuery] string? trainerId) + public async Task>> GetGroupReservations() { - var reservations = await _repository.GetGroupReservationsAsync(clientId, trainerId); + var reservations = await _repository.GetGroupReservationsAsync(); return Ok(reservations); } - + + [Authorize(Roles = "Admin")] [HttpGet("individual/{id}")] + [ProducesResponseType(typeof(IndividualReservation), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetIndividualReservation(string id) { var reservation = await _repository.GetIndividualReservationByIdAsync(id); if (reservation == null) return NotFound(); return Ok(reservation); } - + + [Authorize(Roles = "Admin")] [HttpGet("group/{id}")] + [ProducesResponseType(typeof(GroupReservation), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetGroupReservation(string id) { var reservation = await _repository.GetGroupReservationByIdAsync(id); if (reservation == null) return NotFound(); return Ok(reservation); } + + [Authorize(Roles = "Admin, Client")] + [HttpGet("individual/client/{clientId}")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetIndividualReservationsByClientId(string clientId) + { + var reservations = await _repository.GetIndividualReservationsByClientIdAsync(clientId); + return Ok(reservations); + } + + [Authorize(Roles = "Admin, Client")] + [HttpGet("group/client/{clientId}")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetGroupReservationsByClientId(string clientId) + { + var reservations = await _repository.GetGroupReservationsByClientIdAsync(clientId); + return Ok(reservations); + } + [Authorize(Roles = "Admin, Trainer")] + [HttpGet("individual/trainer/{trainerId}")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetIndividualReservationsByTrainerId(string trainerId) + { + var reservations = await _repository.GetIndividualReservationsByTrainerIdAsync(trainerId); + return Ok(reservations); + } + + [Authorize(Roles = "Admin, Trainer")] + [HttpGet("group/trainer/{trainerId}")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetGroupReservationsByTrainerId(string trainerId) + { + var reservations = await _repository.GetGroupReservationsByTrainerIdAsync(trainerId); + return Ok(reservations); + } + + [Authorize(Roles = "Client")] [HttpPost("individual")] - public async Task CreateIndividualReservation([FromBody] IndividualReservation reservation) + [ProducesResponseType(typeof(IndividualReservation), StatusCodes.Status201Created)] + public async Task> CreateIndividualReservation([FromBody] IndividualReservation reservation) { await _repository.CreateIndividualReservationAsync(reservation); - return CreatedAtAction(nameof(GetIndividualReservation), new { id = reservation.Id }, reservation); + return CreatedAtRoute(nameof(GetIndividualReservation), new { id = reservation.Id }, reservation); } - + + [Authorize(Roles = "Trainer")] [HttpPost("group")] - public async Task CreateGroupReservation([FromBody] GroupReservation reservation) + [ProducesResponseType(typeof(GroupReservation), StatusCodes.Status201Created)] + public async Task> CreateGroupReservation([FromBody] GroupReservation reservation) { await _repository.CreateGroupReservationAsync(reservation); - return CreatedAtAction(nameof(GetGroupReservation), new { id = reservation.Id }, reservation); + return CreatedAtRoute(nameof(GetGroupReservation), new { id = reservation.Id }, reservation); } - - [HttpPut("individual/{id}")] - public async Task UpdateIndividualReservation(string id, [FromBody] IndividualReservation reservation) + + [Authorize(Roles = "Client, Trainer")] + [HttpPut("individual")] + [ProducesResponseType(typeof(IndividualReservation), StatusCodes.Status200OK)] + public async Task UpdateIndividualReservation([FromBody] IndividualReservation reservation) { - await _repository.UpdateIndividualReservationAsync(id, reservation); - return NoContent(); - } - - [HttpPut("group/{id}")] - public async Task UpdateGroupReservation(string id, [FromBody] GroupReservation reservation) + return Ok(await _repository.UpdateIndividualReservationAsync(reservation)); + } + + [Authorize(Roles = "Trainer")] + [HttpPut("group")] + [ProducesResponseType(typeof(GroupReservation), StatusCodes.Status200OK)] + public async Task UpdateGroupReservation([FromBody] GroupReservation reservation) { - await _repository.UpdateGroupReservationAsync(id, reservation); - return NoContent(); + return Ok(await _repository.UpdateGroupReservationAsync(reservation)); } + [Authorize(Roles = "Client, Trainer")] [HttpDelete("individual/{id}")] + [ProducesResponseType(typeof(IndividualReservation), StatusCodes.Status200OK)] public async Task DeleteIndividualReservation(string id) { - await _repository.DeleteIndividualReservationAsync(id); - return NoContent(); + return Ok(await _repository.DeleteIndividualReservationAsync(id)); } + [Authorize(Roles = "Trainer")] [HttpDelete("group/{id}")] + [ProducesResponseType(typeof(GroupReservation), StatusCodes.Status200OK)] public async Task DeleteGroupReservation(string id) { - await _repository.DeleteGroupReservationAsync(id); - return NoContent(); + return Ok(await _repository.DeleteGroupReservationAsync(id)); } [Authorize(Roles = "Client")] [HttpPost("group/book/{id}")] + [ProducesResponseType(typeof(GroupReservation), StatusCodes.Status200OK)] public async Task BookGroupReservation(string id, [FromQuery] string clientId) { - await _repository.BookGroupReservationAsync(id, clientId); - return Ok(); + return Ok(await _repository.BookGroupReservationAsync(id, clientId)); } [Authorize(Roles = "Client")] [HttpPost("group/cancel/{id}")] + [ProducesResponseType(typeof(GroupReservation), StatusCodes.Status200OK)] public async Task CancelGroupReservation(string id, [FromQuery] string clientId) - { - await _repository.CancelGroupReservationAsync(id, clientId); - return Ok(); + { + return Ok(await _repository.CancelGroupReservationAsync(id, clientId)); } -} \ No newline at end of file +} diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/IReservationRepository.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/IReservationRepository.cs index 598490e..fedc3c6 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/IReservationRepository.cs +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/IReservationRepository.cs @@ -1,19 +1,27 @@ using ReservationService.API.Entities; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; -namespace ReservationService.API.Repository; - -public interface IReservationRepository +namespace ReservationService.API.Repository { - Task> GetIndividualReservationsAsync(string? clientId, string? trainerId); - Task> GetGroupReservationsAsync(string? clientId, string? trainerId); - Task GetIndividualReservationByIdAsync(string id); - Task GetGroupReservationByIdAsync(string id); - Task CreateIndividualReservationAsync(IndividualReservation reservation); - Task CreateGroupReservationAsync(GroupReservation reservation); - Task UpdateIndividualReservationAsync(string id, IndividualReservation reservation); - Task UpdateGroupReservationAsync(string id, GroupReservation reservation); - Task DeleteIndividualReservationAsync(string id); - Task DeleteGroupReservationAsync(string id); - Task BookGroupReservationAsync(string reservationId, string clientId); - Task CancelGroupReservationAsync(string reservationId, string clientId); + public interface IReservationRepository + { + Task> GetIndividualReservationsAsync(); + Task> GetGroupReservationsAsync(); + Task GetIndividualReservationByIdAsync(string id); + Task GetGroupReservationByIdAsync(string id); + Task> GetIndividualReservationsByClientIdAsync(string clientId); + Task> GetGroupReservationsByClientIdAsync(string clientId); + Task> GetIndividualReservationsByTrainerIdAsync(string trainerId); + Task> GetGroupReservationsByTrainerIdAsync(string trainerId); + Task CreateIndividualReservationAsync(IndividualReservation reservation); + Task CreateGroupReservationAsync(GroupReservation reservation); + Task UpdateIndividualReservationAsync(IndividualReservation reservation); + Task UpdateGroupReservationAsync(GroupReservation reservation); + Task DeleteIndividualReservationAsync(string id); + Task DeleteGroupReservationAsync(string id); + Task BookGroupReservationAsync(string id, string clientId); + Task CancelGroupReservationAsync(string id, string clientId); + } } \ No newline at end of file diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/ReservationRepository.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/ReservationRepository.cs index 2e751f3..3da3dc8 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/ReservationRepository.cs +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/ReservationRepository.cs @@ -1,70 +1,112 @@ +using MongoDB.Driver; +using ReservationService.API.Data; using ReservationService.API.Entities; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; -namespace ReservationService.API.Repository; - -public class ReservationRepository : IReservationRepository +namespace ReservationService.API.Repository +{ + public class ReservationRepository : IReservationRepository { - public async Task> GetIndividualReservationsAsync(string? clientId, string? trainerId) + private readonly IContext _context; + + public ReservationRepository(IContext context) + { + _context = context ?? throw new ArgumentNullException(nameof(context)); + } + + public async Task> GetIndividualReservationsAsync() { - // Implement database query logic here - return new List(); + return await _context.IndividualReservations.Find(_ => true).ToListAsync(); } - public async Task> GetGroupReservationsAsync(string? clientId, string? trainerId) + public async Task> GetGroupReservationsAsync() { - // Implement database query logic here - return new List(); + return await _context.GroupReservations.Find(_ => true).ToListAsync(); } public async Task GetIndividualReservationByIdAsync(string id) { - // Implement database query logic here - return new IndividualReservation(); + return await _context.IndividualReservations.Find(r => r.Id == id).FirstOrDefaultAsync(); } public async Task GetGroupReservationByIdAsync(string id) { - // Implement database query logic here - return new GroupReservation(); + return await _context.GroupReservations.Find(r => r.Id == id).FirstOrDefaultAsync(); + } + + public async Task> GetIndividualReservationsByClientIdAsync(string clientId) + { + return await _context.IndividualReservations.Find(r => r.ClientId == clientId).ToListAsync(); + } + + public async Task> GetGroupReservationsByClientIdAsync(string clientId) + { + return await _context.GroupReservations.Find(r => r.Clients.Contains(clientId)).ToListAsync(); + } + + public async Task> GetIndividualReservationsByTrainerIdAsync(string trainerId) + { + return await _context.IndividualReservations.Find(r => r.TrainerId == trainerId).ToListAsync(); + } + + public async Task> GetGroupReservationsByTrainerIdAsync(string trainerId) + { + return await _context.GroupReservations.Find(r => r.TrainerId == trainerId).ToListAsync(); } public async Task CreateIndividualReservationAsync(IndividualReservation reservation) { - // Implement create logic here + await _context.IndividualReservations.InsertOneAsync(reservation); } public async Task CreateGroupReservationAsync(GroupReservation reservation) { - // Implement create logic here + await _context.GroupReservations.InsertOneAsync(reservation); } - public async Task UpdateIndividualReservationAsync(string id, IndividualReservation reservation) + public async Task UpdateIndividualReservationAsync(IndividualReservation reservation) { - // Implement update logic here + var result = await _context.IndividualReservations.ReplaceOneAsync(r => r.Id == reservation.Id, reservation); + return result.IsAcknowledged && result.ModifiedCount > 0; } - public async Task UpdateGroupReservationAsync(string id, GroupReservation reservation) + public async Task UpdateGroupReservationAsync(GroupReservation reservation) { - // Implement update logic here + var result = await _context.GroupReservations.ReplaceOneAsync(r => r.Id == reservation.Id, reservation); + return result.IsAcknowledged && result.ModifiedCount > 0; } - public async Task DeleteIndividualReservationAsync(string id) + public async Task DeleteIndividualReservationAsync(string id) { - // Implement delete logic here + var result = await _context.IndividualReservations.DeleteOneAsync(r => r.Id == id); + return result.IsAcknowledged && result.DeletedCount > 0; } - public async Task DeleteGroupReservationAsync(string id) + public async Task DeleteGroupReservationAsync(string id) { - // Implement delete logic here + var result = await _context.GroupReservations.DeleteOneAsync(r => r.Id == id); + return result.IsAcknowledged && result.DeletedCount > 0; } - public async Task BookGroupReservationAsync(string reservationId, string clientId) + public async Task BookGroupReservationAsync(string id, string clientId) { - // Implement booking logic here + var reservation = await GetGroupReservationByIdAsync(id); + if (reservation.Capacity >= reservation.Clients.Count) + return false; + + reservation.Clients.Add(clientId); + var result = await _context.GroupReservations.ReplaceOneAsync(r => r.Id == id, reservation); + return result.IsAcknowledged && result.ModifiedCount > 0; } - public async Task CancelGroupReservationAsync(string reservationId, string clientId) + public async Task CancelGroupReservationAsync(string id, string clientId) { - // Implement cancel logic here + var reservation = await GetGroupReservationByIdAsync(id); + reservation.Clients.Remove(clientId); + var result = await _context.GroupReservations.ReplaceOneAsync(r => r.Id == id, reservation); + return result.IsAcknowledged && result.ModifiedCount > 0; } - } \ No newline at end of file + } +} \ No newline at end of file diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.csproj b/Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.csproj index 1837657..26a0633 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.csproj +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.csproj @@ -11,7 +11,7 @@ - + From 898ed2372de03a04c5b29673a7d7259a996c7655 Mon Sep 17 00:00:00 2001 From: milanmitreski Date: Tue, 18 Feb 2025 19:15:07 +0100 Subject: [PATCH 004/118] NotificationEvent implemented. NotificationService added to docker-compose.yml and docker-compose.override.yml. Relates to #76. --- .../Events/NotificationEvent.cs | 11 +- .../Entities/Notification.cs | 24 ++++ .../ReservationService.API/Program.cs | 57 ++++---- .../ReservationService.API.csproj | 3 +- Fitness/Backend/docker-compose.override.yml | 127 ++++++++++++++++++ Fitness/Backend/docker-compose.yml | 10 ++ 6 files changed, 199 insertions(+), 33 deletions(-) create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/Notification.cs create mode 100644 Fitness/Backend/docker-compose.override.yml diff --git a/Fitness/Backend/Common/EventBus.Messages/Events/NotificationEvent.cs b/Fitness/Backend/Common/EventBus.Messages/Events/NotificationEvent.cs index 3950429..3bb095e 100644 --- a/Fitness/Backend/Common/EventBus.Messages/Events/NotificationEvent.cs +++ b/Fitness/Backend/Common/EventBus.Messages/Events/NotificationEvent.cs @@ -2,19 +2,12 @@ namespace EventBus.Messages.Events; public class NotificationEvent : IntegrationBaseEvent { - public string UserId { get; set; } - public UserType UType { get; set; } + public IDictionary UserIdToUserType; public string Title { get; set; } public string Content { get; set; } - public NotificationType NType { get; set; } + public NotificationType Type { get; set; } public bool Email { get; set; } - public enum UserType - { - Client, - Trainer - } - public enum NotificationType { Information, diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/Notification.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/Notification.cs new file mode 100644 index 0000000..5064c4c --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/Notification.cs @@ -0,0 +1,24 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace ReservationService.API.Entities; + +public class Notification +{ + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public Guid Id { get; set; } + public DateTime CreationDate { get; set; } + public IDictionary UserIdToUserType; + public string Title { get; set; } + public string Content { get; set; } + public NotificationType Type { get; set; } + public bool Email { get; set; } + public bool NotificationRead { get; set; } = false; + + public enum NotificationType + { + Information, + Warning + } +} \ No newline at end of file diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Program.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Program.cs index 60184ac..925cc7c 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/Program.cs +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Program.cs @@ -1,10 +1,39 @@ +using EventBus.Messages.Events; +using MassTransit; +using ReservationService.API.Data; +using ReservationService.API.Entities; +using ReservationService.API.Repository; + var builder = WebApplication.CreateBuilder(args); +builder.Services.AddScoped(); +builder.Services.AddScoped(); + +builder.Services.AddControllers(); // Add services to the container. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); +builder.Services.AddCors(options => +{ + options.AddPolicy("CorsPolicy", builder => + builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()); +}); + +builder.Services.AddAutoMapper(configuration => +{ + configuration.CreateMap().ReverseMap(); + configuration.CreateMap().ReverseMap(); +}); + +builder.Services.AddMassTransit(config => +{ + config.UsingRabbitMq((_, cfg) => + { + cfg.Host(builder.Configuration["EventBusSettings:HostAddress"]); + }); +}); var app = builder.Build(); // Configure the HTTP request pipeline. @@ -14,29 +43,11 @@ app.UseSwaggerUI(); } -var summaries = new[] -{ - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" -}; +app.UseRouting(); -app.MapGet("/weatherforecast", () => - { - var forecast = Enumerable.Range(1, 5).Select(index => - new WeatherForecast - ( - DateOnly.FromDateTime(DateTime.Now.AddDays(index)), - Random.Shared.Next(-20, 55), - summaries[Random.Shared.Next(summaries.Length)] - )) - .ToArray(); - return forecast; - }) - .WithName("GetWeatherForecast") - .WithOpenApi(); +app.UseAuthentication(); +app.UseAuthorization(); -app.Run(); +app.MapControllers(); -record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) -{ - public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); -} \ No newline at end of file +app.Run(); diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.csproj b/Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.csproj index 26a0633..de6cf5b 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.csproj +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/ReservationService.API.csproj @@ -9,6 +9,7 @@ + @@ -24,7 +25,7 @@ - + diff --git a/Fitness/Backend/docker-compose.override.yml b/Fitness/Backend/docker-compose.override.yml new file mode 100644 index 0000000..e32baf1 --- /dev/null +++ b/Fitness/Backend/docker-compose.override.yml @@ -0,0 +1,127 @@ +services: + trainerdb: + container_name: trainerdb + restart: always + ports: + - 27017:27017 + volumes: + - trainermongo_data:/data/db + + + clientdb: + container_name: clientdb + restart: always + ports: + - 27019:27017 + volumes: + - clientmongo_data:/data/db + + reviewdb: + container_name: reviewdb + restart: always + ports: + - 27018:27017 + volumes: + - reviewmongo_data:/data/db + + paymentdb: + container_name: paymentdb + restart: always + ports: + - 27020:27017 + volumes: + - paymentmongo_data:/data/db + + reservationdb: + container_name: reservationdb + restart: always + ports: + - 27023:27017 + volumes: + - reservationmongo_data:/data/db + + rabbitmq: + container_name: rabbitmq + restart: always + ports: + - 5672:5672 + - 15672:15672 + mssql: + container_name: mssql + environment: + - SA_PASSWORD=MATF12345678rs2 + - ACCEPT_EULA=Y + restart: always + ports: + - "1433:1433" + volumes: + - mssql_data:/var/opt/mssql/data + + trainerservice.api: + container_name: trainerservice.api + environment: + - ASPNETCORE_ENVIRONMENT=Development + - "DatabaseSettings:ConnectionString=mongodb://trainerdb:27017" + - "GrpcSettings:ReviewUrl=http://host.docker.internal:8002" + - "EventBusSettings:HostAddress=amqp://guest:guest@rabbitmq:5672" + depends_on: + - trainerdb + - rabbitmq + ports: + - "8000:8080" + + clientservice.api: + container_name: clientservice.api + environment: + - ASPNETCORE_ENVIRONMENT=Development + - "DatabaseSettings:ConnectionString=mongodb://clientdb:27017" + - "EventBusSettings:HostAddress=amqp://guest:guest@rabbitmq:5672" + depends_on: + - clientdb + - rabbitmq + ports: + - "8100:8080" + + identityserver: + container_name: identityserver + environment: + - ASPNETCORE_ENVIRONMENT=Development + - "ConnectionStrings:IdentityConnectionString=Server=mssql;Database=IdentityDb;User Id=sa;Password=MATF12345678rs2;TrustServerCertificate=True;Encrypt=False;" + depends_on: + - mssql + ports: + - "4000:8080" + + reviewservice.api: + container_name: reviewservice.api + environment: + - ASPNETCORE_ENVIRONMENT=Development + - "DatabaseSettings:ConnectionString=mongodb://reviewdb:27017" + depends_on: + - reviewdb + ports: + - "8001:8080" + + + reviewservice.grpc: + container_name: reviewservice.grpc + environment: + - ASPNETCORE_ENVIRONMENT=Development + - "DatabaseSettings:ConnectionString=mongodb://reviewdb:27017" + depends_on: + - reviewdb + ports: + - "8002:8080" + + paymentservice.api: + container_name: paymentservice.api + environment: + - ASPNETCORE_ENVIRONMENT=Development + - "DatabaseSettings:ConnectionString=mongodb://paymentdb:27017" + - PAYPAL_CLIENT_ID="PayPalSettings:ClientId" + - PAYPAL_CLIENT_SECRET="PayPalSettings:ClientSecret" + depends_on: + - paymentdb + ports: + - "8003:8080" + diff --git a/Fitness/Backend/docker-compose.yml b/Fitness/Backend/docker-compose.yml index 3960d0c..e795ae5 100644 --- a/Fitness/Backend/docker-compose.yml +++ b/Fitness/Backend/docker-compose.yml @@ -18,6 +18,9 @@ services: chatdb: image: mongo + + reservationdb: + image: mongo rabbitmq: image: rabbitmq:3-management-alpine @@ -99,6 +102,12 @@ services: build: context: . dockerfile: Services/PaymentService/PaymentService.API/Dockerfile + + reservationservice.api: + image: ${DOCKER_REGISTRY-}reservationserviceapi + build: + context: . + dockerfile: Services/ReservationService/ReservationService.API/Dockerfile depends_on: - paymentdb - consul @@ -124,6 +133,7 @@ volumes: reviewmongo_data: clientmongo_data: paymentmongo_data: + reservationmongo_data: notificationmongo_data: chatmongo_data: mssql_data: From c4f68c28a1888318a890a26c5fbb1fe7158103d5 Mon Sep 17 00:00:00 2001 From: milanmitreski Date: Wed, 19 Feb 2025 15:29:43 +0100 Subject: [PATCH 005/118] Notification publishing finished. Relates to #76. --- .../NotificationService.API/.env | 1 + .../Controllers/ReservationController.cs | 108 ++++++++++++++++-- .../Entities/Notification.cs | 5 - .../ReservationService.API/Program.cs | 2 + .../Publishers/INotificationPublisher.cs | 8 ++ .../Publishers/NotificationPublisher.cs | 34 ++++++ 6 files changed, 142 insertions(+), 16 deletions(-) create mode 100644 Fitness/Backend/Services/NotificationService/NotificationService.API/.env create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/Publishers/INotificationPublisher.cs create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/Publishers/NotificationPublisher.cs diff --git a/Fitness/Backend/Services/NotificationService/NotificationService.API/.env b/Fitness/Backend/Services/NotificationService/NotificationService.API/.env new file mode 100644 index 0000000..5398d80 --- /dev/null +++ b/Fitness/Backend/Services/NotificationService/NotificationService.API/.env @@ -0,0 +1 @@ +EMAIL_PASSWORD=Fit++RS2 \ No newline at end of file diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs index 344a02a..b7d486e 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs @@ -3,7 +3,9 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using ReservationService.API.Entities; +using ReservationService.API.Publishers; using ReservationService.API.Repository; +// ReSharper disable All namespace ReservationService.API.Controllers; @@ -13,14 +15,12 @@ namespace ReservationService.API.Controllers; public class ReservationController : ControllerBase { private readonly IReservationRepository _repository; - private readonly IMapper _mapper; - private readonly IPublishEndpoint _publishEndpoint; + private readonly INotificationPublisher _notificationPublisher; - public ReservationController(IReservationRepository repository, IMapper mapper, IPublishEndpoint publishEndpoint) + public ReservationController(IReservationRepository repository, INotificationPublisher notificationPublisher) { _repository = repository ?? throw new ArgumentNullException(nameof(repository)); - _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); - _publishEndpoint = publishEndpoint ?? throw new ArgumentNullException(nameof(publishEndpoint)); + _notificationPublisher = notificationPublisher ?? throw new ArgumentNullException(nameof(notificationPublisher)); } [Authorize(Roles = "Admin")] @@ -105,6 +105,12 @@ public async Task>> GetGroupReservati public async Task> CreateIndividualReservation([FromBody] IndividualReservation reservation) { await _repository.CreateIndividualReservationAsync(reservation); + + var users = new Dictionary(); + users.Add(reservation.ClientId, "Client"); + users.Add(reservation.TrainerId, "Trainer"); + await _notificationPublisher.PublishNotification("Training reservation created", reservation.ToString(), "Information", true, users); + return CreatedAtRoute(nameof(GetIndividualReservation), new { id = reservation.Id }, reservation); } @@ -122,7 +128,18 @@ public async Task> CreateGroupReservation([FromBo [ProducesResponseType(typeof(IndividualReservation), StatusCodes.Status200OK)] public async Task UpdateIndividualReservation([FromBody] IndividualReservation reservation) { - return Ok(await _repository.UpdateIndividualReservationAsync(reservation)); + var updated = await _repository.UpdateIndividualReservationAsync(reservation); + + if (updated) + { + var users = new Dictionary(); + users.Add(reservation.ClientId, "Client"); + users.Add(reservation.TrainerId, "Trainer"); + await _notificationPublisher.PublishNotification("Training reservation updated", reservation.ToString(), + "Information", true, users); + } + + return Ok(updated); } [Authorize(Roles = "Trainer")] @@ -130,7 +147,21 @@ public async Task UpdateIndividualReservation([FromBody] Individu [ProducesResponseType(typeof(GroupReservation), StatusCodes.Status200OK)] public async Task UpdateGroupReservation([FromBody] GroupReservation reservation) { - return Ok(await _repository.UpdateGroupReservationAsync(reservation)); + var updated = await _repository.UpdateGroupReservationAsync(reservation); + + if (updated) + { + var users = new Dictionary(); + foreach (var clientId in reservation.Clients) + { + users.Add(clientId, "Client"); + } + users.Add(reservation.TrainerId, "Trainer"); + await _notificationPublisher.PublishNotification("Training reservation updated", reservation.ToString(), + "Information", true, users); + } + + return Ok(updated); } [Authorize(Roles = "Client, Trainer")] @@ -138,7 +169,21 @@ public async Task UpdateGroupReservation([FromBody] GroupReservat [ProducesResponseType(typeof(IndividualReservation), StatusCodes.Status200OK)] public async Task DeleteIndividualReservation(string id) { - return Ok(await _repository.DeleteIndividualReservationAsync(id)); + var reservation = await _repository.GetIndividualReservationByIdAsync(id); + var deleted = await _repository.DeleteIndividualReservationAsync(id); + + if (deleted) + { + var users = new Dictionary + { + { reservation.ClientId, "Client" }, + { reservation.TrainerId, "Trainer" } + }; + await _notificationPublisher.PublishNotification("Training reservation cancelled", reservation.ToString(), + "Information", true, users); + } + + return Ok(deleted); } [Authorize(Roles = "Trainer")] @@ -146,7 +191,22 @@ public async Task DeleteIndividualReservation(string id) [ProducesResponseType(typeof(GroupReservation), StatusCodes.Status200OK)] public async Task DeleteGroupReservation(string id) { - return Ok(await _repository.DeleteGroupReservationAsync(id)); + var reservation = await _repository.GetGroupReservationByIdAsync(id); + var deleted = await _repository.UpdateGroupReservationAsync(reservation); + + if (deleted) + { + var users = new Dictionary(); + foreach (var clientId in reservation.Clients) + { + users.Add(clientId, "Client"); + } + users.Add(reservation.TrainerId, "Trainer"); + await _notificationPublisher.PublishNotification("Training reservation cancelled", reservation.ToString(), + "Information", true, users); + } + + return Ok(deleted); } [Authorize(Roles = "Client")] @@ -154,7 +214,19 @@ public async Task DeleteGroupReservation(string id) [ProducesResponseType(typeof(GroupReservation), StatusCodes.Status200OK)] public async Task BookGroupReservation(string id, [FromQuery] string clientId) { - return Ok(await _repository.BookGroupReservationAsync(id, clientId)); + var reservation = await _repository.GetGroupReservationByIdAsync(id); + var booked = await _repository.BookGroupReservationAsync(id, clientId); + + if (booked) + { + var users = new Dictionary(); + users.Add(clientId, "Client"); + users.Add(reservation.TrainerId, "Trainer"); + await _notificationPublisher.PublishNotification("Training reservation booked", reservation.ToString(), + "Information", true, users); + } + + return Ok(booked); } [Authorize(Roles = "Client")] @@ -162,6 +234,20 @@ public async Task BookGroupReservation(string id, [FromQuery] str [ProducesResponseType(typeof(GroupReservation), StatusCodes.Status200OK)] public async Task CancelGroupReservation(string id, [FromQuery] string clientId) { - return Ok(await _repository.CancelGroupReservationAsync(id, clientId)); + var reservation = await _repository.GetGroupReservationByIdAsync(id); + var cancelled = await _repository.CancelGroupReservationAsync(id, clientId); + + if (cancelled) + { + var users = new Dictionary + { + { clientId, "Client" }, + { reservation.TrainerId, "Trainer" } + }; + await _notificationPublisher.PublishNotification("Training reservation cancelled", reservation.ToString(), + "Information", true, users); + } + + return Ok(cancelled); } } diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/Notification.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/Notification.cs index 5064c4c..2751d1c 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/Notification.cs +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/Notification.cs @@ -5,16 +5,11 @@ namespace ReservationService.API.Entities; public class Notification { - [BsonId] - [BsonRepresentation(BsonType.ObjectId)] - public Guid Id { get; set; } - public DateTime CreationDate { get; set; } public IDictionary UserIdToUserType; public string Title { get; set; } public string Content { get; set; } public NotificationType Type { get; set; } public bool Email { get; set; } - public bool NotificationRead { get; set; } = false; public enum NotificationType { diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Program.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Program.cs index 925cc7c..2f67de5 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/Program.cs +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Program.cs @@ -2,12 +2,14 @@ using MassTransit; using ReservationService.API.Data; using ReservationService.API.Entities; +using ReservationService.API.Publishers; using ReservationService.API.Repository; var builder = WebApplication.CreateBuilder(args); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddControllers(); // Add services to the container. diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Publishers/INotificationPublisher.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Publishers/INotificationPublisher.cs new file mode 100644 index 0000000..293906a --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Publishers/INotificationPublisher.cs @@ -0,0 +1,8 @@ +using MassTransit; + +namespace ReservationService.API.Publishers; + +public interface INotificationPublisher +{ + Task PublishNotification(string title, string content, string type, bool email, IDictionary users); +} \ No newline at end of file diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Publishers/NotificationPublisher.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Publishers/NotificationPublisher.cs new file mode 100644 index 0000000..b99678b --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Publishers/NotificationPublisher.cs @@ -0,0 +1,34 @@ +using AutoMapper; +using EventBus.Messages.Events; +using MassTransit; +using ReservationService.API.Entities; + +namespace ReservationService.API.Publishers; + +public class NotificationPublisher : INotificationPublisher +{ + private readonly IPublishEndpoint _publishEndpoint; + private readonly IMapper _mapper; + + public NotificationPublisher(IPublishEndpoint publishEndpoint, IMapper mapper) + { + _publishEndpoint = publishEndpoint ?? throw new ArgumentNullException(nameof(publishEndpoint)); + _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); + } + + public async Task PublishNotification(string title, string content, string type, bool email, IDictionary users) + { + Enum.TryParse(type, out Notification.NotificationType notificationType); + var notification = new Notification + { + Title = title, + Content = content, + Type = notificationType, + Email = email, + UserIdToUserType = users + }; + + var eventMessage = _mapper.Map(notification); + await _publishEndpoint.Publish(eventMessage); + } +} \ No newline at end of file From 51f73e5f312a0121f86c52a8c5be933aff7b403f Mon Sep 17 00:00:00 2001 From: Milan Date: Sat, 27 Sep 2025 15:27:52 +0200 Subject: [PATCH 006/118] Extraction of Reservation logic from Client Service and Trainer Service. Relates to #92 --- .../Controllers/ClientController.cs | 75 ----------- .../CancelTrainingConsumer.cs | 26 ---- .../Mapper/BookTrainingProfile.cs | 14 --- .../Mapper/CancelTrainingProfile.cs | 14 --- .../ClientService.API/Program.cs | 18 --- .../ClientService.Common/Data/Context.cs | 4 +- .../ClientService.Common/Data/IContext.cs | 1 - .../Entities/BookTrainingInformation.cs | 16 --- .../Entities/CancelTrainingInformation.cs | 13 -- .../Entities/ClientSchedule.cs | 27 ---- .../Entities/ScheduleItem.cs | 35 ------ .../Entities/WeeklySchedule.cs | 43 ------- .../Repositories/IRepository.cs | 6 - .../Repositories/Repository.cs | 118 +----------------- .../Controllers/ReservationController.cs | 8 +- .../Entities/GroupReservation.cs | 2 +- .../Repository/ReservationRepository.cs | 8 +- .../DTOs/BaseReviewDTO.cs | 1 + .../Controllers/TrainerController.cs | 48 ------- .../EventBusConsumers/BookTrainingConsumer.cs | 26 ---- .../GrpcServices/ReviewGrpcService.cs | 1 - .../TrainerService.API/Program.cs | 20 --- .../Data/ITrainerContext.cs | 1 - .../Data/TrainerContext.cs | 3 - .../Entities/BookTrainingInformation.cs | 15 --- .../Entities/CancelTrainingInformation.cs | 13 -- .../Entities/ScheduleItem.cs | 36 ------ .../Entities/TrainerSchedule.cs | 26 ---- .../Entities/WeeklySchedule.cs | 43 ------- .../Repositories/ITrainerRepository.cs | 5 - .../Repositories/TrainerRepository.cs | 91 +------------- 31 files changed, 16 insertions(+), 741 deletions(-) delete mode 100644 Fitness/Backend/Services/ClientService/ClientService.API/EventBusConsumers/CancelTrainingConsumer.cs delete mode 100644 Fitness/Backend/Services/ClientService/ClientService.API/Mapper/BookTrainingProfile.cs delete mode 100644 Fitness/Backend/Services/ClientService/ClientService.API/Mapper/CancelTrainingProfile.cs delete mode 100644 Fitness/Backend/Services/ClientService/ClientService.Common/Entities/BookTrainingInformation.cs delete mode 100644 Fitness/Backend/Services/ClientService/ClientService.Common/Entities/CancelTrainingInformation.cs delete mode 100644 Fitness/Backend/Services/ClientService/ClientService.Common/Entities/ClientSchedule.cs delete mode 100644 Fitness/Backend/Services/ClientService/ClientService.Common/Entities/ScheduleItem.cs delete mode 100644 Fitness/Backend/Services/ClientService/ClientService.Common/Entities/WeeklySchedule.cs delete mode 100644 Fitness/Backend/Services/TrainerService/TrainerService.API/EventBusConsumers/BookTrainingConsumer.cs delete mode 100644 Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/BookTrainingInformation.cs delete mode 100644 Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/CancelTrainingInformation.cs delete mode 100644 Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/ScheduleItem.cs delete mode 100644 Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/TrainerSchedule.cs delete mode 100644 Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/WeeklySchedule.cs diff --git a/Fitness/Backend/Services/ClientService/ClientService.API/Controllers/ClientController.cs b/Fitness/Backend/Services/ClientService/ClientService.API/Controllers/ClientController.cs index d0ec818..c9ce342 100644 --- a/Fitness/Backend/Services/ClientService/ClientService.API/Controllers/ClientController.cs +++ b/Fitness/Backend/Services/ClientService/ClientService.API/Controllers/ClientController.cs @@ -1,7 +1,6 @@ using AutoMapper; using ClientService.Common.Entities; using ClientService.Common.Repositories; -using EventBus.Messages.Events; using MassTransit; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -112,79 +111,5 @@ public async Task DeleteAllClients() await _repository.DeleteAllClients(); return Ok(); } - - // [Authorize(Roles = "Client")] - [Route("[action]/{id}")] - [HttpGet] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task> GetClientScheduleByClientId(string id) - { - var result = await _repository.GetClientScheduleByClientId(id); - if (result == null) - { - return NotFound(); - } - return Ok(result); - } - - // [Authorize(Roles = "Client")] - [Route("[action]/{clientId}/{weekId}")] - [HttpGet] - [ProducesResponseType(typeof(WeeklySchedule), StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task> GetClientWeekSchedule(string clientId, int weekId) - { - var result = await _repository.GetClientWeekSchedule(clientId, weekId); - if (result == null) - { - return NotFound(); - } - return Ok(result); - } - - // [Authorize(Roles = "Client")] - [Route("[action]/{clientId}")] - [HttpGet] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task>> GetTrainerIdsFromClientSchedule(string clientId) - { - var result = await _repository.GetTrainerIdsFromClientSchedule(clientId); - if (result == null || !result.Any()) - { - return NotFound(); - } - return Ok(result); - } - - // [Authorize(Roles = "Client")] - [Route("[action]")] - [HttpPut] - [ProducesResponseType(typeof(ClientSchedule), StatusCodes.Status200OK)] - public async Task UpdateClientSchedule([FromBody] ClientSchedule clientSchedule) - { - return Ok(await _repository.UpdateClientSchedule(clientSchedule)); - - } - - // [Authorize(Roles = "Client")] - [Route("[action]")] - [HttpPut] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status400BadRequest)] - public async Task BookTraining([FromBody] BookTrainingInformation bti) - { - var result = await _repository.BookTraining(bti); - if (result) - { - //send to trainer - - var eventMessage = _mapper.Map(bti); - await _publishEndpoint.Publish(eventMessage); - return Ok(); - } - return BadRequest(); - } } } diff --git a/Fitness/Backend/Services/ClientService/ClientService.API/EventBusConsumers/CancelTrainingConsumer.cs b/Fitness/Backend/Services/ClientService/ClientService.API/EventBusConsumers/CancelTrainingConsumer.cs deleted file mode 100644 index 6f352bd..0000000 --- a/Fitness/Backend/Services/ClientService/ClientService.API/EventBusConsumers/CancelTrainingConsumer.cs +++ /dev/null @@ -1,26 +0,0 @@ -using AutoMapper; -using ClientService.Common.Entities; -using ClientService.Common.Repositories; -using EventBus.Messages.Events; -using MassTransit; - -namespace ClientService.API.EventBusConsumers -{ - public class CancelTrainingConsumer : IConsumer - { - private readonly IRepository _repository; - private readonly IMapper _mapper; - - public CancelTrainingConsumer(IRepository repository, IMapper mapper) - { - _repository = repository ?? throw new ArgumentNullException(nameof(repository)); - _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); - } - - public async Task Consume(ConsumeContext context) - { - var cti = _mapper.Map(context.Message); - await _repository.CancelledTrainingByTrainer(cti); - } - } -} diff --git a/Fitness/Backend/Services/ClientService/ClientService.API/Mapper/BookTrainingProfile.cs b/Fitness/Backend/Services/ClientService/ClientService.API/Mapper/BookTrainingProfile.cs deleted file mode 100644 index eb6d844..0000000 --- a/Fitness/Backend/Services/ClientService/ClientService.API/Mapper/BookTrainingProfile.cs +++ /dev/null @@ -1,14 +0,0 @@ -using AutoMapper; -using ClientService.Common.Entities; -using EventBus.Messages.Events; - -namespace ClientService.API.Mapper -{ - public class BookTrainingProfile : Profile - { - public BookTrainingProfile() - { - CreateMap().ReverseMap(); - } - } -} diff --git a/Fitness/Backend/Services/ClientService/ClientService.API/Mapper/CancelTrainingProfile.cs b/Fitness/Backend/Services/ClientService/ClientService.API/Mapper/CancelTrainingProfile.cs deleted file mode 100644 index 72644e7..0000000 --- a/Fitness/Backend/Services/ClientService/ClientService.API/Mapper/CancelTrainingProfile.cs +++ /dev/null @@ -1,14 +0,0 @@ -using AutoMapper; -using ClientService.Common.Entities; -using EventBus.Messages.Events; - -namespace ClientService.API.Mapper -{ - public class CancelTrainingProfile:Profile - { - public CancelTrainingProfile() - { - CreateMap().ReverseMap(); - } - } -} diff --git a/Fitness/Backend/Services/ClientService/ClientService.API/Program.cs b/Fitness/Backend/Services/ClientService/ClientService.API/Program.cs index 3a9b595..8196c38 100644 --- a/Fitness/Backend/Services/ClientService/ClientService.API/Program.cs +++ b/Fitness/Backend/Services/ClientService/ClientService.API/Program.cs @@ -1,7 +1,3 @@ -using Amazon.Runtime.Internal; -using ClientService.API.EventBusConsumers; -using EventBus.Messages.Constants; -using MassTransit; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; // using Microsoft.IdentityModel.Tokens; @@ -44,20 +40,6 @@ //AutoMapper builder.Services.AddAutoMapper(Assembly.GetExecutingAssembly()); -//EventBus -builder.Services.AddMassTransit(config => -{ - config.AddConsumer(); - config.UsingRabbitMq((ctx, cfg) => - { - cfg.Host(builder.Configuration["EventBusSettings:HostAddress"]); - cfg.ReceiveEndpoint(EventBusConstants.CancellingTrainingQueue, c => - { - c.ConfigureConsumer(ctx); - }); - }); -}); - var jwtSettings = builder.Configuration.GetSection("JwtSettings"); var secretKey = jwtSettings.GetValue("secretKey"); diff --git a/Fitness/Backend/Services/ClientService/ClientService.Common/Data/Context.cs b/Fitness/Backend/Services/ClientService/ClientService.Common/Data/Context.cs index 8987460..eef1e4a 100644 --- a/Fitness/Backend/Services/ClientService/ClientService.Common/Data/Context.cs +++ b/Fitness/Backend/Services/ClientService/ClientService.Common/Data/Context.cs @@ -10,13 +10,11 @@ public Context(IConfiguration configuration) { var client = new MongoClient(configuration.GetValue("DatabaseSettings:ConnectionString")); - var database = client.GetDatabase("ClientsAndSchedules"); + var database = client.GetDatabase("ClientDB"); Clients = database.GetCollection("Clients"); - ClientSchedules = database.GetCollection("ClientSchedules"); } public IMongoCollection Clients { get; } - public IMongoCollection ClientSchedules { get; } } } diff --git a/Fitness/Backend/Services/ClientService/ClientService.Common/Data/IContext.cs b/Fitness/Backend/Services/ClientService/ClientService.Common/Data/IContext.cs index 1b76315..902804f 100644 --- a/Fitness/Backend/Services/ClientService/ClientService.Common/Data/IContext.cs +++ b/Fitness/Backend/Services/ClientService/ClientService.Common/Data/IContext.cs @@ -6,6 +6,5 @@ namespace ClientService.Common.Data public interface IContext { IMongoCollection Clients { get; } - IMongoCollection ClientSchedules { get; } } } diff --git a/Fitness/Backend/Services/ClientService/ClientService.Common/Entities/BookTrainingInformation.cs b/Fitness/Backend/Services/ClientService/ClientService.Common/Entities/BookTrainingInformation.cs deleted file mode 100644 index 11640cd..0000000 --- a/Fitness/Backend/Services/ClientService/ClientService.Common/Entities/BookTrainingInformation.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace ClientService.Common.Entities -{ - public class BookTrainingInformation - { - public string ClientId { get; set; } - public string TrainerName { get; set; } - public string TrainerId { get; set; } - public string TrainingType { get; set; } - public TimeSpan Duration { get; set; } - public int WeekId { get; set; } - public string DayName { get; set; } - public int StartHour { get; set; } - public int StartMinute { get; set; } - public bool IsBooking { get; set; } - } -} diff --git a/Fitness/Backend/Services/ClientService/ClientService.Common/Entities/CancelTrainingInformation.cs b/Fitness/Backend/Services/ClientService/ClientService.Common/Entities/CancelTrainingInformation.cs deleted file mode 100644 index e82e0de..0000000 --- a/Fitness/Backend/Services/ClientService/ClientService.Common/Entities/CancelTrainingInformation.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace ClientService.Common.Entities -{ - public class CancelTrainingInformation - { - public string ClientId { get; set; } - public string TrainerId { get; set; } - public TimeSpan Duration { get; set; } - public int WeekId { get; set; } - public string DayName { get; set; } - public int StartHour { get; set; } - public int StartMinute { get; set; } - } -} diff --git a/Fitness/Backend/Services/ClientService/ClientService.Common/Entities/ClientSchedule.cs b/Fitness/Backend/Services/ClientService/ClientService.Common/Entities/ClientSchedule.cs deleted file mode 100644 index e66647f..0000000 --- a/Fitness/Backend/Services/ClientService/ClientService.Common/Entities/ClientSchedule.cs +++ /dev/null @@ -1,27 +0,0 @@ -using MongoDB.Bson.Serialization.Attributes; -using MongoDB.Bson; -using Microsoft.Extensions.Configuration; - -namespace ClientService.Common.Entities -{ - public class ClientSchedule - { - [BsonId] - [BsonRepresentation(BsonType.ObjectId)] - public string Id { get; set; } - - [BsonElement("ClientId")] - public string ClientId { get; set; } - public List WeeklySchedules { get; set; } = new List(); - public ClientSchedule(string id) - { - var startWeek = 1; - var endWeek = 3; - ClientId = id; - for (int i = startWeek; i <= endWeek; i++) - { - WeeklySchedules.Add(new WeeklySchedule(i)); - } - } - } -} diff --git a/Fitness/Backend/Services/ClientService/ClientService.Common/Entities/ScheduleItem.cs b/Fitness/Backend/Services/ClientService/ClientService.Common/Entities/ScheduleItem.cs deleted file mode 100644 index a767fef..0000000 --- a/Fitness/Backend/Services/ClientService/ClientService.Common/Entities/ScheduleItem.cs +++ /dev/null @@ -1,35 +0,0 @@ -using MongoDB.Bson; -using MongoDB.Bson.Serialization.Attributes; - -namespace ClientService.Common.Entities -{ - public class ScheduleItem - { - - public int StartHour { get; set; } - public int StartMinute { get; set; } - public int EndHour { get; set; } - public int EndMinute { get; set; } - public string TrainingType { get; set; } - public bool IsAvailable { get; set; } - public string TrainerId { get; set; } - public string TrainerName { get; set; } - public int TrainingStartHour { get; set; } - public int TrainingStartMinute { get; set; } - public TimeSpan TrainingDuration { get; set; } - - public ScheduleItem(TimeSpan startTime, TimeSpan endTime,bool isAvailable) - { - - StartHour = startTime.Hours; - StartMinute = startTime.Minutes; - EndHour = endTime.Hours; - EndMinute = endTime.Minutes; - IsAvailable = isAvailable; - TrainingType = ""; - TrainerId = ""; - TrainerName = ""; - } - - } -} diff --git a/Fitness/Backend/Services/ClientService/ClientService.Common/Entities/WeeklySchedule.cs b/Fitness/Backend/Services/ClientService/ClientService.Common/Entities/WeeklySchedule.cs deleted file mode 100644 index 39a0630..0000000 --- a/Fitness/Backend/Services/ClientService/ClientService.Common/Entities/WeeklySchedule.cs +++ /dev/null @@ -1,43 +0,0 @@ -namespace ClientService.Common.Entities -{ - public class WeeklySchedule - { - public int WeekId { get; set; } - public Dictionary> DailySchedules { get; set; } = new Dictionary>(); - - private static readonly Dictionary DayName = new Dictionary - { - { 1, "Monday" }, - { 2, "Tuesday" }, - { 3, "Wednesday" }, - { 4, "Thursday" }, - { 5, "Friday" }, - { 6, "Saturday" }, - { 7, "Sunday" } - }; - public WeeklySchedule(int weekId) - { - WeekId = weekId; - - for (int i = 1; i <= 7; ++i) - { - DailySchedules[DayName[i]] = InitializeDay(); - } - } - - private static List InitializeDay() - { - var timeslots = new List(); - var startTime = new TimeSpan(8, 0, 0); // 8:00 AM - var endTime = new TimeSpan(20, 0, 0); // 8:00 PM - - while (startTime < endTime) - { - var nextTime = startTime.Add(TimeSpan.FromMinutes(15)); - timeslots.Add(new ScheduleItem(startTime,nextTime,true)); - startTime = nextTime; - } - return timeslots; - } - } -} diff --git a/Fitness/Backend/Services/ClientService/ClientService.Common/Repositories/IRepository.cs b/Fitness/Backend/Services/ClientService/ClientService.Common/Repositories/IRepository.cs index ede3d9c..b1cdee6 100644 --- a/Fitness/Backend/Services/ClientService/ClientService.Common/Repositories/IRepository.cs +++ b/Fitness/Backend/Services/ClientService/ClientService.Common/Repositories/IRepository.cs @@ -14,11 +14,5 @@ public interface IRepository Task UpdateClient(Client client); Task DeleteClient(string id); Task DeleteAllClients(); - Task GetClientScheduleByClientId(string id); - Task GetClientWeekSchedule(string clientId, int weekId); - Task> GetTrainerIdsFromClientSchedule(string clientId); - Task UpdateClientSchedule(ClientSchedule clientSchedule); - Task BookTraining(BookTrainingInformation bti); - Task CancelledTrainingByTrainer(CancelTrainingInformation cti); } } diff --git a/Fitness/Backend/Services/ClientService/ClientService.Common/Repositories/Repository.cs b/Fitness/Backend/Services/ClientService/ClientService.Common/Repositories/Repository.cs index 3c3c959..647ec87 100644 --- a/Fitness/Backend/Services/ClientService/ClientService.Common/Repositories/Repository.cs +++ b/Fitness/Backend/Services/ClientService/ClientService.Common/Repositories/Repository.cs @@ -42,8 +42,6 @@ public async Task> GetClientsBySurname(string surname) public async Task CreateClient(Client client) { await _context.Clients.InsertOneAsync(client); - var clientSchedule = new ClientSchedule(client.Id); - await _context.ClientSchedules.InsertOneAsync(clientSchedule); } public async Task UpdateClient(Client client) { @@ -53,125 +51,11 @@ public async Task UpdateClient(Client client) public async Task DeleteClient(string id) { var resultClient = await _context.Clients.DeleteOneAsync(p => p.Id == id); - var resultSchedule = await _context.ClientSchedules.DeleteOneAsync(p => p.ClientId == id); - - return resultClient.IsAcknowledged && resultClient.DeletedCount > 0 - && resultSchedule.IsAcknowledged && resultSchedule.DeletedCount>0; + return resultClient.IsAcknowledged && resultClient.DeletedCount > 0; } public async Task DeleteAllClients() { await _context.Clients.DeleteManyAsync(p => true); } - - public async Task GetClientScheduleByClientId(string id) - { - return await _context.ClientSchedules.Find(s => s.ClientId == id).FirstOrDefaultAsync(); - } - public async Task GetClientWeekSchedule(string clientId, int weekId) - { - var clientSchedule = await GetClientScheduleByClientId(clientId); - return clientSchedule?.WeeklySchedules.FirstOrDefault(ws => ws.WeekId == weekId); - } - - public async Task> GetTrainerIdsFromClientSchedule(string clientId) - { - var clientSchedule = await GetClientScheduleByClientId(clientId); - - if (clientSchedule == null) - { - return Enumerable.Empty(); - } - - // Assuming `clientSchedule` contains a collection of training slots - var trainerIds = clientSchedule.WeeklySchedules - .SelectMany(ws => ws.DailySchedules.Values) - .SelectMany(dayList => dayList) - .Select(si => si.TrainerId) - .Where(id => !string.IsNullOrEmpty(id)) - .Distinct(); - - return trainerIds; - } - - public async Task UpdateClientSchedule(ClientSchedule clientSchedule) - { - var result = await _context.ClientSchedules.ReplaceOneAsync(cs => cs.ClientId == clientSchedule.ClientId, clientSchedule, new ReplaceOptions { IsUpsert = true }); - return result.IsAcknowledged && result.ModifiedCount > 0; - } - - public async Task BookTraining(BookTrainingInformation bti) - { - var clientSchedule = await GetClientScheduleByClientId(bti.ClientId); - if (clientSchedule == null) - { - return false; - } - - var weeklySchedule = clientSchedule.WeeklySchedules.FirstOrDefault(ws => ws.WeekId == bti.WeekId); - if (weeklySchedule == null) - { - return false; - } - - if (!weeklySchedule.DailySchedules.TryGetValue(bti.DayName, out var dailySchedule)) - return false; - - int numberOfCells = (int)bti.Duration.TotalMinutes / 15; - - - var startSlotIndex = dailySchedule.FindIndex(slot => slot.StartHour == bti.StartHour && slot.StartMinute == bti.StartMinute); - - if (startSlotIndex == -1 || startSlotIndex + numberOfCells > dailySchedule.Count) - return false; - - for (int i = startSlotIndex; i < startSlotIndex + numberOfCells; i++) - { - if (bti.IsBooking) - { - if (!dailySchedule[i].IsAvailable) - return false; - - dailySchedule[i].IsAvailable = false; - dailySchedule[i].TrainerId = bti.TrainerId; - dailySchedule[i].TrainingType = bti.TrainingType; - dailySchedule[i].TrainerName = bti.TrainerName; - dailySchedule[i].TrainingStartHour = bti.StartHour; - dailySchedule[i].TrainingDuration = bti.Duration; - dailySchedule[i].TrainingStartMinute = bti.StartMinute; - } - else - { - dailySchedule[i].IsAvailable = true; - dailySchedule[i].TrainerId = ""; - dailySchedule[i].TrainingType = ""; - dailySchedule[i].TrainingStartHour = -1; - } - } - - await UpdateClientSchedule(clientSchedule); - - return true; - } - public async Task CancelledTrainingByTrainer(CancelTrainingInformation cti) - { - //obavlja se validacija na frontu - var clientSchedule = await GetClientScheduleByClientId(cti.ClientId); - var weeklySchedule = clientSchedule.WeeklySchedules.FirstOrDefault(ws => ws.WeekId == cti.WeekId); - weeklySchedule.DailySchedules.TryGetValue(cti.DayName, out var dailySchedule); - - int numberOfCells = (int)cti.Duration.TotalMinutes / 15; - var startSlotIndex = dailySchedule.FindIndex(slot => slot.StartHour == cti.StartHour && slot.StartMinute == cti.StartMinute); - - for (int i = startSlotIndex; i < startSlotIndex + numberOfCells; i++) - { - dailySchedule[i].IsAvailable = true; - dailySchedule[i].TrainerId = ""; - dailySchedule[i].TrainingType = ""; - dailySchedule[i].TrainingStartHour = -1; - } - - await UpdateClientSchedule(clientSchedule); - } - } } diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs index b7d486e..91e848b 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs @@ -104,6 +104,7 @@ public async Task>> GetGroupReservati [ProducesResponseType(typeof(IndividualReservation), StatusCodes.Status201Created)] public async Task> CreateIndividualReservation([FromBody] IndividualReservation reservation) { + // You need to check the availability of the client and the trainer!!! await _repository.CreateIndividualReservationAsync(reservation); var users = new Dictionary(); @@ -119,6 +120,7 @@ public async Task> CreateIndividualReservati [ProducesResponseType(typeof(GroupReservation), StatusCodes.Status201Created)] public async Task> CreateGroupReservation([FromBody] GroupReservation reservation) { + // You need to check the availability of the trainer!!! await _repository.CreateGroupReservationAsync(reservation); return CreatedAtRoute(nameof(GetGroupReservation), new { id = reservation.Id }, reservation); } @@ -128,6 +130,7 @@ public async Task> CreateGroupReservation([FromBo [ProducesResponseType(typeof(IndividualReservation), StatusCodes.Status200OK)] public async Task UpdateIndividualReservation([FromBody] IndividualReservation reservation) { + // Also we need to check if the updated information make sense -- are the client and the trainer available var updated = await _repository.UpdateIndividualReservationAsync(reservation); if (updated) @@ -147,12 +150,13 @@ await _notificationPublisher.PublishNotification("Training reservation updated", [ProducesResponseType(typeof(GroupReservation), StatusCodes.Status200OK)] public async Task UpdateGroupReservation([FromBody] GroupReservation reservation) { + // Also we need to check if the updated information make sense -- is the trainer available var updated = await _repository.UpdateGroupReservationAsync(reservation); if (updated) { var users = new Dictionary(); - foreach (var clientId in reservation.Clients) + foreach (var clientId in reservation.ClientIds) { users.Add(clientId, "Client"); } @@ -197,7 +201,7 @@ public async Task DeleteGroupReservation(string id) if (deleted) { var users = new Dictionary(); - foreach (var clientId in reservation.Clients) + foreach (var clientId in reservation.ClientIds) { users.Add(clientId, "Client"); } diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/GroupReservation.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/GroupReservation.cs index 28ff217..79aa882 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/GroupReservation.cs +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/GroupReservation.cs @@ -13,7 +13,7 @@ public class GroupReservation public string About { get; set; } public string TrainerId { get; set; } public int Capacity { get; set; } - public List Clients { get; set; } + public List ClientIds { get; set; } public TimeSpan StartTime { get; set; } public TimeSpan EndTime { get; set; } public DateOnly Date { get; set; } diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/ReservationRepository.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/ReservationRepository.cs index 3da3dc8..aad79ec 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/ReservationRepository.cs +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Repository/ReservationRepository.cs @@ -43,7 +43,7 @@ public async Task> GetIndividualReservationsB public async Task> GetGroupReservationsByClientIdAsync(string clientId) { - return await _context.GroupReservations.Find(r => r.Clients.Contains(clientId)).ToListAsync(); + return await _context.GroupReservations.Find(r => r.ClientIds.Contains(clientId)).ToListAsync(); } public async Task> GetIndividualReservationsByTrainerIdAsync(string trainerId) @@ -93,10 +93,10 @@ public async Task DeleteGroupReservationAsync(string id) public async Task BookGroupReservationAsync(string id, string clientId) { var reservation = await GetGroupReservationByIdAsync(id); - if (reservation.Capacity >= reservation.Clients.Count) + if (reservation.Capacity >= reservation.ClientIds.Count) return false; - reservation.Clients.Add(clientId); + reservation.ClientIds.Add(clientId); var result = await _context.GroupReservations.ReplaceOneAsync(r => r.Id == id, reservation); return result.IsAcknowledged && result.ModifiedCount > 0; } @@ -104,7 +104,7 @@ public async Task BookGroupReservationAsync(string id, string clientId) public async Task CancelGroupReservationAsync(string id, string clientId) { var reservation = await GetGroupReservationByIdAsync(id); - reservation.Clients.Remove(clientId); + reservation.ClientIds.Remove(clientId); var result = await _context.GroupReservations.ReplaceOneAsync(r => r.Id == id, reservation); return result.IsAcknowledged && result.ModifiedCount > 0; } diff --git a/Fitness/Backend/Services/ReviewService/ReviewService.Common/DTOs/BaseReviewDTO.cs b/Fitness/Backend/Services/ReviewService/ReviewService.Common/DTOs/BaseReviewDTO.cs index 3c871a7..1433d88 100644 --- a/Fitness/Backend/Services/ReviewService/ReviewService.Common/DTOs/BaseReviewDTO.cs +++ b/Fitness/Backend/Services/ReviewService/ReviewService.Common/DTOs/BaseReviewDTO.cs @@ -8,6 +8,7 @@ namespace ReviewService.Common.DTOs { public class BaseReviewDTO { + // Potentially add training id? public string TrainerId { get; set; } public string ClientId { get; set; } public string Comment { get; set; } diff --git a/Fitness/Backend/Services/TrainerService/TrainerService.API/Controllers/TrainerController.cs b/Fitness/Backend/Services/TrainerService/TrainerService.API/Controllers/TrainerController.cs index ff5788d..8b55334 100644 --- a/Fitness/Backend/Services/TrainerService/TrainerService.API/Controllers/TrainerController.cs +++ b/Fitness/Backend/Services/TrainerService/TrainerService.API/Controllers/TrainerController.cs @@ -171,53 +171,5 @@ public async Task DeleteTrainer(string id) { return Ok(await _repository.DeleteTrainer(id)); } - - // [Authorize(Roles = "Trainer, Client")] - [Route("[action]/{id}")] - [HttpGet] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task> GetTrainerScheduleByTrainerId(string id) - { - var result = await _repository.GetTrainerScheduleByTrainerId(id); - if (result == null) - { - return NotFound(); - } - return Ok(result); - } - - // [Authorize(Roles = "Trainer, Client")] - [Route("[action]/{trainerId}/{weekId}")] - [HttpGet] - [ProducesResponseType(typeof(WeeklySchedule), StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task> GetTrainerWeekSchedule(string trainerId, int weekId) - { - var result = await _repository.GetTrainerWeekSchedule(trainerId, weekId); - if (result == null) - { - return NotFound(); - } - return Ok(result); - } - - // [Authorize(Roles = "Trainer")] - [Route("[action]")] - [HttpPut] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status400BadRequest)] - public async Task CancelTraining([FromBody] CancelTrainingInformation cti) - { - var result = await _repository.CancelTraining(cti); - if (result) - { - //send to client - var eventMessage = _mapper.Map(cti); - await _publishEndpoint.Publish(eventMessage); - return Ok(); - } - return BadRequest(); - } } } \ No newline at end of file diff --git a/Fitness/Backend/Services/TrainerService/TrainerService.API/EventBusConsumers/BookTrainingConsumer.cs b/Fitness/Backend/Services/TrainerService/TrainerService.API/EventBusConsumers/BookTrainingConsumer.cs deleted file mode 100644 index 139a07f..0000000 --- a/Fitness/Backend/Services/TrainerService/TrainerService.API/EventBusConsumers/BookTrainingConsumer.cs +++ /dev/null @@ -1,26 +0,0 @@ -using AutoMapper; -using EventBus.Messages.Events; -using MassTransit; -using TrainerService.Common.Entities; -using TrainerService.Common.Repositories; - -namespace TrainerService.API.EventBusConsumers -{ - public class BookTrainingConsumer : IConsumer - { - private readonly ITrainerRepository _repository; - private readonly IMapper _mapper; - - public BookTrainingConsumer(ITrainerRepository repository, IMapper mapper) - { - _repository = repository ?? throw new ArgumentNullException(nameof(repository)); - _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); - } - - public async Task Consume(ConsumeContext context) - { - var bti = _mapper.Map(context.Message); - await _repository.BookTraining(bti); - } - } -} diff --git a/Fitness/Backend/Services/TrainerService/TrainerService.API/GrpcServices/ReviewGrpcService.cs b/Fitness/Backend/Services/TrainerService/TrainerService.API/GrpcServices/ReviewGrpcService.cs index 9fd8c86..20cb36a 100644 --- a/Fitness/Backend/Services/TrainerService/TrainerService.API/GrpcServices/ReviewGrpcService.cs +++ b/Fitness/Backend/Services/TrainerService/TrainerService.API/GrpcServices/ReviewGrpcService.cs @@ -16,7 +16,6 @@ public async Task GetReviews(string trainerId) var getReviewsRequest = new GetReviewsRequest(); getReviewsRequest.TrainerId = trainerId; return await _reviewProtoServiceClient.GetReviewsAsync(getReviewsRequest); - } } } diff --git a/Fitness/Backend/Services/TrainerService/TrainerService.API/Program.cs b/Fitness/Backend/Services/TrainerService/TrainerService.API/Program.cs index e9ee179..ba1df3c 100644 --- a/Fitness/Backend/Services/TrainerService/TrainerService.API/Program.cs +++ b/Fitness/Backend/Services/TrainerService/TrainerService.API/Program.cs @@ -1,13 +1,9 @@ -using EventBus.Messages.Constants; -using EventBus.Messages.Events; -using MassTransit; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using ReviewService.GRPC.Protos; using System.Text; using Consul; using ConsulConfig.Settings; -using TrainerService.API.EventBusConsumers; using TrainerService.API.GrpcServices; using TrainerService.Common.Data; using TrainerService.Common.Entities; @@ -37,22 +33,6 @@ { configuration.CreateMap().ReverseMap(); configuration.CreateMap().ReverseMap(); - configuration.CreateMap().ReverseMap(); - configuration.CreateMap().ReverseMap(); -}); - -//EventBus -builder.Services.AddMassTransit(config => -{ - config.AddConsumer(); - config.UsingRabbitMq((ctx, cfg) => - { - cfg.Host(builder.Configuration["EventBusSettings:HostAddress"]); - cfg.ReceiveEndpoint(EventBusConstants.BookTrainingQueue,c => - { - c.ConfigureConsumer(ctx); - }); - }); }); builder.Services.AddCors(options => diff --git a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Data/ITrainerContext.cs b/Fitness/Backend/Services/TrainerService/TrainerService.Common/Data/ITrainerContext.cs index 93068ff..d89480c 100644 --- a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Data/ITrainerContext.cs +++ b/Fitness/Backend/Services/TrainerService/TrainerService.Common/Data/ITrainerContext.cs @@ -6,6 +6,5 @@ namespace TrainerService.Common.Data public interface ITrainerContext { IMongoCollection Trainers { get; } - IMongoCollection TrainerSchedules { get; } } } diff --git a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Data/TrainerContext.cs b/Fitness/Backend/Services/TrainerService/TrainerService.Common/Data/TrainerContext.cs index bc2b953..9aa9744 100644 --- a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Data/TrainerContext.cs +++ b/Fitness/Backend/Services/TrainerService/TrainerService.Common/Data/TrainerContext.cs @@ -12,11 +12,8 @@ public TrainerContext(IConfiguration configuration) var database = client.GetDatabase("TrainerDB"); Trainers = database.GetCollection("Trainers"); - - TrainerSchedules = database.GetCollection("TrainerSchedules"); } public IMongoCollection Trainers { get; } - public IMongoCollection TrainerSchedules { get; } } } diff --git a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/BookTrainingInformation.cs b/Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/BookTrainingInformation.cs deleted file mode 100644 index 0204b5d..0000000 --- a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/BookTrainingInformation.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace TrainerService.Common.Entities -{ - public class BookTrainingInformation - { - public string ClientId { get; set; } - public string TrainerId { get; set; } - public string TrainingType { get; set; } - public TimeSpan Duration { get; set; } - public int WeekId { get; set; } - public string DayName { get; set; } - public int StartHour { get; set; } - public int StartMinute { get; set; } - public bool IsBooking { get; set; } - } -} diff --git a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/CancelTrainingInformation.cs b/Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/CancelTrainingInformation.cs deleted file mode 100644 index 6b483db..0000000 --- a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/CancelTrainingInformation.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace TrainerService.Common.Entities -{ - public class CancelTrainingInformation - { - public string ClientId { get; set; } - public string TrainerId { get; set; } - public TimeSpan Duration { get; set; } - public int WeekId { get; set; } - public string DayName { get; set; } - public int StartHour { get; set; } - public int StartMinute { get; set; } - } -} diff --git a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/ScheduleItem.cs b/Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/ScheduleItem.cs deleted file mode 100644 index 3fa7703..0000000 --- a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/ScheduleItem.cs +++ /dev/null @@ -1,36 +0,0 @@ -using MongoDB.Bson.Serialization.Attributes; - -namespace TrainerService.Common.Entities -{ - public class ScheduleItem - { - - [BsonIgnore] - public TimeSpan StartTime { get; set; } - [BsonIgnore] - public TimeSpan EndTime { get; set; } - public int StartHour { get; set; } - public int StartMinute { get; set; } - public int EndHour { get; set; } - public int EndMinute { get; set; } - public string TrainingType { get; set; } - public bool IsAvailable { get; set; } - public string ClientId { get; set; } - public TimeSpan TrainingDuration { get; set; } - public int TrainingStartHour { get; set; } - public int TrainingStartMinute { get; set; } - - public ScheduleItem(TimeSpan startTime, TimeSpan endTime, bool isAvailable) - { - StartTime = startTime; - EndTime = endTime; - StartHour = startTime.Hours; - StartMinute = startTime.Minutes; - EndHour = endTime.Hours; - EndMinute = endTime.Minutes; - IsAvailable = isAvailable; - TrainingType = ""; - ClientId = ""; - } - } -} diff --git a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/TrainerSchedule.cs b/Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/TrainerSchedule.cs deleted file mode 100644 index 34ccdab..0000000 --- a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/TrainerSchedule.cs +++ /dev/null @@ -1,26 +0,0 @@ -using MongoDB.Bson.Serialization.Attributes; -using MongoDB.Bson; - -namespace TrainerService.Common.Entities -{ - public class TrainerSchedule - { - [BsonId] - [BsonRepresentation(BsonType.ObjectId)] - public string Id { get; set; } - - [BsonElement("TrainerId")] - public string TrainerId { get; set; } - public List WeeklySchedules { get; set; } = new List(); - public TrainerSchedule(string id) - { - var startWeek = 1; - var endWeek = 3; - TrainerId = id; - for (int i = startWeek; i <= endWeek; i++) - { - WeeklySchedules.Add(new WeeklySchedule(i)); - } - } - } -} diff --git a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/WeeklySchedule.cs b/Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/WeeklySchedule.cs deleted file mode 100644 index 01a1185..0000000 --- a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Entities/WeeklySchedule.cs +++ /dev/null @@ -1,43 +0,0 @@ -namespace TrainerService.Common.Entities -{ - public class WeeklySchedule - { - public int WeekId { get; set; } - public Dictionary> DailySchedules { get; set; } = new Dictionary>(); - - private static readonly Dictionary DayName = new Dictionary - { - { 1, "Monday" }, - { 2, "Tuesday" }, - { 3, "Wednesday" }, - { 4, "Thursday" }, - { 5, "Friday" }, - { 6, "Saturday" }, - { 7, "Sunday" } - }; - public WeeklySchedule(int weekId) - { - WeekId = weekId; - - for (int i = 1; i <= 7; ++i) - { - DailySchedules[DayName[i]] = InitializeDay(); - } - } - - private static List InitializeDay() - { - var timeslots = new List(); - var startTime = new TimeSpan(8, 0, 0); // 8:00 AM - var endTime = new TimeSpan(20, 0, 0); // 8:00 PM - - while (startTime < endTime) - { - var nextTime = startTime.Add(TimeSpan.FromMinutes(15)); - timeslots.Add(new ScheduleItem(startTime, nextTime, true)); - startTime = nextTime; - } - return timeslots; - } - } -} diff --git a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Repositories/ITrainerRepository.cs b/Fitness/Backend/Services/TrainerService/TrainerService.Common/Repositories/ITrainerRepository.cs index fb69b01..33b51fa 100644 --- a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Repositories/ITrainerRepository.cs +++ b/Fitness/Backend/Services/TrainerService/TrainerService.Common/Repositories/ITrainerRepository.cs @@ -14,10 +14,5 @@ public interface ITrainerRepository Task CreateTrainer(Trainer trainer); Task UpdateTrainer(Trainer trainer); Task DeleteTrainer(string id); - Task GetTrainerScheduleByTrainerId(string id); - Task GetTrainerWeekSchedule(string trainerId, int weekId); - Task UpdateTrainerSchedule(TrainerSchedule trainerSchedule); - Task BookTraining(BookTrainingInformation bti); - Task CancelTraining(CancelTrainingInformation cti); } } diff --git a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Repositories/TrainerRepository.cs b/Fitness/Backend/Services/TrainerService/TrainerService.Common/Repositories/TrainerRepository.cs index e48b2e4..0614733 100644 --- a/Fitness/Backend/Services/TrainerService/TrainerService.Common/Repositories/TrainerRepository.cs +++ b/Fitness/Backend/Services/TrainerService/TrainerService.Common/Repositories/TrainerRepository.cs @@ -56,13 +56,10 @@ public async Task GetPrice(string trainerId, string trainingType) return training.Price; } - - + public async Task CreateTrainer(Trainer trainer) { await _context.Trainers.InsertOneAsync(trainer); - var trainerSchedule = new TrainerSchedule(trainer.Id); - await _context.TrainerSchedules.InsertOneAsync(trainerSchedule); } public async Task UpdateTrainer(Trainer trainer) @@ -74,91 +71,7 @@ public async Task UpdateTrainer(Trainer trainer) public async Task DeleteTrainer(string id) { var deleteResult = await _context.Trainers.DeleteOneAsync(p => p.Id == id); - var deleteScheduleResult = await _context.TrainerSchedules.DeleteOneAsync(ts => ts.Id == id); - return deleteResult.IsAcknowledged && deleteResult.DeletedCount > 0 - && deleteScheduleResult.IsAcknowledged && deleteResult.DeletedCount>0; - } - - public async Task GetTrainerScheduleByTrainerId(string id) - { - return await _context.TrainerSchedules.Find(s => s.TrainerId == id).FirstOrDefaultAsync(); - } - public async Task GetTrainerWeekSchedule(string trainerId, int weekId) - { - var trainerSchedule = await GetTrainerScheduleByTrainerId(trainerId); - return trainerSchedule?.WeeklySchedules.FirstOrDefault(ws => ws.WeekId == weekId); - } - public async Task UpdateTrainerSchedule(TrainerSchedule trainerSchedule) - { - var result = await _context.TrainerSchedules.ReplaceOneAsync(cs => cs.TrainerId == trainerSchedule.TrainerId, trainerSchedule, new ReplaceOptions { IsUpsert = true }); - return result.IsAcknowledged && result.ModifiedCount > 0; - } - public async Task BookTraining(BookTrainingInformation bti) - { - var trainerSchedule = await GetTrainerScheduleByTrainerId(bti.TrainerId); - var weeklySchedule = trainerSchedule.WeeklySchedules.FirstOrDefault(ws => ws.WeekId == bti.WeekId); - //provereno na frontu da moze da se zakaze - weeklySchedule.DailySchedules.TryGetValue(bti.DayName, out var dailySchedule); - - int numberOfCells = (int)bti.Duration.TotalMinutes / 15; - var startSlotIndex = dailySchedule.FindIndex(slot => slot.StartHour == bti.StartHour && slot.StartMinute == bti.StartMinute); - for (int i = startSlotIndex; i < startSlotIndex + numberOfCells; i++) - { - if (bti.IsBooking) - { - dailySchedule[i].IsAvailable = false; - dailySchedule[i].ClientId = bti.ClientId; - dailySchedule[i].TrainingType = bti.TrainingType; - dailySchedule[i].TrainingDuration = bti.Duration; - dailySchedule[i].TrainingStartHour = bti.StartHour; - dailySchedule[i].TrainingStartMinute = bti.StartMinute; - } - else - { - dailySchedule[i].IsAvailable = true; - dailySchedule[i].ClientId = ""; - dailySchedule[i].TrainingType = ""; - dailySchedule[i].TrainingStartHour = -1; - } - } - await UpdateTrainerSchedule(trainerSchedule); - } - - public async Task CancelTraining(CancelTrainingInformation cti) - { - var trainerSchedule = await GetTrainerScheduleByTrainerId(cti.TrainerId); - if(trainerSchedule == null) - { - return false; - } - - var weeklySchedule = trainerSchedule.WeeklySchedules.FirstOrDefault(ws => ws.WeekId == cti.WeekId); - if(weeklySchedule == null) - { - return false; - } - - if (!weeklySchedule.DailySchedules.TryGetValue(cti.DayName, out var dailySchedule)) - { - return false; - } - - int numberOfCells = (int)cti.Duration.TotalMinutes / 15; - - var startSlotIndex = dailySchedule.FindIndex(slot => slot.StartHour == cti.StartHour && slot.StartMinute == cti.StartMinute); - if (startSlotIndex == -1 || startSlotIndex + numberOfCells > dailySchedule.Count) - return false; - for (int i = startSlotIndex; i < startSlotIndex + numberOfCells; i++) - { - dailySchedule[i].IsAvailable = true; - dailySchedule[i].ClientId = ""; - dailySchedule[i].TrainingType = ""; - //dailySchedule[i].TrainingStartHour = -1; - } - - await UpdateTrainerSchedule(trainerSchedule); - - return true; + return deleteResult.IsAcknowledged && deleteResult.DeletedCount > 0; } } } From f0debfb4a8a8505d28d1dab401f79252ee8b8ade Mon Sep 17 00:00:00 2001 From: Milan Date: Sat, 27 Sep 2025 16:49:54 +0200 Subject: [PATCH 007/118] Minor fix - removal of IPublishEndpoint fields in Client and Trainer Controller. Relates to #92. --- .../IdentityServer/IdentityServer.csproj | 4 + .../20241123074920_Initial.Designer.cs | 342 ------------------ .../Migrations/20241123074920_Initial.cs | 265 -------------- .../ApplicationContextModelSnapshot.cs | 339 ----------------- .../Controllers/ClientController.cs | 4 +- .../Controllers/TrainerController.cs | 4 +- 6 files changed, 6 insertions(+), 952 deletions(-) delete mode 100644 Fitness/Backend/Security/IdentityServer/Migrations/20241123074920_Initial.Designer.cs delete mode 100644 Fitness/Backend/Security/IdentityServer/Migrations/20241123074920_Initial.cs delete mode 100644 Fitness/Backend/Security/IdentityServer/Migrations/ApplicationContextModelSnapshot.cs diff --git a/Fitness/Backend/Security/IdentityServer/IdentityServer.csproj b/Fitness/Backend/Security/IdentityServer/IdentityServer.csproj index 1d37a83..3a2f5e7 100644 --- a/Fitness/Backend/Security/IdentityServer/IdentityServer.csproj +++ b/Fitness/Backend/Security/IdentityServer/IdentityServer.csproj @@ -34,4 +34,8 @@ + + + + diff --git a/Fitness/Backend/Security/IdentityServer/Migrations/20241123074920_Initial.Designer.cs b/Fitness/Backend/Security/IdentityServer/Migrations/20241123074920_Initial.Designer.cs deleted file mode 100644 index bf6c3f6..0000000 --- a/Fitness/Backend/Security/IdentityServer/Migrations/20241123074920_Initial.Designer.cs +++ /dev/null @@ -1,342 +0,0 @@ -// -using System; -using IdentityServer.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace IdentityServer.Migrations -{ - [DbContext(typeof(ApplicationContext))] - [Migration("20241123074920_Initial")] - partial class Initial - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.7") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("IdentityServer.Entities.RefreshToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ExpiryTime") - .HasColumnType("datetime2"); - - b.Property("Token") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("RefreshTokens"); - }); - - modelBuilder.Entity("IdentityServer.Entities.User", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("AccessFailedCount") - .HasColumnType("int"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("bit"); - - b.Property("FirstName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("LastName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("LockoutEnabled") - .HasColumnType("bit"); - - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("PasswordHash") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumber") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("bit"); - - b.Property("SecurityStamp") - .HasColumnType("nvarchar(max)"); - - b.Property("TwoFactorEnabled") - .HasColumnType("bit"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex") - .HasFilter("[NormalizedUserName] IS NOT NULL"); - - b.ToTable("AspNetUsers", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex") - .HasFilter("[NormalizedName] IS NOT NULL"); - - b.ToTable("AspNetRoles", (string)null); - - b.HasData( - new - { - Id = "ddcce0a9-75cc-4e5b-9b92-04e6ebb8432e", - Name = "Admin", - NormalizedName = "ADMIN" - }, - new - { - Id = "08a19f84-14c0-48c5-9cba-f13b9bd4bed2", - Name = "Trainer", - NormalizedName = "TRAINER" - }, - new - { - Id = "4ecf06ad-a066-4e44-a56d-e41b24e3f2cf", - Name = "Client", - NormalizedName = "CLIENT" - }); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("nvarchar(max)"); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(max)"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("nvarchar(max)"); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(max)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("nvarchar(450)"); - - b.Property("ProviderKey") - .HasColumnType("nvarchar(450)"); - - b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(max)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.Property("RoleId") - .HasColumnType("nvarchar(450)"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.Property("LoginProvider") - .HasColumnType("nvarchar(450)"); - - b.Property("Name") - .HasColumnType("nvarchar(450)"); - - b.Property("Value") - .HasColumnType("nvarchar(max)"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens", (string)null); - }); - - modelBuilder.Entity("IdentityServer.Entities.RefreshToken", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany("RefreshTokens") - .HasForeignKey("UserId"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("IdentityServer.Entities.User", b => - { - b.Navigation("RefreshTokens"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Fitness/Backend/Security/IdentityServer/Migrations/20241123074920_Initial.cs b/Fitness/Backend/Security/IdentityServer/Migrations/20241123074920_Initial.cs deleted file mode 100644 index 7a95923..0000000 --- a/Fitness/Backend/Security/IdentityServer/Migrations/20241123074920_Initial.cs +++ /dev/null @@ -1,265 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional - -namespace IdentityServer.Migrations -{ - /// - public partial class Initial : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "AspNetRoles", - columns: table => new - { - Id = table.Column(type: "nvarchar(450)", nullable: false), - Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetUsers", - columns: table => new - { - Id = table.Column(type: "nvarchar(450)", nullable: false), - FirstName = table.Column(type: "nvarchar(max)", nullable: false), - LastName = table.Column(type: "nvarchar(max)", nullable: false), - UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - EmailConfirmed = table.Column(type: "bit", nullable: false), - PasswordHash = table.Column(type: "nvarchar(max)", nullable: true), - SecurityStamp = table.Column(type: "nvarchar(max)", nullable: true), - ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true), - PhoneNumber = table.Column(type: "nvarchar(max)", nullable: true), - PhoneNumberConfirmed = table.Column(type: "bit", nullable: false), - TwoFactorEnabled = table.Column(type: "bit", nullable: false), - LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), - LockoutEnabled = table.Column(type: "bit", nullable: false), - AccessFailedCount = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetRoleClaims", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - RoleId = table.Column(type: "nvarchar(450)", nullable: false), - ClaimType = table.Column(type: "nvarchar(max)", nullable: true), - ClaimValue = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserClaims", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - UserId = table.Column(type: "nvarchar(450)", nullable: false), - ClaimType = table.Column(type: "nvarchar(max)", nullable: true), - ClaimValue = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetUserClaims_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserLogins", - columns: table => new - { - LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), - ProviderKey = table.Column(type: "nvarchar(450)", nullable: false), - ProviderDisplayName = table.Column(type: "nvarchar(max)", nullable: true), - UserId = table.Column(type: "nvarchar(450)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); - table.ForeignKey( - name: "FK_AspNetUserLogins_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserRoles", - columns: table => new - { - UserId = table.Column(type: "nvarchar(450)", nullable: false), - RoleId = table.Column(type: "nvarchar(450)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserTokens", - columns: table => new - { - UserId = table.Column(type: "nvarchar(450)", nullable: false), - LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), - Name = table.Column(type: "nvarchar(450)", nullable: false), - Value = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AspNetUserTokens_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "RefreshTokens", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Token = table.Column(type: "nvarchar(max)", nullable: false), - ExpiryTime = table.Column(type: "datetime2", nullable: false), - UserId = table.Column(type: "nvarchar(450)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_RefreshTokens", x => x.Id); - table.ForeignKey( - name: "FK_RefreshTokens_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id"); - }); - - migrationBuilder.InsertData( - table: "AspNetRoles", - columns: new[] { "Id", "ConcurrencyStamp", "Name", "NormalizedName" }, - values: new object[,] - { - { "08a19f84-14c0-48c5-9cba-f13b9bd4bed2", null, "Trainer", "TRAINER" }, - { "4ecf06ad-a066-4e44-a56d-e41b24e3f2cf", null, "Client", "CLIENT" }, - { "ddcce0a9-75cc-4e5b-9b92-04e6ebb8432e", null, "Admin", "ADMIN" } - }); - - migrationBuilder.CreateIndex( - name: "IX_AspNetRoleClaims_RoleId", - table: "AspNetRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "RoleNameIndex", - table: "AspNetRoles", - column: "NormalizedName", - unique: true, - filter: "[NormalizedName] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserClaims_UserId", - table: "AspNetUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserLogins_UserId", - table: "AspNetUserLogins", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserRoles_RoleId", - table: "AspNetUserRoles", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "EmailIndex", - table: "AspNetUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "UserNameIndex", - table: "AspNetUsers", - column: "NormalizedUserName", - unique: true, - filter: "[NormalizedUserName] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_RefreshTokens_UserId", - table: "RefreshTokens", - column: "UserId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AspNetRoleClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserLogins"); - - migrationBuilder.DropTable( - name: "AspNetUserRoles"); - - migrationBuilder.DropTable( - name: "AspNetUserTokens"); - - migrationBuilder.DropTable( - name: "RefreshTokens"); - - migrationBuilder.DropTable( - name: "AspNetRoles"); - - migrationBuilder.DropTable( - name: "AspNetUsers"); - } - } -} diff --git a/Fitness/Backend/Security/IdentityServer/Migrations/ApplicationContextModelSnapshot.cs b/Fitness/Backend/Security/IdentityServer/Migrations/ApplicationContextModelSnapshot.cs deleted file mode 100644 index 8047aac..0000000 --- a/Fitness/Backend/Security/IdentityServer/Migrations/ApplicationContextModelSnapshot.cs +++ /dev/null @@ -1,339 +0,0 @@ -// -using System; -using IdentityServer.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace IdentityServer.Migrations -{ - [DbContext(typeof(ApplicationContext))] - partial class ApplicationContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.7") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("IdentityServer.Entities.RefreshToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ExpiryTime") - .HasColumnType("datetime2"); - - b.Property("Token") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("RefreshTokens"); - }); - - modelBuilder.Entity("IdentityServer.Entities.User", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("AccessFailedCount") - .HasColumnType("int"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("bit"); - - b.Property("FirstName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("LastName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("LockoutEnabled") - .HasColumnType("bit"); - - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("PasswordHash") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumber") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("bit"); - - b.Property("SecurityStamp") - .HasColumnType("nvarchar(max)"); - - b.Property("TwoFactorEnabled") - .HasColumnType("bit"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex") - .HasFilter("[NormalizedUserName] IS NOT NULL"); - - b.ToTable("AspNetUsers", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex") - .HasFilter("[NormalizedName] IS NOT NULL"); - - b.ToTable("AspNetRoles", (string)null); - - b.HasData( - new - { - Id = "ddcce0a9-75cc-4e5b-9b92-04e6ebb8432e", - Name = "Admin", - NormalizedName = "ADMIN" - }, - new - { - Id = "08a19f84-14c0-48c5-9cba-f13b9bd4bed2", - Name = "Trainer", - NormalizedName = "TRAINER" - }, - new - { - Id = "4ecf06ad-a066-4e44-a56d-e41b24e3f2cf", - Name = "Client", - NormalizedName = "CLIENT" - }); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("nvarchar(max)"); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(max)"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("nvarchar(max)"); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(max)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("nvarchar(450)"); - - b.Property("ProviderKey") - .HasColumnType("nvarchar(450)"); - - b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(max)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.Property("RoleId") - .HasColumnType("nvarchar(450)"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.Property("LoginProvider") - .HasColumnType("nvarchar(450)"); - - b.Property("Name") - .HasColumnType("nvarchar(450)"); - - b.Property("Value") - .HasColumnType("nvarchar(max)"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens", (string)null); - }); - - modelBuilder.Entity("IdentityServer.Entities.RefreshToken", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany("RefreshTokens") - .HasForeignKey("UserId"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("IdentityServer.Entities.User", b => - { - b.Navigation("RefreshTokens"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Fitness/Backend/Services/ClientService/ClientService.API/Controllers/ClientController.cs b/Fitness/Backend/Services/ClientService/ClientService.API/Controllers/ClientController.cs index c9ce342..893392f 100644 --- a/Fitness/Backend/Services/ClientService/ClientService.API/Controllers/ClientController.cs +++ b/Fitness/Backend/Services/ClientService/ClientService.API/Controllers/ClientController.cs @@ -14,13 +14,11 @@ public class ClientController:ControllerBase { private readonly IRepository _repository; private readonly IMapper _mapper; - private readonly IPublishEndpoint _publishEndpoint; - public ClientController(IRepository repository, IMapper mapper, IPublishEndpoint publishEndpoint) + public ClientController(IRepository repository, IMapper mapper) { _repository = repository ?? throw new ArgumentNullException(nameof(repository)); _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); - _publishEndpoint = publishEndpoint ?? throw new ArgumentNullException(nameof(publishEndpoint)); } // [Authorize(Roles = "Admin, Trainer")] diff --git a/Fitness/Backend/Services/TrainerService/TrainerService.API/Controllers/TrainerController.cs b/Fitness/Backend/Services/TrainerService/TrainerService.API/Controllers/TrainerController.cs index 8b55334..2a4a516 100644 --- a/Fitness/Backend/Services/TrainerService/TrainerService.API/Controllers/TrainerController.cs +++ b/Fitness/Backend/Services/TrainerService/TrainerService.API/Controllers/TrainerController.cs @@ -18,14 +18,12 @@ public class TrainerController : ControllerBase private readonly ITrainerRepository _repository; private readonly ReviewGrpcService _reviewGrpcService; private readonly IMapper _mapper; - private readonly IPublishEndpoint _publishEndpoint; - public TrainerController(ITrainerRepository repository, ReviewGrpcService reviewGrpcService, IMapper mapper, IPublishEndpoint publishEndpoint) + public TrainerController(ITrainerRepository repository, ReviewGrpcService reviewGrpcService, IMapper mapper) { _repository = repository ?? throw new ArgumentNullException(nameof(repository)); _reviewGrpcService = reviewGrpcService ?? throw new ArgumentNullException(nameof(reviewGrpcService)); _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); - _publishEndpoint = publishEndpoint ?? throw new ArgumentNullException(nameof(publishEndpoint)); } From 0c7854cfc406f465a588ba3cdddb88bf112fe0f6 Mon Sep 17 00:00:00 2001 From: Vukasin Markovic Date: Sun, 28 Sep 2025 02:03:18 +0200 Subject: [PATCH 008/118] Group Training Reservationy - client view Relates to #94 --- Fitness/Frontend/src/_nav.js | 6 + Fitness/Frontend/src/router/index.js | 6 + .../src/views/pages/ClientGroupTrainings.vue | 111 ++++++++++++++++++ Fitness/Frontend/src/views/pages/Login.vue | 4 + 4 files changed, 127 insertions(+) create mode 100644 Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue diff --git a/Fitness/Frontend/src/_nav.js b/Fitness/Frontend/src/_nav.js index 045bfca..9f8dcfb 100644 --- a/Fitness/Frontend/src/_nav.js +++ b/Fitness/Frontend/src/_nav.js @@ -36,6 +36,12 @@ export function generateClientNav(id) { to: `/client/${id}/schedule`, icon: 'cil-calendar' }, + { + component: 'CNavItem', + name: 'Group training', + to: `/client/${id}/groupTrainings`, + icon: 'cil-speech', + }, { component: 'CNavItem', name: 'Chat', diff --git a/Fitness/Frontend/src/router/index.js b/Fitness/Frontend/src/router/index.js index e546956..ad4fdde 100644 --- a/Fitness/Frontend/src/router/index.js +++ b/Fitness/Frontend/src/router/index.js @@ -65,6 +65,12 @@ const routes = [ component: () => import('@/views/pages/TrainerSchedule.vue') }, + { + path: '/client/:id/groupTrainings', + name: 'Client Schedule', + component: () => import('@/views/pages/ClientGroupTrainings.vue') + }, + { path: '/payment-success', name: 'Payment Success', diff --git a/Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue b/Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue new file mode 100644 index 0000000..f1b6fc5 --- /dev/null +++ b/Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/Fitness/Frontend/src/views/pages/Login.vue b/Fitness/Frontend/src/views/pages/Login.vue index 889613c..bac21bf 100644 --- a/Fitness/Frontend/src/views/pages/Login.vue +++ b/Fitness/Frontend/src/views/pages/Login.vue @@ -86,9 +86,12 @@ export default { dataServices.methods.get_user(this.username) .then( (response) => { + console.log("ovo je 1. response koji smo dobili: ", response); this.email = response.data.email; + console.log("Ovo je mejl koji nas zanima: ", this.email); dataServices.methods.get_user_id(role, this.email) .then( (response) => { + console.log("ovo je 2. response koji smo dobili: ", response); sessionStorage.setItem('userId', response.data.id); const id = response.data.id; if(role == 'Trainer') { @@ -96,6 +99,7 @@ export default { } else { this.$router.push('/client/' + id); + console.log("ovo je Id koji zelimo: " + id); } loader.hide(); From 0c50f8d42fc67a07f8242ec89d71762447af3898 Mon Sep 17 00:00:00 2001 From: Vukasin Markovic Date: Sun, 28 Sep 2025 02:43:32 +0200 Subject: [PATCH 009/118] Individual Training Reservation - client view Relates to #95 --- Fitness/Frontend/src/_nav.js | 6 + Fitness/Frontend/src/router/index.js | 8 +- .../views/pages/ClientIndividualTrainings.vue | 157 ++++++++++++++++++ 3 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue diff --git a/Fitness/Frontend/src/_nav.js b/Fitness/Frontend/src/_nav.js index 9f8dcfb..0b0a1c0 100644 --- a/Fitness/Frontend/src/_nav.js +++ b/Fitness/Frontend/src/_nav.js @@ -42,6 +42,12 @@ export function generateClientNav(id) { to: `/client/${id}/groupTrainings`, icon: 'cil-speech', }, + { + component: 'CNavItem', + name: 'Individual training', + to: `/client/${id}/individualTrainings`, + icon: 'cil-speech', + }, { component: 'CNavItem', name: 'Chat', diff --git a/Fitness/Frontend/src/router/index.js b/Fitness/Frontend/src/router/index.js index ad4fdde..fb1f60a 100644 --- a/Fitness/Frontend/src/router/index.js +++ b/Fitness/Frontend/src/router/index.js @@ -67,10 +67,16 @@ const routes = [ { path: '/client/:id/groupTrainings', - name: 'Client Schedule', + name: 'Client Group Trainings', component: () => import('@/views/pages/ClientGroupTrainings.vue') }, + { + path: '/client/:id/individualTrainings', + name: 'Client Individual Trainings', + component: () => import('@/views/pages/ClientIndividualTrainings.vue') + }, + { path: '/payment-success', name: 'Payment Success', diff --git a/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue new file mode 100644 index 0000000..bb32135 --- /dev/null +++ b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue @@ -0,0 +1,157 @@ + + + + + From 0e368319401326afd7f9365ff5e90f831f58dcad Mon Sep 17 00:00:00 2001 From: Vukasin Markovic Date: Sun, 28 Sep 2025 02:47:33 +0200 Subject: [PATCH 010/118] updated sidebar icons for group/individual training Relates to #95 and #94 --- Fitness/Frontend/src/_nav.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Fitness/Frontend/src/_nav.js b/Fitness/Frontend/src/_nav.js index 0b0a1c0..87f1467 100644 --- a/Fitness/Frontend/src/_nav.js +++ b/Fitness/Frontend/src/_nav.js @@ -40,13 +40,13 @@ export function generateClientNav(id) { component: 'CNavItem', name: 'Group training', to: `/client/${id}/groupTrainings`, - icon: 'cil-speech', + icon: 'cil-people', }, { component: 'CNavItem', name: 'Individual training', to: `/client/${id}/individualTrainings`, - icon: 'cil-speech', + icon: 'cil-user-follow', }, { component: 'CNavItem', From 5e4afa55d249554fbc86e26ec20512ef7c241269 Mon Sep 17 00:00:00 2001 From: Vukasin Markovic Date: Sun, 28 Sep 2025 10:35:16 +0200 Subject: [PATCH 011/118] Group Trainings Setup - trainer view Relates to #96 --- Fitness/Frontend/src/_nav.js | 6 + Fitness/Frontend/src/router/index.js | 11 ++ .../src/views/pages/TrainerGroupTrainings.vue | 121 ++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue diff --git a/Fitness/Frontend/src/_nav.js b/Fitness/Frontend/src/_nav.js index 87f1467..ca2d2f4 100644 --- a/Fitness/Frontend/src/_nav.js +++ b/Fitness/Frontend/src/_nav.js @@ -13,6 +13,12 @@ export function generateTrainerNav(id) { to: `/trainer/${id}/schedule`, icon: 'cil-calendar' }, + { + component: 'CNavItem', + name: 'Group training', + to: `/trainer/${id}/groupTrainings`, + icon: 'cil-people', + }, { component: 'CNavItem', name: 'Chat', diff --git a/Fitness/Frontend/src/router/index.js b/Fitness/Frontend/src/router/index.js index fb1f60a..240094e 100644 --- a/Fitness/Frontend/src/router/index.js +++ b/Fitness/Frontend/src/router/index.js @@ -71,6 +71,17 @@ const routes = [ component: () => import('@/views/pages/ClientGroupTrainings.vue') }, + { + path: '/trainer/:id/groupTrainings', + name: 'Trainer Group Trainings', + component: () => import('@/views/pages/TrainerGroupTrainings.vue') + }, + // { + // path: '/trainer/:id/groupTrainings', + // name: 'Trainer Group Trainings', + // component: () => import('@/views/pages/TrainerGroupTrainings.vue') + // }, + { path: '/client/:id/individualTrainings', name: 'Client Individual Trainings', diff --git a/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue b/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue new file mode 100644 index 0000000..81d6267 --- /dev/null +++ b/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue @@ -0,0 +1,121 @@ + + + From a8d44ac21e1112e097ade302b3cae9d57ae91b99 Mon Sep 17 00:00:00 2001 From: Vukasin Markovic Date: Sun, 28 Sep 2025 12:00:37 +0200 Subject: [PATCH 012/118] Add reservation API endpoints - Front Relates to #94 #95 #96 --- .../src/services/ReservationService.js | 123 ++++++++++++++++++ .../src/views/pages/TrainerGroupTrainings.vue | 11 +- 2 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 Fitness/Frontend/src/services/ReservationService.js diff --git a/Fitness/Frontend/src/services/ReservationService.js b/Fitness/Frontend/src/services/ReservationService.js new file mode 100644 index 0000000..1cc83e1 --- /dev/null +++ b/Fitness/Frontend/src/services/ReservationService.js @@ -0,0 +1,123 @@ +import axios from "axios"; + +const GATEWAY_URL = "http://localhost:8005"; +//const RESERVATIONS = `${GATEWAY_URL}/reservation`; + +const RESERVATIONS = "http://localhost:8025/api/v1/Reservation"; + + + + +// ---------------------- INDIVIDUAL RESERVATIONS ---------------------- + +// Admin - get all individual +export async function getAllIndividualReservations() { + const response = await axios.get(`${RESERVATIONS}/individual`); + return response.data; +} + +// Admin - get individual by id +export async function getIndividualReservationById(id) { + const response = await axios.get(`${RESERVATIONS}/individual/${id}`); + return response.data; +} + +// Client - get individual by clientId +export async function getIndividualReservationsByClient(clientId) { + const response = await axios.get(`${RESERVATIONS}/individual/client/${clientId}`); + return response.data; +} + +// Trainer - get individual by trainerId +export async function getIndividualReservationsByTrainer(trainerId) { + const response = await axios.get(`${RESERVATIONS}/individual/trainer/${trainerId}`); + return response.data; +} + +// Client - create individual reservation +export async function createIndividualReservation(reservation) { + const response = await axios.post(`${RESERVATIONS}/individual`, reservation, { + headers: { "Content-Type": "application/json" }, + }); + return response.data; +} + +// Client/Trainer - update individual reservation +export async function updateIndividualReservation(reservation) { + const response = await axios.put(`${RESERVATIONS}/individual`, reservation, { + headers: { "Content-Type": "application/json" }, + }); + return response.data; +} + +// Client/Trainer - delete individual reservation +export async function deleteIndividualReservation(id) { + const response = await axios.delete(`${RESERVATIONS}/individual/${id}`); + return response.data; +} + +// ---------------------- GROUP RESERVATIONS ---------------------- + +// Admin - get all group +export async function getAllGroupReservations() { + const response = await axios.get(`${RESERVATIONS}/group`); + return response.data; +} + +// Admin - get group by id +export async function getGroupReservationById(id) { + const response = await axios.get(`${RESERVATIONS}/group/${id}`); + return response.data; +} + +// Client - get group by clientId +export async function getGroupReservationsByClient(clientId) { + const response = await axios.get(`${RESERVATIONS}/group/client/${clientId}`); + return response.data; +} + +// Trainer - get group by trainerId +export async function getGroupReservationsByTrainer(trainerId) { + const response = await axios.get(`${RESERVATIONS}/group/trainer/${trainerId}`); + return response.data; +} + +// Trainer - create group reservation +export async function createGroupReservation(reservation) { + const response = await axios.post(`${RESERVATIONS}/group`, reservation, { + headers: { "Content-Type": "application/json" }, + }); + return response.data; +} + +// Trainer - update group reservation +export async function updateGroupReservation(reservation) { + const response = await axios.put(`${RESERVATIONS}/group`, reservation, { + headers: { "Content-Type": "application/json" }, + }); + return response.data; +} + +// Trainer - delete group reservation +export async function deleteGroupReservation(id) { + const response = await axios.delete(`${RESERVATIONS}/group/${id}`); + return response.data; +} + +// ---------------------- GROUP BOOKING / CANCEL ---------------------- + +// Client - book group reservation +export async function bookGroupReservation(id, clientId) { + const response = await axios.post(`${RESERVATIONS}/group/book/${id}`, null, { + params: { clientId }, + }); + return response.data; +} + +// Client - cancel group reservation +export async function cancelGroupReservation(id, clientId) { + const response = await axios.post(`${RESERVATIONS}/group/cancel/${id}`, null, { + params: { clientId }, + }); + return response.data; +} diff --git a/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue b/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue index 81d6267..8603214 100644 --- a/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue +++ b/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue @@ -63,6 +63,10 @@ diff --git a/Fitness/Frontend/src/components/AppHeaderDropdownNotif.vue b/Fitness/Frontend/src/components/AppHeaderDropdownNotif.vue new file mode 100644 index 0000000..0f26ef1 --- /dev/null +++ b/Fitness/Frontend/src/components/AppHeaderDropdownNotif.vue @@ -0,0 +1,42 @@ + + + From a709d342a88474a5c80de2b5a034e031ba50f9dc Mon Sep 17 00:00:00 2001 From: Vukasin Markovic Date: Sun, 28 Sep 2025 14:23:11 +0200 Subject: [PATCH 015/118] Notification Service API integration in Front + Dropdown list improvement Relates to #98 --- .../src/components/AppHeaderDropdownNotif.vue | 51 +++++++++--- .../src/services/NotificationService.js | 81 +++++++++++++++++++ 2 files changed, 122 insertions(+), 10 deletions(-) create mode 100644 Fitness/Frontend/src/services/NotificationService.js diff --git a/Fitness/Frontend/src/components/AppHeaderDropdownNotif.vue b/Fitness/Frontend/src/components/AppHeaderDropdownNotif.vue index 0f26ef1..7f0d4a0 100644 --- a/Fitness/Frontend/src/components/AppHeaderDropdownNotif.vue +++ b/Fitness/Frontend/src/components/AppHeaderDropdownNotif.vue @@ -3,40 +3,71 @@ - + No notifications - - - {{ notif.message }} + + + +

diff --git a/Fitness/Frontend/src/services/NotificationService.js b/Fitness/Frontend/src/services/NotificationService.js new file mode 100644 index 0000000..5fb215c --- /dev/null +++ b/Fitness/Frontend/src/services/NotificationService.js @@ -0,0 +1,81 @@ +import axios from "axios"; + +const NOTIFICATIONS = "http://localhost:8004/api/v1/Notification"; + +// TO DO when Mitreski switch Notification to Gateway + +//const GATEWAY_URL = "http://localhost:8005"; +//const NOTIFICATIONS = `${GATEWAY_URL}/api/v1/Notification`; + +// Admin +export async function getNotifications() { + try { + const response = await axios.get(`${NOTIFICATIONS}`); + return response.data; + } catch (error) { + console.error("Error fetching notifications:", error); + throw error; + } +} + +export async function getNotificationsByUserId(userId) { + try { + const response = await axios.get(`${NOTIFICATIONS}/user/${userId}`); + return response.data; + } catch (error) { + console.error("Error fetching notifications by userId:", error); + throw error; + } +} + +export async function getNotificationById(id) { + try { + const response = await axios.get(`${NOTIFICATIONS}/${id}`); + return response.data; + } catch (error) { + console.error("Error fetching notification by id:", error); + throw error; + } +} + +export async function updateNotification(notification) { + try { + const response = await axios.put(`${NOTIFICATIONS}`, notification, { + headers: { "Content-Type": "application/json" } + }); + return response.data; + } catch (error) { + console.error("Error updating notification:", error); + throw error; + } +} + +export async function deleteAllNotifications() { + try { + const response = await axios.delete(`${NOTIFICATIONS}`); + return response.data; + } catch (error) { + console.error("Error deleting all notifications:", error); + throw error; + } +} + +export async function deleteNotificationsByUserId(userId) { + try { + const response = await axios.delete(`/user/${userId}`); + return response.data; + } catch (error) { + console.error("Error deleting notifications by userId:", error); + throw error; + } +} + +export async function deleteNotificationById(id) { + try { + const response = await axios.delete(`${NOTIFICATIONS}/${id}`); + return response.data; + } catch (error) { + console.error("Error deleting notification by id:", error); + throw error; + } +} From 42df130569ab6f189853ff09f6964b5b130a7397 Mon Sep 17 00:00:00 2001 From: Vukasin Markovic Date: Sun, 28 Sep 2025 14:35:38 +0200 Subject: [PATCH 016/118] Added notification detail popup on dropdown click Relates to #98 --- .../src/components/AppHeaderDropdownNotif.vue | 87 +++++++++++++------ 1 file changed, 59 insertions(+), 28 deletions(-) diff --git a/Fitness/Frontend/src/components/AppHeaderDropdownNotif.vue b/Fitness/Frontend/src/components/AppHeaderDropdownNotif.vue index 7f0d4a0..a2042be 100644 --- a/Fitness/Frontend/src/components/AppHeaderDropdownNotif.vue +++ b/Fitness/Frontend/src/components/AppHeaderDropdownNotif.vue @@ -1,32 +1,57 @@ diff --git a/Fitness/Frontend/src/views/pages/ClientSchedule.vue b/Fitness/Frontend/src/views/pages/ClientSchedule.vue deleted file mode 100644 index e773d69..0000000 --- a/Fitness/Frontend/src/views/pages/ClientSchedule.vue +++ /dev/null @@ -1,455 +0,0 @@ - - - - - - - - - diff --git a/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue b/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue index cd0b4c6..5c6bcc7 100644 --- a/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue +++ b/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue @@ -52,9 +52,12 @@ class="border-b" > - {{ getTrainingTypeName(training.typeId) }} + {{ getTrainingTypeName(training.trainingTypeId) }} + + {{ training.date }} +
+ {{ training.startTime }} - {{ training.endTime }} - {{ training.dateTime }} @@ -84,21 +87,17 @@ export default { this.$parent.$parent.$parent.setUserData(this.$route.params.id, "trainer"); this.trainerId = this.$route.params.id; console.log("id trenera: " + this.trainerId); - - // hardcoded trainings - this.trainings = [ - { id: 1, typeId: "1", dateTime: "2025-10-02T18:00" }, - { id: 2, typeId: "2", dateTime: "2025-10-04T19:00" }, - ]; - - // trainers trainingTypes - const id = this.trainerId; - dataServices.methods.get_trainer_by_id(id).then((response) => { + }, + mounted() { + dataServices.methods.get_trainer_by_id(this.trainerId).then((response) => { this.trainer = response.data; console.log(response.data); console.log(this.trainer); }); + reservationService.getGroupReservationsByTrainer(this.trainerId).then((response) => { + this.trainings = response.data + }) }, methods: { createTraining() { @@ -106,19 +105,40 @@ export default { alert("Please select a training type and date/time."); return; } + + const [date, time] = this.newTraining.dateTime.split("T"); + const timePlusOneHour = new Date(this.newTraining.dateTime) + .toTimeString() + .split(":") + .map((v, i) => i < 2 ? String((+v + (i === 0 ? 1 : 0)) % 24).padStart(2, "0") : "00") + .join(":"); const newItem = { - id: Date.now(), - typeId: this.newTraining.typeId, + id: "", + name: "Name", + about: "About", + trainerId: this.trainerId, + trainingTypeId: this.newTraining.typeId, + capacity: 20, + clientIds: [], + date: date, + startTime: time + ":00", + endTime: timePlusOneHour, dateTime: this.newTraining.dateTime, }; - this.trainings.push(newItem); - // reset form this.newTraining = { typeId: "", dateTime: "" }; - // later API (data_services.js) + reservationService.createGroupReservation(newItem) + .then(response => { + if (response.status === 201) { + alert("New group training added!") + } else { + console.warn("Booking failed with status:", response.status); + alert("Training not created!") + } + }) }, getTrainingTypeName(typeId) { diff --git a/Fitness/Frontend/src/views/pages/TrainerSchedule.vue b/Fitness/Frontend/src/views/pages/TrainerSchedule.vue deleted file mode 100644 index 630dfb2..0000000 --- a/Fitness/Frontend/src/views/pages/TrainerSchedule.vue +++ /dev/null @@ -1,281 +0,0 @@ - - - - - - - From ab5145da7f61aa3315b31defc4bc7aa114c58498 Mon Sep 17 00:00:00 2001 From: stemil01 Date: Tue, 30 Sep 2025 11:16:02 +0200 Subject: [PATCH 028/118] Improve client individual training frontend. Enable booking from the frontend side. Relates to #103 --- Fitness/Frontend/package.json | 5 + .../views/pages/ClientIndividualTrainings.vue | 473 +++++++++++++----- 2 files changed, 359 insertions(+), 119 deletions(-) diff --git a/Fitness/Frontend/package.json b/Fitness/Frontend/package.json index 5670a52..4717167 100644 --- a/Fitness/Frontend/package.json +++ b/Fitness/Frontend/package.json @@ -26,6 +26,11 @@ "@coreui/utils": "^1.3.1", "@coreui/vue": "^4.5.0", "@coreui/vue-chartjs": "2.0.1", + "@fullcalendar/core": "^6.1.19", + "@fullcalendar/daygrid": "^6.1.19", + "@fullcalendar/interaction": "^6.1.19", + "@fullcalendar/timegrid": "^6.1.19", + "@fullcalendar/vue3": "^6.1.19", "axios": "^1.4.0", "core-js": "^3.26.1", "vue": "^3.2.45", diff --git a/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue index ed70f77..a9506ab 100644 --- a/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue +++ b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue @@ -1,148 +1,185 @@ From ce6cb805311f0f93e25d872855ee8771cd89cd58 Mon Sep 17 00:00:00 2001 From: stemil01 Date: Tue, 30 Sep 2025 23:19:24 +0200 Subject: [PATCH 029/118] Finish the first version of client individual reservation frontend page. Relates to #103 --- .../Controllers/ReservationController.cs | 22 +++ .../Entities/IndividualReservation.cs | 1 + .../Entities/IndividualReservationStatus.cs | 8 + .../Services/IReservationService.cs | 2 +- .../src/services/ReservationService.js | 6 + .../views/pages/ClientIndividualTrainings.vue | 170 ++++++++++++++++-- 6 files changed, 189 insertions(+), 20 deletions(-) create mode 100644 Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/IndividualReservationStatus.cs diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs index 6061cff..7706cf0 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs @@ -27,7 +27,29 @@ public async Task>> GetIndividua var reservations = await _reservationService.GetIndividualReservationsAsync(); return Ok(reservations); } + + //[Authorize(Roles = "Client")] + [HttpPut("individual/client/cancel/{id}")] + [ProducesResponseType(typeof(IndividualReservation), StatusCodes.Status204NoContent)] + public async Task CancelClientIndividualReservation(string id) + { + var reservation = await _reservationService.GetIndividualReservationAsync(id); + reservation.Status = IndividualReservationStatus.ClientCancelled; + var cancelled = await _reservationService.UpdateIndividualReservationAsync(reservation); + return cancelled ? Ok(cancelled) : BadRequest(); + } + //[Authorize(Roles = "Trainer")] + [HttpPut("individual/trainer/cancel/{id}")] + [ProducesResponseType(typeof(IndividualReservation), StatusCodes.Status204NoContent)] + public async Task CancelTrainerIndividualReservation(string id) + { + var reservation = await _reservationService.GetIndividualReservationAsync(id); + reservation.Status = IndividualReservationStatus.TrainerCancelled; + var cancelled = await _reservationService.UpdateIndividualReservationAsync(reservation); + return cancelled ? Ok(cancelled) : BadRequest(); + } + //[Authorize(Roles = "Admin")] [HttpGet("group")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/IndividualReservation.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/IndividualReservation.cs index cf0d6ad..abe4b2b 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/IndividualReservation.cs +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/IndividualReservation.cs @@ -14,4 +14,5 @@ public class IndividualReservation public TimeOnly StartTime { get; set; } public TimeOnly EndTime { get; set; } public DateOnly Date { get; set; } + public IndividualReservationStatus Status { get; set; } = IndividualReservationStatus.Active; } \ No newline at end of file diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/IndividualReservationStatus.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/IndividualReservationStatus.cs new file mode 100644 index 0000000..ef93652 --- /dev/null +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Entities/IndividualReservationStatus.cs @@ -0,0 +1,8 @@ +namespace ReservationService.API.Entities; + +public enum IndividualReservationStatus +{ + Active, + ClientCancelled, + TrainerCancelled +} \ No newline at end of file diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Services/IReservationService.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Services/IReservationService.cs index d364547..35d4827 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/Services/IReservationService.cs +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Services/IReservationService.cs @@ -27,7 +27,7 @@ public interface IReservationService Task UpdateIndividualReservationAsync(IndividualReservation individualReservation); Task UpdateGroupReservationAsync(GroupReservation groupReservation); - + Task DeleteIndividualReservationAsync(string id); Task DeleteGroupReservationAsync(string id); diff --git a/Fitness/Frontend/src/services/ReservationService.js b/Fitness/Frontend/src/services/ReservationService.js index 0125152..3d1281b 100644 --- a/Fitness/Frontend/src/services/ReservationService.js +++ b/Fitness/Frontend/src/services/ReservationService.js @@ -114,6 +114,12 @@ export async function bookGroupReservation(id, clientId) { return response; } +// Client - cancel individual reservation +export async function cancelClientIndividualReservation(id) { + const response = await axios.put(`${RESERVATIONS}/individual/client/cancel/${id}`); + return response; +} + // Client - cancel group reservation export async function cancelGroupReservation(id, clientId) { const response = await axios.post(`${RESERVATIONS}/group/cancel/${id}`, null, { diff --git a/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue index a9506ab..a810d58 100644 --- a/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue +++ b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue @@ -66,15 +66,17 @@ Trainer Training Type - Date/Time + Date + Time Action {{ res.trainer }} - {{ res.type }} - {{ res.date }} {{ res.time }} + {{ res.trainingType }} + {{ res.date }} + {{ res.time }} @@ -85,29 +87,65 @@
-

Completed Trainings

+

Completed or Cancelled Trainings

- - + + + + - - - - + + + + + +
Trainer Training TypeDate/TimeReviewDateTimeStatusAction
{{ done.trainer }}{{ done.type }}{{ done.date }} {{ done.time }}
{{ res.trainer }}{{ res.trainingType }}{{ res.date }}{{ res.time }}{{ res.status }} - + +
+ + @@ -115,6 +153,7 @@ import dataServices from '@/services/data_services'; import { getIndividualReservationsByClient, + cancelClientIndividualReservation, getGroupReservationsByTrainer, getIndividualReservationsByTrainer, createIndividualReservation @@ -133,8 +172,11 @@ export default { selectedTrainer: "", getAvailability: false, showTrainerInfo: false, + showReview: false, selectedTrainingType: "", trainingDate: "", + trainingRating: null, + currentReservationId: "", today: new Date().toISOString().split("T")[0], // e.g. "2025-09-30" startTime: "", calendarOptions: { @@ -188,6 +230,7 @@ export default { .then(response => { if (response.status === 201) { alert("Training booked successfully!"); + location.reload(); } else { alert(`Booking failed. Status: ${response.status}`); } @@ -198,6 +241,34 @@ export default { }); }, + cancelTraining(res_id) { + if (confirm("Are you sure you want to cancel the training?")) { + cancelClientIndividualReservation(res_id) + .then(response => { + location.reload(); + }) + .catch(error => { + console.error("Cancelling error:", error); + alert("An error occurred while cancelling a reservation from the client side."); + }); + } + }, + + submitReview(reservationId, rating, comment) { + // TODO: Connect review submission with the backend + }, + + findTrainerName(tra_id) { + let trainer = this.trainers.find(t => t.id == tra_id); + return trainer !== undefined ? trainer.fullName : ""; + }, + + findTrainingType(type_id) { + let trainingTypes = this.trainers.map(t => t.trainingTypes).flat(); + let trainingType = trainingTypes.find(t => t.id == type_id); + return trainingType !== undefined ? trainingType.name : ""; + }, + // Fetch list of trainers fetchTrainers() { dataServices.methods.get_trainers() @@ -214,7 +285,6 @@ export default { getIndividualReservationsByClient(clientId) .then(response => { this.reservations = response.data; - console.log(this.reservations); }) .catch(error => { console.error("Failed to fetch trainers:", error); @@ -226,6 +296,7 @@ export default { availableTrainingTypes() { return this.selectedTrainer ? this.selectedTrainer.trainingTypes : []; }, + endTime() { let start = this.startTime; let duration = this.selectedTrainingType.duration; @@ -241,6 +312,39 @@ export default { const minutes = (numMinutes % 60).toString().padStart(2, '0'); const seconds = s2.toString().padStart(2, '0'); return `${hours}:${minutes}:${seconds}`; + }, + + reservedTrainings() { + return this.reservations + .filter(r => { + let rDate = new Date(`${r.date}T${r.endTime}`); + let now = new Date(); + return now <= rDate && r.status == 0; + }) + .map(r => ({ + id: r.id, + trainer: this.findTrainerName(r.trainerId), + trainingType: this.findTrainingType(r.trainingTypeId), + date: r.date, + time: `${r.startTime} - ${r.endTime}` + })); + }, + + completedOrCancelled() { + return this.reservations + .filter(r => { + let rDate = new Date(`${r.date}T${r.endTime}`); + let now = new Date(); + return rDate < now || r.status != 0; + }) + .map(r => ({ + id: r.id, + trainer: this.findTrainerName(r.trainerId), + trainingType: this.findTrainingType(r.trainingTypeId), + date: r.date, + time: `${r.startTime} - ${r.endTime}`, + status: r.status == 0 ? "Active" : (r.status == 1 ? "Cancelled by me" : "Cancelled by trainer") + })); } }, @@ -341,13 +445,6 @@ export default { gap: 10px; } -.booking-form button { - padding: 8px 12px; - border: none; - border-radius: 6px; - cursor: pointer; -} - .book-btn { background: #28a745; color: white; @@ -392,6 +489,13 @@ th { text-align: left; } +button { + padding: 8px 12px; + border: none; + border-radius: 6px; + cursor: pointer; +} + button.danger { background: #dc3545; color: white; @@ -437,8 +541,36 @@ button.info { cursor: pointer; } +button:disabled { + background-color: #cccccc; /* Gray background */ + color: #666666; /* Darker gray text */ + cursor: not-allowed; /* Change cursor to indicate no interaction */ + opacity: 0.7; /* Optional: reduce opacity for a more subdued look */ + cursor: not-allowed; +} + .fc-non-business { background-color: #e0e0e0 !important; opacity: 0.6; } + +.rating label { + margin-right: 0.5rem; +} + +.comment textarea { + width: 100%; + margin-top: 0.5rem; +} + +.review-window { + margin: 10px; +} + +.actions { + display: flex; + justify-content: flex-end; + gap: 0.5rem; + margin-top: 1rem; +} From 74305cad3da9265296abe1ceae1fc74bf11fa465 Mon Sep 17 00:00:00 2001 From: stemil01 Date: Sat, 4 Oct 2025 04:16:25 +0200 Subject: [PATCH 030/118] Complete client and trainer ground trainings frontend pages. Relates to #103 and #104. --- .../src/views/pages/ClientGroupTrainings.vue | 405 +++++++++--- .../views/pages/ClientIndividualTrainings.vue | 12 +- .../src/views/pages/TrainerGroupTrainings.vue | 583 ++++++++++++++---- 3 files changed, 792 insertions(+), 208 deletions(-) diff --git a/Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue b/Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue index 467a644..545a812 100644 --- a/Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue +++ b/Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue @@ -1,47 +1,124 @@ @@ -58,8 +135,11 @@ export default { data() { return { - trainings: [], - trainers: [] + groupReservations: [], + trainers: [], + showDetails: false, + showReview: false, + trainingRating: null }; }, @@ -69,92 +149,227 @@ export default { }, mounted() { - this.fetchTrainings() + this.fetchGroupReservations(); }, methods: { - bookTraining(id) { - const training = this.trainings.find(t => t.id === id); - - bookGroupReservation(id, this.$route.params.id) - .then(response => { - if (response.status === 200) { - training.booked = true; - } else { - console.warn("Booking failed with status:", response.status); - alert("Training not booked!") - } - }) - .catch(error => { - console.error("Booking API call failed:", error); - alert("Communication failure!") - }); + bookReservation(id) { + if (confirm("Confirm the booking")) { + bookGroupReservation(id, this.$route.params.id) + .then(response => { + if (response.status === 200) { + location.reload(); + } else { + console.warn("Booking failed with status:", response.status); + alert("Training not booked!") + } + }) + .catch(error => { + console.error("Booking API call failed:", error); + alert("Communication failure!") + }); + } }, - cancelBooking(id) { - const training = this.trainings.find(t => t.id === id); - - cancelGroupReservation(id, this.$route.params.id) - .then(response => { - if (response.status === 204) { - training.booked = false; - } else { - console.warn("Cancelling failed with status:", response.status); - alert("Training not cancelled!") - } - }) - .catch(error => { - console.error("Booking API call failed:", error); - alert("Communication failure!") - }); + cancelReservation(id) { + if (confirm("Are you sure you want to cancel this reservation?")) { + cancelGroupReservation(id, this.$route.params.id) + .then(response => { + if (response.status === 204) { + location.reload(); + } else { + console.warn("Cancelling failed with status:", response.status); + alert("Training not cancelled!") + } + }) + .catch(error => { + console.error("Booking API call failed:", error); + alert("Communication failure!") + }); + } }, - fetchTrainings() { + fetchGroupReservations() { getAllGroupReservations() .then(response => { - this.trainings = response.data; + this.groupReservations = response.data; return data_services.methods.get_trainers(); }) .then(response => { this.trainers = response.data; - this.trainings.forEach(training => { - const trainer = this.trainers.find(t => t.id === training.trainerId); - training.trainer = trainer ? trainer.fullName : "Unknown"; - training.booked = training.clientIds.includes(this.$route.params.id) + this.groupReservations.forEach(reservation => { + const trainer = this.trainers.find(t => t.id === reservation.trainerId); + reservation.trainer = trainer ? trainer.fullName : "Unknown"; }); }) .catch(error => { console.error("Error fetching trainings or trainers:", error); }); } + }, + + + computed: { + availableReservations() { + return this.groupReservations.filter(r => { + let rDate = new Date(`${r.date}T${r.endTime}`); + let now = new Date(); + return now <= rDate && r.capacity > r.clientIds.length; + }); + }, + + completedReservations() { + return this.groupReservations.filter(r => { + let rDate = new Date(`${r.date}T${r.endTime}`); + let now = new Date(); + return rDate < now && r.clientIds.includes(this.$route.params.id); + }); + } } }; diff --git a/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue index a810d58..a952084 100644 --- a/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue +++ b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue @@ -353,9 +353,10 @@ export default { let unavailableSlots = [] getIndividualReservationsByTrainer(this.selectedTrainer.id) - .then(list => { - list.data.forEach(element => { + .then(response => { + response.data.forEach(element => { unavailableSlots.push({ + title: "individual", date: element.date, start: element.startTime, end: element.endTime @@ -363,9 +364,10 @@ export default { }); getGroupReservationsByTrainer(this.selectedTrainer.id) - .then(list => { - list.data.forEach(element => { + .then(response => { + response.data.forEach(element => { unavailableSlots.push({ + title: "group", date: element.date, start: element.startTime, end: element.endTime @@ -373,7 +375,7 @@ export default { }); let unavailableEvents = unavailableSlots.map(t => ({ - title: 'booked', + title: t.title, start: `${t.date}T${t.start}`, end: `${t.date}T${t.end}`, display: 'background' diff --git a/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue b/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue index 5c6bcc7..df0366d 100644 --- a/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue +++ b/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue @@ -1,139 +1,301 @@ + + + From d79a94a85108bd25b1c0527cef958b7457de0f2c Mon Sep 17 00:00:00 2001 From: stemil01 Date: Mon, 6 Oct 2025 01:27:57 +0200 Subject: [PATCH 031/118] Finish the frontend for reservations service. Relates to #103 and #104. --- Fitness/Frontend/src/_nav.js | 6 + Fitness/Frontend/src/router/index.js | 17 +- .../src/services/ReservationService.js | 6 + .../views/pages/ClientIndividualTrainings.vue | 2 +- .../pages/TrainerIndividualTrainings.vue | 395 ++++++++++++++++++ 5 files changed, 420 insertions(+), 6 deletions(-) create mode 100644 Fitness/Frontend/src/views/pages/TrainerIndividualTrainings.vue diff --git a/Fitness/Frontend/src/_nav.js b/Fitness/Frontend/src/_nav.js index 44c7826..899a656 100644 --- a/Fitness/Frontend/src/_nav.js +++ b/Fitness/Frontend/src/_nav.js @@ -13,6 +13,12 @@ export function generateTrainerNav(id) { to: `/trainer/${id}/groupTrainings`, icon: 'cil-people', }, + { + component: 'CNavItem', + name: 'Individual training', + to: `/trainer/${id}/individualTrainings`, + icon: 'cil-people', + }, { component: 'CNavItem', name: 'Chat', diff --git a/Fitness/Frontend/src/router/index.js b/Fitness/Frontend/src/router/index.js index 00ff25e..440b936 100644 --- a/Fitness/Frontend/src/router/index.js +++ b/Fitness/Frontend/src/router/index.js @@ -57,11 +57,12 @@ const routes = [ name: 'Trainer Group Trainings', component: () => import('@/views/pages/TrainerGroupTrainings.vue') }, - // { - // path: '/trainer/:id/groupTrainings', - // name: 'Trainer Group Trainings', - // component: () => import('@/views/pages/TrainerGroupTrainings.vue') - // }, + + { + path: '/trainer/:id/groupTrainings', + name: 'Trainer Group Trainings', + component: () => import('@/views/pages/TrainerGroupTrainings.vue') + }, { path: '/client/:id/individualTrainings', @@ -69,6 +70,12 @@ const routes = [ component: () => import('@/views/pages/ClientIndividualTrainings.vue') }, + { + path: '/trainer/:id/individualTrainings', + name: 'Trainer Individual Trainings', + component: () => import('@/views/pages/TrainerIndividualTrainings.vue') + }, + { path: '/payment-success', name: 'Payment Success', diff --git a/Fitness/Frontend/src/services/ReservationService.js b/Fitness/Frontend/src/services/ReservationService.js index 3d1281b..7c03c54 100644 --- a/Fitness/Frontend/src/services/ReservationService.js +++ b/Fitness/Frontend/src/services/ReservationService.js @@ -127,3 +127,9 @@ export async function cancelGroupReservation(id, clientId) { }); return response; } + +// Trainer - cancel individual reservation +export async function cancelTrainerIndividualReservation(id) { + const response = await axios.put(`${RESERVATIONS}/individual/trainer/cancel/${id}`); + return response; +} diff --git a/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue index a952084..28dcfa9 100644 --- a/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue +++ b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue @@ -287,7 +287,7 @@ export default { this.reservations = response.data; }) .catch(error => { - console.error("Failed to fetch trainers:", error); + console.error("Failed to fetch reservations:", error); }) } }, diff --git a/Fitness/Frontend/src/views/pages/TrainerIndividualTrainings.vue b/Fitness/Frontend/src/views/pages/TrainerIndividualTrainings.vue new file mode 100644 index 0000000..a0e5b85 --- /dev/null +++ b/Fitness/Frontend/src/views/pages/TrainerIndividualTrainings.vue @@ -0,0 +1,395 @@ + + + + + From 9bc56211e4c198b8f1d73476c195e3dfa31c2e89 Mon Sep 17 00:00:00 2001 From: Milan Mitreski Date: Tue, 7 Oct 2025 19:20:14 +0200 Subject: [PATCH 032/118] PaymentService integrated with ReservationService and ChatService. Minor fixes for frontend and backend. Relates to #103 and #104. --- .../Repositories/ChatRepository.cs | 20 +- .../PaymentService.API.csproj | 1 + .../PaymentService.API/Program.cs | 2 + .../appsettings.Development.json | 4 - .../Controllers/ReservationController.cs | 44 ++--- .../Services/ReservationService.cs | 4 +- .../Backend/docker-compose.development.yml | 4 +- Fitness/Frontend/src/services/ChatService.js | 10 + .../views/pages/ClientIndividualTrainings.vue | 77 +++++--- Fitness/Frontend/src/views/pages/PayChat.vue | 112 ++++++----- .../src/views/pages/PaymentSuccess.vue | 177 +++++++++++++----- .../src/views/pages/TrainerGroupTrainings.vue | 15 +- .../pages/TrainerIndividualTrainings.vue | 62 +++++- 13 files changed, 370 insertions(+), 162 deletions(-) diff --git a/Fitness/Backend/Services/ChatService.API/Repositories/ChatRepository.cs b/Fitness/Backend/Services/ChatService.API/Repositories/ChatRepository.cs index 0788288..04d0e49 100644 --- a/Fitness/Backend/Services/ChatService.API/Repositories/ChatRepository.cs +++ b/Fitness/Backend/Services/ChatService.API/Repositories/ChatRepository.cs @@ -57,11 +57,23 @@ public async Task DeleteChatSessionAsync(string trainerId, string clientId public async Task ExtendChatSessionAsync(string sessionId) { var filter = Builders.Filter.Eq(s => s.Id, new ObjectId(sessionId)); - var update = Builders.Update - .Set(s => s.IsUnlocked, true) - .Set(s => s.ExpirationDate, DateTime.UtcNow.AddDays(30)); + var updatePipeline = new PipelineUpdateDefinition( + new[] + { + new BsonDocument("$set", new BsonDocument + { + { "IsUnlocked", true }, + { + "ExpirationDate", new BsonDocument("$add", new BsonArray + { + new BsonDocument("$max", new BsonArray { "$ExpirationDate", DateTime.UtcNow }), + (long)TimeSpan.FromDays(30).TotalMilliseconds + }) + } + }) + }); - var result = await _chatSessions.UpdateOneAsync(filter, update); + var result = await _chatSessions.UpdateOneAsync(filter, updatePipeline); return result.ModifiedCount > 0; } diff --git a/Fitness/Backend/Services/PaymentService/PaymentService.API/PaymentService.API.csproj b/Fitness/Backend/Services/PaymentService/PaymentService.API/PaymentService.API.csproj index c2387a0..575d6c7 100644 --- a/Fitness/Backend/Services/PaymentService/PaymentService.API/PaymentService.API.csproj +++ b/Fitness/Backend/Services/PaymentService/PaymentService.API/PaymentService.API.csproj @@ -11,6 +11,7 @@ + diff --git a/Fitness/Backend/Services/PaymentService/PaymentService.API/Program.cs b/Fitness/Backend/Services/PaymentService/PaymentService.API/Program.cs index d4543aa..13f62b0 100644 --- a/Fitness/Backend/Services/PaymentService/PaymentService.API/Program.cs +++ b/Fitness/Backend/Services/PaymentService/PaymentService.API/Program.cs @@ -11,6 +11,8 @@ // Add services to the container. +DotNetEnv.Env.Load(); + builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddSingleton(consulConfig); diff --git a/Fitness/Backend/Services/PaymentService/PaymentService.API/appsettings.Development.json b/Fitness/Backend/Services/PaymentService/PaymentService.API/appsettings.Development.json index 794be95..d40c87a 100644 --- a/Fitness/Backend/Services/PaymentService/PaymentService.API/appsettings.Development.json +++ b/Fitness/Backend/Services/PaymentService/PaymentService.API/appsettings.Development.json @@ -8,10 +8,6 @@ "DatabaseSettings": { "ConnectionString": "mongodb://localhost:27017" }, - "PayPalSettings": { - "ClientId": "AbO70ZPXZV0PKg39y4Fi5V3iv0evxuUweijLTuzDYewszFByKPWAmEktlnMVFsgN3g2txL_7v4KAx6M8", - "ClientSecret": "EJNTklAoNzMMAxNr5mB9ao5R6VyykKWv1TnMGySQZoYiH9aQuKbZzapOLzbFHRejZar5hO5BWQtVg7fz" - }, "ConsulConfig": { "Address": "http://consul:8500", "ServiceName": "PaymentService.API", diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs index 7706cf0..e5be5f4 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Controllers/ReservationController.cs @@ -28,28 +28,6 @@ public async Task>> GetIndividua return Ok(reservations); } - //[Authorize(Roles = "Client")] - [HttpPut("individual/client/cancel/{id}")] - [ProducesResponseType(typeof(IndividualReservation), StatusCodes.Status204NoContent)] - public async Task CancelClientIndividualReservation(string id) - { - var reservation = await _reservationService.GetIndividualReservationAsync(id); - reservation.Status = IndividualReservationStatus.ClientCancelled; - var cancelled = await _reservationService.UpdateIndividualReservationAsync(reservation); - return cancelled ? Ok(cancelled) : BadRequest(); - } - - //[Authorize(Roles = "Trainer")] - [HttpPut("individual/trainer/cancel/{id}")] - [ProducesResponseType(typeof(IndividualReservation), StatusCodes.Status204NoContent)] - public async Task CancelTrainerIndividualReservation(string id) - { - var reservation = await _reservationService.GetIndividualReservationAsync(id); - reservation.Status = IndividualReservationStatus.TrainerCancelled; - var cancelled = await _reservationService.UpdateIndividualReservationAsync(reservation); - return cancelled ? Ok(cancelled) : BadRequest(); - } - //[Authorize(Roles = "Admin")] [HttpGet("group")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] @@ -212,6 +190,28 @@ public async Task DeleteGroupReservation(string id) return BadRequest(); } } + + //[Authorize(Roles = "Client")] + [HttpPut("individual/client/cancel/{id}")] + [ProducesResponseType(typeof(IndividualReservation), StatusCodes.Status204NoContent)] + public async Task CancelClientIndividualReservation(string id) + { + var reservation = await _reservationService.GetIndividualReservationAsync(id); + reservation.Status = IndividualReservationStatus.ClientCancelled; + var cancelled = await _reservationService.UpdateIndividualReservationAsync(reservation); + return cancelled ? Ok(cancelled) : BadRequest(); + } + + //[Authorize(Roles = "Trainer")] + [HttpPut("individual/trainer/cancel/{id}")] + [ProducesResponseType(typeof(IndividualReservation), StatusCodes.Status204NoContent)] + public async Task CancelTrainerIndividualReservation(string id) + { + var reservation = await _reservationService.GetIndividualReservationAsync(id); + reservation.Status = IndividualReservationStatus.TrainerCancelled; + var cancelled = await _reservationService.UpdateIndividualReservationAsync(reservation); + return cancelled ? Ok(cancelled) : BadRequest(); + } //[Authorize(Roles = "Client")] [HttpPost("group/book/{id}")] diff --git a/Fitness/Backend/Services/ReservationService/ReservationService.API/Services/ReservationService.cs b/Fitness/Backend/Services/ReservationService/ReservationService.API/Services/ReservationService.cs index cfe6d2a..60956c1 100644 --- a/Fitness/Backend/Services/ReservationService/ReservationService.API/Services/ReservationService.cs +++ b/Fitness/Backend/Services/ReservationService/ReservationService.API/Services/ReservationService.cs @@ -226,7 +226,7 @@ private async Task IsClientFree(string clientId, DateOnly date, TimeOnly s foreach (var individualReservation in individualReservations) { - if (individualReservation.Date == date && IntervalsOverlap(individualReservation.StartTime, + if (individualReservation.Status == IndividualReservationStatus.Active && individualReservation.Date == date && IntervalsOverlap(individualReservation.StartTime, individualReservation.EndTime, start, end)) { return false; @@ -252,7 +252,7 @@ private async Task IsTrainerFree(string trainerId, DateOnly date, TimeOnly foreach (var individualReservation in individualReservations) { - if (individualReservation.Date == date && IntervalsOverlap(individualReservation.StartTime, + if (individualReservation.Status == IndividualReservationStatus.Active && individualReservation.Date == date && IntervalsOverlap(individualReservation.StartTime, individualReservation.EndTime, start, end)) { return false; diff --git a/Fitness/Backend/docker-compose.development.yml b/Fitness/Backend/docker-compose.development.yml index e425edb..501c4e4 100644 --- a/Fitness/Backend/docker-compose.development.yml +++ b/Fitness/Backend/docker-compose.development.yml @@ -154,8 +154,8 @@ services: environment: - ASPNETCORE_ENVIRONMENT=Development - "DatabaseSettings:ConnectionString=mongodb://paymentdb:27017" - - PAYPAL_CLIENT_ID="PayPalSettings:ClientId" - - PAYPAL_CLIENT_SECRET="PayPalSettings:ClientSecret" + env_file: + - ./Services/PaymentService/PaymentService.API/.env ports: - "8003:8080" diff --git a/Fitness/Frontend/src/services/ChatService.js b/Fitness/Frontend/src/services/ChatService.js index 126ae23..63c1ed9 100644 --- a/Fitness/Frontend/src/services/ChatService.js +++ b/Fitness/Frontend/src/services/ChatService.js @@ -88,6 +88,16 @@ export async function createChatSession(trainerId, clientId) { } } +export async function getChatSession(trainerId, clientId) { + try { + const response = await axios.get(`${CHAT}/sessions?trainerId=${trainerId}&clientId=${clientId}`); + return response; + } catch (error) { + console.error("Error fetching chat session:", error); + throw error; + } +} + export async function extendChatSession(trainerId, clientId) { try { const response = await axios.post( diff --git a/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue index 28dcfa9..2075184 100644 --- a/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue +++ b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue @@ -208,36 +208,68 @@ export default { }, methods: { + initiatePayment(bookData, price) { + return dataServices.methods + .get_trainer_by_id(bookData.trainerId) + .then((trainerResponse) => { + const request = { + id: "", + userId: bookData.clientId, + amount: price, + currency: "USD", + trainerPayPalEmail: trainerResponse.data.contactEmail, + }; + + return dataServices.methods.create_payment(request); + }) + .then((response) => { + const paymentId = response.data.payment.id; + const approvalUrl = response.data.paymentLink; + + console.log("Payment initiated with ID:", paymentId); + window.location.href = approvalUrl; + }) + .catch((error) => { + console.error("Error initiating payment:", error); + alert("Failed to initiate payment."); + return false; + }); + }, + bookTraining() { - if (!this.selectedTrainer || !this.trainingDate || !this.selectedTrainingType || !this.startTime) { + if ( + !this.selectedTrainer || + !this.trainingDate || + !this.selectedTrainingType || + !this.startTime + ) { alert("Please fill in all fields before booking."); return; } - const payload = { + // TODO: Check if the trainer is free (maybe client has overseen the trainer availabilty) + + const bookData = { id: "", trainerId: this.selectedTrainer.id, clientId: this.$route.params.id, trainingTypeId: this.selectedTrainingType.id, date: this.trainingDate, startTime: this.startTime + ":00", - endTime: this.endTime + endTime: this.endTime, }; - console.log("Booking training with payload:", payload); + const price = this.selectedTrainingType.price; - createIndividualReservation(payload) - .then(response => { - if (response.status === 201) { - alert("Training booked successfully!"); - location.reload(); - } else { - alert(`Booking failed. Status: ${response.status}`); - } + sessionStorage.setItem("bookData", JSON.stringify(bookData)); + + this.initiatePayment(bookData, price) + .then(() => { + console.log("Payment process initiated."); }) - .catch(error => { - console.error("Booking error:", error); - alert("An error occurred while booking the training."); + .catch((error) => { + console.error("Payment initiation error:", error); + alert("Could not start payment process. Please try again."); }); }, @@ -355,12 +387,15 @@ export default { getIndividualReservationsByTrainer(this.selectedTrainer.id) .then(response => { response.data.forEach(element => { - unavailableSlots.push({ - title: "individual", - date: element.date, - start: element.startTime, - end: element.endTime - }); + console.log(element); + if(element.status == 0) { + unavailableSlots.push({ + title: "individual", + date: element.date, + start: element.startTime, + end: element.endTime + }); + } }); getGroupReservationsByTrainer(this.selectedTrainer.id) diff --git a/Fitness/Frontend/src/views/pages/PayChat.vue b/Fitness/Frontend/src/views/pages/PayChat.vue index e71405b..14b42ce 100644 --- a/Fitness/Frontend/src/views/pages/PayChat.vue +++ b/Fitness/Frontend/src/views/pages/PayChat.vue @@ -28,22 +28,21 @@

Secure your 30-day chat mentorship now!

- - + diff --git a/Fitness/Frontend/src/views/pages/PaymentSuccess.vue b/Fitness/Frontend/src/views/pages/PaymentSuccess.vue index 7b85640..223f987 100644 --- a/Fitness/Frontend/src/views/pages/PaymentSuccess.vue +++ b/Fitness/Frontend/src/views/pages/PaymentSuccess.vue @@ -9,58 +9,137 @@ \ No newline at end of file From 2bd99d02f0e795528209b916433543ea722c4116 Mon Sep 17 00:00:00 2001 From: stemil01 Date: Tue, 18 Feb 2025 12:38:31 +0100 Subject: [PATCH 041/118] Add template for trainer analytics page. Relates to #69. --- Fitness/Frontend/src/_nav.js | 6 + .../src/views/pages/ClientAnalytics.vue | 2 +- .../src/views/pages/TrainerAnalytics.vue | 105 ++++++++++++++++++ 3 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 Fitness/Frontend/src/views/pages/TrainerAnalytics.vue diff --git a/Fitness/Frontend/src/_nav.js b/Fitness/Frontend/src/_nav.js index f326ae6..79c1d87 100644 --- a/Fitness/Frontend/src/_nav.js +++ b/Fitness/Frontend/src/_nav.js @@ -25,6 +25,12 @@ export function generateTrainerNav(id) { to: `/trainer/${id}/chat`, icon: 'cil-speech', }, + { + component: 'CNavItem', + name: 'Analytics', + to: `/trainer/${id}/analytics`, + icon: 'cilBarChart' + }, ]; } diff --git a/Fitness/Frontend/src/views/pages/ClientAnalytics.vue b/Fitness/Frontend/src/views/pages/ClientAnalytics.vue index 8a21531..e98cf4b 100644 --- a/Fitness/Frontend/src/views/pages/ClientAnalytics.vue +++ b/Fitness/Frontend/src/views/pages/ClientAnalytics.vue @@ -62,7 +62,7 @@ export default { fetchAnalytics() { const clientId = this.$route.params.id; dataServices.methods.get_client_analytics(clientId).then(response => { - console.log(response); + // console.log(response); this.analytics = response.data; }); } diff --git a/Fitness/Frontend/src/views/pages/TrainerAnalytics.vue b/Fitness/Frontend/src/views/pages/TrainerAnalytics.vue new file mode 100644 index 0000000..d4b03aa --- /dev/null +++ b/Fitness/Frontend/src/views/pages/TrainerAnalytics.vue @@ -0,0 +1,105 @@ + + + + + \ No newline at end of file From fc709a4d6bbd39abc427d6216868dafa0c0b7198 Mon Sep 17 00:00:00 2001 From: stemil01 Date: Tue, 18 Feb 2025 14:43:22 +0100 Subject: [PATCH 042/118] Resolve navigation bug in client analytics page. Relates to #69. --- ...0250112084645_InitialMigration.Designer.cs | 342 ------------------ .../20250112084645_InitialMigration.cs | 265 -------------- .../src/views/pages/ClientAnalytics.vue | 2 + 3 files changed, 2 insertions(+), 607 deletions(-) delete mode 100644 Fitness/Backend/Security/IdentityServer/Migrations/20250112084645_InitialMigration.Designer.cs delete mode 100644 Fitness/Backend/Security/IdentityServer/Migrations/20250112084645_InitialMigration.cs diff --git a/Fitness/Backend/Security/IdentityServer/Migrations/20250112084645_InitialMigration.Designer.cs b/Fitness/Backend/Security/IdentityServer/Migrations/20250112084645_InitialMigration.Designer.cs deleted file mode 100644 index ce17e79..0000000 --- a/Fitness/Backend/Security/IdentityServer/Migrations/20250112084645_InitialMigration.Designer.cs +++ /dev/null @@ -1,342 +0,0 @@ -// -using System; -using IdentityServer.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace IdentityServer.Migrations -{ - [DbContext(typeof(ApplicationContext))] - [Migration("20250112084645_InitialMigration")] - partial class InitialMigration - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.7") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("IdentityServer.Entities.RefreshToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ExpiryTime") - .HasColumnType("datetime2"); - - b.Property("Token") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("RefreshTokens"); - }); - - modelBuilder.Entity("IdentityServer.Entities.User", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("AccessFailedCount") - .HasColumnType("int"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("bit"); - - b.Property("FirstName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("LastName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("LockoutEnabled") - .HasColumnType("bit"); - - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("PasswordHash") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumber") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("bit"); - - b.Property("SecurityStamp") - .HasColumnType("nvarchar(max)"); - - b.Property("TwoFactorEnabled") - .HasColumnType("bit"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex") - .HasFilter("[NormalizedUserName] IS NOT NULL"); - - b.ToTable("AspNetUsers", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex") - .HasFilter("[NormalizedName] IS NOT NULL"); - - b.ToTable("AspNetRoles", (string)null); - - b.HasData( - new - { - Id = "c9724c59-0894-4f23-8f5b-64032f4864b2", - Name = "Admin", - NormalizedName = "ADMIN" - }, - new - { - Id = "5a1b8cb7-37bc-431b-b9e5-33f0b2e82c87", - Name = "Trainer", - NormalizedName = "TRAINER" - }, - new - { - Id = "780ae70f-59cb-4c58-82bd-74015b491110", - Name = "Client", - NormalizedName = "CLIENT" - }); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("nvarchar(max)"); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(max)"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("nvarchar(max)"); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(max)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("nvarchar(450)"); - - b.Property("ProviderKey") - .HasColumnType("nvarchar(450)"); - - b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(max)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.Property("RoleId") - .HasColumnType("nvarchar(450)"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.Property("LoginProvider") - .HasColumnType("nvarchar(450)"); - - b.Property("Name") - .HasColumnType("nvarchar(450)"); - - b.Property("Value") - .HasColumnType("nvarchar(max)"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens", (string)null); - }); - - modelBuilder.Entity("IdentityServer.Entities.RefreshToken", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany("RefreshTokens") - .HasForeignKey("UserId"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("IdentityServer.Entities.User", b => - { - b.Navigation("RefreshTokens"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Fitness/Backend/Security/IdentityServer/Migrations/20250112084645_InitialMigration.cs b/Fitness/Backend/Security/IdentityServer/Migrations/20250112084645_InitialMigration.cs deleted file mode 100644 index c0f4021..0000000 --- a/Fitness/Backend/Security/IdentityServer/Migrations/20250112084645_InitialMigration.cs +++ /dev/null @@ -1,265 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional - -namespace IdentityServer.Migrations -{ - /// - public partial class InitialMigration : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "AspNetRoles", - columns: table => new - { - Id = table.Column(type: "nvarchar(450)", nullable: false), - Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetUsers", - columns: table => new - { - Id = table.Column(type: "nvarchar(450)", nullable: false), - FirstName = table.Column(type: "nvarchar(max)", nullable: false), - LastName = table.Column(type: "nvarchar(max)", nullable: false), - UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - EmailConfirmed = table.Column(type: "bit", nullable: false), - PasswordHash = table.Column(type: "nvarchar(max)", nullable: true), - SecurityStamp = table.Column(type: "nvarchar(max)", nullable: true), - ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true), - PhoneNumber = table.Column(type: "nvarchar(max)", nullable: true), - PhoneNumberConfirmed = table.Column(type: "bit", nullable: false), - TwoFactorEnabled = table.Column(type: "bit", nullable: false), - LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), - LockoutEnabled = table.Column(type: "bit", nullable: false), - AccessFailedCount = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetRoleClaims", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - RoleId = table.Column(type: "nvarchar(450)", nullable: false), - ClaimType = table.Column(type: "nvarchar(max)", nullable: true), - ClaimValue = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserClaims", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - UserId = table.Column(type: "nvarchar(450)", nullable: false), - ClaimType = table.Column(type: "nvarchar(max)", nullable: true), - ClaimValue = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetUserClaims_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserLogins", - columns: table => new - { - LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), - ProviderKey = table.Column(type: "nvarchar(450)", nullable: false), - ProviderDisplayName = table.Column(type: "nvarchar(max)", nullable: true), - UserId = table.Column(type: "nvarchar(450)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); - table.ForeignKey( - name: "FK_AspNetUserLogins_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserRoles", - columns: table => new - { - UserId = table.Column(type: "nvarchar(450)", nullable: false), - RoleId = table.Column(type: "nvarchar(450)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserTokens", - columns: table => new - { - UserId = table.Column(type: "nvarchar(450)", nullable: false), - LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), - Name = table.Column(type: "nvarchar(450)", nullable: false), - Value = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AspNetUserTokens_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "RefreshTokens", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Token = table.Column(type: "nvarchar(max)", nullable: false), - ExpiryTime = table.Column(type: "datetime2", nullable: false), - UserId = table.Column(type: "nvarchar(450)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_RefreshTokens", x => x.Id); - table.ForeignKey( - name: "FK_RefreshTokens_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id"); - }); - - migrationBuilder.InsertData( - table: "AspNetRoles", - columns: new[] { "Id", "ConcurrencyStamp", "Name", "NormalizedName" }, - values: new object[,] - { - { "5a1b8cb7-37bc-431b-b9e5-33f0b2e82c87", null, "Trainer", "TRAINER" }, - { "780ae70f-59cb-4c58-82bd-74015b491110", null, "Client", "CLIENT" }, - { "c9724c59-0894-4f23-8f5b-64032f4864b2", null, "Admin", "ADMIN" } - }); - - migrationBuilder.CreateIndex( - name: "IX_AspNetRoleClaims_RoleId", - table: "AspNetRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "RoleNameIndex", - table: "AspNetRoles", - column: "NormalizedName", - unique: true, - filter: "[NormalizedName] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserClaims_UserId", - table: "AspNetUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserLogins_UserId", - table: "AspNetUserLogins", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserRoles_RoleId", - table: "AspNetUserRoles", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "EmailIndex", - table: "AspNetUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "UserNameIndex", - table: "AspNetUsers", - column: "NormalizedUserName", - unique: true, - filter: "[NormalizedUserName] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_RefreshTokens_UserId", - table: "RefreshTokens", - column: "UserId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AspNetRoleClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserLogins"); - - migrationBuilder.DropTable( - name: "AspNetUserRoles"); - - migrationBuilder.DropTable( - name: "AspNetUserTokens"); - - migrationBuilder.DropTable( - name: "RefreshTokens"); - - migrationBuilder.DropTable( - name: "AspNetRoles"); - - migrationBuilder.DropTable( - name: "AspNetUsers"); - } - } -} diff --git a/Fitness/Frontend/src/views/pages/ClientAnalytics.vue b/Fitness/Frontend/src/views/pages/ClientAnalytics.vue index e98cf4b..bf1a280 100644 --- a/Fitness/Frontend/src/views/pages/ClientAnalytics.vue +++ b/Fitness/Frontend/src/views/pages/ClientAnalytics.vue @@ -60,6 +60,7 @@ export default { return trainingTypes.map(type => type.name).join(', '); }, fetchAnalytics() { + console.log(this.$route); const clientId = this.$route.params.id; dataServices.methods.get_client_analytics(clientId).then(response => { // console.log(response); @@ -69,6 +70,7 @@ export default { }, mounted() { this.fetchAnalytics(); + this.$parent.$parent.$parent.setUserData(this.$route.params.id, "client"); } } From 4665ff718291346f1fabd455bd3b7227c9775248 Mon Sep 17 00:00:00 2001 From: stemil01 Date: Tue, 18 Feb 2025 14:56:30 +0100 Subject: [PATCH 043/118] Nothing. Relates to #69. --- .../Frontend/src/services/data_services.js | 38 ++++++++++--------- .../src/views/pages/ClientAnalytics.vue | 1 - 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/Fitness/Frontend/src/services/data_services.js b/Fitness/Frontend/src/services/data_services.js index 02b7a34..d32e2d6 100644 --- a/Fitness/Frontend/src/services/data_services.js +++ b/Fitness/Frontend/src/services/data_services.js @@ -210,25 +210,27 @@ export default { return axios.delete(`${REVIEW}/${rev_id}`); }, get_client_analytics(cli_id) { - return Promise.resolve({ - data: { - attendedTrainings: 10, - cancelledTrainings: 2, - averageRating: 7.4, - trainersWorkedWith: [ - { - fullName: "Vukasin Markovic", - contactEmail: "vmark@fitness.com", - contactPhone: "+38160123456", - trainingTypes: [ - { name: "yoga" }, - { name: "pilates "} - ], - averageRating: 10.0 - } - ] - } + let harcodedObject = Promise.resolve({ + data: { + attendedTrainings: 10, + cancelledTrainings: 2, + averageRating: 7.4, + trainersWorkedWith: [ + { + fullName: "Vukasin Markovic", + contactEmail: "vmark@fitness.com", + contactPhone: "+38160123456", + trainingTypes: [ + { name: "yoga" }, + { name: "pilates "} + ], + averageRating: 10.0 + } + ] + } }); + + return harcodedObject; } } } diff --git a/Fitness/Frontend/src/views/pages/ClientAnalytics.vue b/Fitness/Frontend/src/views/pages/ClientAnalytics.vue index bf1a280..b8748e7 100644 --- a/Fitness/Frontend/src/views/pages/ClientAnalytics.vue +++ b/Fitness/Frontend/src/views/pages/ClientAnalytics.vue @@ -60,7 +60,6 @@ export default { return trainingTypes.map(type => type.name).join(', '); }, fetchAnalytics() { - console.log(this.$route); const clientId = this.$route.params.id; dataServices.methods.get_client_analytics(clientId).then(response => { // console.log(response); From 1a3b7ae9294660f7c88b6d0560ddb729842caa8d Mon Sep 17 00:00:00 2001 From: stemil01 Date: Tue, 18 Feb 2025 19:25:56 +0100 Subject: [PATCH 044/118] Create new file for Analytics data. Relates to #69. --- .../Frontend/src/services/AnalyticsService.js | 25 +++++++++++++++++++ .../Frontend/src/services/data_services.js | 23 ----------------- 2 files changed, 25 insertions(+), 23 deletions(-) create mode 100644 Fitness/Frontend/src/services/AnalyticsService.js diff --git a/Fitness/Frontend/src/services/AnalyticsService.js b/Fitness/Frontend/src/services/AnalyticsService.js new file mode 100644 index 0000000..6501899 --- /dev/null +++ b/Fitness/Frontend/src/services/AnalyticsService.js @@ -0,0 +1,25 @@ +import axios from "axios"; + +export async function get_client_analytics(cli_id) { + let harcodedObject = Promise.resolve({ + data: { + attendedTrainings: 10, + cancelledTrainings: 2, + averageRating: 7.4, + trainersWorkedWith: [ + { + fullName: "Vukasin Markovic", + contactEmail: "vmark@fitness.com", + contactPhone: "+38160123456", + trainingTypes: [ + { name: "yoga" }, + { name: "pilates "} + ], + averageRating: 10.0 + } + ] + } + }); + + return harcodedObject; +} diff --git a/Fitness/Frontend/src/services/data_services.js b/Fitness/Frontend/src/services/data_services.js index d32e2d6..67a7d1a 100644 --- a/Fitness/Frontend/src/services/data_services.js +++ b/Fitness/Frontend/src/services/data_services.js @@ -209,28 +209,5 @@ export default { axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; return axios.delete(`${REVIEW}/${rev_id}`); }, - get_client_analytics(cli_id) { - let harcodedObject = Promise.resolve({ - data: { - attendedTrainings: 10, - cancelledTrainings: 2, - averageRating: 7.4, - trainersWorkedWith: [ - { - fullName: "Vukasin Markovic", - contactEmail: "vmark@fitness.com", - contactPhone: "+38160123456", - trainingTypes: [ - { name: "yoga" }, - { name: "pilates "} - ], - averageRating: 10.0 - } - ] - } - }); - - return harcodedObject; - } } } From 253632cadeb52f802cac34713bc0ffa229c713a7 Mon Sep 17 00:00:00 2001 From: stemil01 Date: Tue, 18 Feb 2025 21:11:09 +0100 Subject: [PATCH 045/118] Add CORS in analytics service and first non-hardcoded data. Relates to #69. --- .../AnalyticsService.API/Program.cs | 9 ++++ .../Frontend/src/services/AnalyticsService.js | 48 +++++++++++-------- .../src/views/pages/ClientAnalytics.vue | 7 +-- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Program.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Program.cs index dc776af..0175442 100644 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Program.cs +++ b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Program.cs @@ -21,6 +21,13 @@ options => options.Address = new Uri(builder.Configuration["GrpcSettings:ReviewUrl"])); builder.Services.AddScoped(); +// cors +builder.Services.AddCors(options => +{ + options.AddPolicy("CorsPolicy", builder => + builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()); +}); + //AutoMapper builder.Services.AddAutoMapper(Assembly.GetExecutingAssembly()); @@ -47,6 +54,8 @@ app.UseSwaggerUI(); } +app.UseCors("CorsPolicy"); + app.UseHttpsRedirection(); app.MapControllers(); app.Run(); diff --git a/Fitness/Frontend/src/services/AnalyticsService.js b/Fitness/Frontend/src/services/AnalyticsService.js index 6501899..57fb0d7 100644 --- a/Fitness/Frontend/src/services/AnalyticsService.js +++ b/Fitness/Frontend/src/services/AnalyticsService.js @@ -1,25 +1,33 @@ import axios from "axios"; -export async function get_client_analytics(cli_id) { - let harcodedObject = Promise.resolve({ - data: { - attendedTrainings: 10, - cancelledTrainings: 2, - averageRating: 7.4, - trainersWorkedWith: [ - { - fullName: "Vukasin Markovic", - contactEmail: "vmark@fitness.com", - contactPhone: "+38160123456", - trainingTypes: [ - { name: "yoga" }, - { name: "pilates "} - ], - averageRating: 10.0 +const ANALYTICS_URL = "http://localhost:8005/api/v1/Analytics"; + +const analyticsService = { + async getClientAnalytics(clientId) { + let harcodedObject = Promise.resolve({ + data: { + attendedTrainings: 10, + cancelledTrainings: 2, + averageRating: 7.4, + trainersWorkedWith: [ + { + fullName: "Vukasin Markovic", + contactEmail: "vmark@fitness.com", + contactPhone: "+38160123456", + trainingTypes: [ + { name: "yoga" }, + { name: "pilates "} + ], + averageRating: 10.0 + } + ] } - ] - } - }); + }); - return harcodedObject; + axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; + let response = await axios.get(`${ANALYTICS_URL}/GetClientNumOfTrainingForClient?clientId=${clientId}`); + return response; + } } + +export default analyticsService; diff --git a/Fitness/Frontend/src/views/pages/ClientAnalytics.vue b/Fitness/Frontend/src/views/pages/ClientAnalytics.vue index b8748e7..473e2ab 100644 --- a/Fitness/Frontend/src/views/pages/ClientAnalytics.vue +++ b/Fitness/Frontend/src/views/pages/ClientAnalytics.vue @@ -41,7 +41,8 @@ diff --git a/Fitness/Frontend/src/services/ReservationService.js b/Fitness/Frontend/src/services/ReservationService.js index 7c03c54..0c27ba1 100644 --- a/Fitness/Frontend/src/services/ReservationService.js +++ b/Fitness/Frontend/src/services/ReservationService.js @@ -42,20 +42,6 @@ export async function createIndividualReservation(reservation) { return response; } -// Client/Trainer - update individual reservation -export async function updateIndividualReservation(reservation) { - const response = await axios.put(`${RESERVATIONS}/individual`, reservation, { - headers: { "Content-Type": "application/json" }, - }); - return response; -} - -// Client/Trainer - delete individual reservation -export async function deleteIndividualReservation(id) { - const response = await axios.delete(`${RESERVATIONS}/individual/${id}`); - return response; -} - // ---------------------- GROUP RESERVATIONS ---------------------- // Admin - get all group @@ -90,14 +76,6 @@ export async function createGroupReservation(reservation) { return response; } -// Trainer - update group reservation -export async function updateGroupReservation(reservation) { - const response = await axios.put(`${RESERVATIONS}/group`, reservation, { - headers: { "Content-Type": "application/json" }, - }); - return response; -} - // Trainer - delete group reservation export async function deleteGroupReservation(id) { const response = await axios.delete(`${RESERVATIONS}/group/${id}`); diff --git a/Fitness/Frontend/src/services/data_services.js b/Fitness/Frontend/src/services/data_services.js index 67a7d1a..660cfe2 100644 --- a/Fitness/Frontend/src/services/data_services.js +++ b/Fitness/Frontend/src/services/data_services.js @@ -190,24 +190,24 @@ export default { // ==================== // Reviews // ==================== - add_review(request) { + get_reviews_client(cli_id) { axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; - return axios.post(`${REVIEW}`, request); + return axios.get(`${REVIEW}/client/${cli_id}`); }, - get_reviews(tra_id) { + get_reviews_trainer(tra_id) { axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; - return axios.get(`${REVIEW}/${tra_id}`); + return axios.get(`${REVIEW}/trainer/${tra_id}`); }, - update_review(request) { + submit_review_client(request) { axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; - return axios.put(`${REVIEW}`, request); + return axios.post(`${REVIEW}/client/${request.clientId}`, request); }, - delete_review(rev_id) { + submit_review_trainer(request) { axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; - return axios.delete(`${REVIEW}/${rev_id}`); + return axios.post(`${REVIEW}/trainer/${request.trainerId}`, request); }, } } diff --git a/Fitness/Frontend/src/views/pages/Client.vue b/Fitness/Frontend/src/views/pages/Client.vue index 95a3bdd..b53f854 100644 --- a/Fitness/Frontend/src/views/pages/Client.vue +++ b/Fitness/Frontend/src/views/pages/Client.vue @@ -46,12 +46,6 @@
- - View reviews - - - Book training - Pay chat @@ -60,19 +54,14 @@ - -
+ - \ No newline at end of file + diff --git a/Fitness/Frontend/src/views/pages/TrainerAnalytics.vue b/Fitness/Frontend/src/views/pages/TrainerAnalytics.vue index d4b03aa..f747a15 100644 --- a/Fitness/Frontend/src/views/pages/TrainerAnalytics.vue +++ b/Fitness/Frontend/src/views/pages/TrainerAnalytics.vue @@ -1,58 +1,192 @@ - \ No newline at end of file + From c96d86b21115b6726cb2a5c11e17cd0d738fb1fc Mon Sep 17 00:00:00 2001 From: stemil01 Date: Sun, 12 Oct 2025 11:24:01 +0200 Subject: [PATCH 055/118] Create consumer part for reservations on analytics service and refactor the backend accordingly. Relates to #114. --- .../Controllers/AnalyticsController.cs | 97 ++++-------- .../GroupReservationConsumer.cs | 68 ++++++++- .../IndividualReservationConsumer.cs | 50 +++++- .../Mapper/ClientTrainingProfile.cs | 13 -- .../Mapper/ReviewResponseProfile.cs | 14 -- .../Mapper/TrainingHeldProfile.cs | 13 -- .../DTOs/ClientTrainingDTO.cs | 15 -- .../Data/AnalyticsContext.cs | 35 +---- .../Data/IAnalyticsContext.cs | 3 +- .../Entities/GroupTraining.cs | 27 ++++ .../Entities/IndividualTraining.cs | 28 ++++ .../Entities/{ReviewType.cs => Review.cs} | 10 +- .../Entities/Training.cs | 26 ---- .../Entities/TrainingStatus.cs | 7 - .../Extensions/AnalyticsCommonExtensions.cs | 1 - .../Repositories/AnalyticsRepository.cs | 143 +++++++++++++----- .../Repositories/IAnalyticsRepository.cs | 25 +-- .../Backend/docker-compose.development.yml | 8 + Fitness/Backend/docker-compose.yml | 6 +- .../src/views/pages/ClientAnalytics.vue | 5 - .../src/views/pages/TrainerAnalytics.vue | 5 - 21 files changed, 331 insertions(+), 268 deletions(-) delete mode 100644 Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Mapper/ClientTrainingProfile.cs delete mode 100644 Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Mapper/ReviewResponseProfile.cs delete mode 100644 Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Mapper/TrainingHeldProfile.cs delete mode 100644 Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/DTOs/ClientTrainingDTO.cs create mode 100644 Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/GroupTraining.cs create mode 100644 Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/IndividualTraining.cs rename Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/{ReviewType.cs => Review.cs} (72%) delete mode 100644 Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/Training.cs delete mode 100644 Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/TrainingStatus.cs diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Controllers/AnalyticsController.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Controllers/AnalyticsController.cs index 6e3204d..3f4378a 100644 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Controllers/AnalyticsController.cs +++ b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Controllers/AnalyticsController.cs @@ -1,6 +1,4 @@ -using System.Collections; using AnalyticsService.API.GrpcServices; -using AnalyticsService.Common.DTOs; using AnalyticsService.Common.Entities; using AnalyticsService.Common.Repositories; using AutoMapper; @@ -8,6 +6,7 @@ namespace AnalyticsService.API.Controllers; +// [Authorize] [ApiController] [Route("api/v1/[controller]")] public class AnalyticsController : ControllerBase @@ -23,83 +22,41 @@ public AnalyticsController(IAnalyticsRepository repository, ReviewGrpcService re _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); } - [HttpPost] - [ProducesResponseType(StatusCodes.Status201Created)] - public async Task CreateTraining([FromQuery] Training training) + // Individual Trainings + // [Authorize(Roles = "Admin, Trainer")] + [HttpGet("individual/trainer/{trainerId}")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetIndividualTrainingsByTrainerId(string trainerId) { - await _repository.CreateTraining(training); - return Created(); + var reservations = await _repository.GetIndividualTrainingsByTrainerId(trainerId); + return Ok(reservations); } - [HttpDelete] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task DeleteTraining([FromQuery] string id) + // [Authorize(Roles = "Admin, Client")] + [HttpGet("individual/client/{clientId}")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetIndividualTrainingsByClientId(string clientId) { - return Ok(await _repository.DeleteTraining(id)); - } - - [HttpGet("[action]")] - [ProducesResponseType(typeof(double), StatusCodes.Status200OK)] - [ProducesResponseType(typeof(double), StatusCodes.Status404NotFound)] - public async Task> GetTrainerAverageTrainingRating([FromQuery] string trainerId) - { - var rating = await _repository.GetTrainerAverageTrainingRating(trainerId); - return rating != 0.0 ? Ok(rating) : NotFound(); - } - - [HttpGet("[action]")] - [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] - public async Task> GetTrainerNumOfTrainings([FromQuery] string trainerId) - { - var numOfTrainings = await _repository.GetTrainerNumOfTrainings(trainerId); - return Ok(numOfTrainings); - } - - [HttpGet("[action]")] - [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] - public async Task> GetClientNumOfTrainingForClient([FromQuery] string clientId) - { - var numOfTrainings = await _repository.GetClientNumOfTrainings(clientId); - return Ok(numOfTrainings); + var reservations = await _repository.GetIndividualTrainingsByClientId(clientId); + return Ok(reservations); } - [HttpGet("[action]")] - [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] - public async Task> GetClientNumOfHeldTrainings([FromQuery] string clientId) - { - var numOfHeldTrainings = await _repository.GetClientNumOfHeldTrainings(clientId); - return Ok(numOfHeldTrainings); - } - - [HttpGet("[action]")] - [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] - public async Task> GetClientNumOfCancelledTrainings([FromQuery] string clientId) - { - var numOfCancelledTrainings = await _repository.GetClientNumOfCancelledTrainings(clientId); - return Ok(numOfCancelledTrainings); - } - - [HttpGet("[action]")] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - public async Task>> GetTrainerClientIds([FromQuery] string trainerId) - { - var clientIds = await _repository.GetTrainerClientIds(trainerId); - return Ok(clientIds); - } - - [HttpGet("TrainerReviews")] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - public async Task>> GetTrainerReviews([FromQuery] string trainerId) + // Group Trainings + // [Authorize(Roles = "Admin, Trainer")] + [HttpGet("group/trainer/{trainerId}")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetGroupTrainingsByTrainerId(string trainerId) { - var response = await _reviewGrpcService.GetReviews(trainerId); - var reviews = _mapper.Map>(response.Reviews); - return Ok(reviews); + var reservations = await _repository.GetGroupTrainingsByTrainerId(trainerId); + return Ok(reservations); } - [HttpGet("ClientTrainings")] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - public async Task>> GetClientTrainings(string clientId) + // [Authorize(Roles = "Admin, Client")] + [HttpGet("group/client/{clientId}")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetGroupTrainingsByClientId(string clientId) { - return Ok(await _repository.GetClientTrainings(clientId)); + var reservations = await _repository.GetGroupTrainingsByClientId(clientId); + return Ok(reservations); } } \ No newline at end of file diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/EventBusConsumers/GroupReservationConsumer.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/EventBusConsumers/GroupReservationConsumer.cs index c702080..62bbb4d 100644 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/EventBusConsumers/GroupReservationConsumer.cs +++ b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/EventBusConsumers/GroupReservationConsumer.cs @@ -1,16 +1,74 @@ using System.Text.Json; +using AnalyticsService.Common.Entities; +using AnalyticsService.Common.Repositories; using EventBus.Messages.Events; using MassTransit; +using GroupReservationEventType = EventBus.Messages.Events.GroupReservationEventType; namespace AnalyticsService.API.EventBusConsumers; public class GroupReservationConsumer : IConsumer { - public Task Consume(ConsumeContext context) + private readonly IAnalyticsRepository _repository; + + public GroupReservationConsumer(IAnalyticsRepository repository) + { + _repository = repository ?? throw new ArgumentNullException(nameof(repository)); + } + + public async Task Consume(ConsumeContext context) { - var groupReservation = context.Message; - Console.WriteLine(JsonSerializer.Serialize(groupReservation)); - // TODO(Handle reservation) - return Task.CompletedTask; + GroupReservationEvent groupReservation = context.Message; + switch (groupReservation.EventType) + { + case GroupReservationEventType.Added: + { + GroupTraining groupTraining = new GroupTraining + { + ReservationId = groupReservation.ReservationId, + TrainerId = groupReservation.TrainerId, + ClientIds = [], + Capacity = groupReservation.Capacity, + StartTime = groupReservation.StartTime, + EndTime = groupReservation.EndTime, + Date = groupReservation.Date, + TrainerReview = null, + ClientReviews = null, + Status = GroupTrainingStatus.Active + }; + await _repository.CreateGroupTraining(groupTraining); + break; + } + case GroupReservationEventType.Removed: + { + GroupTraining groupTraining = + await _repository.GetGroupTrainingByReservationId(groupReservation.ReservationId); + groupTraining.Status = GroupTrainingStatus.Removed; + await _repository.UpdateGroupTraining(groupTraining); + break; + } + case GroupReservationEventType.ClientBooked: + { + GroupTraining groupTraining = + await _repository.GetGroupTrainingByReservationId(groupReservation.ReservationId); + if (groupReservation.ClientId != null) + { + groupTraining.ClientIds.Add(groupReservation.ClientId); + await _repository.UpdateGroupTraining(groupTraining); + } + break; + } + case GroupReservationEventType.ClientCancelled: + { + GroupTraining groupTraining = + await _repository.GetGroupTrainingByReservationId(groupReservation.ReservationId); + if (groupReservation.ClientId != null) + { + groupTraining.ClientIds.Remove(groupReservation.ClientId); + await _repository.UpdateGroupTraining(groupTraining); + } + break; + } + } } } \ No newline at end of file diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/EventBusConsumers/IndividualReservationConsumer.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/EventBusConsumers/IndividualReservationConsumer.cs index 30b2a5b..f4383f3 100644 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/EventBusConsumers/IndividualReservationConsumer.cs +++ b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/EventBusConsumers/IndividualReservationConsumer.cs @@ -9,11 +9,51 @@ namespace AnalyticsService.API.EventBusConsumers; public class IndividualReservationConsumer : IConsumer { - public Task Consume(ConsumeContext context) + private readonly IAnalyticsRepository _repository; + + public IndividualReservationConsumer(IAnalyticsRepository repository) + { + _repository = repository ?? throw new ArgumentNullException(nameof(repository)); + } + public async Task Consume(ConsumeContext context) { - var individualReservation = context.Message; - Console.WriteLine(JsonSerializer.Serialize(individualReservation)); - // TODO(Handle reservation) - return Task.CompletedTask; + IndividualReservationEvent individualReservation = context.Message; + switch (individualReservation.EventType) + { + case IndividualReservationEventType.Booked: + { + IndividualTraining individualTraining = new IndividualTraining + { + ReservationId = individualReservation.ReservationId, + TrainerId = individualReservation.TrainerId, + ClientId = individualReservation.ClientId, + TrainingTypeId = individualReservation.TrainingTypeId, + StartTime = individualReservation.StartTime, + EndTime = individualReservation.EndTime, + Date = individualReservation.Date, + TrainerReview = null, + ClientReview = null, + Status = IndividualTrainingStatus.Active + }; + await _repository.CreateIndividualTraining(individualTraining); + break; + } + case IndividualReservationEventType.CancelledByClient: + { + IndividualTraining individualTraining = + await _repository.GetIndividualTrainingByReservationId(individualReservation.ReservationId); + individualTraining.Status = IndividualTrainingStatus.ClientCancelled; + await _repository.UpdateIndividualTraining(individualTraining); + break; + } + case IndividualReservationEventType.CancelledByTrainer: + { + IndividualTraining individualTraining = + await _repository.GetIndividualTrainingByReservationId(individualReservation.ReservationId); + individualTraining.Status = IndividualTrainingStatus.TrainerCancelled; + await _repository.UpdateIndividualTraining(individualTraining); + break; + } + } } } \ No newline at end of file diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Mapper/ClientTrainingProfile.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Mapper/ClientTrainingProfile.cs deleted file mode 100644 index 2d9fded..0000000 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Mapper/ClientTrainingProfile.cs +++ /dev/null @@ -1,13 +0,0 @@ -using AnalyticsService.Common.DTOs; -using AnalyticsService.Common.Entities; -using AutoMapper; - -namespace AnalyticsService.API.Mapper; - -public class ClientTrainingProfile : Profile -{ - public ClientTrainingProfile() - { - CreateMap().ReverseMap(); - } -} \ No newline at end of file diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Mapper/ReviewResponseProfile.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Mapper/ReviewResponseProfile.cs deleted file mode 100644 index 1182ba1..0000000 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Mapper/ReviewResponseProfile.cs +++ /dev/null @@ -1,14 +0,0 @@ -using AnalyticsService.Common.Entities; -using AutoMapper; -using ReviewService.GRPC.Protos; - -namespace AnalyticsService.API.Mapper; - -public class ReviewResponseProfile : Profile -{ - public ReviewResponseProfile() - { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - } -} diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Mapper/TrainingHeldProfile.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Mapper/TrainingHeldProfile.cs deleted file mode 100644 index b45b44c..0000000 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/Mapper/TrainingHeldProfile.cs +++ /dev/null @@ -1,13 +0,0 @@ -using AnalyticsService.Common.Entities; -using AutoMapper; -using EventBus.Messages.Events; - -namespace AnalyticsService.API.Mapper; - -public class TrainingHeldProfile : Profile -{ - public TrainingHeldProfile() - { - CreateMap().ReverseMap(); - } -} \ No newline at end of file diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/DTOs/ClientTrainingDTO.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/DTOs/ClientTrainingDTO.cs deleted file mode 100644 index a43bcbb..0000000 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/DTOs/ClientTrainingDTO.cs +++ /dev/null @@ -1,15 +0,0 @@ -using AnalyticsService.Common.Entities; -using MongoDB.Bson; -using MongoDB.Bson.Serialization.Attributes; - -namespace AnalyticsService.Common.DTOs; - -public class ClientTrainingDTO -{ - [BsonRepresentation(BsonType.ObjectId)] - public string TrainerId { get; set; } - public DateTime TrainingDate { get; set; } - public TrainingStatus Status { get; set; } - public int TrainerRating { get; set; } - public int ClientRating { get; set; } -} \ No newline at end of file diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Data/AnalyticsContext.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Data/AnalyticsContext.cs index f68f795..ed08697 100644 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Data/AnalyticsContext.cs +++ b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Data/AnalyticsContext.cs @@ -10,37 +10,10 @@ public AnalyticsContext(IConfiguration configuration) { var mongoClient = new MongoClient(configuration.GetValue("DatabaseSettings:ConnectionString")); var database = mongoClient.GetDatabase("AnalyticsDB"); - Trainings = database.GetCollection("Trainings"); - // SeedData(Trainings); + IndividualTrainings = database.GetCollection("IndividualTrainings"); + GroupTrainings = database.GetCollection("GroupTrainings"); } - public IMongoCollection Trainings { get; set; } - - private static void SeedData(IMongoCollection trainings) - { - if (!trainings.Find(t => true).Any()) - { - trainings.InsertOneAsync( - new Training() - { - ClientId = "1234567890abcdef12345678", - TrainerId = "1234567890abcdef12345678", - TrainingDate = new DateTime(2020, 01, 01), - TrainerRating = 5, - Status = TrainingStatus.HELD - } - ); - trainings.InsertOneAsync( - new Training() - { - ClientId = "5F6D3326597F61D77AD99969", - TrainerId = "1234567890abcdef12345678", - TrainingDate = new DateTime(2021, 01, 01), - ClientRating = 7, - Status = TrainingStatus.CANCELLED, - ClientComment = "Unpleasant experience" - } - ); - } - } + public IMongoCollection IndividualTrainings { get; set; } + public IMongoCollection GroupTrainings { get; set; } } \ No newline at end of file diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Data/IAnalyticsContext.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Data/IAnalyticsContext.cs index 0622730..256035a 100644 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Data/IAnalyticsContext.cs +++ b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Data/IAnalyticsContext.cs @@ -5,5 +5,6 @@ namespace AnalyticsService.Common.Data; public interface IAnalyticsContext { - IMongoCollection Trainings { get; set; } + IMongoCollection IndividualTrainings { get; set; } + IMongoCollection GroupTrainings { get; set; } } \ No newline at end of file diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/GroupTraining.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/GroupTraining.cs new file mode 100644 index 0000000..fb490d0 --- /dev/null +++ b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/GroupTraining.cs @@ -0,0 +1,27 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace AnalyticsService.Common.Entities; + +public class GroupTraining +{ + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string Id { get; set; } + public string ReservationId { get; set; } + public string? TrainerId { get; set; } + public List ClientIds { get; set; } + public int? Capacity { get; set; } + public TimeOnly? StartTime { get; set; } + public TimeOnly? EndTime { get; set; } + public DateOnly? Date { get; set; } + public Review? TrainerReview { get; set; } + public List? ClientReviews { get; set; } + public GroupTrainingStatus Status { get; set; } = GroupTrainingStatus.Active; +} + +public enum GroupTrainingStatus +{ + Active, + Removed +} diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/IndividualTraining.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/IndividualTraining.cs new file mode 100644 index 0000000..865fb05 --- /dev/null +++ b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/IndividualTraining.cs @@ -0,0 +1,28 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace AnalyticsService.Common.Entities; + +public class IndividualTraining +{ + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string Id { get; set; } + public string? ReservationId { get; set; } + public string? TrainerId { get; set; } + public string? ClientId { get; set; } + public string? TrainingTypeId { get; set; } + public TimeOnly? StartTime { get; set; } + public TimeOnly? EndTime { get; set; } + public DateOnly? Date { get; set; } + public Review? TrainerReview { get; set; } + public Review? ClientReview { get; set; } + public IndividualTrainingStatus Status { get; set; } = IndividualTrainingStatus.Active; +} + +public enum IndividualTrainingStatus +{ + Active, + TrainerCancelled, + ClientCancelled +} diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/ReviewType.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/Review.cs similarity index 72% rename from Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/ReviewType.cs rename to Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/Review.cs index 7033492..e3b1ca3 100644 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/ReviewType.cs +++ b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/Review.cs @@ -3,13 +3,13 @@ namespace AnalyticsService.Common.Entities; -public class ReviewType +public class Review { [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } - public string TrainerId { get; set; } - public string ClientId { get; set; } - public string Comment { get; set; } + public string ReservationId { get; set; } + public string UserId { get; set; } public int Rating { get; set; } -} + public string Comment { get; set; } +} \ No newline at end of file diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/Training.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/Training.cs deleted file mode 100644 index d7bc9e2..0000000 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/Training.cs +++ /dev/null @@ -1,26 +0,0 @@ -using MongoDB.Bson; -using MongoDB.Bson.Serialization.Attributes; -using MongoDB.Bson.Serialization.IdGenerators; - -namespace AnalyticsService.Common.Entities; - -public class Training -{ - [BsonRepresentation(BsonType.ObjectId)] - public string Id { get; set; } - - [BsonRepresentation(BsonType.ObjectId)] - public string TrainerId { get; set; } - - [BsonRepresentation(BsonType.ObjectId)] - public string ClientId { get; set; } - public DateTime TrainingDate { get; set; } - - public TrainingStatus Status { get; set; } - - public int TrainerRating { get; set; } - public string TrainerComment { get; set; } - - public int ClientRating { get; set; } - public string ClientComment { get; set; } -} \ No newline at end of file diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/TrainingStatus.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/TrainingStatus.cs deleted file mode 100644 index fb72986..0000000 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/TrainingStatus.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace AnalyticsService.Common.Entities; - -public enum TrainingStatus -{ - HELD, - CANCELLED -} \ No newline at end of file diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Extensions/AnalyticsCommonExtensions.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Extensions/AnalyticsCommonExtensions.cs index d1d6d57..fa0dd56 100644 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Extensions/AnalyticsCommonExtensions.cs +++ b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Extensions/AnalyticsCommonExtensions.cs @@ -1,5 +1,4 @@ using AnalyticsService.Common.Data; -using AnalyticsService.Common.DTOs; using AnalyticsService.Common.Entities; using AnalyticsService.Common.Repositories; using Microsoft.Extensions.DependencyInjection; diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Repositories/AnalyticsRepository.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Repositories/AnalyticsRepository.cs index 3ae12e2..07dff16 100644 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Repositories/AnalyticsRepository.cs +++ b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Repositories/AnalyticsRepository.cs @@ -1,5 +1,4 @@ using AnalyticsService.Common.Data; -using AnalyticsService.Common.DTOs; using AnalyticsService.Common.Entities; using AutoMapper; using MongoDB.Driver; @@ -12,72 +11,138 @@ public class AnalyticsRepository : IAnalyticsRepository private readonly IAnalyticsContext _context; private readonly IMapper _mapper; + // Individual Trainings public AnalyticsRepository(IAnalyticsContext context, IMapper mapper) { _context = context ?? throw new ArgumentNullException(nameof(context)); _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); } - public async Task CreateTraining(Training training) + public async Task CreateIndividualTraining(IndividualTraining individualTraining) { - await _context.Trainings.InsertOneAsync(training); + await _context.IndividualTrainings.InsertOneAsync(individualTraining); } - public async Task DeleteTraining(string id) + public async Task GetIndividualTrainingByReservationId(string reservationId) { - var deleteResult = await _context.Trainings.DeleteOneAsync(t => t.Id == id); - return deleteResult.IsAcknowledged && deleteResult.DeletedCount > 0; + return await _context.IndividualTrainings.Find(it => it.ReservationId == reservationId).FirstOrDefaultAsync(); } - public async Task GetTrainerAverageTrainingRating(string trainerId) + public async Task> GetIndividualTrainingsByTrainerId(string trainerId) { - var trainings = await _context.Trainings.Find(t => t.TrainerId == trainerId).ToListAsync(); - return trainings.Count > 0 ? trainings.Average(t => t.ClientRating) : 0; + return await _context.IndividualTrainings.Find(it => it.TrainerId == trainerId).ToListAsync(); } - public async Task GetTrainerNumOfTrainings(string trainerId) + public async Task> GetIndividualTrainingsByClientId(string clientId) { - long numOfElements = await _context.Trainings - .Find(t => t.TrainerId == trainerId && t.Status == TrainingStatus.HELD) - .CountDocumentsAsync(); - - return Convert.ToInt32(numOfElements); + return await _context.IndividualTrainings.Find(it => it.ClientId == clientId).ToListAsync(); } - public async Task GetClientNumOfTrainings(string clientId) + public async Task UpdateIndividualTraining(IndividualTraining individualTraining) { - long numOfElements = await _context.Trainings - .Find(t => t.ClientId == clientId && t.Status == TrainingStatus.HELD) - .CountDocumentsAsync(); - - return Convert.ToInt32(numOfElements); + var result = await _context.IndividualTrainings.ReplaceOneAsync(it => it.Id == individualTraining.Id, individualTraining); + return result.IsAcknowledged && result.ModifiedCount > 0; } - - public async Task GetClientNumOfHeldTrainings(string clientId) + + public async Task DeleteIndividualTraining(string id) { - long numOfElements = await _context.Trainings - .Find(t => t.Status == TrainingStatus.HELD) - .CountDocumentsAsync(); - return Convert.ToInt32(numOfElements); + var result = await _context.IndividualTrainings.DeleteOneAsync(it => it.Id == id); + return result.IsAcknowledged && result.DeletedCount > 0; } - - public async Task GetClientNumOfCancelledTrainings(string clientId) + + public async Task CreateGroupTraining(GroupTraining groupTraining) + { + await _context.GroupTrainings.InsertOneAsync(groupTraining); + } + + // Group Trainings + public async Task> GetGroupTrainingsByTrainerId(string trainerId) { - long numOfElements = await _context.Trainings - .Find(t => t.Status == TrainingStatus.CANCELLED) - .CountDocumentsAsync(); - return Convert.ToInt32(numOfElements); + return await _context.GroupTrainings.Find(gt => gt.TrainerId == trainerId).ToListAsync(); } - public async Task> GetTrainerClientIds(string trainerId) + public async Task GetGroupTrainingByReservationId(string reservationId) { - var trainings = await _context.Trainings.FindAsync(t => t.TrainerId == trainerId); - return trainings.ToList().Select(t => t.ClientId).AsEnumerable(); + return await _context.GroupTrainings.Find(gt => gt.ReservationId == reservationId).FirstOrDefaultAsync(); } - public async Task> GetClientTrainings(string clientId) + public async Task> GetGroupTrainingsByClientId(string clientId) { - var clientTrainings = await _context.Trainings.FindAsync(t => t.ClientId == clientId); - return _mapper.Map>(clientTrainings.ToList()); + return await _context.GroupTrainings.Find(gt => gt.ClientIds.Contains(clientId)).ToListAsync(); } + + public async Task UpdateGroupTraining(GroupTraining groupTraining) + { + var result = await _context.GroupTrainings.ReplaceOneAsync(gt => gt.Id == groupTraining.Id, groupTraining); + return result.IsAcknowledged && result.ModifiedCount > 0; + } + + public async Task DeleteGroupTraining(string id) + { + var result = await _context.GroupTrainings.DeleteOneAsync(gt => gt.Id == id); + return result.IsAcknowledged && result.DeletedCount > 0; + } + + // public async Task CreateTraining(Training training) + // { + // await _context.Trainings.InsertOneAsync(training); + // } + // + // public async Task DeleteTraining(string id) + // { + // var deleteResult = await _context.Trainings.DeleteOneAsync(t => t.Id == id); + // return deleteResult.IsAcknowledged && deleteResult.DeletedCount > 0; + // } + // + // public async Task GetTrainerAverageTrainingRating(string trainerId) + // { + // var trainings = await _context.Trainings.Find(t => t.TrainerId == trainerId).ToListAsync(); + // return trainings.Count > 0 ? trainings.Average(t => t.ClientRating) : 0; + // } + // + // public async Task GetTrainerNumOfTrainings(string trainerId) + // { + // long numOfElements = await _context.Trainings + // .Find(t => t.TrainerId == trainerId && t.Status == TrainingStatus.HELD) + // .CountDocumentsAsync(); + // + // return Convert.ToInt32(numOfElements); + // } + // + // public async Task GetClientNumOfTrainings(string clientId) + // { + // long numOfElements = await _context.Trainings + // .Find(t => t.ClientId == clientId && t.Status == TrainingStatus.HELD) + // .CountDocumentsAsync(); + // + // return Convert.ToInt32(numOfElements); + // } + // + // public async Task GetClientNumOfHeldTrainings(string clientId) + // { + // long numOfElements = await _context.Trainings + // .Find(t => t.Status == TrainingStatus.HELD) + // .CountDocumentsAsync(); + // return Convert.ToInt32(numOfElements); + // } + // + // public async Task GetClientNumOfCancelledTrainings(string clientId) + // { + // long numOfElements = await _context.Trainings + // .Find(t => t.Status == TrainingStatus.CANCELLED) + // .CountDocumentsAsync(); + // return Convert.ToInt32(numOfElements); + // } + // + // public async Task> GetTrainerClientIds(string trainerId) + // { + // var trainings = await _context.Trainings.FindAsync(t => t.TrainerId == trainerId); + // return trainings.ToList().Select(t => t.ClientId).AsEnumerable(); + // } + // + // public async Task> GetClientTrainings(string clientId) + // { + // var clientTrainings = await _context.Trainings.FindAsync(t => t.ClientId == clientId); + // return _mapper.Map>(clientTrainings.ToList()); + // } } \ No newline at end of file diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Repositories/IAnalyticsRepository.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Repositories/IAnalyticsRepository.cs index 1a44483..eb028ed 100644 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Repositories/IAnalyticsRepository.cs +++ b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Repositories/IAnalyticsRepository.cs @@ -1,17 +1,22 @@ -using AnalyticsService.Common.DTOs; using AnalyticsService.Common.Entities; namespace AnalyticsService.Common.Repositories; public interface IAnalyticsRepository { - Task CreateTraining(Training training); - Task DeleteTraining(string id); - Task GetTrainerAverageTrainingRating(string trainerId); - Task GetTrainerNumOfTrainings(string trainerId); - Task GetClientNumOfTrainings(string clientId); - Task GetClientNumOfHeldTrainings(string clientId); - Task GetClientNumOfCancelledTrainings(string clientId); - Task> GetTrainerClientIds(string trainerId); - Task> GetClientTrainings(string clientId); + // Individual Trainings + Task CreateIndividualTraining(IndividualTraining individualTraining); + Task GetIndividualTrainingByReservationId(string reservationId); + Task> GetIndividualTrainingsByTrainerId(string trainerId); + Task> GetIndividualTrainingsByClientId(string clientId); + Task UpdateIndividualTraining(IndividualTraining individualTraining); + Task DeleteIndividualTraining(string id); + + // Group Trainings + Task CreateGroupTraining(GroupTraining groupTraining); + Task GetGroupTrainingByReservationId(string reservationId); + Task> GetGroupTrainingsByTrainerId(string trainerId); + Task> GetGroupTrainingsByClientId(string clientId); + Task UpdateGroupTraining(GroupTraining groupTraining); + Task DeleteGroupTraining(string id); } \ No newline at end of file diff --git a/Fitness/Backend/docker-compose.development.yml b/Fitness/Backend/docker-compose.development.yml index 7804a92..ad7b071 100644 --- a/Fitness/Backend/docker-compose.development.yml +++ b/Fitness/Backend/docker-compose.development.yml @@ -55,6 +55,14 @@ services: volumes: - reservationmongo_data:/data/db + analyticsdb: + container_name: analyticsdb + restart: always + ports: + - 27027:27017 + volumes: + - analyticsmongo_data:/data/db + rabbitmq: container_name: rabbitmq restart: always diff --git a/Fitness/Backend/docker-compose.yml b/Fitness/Backend/docker-compose.yml index 281ff12..74e641b 100644 --- a/Fitness/Backend/docker-compose.yml +++ b/Fitness/Backend/docker-compose.yml @@ -11,9 +11,6 @@ services: paymentdb: image: mongo - analyticsdb: - image: mongo - notificationdb: image: mongo @@ -23,6 +20,9 @@ services: reservationdb: image: mongo + analyticsdb: + image: mongo + rabbitmq: image: rabbitmq:3-management-alpine diff --git a/Fitness/Frontend/src/views/pages/ClientAnalytics.vue b/Fitness/Frontend/src/views/pages/ClientAnalytics.vue index bc59ed4..11bcf14 100644 --- a/Fitness/Frontend/src/views/pages/ClientAnalytics.vue +++ b/Fitness/Frontend/src/views/pages/ClientAnalytics.vue @@ -182,11 +182,6 @@ export default { }, fetchAnalytics() { const clientId = this.$route.params.id; - analyticsService.getClientAnalytics(clientId).then(response => { - this.clientTrainings = response.data; - this.calculateTrainingStatistics(); - this.calculateTrainersStatistics(); - }); }, calculateTrainingStatistics() { this.clientTrainings.forEach(training => { diff --git a/Fitness/Frontend/src/views/pages/TrainerAnalytics.vue b/Fitness/Frontend/src/views/pages/TrainerAnalytics.vue index f747a15..7bbf382 100644 --- a/Fitness/Frontend/src/views/pages/TrainerAnalytics.vue +++ b/Fitness/Frontend/src/views/pages/TrainerAnalytics.vue @@ -195,11 +195,6 @@ export default { }, fetchAnalytics() { const clientId = this.$route.params.id; - analyticsService.getClientAnalytics(clientId).then(response => { - this.clientTrainings = response.data; - this.calculateTrainingStatistics(); - this.calculateTrainersStatistics(); - }); }, calculateTrainingStatistics() { this.clientTrainings.forEach(training => { From 0d78f203dc78051ad1199cca44eb68f73eaadabd Mon Sep 17 00:00:00 2001 From: stemil01 Date: Sun, 12 Oct 2025 12:10:37 +0200 Subject: [PATCH 056/118] Configure anlytics service consumer part for reviews. Relates to #114. --- .../EventBusConsumers/ReviewConsumer.cs | 56 +++++++++++++++++-- .../Entities/Review.cs | 10 +--- 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/EventBusConsumers/ReviewConsumer.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/EventBusConsumers/ReviewConsumer.cs index 408fb0e..9cc179b 100644 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/EventBusConsumers/ReviewConsumer.cs +++ b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.API/EventBusConsumers/ReviewConsumer.cs @@ -1,4 +1,6 @@ using System.Text.Json; +using AnalyticsService.Common.Entities; +using AnalyticsService.Common.Repositories; using EventBus.Messages.Events; using MassTransit; @@ -6,11 +8,55 @@ namespace AnalyticsService.API.EventBusConsumers; public class ReviewConsumer : IConsumer { - public Task Consume(ConsumeContext context) + private readonly IAnalyticsRepository _repository; + + public ReviewConsumer(IAnalyticsRepository repository) + { + _repository = repository ?? throw new ArgumentNullException(nameof(repository)); + } + + public async Task Consume(ConsumeContext context) { - var review = context.Message; - Console.WriteLine(JsonSerializer.Serialize(review)); - // TODO(Handle reservation) - return Task.CompletedTask; + ReviewEvent review = context.Message; + Review analyticsReview = new Review + { + UserId = review.UserId, + Rating = review.Rating, + Comment = review.Comment + }; + var individualTraining = await _repository.GetIndividualTrainingByReservationId(review.ReservationId); + var groupTraining = await _repository.GetGroupTrainingByReservationId(review.ReservationId); + switch (review.EventType) + { + case ReviewEventType.ClientReview: + { + if (individualTraining != null) + { + individualTraining.ClientReview = analyticsReview; + await _repository.UpdateIndividualTraining(individualTraining); + } + else if (groupTraining != null) + { + groupTraining.ClientReviews ??= []; + groupTraining.ClientReviews.Add(analyticsReview); + await _repository.UpdateGroupTraining(groupTraining); + } + break; + } + case ReviewEventType.TrainerReview: + { + if (individualTraining != null) + { + individualTraining.TrainerReview = analyticsReview; + await _repository.UpdateIndividualTraining(individualTraining); + } + else if (groupTraining != null) + { + groupTraining.TrainerReview = analyticsReview; + await _repository.UpdateGroupTraining(groupTraining); + } + break; + } + } } } \ No newline at end of file diff --git a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/Review.cs b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/Review.cs index e3b1ca3..7e3496d 100644 --- a/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/Review.cs +++ b/Fitness/Backend/Services/AnalyticsService/AnalyticsService.Common/Entities/Review.cs @@ -5,11 +5,7 @@ namespace AnalyticsService.Common.Entities; public class Review { - [BsonId] - [BsonRepresentation(BsonType.ObjectId)] - public string Id { get; set; } - public string ReservationId { get; set; } - public string UserId { get; set; } - public int Rating { get; set; } - public string Comment { get; set; } + public string? UserId { get; set; } + public int? Rating { get; set; } + public string? Comment { get; set; } } \ No newline at end of file From 58e8ff77c15cd683a6b341c24f0870ec3e7cd186 Mon Sep 17 00:00:00 2001 From: stemil01 Date: Sun, 12 Oct 2025 15:23:30 +0200 Subject: [PATCH 057/118] Add ClilentId and TrainerId for submitting reviews. Relates to #114. --- .../src/views/pages/ClientGroupTrainings.vue | 43 +++++++++++-------- .../views/pages/ClientIndividualTrainings.vue | 17 ++++---- .../src/views/pages/TrainerGroupTrainings.vue | 10 +++-- .../pages/TrainerIndividualTrainings.vue | 21 ++++----- 4 files changed, 50 insertions(+), 41 deletions(-) diff --git a/Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue b/Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue index d38c9db..a3b74a6 100644 --- a/Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue +++ b/Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue @@ -57,7 +57,7 @@ - + @@ -111,8 +111,9 @@
-
@@ -139,7 +140,9 @@ export default { trainers: [], showDetails: false, showReview: false, - trainingRating: null + trainingRating: null, + currentReservationId: "", + currentTrainerId: "" }; }, @@ -189,27 +192,29 @@ export default { } }, - submitReview(reservationId, rating, comment) { - let request = { - reservationId: reservationId, - clientId: this.$route.params.id, - clientComment: comment, - clientRating: rating, - } - data_services.methods.submit_review_client(request) - .then(response => { - location.reload(); - }) - .catch(error => { - console.error("Reviewing error:", error); - alert("An error occurred while reviewing a reservation from the trainer side."); - }); + submitReview(reservationId, trainerId, clientId, rating, comment) { + console.log("Client Group Trainings SUBMIT REVIEW:", trainerId, clientId); + // let request = { + // reservationId: reservationId, + // clientId: clientId, + // clientComment: comment, + // clientRating: rating, + // } + // data_services.methods.submit_review_client(request) + // .then(response => { + // location.reload(); + // }) + // .catch(error => { + // console.error("Reviewing error:", error); + // alert("An error occurred while reviewing a reservation from the trainer side."); + // }); }, fetchGroupReservations() { getAllGroupReservations() .then(response => { this.groupReservations = response.data; + console.log(this.groupReservations); return data_services.methods.get_trainers(); }) .then(response => { diff --git a/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue index 03cb409..b2992ee 100644 --- a/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue +++ b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue @@ -73,7 +73,7 @@ - {{ res.trainer }} + {{ this.findTrainerName(res.trainerId) }} {{ res.trainingType }} {{ res.date }} {{ res.time }} @@ -101,13 +101,13 @@ - {{ res.trainer }} + {{ this.findTrainerName(res.trainerId) }} {{ res.trainingType }} {{ res.date }} {{ res.time }} {{ res.status }} - @@ -139,7 +139,8 @@
-
@@ -156,7 +157,6 @@ import { cancelClientIndividualReservation, getGroupReservationsByTrainer, getIndividualReservationsByTrainer, - createIndividualReservation } from '@/services/ReservationService' import FullCalendar from '@fullcalendar/vue3' import timeGridPlugin from '@fullcalendar/timegrid' @@ -177,6 +177,7 @@ export default { trainingDate: "", trainingRating: null, currentReservationId: "", + currentTrainerId: "", today: new Date().toISOString().split("T")[0], // e.g. "2025-09-30" startTime: "", calendarOptions: { @@ -286,7 +287,7 @@ export default { } }, - submitReview(reservationId, rating, comment) { + submitReview(reservationId, trainerId, clientId, rating, comment) { let request = { reservationId: reservationId, clientId: this.$route.params.id, @@ -368,7 +369,7 @@ export default { }) .map(r => ({ id: r.id, - trainer: this.findTrainerName(r.trainerId), + trainerId: r.trainerId, trainingType: this.findTrainingType(r.trainingTypeId), date: r.date, time: `${r.startTime} - ${r.endTime}` @@ -384,7 +385,7 @@ export default { }) .map(r => ({ id: r.id, - trainer: this.findTrainerName(r.trainerId), + trainerId: r.trainerId, trainingType: this.findTrainingType(r.trainingTypeId), date: r.date, time: `${r.startTime} - ${r.endTime}`, diff --git a/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue b/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue index a5d87ce..4a179f7 100644 --- a/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue +++ b/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue @@ -89,7 +89,7 @@ - + @@ -143,7 +143,8 @@
-
@@ -186,6 +187,7 @@ export default { showReview: false, trainingRating: null, currentReservationId: "", + currentClientId: "", calendarOptions: { plugins: [ timeGridPlugin, interactionPlugin ], initialView: 'timeGridWeek', @@ -315,10 +317,10 @@ export default { }); }, - submitReview(reservationId, rating, comment) { + submitReview(reservationId, trainerId, clientId, rating, comment) { let request = { reservationId: reservationId, - trainerId: this.$route.params.id, + trainerId: trainerId, trainerComment: comment, trainerRating: rating, } diff --git a/Fitness/Frontend/src/views/pages/TrainerIndividualTrainings.vue b/Fitness/Frontend/src/views/pages/TrainerIndividualTrainings.vue index 4ec2c4b..10ca5ec 100644 --- a/Fitness/Frontend/src/views/pages/TrainerIndividualTrainings.vue +++ b/Fitness/Frontend/src/views/pages/TrainerIndividualTrainings.vue @@ -17,7 +17,7 @@ - {{ res.client }} + {{ this.findClientName(res.clientId) }} {{ res.trainingType }} {{ res.date }} {{ res.time }} @@ -45,13 +45,13 @@ - {{ res.client }} + {{ this.findClientName(res.clientId) }} {{ res.trainingType }} {{ res.date }} {{ res.time }} {{ res.status }} - @@ -83,8 +83,9 @@
-
@@ -108,7 +109,8 @@ export default { reservations: [], showReview: false, trainingRating: null, - currentReservationId: "" + currentReservationId: "", + currentClientId: "" }; }, @@ -162,10 +164,10 @@ export default { } }, - submitReview(reservationId, rating, comment) { + submitReview(reservationId, trainerId, clientId, rating, comment) { let request = { reservationId: reservationId, - trainerId: this.$route.params.id, + trainerId: trainerId, trainerComment: comment, trainerRating: rating, } @@ -238,7 +240,6 @@ export default { }) .map(r => ({ id: r.id, - client: this.findClientName(r.clientId), clientId: r.clientId, trainingType: this.findTrainingType(r.trainingTypeId), price: this.findPrice(r.trainingTypeId), @@ -256,7 +257,7 @@ export default { }) .map(r => ({ id: r.id, - client: this.findClientName(r.clientId), + clientId: r.clientId, trainingType: this.findTrainingType(r.trainingTypeId), date: r.date, time: `${r.startTime} - ${r.endTime}`, From cfdf3291fc4fb0112bb32dd78cfb357e2c74a6c3 Mon Sep 17 00:00:00 2001 From: Milan Mitreski Date: Sun, 12 Oct 2025 15:53:42 +0200 Subject: [PATCH 058/118] Minor review fix. --- .../Controllers/ReviewController.cs | 4 +-- .../DTOs/BaseReviewDTO.cs | 4 +-- .../ReviewService.Common/Entities/Review.cs | 4 +-- .../Repositories/IReviewRepository.cs | 4 +-- .../Repositories/ReviewRepository.cs | 8 ++--- .../src/views/pages/ClientGroupTrainings.vue | 30 +++++++++---------- .../views/pages/ClientIndividualTrainings.vue | 3 +- .../src/views/pages/PaymentSuccess.vue | 30 +++++++++---------- .../src/views/pages/TrainerGroupTrainings.vue | 1 + .../pages/TrainerIndividualTrainings.vue | 1 + 10 files changed, 45 insertions(+), 44 deletions(-) diff --git a/Fitness/Backend/Services/ReviewService/ReviewService.API/Controllers/ReviewController.cs b/Fitness/Backend/Services/ReviewService/ReviewService.API/Controllers/ReviewController.cs index 02d8561..1c8e18b 100644 --- a/Fitness/Backend/Services/ReviewService/ReviewService.API/Controllers/ReviewController.cs +++ b/Fitness/Backend/Services/ReviewService/ReviewService.API/Controllers/ReviewController.cs @@ -57,7 +57,7 @@ public async Task> TrainerReview(string trainerId, [From var review = await _repository.GetReviewByReservationId(reviewDTO.ReservationId); if (review == null) { - await _repository.CreateReview(reviewDTO.ReservationId); + await _repository.CreateReview(reviewDTO.ReservationId, reviewDTO.ClientId, reviewDTO.TrainerId); } var updated = await _repository.SubmitTrainerReview(reviewDTO); if (updated) @@ -75,7 +75,7 @@ public async Task> ClientReview(string clientId, [FromBo var review = await _repository.GetReviewByReservationId(reviewDTO.ReservationId); if (review == null) { - await _repository.CreateReview(reviewDTO.ReservationId); + await _repository.CreateReview(reviewDTO.ReservationId, reviewDTO.ClientId, reviewDTO.TrainerId); } var updated = await _repository.SubmitClientReview(reviewDTO); if (updated) diff --git a/Fitness/Backend/Services/ReviewService/ReviewService.Common/DTOs/BaseReviewDTO.cs b/Fitness/Backend/Services/ReviewService/ReviewService.Common/DTOs/BaseReviewDTO.cs index 4b3549c..521999f 100644 --- a/Fitness/Backend/Services/ReviewService/ReviewService.Common/DTOs/BaseReviewDTO.cs +++ b/Fitness/Backend/Services/ReviewService/ReviewService.Common/DTOs/BaseReviewDTO.cs @@ -9,10 +9,10 @@ namespace ReviewService.Common.DTOs public class BaseReviewDTO { public string ReservationId { get; set; } - public string? TrainerId { get; set; } + public string TrainerId { get; set; } public string? TrainerComment { get; set; } public int? TrainerRating { get; set; } - public string? ClientId { get; set; } + public string ClientId { get; set; } public string? ClientComment { get; set; } public int? ClientRating { get; set; } } diff --git a/Fitness/Backend/Services/ReviewService/ReviewService.Common/Entities/Review.cs b/Fitness/Backend/Services/ReviewService/ReviewService.Common/Entities/Review.cs index 0010697..101ec3c 100644 --- a/Fitness/Backend/Services/ReviewService/ReviewService.Common/Entities/Review.cs +++ b/Fitness/Backend/Services/ReviewService/ReviewService.Common/Entities/Review.cs @@ -14,10 +14,10 @@ public class Review [BsonRepresentation(BsonType.ObjectId)] public string Id; public string ReservationId { get; set; } - public string? TrainerId { get; set; } + public string TrainerId { get; set; } public string? TrainerComment { get; set; } public int? TrainerRating { get; set; } - public string? ClientId { get; set; } + public string ClientId { get; set; } public string? ClientComment { get; set; } public int? ClientRating { get; set; } } diff --git a/Fitness/Backend/Services/ReviewService/ReviewService.Common/Repositories/IReviewRepository.cs b/Fitness/Backend/Services/ReviewService/ReviewService.Common/Repositories/IReviewRepository.cs index 5414919..61b05ed 100644 --- a/Fitness/Backend/Services/ReviewService/ReviewService.Common/Repositories/IReviewRepository.cs +++ b/Fitness/Backend/Services/ReviewService/ReviewService.Common/Repositories/IReviewRepository.cs @@ -9,10 +9,10 @@ namespace ReviewService.Common.Repositories { public interface IReviewRepository { - Task GetReviewByReservationId(string resetvationId); + Task GetReviewByReservationId(string reservationId); Task> GetReviewsByTrainerId(string trainerId); Task> GetReviewsByClientId(string clientId); - Task CreateReview(string reservationId); + Task CreateReview(string reservationId, string clientId, string trainerId); Task SubmitClientReview(SubmitReviewDTO clientReview); Task SubmitTrainerReview(SubmitReviewDTO trainerReview); } diff --git a/Fitness/Backend/Services/ReviewService/ReviewService.Common/Repositories/ReviewRepository.cs b/Fitness/Backend/Services/ReviewService/ReviewService.Common/Repositories/ReviewRepository.cs index cd41d59..db3f360 100644 --- a/Fitness/Backend/Services/ReviewService/ReviewService.Common/Repositories/ReviewRepository.cs +++ b/Fitness/Backend/Services/ReviewService/ReviewService.Common/Repositories/ReviewRepository.cs @@ -17,9 +17,9 @@ public ReviewRepository(IReviewContext context, IMapper mapper) _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); } - public async Task GetReviewByReservationId(string resetvationId) + public async Task GetReviewByReservationId(string reservationId) { - var review = await _context.Reviews.Find(r => r.ReservationId == resetvationId).FirstOrDefaultAsync(); + var review = await _context.Reviews.Find(r => r.ReservationId == reservationId).FirstOrDefaultAsync(); return _mapper.Map(review); } @@ -35,9 +35,9 @@ public async Task> GetReviewsByClientId(string clientId) return _mapper.Map>(reviews); } - public async Task CreateReview(string reservationId) + public async Task CreateReview(string reservationId, string clientId, string trainerId) { - var review = new ReviewDTO { ReservationId = reservationId }; + var review = new ReviewDTO { ReservationId = reservationId, ClientId = clientId, TrainerId = trainerId}; await _context.Reviews.InsertOneAsync(_mapper.Map(review)); } diff --git a/Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue b/Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue index a3b74a6..d9b3bef 100644 --- a/Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue +++ b/Fitness/Frontend/src/views/pages/ClientGroupTrainings.vue @@ -193,21 +193,21 @@ export default { }, submitReview(reservationId, trainerId, clientId, rating, comment) { - console.log("Client Group Trainings SUBMIT REVIEW:", trainerId, clientId); - // let request = { - // reservationId: reservationId, - // clientId: clientId, - // clientComment: comment, - // clientRating: rating, - // } - // data_services.methods.submit_review_client(request) - // .then(response => { - // location.reload(); - // }) - // .catch(error => { - // console.error("Reviewing error:", error); - // alert("An error occurred while reviewing a reservation from the trainer side."); - // }); + let request = { + reservationId: reservationId, + trainerId: trainerId, + clientId: clientId, + clientComment: comment, + clientRating: rating, + } + data_services.methods.submit_review_client(request) + .then(response => { + location.reload(); + }) + .catch(error => { + console.error("Reviewing error:", error); + alert("An error occurred while reviewing a reservation from the trainer side."); + }); }, fetchGroupReservations() { diff --git a/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue index b2992ee..ce7074a 100644 --- a/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue +++ b/Fitness/Frontend/src/views/pages/ClientIndividualTrainings.vue @@ -290,7 +290,8 @@ export default { submitReview(reservationId, trainerId, clientId, rating, comment) { let request = { reservationId: reservationId, - clientId: this.$route.params.id, + trainerId: trainerId, + clientId: clientId, clientComment: comment, clientRating: rating, } diff --git a/Fitness/Frontend/src/views/pages/PaymentSuccess.vue b/Fitness/Frontend/src/views/pages/PaymentSuccess.vue index 223f987..98be786 100644 --- a/Fitness/Frontend/src/views/pages/PaymentSuccess.vue +++ b/Fitness/Frontend/src/views/pages/PaymentSuccess.vue @@ -43,7 +43,7 @@ export default { const cancelData = sessionStorage.getItem("cancelData"); const chatData = sessionStorage.getItem("chatData"); const extendData = sessionStorage.getItem("extendData"); - + if (bookData) { this.processBooking(JSON.parse(bookData)); sessionStorage.removeItem("bookData"); @@ -66,9 +66,6 @@ export default { .then((response) => { if (response.status === 201) { alert("Training booked successfully!"); - this.$router.push( - `/client/${bookData.clientId}/individualTrainings` - ); } else { alert(`Booking failed. Status: ${response.status}`); } @@ -76,6 +73,9 @@ export default { .catch((error) => { console.error("Booking error:", error); alert("An error occurred while booking the training."); + }) + .then(() => { + this.$router.push(`/client/${bookData.clientId}/individualTrainings`); }); }, @@ -84,9 +84,6 @@ export default { .then((response) => { if (response.status === 200) { alert("Training cancelled successfully!"); - this.$router.push( - `/trainer/${cancelData.trainerId}/individualTrainings` - ); } else { alert(`Cancellation failed. Status: ${response.status}`); } @@ -94,7 +91,10 @@ export default { .catch((error) => { console.error("Cancellation error:", error); alert("An error occurred while cancelling the training."); - }); + }) + .then(() => { + this.$router.push(`/trainer/${cancelData.trainerId}/individualTrainings`); + });; }, processChat(chatData) { @@ -107,14 +107,13 @@ export default { } else { alert("Failed to create chat session."); } - - setTimeout(() => { - this.$router.push(`/client/${chatData.clientId}/chat`); - }, 2000); }) .catch((error) => { console.error("Chat creation error:", error); alert("An error occurred while creating the chat session."); + }) + .then(() => { + this.$router.push(`/client/${chatData.clientId}/chat`); }); }, @@ -128,14 +127,13 @@ export default { } else { alert("Failed to extend chat session."); } - - setTimeout(() => { - this.$router.push(`/client/${extendData.clientId}/chat`); - }, 2000); }) .catch((error) => { console.error("Chat extension error:", error); alert("An error occurred while extending the chat session."); + }) + .then(() => { + this.$router.push(`/client/${extendData.clientId}/chat`); }); }, }, diff --git a/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue b/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue index 4a179f7..867a08c 100644 --- a/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue +++ b/Fitness/Frontend/src/views/pages/TrainerGroupTrainings.vue @@ -320,6 +320,7 @@ export default { submitReview(reservationId, trainerId, clientId, rating, comment) { let request = { reservationId: reservationId, + clientId: clientId, trainerId: trainerId, trainerComment: comment, trainerRating: rating, diff --git a/Fitness/Frontend/src/views/pages/TrainerIndividualTrainings.vue b/Fitness/Frontend/src/views/pages/TrainerIndividualTrainings.vue index 10ca5ec..8b6022c 100644 --- a/Fitness/Frontend/src/views/pages/TrainerIndividualTrainings.vue +++ b/Fitness/Frontend/src/views/pages/TrainerIndividualTrainings.vue @@ -167,6 +167,7 @@ export default { submitReview(reservationId, trainerId, clientId, rating, comment) { let request = { reservationId: reservationId, + clientId: clientId, trainerId: trainerId, trainerComment: comment, trainerRating: rating, From 27b846cf376b409f0d7e4c9cc152ac82a44b7a78 Mon Sep 17 00:00:00 2001 From: Vukasin Markovic Date: Sun, 12 Oct 2025 15:24:31 +0200 Subject: [PATCH 059/118] ChatService migration --- Fitness/Backend/Fitness.sln | 2 +- .../ChatService.API/ChatService.API.csproj | 6 +++--- .../{ => ChatService}/ChatService.API/ChatService.API.http | 0 .../ChatService.API/Controllers/ChatController.cs | 2 +- .../{ => ChatService}/ChatService.API/Data/Context.cs | 0 .../{ => ChatService}/ChatService.API/Data/IContext.cs | 0 .../Services/{ => ChatService}/ChatService.API/Dockerfile | 6 +++--- .../ChatService.API/Middleware/WebSocketMiddleware.cs | 0 .../{ => ChatService}/ChatService.API/Models/ChatSession.cs | 0 .../{ => ChatService}/ChatService.API/Models/Message.cs | 0 .../ChatService.API/Models/MongoDBSettings.cs | 0 .../ChatService.API/Models/Notification.cs | 0 .../Services/{ => ChatService}/ChatService.API/Program.cs | 0 .../ChatService.API/Properties/launchSettings.json | 0 .../ChatService.API/Publishers/INotificationPublisher.cs | 0 .../ChatService.API/Publishers/NotificationPublisher.cs | 0 .../ChatService.API/Repositories/ChatRepository.cs | 0 .../ChatService.API/Repositories/IChatRepository.cs | 0 .../ChatService.API/Services/ChatService.cs | 0 .../ChatService.API/Services/IChatService.cs | 0 .../ChatService.API/Services/WebSocketHandler.cs | 0 .../ChatService.API/appsettings.Development.json | 0 .../{ => ChatService}/ChatService.API/appsettings.json | 0 .../Services/GatewayService/GatewayService.API/ocelot.json | 2 +- Fitness/Backend/docker-compose.yml | 2 +- Fitness/Frontend/package.json | 2 +- Fitness/Frontend/src/services/ChatService.js | 2 +- 27 files changed, 12 insertions(+), 12 deletions(-) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/ChatService.API.csproj (85%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/ChatService.API.http (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Controllers/ChatController.cs (99%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Data/Context.cs (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Data/IContext.cs (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Dockerfile (69%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Middleware/WebSocketMiddleware.cs (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Models/ChatSession.cs (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Models/Message.cs (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Models/MongoDBSettings.cs (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Models/Notification.cs (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Program.cs (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Properties/launchSettings.json (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Publishers/INotificationPublisher.cs (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Publishers/NotificationPublisher.cs (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Repositories/ChatRepository.cs (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Repositories/IChatRepository.cs (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Services/ChatService.cs (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Services/IChatService.cs (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/Services/WebSocketHandler.cs (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/appsettings.Development.json (100%) rename Fitness/Backend/Services/{ => ChatService}/ChatService.API/appsettings.json (100%) diff --git a/Fitness/Backend/Fitness.sln b/Fitness/Backend/Fitness.sln index 45b1910..1058587 100644 --- a/Fitness/Backend/Fitness.sln +++ b/Fitness/Backend/Fitness.sln @@ -43,7 +43,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TrainerService.Common", "Se EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TrainerService.GRPC", "Services\TrainerService\TrainerService.GRPC\TrainerService.GRPC.csproj", "{8A41AB5B-51F7-4F30-9B49-19BF8E09FC5B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChatService.API", "Services\ChatService.API\ChatService.API.csproj", "{CE504321-77C1-4981-B815-489CA83FB163}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChatService.API", "Services\ChatService\ChatService.API\ChatService.API.csproj", "{CE504321-77C1-4981-B815-489CA83FB163}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GatewayService.API", "Services\GatewayService\GatewayService.API\GatewayService.API.csproj", "{0E6E9A4F-6271-45A4-BA0A-9468C6F15275}" EndProject diff --git a/Fitness/Backend/Services/ChatService.API/ChatService.API.csproj b/Fitness/Backend/Services/ChatService/ChatService.API/ChatService.API.csproj similarity index 85% rename from Fitness/Backend/Services/ChatService.API/ChatService.API.csproj rename to Fitness/Backend/Services/ChatService/ChatService.API/ChatService.API.csproj index 9780ed4..f2b0e72 100644 --- a/Fitness/Backend/Services/ChatService.API/ChatService.API.csproj +++ b/Fitness/Backend/Services/ChatService/ChatService.API/ChatService.API.csproj @@ -25,14 +25,14 @@
- + .dockerignore - - + + diff --git a/Fitness/Backend/Services/ChatService.API/ChatService.API.http b/Fitness/Backend/Services/ChatService/ChatService.API/ChatService.API.http similarity index 100% rename from Fitness/Backend/Services/ChatService.API/ChatService.API.http rename to Fitness/Backend/Services/ChatService/ChatService.API/ChatService.API.http diff --git a/Fitness/Backend/Services/ChatService.API/Controllers/ChatController.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Controllers/ChatController.cs similarity index 99% rename from Fitness/Backend/Services/ChatService.API/Controllers/ChatController.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Controllers/ChatController.cs index 7ab8587..7458daf 100644 --- a/Fitness/Backend/Services/ChatService.API/Controllers/ChatController.cs +++ b/Fitness/Backend/Services/ChatService/ChatService.API/Controllers/ChatController.cs @@ -7,7 +7,7 @@ namespace ChatService.API.Controllers; //TO DO AUTHORIZATION AND AUTHENTICATION [ApiController] -[Route("api/[controller]")] +[Route("api/v1/[controller]")] public class ChatController : ControllerBase { private readonly IChatService _chatService; diff --git a/Fitness/Backend/Services/ChatService.API/Data/Context.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Data/Context.cs similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Data/Context.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Data/Context.cs diff --git a/Fitness/Backend/Services/ChatService.API/Data/IContext.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Data/IContext.cs similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Data/IContext.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Data/IContext.cs diff --git a/Fitness/Backend/Services/ChatService.API/Dockerfile b/Fitness/Backend/Services/ChatService/ChatService.API/Dockerfile similarity index 69% rename from Fitness/Backend/Services/ChatService.API/Dockerfile rename to Fitness/Backend/Services/ChatService/ChatService.API/Dockerfile index 62f5b7b..09f0254 100644 --- a/Fitness/Backend/Services/ChatService.API/Dockerfile +++ b/Fitness/Backend/Services/ChatService/ChatService.API/Dockerfile @@ -7,10 +7,10 @@ EXPOSE 8081 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src -COPY ["Services/ChatService.API/ChatService.API.csproj", "Services/ChatService.API/"] -RUN dotnet restore "Services/ChatService.API/ChatService.API.csproj" +COPY ["Services/ChatService/ChatService.API/ChatService.API.csproj", "Services/ChatService/ChatService.API/"] +RUN dotnet restore "Services/ChatService/ChatService.API/ChatService.API.csproj" COPY . . -WORKDIR "/src/Services/ChatService.API" +WORKDIR "/src/Services/ChatService/ChatService.API" RUN dotnet build "ChatService.API.csproj" -c $BUILD_CONFIGURATION -o /app/build FROM build AS publish diff --git a/Fitness/Backend/Services/ChatService.API/Middleware/WebSocketMiddleware.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Middleware/WebSocketMiddleware.cs similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Middleware/WebSocketMiddleware.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Middleware/WebSocketMiddleware.cs diff --git a/Fitness/Backend/Services/ChatService.API/Models/ChatSession.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Models/ChatSession.cs similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Models/ChatSession.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Models/ChatSession.cs diff --git a/Fitness/Backend/Services/ChatService.API/Models/Message.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Models/Message.cs similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Models/Message.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Models/Message.cs diff --git a/Fitness/Backend/Services/ChatService.API/Models/MongoDBSettings.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Models/MongoDBSettings.cs similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Models/MongoDBSettings.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Models/MongoDBSettings.cs diff --git a/Fitness/Backend/Services/ChatService.API/Models/Notification.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Models/Notification.cs similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Models/Notification.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Models/Notification.cs diff --git a/Fitness/Backend/Services/ChatService.API/Program.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Program.cs similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Program.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Program.cs diff --git a/Fitness/Backend/Services/ChatService.API/Properties/launchSettings.json b/Fitness/Backend/Services/ChatService/ChatService.API/Properties/launchSettings.json similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Properties/launchSettings.json rename to Fitness/Backend/Services/ChatService/ChatService.API/Properties/launchSettings.json diff --git a/Fitness/Backend/Services/ChatService.API/Publishers/INotificationPublisher.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Publishers/INotificationPublisher.cs similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Publishers/INotificationPublisher.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Publishers/INotificationPublisher.cs diff --git a/Fitness/Backend/Services/ChatService.API/Publishers/NotificationPublisher.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Publishers/NotificationPublisher.cs similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Publishers/NotificationPublisher.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Publishers/NotificationPublisher.cs diff --git a/Fitness/Backend/Services/ChatService.API/Repositories/ChatRepository.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Repositories/ChatRepository.cs similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Repositories/ChatRepository.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Repositories/ChatRepository.cs diff --git a/Fitness/Backend/Services/ChatService.API/Repositories/IChatRepository.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Repositories/IChatRepository.cs similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Repositories/IChatRepository.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Repositories/IChatRepository.cs diff --git a/Fitness/Backend/Services/ChatService.API/Services/ChatService.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Services/ChatService.cs similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Services/ChatService.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Services/ChatService.cs diff --git a/Fitness/Backend/Services/ChatService.API/Services/IChatService.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Services/IChatService.cs similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Services/IChatService.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Services/IChatService.cs diff --git a/Fitness/Backend/Services/ChatService.API/Services/WebSocketHandler.cs b/Fitness/Backend/Services/ChatService/ChatService.API/Services/WebSocketHandler.cs similarity index 100% rename from Fitness/Backend/Services/ChatService.API/Services/WebSocketHandler.cs rename to Fitness/Backend/Services/ChatService/ChatService.API/Services/WebSocketHandler.cs diff --git a/Fitness/Backend/Services/ChatService.API/appsettings.Development.json b/Fitness/Backend/Services/ChatService/ChatService.API/appsettings.Development.json similarity index 100% rename from Fitness/Backend/Services/ChatService.API/appsettings.Development.json rename to Fitness/Backend/Services/ChatService/ChatService.API/appsettings.Development.json diff --git a/Fitness/Backend/Services/ChatService.API/appsettings.json b/Fitness/Backend/Services/ChatService/ChatService.API/appsettings.json similarity index 100% rename from Fitness/Backend/Services/ChatService.API/appsettings.json rename to Fitness/Backend/Services/ChatService/ChatService.API/appsettings.json diff --git a/Fitness/Backend/Services/GatewayService/GatewayService.API/ocelot.json b/Fitness/Backend/Services/GatewayService/GatewayService.API/ocelot.json index c37da3c..f61a1cd 100644 --- a/Fitness/Backend/Services/GatewayService/GatewayService.API/ocelot.json +++ b/Fitness/Backend/Services/GatewayService/GatewayService.API/ocelot.json @@ -43,7 +43,7 @@ "UpstreamHttpMethod": ["GET", "POST", "PUT", "DELETE"] }, { - "DownstreamPathTemplate": "/api/chat/{everything}", + "DownstreamPathTemplate": "/api/v1/chat/{everything}", "DownstreamScheme": "http", "ServiceName": "ChatService.API", "UpstreamPathTemplate": "/chat/{everything}", diff --git a/Fitness/Backend/docker-compose.yml b/Fitness/Backend/docker-compose.yml index 74e641b..8e6fa10 100644 --- a/Fitness/Backend/docker-compose.yml +++ b/Fitness/Backend/docker-compose.yml @@ -145,7 +145,7 @@ services: image: ${DOCKER_REGISTRY-}chatserviceapi build: context: . - dockerfile: Services/ChatService.API/Dockerfile + dockerfile: Services/ChatService/ChatService.API/Dockerfile depends_on: - chatdb - rabbitmq diff --git a/Fitness/Frontend/package.json b/Fitness/Frontend/package.json index a069610..21a07be 100644 --- a/Fitness/Frontend/package.json +++ b/Fitness/Frontend/package.json @@ -25,7 +25,7 @@ "@coreui/icons-vue": "2.0.0", "@coreui/utils": "^1.3.1", "@coreui/vue": "^4.5.0", - "@coreui/vue-chartjs": "2.0.1", + "@coreui/vue-chartjs": "^3.0.0", "@fullcalendar/core": "^6.1.19", "@fullcalendar/daygrid": "^6.1.19", "@fullcalendar/interaction": "^6.1.19", diff --git a/Fitness/Frontend/src/services/ChatService.js b/Fitness/Frontend/src/services/ChatService.js index 63c1ed9..b4abe20 100644 --- a/Fitness/Frontend/src/services/ChatService.js +++ b/Fitness/Frontend/src/services/ChatService.js @@ -2,7 +2,7 @@ import axios from "axios"; const GATEWAY_URL = "http://localhost:8005"; -//const CHAT = "http://localhost:8082/api/Chat"; +//const CHAT = "http://localhost:8082/api/v1/Chat"; //const CLIENT = "http://localhost:8100/api/v1/Client"; //const TRAINERS = "http://localhost:8000/api/v1/Trainer"; From 124c544cad6b4d3d4bc5d39858f69629c4f62939 Mon Sep 17 00:00:00 2001 From: NataMata Date: Thu, 5 Dec 2024 22:32:52 +0100 Subject: [PATCH 060/118] [videoTraining] feat: training generator with exercise videos --- Fitness/Backend/Fitness.sln | 6 +++ .../.idea/.gitignore | 13 ++++++ .../.idea/indexLayout.xml | 8 ++++ .../.idea.videoTrainingService/.idea/vcs.xml | 6 +++ .../videoTrainingService.API/Program.cs | 44 +++++++++++++++++++ .../Properties/launchSettings.json | 41 +++++++++++++++++ .../appsettings.Development.json | 8 ++++ .../videoTrainingService.API/appsettings.json | 9 ++++ .../videoTrainingService.API.csproj | 14 ++++++ .../videoTrainingService.API.http | 6 +++ 10 files changed, 155 insertions(+) create mode 100644 Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/.gitignore create mode 100644 Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/indexLayout.xml create mode 100644 Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/vcs.xml create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Properties/launchSettings.json create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.Development.json create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.json create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.http diff --git a/Fitness/Backend/Fitness.sln b/Fitness/Backend/Fitness.sln index 1058587..56618f3 100644 --- a/Fitness/Backend/Fitness.sln +++ b/Fitness/Backend/Fitness.sln @@ -49,6 +49,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GatewayService.API", "Servi EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsulConfig.Settings", "Common\ConsulConfig.Settings\ConsulConfig.Settings.csproj", "{E8032951-A2BF-4DA6-B433-C3004A2D1021}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "videoTrainingService.API", "Services\videoTrainingService\videoTrainingService.API\videoTrainingService.API.csproj", "{5A3A398E-4133-43EF-A92C-338E8E13715C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -139,6 +141,10 @@ Global {8F5A1A04-D36F-45F1-84D7-D1AAC5439AA4}.Debug|Any CPU.Build.0 = Debug|Any CPU {8F5A1A04-D36F-45F1-84D7-D1AAC5439AA4}.Release|Any CPU.ActiveCfg = Release|Any CPU {8F5A1A04-D36F-45F1-84D7-D1AAC5439AA4}.Release|Any CPU.Build.0 = Release|Any CPU + {5A3A398E-4133-43EF-A92C-338E8E13715C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A3A398E-4133-43EF-A92C-338E8E13715C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A3A398E-4133-43EF-A92C-338E8E13715C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A3A398E-4133-43EF-A92C-338E8E13715C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/.gitignore b/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/.gitignore new file mode 100644 index 0000000..b349466 --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/projectSettingsUpdater.xml +/.idea.videoTrainingService.iml +/modules.xml +/contentModel.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/indexLayout.xml b/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/vcs.xml b/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/vcs.xml new file mode 100644 index 0000000..4fce1d8 --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs new file mode 100644 index 0000000..161f695 --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs @@ -0,0 +1,44 @@ +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +// 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(); + +var summaries = new[] +{ + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" +}; + +app.MapGet("/weatherforecast", () => + { + var forecast = Enumerable.Range(1, 5).Select(index => + new WeatherForecast + ( + DateOnly.FromDateTime(DateTime.Now.AddDays(index)), + Random.Shared.Next(-20, 55), + summaries[Random.Shared.Next(summaries.Length)] + )) + .ToArray(); + return forecast; + }) + .WithName("GetWeatherForecast") + .WithOpenApi(); + +app.Run(); + +record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) +{ + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); +} \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Properties/launchSettings.json b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Properties/launchSettings.json new file mode 100644 index 0000000..9363734 --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Properties/launchSettings.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:21255", + "sslPort": 44336 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5275", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:7270;http://localhost:5275", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.Development.json b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.json b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj new file mode 100644 index 0000000..6f9e6d5 --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + enable + enable + + + + + + + + diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.http b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.http new file mode 100644 index 0000000..332b17d --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.http @@ -0,0 +1,6 @@ +@videoTrainingService.API_HostAddress = http://localhost:5275 + +GET {{videoTrainingService.API_HostAddress}}/weatherforecast/ +Accept: application/json + +### From d1a58e9fc200e1a2e09a99c6d2c14aa69ac8a175 Mon Sep 17 00:00:00 2001 From: NataMata Date: Fri, 6 Dec 2024 10:48:29 +0100 Subject: [PATCH 061/118] Add: gitignore file changed --- Fitness/Backend/.gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Fitness/Backend/.gitignore b/Fitness/Backend/.gitignore index 6248226..da9eb05 100644 --- a/Fitness/Backend/.gitignore +++ b/Fitness/Backend/.gitignore @@ -58,6 +58,8 @@ out/ # mpeltonen/sbt-idea plugin .idea_modules/ +.idea/ + # JIRA plugin atlassian-ide-plugin.xml From 601ba1bc0d0e967c8a7e942130ad5464b7c477eb Mon Sep 17 00:00:00 2001 From: NataMata Date: Thu, 12 Dec 2024 21:08:03 +0100 Subject: [PATCH 062/118] Feat: added data models --- .../videoTrainingService.API/Entities/Exercise.cs | 9 +++++++++ .../videoTrainingService.API/Entities/Training.cs | 8 ++++++++ .../Entities/TrainingExercise.cs | 10 ++++++++++ 3 files changed, 27 insertions(+) create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Exercise.cs create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Training.cs create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/TrainingExercise.cs diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Exercise.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Exercise.cs new file mode 100644 index 0000000..fbf429b --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Exercise.cs @@ -0,0 +1,9 @@ +namespace videoTrainingService.API.Entities; + +public class Exercise +{ + public string Id { get; set; } + public string TrainerId { get; set; } + public string Name { get; set; } + public string Path { get; set; } +} \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Training.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Training.cs new file mode 100644 index 0000000..944babd --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Training.cs @@ -0,0 +1,8 @@ +namespace videoTrainingService.API.Entities; + +public class Training +{ + public string ClientId { get; set; } + public string TrainerId { get; set; } + public string TrainingId { get; set; } +} \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/TrainingExercise.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/TrainingExercise.cs new file mode 100644 index 0000000..9f0376e --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/TrainingExercise.cs @@ -0,0 +1,10 @@ +namespace videoTrainingService.API.Entities; + +public class TrainingExercise +{ + public string TrainingId { get; set; } + public string ExerciseId { get; set; } + public int ExerciseReps { get; set; } + public int Set { get; set; } + public int SetReps { get; set; } +} \ No newline at end of file From af8227c55465f896812c794003a0d7597c5daa55 Mon Sep 17 00:00:00 2001 From: NataMata Date: Thu, 12 Dec 2024 23:29:26 +0100 Subject: [PATCH 063/118] Fix: field order changed --- .../videoTrainingService.API/Entities/Training.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Training.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Training.cs index 944babd..faa267a 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Training.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Training.cs @@ -2,7 +2,7 @@ namespace videoTrainingService.API.Entities; public class Training { + public string TrainingId { get; set; } public string ClientId { get; set; } public string TrainerId { get; set; } - public string TrainingId { get; set; } } \ No newline at end of file From 29c3f617fe4eb4d359631206afd04262c2a3a996 Mon Sep 17 00:00:00 2001 From: NataMata Date: Thu, 12 Dec 2024 23:30:02 +0100 Subject: [PATCH 064/118] Feat: added context class and required settings --- .../Data/ITrainingContext.cs | 13 ++++++++++++ .../Data/TrainingContext.cs | 21 +++++++++++++++++++ .../videoTrainingService.API/Program.cs | 5 +++++ .../appsettings.Development.json | 6 ++++++ .../videoTrainingService.API.csproj | 6 ++++++ 5 files changed, 51 insertions(+) create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/ITrainingContext.cs create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/TrainingContext.cs diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/ITrainingContext.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/ITrainingContext.cs new file mode 100644 index 0000000..eb3e409 --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/ITrainingContext.cs @@ -0,0 +1,13 @@ +using MongoDB.Driver; +using videoTrainingService.API.Entities; + +namespace videoTrainingService.API.Data; + +public interface ITrainingContext +{ + IMongoCollection Exercise { get; } + + IMongoCollection Training { get; } + + IMongoCollection TrainingExercise { get; } +} \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/TrainingContext.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/TrainingContext.cs new file mode 100644 index 0000000..0054614 --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/TrainingContext.cs @@ -0,0 +1,21 @@ +using MongoDB.Driver; +using videoTrainingService.API.Entities; + +namespace videoTrainingService.API.Data; + +public class TrainingContext : ITrainingContext +{ + public TrainingContext(IConfiguration configuration) + { + var client = new MongoClient(configuration.GetValue("DatabaseSettings:ConnectionString")); + var database = client.GetDatabase("TrainingDB"); + + Exercise = database.GetCollection("Exercise"); + Training = database.GetCollection("Training"); + TrainingExercise = database.GetCollection("TrainingExercise"); + } + + public IMongoCollection Exercise { get; } + public IMongoCollection Training { get; } + public IMongoCollection TrainingExercise { get; } +} \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs index 161f695..580a1c6 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs @@ -1,6 +1,11 @@ +using videoTrainingService.API.Data; + var builder = WebApplication.CreateBuilder(args); // Add services to the container. + +builder.Services.AddScoped(); + // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.Development.json b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.Development.json index 0c208ae..3580e6d 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.Development.json +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.Development.json @@ -4,5 +4,11 @@ "Default": "Information", "Microsoft.AspNetCore": "Warning" } + }, + + "DatabaseSettings": { + "ConnectionString": "mongodb://localhost:27017" } } + + diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj index 6f9e6d5..a4ec227 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj @@ -11,4 +11,10 @@ + + + ..\..\..\..\..\..\..\.nuget\packages\mongodb.driver\2.28.0\lib\netstandard2.1\MongoDB.Driver.dll + + + From 73544f8c8f10193b7680608238facba2032786af Mon Sep 17 00:00:00 2001 From: NataMata Date: Sat, 14 Dec 2024 13:13:34 +0100 Subject: [PATCH 065/118] Fix: changed files structure --- .../Entities/Exercise.cs | 18 ++++++++++------ .../Entities/Training.cs | 17 ++++++++++----- .../Entities/TrainingExercise.cs | 21 ++++++++++++------- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Exercise.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Exercise.cs index fbf429b..3f4e184 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Exercise.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Exercise.cs @@ -1,9 +1,15 @@ -namespace videoTrainingService.API.Entities; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; -public class Exercise +namespace videoTrainingService.API.Entities { - public string Id { get; set; } - public string TrainerId { get; set; } - public string Name { get; set; } - public string Path { get; set; } + public class Exercise + { + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string Id { get; set; } + public string TrainerId { get; set; } + public string Name { get; set; } + public string Path { get; set; } + } } \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Training.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Training.cs index faa267a..fa45b58 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Training.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/Training.cs @@ -1,8 +1,15 @@ -namespace videoTrainingService.API.Entities; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; -public class Training +namespace videoTrainingService.API.Entities { - public string TrainingId { get; set; } - public string ClientId { get; set; } - public string TrainerId { get; set; } + public class Training + { + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string TrainingId { get; set; } + + public string ClientId { get; set; } + public string TrainerId { get; set; } + } } \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/TrainingExercise.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/TrainingExercise.cs index 9f0376e..926af1b 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/TrainingExercise.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/TrainingExercise.cs @@ -1,10 +1,17 @@ -namespace videoTrainingService.API.Entities; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; -public class TrainingExercise +namespace videoTrainingService.API.Entities { - public string TrainingId { get; set; } - public string ExerciseId { get; set; } - public int ExerciseReps { get; set; } - public int Set { get; set; } - public int SetReps { get; set; } + public class TrainingExercise + { + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string TrainingId { get; set; } + + public string ExerciseId { get; set; } + public int ExerciseReps { get; set; } + public int Set { get; set; } + public int SetReps { get; set; } + } } \ No newline at end of file From 97e9b2824fd2c9d9a8c29e363aa1ecf9edb0dc8e Mon Sep 17 00:00:00 2001 From: NataMata Date: Sat, 14 Dec 2024 13:18:28 +0100 Subject: [PATCH 066/118] New: added necessary classes and references for data access --- .../Data/ITrainingContext.cs | 15 ++- .../Data/TrainingContext.cs | 27 ++--- .../videoTrainingService.API/Program.cs | 2 + .../Repositories/ITrainingRepository.cs | 23 +++++ .../Repositories/TrainingRepository.cs | 98 +++++++++++++++++++ .../videoTrainingService.API.csproj | 4 + 6 files changed, 148 insertions(+), 21 deletions(-) create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/ITrainingRepository.cs create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/TrainingRepository.cs diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/ITrainingContext.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/ITrainingContext.cs index eb3e409..fa5dddf 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/ITrainingContext.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/ITrainingContext.cs @@ -1,13 +1,12 @@ using MongoDB.Driver; using videoTrainingService.API.Entities; -namespace videoTrainingService.API.Data; - -public interface ITrainingContext +namespace videoTrainingService.API.Data { - IMongoCollection Exercise { get; } - - IMongoCollection Training { get; } - - IMongoCollection TrainingExercise { get; } + public interface ITrainingContext + { + IMongoCollection Exercises { get; } + IMongoCollection Trainings { get; } + IMongoCollection TrainingExercises { get; } + } } \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/TrainingContext.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/TrainingContext.cs index 0054614..410b1a1 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/TrainingContext.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Data/TrainingContext.cs @@ -1,21 +1,22 @@ using MongoDB.Driver; using videoTrainingService.API.Entities; -namespace videoTrainingService.API.Data; - -public class TrainingContext : ITrainingContext +namespace videoTrainingService.API.Data { - public TrainingContext(IConfiguration configuration) + public class TrainingContext : ITrainingContext { - var client = new MongoClient(configuration.GetValue("DatabaseSettings:ConnectionString")); - var database = client.GetDatabase("TrainingDB"); + public TrainingContext(IConfiguration configuration) + { + var client = new MongoClient(configuration.GetValue("DatabaseSettings:ConnectionString")); + var database = client.GetDatabase("TrainingDB"); - Exercise = database.GetCollection("Exercise"); - Training = database.GetCollection("Training"); - TrainingExercise = database.GetCollection("TrainingExercise"); - } + Exercises = database.GetCollection("Exercises"); + Trainings = database.GetCollection("Trainings"); + TrainingExercises = database.GetCollection("TrainingExercises"); + } - public IMongoCollection Exercise { get; } - public IMongoCollection Training { get; } - public IMongoCollection TrainingExercise { get; } + public IMongoCollection Exercises { get; } + public IMongoCollection Trainings { get; } + public IMongoCollection TrainingExercises { get; } + } } \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs index 580a1c6..2534178 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs @@ -1,10 +1,12 @@ using videoTrainingService.API.Data; +using videoTrainingService.API.Repositories; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddScoped(); +builder.Services.AddScoped(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/ITrainingRepository.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/ITrainingRepository.cs new file mode 100644 index 0000000..036ab5b --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/ITrainingRepository.cs @@ -0,0 +1,23 @@ +using videoTrainingService.API.Entities; + +namespace videoTrainingService.API.Repositories +{ + public interface ITrainingRepository + { + Task> GetExercises(string trainerId); + Task GetExercise(string name, string trainerId); + Task CreateExercise(Exercise exercise); + Task UpdateExercise(Exercise exercise); + Task DeleteExercise(string id); + Task> GetTrainingsForClient(string clientId); + Task> GetTrainingsForTrainer(string trainerId); + Task GetTraining(string id); + Task CreateTraining(Training training); + Task UpdateTraining(Training training); + Task DeleteTraining(string id); + Task> GetTrainingExercises(string trainingId); + Task CreateTrainingExercise(TrainingExercise trainingExercise); + Task UpdateTrainingExercise(TrainingExercise trainingExercise); + Task DeleteTrainingExercise(string trainingId, string id); + } +} \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/TrainingRepository.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/TrainingRepository.cs new file mode 100644 index 0000000..b5bcba1 --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/TrainingRepository.cs @@ -0,0 +1,98 @@ +using MongoDB.Driver; +using videoTrainingService.API.Data; +using videoTrainingService.API.Entities; + +namespace videoTrainingService.API.Repositories +{ + public class TrainingRepository : ITrainingRepository + { + private readonly ITrainingContext _context; + + public TrainingRepository(ITrainingContext context) + { + _context = context ?? throw new ArgumentNullException(nameof(context)); + } + + public async Task> GetExercises(string trainerId) + { + return await _context.Exercises.Find(p => p.TrainerId == trainerId).ToListAsync(); + } + + public async Task GetExercise(string name, string trainerId) + { + return await _context.Exercises.Find(p => p.TrainerId == trainerId && p.Name == name).FirstOrDefaultAsync(); + } + + public async Task CreateExercise(Exercise exercise) + { + await _context.Exercises.InsertOneAsync(exercise); + } + + public async Task UpdateExercise(Exercise exercise) + { + var res = await _context.Exercises.ReplaceOneAsync(p => p.Id == exercise.Id, exercise); + return res.IsAcknowledged && res.ModifiedCount > 0; + } + + public async Task DeleteExercise(string id) + { + var res = await _context.Exercises.DeleteOneAsync(p => p.Id == id); + return res.IsAcknowledged && res.DeletedCount > 0; + } + + public async Task> GetTrainingsForClient(string clientId) + { + return await _context.Trainings.Find(p => p.ClientId == clientId).ToListAsync(); + } + + public async Task> GetTrainingsForTrainer(string trainerId) + { + return await _context.Trainings.Find(p => p.ClientId == trainerId).ToListAsync(); + } + + public async Task GetTraining(string id) + { + return await _context.Trainings.Find(p => p.TrainingId == id).FirstOrDefaultAsync(); + } + + public async Task CreateTraining(Training training) + { + await _context.Trainings.InsertOneAsync(training); + } + + public async Task UpdateTraining(Training training) + { + var res = await _context.Trainings.ReplaceOneAsync(p => p.TrainingId == training.TrainingId, training); + return res.IsAcknowledged && res.ModifiedCount > 0; + } + + public async Task DeleteTraining(string id) + { + var res = await _context.Trainings.DeleteOneAsync(p => p.TrainingId == id); + return res.IsAcknowledged && res.DeletedCount > 0; + } + + public async Task> GetTrainingExercises(string trainingId) + { + return await _context.TrainingExercises.Find(p => p.TrainingId == trainingId).ToListAsync(); + } + + public async Task CreateTrainingExercise(TrainingExercise trainingExercise) + { + await _context.TrainingExercises.InsertOneAsync(trainingExercise); + } + + public async Task UpdateTrainingExercise(TrainingExercise trainingExercise) + { + var res = await _context.TrainingExercises.ReplaceOneAsync(p => p.TrainingId == trainingExercise.TrainingId && + p.ExerciseId == trainingExercise.ExerciseId, trainingExercise); + return res.IsAcknowledged && res.ModifiedCount > 0; + } + + public async Task DeleteTrainingExercise(string trainingId, string id) + { + var res = await _context.TrainingExercises.DeleteOneAsync(p => p.TrainingId == trainingId && p.ExerciseId == id); + return res.IsAcknowledged && res.DeletedCount > 0; + } + } +} \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj index a4ec227..e62f26d 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj @@ -9,9 +9,13 @@ + + + ..\..\..\..\..\..\..\.nuget\packages\mongodb.bson\2.28.0\lib\netstandard2.1\MongoDB.Bson.dll + ..\..\..\..\..\..\..\.nuget\packages\mongodb.driver\2.28.0\lib\netstandard2.1\MongoDB.Driver.dll From 66d4d4fb29c1477e09eb5d75ac06294e07bfc34d Mon Sep 17 00:00:00 2001 From: NataMata Date: Sat, 14 Dec 2024 14:21:42 +0100 Subject: [PATCH 067/118] Fix: deleted generic code and modified to enable the project to work --- .../videoTrainingService.API/Program.cs | 28 ++----------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs index 2534178..ad76f8b 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs @@ -9,6 +9,8 @@ builder.Services.AddScoped(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle + +builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); @@ -21,31 +23,7 @@ app.UseSwaggerUI(); } -app.UseHttpsRedirection(); - -var summaries = new[] -{ - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" -}; - -app.MapGet("/weatherforecast", () => - { - var forecast = Enumerable.Range(1, 5).Select(index => - new WeatherForecast - ( - DateOnly.FromDateTime(DateTime.Now.AddDays(index)), - Random.Shared.Next(-20, 55), - summaries[Random.Shared.Next(summaries.Length)] - )) - .ToArray(); - return forecast; - }) - .WithName("GetWeatherForecast") - .WithOpenApi(); +app.MapControllers(); app.Run(); -record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) -{ - public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); -} \ No newline at end of file From a5650d373ba68f8b662e318e70047407f71cb14f Mon Sep 17 00:00:00 2001 From: NataMata Date: Sat, 14 Dec 2024 14:23:02 +0100 Subject: [PATCH 068/118] New: added controller file and one basic request for testing --- .../Controllers/TrainingContoroller.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs new file mode 100644 index 0000000..9604e9e --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs @@ -0,0 +1,27 @@ +using Microsoft.AspNetCore.Mvc; +using videoTrainingService.API.Entities; +using videoTrainingService.API.Repositories; + +namespace videoTrainingService.API.Controllers +{ + [ApiController] + [Route("api/v1/[controller]")] + + public class TrainingContoroller : ControllerBase + { + private readonly ITrainingRepository _repository; + + public TrainingContoroller(ITrainingRepository repository) + { + _repository = repository ?? throw new ArgumentNullException(nameof(repository)); + } + + [HttpGet] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetExercises(string trainerId) + { + var exercises = await _repository.GetExercises(trainerId); + return Ok(exercises); + } + } +} \ No newline at end of file From 13bc73cd86c2feb27fa652698e2edbc2efc7fd68 Mon Sep 17 00:00:00 2001 From: NataMata Date: Sun, 15 Dec 2024 22:09:42 +0100 Subject: [PATCH 069/118] Fix: changed structure for training exercise --- .../videoTrainingService.API/Entities/TrainingExercise.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/TrainingExercise.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/TrainingExercise.cs index 926af1b..ceddcdb 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/TrainingExercise.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Entities/TrainingExercise.cs @@ -7,8 +7,8 @@ public class TrainingExercise { [BsonId] [BsonRepresentation(BsonType.ObjectId)] + public string Id { get; set; } public string TrainingId { get; set; } - public string ExerciseId { get; set; } public int ExerciseReps { get; set; } public int Set { get; set; } From 45e1ecb27674d615b21a3ff23e8148fd3e5fb3d5 Mon Sep 17 00:00:00 2001 From: NataMata Date: Sun, 15 Dec 2024 22:12:52 +0100 Subject: [PATCH 070/118] Feat: implemented all required methods in controller --- .../Controllers/TrainingContoroller.cs | 154 +++++++++++++++++- .../Repositories/ITrainingRepository.cs | 6 +- .../Repositories/TrainingRepository.cs | 13 +- 3 files changed, 166 insertions(+), 7 deletions(-) diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs index 9604e9e..a9df600 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs @@ -15,7 +15,8 @@ public TrainingContoroller(ITrainingRepository repository) { _repository = repository ?? throw new ArgumentNullException(nameof(repository)); } - + + [Route("[action]")] [HttpGet] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] public async Task>> GetExercises(string trainerId) @@ -23,5 +24,156 @@ public async Task>> GetExercises(string train var exercises = await _repository.GetExercises(trainerId); return Ok(exercises); } + + [Route("[action]")] + [HttpGet] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetExercise(string id) + { + var exercise = await _repository.GetExercise(id); + if (exercise == null) + { + return NotFound(); + } + return Ok(exercise); + } + + [Route("[action]")] + [HttpPost] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status201Created)] + public async Task CreateExercise(Exercise exercise) + { + await _repository.CreateExercise(exercise); + return CreatedAtRoute("GetExercise", new { id = exercise.Id} , exercise); + } + + [Route("[action]")] + [HttpPut] + [ProducesResponseType(typeof(Exercise), StatusCodes.Status200OK)] + public async Task UpdateExercise(Exercise exercise) + { + var result = await _repository.UpdateExercise(exercise); + return Ok(result); + } + + [Route("[action]")] + [HttpDelete] + [ProducesResponseType(typeof(Exercise), StatusCodes.Status200OK)] + public async Task DeleteExercise(string id) + { + var result = await _repository.DeleteExercise(id); + return Ok(result); + } + + + [Route("[action]")] + [HttpGet] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetTrainingsForClient(string clientId) + { + var trainings = _repository.GetTrainingsForClient(clientId); + return Ok(trainings); + } + + [Route("[action]")] + [HttpGet] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetTrainingsForTrainer(string trainerId) + { + var trainings = _repository.GetTrainingsForTrainer(trainerId); + return Ok(trainings); + } + + [Route("[action]")] + [HttpGet] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetTraining(string id) + { + var training = await _repository.GetTraining(id); + if (training == null) + { + return NotFound(); + } + return Ok(training); + } + + [Route("[action]")] + [HttpPost] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status201Created)] + public async Task CreateTraining(Training training) + { + await _repository.CreateTraining(training); + return CreatedAtRoute("GetTraining", new { id = training.TrainingId} , training); + } + + [Route("[action]")] + [HttpPut] + [ProducesResponseType(typeof(Training), StatusCodes.Status200OK)] + public async Task UpdateTraining(Training training) + { + var result = await _repository.UpdateTraining(training); + return Ok(result); + } + + [Route("[action]")] + [HttpDelete] + [ProducesResponseType(typeof(Training), StatusCodes.Status200OK)] + public async Task DeleteTraining(string id) + { + var result = await _repository.DeleteTraining(id); + return Ok(result); + } + + [Route("[action]")] + [HttpGet] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetTrainingExercises(string trainingId) + { + var trainingExercises = _repository.GetTrainingExercises(trainingId); + return Ok(trainingExercises); + } + + [Route("[action]")] + [HttpGet] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetTrainingExercise(string id) + { + var trainingExercise = await _repository.GetTrainingExercise(id); + if (trainingExercise == null) + { + return NotFound(); + } + return Ok(trainingExercise); + } + + [Route("[action]")] + [HttpPost] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status201Created)] + public async Task CreateTrainingExercise(TrainingExercise trainingExercise) + { + await _repository.CreateTrainingExercise(trainingExercise); + return CreatedAtRoute("GetTrainingExercise", new { id = trainingExercise.Id} , trainingExercise); + } + + [Route("[action]")] + [HttpPut] + [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status200OK)] + public async Task UpdateTrainingExercise(TrainingExercise trainingExercises) + { + var result = await _repository.UpdateTrainingExercise(trainingExercises); + return Ok(result); + } + + [Route("[action]")] + [HttpDelete] + [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status200OK)] + public async Task DeleteTrainingExercise(string id) + { + var result = await _repository.DeleteTrainingExercise(id); + return Ok(result); + } } } \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/ITrainingRepository.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/ITrainingRepository.cs index 036ab5b..93fe8eb 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/ITrainingRepository.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/ITrainingRepository.cs @@ -5,7 +5,7 @@ namespace videoTrainingService.API.Repositories public interface ITrainingRepository { Task> GetExercises(string trainerId); - Task GetExercise(string name, string trainerId); + Task GetExercise(string id); Task CreateExercise(Exercise exercise); Task UpdateExercise(Exercise exercise); Task DeleteExercise(string id); @@ -16,8 +16,10 @@ public interface ITrainingRepository Task UpdateTraining(Training training); Task DeleteTraining(string id); Task> GetTrainingExercises(string trainingId); + Task GetTrainingExercise(string id); Task CreateTrainingExercise(TrainingExercise trainingExercise); Task UpdateTrainingExercise(TrainingExercise trainingExercise); - Task DeleteTrainingExercise(string trainingId, string id); + Task DeleteTrainingExercise(string id); + } } \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/TrainingRepository.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/TrainingRepository.cs index b5bcba1..4de40c9 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/TrainingRepository.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Repositories/TrainingRepository.cs @@ -18,9 +18,9 @@ public async Task> GetExercises(string trainerId) return await _context.Exercises.Find(p => p.TrainerId == trainerId).ToListAsync(); } - public async Task GetExercise(string name, string trainerId) + public async Task GetExercise(string id) { - return await _context.Exercises.Find(p => p.TrainerId == trainerId && p.Name == name).FirstOrDefaultAsync(); + return await _context.Exercises.Find(p => p.Id == id).FirstOrDefaultAsync(); } public async Task CreateExercise(Exercise exercise) @@ -77,6 +77,11 @@ public async Task> GetTrainingExercises(string tra return await _context.TrainingExercises.Find(p => p.TrainingId == trainingId).ToListAsync(); } + public async Task GetTrainingExercise(string id) + { + return await _context.TrainingExercises.Find(p => p.Id == id).FirstOrDefaultAsync(); + } + public async Task CreateTrainingExercise(TrainingExercise trainingExercise) { await _context.TrainingExercises.InsertOneAsync(trainingExercise); @@ -89,9 +94,9 @@ public async Task UpdateTrainingExercise(TrainingExercise trainingExercise return res.IsAcknowledged && res.ModifiedCount > 0; } - public async Task DeleteTrainingExercise(string trainingId, string id) + public async Task DeleteTrainingExercise(string id) { - var res = await _context.TrainingExercises.DeleteOneAsync(p => p.TrainingId == trainingId && p.ExerciseId == id); + var res = await _context.TrainingExercises.DeleteOneAsync(p => p.Id == id); return res.IsAcknowledged && res.DeletedCount > 0; } } From 4fe3250f18f1f33be1999b5e531a1981761f8b11 Mon Sep 17 00:00:00 2001 From: NataMata Date: Sun, 15 Dec 2024 22:20:53 +0100 Subject: [PATCH 071/118] Fix: fixed response types --- .../Controllers/TrainingContoroller.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs index a9df600..d31efbd 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs @@ -27,7 +27,7 @@ public async Task>> GetExercises(string train [Route("[action]")] [HttpGet] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(Exercise), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetExercise(string id) { @@ -41,7 +41,7 @@ public async Task> GetExercise(string id) [Route("[action]")] [HttpPost] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status201Created)] + [ProducesResponseType(typeof(Exercise), StatusCodes.Status201Created)] public async Task CreateExercise(Exercise exercise) { await _repository.CreateExercise(exercise); @@ -87,7 +87,7 @@ public async Task>> GetTrainingsForTrainer(st [Route("[action]")] [HttpGet] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(Training), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetTraining(string id) { @@ -101,7 +101,7 @@ public async Task> GetTraining(string id) [Route("[action]")] [HttpPost] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status201Created)] + [ProducesResponseType(typeof(Training), StatusCodes.Status201Created)] public async Task CreateTraining(Training training) { await _repository.CreateTraining(training); @@ -137,7 +137,7 @@ public async Task>> GetTrainingExerci [Route("[action]")] [HttpGet] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetTrainingExercise(string id) { @@ -151,7 +151,7 @@ public async Task> GetTrainingExercise(string id) [Route("[action]")] [HttpPost] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status201Created)] + [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status201Created)] public async Task CreateTrainingExercise(TrainingExercise trainingExercise) { await _repository.CreateTrainingExercise(trainingExercise); From dee220a688a22f5a07c1b3426535cfd6acec5409 Mon Sep 17 00:00:00 2001 From: NataMata Date: Sun, 12 Jan 2025 16:40:25 +0100 Subject: [PATCH 072/118] Add: added necessary middleware. --- .../videoTrainingService/videoTrainingService.API/Program.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs index ad76f8b..ac7068f 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs @@ -23,6 +23,10 @@ app.UseSwaggerUI(); } +app.UseHttpsRedirection(); + +app.UseAuthorization(); + app.MapControllers(); app.Run(); From e51764f70d5bc6245786e6122014808341bed1ca Mon Sep 17 00:00:00 2001 From: NataMata Date: Sun, 12 Jan 2025 18:03:08 +0100 Subject: [PATCH 073/118] Refactor: refactoring HTTP request attributes. --- .../Controllers/TrainingContoroller.cs | 67 +++++++------------ .../videoTrainingService.API/Program.cs | 4 +- 2 files changed, 27 insertions(+), 44 deletions(-) diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs index d31efbd..57e0539 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs @@ -15,18 +15,16 @@ public TrainingContoroller(ITrainingRepository repository) { _repository = repository ?? throw new ArgumentNullException(nameof(repository)); } - - [Route("[action]")] - [HttpGet] + + [HttpGet("exercises/{trainerId}")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] public async Task>> GetExercises(string trainerId) { var exercises = await _repository.GetExercises(trainerId); return Ok(exercises); } - - [Route("[action]")] - [HttpGet] + + [HttpGet("exercise/{id}")] [ProducesResponseType(typeof(Exercise), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetExercise(string id) @@ -39,36 +37,31 @@ public async Task> GetExercise(string id) return Ok(exercise); } - [Route("[action]")] - [HttpPost] + [HttpPost("exercise")] [ProducesResponseType(typeof(Exercise), StatusCodes.Status201Created)] - public async Task CreateExercise(Exercise exercise) + public async Task CreateExercise([FromBody] Exercise exercise) { await _repository.CreateExercise(exercise); return CreatedAtRoute("GetExercise", new { id = exercise.Id} , exercise); } - [Route("[action]")] - [HttpPut] + [HttpPut("exercise")] [ProducesResponseType(typeof(Exercise), StatusCodes.Status200OK)] - public async Task UpdateExercise(Exercise exercise) + public async Task UpdateExercise([FromBody] Exercise exercise) { var result = await _repository.UpdateExercise(exercise); return Ok(result); } - [Route("[action]")] - [HttpDelete] + [HttpDelete("exercise/{id}")] [ProducesResponseType(typeof(Exercise), StatusCodes.Status200OK)] public async Task DeleteExercise(string id) { var result = await _repository.DeleteExercise(id); return Ok(result); } - - [Route("[action]")] - [HttpGet] + [HttpGet("training/trainingClient/{clientId}")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] public async Task>> GetTrainingsForClient(string clientId) { @@ -76,8 +69,7 @@ public async Task>> GetTrainingsForClient(str return Ok(trainings); } - [Route("[action]")] - [HttpGet] + [HttpGet("training/trainingTrainer/{trainerId}")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] public async Task>> GetTrainingsForTrainer(string trainerId) { @@ -85,8 +77,7 @@ public async Task>> GetTrainingsForTrainer(st return Ok(trainings); } - [Route("[action]")] - [HttpGet] + [HttpGet("training/{id}")] [ProducesResponseType(typeof(Training), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetTraining(string id) @@ -99,26 +90,23 @@ public async Task> GetTraining(string id) return Ok(training); } - [Route("[action]")] - [HttpPost] + [HttpPost("training")] [ProducesResponseType(typeof(Training), StatusCodes.Status201Created)] - public async Task CreateTraining(Training training) + public async Task CreateTraining([FromBody] Training training) { await _repository.CreateTraining(training); return CreatedAtRoute("GetTraining", new { id = training.TrainingId} , training); } - [Route("[action]")] - [HttpPut] + [HttpPut("training")] [ProducesResponseType(typeof(Training), StatusCodes.Status200OK)] - public async Task UpdateTraining(Training training) + public async Task UpdateTraining([FromBody] Training training) { var result = await _repository.UpdateTraining(training); return Ok(result); } - [Route("[action]")] - [HttpDelete] + [HttpDelete("training/{id}")] [ProducesResponseType(typeof(Training), StatusCodes.Status200OK)] public async Task DeleteTraining(string id) { @@ -126,8 +114,7 @@ public async Task DeleteTraining(string id) return Ok(result); } - [Route("[action]")] - [HttpGet] + [HttpGet("trainingExercises/{trainingId}")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] public async Task>> GetTrainingExercises(string trainingId) { @@ -135,8 +122,7 @@ public async Task>> GetTrainingExerci return Ok(trainingExercises); } - [Route("[action]")] - [HttpGet] + [HttpGet("trainingExercise/{id}")] [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetTrainingExercise(string id) @@ -149,26 +135,23 @@ public async Task> GetTrainingExercise(string id) return Ok(trainingExercise); } - [Route("[action]")] - [HttpPost] + [HttpPost("trainingExercise")] [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status201Created)] - public async Task CreateTrainingExercise(TrainingExercise trainingExercise) + public async Task CreateTrainingExercise([FromBody] TrainingExercise trainingExercise) { await _repository.CreateTrainingExercise(trainingExercise); return CreatedAtRoute("GetTrainingExercise", new { id = trainingExercise.Id} , trainingExercise); } - - [Route("[action]")] - [HttpPut] + + [HttpPut("trainingExercise")] [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status200OK)] - public async Task UpdateTrainingExercise(TrainingExercise trainingExercises) + public async Task UpdateTrainingExercise([FromBody] TrainingExercise trainingExercises) { var result = await _repository.UpdateTrainingExercise(trainingExercises); return Ok(result); } - [Route("[action]")] - [HttpDelete] + [HttpDelete("trainingExercise/{id}")] [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status200OK)] public async Task DeleteTrainingExercise(string id) { diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs index ac7068f..34b46bf 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs @@ -23,9 +23,9 @@ app.UseSwaggerUI(); } -app.UseHttpsRedirection(); +//app.UseHttpsRedirection(); -app.UseAuthorization(); +//app.UseAuthorization(); app.MapControllers(); From 9016c4345782951d6855633f0f5835336dd4eb4c Mon Sep 17 00:00:00 2001 From: NataMata Date: Thu, 16 Jan 2025 12:41:34 +0100 Subject: [PATCH 074/118] Fix: changed attributes due to routing error. --- .../Controllers/TrainingContoroller.cs | 12 ++++++------ .../videoTrainingService.API/Program.cs | 6 +----- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs index 57e0539..8aee646 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs @@ -24,7 +24,7 @@ public async Task>> GetExercises(string train return Ok(exercises); } - [HttpGet("exercise/{id}")] + [HttpGet("exercise/{id}", Name = "GetExercise")] [ProducesResponseType(typeof(Exercise), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetExercise(string id) @@ -61,7 +61,7 @@ public async Task DeleteExercise(string id) return Ok(result); } - [HttpGet("training/trainingClient/{clientId}")] + [HttpGet("training/trainingClient/{clientId}", Name = "GetTrainingsForClient")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] public async Task>> GetTrainingsForClient(string clientId) { @@ -69,7 +69,7 @@ public async Task>> GetTrainingsForClient(str return Ok(trainings); } - [HttpGet("training/trainingTrainer/{trainerId}")] + [HttpGet("training/trainingTrainer/{trainerId}", Name = "GetTrainingsForTrainer")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] public async Task>> GetTrainingsForTrainer(string trainerId) { @@ -77,7 +77,7 @@ public async Task>> GetTrainingsForTrainer(st return Ok(trainings); } - [HttpGet("training/{id}")] + [HttpGet("training/{id}", Name = "GetTraining")] [ProducesResponseType(typeof(Training), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetTraining(string id) @@ -114,7 +114,7 @@ public async Task DeleteTraining(string id) return Ok(result); } - [HttpGet("trainingExercises/{trainingId}")] + [HttpGet("trainingExercises/{trainingId}", Name = "GetTrainingExercises")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] public async Task>> GetTrainingExercises(string trainingId) { @@ -122,7 +122,7 @@ public async Task>> GetTrainingExerci return Ok(trainingExercises); } - [HttpGet("trainingExercise/{id}")] + [HttpGet("trainingExercise/{id}", Name = "GetTrainingExercise")] [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetTrainingExercise(string id) diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs index 34b46bf..ca3d35f 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs @@ -23,11 +23,7 @@ app.UseSwaggerUI(); } -//app.UseHttpsRedirection(); - -//app.UseAuthorization(); - +app.UseHttpsRedirection(); app.MapControllers(); - app.Run(); From 6516db87146161655e6021405fd28ecfc6a44df4 Mon Sep 17 00:00:00 2001 From: NataMata Date: Mon, 20 Jan 2025 12:10:25 +0100 Subject: [PATCH 075/118] New: service containerization. --- .../videoTrainingService.API/Dockerfile | 23 +++++++++++ .../Properties/launchSettings.json | 41 +++++++++++-------- .../Backend/docker-compose.development.yml | 20 ++++++++- Fitness/Backend/docker-compose.yml | 12 ++++++ Fitness/Backend/launchSettings.json | 3 +- 5 files changed, 80 insertions(+), 19 deletions(-) create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Dockerfile diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Dockerfile b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Dockerfile new file mode 100644 index 0000000..84d1a98 --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Dockerfile @@ -0,0 +1,23 @@ +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +USER $APP_UID +WORKDIR /app +EXPOSE 8080 +EXPOSE 8081 + +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj", "Services/videoTrainingService/videoTrainingService.API/"] +RUN dotnet restore "Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj" +COPY . . +WORKDIR "/src/Services/videoTrainingService/videoTrainingService.API" +RUN dotnet build "videoTrainingService.API.csproj" -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "videoTrainingService.API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "videoTrainingService.API.dll"] diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Properties/launchSettings.json b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Properties/launchSettings.json index 9363734..4f55feb 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Properties/launchSettings.json +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Properties/launchSettings.json @@ -1,13 +1,4 @@ { - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:21255", - "sslPort": 44336 - } - }, "profiles": { "http": { "commandName": "Project", @@ -19,23 +10,41 @@ "ASPNETCORE_ENVIRONMENT": "Development" } }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, + "IIS Express": { + "commandName": "IISExpress", "launchBrowser": true, "launchUrl": "swagger", - "applicationUrl": "https://localhost:7270;http://localhost:5275", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, - "IIS Express": { - "commandName": "IISExpress", + "VideoTrainingService.API": { + "commandName": "Project", "launchBrowser": true, "launchUrl": "swagger", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" - } + }, + "applicationUrl": "http://localhost:5004" + }, + "Container (Dockerfile)": { + "commandName": "Docker", + "launchBrowser": true, + "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger", + "environmentVariables": { + "ASPNETCORE_HTTP_PORTS": "8080" + }, + "publishAllPorts": true + } + }, + + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:21255", + "sslPort": 44336 } } } diff --git a/Fitness/Backend/docker-compose.development.yml b/Fitness/Backend/docker-compose.development.yml index ad7b071..82a90c7 100644 --- a/Fitness/Backend/docker-compose.development.yml +++ b/Fitness/Backend/docker-compose.development.yml @@ -30,6 +30,14 @@ services: - "27020:27017" volumes: - paymentmongo_data:/data/db + + videotrainingdb: + container_name: videotrainingdb + restart: always + ports: + - 27021:27017 + volumes: + - videotrainingmongo_data:/data/db notificationdb: container_name: notificationdb @@ -103,7 +111,7 @@ services: environment: - ASPNETCORE_ENVIRONMENT=Development - "DatabaseSettings:ConnectionString=mongodb://trainerdb:27017" - - "GrpcSettings:ReviewUrl=http://reviewservice.grpc:8080" + - "GrpcSettings:ReviewUrl=http://host.docker.internal:8002" - "EventBusSettings:HostAddress=amqp://guest:guest@rabbitmq:5672" ports: - "8000:8080" @@ -212,4 +220,12 @@ services: - "DatabaseSettings:ConnectionString=mongodb://reservationdb:27017" - "EventBusSettings:HostAddress=amqp://guest:guest@rabbitmq:5672" ports: - - "8103:8080" \ No newline at end of file + - "8103:8080" + + videotrainingservice.api: + container_name: videotrainingservice.api + environment: + - ASPNETCORE_ENVIRONMENT=Development + - "DatabaseSetting:ConnectionString=mongodb://videotrainingdb:27017" + ports: + - "8007:8080" \ No newline at end of file diff --git a/Fitness/Backend/docker-compose.yml b/Fitness/Backend/docker-compose.yml index 8e6fa10..cc79d79 100644 --- a/Fitness/Backend/docker-compose.yml +++ b/Fitness/Backend/docker-compose.yml @@ -20,6 +20,9 @@ services: reservationdb: image: mongo + videotrainingdb: + image: mongo + analyticsdb: image: mongo @@ -151,6 +154,14 @@ services: - rabbitmq - consul + videotrainingservice.api: + image: ${DOCKER_REGISTRY-}videotrainingserviceapi + build: + context: . + dockerfile: Services/videoTrainingService/videoTrainingService.API/Dockerfile + depends_on: + - videotrainingdb + volumes: trainermongo_data: clientmongo_data: @@ -160,6 +171,7 @@ volumes: notificationmongo_data: chatmongo_data: reservationmongo_data: + videotrainingmongo_data: mssql_data: mssql_volume: consul_data: diff --git a/Fitness/Backend/launchSettings.json b/Fitness/Backend/launchSettings.json index 59bfdea..608c8a9 100644 --- a/Fitness/Backend/launchSettings.json +++ b/Fitness/Backend/launchSettings.json @@ -8,7 +8,8 @@ "clientservice.api": "StartDebugging", "reviewservice.api": "StartDebugging", "reviewservice.grpc": "StartDebugging", - "paymentservice.api": "StartDebugging" + "paymentservice.api": "StartDebugging", + "videotrainingservice.api": "StartDebugging" } } } From caf576c6aacd7185a357a46df091bcedb71828b4 Mon Sep 17 00:00:00 2001 From: NataMata Date: Thu, 30 Jan 2025 12:06:59 +0100 Subject: [PATCH 076/118] New: added navigation to blank pages for video training service for both client and trainer. #57 --- Fitness/Frontend/src/_nav.js | 14 +++++++++++++ Fitness/Frontend/src/router/index.js | 20 ++++++++++++------- .../src/views/pages/VideoTrainings.vue | 13 ++++++++++++ 3 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 Fitness/Frontend/src/views/pages/VideoTrainings.vue diff --git a/Fitness/Frontend/src/_nav.js b/Fitness/Frontend/src/_nav.js index 79c1d87..6e3ecbf 100644 --- a/Fitness/Frontend/src/_nav.js +++ b/Fitness/Frontend/src/_nav.js @@ -25,6 +25,14 @@ export function generateTrainerNav(id) { to: `/trainer/${id}/chat`, icon: 'cil-speech', }, + + { + component: 'CNavItem', + name: 'Video trainings', + to: `/trainer/${id}/videotrainings`, + icon: 'cil-user' + }, + { component: 'CNavItem', name: 'Analytics', @@ -60,6 +68,12 @@ export function generateClientNav(id) { to: `/client/${id}/chat`, icon: 'cil-speech' }, + { + component: 'CNavItem', + name: 'Video trainings', + to: `/client/${id}/videotrainings`, + icon: 'cil-user' + }, { component: 'CNavItem', name: 'Analytics', diff --git a/Fitness/Frontend/src/router/index.js b/Fitness/Frontend/src/router/index.js index bb06ce1..a74bc96 100644 --- a/Fitness/Frontend/src/router/index.js +++ b/Fitness/Frontend/src/router/index.js @@ -58,12 +58,6 @@ const routes = [ component: () => import('@/views/pages/TrainerGroupTrainings.vue') }, - { - path: '/trainer/:id/groupTrainings', - name: 'Trainer Group Trainings', - component: () => import('@/views/pages/TrainerGroupTrainings.vue') - }, - { path: '/client/:id/individualTrainings', name: 'Client Individual Trainings', @@ -100,6 +94,18 @@ const routes = [ component: () => import('@/views/pages/ClientChat.vue'), }, + { + path: '/client/:id/videotrainings', + name: 'Video Trainings', + component: () => import('@/views/pages/VideoTrainings.vue') + }, + + { + path: '/trainer/:id/videotrainings', + name: 'Video Trainings', + component: () => import('@/views/pages/VideoTrainings.vue') + } + { path: '/client/:id/pay-chat/:trainerId', name: 'PayChat', @@ -160,7 +166,7 @@ router.beforeEach(async (to, from) => { var token = sessionStorage.getItem('accessToken'); if ((token && token != 'null') || to.path == '/login' || to.path == '/registration') { - + return true; } else { diff --git a/Fitness/Frontend/src/views/pages/VideoTrainings.vue b/Fitness/Frontend/src/views/pages/VideoTrainings.vue new file mode 100644 index 0000000..3a9c38b --- /dev/null +++ b/Fitness/Frontend/src/views/pages/VideoTrainings.vue @@ -0,0 +1,13 @@ + + + + + From 226768f3fea429be7a204b348a7f84363a992b6a Mon Sep 17 00:00:00 2001 From: NataMata Date: Tue, 4 Feb 2025 09:23:52 +0100 Subject: [PATCH 077/118] Fix: name refactoring. --- .../Controllers/TrainingController.cs | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingController.cs diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingController.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingController.cs new file mode 100644 index 0000000..c0276e5 --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingController.cs @@ -0,0 +1,162 @@ +using Microsoft.AspNetCore.Mvc; +using videoTrainingService.API.Entities; +using videoTrainingService.API.Repositories; + +namespace videoTrainingService.API.Controllers +{ + [ApiController] + [Route("api/v1/[controller]")] + + public class TrainingController : ControllerBase + { + private readonly ITrainingRepository _repository; + + public TrainingController(ITrainingRepository repository) + { + _repository = repository ?? throw new ArgumentNullException(nameof(repository)); + } + + [HttpGet("exercises/{trainerId}")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetExercises(string trainerId) + { + var exercises = await _repository.GetExercises(trainerId); + return Ok(exercises); + } + + [HttpGet("exercise/{id}", Name = "GetExercise")] + [ProducesResponseType(typeof(Exercise), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetExercise(string id) + { + var exercise = await _repository.GetExercise(id); + if (exercise == null) + { + return NotFound(); + } + return Ok(exercise); + } + + [HttpPost("exercise")] + [ProducesResponseType(typeof(Exercise), StatusCodes.Status201Created)] + public async Task CreateExercise([FromBody] Exercise exercise) + { + await _repository.CreateExercise(exercise); + return CreatedAtRoute("GetExercise", new { id = exercise.Id} , exercise); + } + + [HttpPut("exercise")] + [ProducesResponseType(typeof(Exercise), StatusCodes.Status200OK)] + public async Task UpdateExercise([FromBody] Exercise exercise) + { + var result = await _repository.UpdateExercise(exercise); + return Ok(result); + } + + [HttpDelete("exercise/{id}")] + [ProducesResponseType(typeof(Exercise), StatusCodes.Status200OK)] + public async Task DeleteExercise(string id) + { + var result = await _repository.DeleteExercise(id); + return Ok(result); + } + + [HttpGet("training/trainingClient/{clientId}", Name = "GetTrainingsForClient")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetTrainingsForClient(string clientId) + { + var trainings = await _repository.GetTrainingsForClient(clientId); + return Ok(trainings); + } + + [HttpGet("training/trainingTrainer/{trainerId}", Name = "GetTrainingsForTrainer")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetTrainingsForTrainer(string trainerId) + { + var trainings = await _repository.GetTrainingsForTrainer(trainerId); + return Ok(trainings); + } + + [HttpGet("training/{id}", Name = "GetTraining")] + [ProducesResponseType(typeof(Training), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetTraining(string id) + { + var training = await _repository.GetTraining(id); + if (training == null) + { + return NotFound(); + } + return Ok(training); + } + + [HttpPost("training")] + [ProducesResponseType(typeof(Training), StatusCodes.Status201Created)] + public async Task CreateTraining([FromBody] Training training) + { + await _repository.CreateTraining(training); + return CreatedAtRoute("GetTraining", new { id = training.TrainingId} , training); + } + + [HttpPut("training")] + [ProducesResponseType(typeof(Training), StatusCodes.Status200OK)] + public async Task UpdateTraining([FromBody] Training training) + { + var result = await _repository.UpdateTraining(training); + return Ok(result); + } + + [HttpDelete("training/{id}")] + [ProducesResponseType(typeof(Training), StatusCodes.Status200OK)] + public async Task DeleteTraining(string id) + { + var result = await _repository.DeleteTraining(id); + return Ok(result); + } + + [HttpGet("trainingExercises/{trainingId}", Name = "GetTrainingExercises")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task>> GetTrainingExercises(string trainingId) + { + var trainingExercises = await _repository.GetTrainingExercises(trainingId); + return Ok(trainingExercises); + } + + [HttpGet("trainingExercise/{id}", Name = "GetTrainingExercise")] + [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetTrainingExercise(string id) + { + var trainingExercise = await _repository.GetTrainingExercise(id); + if (trainingExercise == null) + { + return NotFound(); + } + return Ok(trainingExercise); + } + + [HttpPost("trainingExercise")] + [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status201Created)] + public async Task CreateTrainingExercise([FromBody] TrainingExercise trainingExercise) + { + await _repository.CreateTrainingExercise(trainingExercise); + return CreatedAtRoute("GetTrainingExercise", new { id = trainingExercise.Id} , trainingExercise); + } + + [HttpPut("trainingExercise")] + [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status200OK)] + public async Task UpdateTrainingExercise([FromBody] TrainingExercise trainingExercises) + { + var result = await _repository.UpdateTrainingExercise(trainingExercises); + return Ok(result); + } + + [HttpDelete("trainingExercise/{id}")] + [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status200OK)] + public async Task DeleteTrainingExercise(string id) + { + var result = await _repository.DeleteTrainingExercise(id); + return Ok(result); + } + } +} \ No newline at end of file From f77ed125cecc4306d5418bdd785f4b5a72683e16 Mon Sep 17 00:00:00 2001 From: NataMata Date: Tue, 4 Feb 2025 19:36:16 +0100 Subject: [PATCH 078/118] Test: checkout test. --- Fitness/Backend/.config/dotnet-tools.json | 13 + .../20241129113928_Initial.Designer.cs | 342 ++++++++++++++++++ .../Migrations/20241129113928_Initial.cs | 265 ++++++++++++++ .../Frontend/src/assets/images/dumbbells.jpg | Bin 0 -> 362800 bytes .../src/assets/images/fitplusplus.jpeg | Bin 0 -> 9927 bytes Fitness/Frontend/src/assets/images/home.jpeg | Bin 0 -> 10312 bytes .../Frontend/src/assets/images/running.jpeg | Bin 0 -> 7058 bytes .../Frontend/src/assets/images/strength.jpg | Bin 0 -> 114482 bytes Fitness/Frontend/src/assets/images/yoga.jpg | Bin 0 -> 61019 bytes 9 files changed, 620 insertions(+) create mode 100644 Fitness/Backend/.config/dotnet-tools.json create mode 100644 Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.Designer.cs create mode 100644 Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.cs create mode 100644 Fitness/Frontend/src/assets/images/dumbbells.jpg create mode 100644 Fitness/Frontend/src/assets/images/fitplusplus.jpeg create mode 100644 Fitness/Frontend/src/assets/images/home.jpeg create mode 100644 Fitness/Frontend/src/assets/images/running.jpeg create mode 100644 Fitness/Frontend/src/assets/images/strength.jpg create mode 100644 Fitness/Frontend/src/assets/images/yoga.jpg diff --git a/Fitness/Backend/.config/dotnet-tools.json b/Fitness/Backend/.config/dotnet-tools.json new file mode 100644 index 0000000..4f48799 --- /dev/null +++ b/Fitness/Backend/.config/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "9.0.0", + "commands": [ + "dotnet-ef" + ], + "rollForward": false + } + } +} \ No newline at end of file diff --git a/Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.Designer.cs b/Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.Designer.cs new file mode 100644 index 0000000..ab3f3c3 --- /dev/null +++ b/Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.Designer.cs @@ -0,0 +1,342 @@ +// +using System; +using IdentityServer.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace IdentityServer.Migrations +{ + [DbContext(typeof(ApplicationContext))] + [Migration("20241129113928_Initial")] + partial class Initial + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("IdentityServer.Entities.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ExpiryTime") + .HasColumnType("datetime2"); + + b.Property("Token") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("IdentityServer.Entities.User", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("bit"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("LockoutEnabled") + .HasColumnType("bit"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("bit"); + + b.Property("SecurityStamp") + .HasColumnType("nvarchar(max)"); + + b.Property("TwoFactorEnabled") + .HasColumnType("bit"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles", (string)null); + + b.HasData( + new + { + Id = "b87c880c-bc30-4e20-ab81-5d22e55b093b", + Name = "Admin", + NormalizedName = "ADMIN" + }, + new + { + Id = "6273c7e7-7430-4ddc-8a3c-71948427c459", + Name = "Trainer", + NormalizedName = "TRAINER" + }, + new + { + Id = "298871fd-917c-42e9-9a4d-b5a0ba262fe7", + Name = "Client", + NormalizedName = "CLIENT" + }); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("nvarchar(450)"); + + b.Property("ProviderKey") + .HasColumnType("nvarchar(450)"); + + b.Property("ProviderDisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("LoginProvider") + .HasColumnType("nvarchar(450)"); + + b.Property("Name") + .HasColumnType("nvarchar(450)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("IdentityServer.Entities.RefreshToken", b => + { + b.HasOne("IdentityServer.Entities.User", null) + .WithMany("RefreshTokens") + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("IdentityServer.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("IdentityServer.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("IdentityServer.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("IdentityServer.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("IdentityServer.Entities.User", b => + { + b.Navigation("RefreshTokens"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.cs b/Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.cs new file mode 100644 index 0000000..c821a45 --- /dev/null +++ b/Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.cs @@ -0,0 +1,265 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional + +namespace IdentityServer.Migrations +{ + /// + public partial class Initial : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AspNetRoles", + columns: table => new + { + Id = table.Column(type: "nvarchar(450)", nullable: false), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetRoles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AspNetUsers", + columns: table => new + { + Id = table.Column(type: "nvarchar(450)", nullable: false), + FirstName = table.Column(type: "nvarchar(max)", nullable: false), + LastName = table.Column(type: "nvarchar(max)", nullable: false), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + EmailConfirmed = table.Column(type: "bit", nullable: false), + PasswordHash = table.Column(type: "nvarchar(max)", nullable: true), + SecurityStamp = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true), + PhoneNumber = table.Column(type: "nvarchar(max)", nullable: true), + PhoneNumberConfirmed = table.Column(type: "bit", nullable: false), + TwoFactorEnabled = table.Column(type: "bit", nullable: false), + LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), + LockoutEnabled = table.Column(type: "bit", nullable: false), + AccessFailedCount = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AspNetRoleClaims", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + RoleId = table.Column(type: "nvarchar(450)", nullable: false), + ClaimType = table.Column(type: "nvarchar(max)", nullable: true), + ClaimValue = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); + table.ForeignKey( + name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", + column: x => x.RoleId, + principalTable: "AspNetRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserClaims", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + UserId = table.Column(type: "nvarchar(450)", nullable: false), + ClaimType = table.Column(type: "nvarchar(max)", nullable: true), + ClaimValue = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); + table.ForeignKey( + name: "FK_AspNetUserClaims_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserLogins", + columns: table => new + { + LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), + ProviderKey = table.Column(type: "nvarchar(450)", nullable: false), + ProviderDisplayName = table.Column(type: "nvarchar(max)", nullable: true), + UserId = table.Column(type: "nvarchar(450)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); + table.ForeignKey( + name: "FK_AspNetUserLogins_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserRoles", + columns: table => new + { + UserId = table.Column(type: "nvarchar(450)", nullable: false), + RoleId = table.Column(type: "nvarchar(450)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); + table.ForeignKey( + name: "FK_AspNetUserRoles_AspNetRoles_RoleId", + column: x => x.RoleId, + principalTable: "AspNetRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AspNetUserRoles_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserTokens", + columns: table => new + { + UserId = table.Column(type: "nvarchar(450)", nullable: false), + LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), + Name = table.Column(type: "nvarchar(450)", nullable: false), + Value = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); + table.ForeignKey( + name: "FK_AspNetUserTokens_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "RefreshTokens", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Token = table.Column(type: "nvarchar(max)", nullable: false), + ExpiryTime = table.Column(type: "datetime2", nullable: false), + UserId = table.Column(type: "nvarchar(450)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_RefreshTokens", x => x.Id); + table.ForeignKey( + name: "FK_RefreshTokens_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id"); + }); + + migrationBuilder.InsertData( + table: "AspNetRoles", + columns: new[] { "Id", "ConcurrencyStamp", "Name", "NormalizedName" }, + values: new object[,] + { + { "298871fd-917c-42e9-9a4d-b5a0ba262fe7", null, "Client", "CLIENT" }, + { "6273c7e7-7430-4ddc-8a3c-71948427c459", null, "Trainer", "TRAINER" }, + { "b87c880c-bc30-4e20-ab81-5d22e55b093b", null, "Admin", "ADMIN" } + }); + + migrationBuilder.CreateIndex( + name: "IX_AspNetRoleClaims_RoleId", + table: "AspNetRoleClaims", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "RoleNameIndex", + table: "AspNetRoles", + column: "NormalizedName", + unique: true, + filter: "[NormalizedName] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserClaims_UserId", + table: "AspNetUserClaims", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserLogins_UserId", + table: "AspNetUserLogins", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserRoles_RoleId", + table: "AspNetUserRoles", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "EmailIndex", + table: "AspNetUsers", + column: "NormalizedEmail"); + + migrationBuilder.CreateIndex( + name: "UserNameIndex", + table: "AspNetUsers", + column: "NormalizedUserName", + unique: true, + filter: "[NormalizedUserName] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_RefreshTokens_UserId", + table: "RefreshTokens", + column: "UserId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AspNetRoleClaims"); + + migrationBuilder.DropTable( + name: "AspNetUserClaims"); + + migrationBuilder.DropTable( + name: "AspNetUserLogins"); + + migrationBuilder.DropTable( + name: "AspNetUserRoles"); + + migrationBuilder.DropTable( + name: "AspNetUserTokens"); + + migrationBuilder.DropTable( + name: "RefreshTokens"); + + migrationBuilder.DropTable( + name: "AspNetRoles"); + + migrationBuilder.DropTable( + name: "AspNetUsers"); + } + } +} diff --git a/Fitness/Frontend/src/assets/images/dumbbells.jpg b/Fitness/Frontend/src/assets/images/dumbbells.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b739c07f864bd0cf3415a8f103a7b1f16490f82 GIT binary patch literal 362800 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

`i!A>0JO4CIhhbgIC74zK>bwyUC zBlXmR=3MHq`g@3}X`7V^7s_cyKC^*6GUMk7^|;0g$}$f=6HJeLpJ1Lx2~e5ChP67W zL1~-Hjc3o2mo(+*JiYh*|4Klw9wzz~t=^X0m#XkgC;X3Z*XZbfF!No*adt8?7auCM z_&72t`uRfUE`4Q1@)etR$<~*uD>IEpwt-l>Tz|Oh3xOC~A6=7H&~wf$U5(3De{#$w zlWvrSATIR$1G+agNV^c`Z|Y=L3gcgd>d449l84sb8e{8 zt8-sIkg0q07}3XqY#sIx{jRF8A$D6jb&m3#856~N@{(;-j8@^fdj2e4!d&WUIeJFP zug_$BNXYH?w1`yr{Xx`u-ylEc{T927@D!2uMHvZJN)oB3mzxFkxliz!e5BhJqHoVI zq0%AyaxB+zm$Pg>^EH#3HONvle_z!X{iHT2*0M6#i#c&YRQ)~%@_&fhAX;TS3cwBIYq$TF6@=&5EScORb~BIg+{?A?KD`%edf`{Vv-Wr zmhXN~VoNS`4L5|9-CY!Tp~(XOyMZ(gycPcByRTbe#7Uis@3Xo9{{yvTJtnC0G|*I( z3dp`$^_T5b^Zff{ZfoXazDq6Iu)u8+f7to7z#zf!zrj2j3FrCCWy4%d+uxSZt&?r% zapA0CWm+zCvS7q$*GQZO$5yTGk<$a*iI>ALBW!6sa$W&f;POI{*||oRVr2(-;RHiu zqX(JJ1nq&}XT_W=%uBp;^`|j;lFt|`$*77BS3steQ@;ny!!O;9Jvbe5Jc>|wR;^%Z zp5_&lV>DS!Jvi;Tn*&~VjWnD2CkOLnL}pdPBkv`p=I2ql871AHO1#A8W8%l6>w+iW zNZBDSIIcN;KA^yaQzPAu|`W|EUFSUMY}syX~BQGS~jIh&O#(kKZA zJIrB%mb5Qqh*us1n&^YV--Q!cH0#UG#E=W!Zpy(0RdeRG)2>|(lijjuRiy)zNx0% zN0IjrfAY8Nc#eC5Nk7Vwx@Eb=CYzD-X*k&@!3n{~v7-Bcuya*jL6CAiq#^)8`wSaw z{XTj`*H1AR1DSm#oc`n26A!}kZIN0#O z(!e_;i(g~-Qi1fNb$#|);bm9I$t6{|Y`XnniTKtbu@fypMJKC2yUfwPY5S1oSGH-X z7&-6QrJ8Ms*Iz3v>kY$ec*sY|mo~ly+qzp$M3(O=9{XjSI@$y5Qn)c7@Ou)Xo>$s$ zin;N~>D5z)v>G8=)PJ2UTqfoRYW##41oyOMmKQb2l@IKhFjIcZ1Ji!R9{2Z|K1pCb z3w`;I_&{2-r$Q@C2nYS}fgA4)9vU_Dx85Z)XN<_*);*7!UMX2OzDQ;%7>?Y<)}KY& z>vi|&KU%*bY^}+9B%#T?XH%u=+@igLPYf3oo~b8|grZX-FT82u6SAXDVCBz*U1?$) zFP_>CWj|7a30{?%w8EPe3ZZCahB>j(9!v6yf*&gqjErg@9VoLjIN^^6_^I3KniKFz zi%ShFZNh|Nf+u=s)V?qR*=BU6a07q<4geR98P*&_yEQbn zwS=iWMX_>3#Dk1v85|OmF<<*XzMbcMcWFp*M|asT*Hnw;j)?3@hFxyw%=QYQ3|uq6 zJK@6qJ#nOLg-K3r&0g$pWiyfjmo=RaEmhVuh5*Dl%P-*749FUI2$MYDvmPX0h$wURxG%6 zH7;nW;eve#@8t%Gm8HgYWUE&B##Dj;wY-Tjx@G2o!0Mo{?m{|LaRyRTrT@8pHTd5D zcX`)$xew&;{AY5=mQvGsrR_y7S0{W)Il}oia1FX(m-a3%k+4L8ug6SdVg`RNru5(O zKZ&`B{>gZEl`Owmt}er7WvkgC{mm1MqwB`vD~+kQ%=Zlgh<50<2SA&##ZQbiTJ#HV z%NNY>Yt4)NV@biCSM=b1VwfK zl9Z_2=)iysQMoRbupcG3=(z|gwV{VP+9H?^=|gGwGgk8*FC^B^FDkalvBw>pW|AWIGHAdT!dh%EclH}WGiyg% zq}G8o`ze8sRC6=mEziNt{{VnjOI_i(-16n`BuXqu=V~rY=%-6Dho+rF_P5VlN&NI_ zWCWW;k6rKULW0&La;Gf&?nJoGR7|$#!pPKa3nC*dp5oO+@nD3kMD+P)K6=UZzh8G= zJ>OB1hLj@Wwlanw8Xn$Zvg5J^O_qlRB_=#A>94}EJA_FqSeVToprfm!lnqdzM89{K z!kfH=8i#lW!nb3VqQX6eJMCh_wBw*c#ubZ}_l6br!M1;NvXo2tiV?FDE_~89Z#Gp1 zPWagV0E(h3mAO%FRKCzDgD6Uk{_%R%%OmEYm^t~PXZXSDGXlY_J+HF7C`psI+rmUA zSlx=}QG&ue@czA?(q!G6-E`x)_KbF&g-w5G+CbJ#k0D%Rns6tYKNy1+gL9x9zY+Sx zgP5{NTY`xc{^lv7V~_>!ZPx7-%wyBvAC`t~hh1qMquUl3PbbPcG-neA>HWc3d>mzB zf=u~c`wO$wFE(H}6=tiyTFs19Jzg>Rdv*q;)c>rCPnrkeMv}$pd4VnKRC-JhEQRBj zGVaB*Wcc)~uJP~Esvv$u;AbkmCatQxQrFApz5r1L`n-dc1~!^ zqFIb<$N9%skGw=b6FgURSSS8nc6)A>tbZC?=l9}_xx2cJ{HY`6HD=KQDu=if-`3q- zV~22q{%=c?cNQ0>%}Egf7Dna+Mv$YDmf>AfS(c?+k>XdRoKcd~)9A~SZJS%>ank>c zO^O=D9tY9G1BQBK+CWMA?nt-n+)Tm_jUi4b8us9tOr~Iq-WsW@M5@1fQF38_I zR;lx(ih21_g)skg;+O9{@66E(Vp6g84Ex*amge{IjhbnUI2d=zp@`OtKfkGDj z0?tHP$NWn?)*NM-sz|=W7mc4*6!@BfD~#DS(cL|fY^UNqQ_`t80N zhU9z7%=Qg=ZZD&p6Q8c9Y=|XtGHOc2B1SRw9n_enr!*JOs=%b^`KryA$|lr#wR36w zNw_6}qTsAO)x^3s_#0631^vB0Q`m(Ajeqf?Q8Hof4h&oJFegDbv2-rGSlQ+`*Y;Za9j^6N$ z8}n^}5h`p0%ZZ3{7~hkRDoW2(s^l00jJ62*6^<#I8H*PnU-i>f9NZ^`o^@ZsOz=kC zt1wpQK)JXhuhuPSB^C$dz@$X0Ha^8~QZgiaNIJRF+EBZ9^`~Q1Tm)Y3i^mHmkOO)c z{&GL(Sb8nKkLgQfj_`V9OEf7<(BZq6wDWem)zb{i!4oH3Q&VSViyEF$DeuF*#H2PW z^Lci&fp&5ZRuk6r=-}w&s>QWx~tywLY@q3b~g>@Dk<+oJtc&%N+;H_S# zDJNC_NUdKb|5=j1l>_U$>NAu706`q^?f`MMXa^b&`HRXoeiA-l|HjT#z^X``;M?T8 zA*l!3P)Gg(y=;e>`@1&`f{Fq`PFp;<8$cQnd1$xr8vus3~tM$mvGV5ON zCtw&ff0A1gkawF)YUGIJTvGz3VaFf|l^%N8d|~G3n-s(W%T2AMrHt<7^aiQf%MQa9 zMNya48D`;a$>q8#x(Sl^)7Z~I}X{-0_Qp_!q%)MqxG*Q<8jFae$4lOZ#R8k@A>~^-GD28=6r!+7nu4d!_ za#&3#2=vLK?#_Q(lSRP+E&t;)EG~K%{j0E}<9I{u`xbvpaY)?-D+!Z5n_B^0ESRXp zx$?r%fIOTjVata9Sy9PRe1tXNp}&&E=RK`6!ED6!c0!1qXOvl7p zr!<*};Qh=_!GC7}@MJTk#~R+?W|?~#X`t81Ou?gs(uu%*nTNVfiN)y|;wf`7*l&3> z?96Qur6AX};PSY*mCe%#?k2NEy%oKa6lZGeOv2CY^PP+0CA`Z0T<;frD5OhIeGVbv zQ*MrVrI-xC)LMVUIc4cv=9PqBx!$a-)m$dyu#gm})Rb8*B*9wDFk~#VVWx@_J{}T} zhj{$@9fnT0(iiopy^R#&BcbF*D7V@ku+#r8g31+hf0Z5kRlX~Hh}UX4P(*Th?wgIDN?;`n zf8NL`8RglhDGBmnm2dRbDzCY}C(QV5nWa`-0lM>2%2uEz*CwG)MCB{D97F!QUVew} z^Pw#u2JLuFoqi62)R4F(H~40&*RMmgV3)itWJbNVZ(6P4GTWGICFR+##%n+A$Yj}U zFac*X47<$&Ll2}cU5M3)n~^PAA(ikU6Rf{Efr5_^j{OnaS$FfYjVJ*QtJn@{v}rNfGE{j-_2 zsS$2KZLO0X$l2ygL2$}x1M0UL7qjOoKdcIjNc}rorQsrVZT=tiXzUGTcG^qHnpWF@ z_I1yR*hj&Sa?H9f)uzzBV}6xT=NO@LLd~o3KRl9Rl%tqKSLfknB3niyEU0Iyi3@n&iyD<)7xa9Z{s(Q=kw&W}4sjK+B3SaX;RkxP$#S@1j&lpG(Iyyki7vqP zlja9-f#%mJl*Eqn!Y3bO8vB3AtucsSuz~XY;(R! zS&DNB=uIkdMg{+)FoD%K3xk&iJ0pQ1MSg0y2nUzrKk|wL0%YB)mN^bbYb+^>CiU8N z?&tz9mVx0fj*3pnx|ONwq(JCKiPfIW*f`_oOPLY?is(M!>eWKXINew3tcvySu%@o< zn`OK!@y2FLS{#`h0nVTJpAE9vOr z3qdu3UmjpQn~c}|1>e$VwAGiZGcNe6*)&dG_;5gXv`nb*a!)zUTD#n5crh-x>^>U$ zpF1^*-tu@j!*$ha*)VAdHQ4!stfV8emc7mPYL1AECM)LY#lwO>6+eK~3kFRu(mW z`n|s^H~;$hWe-1+BTj72g7ve}i^_Rea8;?97-YATB;iy>+1p?$-~XxSJzRZYuvOfe z0wQH`BjgCG5 z)hJa?UYSqY=+Gt3o}!M0zgI6cLnY=t(6))Ar*36*SF_Ug4`gqaiuKNF`@K*t5b44m zUUrJP8nF;y=c)ES#ab2Ly?aW&;*^npt-h`5zw@^eo?J&+lWFcWT&E@SyjQsm*;{{jds()}B>lacfVj94)L#HIr6k zCbHb3?kEs_2BDux(wIcKG+Zz$G zhNQwEB4XW!3z(<#d5fn>u#bIJd=d@7zlxLNPQ>J~h2i;g{K&0-HKWK4A*wa#5uQ&V zS_Q)8B%)i$1_S2v7hQ5p20XoKLhY)*-B>oi@SUyfc%Q3%Q?+TDjTr$xcy^#n0XB-B z8{w(!dEjsjK7>$lAJ0|@2p;W){_|Li?Fn=h-rEI#cUyuP{qYze&UL=|cJ?Dzh z-LYU91v;;nJ2<}atjr=EduCVCv4*+UM})U2bSkA}Nj*73pYiNzk}xhF*9UB3yH&zxGUCVYW~_&B!}#nbKsWCZ5_6uy zFfo^s|6sX^wz;+JGPd=`W0^48)pH@kF^m;~6vT}nrCllboQhLtU0S=`<_k7QnOp@7 zQ`Tw=Yzh=BE=6F_?ecI-4Nn!FT-G>y%<%)bH{EX-o##mNjoMo=n*t2A}Fh={%&vt69O+as^mL zj!_rlHU=J3-}dHxL%C%xFJE(@p;u}_gGzZ)C@^4x94XrfvM3+}bn$E6sNVLmwD&50 zE;veayPi`de_BI`i~zOMDItZCR^mjuSlUVVWSMPIs$v!gj+8=SGKx2@QJn$7#qwv) zmzs1JRhY4w65CUpXX@;6mnY+D;2I0Tm0bo;xah#Jl5%iSP70Jcx}1#$*%scK)493L z_YHGnYD4a4WqU^7FM{Txg=j?r(LDr{`+nQH1I!6ibPY9#etw@T@EIn>5smCcCqbh+X*@5S^w^1Uq7P$#PgZmao`2uoMShZr(DP0f4jyBHcrZH$p1 z0OsbI1OC7)dN?}_9=Q0NG%PM-{erFup00T~kFCwlkTMib?P*!DECBx|vFo&&Eb*hY z5q6FY)|0$U2OgF}=XAz?3WYz7^{3wY<&`$UV;&J+;md&bJ zyJVDrj8*(A)b>9eX@NQ}IwDL!>~GHt3s-Jz7!%dVij@<7&s(}AP4O4&lYY>PA|a z&9#Ahm9&SH)O1eM7w|=q_YpBH*XaC7pUr*sd(TyCgDb*S36gqAukvTVmg{_$y`Sak zZXfrl5(h`UbJzB__U3PjB`q^n`=hz&ilSHB-%iN}9agELr7DGn4b&CtC4SN$cf6(A zXYCps;hLUUF#V}1j3!hwhdVls>E_|~{jHMr4bxAYc!IX)AUo8%J(Ie#%*mg~#Q}L` zCxdlI3yh`eix*v&RlGn`1cgQ7jaI+P4+90QjFr+@SfvPs7AXw)Gp@h(gVvsR z4GA*MIUp9HQecg!_my@!C-a_MAH8cIJU}L~lY%UWE<7|@A<_4p6EWyo$1-0Crd>9- z_D!~7zPzj48+{18?rzE#ef6_6N0KWwl*4zRjDA;SaWut|&H4I2KC=Lw#B@sSj%r%w zFEa#j8VxA_&F1(7kg6GhL$ttnmi1IOL+@FL_)y$ zN1`oJo^2*#(NN+2ev&q95sCu^<}Z}wl6jY>TpJYVoCKrIRW9((B#zPLOoW3rUHnLK z^BZsLqu*=>6_C>cUaMcTk(~N83-s&IYUXQySV#53wgyp=r_zAfeOA+khd} zWpk$y%m7kFd5e~(Kyfr~W%2~oPQC1EuUbL$7=YwPe!X9SXwVNqX z8;&R0RJBQ!4chV+dPTu&68$%&fzPHjPZJGRcYg6OayuRcIkzYeQO; zBgEe-0QJyZ^i|)tyTBGn{j=z|R{2cm-0Sy;xbK9}jW_O+<&qI)nv9lj+y0?Fk3v4N z?hy|QR<~I5L$f98ZYm;sCLQdc5uv0?4sfIbrE#ubArNI3iKt_VkOXxsuqnWb{$`g0 zhWTup%DoG3aBsm1P{>#5-gY& z@ikKo_^?9%b*bvReUz|&Q&o(lO3s?A(mcn?s~w(-(xt7jUP~f9M(qRMqD70*Zr&{xx zK!YO=i_%5OOA5y^*M83QM6Nq!T+!|0B)+9b!fbHS{^#=aB@BKNmqW^0BS|4K=+Xl2 zJJ*U!Xt=V*J@uxOam@jO`j4$>K9rs#8O}xHo-<2j%CdfqQ(})%+2Ed6+Bdu+(IK<> zGr@*Agll|3k^#_GjK}Ild?@&dZn*!OR|s5?5Og-eD_6bH1!4YVPOB~LMjoO*euLSZ zT{rFpPo7OuB5N#!Nuy2w##M$($qvLl?$1&}l8}zn zl*|s~KrFh^sRNc|P}s0cR~Q?2#ziwbuFWi^j7yzx@V+Q+U~NVB?yTMp3}7t>k;}bk zKjU_VRfwlh%~UB|wj3HW5&VCAU$VMAo$G>eXCcZQcwDw%5aVpdir?(6 zU-|3BE*s+)P5{_hnyV@*w{|nzWQUbLtgZhL-1&7+0rW`u39{(##&RiW@Sc>F`WW2x zqVu#}?2P}rjqM#MCq#Wg#o`wvPWHzKyp+P*}Qd0t;-5CKy$`bYNh7C9?{cg{GL z569+s*xPpV(fjBa)C3Z=cdP z+j>(b8ZM$rj^GH-u_gW)6;7JbzJ!BEZc&+Go;d$tKX7oe#Tu0|kE2^CD0%UP)hc;C zV*?E2RCkhXgCPl!wuL(YddniqXEwzv>`|0l6dZUZ4z~mzbyf^! zChbf$l1iy~IGtouBUt)0V?_dp&!fAwY&YL}SG4k!ygKHJ9ASJJ%_C^HuY#VUp>K4l zv&V@_e~JAKWW(>+-n$Cv+4Ldzd}rplA>#t&IK!?eiW3FCtT}W311)BJ*U;cWbDB_D z7)T73#c+S{5&e-Y!9)4$@eNDFXTi~5*i|Zk^iSZCcLc>=T5RC~Xym8f^VWno7@zPh z)?4_hK<~!H`2mxZIkOS|AC(`B8oiZ%s|*$IxJr;_MvHgBk3OH3dCfXdI}Q=E+ZH}W zmQWO-VqO(&5H;-RGQ@{8r_w(RH~9ze8sOV(tD%1fgalv1ds5iId-pgIH4g;MNZ;1! z<|~)%DvRcz@km<5hM5@Rkl9k}F

*HZ*HdQ;0p{@z3a^Be^l|Pg@{&2JfM@HeO|0 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

?OP0u z|7&5&KlH|UJT{1vFZNT-ZGp1cuNjGSvVA8-`y9$d-sx#}(rkl7Qjwh?&A4rvB6oez zW~{j3xZ?$mD@XxP#1quqXt=gR?Ytt2JDpN3*C_9Ea_6zCnKZRw;_yC4c6CQvgG=d7urcl;6X8Nxm8n zaPB@w>+?Agt;kgl>|dcEg{l2#x)-@N+L2!l$-U zVh%e4G>b##=1`85?k>Eg^5}r-O_$JySkcbBg43yTbM(`Glion#w^t*%-@4;(OD>1O z*$2LyB0H^dkgCx{Ui!xMGA!G!-YcqXe`rki#6rZ~L$TBZHm^yyT*gj`J$%A-**PZg zQm_2c(GMvLt50`}zLbA>dUjt*^nZXmkW=V~(gV*nzfa?knn#mHxi z96|>}hFBbPz2@Ia6wq7xC`@_*!GPs*D?h_ZA757)bhs0}Q{{r@fs;QY?vxWD&q&E% z7^=Vi*|5sZgZOSZJ{Ifcb?7qu}t<2M9QFmL{>}9KLGg4OqRR|5{)~f~=#J z_}y(-<&&~|jQLYOho+Zg&6{ah-e1skSJ6xui^2;+Q#EU5wLpgJqbewb`@NP;D}2J6 z+Lq$%yfDvbKh-ZZ$wPL(S4%qLx8yKPd82YF*BZrRS^D{K-R)r+hsN*iMLmkG0;{1o zz+I-=-B_7jcyt;4wL?qCIsHs?WgNe`St;E35QJ|eSyf9>uC&%oMPqWL3qnI!BC+AJ z=z)%TRi`)>6(w8RGJvK%e#sPwe!x4`(~xhvZ0`x)bL&;C(RoNiE{3_p^!FycF``a& zc+pAnm^5q=Voe<-_Mph*Zp0oAV!w^Q8cK0MG~?Kwr-+Q+JgEhT-~&XPeC>#j^%NYz z_sOrh(&%wopJ35B_Y~%AwndIW@jwmVMlLT$dS6nTgwvqiN`NRaQ$A+j$YB~8IK;q||k^~~%L+0kpR`Ivv3-Wk9;-&W@7B>%1C3ih*OWM zHtUY*a#cVZ$3}$~ltOBoyv>?{-jWW~QDfkunhYw-)Hw8u-be?;{~0M3#4d>Qm)khK%fHk-5S=OXLU!^$Wq?0j9`F-Z74w(OKAT>_ z6nBneIf5i&hN#V_lF7|6t)V`aAW$#m+BqoTpWFJ)lajIwRsPlVv8)MpRcH+=P|aeg z-;AN1bDvZ&{ra{k_;KSE;_c-{{ih&9qMk^Y{jV|yVr!gMB5AlN4KH8IkjUWVO$yri z@Omr6RpQOl#^ip&3mwnKr^R7}+BWRl#rJjlAkUg?FAf!AD00%R`nLkrFKG)RUU$u- zHKu*e=99jzmC)t)5z{y^V;wQIp-0#(K~HBxj^mumi5X30&Y~@EX5X^u2|c-%+v2Ro zLu}JJm7FZaPUC)Yq^3V#8Z9S_?uCpY?s~CPGOF8p zc8>gLYEyXEMSb(gt)2|EQOiwDX2TgUNHW;%3rZ^IKvOp+n!4b+SX0!gyjrcHMr7~V zkrD|!qN9N~h5gI#MFz_+6&f&l%O&V19=%df$7NPR(TO!!jZz=!+{{~2Y|L)nx{GVm zRj{_Vk$wJb~F{7bMD!FpvyFi1Zt5wylr%1_D{e&UIZ*}^qm$ZNcqM3 zG71iPJ6%ruuD7~}mZoLz_>MJv>Af-a@%%cuE1Qv|F^r%*dOfP*$v1o@0o)&^Bqhy+ zgh?;{^r5&lm6!jKO_3&&UD5KEO{s(mtcGt1Q%F9oNRQy0qc=Bm`RCEwa0Im}Mlk_f ziCWib?f<)M8}7CB=TI3^C>vDED^Jz;| zzZ=%unmT6k3@VwlBxtGb>2{cRpD5Dt=&#l70_X?froe9mE&0|ON$w%4=hMv(AM@3( z%FElo@2N+s(|gNyv{L@g_2kCqeTyG3RZa_yc5IyGb`cA?O#Sr6T_B_n2=aT>(E8dO ziCAIC@;v~-dk;h|%3j6rJ=J)m;=JyUe?93SZS@NruZp(gMcD(gsutZz)52OIPi3_3 zH7UxeS#OY&r4JxWOVqxzULl-00ixNj^j{?H%W4vKAv5OzU0!HFk~R}KghuOE=`<~@ zupc!+%6HR?BCj`#S4#zBwK|u>MC*fsn)q98P&$}9k%hOY2CUc5vp{`Q^0LsGy2zH$ zkuURms6#-Yp4+gX^N5HZsXbHrFQ+4^d^F&q}>ToIB3sGoX(RbOgC5B8sS5PsK)#_g_$h_%^pr z((|)UF05e5DWa@uvDtxi1mC>#Tro?Fm7b&cP(Tj^Vq%NDyzDiVHG%fT1uUr@Vc}FI z%A*K)VViJAYylpapxk129$G>T-c%RJ{-B;^k z#c+0`B;dndR8B7^OK;jdlD-eGzA5k{aSGD#V=tD<780hs4<0%4YSL^p(_iAE`wmQ; z>g-qz*YYoF60tl|uHy=ro4}dl1lXADpZO0VQvzwEO1E)~Ik4%!<|{gvi|QBX!aHRx z)j_MGEuBA$oCRTe?0t-ui(Hpz%WsALQtU5}w)ze7ymR7aA1&>?#2%uQd-+D-VDeM2 zZ1+{HNI6ce972y9xvLk)<+Rh8_kndw%D?w`>g`KHHvse=d{msG>J9;Z9Cv8xOIjSL zU&HXa6dej7=3bGVwf_`)v#rH6x5`Z1j?PzP+W_+32!Y5?!*D<2nc6$cMkH&59n3GR!Ea za>i^-(0=V#mPRy+_u7{7a@$E6u}79IMw{A;sR2}bNyoc?LucxE3}y`H#c&2f}O*p<=N_d6tjiyRSPT z62U{{&hO|@`*!*N0PYcSr&5#*T(0_}eX#xIKh0YbVRr}j zj4>i!$g6!~YzhvrvZlFWEM0S+eal86HSdfo=UYd}Yv!2}pOb4cl=eWo$Z}~aHoVNt zatBYl?ozRZG(0NnonqB32wc`HM2L`5pB1rU-~_*KyKF1l$>rR8+gQ_@?TykKls!ID z`$CST5%0xNK4zf)7B1O@-UIwNwY=EYD)Zz|3GF5Kji;{eWsS*JPIBkW@Hd;xY6pqc zAEd?kg}ebH5$4$yKlTjQ*YUx5!Mkxm+WR26D41A&&l?v>ThSNrxnhIXr!hP{8b;zd zJ#IeLJ>G>jUV8P5{PPYCD9@ikn@hpJu<>0<8Lf9CzF>{5A79U^XcQ|CHW#zByR)eN}J=9d433jIzK7r1@F=6dOKJ6DS-mFP)=mm3kvsY_j! zH)X`s{0{&HL`%naW87YOc-;x_oBy>>C1hs5_I;%G>Ou+9CsASHR)E2ORB!fsyIhGJ z?q^*Npt@~;fVIFyueb*sG0&jv0tLX7!4^B!=TmBtiOwjRq@QJvnOk>5adsWZW-Pi4 z)KIYi6%E;=!cQu=bc^l#JZs3^{Y%f>W)po?;2+G&`7nR(0)*5$?Z-m2`qcE}yBPwP z1^us@fPDM6NpLIQ#OLHuw{rL^Q;bQ)U%P>2Mq|wKfrx&u9Y@9NP<1Nwt9-?b-?tpp zh;OM4dkg^Xom(zo9qwdG99#QS;}Lmz?hMISa!svE$%Q6JCaQB!P9n-mWb;F~byF#> zW;nUuMQ}scOf93Xdpor^)VbYShJP|WnH*PckY`FFFjaK*> zJ0@FcYE_>2It~LJ;6l=Pq>m(lR{iFFP z{u;8oknqTeue6I}Ze*DItX#cSmR9I}iTg%Rpf;c=A~ci-f5QgDcXJBDnyZA=PZVK6 z+QgKgR9?cj6j|rgQY_x8X5vtRXK94c66N3no@kD%`wl`%zNL__dNs*>Qe`g_BIQfi zFZx$^{B8EyqY^RUzGd4=z%W8TT6zHvfjdo7`tRW+aQ&Z3&flh>oAf89>JsN7VQwu* z=|5E^PkGfnG^BeazJvN;Ot4IT1kxu0Pk3&{;9=QPGv%U`KFs>5d2CO`cp8D#WGOVp zNiy|-N5a6!Ko3fjr>;t~ioVnvHb61H1RJ1+6c@oJf$Ji2J*GEn4(cvdSkySb&;E8i zML+8NXZy75_wk49NuLE2CMv$R{+b_ey>k0<#Uo{z%Qx(-9N#$+*uQ?p^Xo{~%9K`l z&dmYLGeQ%T+vv(t7mA7`TkmKAxOM28ggG91Q_;&T6>4nW9XX!LQBP2{@^msbIQbI| z;j}hus4R0K&bgsS1`X|b8Om{Sr-PYe$Axc03pLMKWukGV&ufT=hP}}o|F);z$yOcD?>xsV35*BIiE|x}^ zS}=e&@q}#ddoj^NKNEs~ld1?{Kj$S-!5eJc1~vZmuI3;dg0E&{X(%MC;8(yDTSp?> z1zo8`_+5o4*vRGQp|;5vm#FgiC1PXc7)7_#>;3j~cXB_%+hs`4c&#<$vT}pCFGiLj zvr6lfIF;|SC`GY3!e;c37jq@in**hBYJQh7-ii_@k zNhJ4amWVPdjN=Emuo9_ctt?yYPMWEr>a@6#gp}l!LoNuXW^Lyr!tE)=LtA^09v&aD zrt0?kBei2BW3xS>S^&34bKj8 zu|IQTv14#o_P;~Tz6bURTTF)f{uKjW^7UT$n7*-|1=)a^N|Do$aZ(%I?FL!hxOF_}My z*B96q8H$6}n3AcdP`S_CqlzOO!lrs9%jhCC2TGr}xL}$B7pkX2aI+0I0v8GDOjIz` zU`^B{?uH$ZZNUBIC9Og4%kj14??7I8y)N2ZY1QisNhh*pbh-g{f$-M>RubaB#XbZ+ z@mXJ4hfajS8*2cu|qd=(*=JADP?q zv?o0Xi?f2NKk?Fhi-y`BLSF28#)Q(eq$NE0+z4N=MeN^QBx~+c^}EN^O3HDvaONhk zb{CRz|le+9GHhuO${fi+Mfg*&S^$t?T+|C*k`kA*cQJ>9Oxv_LmhtZ_geA+nvAT z<6P=J$aCC(?d_axiSGHi?XepKg?IlQvfHM8#Kxz5ZodH<`K??GT_ryWP~mDOxnz#z zzv!4ZA3An~8>6+HC&F}AD%ekI)!pNMXRoH;4mfpOlX|@@n&8d8kiTb2vl>eLjelr6 zpnOJJ*-d<3k;})2eW7dK7h;>xhg!^ixGq8W72Y!*y6UAXIU*e>8eibU{Wh*yym$l6>kt& zaX_`yt}iu*`%L~?1i}wNoazgH0{%L~fqlAMx_|DpqFRbCa(D$2dkOEk%fD-7>Y3oggnYPEY=Ws!9`+Fh|hgN940 zki1Jp)dg8q^j;I#dsAD*4FcQt1&_tt5D&Vi0URUJS&##|cM=qFKyPfnLM6k1Bf{J= zl!Fs(cshdUnyOPd%Fz9e<>xk_P%TqLTXaa*O#~jK&}=h>TJEs3j$`J>87&g*LaA8I z8&&uUzZi+w@n{%0P`mQsOdhqp*Z|3l_?$+Jd?>^?@0)Iwq(PbO5284A$EVMk1dH&s z4&JKF5|KRBuwq16b!wK<_iHA0RV?T~_sg{#_z}=TZUwWOc+cw7M=QbA%sr_@Y>Tsc z%vQLE$e3<2q|e@j#y0EU9>Z^Tpcwr=qz7?b+P2s(BZU%u>f)vtcMbXjVl86r|1Aj} zvT&gewWOl&xUSA1uLFI<4X)*>s)eMin}HPLg!enrybSd@(NK;4uoRs{<4T7g*lM5O zD#bo&wASo*bEwV&nEjm>nqC$z*y=HcTi>V9aUb=ck(B-?@xA-pW#YS2f{Ows__U zw&neA>NLMj`!rPEQo*VDaxlVM-IVXvEIM=56%7dBKLo!hgOOQq$Y%sG`Ftjvu}B}1 zma56A2xwqu-9$pG`B!!gWA74w_T79e&a*Rv( zBvaktHAVAg)#K&=N6~qPCE34k+`Uaiac{#E_a3Ra?Qw+)?uj!unrUg~7Mx|GxXO_V z&YX#RfR>`>6HTcUQ;T{`GSkZZ{rSJ(4KLt0?&G?@-)o%L`AHh7i>+2NadPhymVA?i zZB2Yr-JIj=pJoEd@(rCDWZ4sL&Hu-~dkXCv3Eupj_io!$)=fo_Hc9qdZHhaw#vy*I zl+|YU@`U!2PYx7K2<{E8wzS~V-`|fJ$g_5~4tiPhNO0FzyO=Agp_0MN z!3z`nF(&5D4>Tf3eu9ry)3g`bP*wk9`K;PmdM-kM2iR|DGOe84mVSl%%Ph(?k4GnD zc3=94+mgpt1Qk1L$Q2{WAnL8?k;W$n3q3L_Hjx^U@NDXA0-GLUMu45`kz<_BinYzp zjGCXT`CZlG_f-ZnrAA9c3HN zyvgtwW%!hyi!#(lD#g4<O=&k5u4UO9z`tq#=kd+AS)*lkbw{h==xoLWSo= z2-sQQV-}C6-uIO@{-HV#%&->dyx;t4e=EkM=sO)ITHnG=zp128=tag+b1s(g zB(o}IZso-I=T7;CsQywiUlb5r6ECE_jlQP$uY@w-k;(QhU&J-7rZ?-vMDC35f~J@RUE841me>^70lD1Opggi~`QHaB@oj^b8pPD1qScqtiQ|1=q2OnfOpvRA~#e64V6I;Zy= zv+o$|X8GUD3T(!?DYVAkTNZWA#^LUwB>+10iDEYPi$qA6|s+1RiDi(LPxQ)VWu`gX4r*b zuPjd>OO*>5{JEFZTVF zV%lm*@?x4m%Qwp4|=)a+y`vtqLVeb!owW?9~d{}|FeykJ+=R6=Fj zn0R@OETR53N%;`)mkXj~3;#>5dE4wIwyKUQ%(+G3D_egBz_MM$$6nigWSe$trg6xm ziZgP&7#wC;i*OPAU8Q>M$G)F1SIj16gA|5cl!)MjJD~4wqx==8k)N(^6@&8!cZ0nx z-(L{RyASq&UKChHhF+VPsdIng6fv(hbTR-8+{;6UwPGXM6V&CuY4nKZJ3}d2ISHFf zuCREO=uvofmP$)?4_WMPFtSZ_Vdrw6xl`|aK1T0R9j>E)l&t=(;1eh zIz+T{d~vaC9-k#SpdUQR^f;3RW5sggMGGZ-{GB_8b zH(Z1D&C|T68y`AW?_cBe=y$`SyXmc6kNLWlh1@veA7`nO%58L?fEXjEI zs<~-{)0rftZ*ysK5&6Q=1f6|K(hhbB;&78^%~#se{vXS>`$5}%`7N(!PGe@WgMPI> z9}&OHD3@b6nU(2HW`22%nuFdVQUiy z!f>xw8cz#;)QnZ-1>?AGKfx2XZdpkg!e+)i8xn-Me&qR>=Yw)DW+3WeX+#60%X_|yf4-!^8Okcj=?YyiXs#W#CwnF^U|-b*SE4O zCyk5T6Mkt9Y@;UqKFD-oLaNwJ8s?#2W{XbZiu$B6yIV8{)O{eVq*T+sU^u8rE%p9M zz3FozNitg{Mq_rCVe~#z)~&IegZNL#trjwPB0%R7A0GBZY6OhZC5wSy=se>S0?s&m z|D)9S4aGYggtoO;9+a*+2tx@HP?o(vn+Xg=wCf=x?pZS7{f_WNfJAj>efCZ z0^Zj9Y)!@GAZIs57jp@C6sLuQcaduGTWyirbAIIv?>OKtCxFvAdE4+%$Aen&)40`j z=E-^w+3?zKQ_w?~xhHn&x{3i799HiCDTu++#I`E?`6Qio;RYDetV>=6A@-`heYMVG z8Fm*tkG|)Xo;ntG(zAc7_63W_QhA=o z?+^1CTbU?Cx8CSQV$H6n)|*0PNzz~Y6?s&75m~r9Bl|VDz=fdf13`3Q zKdy(v;WeesPFijCi82!oD>C3A@m$NN*B<>unDfneW-?SIXPMYkj*POZpxrjgu}PKV zQ~X-xrTGdoL#|V)(xc7R3O0D8R+u!(Bey2NhjXr zT4KuIW)J1$Idlz*$h?17?tr6ag*dJ843h>Mm_YEIsgR)$ggA>Cyh|XUGeha+1Kdkf zA}H@O>YQVNm1cLuFZxF{ijsCQBb?>ZcHZ6CI+<`P%J|()*6`LGcMsqm_Ewz zatr4hNmfQZzrpl|2ZTUrCEH$^?)$g7(em>qTJkrwGBi+`n4N_mcw6-50bH$S~ z>ENY|_F%B)20T*uYVY2GJG>kuksvsSkgTiuLJG^0=M0#Zrrd04*G!7r_xgPKg)5Rz zQk zvJ{2l4E^;$Azup&8O?KcxRU&g6;~K+6s7G!5EZcb8OSkmahCEX`hkeF&U3!U70JX! zWTtkZZkU*EDc9zMhexuskjzVY3+vP*A_C!EybrIO2KLQ44Q$@T_+faV`mB;c>cA!| z0@Mt{2E#+m5eXd6J;xZUZPsgf0%>P+O|VcCitZLg3!q-X@xB=%RYno8g%*`(hMs{_ zw!?Kdr{phoc3OL1Q9_8<6&=dWQ1H=&j- zrY3aw?BJwpgwJ=RMqJCVs!t!I^zz#S*f`oU9Ti@$7`pQr?fhJvg6|ZfHsKu!pty9tEhWlX+PGDG9#jG}P z@{O+6FoCdmuy|=+&N32wqQtZokjz1QbO`Hil`<{fzhSGI*`qHC>zoQp73JT}qwV~U zh4(h7u#D;7dnZ=!I450pMQ&Sd7CZDmmQQu6hVp2SHoe+DS|)elPDcK&mm=C`2^S;B zCHYW^tUXhh32fd*IUj@+w%_3j1Soyd+1t61HG*b{-e~d#I&Mdw7*1xl>0gha4--S zhn4erC8GPiEF}9I)DEMDQ5T0ql(OmQLp-dAIAEo4mB3=S1m1-UP+!=-nE(@TIdRMM zGGB*y>y!%ECB)qJ++K*1OUTGS+q!DfXe*$iXp$#L4z6b;?@sVWZ{YFMlKN`URnrR9 zRbjFpye_QX^&&Yy4A{tRhQDXk>P!|}oz`6*Dbo`C_;*P!s?rHJ%)JjSsK;Mlw2(r3 z7}hsaMLaydj6yDc-PO{hqaJz0<6V*{#0kar>lvoiEzommT#W+DR;Sb_*NjunuOMKc zM85*t(dqo=1lG``;jC>vF(JG)|CEwn!sKjR@m3xOw@-mo=2&(1qEDRW+vPrCRDemb zb=tDNl{0&pap0+yDt!8P+Z%OOvEdsXe=q~rKIk=aUbi7O8q2`5QKC3)pNJB8)xFTq zV>v~b_uH5!olHfepXqLBSaE{IqBpMLE#oA&=jv0Iue7leBC=s&y(6i=X{y;)>vwke z+ZPPT$h{Kk;>{h8yt{BFv@&2ZLGFo)Q2tdxZxfoCVB?I{C4ik#(${Q*XERBrG&YCz z=g4zZh2?HKq2`}uZ|ZA0qc+by5js8B&kHyF>lj~mq}xvvQ7o%$Z<>{ie}uZx(GHdH z+XJw8#viMCKl#VHy`3T4jEm3FLx{yEPVKZ+6!$p8KN~r(PBj(C6CEG02fSO>QUZYx za%w$c3zwh6i?HjfiZ@KkI3vf35Aav9;+DGsTr}0`eg9vD>=np)U)&xpM!&W;9xiWb zc}f?mh$AjCIpDI36qQ}V_r)xkr5FiD!&05qu4yPm0QfY0%k{4PC02H*-N7BpQvsiT zjgw5Im`17)-BG1a=SgLf2IBqjIq7pZc~qZ4ZK)CIG}vXy3$KbX5KD`tGwBB+SQ`O- z9-C%-w9P5-uk&KAWYrDscOlmoJmLcuydD~dK?BcrW(ilwtZfF7o2aLP_PVcztOwrp zdCRsM-IXgE@N)m#Xg^cb7bekP>N^rb}Ye;sqnk=G-sNz zAmdn7DJGn@IO^ZZYNDMx+gZHdd`HbdP4!-xeQ`|jI$+c2mELc1*aly8kQQ58hc=N# z^s7j6!CQAGz=Y4U>>f+4d8&kR!N8yV?8j`8jASal<9xi8>5&YdOutCTzh?>u!Iy28 z1PhgQ9xJup2_7Wl;Ep;Z5JP7~ER~|U6{zd}RHH)*^}ahL7WbGp(1!H>*tl1U#E?xj zRkWUwae2fWa`EfD96-vDedgbn>2>UOyrF`Fl26hcN8|Lfg9Pl`MGw*BMm9Hp8FmAqqok$TG`PlA1}8-HQaD*t9?8fil)wcM}1x z=MEfmkOb$qUFX269j1?J`~zol5~e}G{aA0#-4$5e@(~EbgoV}})cgdb2LY8EU4pbSmqi4oUYnbn)UR%jM^X1? zu3kIlnP53-a9K5%dLYEHy?l-yIQYP*%ieT_tyUv~M|G!2`kZ zT3ls2+7i{MaKcVwR^8~K>CMId9R7e?Hv5{DRnOitk!ur%IpFiJt6DcqcJ#dRySq%6{U+ zC+=!~Agbn_$3@tZ1t;Q!^N0|ZX?(pH-TWA7FZN~h)2oq9_K~bNJ|Dw;2^0J3qy67k z&HrEbdNE%l-rD9xi-<14abA10h7H!o#YAJ_eJ~J?ZYzHb5XPT_0;uJnKy01_U(5s6 zb4+*amEf|w5EXEGpQi}O1Pv)W=}upQ@p{|`+oWuxVtPG^C$1;sMU_$wYp9?oeXI*0 za<^eEnb7Ds$2;&F!`eklnIyLS$ZBp$T5-PcGOjqc`xmNrS-kFlEQ{o6Hc<~d*rZX4 z4)Fcw8j-u5RsG`>J+T^AwwLcnHd-8fuXVSreH?Ti6`!djK?51AYIO^3&lJVuQUijG z`QsV`=-n5i3w>J(>5xZ#*yr~)aIUNwdw^7X=@dOo!7IF-h8bGCEg1=%F{1))?gM$f zWbUcmJzKdaeN%wUOs_I!SPccqh(?gRc!n#W){C`woJ&-7-Jgue!f#a;?r(ec#3(!trK>toImX!0 zUM|;&LjOTyuQSxtS_#>4{&kU@fu=yN!B&+pm-bvz`F}M3I}~T@>3t)~0?#B*3d_g1 zJyh<0VQ^`tZSn;Oyir<+`U#btV=$hRIO zmarz39x&R^V@OuzU}3eTJY0J8N#kbdO{N4k>doNt$95Rr1MSN!Q8Qyw)JbmONSOKY z$9x5=!mZJ;)%(0Do+*HQxabz*eM?WysQLr4NmkoYYT0~C*$kdVpw*1(dA$qF;P}q1 z&awoUXiKIDAFjDK%SgEP-V)&wE8ltiR|F{^YuA5B%rqPAM=-_TzA0ZZA|eI~8pBL! z;{y=nLXpf#%S23qoay~72wWr_CrKDON66t3K@)j>Fl_MjE(}Bplca=H2M(;7>*xYw zymL(`U|2-@OXhonOJ(EEgPPYB-4h_}2j9;WCJ^Thw^2?3XInK$9oOWgMPt!(4fEAs zDX^F`9+!_lX$E|vF%n+>0kC=3MZS=D9tBWkn9_Ymtl09o8I)%i$}g#`^nq{#b;9{6 zo8OVcMwII7=Enk4>2->82JxuRm%%BH$@BmGq;^UNDd9#y3!zwr6h49ANLZG~i=5XB zn=C_GPBfi=Qz*l6i$8T5*#@#Vl)89|a3Sa1LLlMGmYz54IRMq^Kb#fSHmiT+h&?@9 z9Qqk58@}880`+G%#^RK&!0(0>YY4ZV+OI{loRkjWGgM>+*X>-|KcG}hT+OPw266xR zzC-9cb$?%selde{ze0C^O!joR^8zVn6}V&oe%SKB&I3PPTPIYNYaSHQRj=Z+!I|1P z!^Qez87?SYb~kRDGR2O>LRj7{^LKpEKb0r|^#K$n%_4NPn3qj8%X>TBG>u6sDXt@u zbDekZPObhi3J2mmb%_rcT>7KMkNDD}*57$*rJ>n4gYAYFiVZY4Vs||YnY9pLtHKq%b3qNQ` zsBM-mbzYT{G>k)K&UIF|fB4R{Z*g6#B?pizw+EN|+4Ira1UzhkOKbSJ#Ge1i6X%K4cai_A!vh>U4MofL-c>5b1TVDvo zVSr#4rtFl1nSfw~DnRP;OC8Ly#z&$K%$UcunJ3*Ga7b2Yiwk>2K*slbh>3w;Z#WzQ zOT+%uTBF1x$}*i;{my}HdZxA_tJAUC@4el79_=IZK&I%l6?abm39p?}yfZNyEi5T& z?#jhr8F9*)EWabe8Y^|pX1x!2^)9&kBaCloGDYx$cH|SaSC1C*=5bZSiDAi%tNUE# z=WKkj7nrK8q+=r6*6pv4&A!}^=sM>!I`Z~MnwXOa#WrNUxLS@$o`dVy5w!Je@4IW9 z0gU?IdZlM=IRw9(kx$$=l!%8!-8aRO?Z$A&WN5FJ-0M*V$M*J>+!O4>&V620Wr^zH zo)7+DSENqsfBQZZ{|2yx~RvO zV>HHwR!wqURB7S7-(4i|z9ku+jSgLv)WNXE{t?u1A8XfNq0p)r&M%|6GsT$lE`6K=tDHcS0Vd=V27f(*&TO$nH z5Oyb*r_^dyN4%5!3B|`c|MfOEShYUa>wZHQc^+9aJ2^8cwqRcYq1p|nl4gezHSAU+ z9VvepctiPQ)9ThpVAwK7WNO%7hzmq_$8yw!5{IZ{xtw~xAJ zACFv`Wq3xFUjX)U^zPhRw1mLAC_?f~9@`O*)ietc4=27VH!mtzdFtD+gkhJH^xQk) zpu?9AgHB=R+N?0xd*4VlPuI#rR?-c(vmjDuAfB_`J!+?InFwV~CwZ8t=KRXgpoz4k zonBp6Qv3%sJ||xI`o$N9+JZO%J6)O};FyZHQz;=^wOvFR_#CV92pVeeN6B#g1i+ETbbkA-bbrY=eYHXjgE6f5^Iizm~tuZ9V=}HFy0s*7t3Xp73D{igu4Vp`+5v>6ztR&Tu?8mk{otU#Mg%o z!XPjaD#DptEV4 zO??B~%^A^EBkH{d{LeS5L+TGo^Gsrwde#)`a}cr2A=yUv3~Di0kc)r;%7d{MHKGEd ze`;rg^~3*N_UJyz{YvHEfKXg-=4lJg6a*wdVNUp{AZQ(fJcv%AC7$SHG`Kof?B6^f zFQja97a=dmLBLL>E$;ZCW2QpXwZ#boxe8HHLU2jay|iFBj5;acA0Kpu43Ugf7vA+Q zE-DW@RVN|YbqqCZQw2_BY-jtpbLFo2(fF%Aeb^5woR4EWN=UC4qN-@K6AC2Imyx4v zHWX!PGjGbnaN|Q&ZyuJ1#w=rf1g{$nqK?kND6fWGAWg&PgsHA55f={Ig79I)MyaW- z>TG>-w}eyh?o8WSq@ZK+NshcZG3VET6DEik@0)|p#{ra5c*OM~Oh#FR6K0E9qa#za zb1yJbH>;d371-gBrWkeL1X2~34i0#3EhIE@&BPT;q2uZ~Hk6@M+EP){S@Yd?B_mhVm#r;xPGL?O8#{)@rf) zRLvXJM8RhXzsc0qz&~8q5NSM;DR_D3{{GFq%5-ZOKCKZQFyH%az2ug^;WVyUBJCoa7y?P90Gaqb|#fJmc- zwIQU5>KjPCevbQOWtmTuFRFO>wysvfU~QwQm~S|z3+)?V$xy=?PR~e^ArB4RtjQ=4 z6SR}bYhB3E-c?PeYw7C-NHBGcNu3!e(efK$&~?NuH)XwVx=Zb*7^n2LI>KV9x~RkWeZ&$HWSI z7>LqIYo`zu;Wd^moY8ZzXRVi8Ja6J$ZnFbnnw!P{NxoYkoCN@+jLH2kmRCx-1}4Z@ z#BzD?7BWoY#D{#3o`Z%CrpWxb7dj}1Kgg+X$nNILykA#*P{qtc@Es1L{&o6O!{tcMFm$H zgj;9vZjBMSlrD|03`$5L*jQXi>eBLz*O)CKw}}0$)|>|zC z70kqn3vlaK#=7TLowW$Qv*|OD?EqM4?ps_9B9sXft`SM5()+T|tnKSsiv(1#x2fQB z-Od+UCH2<-6fy+Vn~y94tq}`mwD7AZ6|NHFJS^p3YLXw`B=khZMtu6qPadK?2^pn+A48l4JExQ zHdzWCvxlQM1x)B^?)E|jR`|A0x$SgMsYe@z&Uc!l2Ewj!%|WvzBDUg=N2^`TYh*^+ z{K+%vV_C%0m!u&9l8zFdosctX?Fxi>JYI#CAJ*yo6inkE=_NpC>| zvADbyv4|{@;OFBISQ!@Zl<7rjK2yD5*{Yw_p|^Vv^*^NXYAiVC74|@! z=fqh30n;(OLguz&`_-C?c{TA6&);?PS9EN0G6T9J?}eUw z;?;X;5MTQX#=^B7mBRO+0=3zN+a%Zrgzs@4scfc)9vyR}-DHuR;C&MzDHOt_{S( zZ=~xoUMOi7-B*h_1hoEXp!o(YtkBKO?dV8--Sp8Oc#NdRSXH9Vx=Y#j*`BQJsT}~@ zb<%784I;o!R<}KeQ0Pt64N^ArrI^O+a)5t9*EW5^-9S|__k`Vc5vo%ooxhw|lKJ7b?52SM_SdoQ5Y;Crr|394%*XlwIPR1CX9<4;0w+^M-4IF|& z!v!3d@g5}@L8p9L?2O~6Gifz5#n7~2HF8V+Bt~$>hwM5p<}!#Y7y#YSGFbz5rLdPS zB@=z)3#E`++|*XZ>5;~eDrMve zs=bx%P0ld;k^Z?@Li`JLbhv$($u8iAnOS3gM(y?3!sIm>VGD6y_SE)}nP&-`LBezv z;}~qqhtCj;G>)YgN17a59FuY?*>n3+TC451$|XcEaq2BG<1L*&owT`C&sH$LIiD&>Bs+i9abl4n z4B=*huabN3B_u-Cg|OMC7s=L9apyS}Wu|t#R~}Nh#Cvz;^FLQV5(Oc>V?_f5Gf;do z`B=m8&AgCT!ZLmyUWub(%M6{IVS4` zg1c&s<>`M6q9r)sY{CQ`$ILa9At`Jfx?pD1VkrM#_MtucAs1^=1EUy73Ix8df(Yog zW5BoF$?e{jd^`}-s-05)kxl+J?M`hm2NNab2dpi3p&Mk~~DtVZE%7ET)>3sdtc0rvw7uhtb{m&qm z66eZtI6dyc-?0Nbes31dYpIqp_8wp4+M2!5b-%C?g+U1n0}z#GL*{o0bVXMr@reJ& z`?ja4>6HG0O&hl5$;I()c9c*57wH0)kEx<9hW@*L$%~@~;}!ybgSQkc>K_MMdA<4a zy9OFoQst2PRC82CpFH}XPj3k5*GUCW3yf*j=B}VMUj06Zht+T%Fvgz#JMUpunZpie z&^`1uJ2mRK*|h}yXa_LHA)X92B-&+V2fY)~|0MjUffqE!zQ7rT6k&oItjJ3i)}g z_yt2;?v|I+d>6)#SJ#oETYgq}mT$T@0B5dU# z9db9YeOY=ggP!~6ak?1nnnz1;F_FB%tmx%vQL|vgc|5cfACv&Y2dT?JV0fa79nl%B z%AAJ~J0qgz(NO*EIGiLV3B%ON^Eegdf{eHA^DNQT6~v7={!*B)=tHMaj@okZ^xWN7 z#s&he9o}TV>}!iwDcQO4{t9)~mUS7`L6z<0aZFC!-zvo_fCRz=ztL%ykv6@fh7!&6HvsR*~);O%k<9k zL{p8m66atv@8Se+aRCI<(j3O*#c_*()MwR6D>f-6%p1T`dr{8hAf4b9pjLs8qtXm* ziY}y-@EB@L%#-Ewz712AE2t$pqZ^hcHY<2R$@?K~7x2Z~D{ z#3HyPeg(@X_?Pt65L?WWR=*paoXS%0dBy5&8A;4|jcf#uCi4ovc+{wlZ{lE&;qz*1=w<7j3& z0PB-+WFEI$XwT&FBAvZO3XjXff0+$7kZG}}nQXuI`QhS0cHqNQeN4m*=db;!MTd5W z+)n=F$3JRcK1&G5nd2Lk5uUq} zoZO3bk9I!gU^tyI68rk*E3PMmX&JW(N`$Q^D!eX}^TeF{4u%~#xvJ6(X-hRdbm`mj zd;mhj94*riz14voz`<>gUZ!etR0Oq@Pd%xT_}Jh)EpE82!(>k%vjM&>?CDLwZU11r zToZyqf|?@1YFmj7E2pyq3oPxgS#*!poNp+>#|yArJmMuA6qohrgeHr(L5k^K2_bvO z23!KRJ{45!>nWq|srN5T4DfzACsE6Jkq6Uk2bUnf<}Lk#G`%Q&%qE(n_mAISJGE$u z7i64M2`+#I9?^`CzVK|20NNS>S!} zLfluyKom_YX1VdUJ6%ZELEaUtfH}A;3r+WR9%`G{(ZpZR7B}RR>Mx*4nfmGw-Sy+L zL{LdTSM(LkO_k6onZoa4mmvM!WBJvOKYQ!)<>h15n1(F6PKAC*fr3bGSUQ&P{_d9m zT^{&zYq6_RG@k=FgVL(>W`9R@D%A1PFGxvyX9%@5HaC3rX07`g!I2NNV)vP}vYoX{ zm4^~!(sXSs*Tmmh!Hpx9d&2_K=YBZ%XhcyQ?Ywxe5Imow5Qgb>`L7NJ0xKs*>uZSQ zJ&%4voytQfHJGCl+qoNDT#NtV0P8-)h+P2Yk#OCHu|F76(}8E{xLI0OS2aN(UnV<|08t?4o=u5n)XWif1d= zoA3x=xdSK>`zbm|NkhQ=uE{VJ(AK`mGl+#f>I<+I6x*nRi~gMh2@%O-bPy}iXDXOq zOS^!9q;8IW)x;kJh}xottXX580g6qP1Yr zt`N;FL?Fso;9ijFA=-!W*QrYpk|Mjkh=w|X91%mj61c9g>mw$7N$$E*0+*Egx~#srVIsAcJn7SSO_ z`hK*0KA@DZ6r4tV>fSif|Cl9Fos)m-74Sulx@4hIvN6)@O-5ICTv~Q|b{LiS8h~x6 z$I;j2)@-ix8(!*=_>^*L6QSK%s?e4ch7{t>n)0l!lyzn` zRN}2dBhp0+eTaQ6^ZKdVFyKn5P4`f|yUKhSF*MA9S+CUz*LWD2tZ9tYeFO`}Q)WaS zFsYm+Z;+a2icmqS-5&T|@`n=bLth89b(jJ&~FJI7`$h3jGshGo-_YAe*>B$IpeM&0&ihf<)!8R$l zZmk#-L1c>N^je&lhc5!DMp*kErc3LE?J?&FO%iSmXCk7O^CxJZz@SUQKiG6IFt~Hz zY_&4Y0{KT@rR7?AM*6a z7|D+2bk;)+d6&d}sk6?r80%z)RHwhthQ zOTY5_4#14n z7v&7MKjhvbi5z?nZ~8#z6&p5s8QG>`Ak*+6MIX37X%b1mp3@-M&l#w06+tYUAY>~+ zapFkf2mk7*4xHITzisTd&JdLqBuLFm#>#X|&r0TA8VGRp2kf0}n&|GUL0xgXcNt*T zo=f;xX!DEtTPL0#2RdTdHopcHJ)LBUmdZcMnatf&cyGw4%y;Vn@7c0_XRSTC(Okt_ zK&f7ySe3DguV%$;+*jQpGLFNZP}>i5mEy(E!r_50?y^7nZ&y9_Gqb5dm%uN|?Mao) ztNJEv3U-^(lKpx)aGpK`P*A2e)Iju|_b3<@o~?P)9zoW_7MR>f<7jG5QWyeQTYGDT z)rWKRlC|pxq0!GXk3`stWdRvu?Y^3W4AriS62()ZsgR-LbnLFYr;k}%bVaf&)J7{{Sp$kNft-N9e(E=ZFl_X{(g@(o zw3!W1)_5Y--QB0LV~*o0(4r+q_1hw4P&&#i#kMUGe@X zxXht=1-0q1&N*E%-6JtepA(2i6K7zB~t5&Wk&13j?-de`V|nQ z!;(kzL|{Yx*Z!#lgRaptfi#qTgBp-AK`6UD?JyR~6I`>VC3tN{z~nZiADhE;Lsqf9 z3;#qZ1S#7TBg&rt&2DGnJxB-iL&-&n zrco20KRkWfrsnl&=AGOt!>VMb?!1RXZ?S-xA5~Ugj8$P-HvUSBXggU2{~^t1?;7k0 zTf0%8SjlXiNBCL6us8f3_XzhK#tn?80qT#4)!?wOv$d9?~cB+*#+t_IH zJoTkfMs-v6E_4j>2L)QL>K@bLb!Io#@9`w}Ed5=Yy3*iWf6X)k;^isisf~#KPg7BBoDVk{nm~^7wvFQ2XX(gzSqPmr19~2lSg3l?moKlHKU>%9G|9v=3X!ZA=#CQG6xL85cBG>(^9+YZ3brM5|&&@r)IJ{mNWkx*Az$V3+g_ zYIxb#roO+*)1ELz%e%RWQ!;Vu(BVuI)?Cb9kjLLzrtz*LbC2E0-86l@wpV(eM^U-8 zW0bBEw;GA5)8LXbXH<-KnWKJ|uD&EbbD8+-OuW?QYWek5M2ar0yTJ(~>q2Bw8l*6^ z{_P6God!#Y-b8>$>n%I_SKosJsX!}CNogieD@Y{0LU73g{m*Fn$T7tJt5e8Nq`-MO z2jFz_L`LB$Qmfg}qZhv7X0B*pY^?X`6FqQfTw#}`tbxXpm!!!ykpGEQoVAekw#yBj z4Xt`BlX6^M4c2T;<$|hPC%n08CxYHq$;7j4m1vWe8P%NIP?N%8o*!1rGToM{kbumK zn5~9%L)nvdIU}bdTKgs#JhHI8Gi(<4T>cp zU_4F@%a|-K_z6w;!~L)dX~wI2Oh2?k;w4OEKp)qhh`erocROU?H=f)b1ADZJ(Y7U%Gf~3vbMze67K6Iz1a$U-;-gAH0#S-cGBR%q}E`CDlb%(V!M{M z@Z54(&&*X$m*NLlU%}w>?gOMTOz%#>YmJve`&T3DUm@jR_LK>}HK`WNPveACZ>2&W zeHiem;ule>2yl7fybvPk8cN?|$*}4Q?tRm`zAtURjAFMvmI8{SDu3je`h-Uc_mice zYVX7PWB2`LL+#+e1DDrrW}#vlOyxvKP>WJoawO-=BNx7T7b(TM4T{${QzE#!h$HT8 z>ps^%Qz0L<&8>x+DWV?1=RyC*GOY`cc7j8_rFNpCV>EExG+k3#?x}OMhS2$i-Mn+! zs5T#e>0%xH?+eKmRwjm2_sEqk%D)xYJqR){Xrj+}|5OdlnAAW`q5!RrA$1E*`vUJQ zB}%b3@sAAulC{T6mD=0$`i^*Vs&<7qA7bh6W^>6E*Nq+y8b}INmo1*H``(Fds_U6L=^{OQ_CAq>O!|`9A z@B!5+t#i`j`8fsFeD~WTxF0?g{`?@z6tlUOd+X$ak&TGi-f6!Vd`apJ#YB32T@6|+ z77;(y!s(;)tGL#;*G>8RxlLD&M@p}BAtjyfoCA%L=bk>j<$@66;&E#@0>P7amdj6d zGj(euQ}zYsgwAln=`{{c*|Q1a@|zfK&sx_L+^^NsNvFf7Y78c8#MlyyND;Wr1~A3! zbAUN$Oub%*rMl(03FI~<(*1$u?gcXja|E+AnvkMSd7t^xJdw1datbr2rw~SCI4-+I zq=)XC=I=^IexZcbW=#khdpYz;<-{j5w4J#*{*R*b{!6-j+qir0z31136Up4>wp_XQ zUX_}OWX{|JoOdMxYR)uJb7n%h1xZD1U}jM&DwY*V-lmpyKRkZ`KLDTC=Q^+BIFI+? zZdug5l`qz+`K%>%_RN<5T;C->UxNxmO6u@kuyTo5`}ED(t3iVis^;~_8>o>MA7Re*Y+K7`1{Pvo!%4eh^0n0^^=Fk#sj2<*QcKBHydND3MCYiN)P)^t?*wV3aaDVXbI7ILBoQM0Py^p~T z*Li-w4yvK&u2iI_Ew(lD&>x={D|>r(DDtEjWB1r>SR`0i=JDm(v}N0CruqSQEcaOo zHtRUw-(IR$a8G`8{#Rk*z)d54?FaIrPWzkf@Ecuzum8Rla7wdUDAc7~Qwgz^P@koQ zHoX?G)kg%-gA05!FlB}c>Ut_jswL;u{IpN`m!99a8z*2Y-n}QDQZy=WEK8Gi{tZxC zUPczRj#Q#HOr+Ao(BHSzfi9$5Zt)y#Hn=9kvSsmi}ww5bOSEGMZv`vmd7T;$aTZS zZr3t75EsMel(z5N9`Ai)V4eilbGod6`mJ0*E(nX-f^vKhBbY%f^F6zimFif&D5wpo z^5ctF_Nj>%L_xn&f@NHR3LWfBIQuRRdZaH?rtptB_HCO0SM%MmatuAP7=pAdq@o!& zkwc%F^4j0SIxta*uoYoZ*8tST%TE}4PTC^E=CqsZhal#;jv6rW4Z;9_$_>blP!(S>X zikYf(KZ`U`&3a>Q-mStVWi)WDX!h5yF-vE~xILSG%q#vUx5Y0S*Q zp{hx_e(j?DWYeLg1oNVDRMb+9SOj-i*v~ZQPcQd|`2FhjU(zk8YrTGa^4rQ^&%dHo zPc0?Vk?~K;BmQc%_njlSH6B6veYyEf_&jPsqLC%t=YQO3@JI>47UTKjF?Y>Y?UJ4@ zN2u}%yH-d%%&h6WA^P;%Q*>cF>Aghwq^G8YX7g!1Pj=C#sMC76`Wqr6-p#RY7h~=E z(@uhfjR{>nVB0B$Dchb$cOC`|Ys*Y}IeP5-IQ=Bmm&Y~Um&>kGbfkrM=5QrP++HLo zPsA8sP&fYi2Ey^hg>!nj+9u|c9V|_bfF~CuY>+pde>zGBtVX=hyAVNTf|XH^7oJDx zIf-k0#&67|&HYe~=ZY}{?W?-nY;<0jS!Ew-ZM(c7HawOgHWux!g}Y~Gt_Hop zp(b=i%cojgxLFIoS;=RBpi2rM7HL!)zcw|g8uR^JbYJ72Q2T6zfq;x1)~MoV>bIKr z=ikJMT=B{bqO(LuN%SR8zgI>qtLb+94#iBoeL{z@58zyX# zc7RgGR05iLv#XQ}%PqAngl-mIcda4@{zk~-CY31=oA}I8RQ^oIS-PQ(t~C1;&I>CJ z^aAbxcMej_f81EeI_8b=?cX}OfMJ&4$kd$qXMtc$>(HyY?JSW4&v%8?mq2T1sMJmk2Y|DS94|HY49N|r&hosBNC z!5V&5-j{AX76G*5|HpDOF)9Gu*R>T7?OLgGetqi=b>Y!MJMIKkIO;2QUzswl<5Bg@ zHugvmo4iN%wmV7%yc?C^LayHJcMF&^niDn@BYtyEJom_vuS(mdN>I@HU>W_dGdmZP zKcgn_Z<;%Fi!#4-Hupm05qZEstS?08Oilc!qjAuy$E(qF!NwS5bCFR%2~fc12(Wes zDd(UN_FzK%d}!em$LfHhTJp1XoJZv_M8oWc_nf$|hXY$2_RnHN26d3PU$)^CVbGpG%ZKZvOPGcabnifn}6`As!3yrNi ziKXsdnaSJ+tsU&m#4tf0i9pg-UB_8zkDS8$4v#yX+fW4ynb+FjX&88Na#_1Z?^&j% ziI~5K*5b_MZHJyxW-e+^T=aGey1-U%&%MWno$IeEx5y2oS&6-hKo8zuZu1vi{??hB zfhOacV07NgS)`0gE3Hpn0f*h?5?r{ooX*~Th>A;IPIVMzo$+N!6s$KeU>A8GPrM+S zJ0U$oz+_hC`tf?$CK(kv_O!NevOlI)WnNjS$yGe*=c4J(K0xLgKNLMcp-RaAu|#E} zl^&95B2f-`H&0}JI$aqN)~*NXI*o@!=5AfO;fe?h;AcdHzzEEVW8IrPHWluksg7Ey z(IDmX|HpD7B#v!bqD$VMzGyP${DS%CuX$^{0CKhv#gJ_bJw#yElkmn;OTWTvmQ;RD z+M)D-y2RFNwgsV9>?7(qMUA>^=$Ae2$RxS4E5&IAbMf-juxY)IhDf9!{!I#KNp)#K z!LDhM-2)%ba(>|5XAe`opq-60B=-ZDFzDv=knZOO$Bu<5J#A{jdT(@AwVoo!3v*Qt z{(PXV)YLphuH!!zP3>jHFpf)f=}-CCRf!OStCwV_@r>F7&miSY6g1Xo^`*bI_d$dP zywKP9L6{y7`z69ccz~-eRHaP8d0(v zbLYhcBb^#$sA+CBk#)mYW%@H}@UnN$=qCL-?1B#&)b@bRDM7Q`Uk!~o-|vK+gRMf;^~|xP z83r#3k2w}3FqqY_Jp=`EUV>-*S}iig(s#_GPnMbNyVfshB6AP5a@Wer97YD|iq}dD z|GnE9=I7Tzddh&hNlnEBjN%gE=>RUx#10;1r@*y%-zQ=k7mUm;b7uIO8} zHwHp3S)$%g%`Ljv*|gw&1Ee)*&-N4ssu?j$YC_&75t(WeC?*M6%-Tw{$LdAAQ>iF=<@g?%WBo->gdqW;IidIxJ8SWT7L zj*+pL5*y4juOv~Z;hwSEaTw(ET!KMBOoCifR&NfxmV^I*sr%j2wq;Cm?Ybe(%o&l> zY97tzO-$`#(jwlql)2lch3_Dc6V965^My1Vyf(_0f@xy`YJOA*KQ?zcK_hSLib-5X zTo;!`JT86%{q2$i)^NEJrE9`#B36J=zp|E@c3_>o9ul+}Wsnn(zc-X>9_ zh<}3-L@RiUNFd&8Z#Yaq*@I5eYysvE1NG3Hub36BywC91ttHoU{R$~kKX@tT<;Ot5 z_1NBGZ(E&c(ofDb*ZAzEqw}3JcTbua-^r~Z1DN>l%4ywF3aYaIu$i1oDho9j(N=fW z2F3=R78W4hOMfQw^Iv$U@8dlS_NJ>GX^4cqS}2rXZtbLi#hoMfrHN#(P>x&Si*QB+ z=flS*ZqxvSu&1cn8wVJA=b_=Oq4A!0Uf6^=8ONkBmxH7OH%nz1SH$S75RTBM@5>2b zdALitjoDv?JtB^ta)sbnvQ>)^+nv>W|Kt73E$^$9sSjk_c&~49t)9Rix!T0|%3Zt} zKML?CX+4hq7rxIOA;o~6$NywHCW3(y?~A$c1+0-+wikD2u6Wi)?3%Wau0OGgwyS5P znuV8BzB0@g{J zWtY&Iy|xTu#axtoqHMIl2|9=2)9G*uvWT}2ET6@%RiErF#mF&y+897yUl^L%7qC64 zkZH05+FZFCqqTP`5=pxF#_^;Gpe5G@V|va>V*)^S}jU~x>I4Lb_T*0m~82XxB&gqs%vbxLjLn#ej_EE!1AJ3Nx`X1 zg7p8o1thK6qwGvU{od=EGw!^vy=4q30|uSf-rdiTHRoaH3irJKCWWQ(Y%zoc5x=Oj znZWk$LdnC6QYi`WOXqnfcv0f=Lo7aZXRaop(be6LC&|(N+vU*EYhkpcXmmzv@j7BQ55i>Lq@YYG0KMjALz%)fXJum*N^0DJ{u(38T{jZv}>cXh-f)gDbcD^w=;f9oXEh5t!PL4g@4>H=pI&A+QN% zBx?M!ssa(xVrtgdv~YN7(h%)>xa8s5lzE%Tv2MaHj{5)NqeIL}Q(#eGMdM*+BfM4s z=M`-HR6Vh44MG`!ML)7VPY38CJzvdw2aF}dQNhqd9hi>$!kf+n)oJh7voGKo@<%82 z&cEJ^CAQ!#WE2-b5W$WiRaauzjtRvtDQNvamgrBj@qv9b$#*~98?IbGunV?fH_$KM zFcQ%niZ0l?t&UqU!~*7_{evFt(t;YV*~=oy4kdsBPyX7g5eUBq*?aClv@o5!82eX1AzUt&MV zWssyq5af|+7BDDVUiB_kgF6OSr=Dm@H%t99-F>7;Ru*TM$}mT%uqsdc>p#>W>jy{G z=y|I37+Io6b{Z=xUpK;Ba$(&>U(ihjzdh4=L*WeaK;8_%aaO9>JHG1zcwVB(mhIMe z=!Dd81{*#s-7B)xEmdlhdQL`}&Q(y=YZPIi&BZ-f-E$za8vdq;6AmG_U3!!tyYe54 zsJx`|SKx!!-B4-IKIv=8CK8TA@%IFYTwg0$Lc5_nEnp{>Uud))^p#w%pM6i6Ec)#n zOIiWzN3rk|#ly^~@wJTi_br(VkUe|gL#4iyR`%|ygsA%lecO&_eD8v2`AJAW{nV{S(03pu8J|n47pTSA>B%0w2)(ay6vEk&!zbg6r4$iq6ejvMU;ZqGp8)uSNkaPcyw&Vna43T~BKmC`e((rjF+ zf~?6SHzFNyCH)=;P6soZUru5ItjM@y>bJ@r^uE$XCs~{qJoQcPS^-)db!*{}t|Z6= zE4ZINYszYWsARfT(tW@%L--<3+#2ijFe}XoU0IA^1ieSuT>5`xrqoO8E{2 zlLi5;@0>d&o-k8FW5lFa5CvR42Z70iSaKE($RGuGHdbR#;9o@ej}!-Ny?fvivC_WA z4S6(XYWHEB$as-)MaTVRv%YvUE?g-W^9jo~KW0(&VGGx7*S2XQYcDRVnPk=ryu)*Y z7EsTvH^hFNm#p;~UKo~$kzsF~=kWNfD1q@Fa5hNT3eq^I-rQyX^){F@__pmxs6=pJ zPJv})I=)@MGllhOB`jD~Uf%HCG-v*yq(Kzv)%15%VlZAdAOoVpN%mn|-X+^R7Q{cD z)6fh;hJBfce^r`V*7;AbA`_?tcXNOE5@ZZE_b(Uq4|3u=P4p><^kS+El6CLv;(rEv zevFqwv`+=y=u&yS?b+&l+2_$f_PVylSa0F=OaBBsMw~Z2l$xF|ygxnku}ywMv}d6Q z`%p^(!l_nZp9&mvd!azaL^%(qs09dFYWQLDP_ECO{3-|{b?$lJGTefG$5o6`ddwX63gdyS>4RB1aAlGiX@0P_i`i=Hl*dt%+}-l zwZUu+NNN&v=mg=jeF)rwm^HaE7&?=ir?dnc0C@XK1p^F6wvOO)0|S-*oX`xmxC}&k z>IMTe4+Tlsrd60PbyyJJ7Yi_l1O70Vf<$dJVyRMb6!+5G`2X=1u?2)y@qBQLJ)Ae0$FKQ=K59vUN83S*!MJx)qF@r}hlwA5=t8^ymRRZ!_ zE2wjrhsq!`F+Oe93lHa8xGNYD!qD$TacS$N+KPVeyUB;O%A#d^Mt?6T6QSbFIpYdp z@p!vd^&ImSz-@YDVp;?iy!%>brODDiZ5t(=nq4Z)hnbm_TK zO|w-2!S#eCt~g)^=4d#b*k$n}eFpg(&A$Q~%~uf+`<`e}Xb5;J9Q#5Fn0Wz*`@ z<0xK$o}d`@gg=hu38NVI^;M@O+9^~j&_7*Tg`IpgP2;8fMB7yfkPpW06Eq9=yKdc< z$@JGAJZ2GDcCB=yw>~!f;O4*L4o=b;Ci}5u**2T(N3sY|B-!3#exJ)ol2>$IRgrv9 z(UF}f2Dke_mngRWXTZ`}fQ3(p_Ch2J|9J&}$&qgsT+;oB8h-vC1$nT+qd)2L@keIZ zP|~<}7f`}0rFBQ+NSLf^1Ne{SN1Tw1>#+$b=45*oM~alrv#fRGBT$SNYC2EGvJdAp z#~_$2jCWFHsipduXTo#08WY3WZ8>;`PY)rx(zMo$@q`|D0k3%mHg9rSIE_UvoTX{< z9?B&e1e2zj`DY%wl^^Z8!lE|-49KNxm46|GVNlGuR}}gWkmT-IBNI=?1V?TeefTT$ z+t`*h8b7FXd?ecGcnl!Nl0-hT-w(@jJvI9c6{D~# zJyiA%KyIGEFmKNVuIn-zL6^PI0P{H*Hjx$&5VMf;rcY@Q4=!M)fo9hX_t)uHHN zA4U~{BLRUm(J-G@+lK@PFT{34qRbVgL@;en$y8ZcDGP31GYAr#6^k!AgA6NL|`6nt3u?$}Bc~F-y@0+hdFM`eGKH!E&Ze zgwi1`A9eXstRH7s+ue^o(cHqONVwGZVW4AZ@v%V{`D&>kWYy`l%Uq0X zvci_;Pt8vxx|X!42j@3xRKS~dmI=kh0ba0&K{fgDYwjy(j=H9tI=v^qsX5XEQ1rJ> z5TEm_iH@S&lEF%%i7eKjeKR)O)Dqp)Xo0$*Z>Rk|^-FTdw9i_RE{`_Bg{k3Cz2__O z4*uo8O5ceDtJH4T`0aZq1UHhfoh(<7>`%DUhN)*^CIEk?V~oWl5Pybc$Shk`8iPg*xiMAM*p8jpyauB6-9!xhx zB0?I&beN~lpuG01x9-XjfSL1UZvXgoh;{o7>|Y6tn{tIC-v{#dwfSE+hwE{RCMm7> zbYA`$BX%CC;v@N5u>iu7^ht%4C%x_k#~#EC`&RYxkqDmTPnR2)oM`OjjP&RomO_Q9t5W6Yd2^94#$ zF>ZA|5Ggym;mgcl0F-RBaP%-`6D|{8fAhoqTE%6MupuT7(3K0J_D`dpG5j~17BHa< zNQ4<2nt9=`RhFEnde!3N8cBl%xOa0WAjRJ;npvrn?=z$00Q9@?<9dddp7)C;*>v=^ z9P)Lm?BaO06xO6%Txq1T7_2@YZQ-*O8~5=|2oG&nXiy(>=Z}NQYsvXr;S}NcGmp&s z1a2)wH?OYKl3_tflE^C|DVBD{sfWxrW$M-WV|~}nN3QH0$fxb{KAd}GzPev{SKpzK zPMw}3>3`-Xq7yulC;?o=5AH~nw;Ku>oRP*|f<|uRhGpUL+t6$Yq_-(vWb2_!shrb3 zx7LRv8TPn+BVTn?rLj!Y5I5S(Z$xZq13P8==5D-jgn1Jz6j4$55E~%$VZm{_q_$Q5 zh`%rBq(U}fR6meo54)!k{@`)A9AVm9MgB-oRQMvn=-e8}abN0Ic^OMxeH^0ft8R)4 z;eADE^uIy+fE8<3!Ox#7?t_^PXbakWbsu;EZyMwMs~!z9yV=n1!(PfM#vL;qgJJG7 zMEoKD4jyO!r1HM9xO{L{Bh@dRwugxrQ)Az#h33GKF&rOg0YmWzU-xs}52<^yO(*e( zX7yukO+;UvGX>Wsx1u9+a_TAFYgtQ#o?xbh@84P00>)zZ1x4l(I$AW6;4j5si#Y6K zXHra*qe59Af5Tdl&jN$w_0~~Hc2E@#G>TtV-$vPOg2ZmG+})-TA6O9~T(qG0h@2w+ z0o5l+wFgVtO;;`LO?vWT^xaowiggB_QZ05b&08xv@S>uwvoK! z&`$G7;iLXXZU_a!!Aa228T^>{JzcIP1c?Yz9ZecVUppHgjGdG=ufk#Brf28oz?-?^ zX|=piFtycH72`#$7!m;~Z@H^d$H1ln?)fZDQ&|i!qO69tB3wL69X=cU|HTN6ggqn1 z6A;YnAjyc7>$?+caN{H;F^7RltB+7QA>#Ka#w+AL&v=ewnGi@NjM5v%m*$cJ2n(zI zZ7|&A*YyP%_Ei{v9in|iS7&vUJ2w6d4izhu|4!~qoM?0H7wt3Q7R*!Y3zGk_&(@h@ zVyu>CrUlTcCzC?wgw=1Ng(ev2PWN#X`Sdw4?^EuPh2#ko$x{)s`UDN{N-dwMx6F-Yl+!s9+BrqB{0lB;*K=SIPlTM9NTw?H8fNJV8w z<6`=%7t1dn%SFXf+_)MyycM%1T);T@Ys@JzL+r7q@Xv_VJ{pGvJ%o=3%sCkLiso;^ ztOkV`GnL`&g7cYIQCH(C-iwTk+wu3_KQiXWFAY7hjj0X(lCj;w!fHT!hYNT( zMOdlwIMfxP8~8WP>h+s!8a5F<9^2Z_mL*13K1xYuCKC0|>(XvB(*)$PtllLho<-g# z7A0fLDLOg*Xli1rTTOnsje*Ur%&zeNScFqLXP6Z5t3;0UZ4RBi@Of5&oc*7w zsR}cMId5p7+Up|J)=zcR)HE+Uw7K9jCSPD>R~rbLNih(8f|_X{v-jLo(=0YGuwB!3 zRc|44ZEhX0|7+?ToLK(_iRRCIipsY&Cb_-U_q){bU{tPM`evA;9lNLwf@ud!0b}Vl z3RBcubS|~Z4f4}ck*)&Nss`fJCfDW+#4Jp>=e|ueW&jPi%W-&BYOB4-Mge@YtXt{) zNq4R|%8#|5du+FFG9C;F6rx;f=k44hQY%C=BM>}IhUS3ktO z{T8omgd4G!xJlx7#Uiil$Mtw$7s`Q00aG*6MT0WLiiXn;Ew7ntlnxy5#~Y*9u!%LB z$q%jUK1zGL-Jce$hDvsSwYO;{2e4=c{WB z*o;J2B;3>wxKg}gy585yRS)HJ8ddk%YO?kS-EiO?@N6F~-mS8``uY$Q zaI4AF(luP;YoLe^!J?#6jPl^-E1&Mp$D6M?OwxO*3kI<$LkkK|f~4x-S%>D%^<>^A zw`r#pz0cQT?GS12dhj=0)}?{cLL3vF6{Q*GHCI4@4bki}_skoT$Gm}K27$ zaC@PIQz($=vuAVJ7Zm|wYct)J1cYDCFl%gV-lbgn2bU)dA$MJeQ*m`-U*>xbiH$9k zU=03tX0L1eo7j-N?d<|YY5`}=y9KOVNyeh~4X8bjN`QzN$E`~~RErhxZ$|!917nif zspuwHGI>7vy)lnEy0#8`{#3(_rQGj2Qyn=FQlvz&5c1;7)|NX9jX+lcm1Y?d^Wy^y zhmadUccImM?*r*=5mcr#t}#(V=TBD9oL(@Pf(yLBWGbvZt6}GyR%RJk6q`E8%uNLE zR%_MYg_xKC0=CW((^~Uc@TxeUr#}+q%kjLJZwK4Pw2jS_SVCkuY(pmFO+e|qUW}l|gUr39tf!3)f0NZW;eLd((}}L2%plu2pqxo19BI?l+5Ukr*eT=4j@)AlZh?s;|?qb5+$*k{3W#w}4CJ z!;2&R)@^Ku)`8p3@CLRZ>Z_-y#IuiAtoyE#1zu+Ep#g&b_{#K-%LoxRaWkWD@jROm zzl+{VX|^`VJ#v)1sE({G?gCb#UUGX4Rh8Ijx}7<(RT}QINL7kQJJHzdadoPQ?s~Zk zU>CDo$BqO1+mwG7%uK%0L2V|E{vTWovY>+7$wPMkv8<=^B!wy^<=HgU(q!wxcAtck zgdpZ~50x?iIK(b_Qdzu~+F80+D;av&6u5E>}hCPsg>|>HN-^7Ar8$E+bzDy z>WcaDO*1xr0<(EGSFFQ_gQ|KlIFe4fZ=%Vz@d;eOm`PlilSewG-czk2Lexa{-P|Y4 z8F*e8I_JO!F!sS{V!b7)u;T296%$~3-j0lx+B7A zm)yIw#8Fvg+o+(1#?p^b4hGS({+sqpZFi^cfkxPJ8fz2M*>^02#bsLVaF@AsESrb zbqt%)>(`=&WDBGU`eT2(#CW&wgqC@^trDu)G-mSJ7z<3h;hTXE~}jDT+3a)^CY+_t$ssv zz`J=<$n`5!(&3(Hq;5@6&;I#=J@T~E=@ssIFKmNS>*vhh<*GgP;jf0;<>#XH0uA~x zF?niYaUO6z`OvfC>oX?>V?7uTma{vKg60m4<6|+YwS6!3Bs}kpRE~{f(EzT$>d|-T zzIP^QFY#@LHy7$1!~FO{gQ|xZQv3nOY|pa87aZ(=75z+$`Cp&SKOuMT&%EH?|DVsf zyjC*cNRMw;1=~@=7=EQlo$~A$(12|Av-$glDXKhK(vnpgCzy+r{dH z76Vb1ElS_wPkH|LKbA6$OfT}^jv`qyj#yb)D~rL4BHW)=qB2ZYDv$DsuuKN{km;B| zlwT=J@f#;y3nT|79ZSRP6c+G%sZTcw%DR9&9{XuZ?C0!z(4b2^E5_9vJF;aT^$-#= zUqESp-0s_$Da$o2l89CMRTc?X2{LiqpH5(T#UwYMIJ!W%1N#*^PzVtVxS~oz+aI13 z$^-L}a{b|CRco$}ce)kiM-FnzUq^Lyp{0+oHA{oJdN^d>w=Q5l9`pr+5ymXyG0u2Rn@QXtAx_)d7<=V?n)MbeC(biJti?C;dzP?I;6?0h1`WGCfI)WZv9BJy|JIaze^*z*IQ8D zy`qjql^w#|LQZM^SZI%OYG)5V~ywkoY_ zI;D4tgKCP|Nmui~%8cK4y~iP6JoviG{vXprV}D`nUa>S6#|w(K$!&s>P?tN6?N=+* zptg=(|NXOiZ(z^_we0R&=z`%rT**KSd1pz!0(N&W!C3*%bq>nb(F>+?Y1nuxOU z`%$wU;Aw^~m%8k2lz>FH|3$uVNXCyfQvb(kHvYlU|BsPmqE*qj$N9za-oy_jQ@clI z%r8fiKN9=mqPRldf)1w^&`t6HM2k{-$RegzIWHx$fdK((Ki3+cor$4l;vnMU-c7Ny z3@+Fo_gUld888-Y)tRSxB#`dAAGQKvVk@L_YQ{jYR8UhUhFBk_<-MAcQ&CwD;`Qe} zX(9uqI0s5*qN-&_NNwELToc3{d1dB}%<2{VzSyBZOutc!#WbK85j4yCb0{Mhv?#Bg z=sV!PI{qQ-vI-H6kZ>MUG7vA)c=usC)m-K7&|j5Zgeg}@U7y*Qn}{1OqqyGt=F`eN z*$mmtN-2XFVxEjj{%Jq8tx*FQ$Bn+n7;jiE4>gg&(v z?6%qv1$E>enyI0ocO)QBaIW7%l=Ox#@`FiFn~Fu5*%i`wtIvEIUY|6TQ`^z+Q*fF5 z?!`&{qnrDkaJz_I9rM4P{enqofYco_TaCbLFz1;3L=38H(A##B9VsRlEZ*}=6f^$? z`NFi={jDjT-{XJ!MOOGQsZoZpwOZ+$f5G@?rOOw6*BPt{6SBC-5$o;~$LHUJycVGuyc6ogO3c_y4uh2HsY%nN5Zp5f_PCmW zBqg)Mw8a`KS>}X-A>kU3$ihHN4M@p3*Bt~7DqFij1{^f3hhwXAPMirfv)tO#@S7&tcxVI^H^m)I;C z_#}ubyuR_jN0+<@X|d1`Yh+&iHFUS+0-H8HLG+cGc?qx_)*(Di8hZlK z5Ge3Xht1pm8758Eej;dSbXZ&?#SjcFta6$4uF)VovB}UivAL81y%hicC6D0sZ}hNW zQa2;*KNdKd!uxQxUsD~x74L%cuw71QC^6X~(GtNtaZJw<6R{ zo5Q)Ddur}xV)D!wwOjor08}0?>BEU73P-$Wv{uQS8Jl^1Bg_$-neZ&+e%QCVRYux( zh*v@sb$mI;g-hm~U!Ik3x>p3x4YF(S_<--{E@3oo&f5J+`AR`}f@ZovO}d_I(Z1}J zL-T9()=o*udV=c2!XurE`bGb8nMz_FOOP4B%cyccNq5X~&1W$6C)I1FIn{k==@0~# z;w#eL+wiG9f-3k1LEoM_vJ$3Qo)+BK^%jhf2K(2IPf57{qDdG`?6y^^u_3#`sM6pG z1Cy+XecqhgZf4rwVDiRpc|{V{Xo%5u>-&olW>~6bL{5YH?Q~h69Rv@@-b^t$*jG*pdb9mGb5}oPwk*;hRGQVESf_LNWpJdN zCP)$;V8v@qay`p@MowYy@tl!<-22sZf`RzvNqW3wm9GX#lAprCKDU<^4)*3cr&Bt% zFU*{sIR||x2FFaTE^4Amet1l+h~UpiHasx^+bTXabV6q#E#NheY=K`JCdo%X;5jeb z^EsqB(lizSOieeMh%V^unl&~(!D`$o;cCmJ{!cp%RKzxd?Q3^NT;^#*@R_Yfct6Lq}K{uA*(E?BZFwb zjY7=B)5zlgSa$Nyz_deCQ}e3H2(xN1*9f*VVpImAz)%2^uBRNE)a16DIeB@(v!WXa z<&Ovor654x(|XR7IJr}F_yru3SLh|xs~Q-{RVr~PYH+ZusSW+$!1_l^%ShYHdj-S< zmYP?5VF>PTYKOUYMkUIGC8`ZvSrc(kec}@`$kyo_mciFN=VhM2(sZU;KB1wTUvz$h zEao%$yo+32!8iAIXOZDWj8#mrh%83G4Lp);X0UJz$N6R{_`P&Sr5LJmH9sp15@TBk z^qGyl+@}Js9C!7f!O~4`RZ?!#L#`WAoP&jS@0s7GcR7e#7C5EU;!Qn2##U#4u6*^X zhZZnUi*FS?I(M{h-a;9Pqy@7plXKwdHD+~2y{HC=^uto^)>8%oxh)OJDxS)VzT|)J zSh9PY8nI9&-?aC`_Ia4zEhm5G6DHmw)CHTAVZ!37pEhW0G-#akG%$U0vwHBEzWOmB zAu%P`{~XxZQ%jtl?@b(Ra;r;ajyy{XxFS8KW)|oh1m6ZxS*I`~&b-j?-fMRd5VrN@ zF>%;_xII?})KSFHGf4!{1jIS+U<;4}1fR~*%Hk&XxpwtHz=+OkBWa%A`09nnmC0F! z=bquN8aGWz5se0li@D2%y;8o2Fge}$mml}M`fzWt|D@bI=H}Xl+5g8t4ff`r5pG296-w@9RZAlr51Z`fRc-v#o2&@DnL)85Q zO*co@VBKHPkP$;p<`8MX%;E|KcX>8aZ3Mj4TXZmN@rC(*O>u}vK^Uk z%U964Pa6UHCS=c&{=ew5?}{!Da%{Fn9^5hrpQ-+!;5P7bY^oo6KTc!Ut*(1fLn8*2 zl2W8|bI2@7#IDCjNGeCIGA_km!fiZ;%Mcc`tlz^JT?#)+V{wAk zZY7>)xWurwJrbVkOtd?4=9?A5W5T?bxgCs$KTvyVwrWvtW@+5QHizk7}W#sCy z!k;blSqVHzP%?z_hGv#G*$IL4ojc!9-~V+x7Ifk7Qo4{<&LP*kIQ$2Ge~{LKXAQVa zd0y!*R5f#TQsh;1Gtj_KSrZrI7lkC)$-zRHT`pFOeuQbC!p6 z`QN2Xy5|U8X8!sl_Sj&4_~eF-StBE>>WYnw$GwdjD~JNgwaiLH1H$VCH!Hh@$ve*^ z{mgFr49e^)&w^`)Nby-ce>v0wTTsO6<@~=cBpkyG4kPUm zhR#y_Pvov92*oA@PKQhiV`3r(<=UH0IQ{c?oS&P-_y(s$e)09cLN(2ulO+#YV1gtB z7e6JTP_O1=`K?_9q6?$A+;f`r zE(vs@seS7SEow{jx_l{R`QmjUnVT1&lKMjwc*}mUv8f*CXSi2v!pC<0^lZ}3^l1?` zO~K8fkIrd$dx-q#A*N#PSN&s)BW)Hlx?o`!>+~}`O)%X6u8i`i*$qJI^cwlf-2m^1 z(*y?yt&Yi9?}YJbV&vBchX2kQAlK6#-^}2b^nVrn_!R!aWRa`#d)f6X-|AREl#VQB zX!L4gvggIVDtnY{ku$bBbtxApmUay(&|3*G#q0B*R&!6n5?``J2qT#_Irl{RE}l7> zz$%bv%tYs}I{&|u_Y@t7A~g*2I(V(jmnF)Z4%`8$D!-O;0{2aRb8r9o+g~jdM-vOi zDPkKow$dVZfW=!4Hl0!&Ys@RPacTa(VTZsf0Hrt9xlAq5X zLPGD6t~kmYd2&@ab)Hl*G*W)a=}_0>88y0X>H;t3<-as zEYj+9r8a-1mb3`Tpni;#lcQ(jfe8}3 zn%OE9KD-~lDE5{+?v-gW?QP#Dve@AX?72yL+C3w#Brhq6J!`w=>lV!)!bF}=bb&eX zgJFkAcvVhm>>7FkL*twTwfA>v>on0eLt)wDey@#gXV(WFX$M2H>*&v+?pNVgQ5Hoz zf@0)Ha#)qE-$fFY*QhtP_11m%MsG}*VnM&C5hjUeO^!GdW|1>@Rmo2#Iq7?%sbWe9v-1cyb6e87W<4N8js)goBK8?Hh#}ePWBM7Vx(S8MzjE+?+og&qK!coHwhCXQ`;EIP z3;)OB_jlW@=~vSN;`~gv-rgee9@IGy2dQZ9GZC~e%2W5kGfBm%WR0G?3o1iz%uR%=}Kc&{wTXwW;N+NsjK z5{Ydr8sv$PW(`NR#{ARzSI|=xH*X+cgUUK&m!=2Uw-Z zBrUn0XfeUOL>nIWlUeIbCaQ$aWQ|PnN0{n@_D;<4G<97iW%-7`LT5agYZX=zs+g4q z<~Gd~a&OUqc^8*9-X(*Gg_$MY5U6Yooq6bnQc|~PIx~@Ms_5*BhmU z4c8Sa_XMg^k z4G}Hfbfk&L>^-R0U%1XxAds{3H`*)bewE+uccckcH@e7|I}I`BI=I}no-x$rscs+9 zF0qqIJNNoVxC6f^k?Nn;u5uov;TM_{#nqQCH*&q90Cxh*86^5vmilJX)e4MbX)!OU z-Emq1dc~1I*%Yr&Ptn1*(~NlYuQ?YUbDEU#Hc|xiz280sA|b)Wpi4odc_wo4yK&c9 z(&^J;7>Y!!(YTC4n^HS!ad@&N5?+1!3z=)!Xx@^B+)<_9cF6;rR88`O%n^zU8rvKr zNR1W8wQ~0J!)4o_k(de16n4rQu08y2|1@?v+KeI$DH2Fq_0!k`(u-OLk@vhbAL?Y) zj7qdcCzs5P^ow?>^W1h(L6t`Oo4pBIzN!kr5L~Qm(dcpaAY?ASF@7hxN&Q$jEnVs@ z`X$UkH|4L&QP#13=tT%&Tqrt(kE-)v|CpOO=iH@I^@O5p)4rCx3Ge4PKXCn9rJ<66 z@s>HUCVuMB+FUa|ex znNU0J)$kNMz8`0(`e(86(V-lN@%0+jj5vP)jmNxfh9UmTy|Fgcki4`?Af&pzhLwH~ zil15r>3QdEc6P7HK?vNW>H0EBR>JAJ^rJ zJ_^6FDEy~f<3g5sz&^TMP^tZYlIPx1VNiZz8lG~gjb{PTf)o<_Rri$~+=D(gG&S8~ zuE-ypIpX$nVA;$g?+`1>AQmeDPFo^$=Q=l-ScAqx$8IhBDJ4?c7gEuZ2Q&zqXVf;gc0T9im z$5J>SAKohD087277{sOs%hvyIh$8ytp>Ypz1FsDB$Zq-Lb%D8A{3x$WovP7A9jKcs zPKb>Km^zviJQ^BA7)gC6liBwb6L=8v?{B(@w&+bcaKW&JP0ySVhLVPoX2s^^Ml!Awp1Tyo>l}y>poAUX}Ypj@kDE{ti z<-W{pM6EL6(0{vSFVF0N8rjg~S~3?;a+o_4_Gz>R?ZNzrR$rKA8Oxv{dY5Z3Qd@fq zAuzJV97jT<_@AN_@6L?VK{u#g5D1t&;*!cH4ek(piEUffIG0n#f~{xpTTowW~^cytRPd(>*+wR{Sm}Sns*XukzoygR*&LfF#gWoM7u;A{A&8|_s zIjuRhcLAGl_ot2m5Qz=Cie8MYsex{%)l1Roi1SaD;M1J^>-vB-qv+5tqQTL9n*5ef zsYl0{gsTJ`@`X;lAnz2_o zX_c8@y)<>;BA}UjsEfUK5nFb}29oE#tU+SfBuI;ERZwqd4j@v}0qc$=Fm2Fehk?iL zAV46HZ*t^auP3^X`_Z!zY+&99VTf~UD8GAEr1U9*KYC4cmcnjXr-g;UQtVYP{5JlC zEh351vLm(r=<@{H)f z7*ax=HgKMk;x|%5=JQ|a$vrb9ifq&*XpCi&sG+_lXZrO_SU>;vS|#HDIQsIar1JOw zrb&|&MKMvy1#>NzP+W2y!7atLrnF2)NX4|&v=Nu|lLCs0TAF)0U@n!Fs8iOEj%?OcLs#p>VhrtC}kFZgfrcdZt)w$#c^!XX>&FPG2! zd(e&St=(2#Vf`Qc=Qiah9)f*;0`Cr2k+To>S=C9{N?h%R))Rw^KQEZ{WTih3I?g)Y z2KtshyEyn&nyk=~IxMqZxIePk-?rIgrBc-6$6gaO9n-bkku2u?*mrKs^_a|_=KEAV z(+I3mVsv%~Cut)}(cw2@&ZQjH$cbxo3t98Hv3&YW%=3zt{_UEZW0x2o*$Ll|2PCQ{ zUR&7e`RVWF{oj_-0$kX*xzDfIVIzQwhmFaK4RqUIdp@3#Z;`*>b2`i8PEi#(y*}r3 zy>G7pZXkvJB#6F2txzi18GbqZ%zQ|Z;iplNCTE#AV|P(lXYrx`rSQ(}+2LzFW*dN1 zao%ZmONX)He&M zGoAhY5X~^?oyKq*STn%D5O^Gv2Ba%!v40Alaoc4)@*3>Q6|pG!`7Y}z zE~mX^RyR+TC@Z#RnCKzHms{slQ7KF)DQEpltp z>;0v(ivyrLKlKT2uju{VC{ps31jz`OO6kT7RY^*z$~TzKXwE)@bF!Xd0lx2ZNZ(z7 z+^F@^%&)OUM(m1nM9i_}2$f`;U>hZ^%U2qjW1ZO<4FjOl&+!jw(BTbj^QRG}#`^x4 zENOT@eOM9Uc_2!>as2SlR}&=~@75fuM_xRbeG#2}hz3m7E4*XQs(E_OdE}eF$tGyW zPatXxdHj{ku=GcxNBuayBU1Ly-|k8Mi2wNg>bh{>=#RrMt^cd343)RHt9!eo|CAfl z=CB;3v_&zRj0#v;(tYshkiAG?N})tyiFvhS;Alw7xLb4W|dxV!NazLs<5_r|xc zj{Y2%nxgSxm;Q6$$Etz{Z9iS5*++SOYM#`;@cjg9A&z~yBSx!wJzeXGUPx`g`A)9Z#5?Yjrz1jH;p50+VlyuCm2kSUv>{_Jq4rmo7>xTW>& z5B5Go)qOwj+rR(keLw#sTl@ZR{iF(l>BCR_;vN(nmHgYyTR-0IQ}}8BPd~YVB<+tK zt!{5A4rW1KJ&#b7Oy%tyUvCwdJnj6kZ{JR$q`ZM4>MQOQ?4+zEcE3Ex&5;eLozFZi zKF)l3^2a{xNptJWv@v+{eA9`Y@^23%H{7>`{E{z zmM^rrme_VsGh@6L)UCoqDS`BXsm-L^T1z0XWk zi-vs9-4@3ni~oQ}naFUMLf};}Fx$Awv>|MPw~F(@)&DgVuA9L&0Wi})=e~zt6^FlJ zcALo2k@t$@&s><$j_%+m(uFy@MDMw01U7Iu>#muOZ00Z@&lqVB1WJ&2q2A#E zAyG}UnjkhrYxLhGt`ba3YIzp_eI&pR3K|THK8E*heGtTa%9v8Xuwf@Q4L~bz8X{&< zlU0U2_Xq_#QLq?)rQdu>(|$8N?BsaUDi@LMgAUxkQ$OScb56oUm~qv^7*z|?gU769 z@RmTnfkIg5SF_gXDa2bis29LF_z!qsdLqCT3}&6EjL|TTfK=kAo`^%|Zzf$XFA@jX z7qf>xK7aD-gL#!6KLSmW%y@hrk%2I<`l2HCJrlXRcHhP&^L2XT@quh7uGBI{FMr9c z?`Bwp+5(}i=D80_Q18~}H!<)h6+rbOwFbMSf3?cqtowX&Z7AAOf$?lPJWEc^1mN*U z{Z)v1#~lR7Rmtz2(V?dl)peJD7ajVBdLvhit+c-lj7$Z3E?0{;GIt{ZP#n^`^#0VxJzxwiMY2WKMM#NL9=LAmm;;!e#Ex6 zv8F2WYyd=)}3!V8Tof8f0!RrK01@KRXwBSIr?d}XD;rye?Yv4EeF=kLoco}Yt=z-Y{**#(6cgqkVTGQ~T;h^rD) z8|!XoYjx=NtMb~~CJxAqXWY)`kHG--(1vpyno{^&HeSt<9V%)tDI$K%(qsV6sosM= zE<9l?%3U%3hx)g18R-EO=kI*O*env?4Sr01T^P=DzG`%nO2dGQMz}ApFHDh>wrl?Zh@Pd)ua4GB|Ott9u_fCaY^wu;TopvqzBrrBvQw>NiA!M z3-rs#*da-?AiUKSd2MC%hEu`!q`@l{lbV$l*K2a3!3&%~xw_X%i5`3#@i0oZhQ~td zBTw=haKRG7qK!?KPnMZ8WN2Plnl_N#q`!G%MiPq8ZC8L7Ezt0=!Z~{Y+T7W>xiU{T zbh5xUpB7C#bV*lsI~FGDLfY!0qvYtqt_1-TAowgyw5*7p%@DRKsP2 zCL~s`b$^!rnDAM@rEW;|Rp2cA6O}~j0x+C=6KjXWNU(ZOmf4d7tF}x&xL(!4Rj0IJ zM+p_tWbDX1gYt0FRb&8?-50oaC!Si3-;zJW&{mrVtfu=R7NoEVtSH_*M*1?koZXR6 zExq(@>a-LjENTK6W~)i z-yuNH#ZN5y?G&LdDKb4(p9_~cj#Zdw>#xGdVqtgK|8`VLUb$1H#wNNYgJf2;~FuoxiejD{ypb#>{tZQ}$w}fDb5}qz13?(7dRXMmhG;=~5v2N-yEhDtNpZrSYOMaMn?YEfh9zT+Txw*YG%fzb{At5;x@*A>^pFq@>I8kO(1moXkkQxbO^!41XUW{?Oj8mC0v$DxZ#l0412BQf4aWTS=mYr}B=YbP0`ml29$psr zslo3f7L+IH#D|QsC2q&XGLCPe0;!WLQA@rRr69~i`oju@E4ga6#6HL1Z^$6ouNPXW zC7?2{GeTR+civ!g?Y&%82qs!gT(-BMIs(eAqCn(3iWb7}e=9{rdK2p!))7V(2=*^s zS-fW;frnMQp`lUZslszPd8}cxC+aZg-$gjsRPMJM!0e8dCk|FW^IhZw;jl^9SnsgV z*zf9r%Gx8$$gUl?+(0u{B0v$Vwp%Rq3j1^wp#C3$pf+d>)vo)*?{xgE5QvyX7z#z+ zsS-M+1Y@lNfy@vV;q6w-w#$zomi(9kLd~S=%=lp8wuTPVjTn2e2+Oqk`f7UVE0lIx zA>e>JeVqMf;T2FOst)J-}B|6Rx3}9Kbayt?3B! zE!!mgelZI3#%3$WD-^{*CP*WIiT0F({eUQ#$B(d09EYwwxLd9X>&Y6j>yDlLjXR=t9lEh&gF9(CgW?=6+M;QDa=dquEy{p?S0-G zm{pIDkKcZBRF}U5-|{jwyak4odun`I>Xw`)5C1d2sDTkUU|m(}$yq$fFdyMbLhG*@ z>!z)qw*ua!{95BdoO1=WUefZSE0576c7|uu2n0gssT0$4WfjBtOS{=zX=+HtJ-J`FNt4vTJ>i{5 zCb2NKp|^ZJX(#8m53xu!HSquJT*yY8PKC_1_tp64=n(j-AKE7`$lKE>RGX#kM$i|F zcgB0Z=Jo~99Xu0jqcAbO=kn9DfdGsK)Qw@bcPj>HolV?jvA0XVt2FI=o=dJdlb3}I z61l@{f)ZNq894;gd+Z}SJ}gad5EfpO66sXxuhWe}QJgEOk@vudoS#j>L~kyM$DV;p z7=EnpglR^a&2fUU(OMd^x(Eb14=@S*2 zv(tA4Grk$Z1Xqjx>AABnG^d|Uk57qy!3Bc#L>*5rQlg6UP#*S7fg*e5PI~aQZAgu{ zj%_&Xv0Lz1-D^)pA@a@VFM&-xq)KADKeqj7?8Q&q6C|jKt}gkw$d`Z2(CD^r)VD-E zqp#Fnm>8dMmA-V0UL0CMUe~?^BK_ER>57u{sE0ncwBF>eloNkR`V2oGNGth^1-1PC zUE9fI#OScS|HPKvEB7yo>lPSmEIslbhlM(GiA+)S6-=Cq(OGpck%KRv!+z;~&&lznOmPN?bbv5kCj#c7%j%+XSu zU-I2yr5^lp)g#aQXVR=^r<~>-6iU?V@{wE{vafiU7iTbJJN?|+%Q!D6P#b?5gw;}6 z7+e^iOyi~yI13Cgk;P_PTAtJD)G3SItWi`=H8lO*inm&mt8L^s-f)$DfeO0B;@bed zj%^F$U~8zG+8E6WO|C1DQn`MKjq2t=P3NK!pIphI6&_3DZ!}d%O;^7?2hM;gf6M0r6~fh6%msq&nM*kf!GWFXO7Ey~ zBxh$k>v!vuyJhUuzoghWMkP5rc zQ(BARXCq|y#pWu6Z?Q@)SUsw0oQ>)AcP>H56v zPENJxwykzie{V*(pZ3I{NgMZ|7~4coa4;M!aHrC;NhC6PGy_s>-*|6&N{gci;u&kC z)ljsh37L*|Y}410rk%r!3jS39Fj&P#U0726jN%0D@p?bq(ufhub&{OnRvG*K%lcm- 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

WDu4WxDf>O~+{ge} zXOx!1HSc|=q#VXfcHvqHW#6tGZ>EYmP;Vgqhwm^P&5=p{V-X%2&9S0bqi+Sd{3PEd zAGry2RIOSTAN`b>7nYSGIO;u|wRTqdH5gc%lV3EQG6^#`7?m&UU5vf$bXdR%Dt+9ft^q>ya;mjpH)Et5~UwoT*y!`<%12CFoo1 z#VlMQUP#Rf${h*F3v{>RA;kgdg>itZW7#!fR)8tAbepFoSM-Bk;OCMER9kU3()xfb zD1w`A&?%u`+km?e_|{MzeH@(ZU0G6*T6bE=qisT}CiSl4AWr&LO@|Mxl0r?5VcFrM zt&Qm6&Elwn9MX}Kguv@q*S~0O{QZ-XhC+Jl!JeQp9cT4+R~|SuC*g+TM_q!C!u1JD zh&=xj>ugie?3ZF2U15>u$XNIt9hgzXvRTDN}xoGaJqGPxFcTR7NP7Sd_Gk&C9*hS z7e;2Lw={1^8W}GUZRivPNYeL|TU~NkL1az#6jp<6z&3gJ0v>apaxR>?VR>HrF&YhoZ;+m#*&K;|OM#bK$@Li&@$gDPzz4)8 zqZ?U8a6qHqdwnX~&lshxwCTRZFkY{4@!^Y+y)5Ml{Fh70!S^?=fLFC7`V+?ysuB{xFI|gi@r-`3n zEu$Zs%TtPRiK64+YPp|hHhBXUKGIeUn&4i*1|@etEe1-^ow)FEr@`?W9fS*!@^c#t ztjz)i&)*cvtgndQv+fHJluTT-$8k9i(onMxycGo4EdPzcq22( zLT#R_A_;R8VleDY^JFNP^{LvgVH~U_?}`_`NT~}vyxisH8*gUk6tjU_4?k*Tabh~e zc1Oq5COAy=jRk`zHPoX+v9V0&@n1P1R#~L2YPORSSMs2dyJqUXSD3cIa2yJX_;b!z z@?PTIqY=qa^s>>QN$Zx0LHi8?_J-48d!z6FYezzB96|F&6m3-fK;{!S;yaV4b44rB z%-x`pNo&2Pm!Z9wf?XoUN8&o_@ve!k-1S^}&|?{TBr;^C2laTLu*toM;?0TCkpXXC zoLD(O7+$91>aodkY z7x6mc!@d@`hZ@IBs-9fCuI^)}?1~t)enZp+6+Y<_B;3Y`)^_o&AiRGfMBCeo^o1x02kax+CoH(|OxGsveUX)Qyc*hxJU5BH zCQnL?gbR72KZ?5`{XVLGLSYMagcjv^`T^26m8$TKzK%Vs2`QctcVjR5$sF@=g^&s< z*q&#(IuXzKee3CJun`$QR^U2f$a;0@oGhlv0Gi`=r*K@8TfYe>C=ZX|r$57e*vX_6 zj@QbUjt}gW#h!$~UYDjGr`wQ|*r}3hmLutV@$z-%&OQ(|$~(_GO$&~nVSgU#h2r{9 z_GsoV3>Q6fmgQ*H72n~If9dR!-sT6RS&vCJvSh2qv9|csW*H_nieSez$W^Mzp59ch zk7;>?FL{p93~y*AzYk>7HT6XYuy#p%(nUb)Xy88HwSk2^kh%~%-k){ndfbB)0s-YH*){L}W9e=d}oL{;9qVM5@3V(n` zGDad4U!rC>Xz0A)PBGPG-wnyq!rWPDLg#~B5KHnLcK)$EO|yxMis&TbP1~3_@(EG_ z%cY|QT?-rX!v%@&dcYkpe5d@+^!ovNB8r~~BzYrwgv-dG+ICRSluE$X`ig7BbN(Ds zyp1;Zz_(K+S3AQC4pli_@?UhOk^7lrupvsc40Z0;;wVrKljOJfbDMCwID7sMkQ;ZI zs{FbJM1=cFO>sv9nuCDwRgF=Vq3kG)sV!m>Cv01hfqCL1BN9D6h_+BC9^qRTXT>|3 z2GI!0NV5ilVlN~N4zn(8#Po62;@b1AR}v|_xHJ^)4ZIhgoky$9H|uPT4}5}=Fl6nV zwgb{U(mitg8U$VWct>D!Wv0= z=1xDPm#$FHE{138F0>d09IAIHPSbn!8Cr)jP4W%kve5Zy#Q78xagZqV@A!5y6iH;Z~%~2to*okrG(Z*!mNkf*Q!p&J(OimaCj{B|< zW(*khp);sBk1(fVVja=KGfmrgx6Dit^;#&Rgctf4>r*+2*o@)AcPcql(4Lwt1f$r5 zi$z8~`D$R3W+BPLL*GfY+-uKx$PJGmCWu-{TXv&Sm^Po5`*UJ)# zo4U(KHSgzkdT2A!>RTLRs*~D&xxWi~Df?Um(UYa|VPf&GypIdh(>t87S7Zr|Ww7{w zI5+LRHs{Z6fKH6-f*EB=L1;A64C^t0)&ql;pTzC)<-rUhe#ov2_`s*~ogm~BdqwUv zl&4=Lcai%Nay^**AD>~*j7LrkxmWaCxJ3qY$2YAgFUPBG>Y@T~R~)q7NBna6fp?{N zYb1~gA;+`Comu$CmMS{qd6 zC#s{nR%K0UZzznpsK z(q@uxZS~N8Xwu*8Y4mp=8__OWta%iNf(8@ zQqoa!2LHga-UFcGhC<{U*UN_|scvhA6c3M&J7sWB`&9dr?y^2ZrCWDEhwY4K&MRA# z+Bbl_M1R|ISV7x!)m1n1vMSHE>;-mTslJ63` zvq+hz(MG1TkcM!b-T&0VzZS0e=EX*8`5~a8&a7)T4@o2vG2+e1pWE(B-4B=k!d<1D zc2YMM?Tte+6a`vkN%##@fado1RnuJ~Z%yH`#9 z%Sx}~tsPz3tCijf*3fa;)7($wz+)!$&IdSCPgmpzs6 zmG%E(?2{1dx-4|pajuz**R;6ojVX{lyi3$eBeqHEH;qHBFQ{+|a71!Iv-lPpsXt`J z70msEJF=8G!dL|Gu5)JZkV7Dt5 zx%IpNW$a2FsO6;d+r=yDk90I7^qVCyhz8~7hGN_VYEE~iq23NaC{cCFbtwHJf1e<) zMsXMBQwq3&NVN*lxjJ{oYht(F9c^1;>|}yAF8tXPN@lrm9Z?ZjIigFD7bun#v+lN6 zd-QemslLQ|#tVB0C#icwTpH(Q^iuIi{crROZ-~;wzq-T5Eu1@F>XRw$X-8}LOz?m0 z(p{xlMBK60KXQ2V&k)%;5CpuKw|`3Xo72zJab}>aC6j*cT#Ff`hhImVR%5k1)!u2z>xmn02EPRx3P{hm34uwzAKT3-1tXlof zy7%Cr)<(>M=mXe^2DzY^Xm+o>2C;K7@lj&-4~1a>hg0UZ3xG6`;?&;J^ zUdQ*uICP^$;;~7Q&J%KyU>a*QmIDg)s{HG=Mvh>iG|S;w2&zWs2fs<-L+d?Lk2O=Q zNnxT}a}neQtj&ZVP5CDAtO$drt7&OeQ07Ek3onK1?8>W4C-ti#>+qAj(@#!kx~(C4 zQ4PU$OXnBI&(!Zh*!u4cSWqtOA2v`GNN zTOd5sMO(acweEp-s*7RZBh#G&0FCsa-BRkO>bjv-i+S}oQ9Z`lb9s|Fmk=)7*X$ys z@f2F#!yNI_eeY6KI&**cEjbpm%cmayf!&s~YUXcmkSpqu1us03-KJk|QmV%R7D(ZD z{!@BOq4&VA0V*Wsrp~a!7tnc>bG2r<2iMZrhwO(Eu=w>aP%-}k{~Z-Le9Vx4CNM8# z*BOKkvAP$qpOc7&f|36W=i0+G_Fu9iP0On$rhs~dS%}k~*ee>hU{^LqfEdQ-ceD}b z5vzbPxbSL*x{QzxN@q^Rf;?;mgJJ;;)s>JoG#x4bKy7q8wzy%g<5e_D6SxNtv|U z4TLpN82X%4NcPwj!ETgpl~jxp1|8a8Ic4S?(|c`pTa|R{uXk{-;O`v60-T<}g^?bn zJ*Kd)Xd=8yMdFDCa2n*u4mUsvGx#;}*B@>@RLE}#F3Ilp5OS2)@DH#rq{ML0D889P zjOjty?=mw}32nGj_!g@R=9)mf(2glw5~TXb{6?4=~p~SPkqmed00^QIgLT`1=fIIHrHFNs}dW5>ui>WxSBLUJ;o@5|n1K-n* zj>+_ZW7NopnR(|x=^FB*YG{K`u&8>Y8&M0%B73yf?ek83%sjj|2G0PZG0xNQ&){PwhQT?wAFygJ&lUN;1pL_uJ@cHWd#$hTX z{mltLdZxS$Z@=NH1k@WFh&iYVXn(iECK^<6UcHA^2BkVs7aEqjw&%-LsdM`E-`Ktpa$OrJW zq0ceRWAn^Apds;`%zf?V)CVIU9Hpk!bJgrJCnPEy?6`1a7D~a00~$%IVNk>0=RZcR zN4eXh(yv8MbbVpf7o3jKdoGL<%6I7oBDl^YBig$zh+ndc45xQe5@h*>q1eymNvuUi zKH_!It%l#@1)hqVQ;j?GWCUKesGragk5IQf0 zJ}x;4g`ulhkTj#`w7E#goQtYIR7|kEW}Rll81`r;v=Qo(?%#a1E-qK{I^_4KJ1)8H zR9ZkIqjN4zV?mUU4iE(iHwClIE}meEcCBB#FEXYYYNPgDA3z33ak03WyihO4z0bgm zgjxL_xEJn|q#yIBkf^tDOgmKL$j2s)Hz4L^lF#-4FhKZVmIP~0^Xr4z(H7q5KxTQv zxP{L@Twwg)3qJ`x-Hzt-czV}?qk~ITV{Z$A_t&E)?++UP z{+ueZSBn3#okScW5-)B1Lg^4@r(cn#zvp zu@AG7qjN+aN{wtN*tz1Dpab3XCUCinD8w_45|^e^a7${s6&qN-3`P${>FpkLDivz^ zHUO$Eq+KCVN^x@eu0bYpydqB<6wrY>nv?(?nWp{geKN2L%q%C92bMDY_*OKTnSl<% z?73w`{raw7g+VIU}5{7X>P1X7#8xhk-QUCknJN8_@vP1F}~ zmv!nR(JP5;uUIoPK$^w6ewo?9uAVUTUQ7fpHtm>zUKF;3&D-33{gmrgkPoO%{xcT- zH_H)7fMN9Z&;y;LgXNFF?@kr{{~|VOM}(>kpPX3jLIca-=eDAaBjA@<%`s#H@>$em z4*O`5S1%5*cu>JyD`M5oFc1m(PFOg;d!GTV$!kgbj|$pcP_%o0j$<F&=VIaZF_@&^$tM*+{?t1Zg-1n!+y?26H$oY3U$q z`8hH{`IXjTy8?eN$$3P-Yw+=|199{@$!2~nxHgy9r!i{f>vLukhZo5t4pXgLz%?FL~==``4EXQ&Vx_R4r`? zJg^0>w>wH(^=Q-8H<5??2 z53qy%F^~0KD}+Adm#~;H1ZvHuL^xeoNW8$7p%y~z46>`$Zh#(idhFE68O8`XB#d4@ zQt)jx$sWS&o-vlJ`+wuvAI193+#zNkTKcf>`RbI}5A7qNR&V9RL%(^{m~mq?&ZQOd zq!;C`;QmaIqHr`=Op7lu7YooBMikTDr{FCyg91$I|0ay9RMbTs*|`=v4;kdU^y{eM z5F?#Ij3p0wrSWngZUSKr3w8Y{O3e+^)r^RW&8ylOa>S?C{#Ta;Hr2&A_Q3SAQQ=FO zX?O`Ero-WC0d>ZpWS(dNk-W$GmvUxzNnt(9a1X4ru($*;TzhHL$FZSg2dDsDX zqOG={+t`1jaJ%6$gkkSEvyhyqF|xhx_&_CdarO1;uC@Z{xsb;^2wV5>ILRMl#_=GQ zlRMI}IWcWvMjDu_qD4Fo2kL@>E?gT{j||fwKa$LHC}i*{@r)PT{$Gw2o|^RVtQ4-Z z%qT8+|2OcN{m)=#}FI42o!F)y{O=Nr}WncG7`7c@j_}Q%Unc#?8(AA{HDkdhJC#|t*_*olN5)R3=2f@B@za^niJm#QQicZ z638DdzSXgu1(Tk0#y-J*q{As-H_Y1M-wd~)qb$;!_R%w8;5(yKOI5KPm|2t{t-I#bwFD5t#XnSDgs?y)|M85 z_?8eK-&hA5SBK-1Oy(UGLO#cL;O1P47H%Dy*LbruXn1K-EIyp3cO6O!Drt$QqU#By z(1emn_Z;qa0>k86=NXKexNNRh5P5EukB?`pUl~^UO9r}SuN!RdD>?Ms_yU7 z;2~Bh405oFC&^9(;8hy``>(kFGp_3Ie9T2r@N?Uul{MU6;luXRxuLE7w57dTP{!n$ z(U64)d)AJN0zP`QR6Cc70tMy=C5Ky_?2h}lY`U-~7p>L|ngbVNzA{a6@5s}dCvbBO z=8GOIT>FvB^85HXs*_RxU$(qQer_?$@KV!{vh@zo>$C0QD#mW0UFJjXHE>$nO1n2H z0l~%Rtl9wTf_a1V*g3dg#DNiMrc}12I|+m09WwC~dwI`wWCBa!k3Hfd_(@}VhGJkd zkmRO4VuY)&u*HvxjxU}Ue~?smTfQ`ygZ3E3FmUcBp*ZHm8VpT}ij>spQs|8r|Fz9Q z%8J_~e&m=lSGn=0a?~_vFgK1>WFj=W0E7heU;tjs^D^qdbK7d>s$JF7#UnAvTe3%$ zbEwVIuMpDKbr%A{$@jR0YCzv}%5c1T7gk&?~b zQ5pGmCZoW?E)`zht(*DprRhgMw+&*`(xmroEh?y1P!j24Sgvx2bCk&FW`)j-6LC%y z{#c_-C2AU-+=UtwKixTVxqu6iTT9>U4$7z^Cb&99CPhf^b}j_&DR=~C28HNdWd}6- zDn(lCR>M1~PdF8oD!s;M|2O#XtMwVTHa`7`SS^0N^NESq8<_UeAbNGbgzR-;N77x^ zp$UiMO2f;VC?M$?5QIxZO+97y87IxILD@;6qJU5%Ii@Z3?%fLegV&_C75j9&Ew?}g zOxHX{>-}2{xv30xkI#(B_jiBXw5`X{Eu3x#q!6zeS$!&;9jGYGu-&+e*+_q%kF;mX zV%Qz&Dlg%drh5c6du8KPd+%;!D^z&DKFvmeki_?wd$UNUpTOz5(gf6jsn9iZ*8ZyD zS7twgA0gn5%PX1c2I&o?|4n%3xoT8ut86`60g0&rdt|s-pa@+r`lNOD-8Q=cv#orW zud(VwKK4dTlIQJK(n(wKG!K7u4SBO>u%j9|EVn)5uxc{qYBoV&PSY;o$k^Df_>yy~ z7uZ2H$bm)E*P(k&wf+r`EjYZNI7?f!!wUzY76i`9NG4G~QYl_VRJeH{nadSu8OJY! zZ@(V{_SxTa(()D)#7B3 zqaiOovGj8rE$*?z+YO+v<#O-iCj_Bq+Cq;5&3WZ? z;0CEq67BN8-YbPzjgfxk=ZAgN!AOq5=ZD^sKi~}mDYHeHvj5EF;Ju1{o%z&?xyFuhths>qr7wA%bjr}*_?g>doNjxE!rw^kpY#~bGoW)W}dF9eq4H70}#Vhp{f8N5C8x^U4X|QfG7Yi7B(3fDFrDR z86_nJ6*UzV^^-7C)BZn|fr^rbk&%m;fdNFvK+Ph=0s`~!^Yc?PiAaj@NpSJ;^8oSi z@CXSA>4=Hx_&`h`zW){e|7!oM@Cp3)(f_?a_5w(70M$TVbRa7LjRc5J0(=|*&_DTz z3H*<%{}oI$bPOzP01)SC6haIDqM@VXVxePUVxXZvL4ar^0CW}%Aw^6qQeErt(&iH~ zROK*zwudKwcX0idA) zF#zb8IOzZ1g(m~(7^Eyhn2Ne&tis_l>X@$L|3AC)^W)1RxLS9Bv?p z#3Sk1;PAZ(R5O(q)-T+o+?Xk_w=-{W-VE_7F%>Sz)i4snUD9XF7f4_loa!{w=CoFko+Nd+R^;Jk0BM z#rao1eCgS0i;*Dc!6tKp(P1!hkyP7OP)fgy_HHVrN}kl*?Tw#*OGJ=9a*donIOb^a zC!xK0TzoroG#(0iT*GN>u-4m^)g4^8n-3S`=@M%94-;C=ARTARm>1!mC5%>V?9ln6 zRMT#0mLe)g=aCRKanSsEb$Mshuql?VTg;1RroI>j5^iot8 z(J5@j-MCR{2S$tS;X~ zqE)SmWvbaFdtqk_gh`*Xsg~$_*EX+wGmizqawl0qE|K5x|&;?%?H!m&F1y5)ttABDyB0W(OqlE#?SU7 zn~koB$kZo`^Ep}39Qee~yj5z=EZaB#7Vw57eG4Sb1%tq&qQbz+a~72!*8?Vwn-GU4apDNY+9kY6m`7$Sx{JN3LjQOHY64TLIB3Ge0ruJHsg4(E{S8O zeU~&DuM>_A3w%e*^wY7a8b}RRK%vQU>`wd3S0lX$HiI_FTcd|(U+Mzj_nsupwax{9 zs$AQO5p|m#sQ)5)#cnBjy>lJ_Ub3JFXClNK%J6VpHqAX4>6){bX4pn zNp_qxdv8?#=CWnAP2NUN=`cm}wS8mLD6B9aaQ1efi&9TVZ1XU_AM}*X8dg_andtzF z$3sr^0pA!OCN7dYCTd;Im?X!~MZ_=2IjSjmurXS%)7UgyXbInQa2Ncg{5@3K&zbT; zunnyi@6T0*$inJny#I5E8YVljhYmmCb;F5M)N7$V;oj3&$^w=9e_mrmx}lP%&)z7( z4QAGKbZm8rk4Qyb-z>&0`Mbya=!CHUid#HS1x>z*p9Yc7pb!6wPYHRqMP$mGQ{l02 z|DlIfTL1QI@fiKMq-0V00(Mu-HuSBeyrkFd?F*8{i9TX7*HN{Xd)TR5&s-*@I8T6U zU!qSvS*~u1kt}Na$2v~raNRuN=+X6ktHM+^7W^-{Ti6R+E(dSf6rV8G0CEWyfZNlG zk?D)y=zt&4Gp%hKlN3sO14ErIZ%c0aRs5e&^h8G9^~7z{*$i-xj7JFYRZ@0_Zn~BiM+pZb)*2;x)-db^f2esiQ_$Zfx z`70j*f%&%?n6HfCE!#$LyGB!7ESs>BnPXyP&wVJa*WHnn}fEI*(qE!=FRw&p({>+^c)*(smFK6>?>lysW1*!wYEhEm0N}dlY z!;EAPd)YqrYn+u8bI~Ux;3E-3T z>t|HkkKCchdIX3ZvMtmpyZ_ungXPSvhu6Y=DL8upTQV4DziNvZ{LFus$Oq{7or1&K z*oV*YQ(lvNA;wBW;JqtWN~0xLxJN4{8qVilpL$hcckf7XI%A#ES1yFj?`GL2wKwRl z1|>MY3hRS-)^v{r&Z^hcZ7C0U|5B8avvNBv;vO4H=B7=|k_VwO8y^9Z-gY1L-&~nD zrS*f1r=Y$ZrpZIs@kmnaps&-np7G)}dkTK~c>n=UogV=2Azd&oY_6oN%F(N&=oU#h z5V_T+ycf`Z`U%k}~kUPd(1a)kjhG)ioRKridCNBkx2FNUHI9#hZt>QC|B+ zl`@~pf}ZKGqFSt+7fgOPJ8`T}#|faoBZ z)*Dy=rI=G%btD`Q|8|C0XKnr6F1|B7mn{I1?axF#M)Y1F98HNvmC z_aIXGB@t4mr6JwaxlN5lWb2-zzU?=^{Vi0&O)ODMVO*_!RAW=}BRACBzFt?&ps(*j zvezXFQD*R-fT`rKP|{A(tI3>rf0ITBXiiJ}=b^H75V+TgBt@w8yCz+xl%WXk*$8|a zfg+6$BhEBOEaJX140Of|Z-_!uoGaVAvMn$S$O6Mj+u~bh;X3MMtFmiCuc>Tl9s%F6 z^pD(mU~0AV&x}4~Vk8^^Mdxk8T}Q9t?Gte7&~U(Vc;vsaybTJPX8DbujaF7eg%3(9 zHCtb5F`l}QW|;}~j}r9R5BNeg%%^2rUYO7Sclbr=%wBMk z`@Qzfix)3s#H8n=vfyDta6?y*ZV-o&fm}a1=<+r9mtMEv)swc%3z8+7O#FB=>0i%a zuWyPpSd{$~k8Qsl9H@oMpw|)_#L~U17pJIe=zUSD**X%G6GhKp5df#lk$xhwU$sSU zY{f#tJS& zQ5`M6xUE=e+rHuux_AIApznc=+*#&b*Lr1?0!V#QOY;^d)d`k5kC!>om0n2XZZfH1 z8#c60j8k3D($~P9j$7Es`ru`auwuSwq+kL*sTh%7D$dvQ4F0QlW77-RUA61aKI@k7 zD`oTjDaBJRguw~N#%sE;VSU2Mx5>h9XPojw0HmX|VZ;<21_#+2(Po}rukQNw?o%_a=7q!0 zu4XemLA+8^5jc89MPB;vQ(!&Le8qP?A)u2UO0hq7EWaZ_r?q3wE?uArfj0ke6Vs@4 znlRfuFR$XVmOWpi{ra(vF*Y&v z6S05v?fPucTHsQqY)iUV?3IUKKbZi>!jIf5;%?Pd)zKE3rZdKEUVjraiENoYlEZKQ z-3`5pG~Smfj3;oa<~=qe3kZ|i&!_x_1^AzRl(4++BXjgK^tzi_n!L_RlKpMGFc*R4 z6tO5(K2@{7x<5`H_(Bnu0yX_ozlWnVasWP;9Bbl3dezsPd#yBKgyjmdT7B{Hq`ZAB zao#Ras$xmaEcMr!26W5gL}Rl4$FaR9>kRmk9X!EBp(eFgE!Fp2)h1_09~ADE)!Lau zq}<|@+j-%yMQKL^e%KfJDor$>T33LTZ^V2D#GSe6EKGyf%Yh zO8BChKl13Czawj67M*=3bZB`C!QOK>mNcp?{?jztj!+b|__)Ie?4LAsVz4!xajNV{{aAY52~paGjaO(}`noFN93@=mT__)ja33yOCX z9toCKsUFj+b>R@b0N*~S0!{V~N{v(Hj9%=JD(+WhvT*OOAKMVu+ONcLvL7r41 zMb2Gjqe=LnnsiVuH8VGz>Xn&B4dmZb##0(^#qPyvQ66YIbhuo6Bp|a4QYrP^IdS!^ zHudKvUPS;vs@R&8jGdrJY30kVwx#e4X{nj}nG~;tg165zS>JLTyoKI>>5R{PvAZHj zv>wPtqf|P7Y>g`B3Mqma0U2QcDNZ|u@#T=01sK`6VxfCu>X}>z0w<_br)smEYR1)X z%~jVra=5lCLpBxHG~ZQ zneyYMExLE(%R)Dk40gT22vu%)6NBL{3*tt@gbmc_6?-tBm(Ep z*FU_AN*LEi%LMj3KwTcR%F}l{RJc--bp-uAHKZBoOD<>F^XtzvG`Fp4R3rvdMY>xd z-`_J>kn>^jEw@&fb4L0^ND;9hi)*&9)5e_3PHl2vircsw<$I*$*}G3HorvE+5}S%|0mY<5n7s>c{a`ib%m&(ZW?>s?~ps-V0Lj{2DkS_kv#5b}9|g&=VXL80deQ3fIEE`-tH# z1>y)%XIcKC6MBlqBc&&1*Dw_m(O$B<=;HEEw|25M^38TYQ=CXW;OF8+9Jz3Ys(SjF z^1LY-NKbT&7*!3ZOPg2=*JRD__|wg8I;YPS6+4Xf3rGRHx>IqLZ6I^Ys;Gr5@V(5b z^|aAni#TSos6HSJ!3@jSFDV0mhaJ}qR7@W~FR4rq)U12CA^aVVm$39@HPh@$07x;1R><`$7X!by{aC)v zzFHRM%Xo}xF#tYKHx-%&K>#KGKtZ_^JbF~!_BswF!)Ds7iE?_4J~-hhm6?$Mig@wn zZ!*Eov)&SGs>1?fy~xnG%eVy4k{x5+e!tYE-zG~1V`5-eEK_ZEY z;>5eM!5ElRccv&4jtRvX9b7=WQZ<^=!twzi?C@x6&tDW-^@mf8_!-8LiRKsEuHWS5 zu~(6h}w(|^0o0Y3+^wE2>g=^!zh zT^<3|o*2*Dp{(IKePx4~stp-OqlJ7T#J-5P>I|xDmti!PQiiBU0D(1{-EYVTfB0n= z6KPC|v2Cr$N}+SEqtVGj*C9tCgJ=_T>OU0mE%&G2x;?limXfIDX?r!h7)R>lG(hti zZM!`#jl8B}=z!^b$W>qp0v^ike@F%2SK)jFuyOG=z*u!;x7zPsc`M!f6E6X;s-lZpV{x!e8p|EP@25X|YS zU*&UCMVZP11S7a)#aZGurM|I`x44Ch9I~v@{!tvAkWQ(&O@gqELOnif$b5g0wT(3@ z(qLO{qA%#9SNEj*+LWTU5K?*;4VHa7@89phoTk7o2L=sID~X-rM9kXnf||tyOKduM zz~9*mX}+|pl96IN$rqw;oT@X#;G0z8Mnds0IZ4K?mnlTt=uOvh9B^Q{MzK+q8j@th zj>=LUdT*)^u+iAgSEQuk=Nb?*ry7vA`q=e^?OXX0|Ays{@Z|bA+Y^owuQW2YNkY?5 zg!!wooNreB_N{@Aj-=TA(M;@jISD?|E?u~E>ecjgPLy~3Z;Ki8vd)HBghTY&a?j>x%hHk>S-trlcGNBBl5!9SJgWm& zk1V`2SRbpK5%kWJWdTYoB`Kb4zw|j-8-g?KZA6#9^CVE={o6RXWWA-b&)ycyWCAcoDxlIt$n&){Q<@V z@@HO73!;|833?s(q4P~#pn44+JPV#J&5xE)bY`wE*mEP5DEDSFWF8l>q?L6m0cgw1 zb#df<6%==xz|v7_Rii$GmH_+pp)}A}DLW9)$Xt26>@Ulmv2w3HscM>){u-9-Y~Li| zc2E(9!^X5Dx+o^EF8=@;*Wc#TclD6YEqje)c421)njd7BS0tMZq=d}f3F3WtH#Cg| zkZ}k2l$?DJ0`QxXzA!_SA$}^QelDeA|&21@NAH@x>1D6=01>DvQ3}wW>n6a)l6OM zYhqxs>TV|^u6E{3zIYk+``}wD9?crk;b3R&g#0ikdY_cBjDPPC1{3V(3EbZp=F3oY zlmF~~p&hm2vg6^*Tp5GL9ke^_JfpHV+zg-Fbybsrs==JJ>*2Ew&r2_g!XH>gcoZay-fv=AD{!2B>0 zqDMfQ2Hq?L9+^lK=VJI-jWEf!DG4#Z8RBTj$WR%p`v{osnOJY*zKNCt5b~Zn?ZQ=rrUZRC%67G3;+(0+f^9{Sw?N!( zBjB;MvTule8L_7LE5>b_HiEaIUKjCz3wfs)2f}LE2~yyZT2S5Ebto78Z}G3@OS4Aq zTm_2H=J74p7m{;?S@F}aoFqo&f2zvI!A`Fa1Or~lR|NKr zDt>a`hsLV+X?>li&PTP0o7TPp@j2ZSSu4w0k7+fpS zOc)t^R8r!0Y-0WBlntck4$wE7pT9BHsB0nuuI(nCM})qQ%eHTx z;QWKI=RAkoh6=;Y-z@r?5oyWmUZi|3dx1r*lK3L2%tEL-7=9D1=G|(l3w&9NBv90f z!*IoFi-(_EObOu0@vvnmk#6R?%px18_$!#gUs%L>6V7~GYtP^UIVwj)|1+>{=R74M zSW^nZc`?G|F`m&SOxo%)`IH1PZTtDe&+^tN%)lTDy;vmd!)aq+U!DTg5AY4-dm9VH zt*l)H6bfT(_cXRb$`wtVis&M6}>Z;-vKV31G_q?qva*rqLyiK^fyzlyS#M6PtIcP zzCIHHnO6W&afFA8D>l4IDeS^q6{K3}x;308oXBS(O4XJ7mI8-#8Fr?J=b%~_gl<_$ zMf;WkRvWLeTcT_>54wt;>)eQlcdDH|y9TWY0Gl|3Y+t(Gpc|UlCZI@5Y7PRa6nr!= zi&<)sLJ>uu?mCQ@4Hi9Am}b|!frM9k68{n*GV=JlT_&aAx6BExZ!s*;dwGGy*u3?W zffwyxQc^gU+Gq}siT|ELeOWKydl9=i(D`CDwe~5DT+#dMcS>H-dxZJh))}4ij{q<9 zC_cRTyW)E#uf!y@g}KjlIEvEmLuT;SH;HPZ>irBi6e1up^OsNEDCK9~YahR?iTrti4!LwKu-PRzE@UBQ^Rybp7 zb5DBe>z?80WqtPh2Rcobn~tTED7Hp(7q@aA{XD?<3fFhSd(dIVFyS4sgI@vpz{K%r za9-3v43W7&CFn9>fKGHrU3EgHoU$s`ZelbKZGpEn<>bR}rI4RFL%H_V!|_)nX-n?1 z(Us=IR)_V^YfFP89%dR%GoM!9k^6oEQCu3f+@^nlb=U6J@s(puUl}RexshXRQvO?@p{NG(D zc$mAp-sedTHj#&2#fP(m`}9lvo*U#rNaeQscvlPm$(NeutR6GQ%|VaI!%Q-biV%}A zp??VVN>b2(;~7T4n-rn*%B}&=xUOdHCwR##A{4C6{b~xlNU}xAUzV3wjcm~dM+1XC z1_Ov!_MkfUz;^&kGy$FG)-KZ5pKnOUWU!6!9sy1sLeLWZM7vR6vkBGDL+R~5G`#*f zfms6$MbjWL&Evy%*u3HaL_P$Qtrgi^J`G5Jwd;S`K_14?b% zXP=()P6N9pe+>S%l`%RDm>|V-tUMUkd(%VBncs0!IW89nf9ZIfCNM)ji~e%wRf;Jh zJG5)R0F=1q_cuVkRDg5I&ZG~4%H;EK&=AE`&0e9E&9~0yXqn0rv(zk~SLR_f$ri=n z1$fw!dTUla0tBuD)VZ^enSA@C7i!pO_em=7T|O9Y=XLkq17Hp`mG49*`W&oQbzU9w zFGq+UhUcr#L`C(vjobZ$#ugY4rADOQOlQNP6C{bJJF6Z>wBe&bM-6KX;_KLxqn_;K zp`(HL_RqFspd`|6n+Zay!`WCT_5b{ajm?wmBUiF!z%EqGXf7K~a1SVKdoK;YH%|`z zq1;W1 znt6wi;Z*#1UX62F8u}ieLv-xAn}+5njVLZNGzan%rbmaY>l+S5S|-Yr?R87tekB^t z1gp4*gcN6An1Z;G>y}3(!>@^Q6CU#UXk1Ah@0G(cf)EN+S&kBY7ktO-cQ5KahSN1o zC8d*PPSo9|3>Q!NSB#ZFrcZ=$fS2PM3!I#gPUOxEux|f~wo*EA|0xcp^;sLPAP-*J@Wyd3~p;qG^TH)c6lanv3(n|zj z$yaG^Uczdz7QR!_|EpT}b&Sl%Au~lt$prE>HG4wV>TOL)f}Z{GD9c)@8mCs{WPrm^ zw%pHj%l4kG0a+p=N#dCh6iwMDc8wgdx$*mg0q2%qWiLwNaSa=vIH{k5v+UO$a5N79hF;f$y z(y5O6NI!EqWZ`bTk}ad*65wHMj$)35VvxY8BVmF`df;UPR%bNn zZq-%6k~QU=4i`Slnp>S31*iS_1KSpusD}k z*NN?>8hr)nktFgVWGs9HjD(X^)FRi89sxSo)B(3o=S0vF9qIQ$?196{Yce0zhk2@k zKa9|`U|PAHGsee3I-27ZtFH+e`5pc7-P3V~Mc5~I22YEE}anY`a z8<>4!UsVy?5XM&KcL;td57ebh--GFxV>{Kh6#kQ8uu+Rfw%B!i0e5t^n;gWxM;?~9 zuse9w?>>hr|CZAY{8%lq#GS zKT+wICDkK|Qa4N&>vm=OSw?5n^?KXo zkTIi0##>&Mf3#s;_vPg!!_DkQ-fjqGS?S@`S#o|HH(F_F>G!9VDI9L+@HI{m$s-)} zKL9t{*nyXnJ@ZrK-?y9vVY9yanCML`kd%SIxZT~+>I5x>v@{r|+x7gJ>GVeVQx)H; z4;M*f$BdvEI^V^5eZREEl=IBoo`nAlhtxjBFwN7;cAMpZwvR-(&(%D>CNFXD z_c^}efo@7l3SwKPz(lrnZQlE3I~l6dMm_Q!fz=+RmvK=>UF4Y>dXlfN6{6~e7XPec X+sRp|UZbo}=fBkrX=%XD$xL?g%T6-8nY^vO?Er9-+}jX<0sw%ANBB>u|4WES2*?0< z6gbp>R(V_iJOB{^0Sy5i0R<7^KNo@rARq$q-f<&IX(Hp(TDpg&mNfB5e?uXl)A9&U zD{Y>)+Pxy=<&%jRxF({vUhqtB(f;R%6b|qYBCm0RD>r4iOF>5eeyk z4#2?!5&l6);UjAPLntAT4okh_Y5F$5tM#@H!2B1+KRXa00jP>~|Ao3`ARE^dmKVmT z99l6Ejm3&s#7f44r=YcPfBrPW-jlo)UQy8-u_B--ENJyYTQ6OOTbJ;>j#gaW{kd)U zIttpN0JW$liKkY8G_`9&Yfx6iE9l-A5Gr~&uuufn1Y#wJz3!vKRY5MaU4ibzohC(& zwlwG$x!PWG!}S_9&R808D_Ls{R6I;^TJGucdWFV;M=Z;7DL`gcLP+!6#AYN) zmh2|qMSIOH2{FZw``B&{eF}RvQ2ha8Ywv?s#w(3`&AoqIL7y*h&*O=P>l`b zG2yYt{A4N<`&ujoV|2OLWot!gG`ZNOx+UerOdXY4yvR@tx(s$y9LQ?5>6v<%V3az? zP9i4^jm|F8qCfAlw@#K|8KGH*ga2qJyy=KUBjVP5Hw$q$QE8L{6Eaelq6sW95O5Pf zz51l4#}5hrr;TOKr>G(R&W||n=Cq~;e@R>kdmZn1R>H|mJw-PdiaGk8h|RefH7IHO zPUDPy2(;W$z=4V@d#ah9jSo^QDNkL&*1!I8wU6>XJE6$BgyNL!G2k1Tdip)$8^B31 zhBT4WPgk7&@aVl|WR5=mhm$KBX(eaE1YP1d=QPYeTmyTH9_Mn=u>Aat7%r_!@}o*l z=SNCDU|s6n-IlW8-C&LW$>Dw8eUG8u<1N>CW1It5r=vZ&{et=CkSHh8Se}n%f3os7 zU|_s#H;Z?kxPC8tg8@;fv6WJYm0jXjm=_Zup7Nb8$9UR8+6m`JPsAS&q(eXWMDpZ_ zD$_l|pKEBq4}RPd-sTCokV_;_DoyKjb|K8pa5$705ov5~hEwfd)JQ#qH^JtKWXcW&49_T< zo55CiiTfT8qPj}GLwDMvv$pBQ$MPN_4AI?UpOtRO_0W&&IHCW;eI-GV+7Q zJIgNpZ{=z1fp#JE&(u`kvs9()J{GBZ$^YNp-t{QmeDlVK__Fmdl|4^28(G~`TO z)v_*jqpakeO$6q?)7&HO2f>>dW(R$EOqn%PkFD?c`!PQLf9RjtPH21M=k(ZyJf?HH ziT9~)m3*=1Q?G%5tVKs|Qcm-g{e1lJ)&5f&lRO;z7dp!rSM5#tODZL&>Ay`+Qj*9u zGM*W4fCK5c3UhzwHvl}Px-H_y-~iE*PRaOiviT)$szR*YymBxIowc361@~`FD8<}5 z;S8^~W{j+%%`kHOlZ8Kw)z^qT=+2cW40{gDgf9B)ix$#|{HGNvH{^EC;C%UJ3x;x+ zK;=}>#YU`Uo1CRqN2a9hU>;|2kE6aC<+&I0Iyp7ecTnyZk?zrj;e^peWI`QS#$Dit zN7OS%`4NpHg$VqQ#cM|w;sre2ISOBoLt@^zp~Dpqy1GHo$x|rkzEkV!C4*?fQiy=Nm zHUX%VoK^lTEv#n7`TAmv+ZL*`3B>vat5VvoR8vnCRLQ9-rUu?;xh;Ay(W-$bDOsJ3jI}Oz?fLQU zhXESai##r`d82(}garzbDG_o_-%s<8Xs?2?ht7t^lh|u65*v8hX(xD!5eoTjTJ-Mtzz>gsak(m#CeLRz?S1?@Gjg< zT2W4IpuK^LaR{+8$Mf(`#&?y-r$6Z0k4fn*pRDqPex)-4`6R0qPXu048aKy)bsH$U9)uQdxA7Se!;yJm<6OaS(PaJiF@A;>N z!}s>E{9><^^1OH5-W@W$DUx|q6M{?^)RB@4;63?}OWbpK;{SZwPYBLU=Bvsiwbb)oWa=_u2dJwTn=~?!c^Kgcq8o za{rLoCc#&CRoOKaP8ds-M;sT%U6FdL<*+j~VcVZJ%Erp05?5=>m!|<^Qf_aj8$C@+ z>lvH`iY+DpxfeNiH-DHwi54zA8g^wvkTOFbEI8^_5i=?X?z^@sd-JbPd22C~#+ymC z(2A4^RYnYWWk?R=L4M2qO{^)$grE5o5Rd$u6OvD^#_uh4o3Hbv>>uI8y?SwxQuTgg zxDJy~z5#&R588JmTNIO(>5=PaMa6RFw-3T%VKroCM7(5yG$@2C7RIi=G z-tc^SJk$p#sq@6zGsJb_(I*nBIXb8dp+*zHvfT!2Faf1s+o@`0shNl*r(Vql5a?ic0@V-zdI(^9%W1DhoaxA9Zs=h<#1k=djA)e%7iSZ(58L5uU#Te=EW( zd)k*&#o~yk(n-bT8ZGn?P}^zImJXa6eUmUDrOhci>k)zabDrvuhvxj?&>rcKD64lx`P9fJE(Q`A zrs2lBWef^sWt;NUv(o8y=FT;aVmrr%b<$)?(Y-Q5iTn(PEw@3T~pVBjr{z=TOC~=ZY1T$&a1cTUIIrSIrVzE2)5PvgOqJND_Y|lD zn5)`7dY$?N4Nmh!4B-9SE$G|M5s7Z;t_J>eC?YJ@EC11kyLCf~!u!|iLaq8yS(7C3 z@{NOLwQ(nN5fn_H6c;(I6Nnk@q%NJ!m)6Oa+vQ?OOlPduOkbO5+2E1d5-SNfvr!nX z0hgCQSNN1HoosA85ZH#S*({wzq}zSJ2FXc|!Ut#E#gr>+cWp%`%K$aP!oa?bKSKQ4 zLVeQ9hQt_u-GxCQy*;i!@vNEzJqy|p8fvI@(TU^U;|-cn*L?t%pu}9gmO(LHAHUk$ zH=u2Sy)*0a+IHLV3<_w54>ZN(`q)FK-P|>GXj+qMt$`(Ds!3%JXgJ6>>I(KmHOneXlACGO<_I4#>+1@ z!pNh8d{?sthOb+@h~b&Cp#jbhX46yqQNc4ZpKXF0CG*MK(Y?6B16J1xp>F_^!oRVK>%%*3z95z!p%Yf)`qj)X^N> zji^EZw5MdA2rYG*1OP}v$87j;=L6Bl&Z<>vgeN}KQsdIZN?I77M(@zFz?9?_S|Y0K zd{DmR$##&a86lh^T{eyBG!yVr(1d>{#lprFMVgX|HF`kdsM@O7#tzY6wh)01S#2+f zhokp_>l1C;{p}?jN8|Oq)8oEF9YT0VyyyT$HZM|+dlL1qS>|5nfDV6< zKZ&}s0F9+fN?*rdkSwITo_E>{jRsw;5}J^lrDmX^Mu_gx33TIQ3Nm0}9ZV}hC8quT zYvt9t(IrV!mCMX&#o`+~)-RqRgGSn?nC3jp7puduxXZHcy`fRu5q;5Zsh}C7^{XJ4 z_xSdm+LNXnu3h^EdgrZr|Y%SCpU1k6hR3y&BaK{CS(=r?rPq!K7++ z&h%Kuf@h%FTC8K=(WuJJ1on(k@B~-_Bdf{YFj?(ExQ^c_bYPE}T>nsUwRx;O1@A#G z_cM14881ed=jSr!J{?1SjQK_UVFa41*%h3y`fv49;&u{E6@p((UjXtOfDTT3x^ci)_GRl1 z@lmPhg7C(igSJZW0UX}E^d4W6E`+K}#{;VkRLR1U*HUQ3N3z?ZsWcqd-r z0Jpf6h0IBDGa7xM1_vnH?E}ymmK^nDjJj>@=+m$51*}=Hii3sGTikE~S%l zsHAvG23qIe*k$2E1kfv>%`xq4W>#*3%h9oS@dq{Io+B*SEpUG-4tx^jgZw+)C&@S0 z&{$}4o^>HjM~5_IW?O97Ej|6qJ*6&=@TIkQo(NLEKA!I{(KzH_@+11hOY&*H>#&?>l z4&f>Qfz#u+jBMe`^e0h%Py1FbhR$*o(oX6YJ#N9>ZAUu7?5Z6Yhr|uA+n6ta+D5rI`*1Qt|vB#7jO3_tp;(~NGLPd6}&e9-E^u^;Wg&VJyA59HeGnqp4QFS>O^S21kdfxBk$+}OZc#A3H zaSUxJrxS^#b7g4<@39ix^2Rd`=8{=43#YNuG5YaMr$C3Amvt?09*pO{bz`mz zvr}xivk-))o2Nc^Rf=uwEOa%r zR(1p6_OrCe=WHft4kz2@WeiG>cF?vx_7lemZuz@%S_@e0y{^;+00CWCj;}5s-H znCY2`=_E)hE`G_e@xG64VtgW3J0kOw*A9*hxh{P8mqENYz+w98_Jjytp~NX-zTNok z-?=sIPj3K!5X^l!1b2cqgN7%8o~XAm*>ONT?0v!4-*(p<_o#ZCv9KgtkSJS$p&PXn z4EkbH>(}f^;A-o(){LIVMROk?FmjjCVw0~`kn#pV``&6FxZgH?FwxkA4_XOLUIwTi zcx8dpMGehs6TqW4sV4n+^}qnYFtY)Y;9E?Hu-2H9sK85)U+rip3kD+swVsdNPsFp`>D|yQV@C~q(!O4B}e&FyPXMwmK*Db#uMTcZx zOP{#WOv&pvxte=?XNW>l^-V~->=|Qf$fwkxFO&2cVneB$LZh6kfwUF%hPm(=L{jGr zSMm5=$Fb4mOt#;(rtodbtSJB%`T>n7{M?-M?>KyAW(g{(JKI-bDl4GWuXdj}{1y1A zqL+fKw%Z_e*E6xsEEkKJ{qa<+&bCzUs_S~DDr#EGpd1s;4KEBX&`cr98^C_d;J)-a zHH0Fph9OgLP_tIlH|&pOxIScD(?`>V-9>^sZfLqe>^@ij{4SU`Y%0py)91ZnkNmL2 zG;Lg$T+6dork>RICZsojLMx8uL~D}{Y#IfKibO!bDi3^uIs z!y^8PwanO$lgZL{+iv9y9Zsu70v-dTX zzcDn-l$QU+usuU;EH9-~j7YHE5VB7kS{%P^{xgVIHQgcfXtFB1-LRJVx<5hQ%obry zl*n6DHE*WwG+lvx^kf=lz&t?Wk2SXp(9X*EODcsWhSJ*alOkpf(_Amm$g)?_`!{t_ z*N}WnL5tun=%3*z2e37=iiZ_|AWDeYUfd7#K0xv7u zevCE%e6ara+Y1ZI@^#CZzlcHjzI_jEy3E}9U{DB=lYZ8c{q_ckv+w+sP2fN5X|JKF zHhlt}euNQUYlvCOcz}(mOB{0OB4ZZ`{P5-|QgoC}&9=+6kW@O;T>G4|2HyayB`F`6 zmz;wOc?q@joBa?59^!Oe$3N>#vmOHn0$W15chMa_D6zrtJ~RA@ND1LWm?4D*wG@q= zO5F1!UEKbbZ?|ye##cUMVCvQcb)!;M2o`&&C#!^c2{3 z54VlXTy(qc7|zl(d|Q4YsBAT@azQ<<->|&hj-4K(_7NAyD`;HhQz+n+8-U%Cg1c3@ zG+8OcG)wSnPkZv19F9R5fOIYwVd7(MfL&;Fz3KXho0e#>Q;e!mEu=$G5LA{JpJMNxva7Bi`i zRzpqIjvWciy=vu~Xk$a(T*VvaZ+|KNRS5ENBWk1552d*&NI=)E&c4@pFV)Uak&q(0 zfw}L^8^G0apLEyOm77m9;6GKrlN>`b21~tI zKRm~mQcE=54khN#T1Lj-b9aQsGfp1#gmQ{_4ZiRkPFw%h7``d>2J!4?*N}a0niU@_ z^+?b3v`cFqR}8T6#O-6XSQwpy&g)Pno1+(8L8MjSc{A z$2swNbf9*+moDjSIw(7E2Ps>W5tQvW#7Ed%(M{VZ#7-`T11~6p9+e5#R+_pu#pB$Z z*Cs%k`WLU=ewV`!fAN}J=mkvR%o;bU(V)-*c&uLk%kyKjKigNAi#Jc^bIgi}Wc%5C5OJA+`f#v2Y3%}b`X1x$k6cwVhSlQSbHd;oK za>%|T=Z>(S5%YB`Q`&HzOs+m+b9`{>u{A!G#$xHQFp4G9n4Hho)HdZHA*K&{w*t3u z^>YmU(-SNi!D*Lh1M`uSKd7tRlr-iXJ zK%?IaZ>#bly03~qxB%Zyf2PP98hyb{4J1N$F8q^E`x^OToqGPcS6p)}RFsn#9rTs^ zKHs_Dkd|j7wYB40KvwhTJaJP)|8%^d9|himVxNAq>sJXx_9~m)=lvP1VQmbCF*U;d zr1(@Mtpvia&ibYF)eIn^2JZlxJn|vrX+x+fezsGS`g$D}DIdAWUKCSe#N0 zW5Cq!l1fb3x%kkqg;NfFz$K9w=z5ysz8H*V%lfDv`Fc{msF~JekeTb!NJDq8! zm_}Ay3m{=*R#D7z;0zh0xLPRIjN7eqtuwv%X)n-TKZX<@S}0y2 zizoZjhs<7*yz1GZE$N##1!*dwjqUZ69!#CF2B`UwrZG(AE=HDma7c|P67>Njty9`M z26F=C(`$;ukK356F2CF*MR&B1PMtE%vc+aN6(__xg^KC72F)!P)~_t3Ia}t;s?I%K zvwvB-k?4gxNOP8=M9AdZ5Qly;E#S>B;&C|W5Q5~ziw!R~8SDzLl6V^51RC@W4T~kn z*J+BYJFd$)Rcc^ezdN_=4qFhFf7OyYW%)J3^QZdhptuO*3_4V?U(KOJ{3_h4Pm|U0 z1|YpnNQ&zz&jc5mPw?>gXH7n^T|ZMuKra;2S6iCI^cMuybZ~^jt1jNtI2WiyXr_QX6mSsHcSD>a9yl9~xWR7Rhn#;l3Z~LBi{%TziX1)8>Z{xcz z{E8%vRVJF3Elur3(S)VKaoD%QzPZBQu@PyjI9^r%Xf^IBERJRWTaKS}MWrRqagUzj zY85A{X)e>cF13o@E@s=*8g{h9?6J)EY_e53}^z)Eb6w~5$$j~AH*$xX#* zi!^Ho5drgARtaKoDIdZ|)(5$ib?7(E#WtqQG1<}#86YX_fm8^jWHCUVV|Zs)o$PW` z8H6vP@?qf)SS?|U%NVlj=**(V2Y=Hn84#3Qn4KihCRn{+BI`0dS*>O$NGx4NlZDQ_ zwRvM?%$T}%N(LP&)Y6n@QzpQ#KSX3{djxyR+8>jS#S2IbVYt3PLe+*bR>Ka~3S)Pb z=%~~Qth-CZ@g)gu0ChB7Kt;o<1E$s>FM?!<7c9c1cZ1|9g4EmBgJSxjQFz_k&c!GtmCsXsHQ%nhTWSL)3 zKx^I{zVAQvd&ta0^ATbl?s04hn}vy$>&}-~qT(#;Wy}AdVZKU)c*r}f;5yWh>PJjT z{PnnrJ@xs?D5F+ak|Du5wv-*&t7kq@dtw-1-%zxa1qsSnn4Iw%&GrKTgX)9!j++G- z7$hEf7)t)EAa$=E6Lz_1M?FTnN2Li&P(EBH%<{VKZJ&8H&D1{QJY*2m#5%KD?djc! zX1mb};c)m<8!B^WR|pde*(xK3N+dW$cW`{USnx?Jz$E1;Ch3#VE?=kFIm_u6SMStj zvg=mKQL*i|VMKvT^{uHUnoZpQ>=XiXF3_~Fy;bp5CE?wTUlZp(+CD(SGTlJo=X$=W z>v(S%oW4tO=@gW?H10V0{-t53c?#j2yXhCV?|Wf#S6d|F0a3=aHIG_op&pm+hzd3h z>J&v=a#5#l3*&re=FOIq6FC~{mcu%UYqJlu!gA_@xIE_#a9aQ>x9g7*GM?eMVQbG; zRxwf<5=mJ_qe4}dHnNJJl2VrlR!ddXHPQ;HC&FJXX97zqhj$u$wp!3~J& z#05b23EH!`D9ENU*zH$5H#ZZ1d0W8gO5xgX$%&1&eeHLM_(VJ}4Q zV&n~H{7i4?dZuWrQGTU#J0~@vqst!8>VOYzYmOnq7cmq&%>2uJE_3zt^{#Kwv%xg9i0ntEv5MQ(FUu%NxG3S@mGcPN)vEcMd!@9=L`=I zzdI$^1tRk~wI!#;I%SJ!D_K38XNlZpfrp0+lIPrFLX)=Iso_kUmNSvx0YPskT7YIS z+LNBTe4bBD4dQj0PGdf8J$H+b+1&R22WDggIICK__uPVE-Qo&8ji#o2M((erXP%R8 z;%>#*lcds5NQjxV71<(Ro2f&wcq&?_^QQ}*g)&VljE!M3Q+XW1=+<>={?4Ja^YHMh zr(NN{%;T>Cd}Z;Ccz6hjWU&MQ)l~@zQE_@==P0)kR4*qZV7b;3Z(jBMyl<`Ds#((3 zbTmpp>j5XI`UDE@N>)ZBF4jIB9etDRy#Cl(7VO|B_NmXD$OsrL&qUmqK1_z1yHJUt zA_o!8kqH=p_C$ZOj+4w$+q4m-xiq(Vl21*!%Cm)n-UIY*Xq&fXOpI$B5PoO=ND0qN y)vXn|HPmtC`7!hd43>dR3$dC;6SRpwBKem>@Sl*Dj$4X^lwQNwj>ji5 zL)zqR69ezP4`lW;n@5abU(KjlJ{cqm^RJ$T06;|Wf0_db{?(KGL;SP=!v7Z0{~S(0 z_^&aM6tM=q@jW|fpGcnD6#(TwN=QpY3s3`KHCmtekAmWKy6;hp(!m6EPGm(euw%JY z_ZRNta|c0?`Y_izxiz=nvDw1h3XR=nru)CwYrIwkKRm>Sic^eRzKGnq(36iy4_znJ>7FB z17BlsH0Sl8k)s-pgIargbaIU4SIW&Thno%0cfZDg6(zuoL(77u@r04IF&jlOXSy~e zw)b%wqhGFMG*?oEPKd zZXCV$oW;k+X=pq2j^#I1;M#@&HPz%i8tw55Xzbb;;0cXZu2dj25y0<{VEkMqgn+(z z7ds6iu1!xRzY{CBoQ*yNwQQI+mOj$&@ls>Ph#A^I&Ja(4Rm@keo>jWJ^fN1p0t&U( z;!D{Diuhi+Fl{gC;^}uPx?b*e4<+O5h}GVku_4vw!}2w&ImDO*R8mCJuyrj*;lf zGW%IcS?l8gG)xEp*knf+jacAYEQLa=2Llw;${E0J!+V|>X{6WuBb$q7;k};)m_;OK z$A{cpVG3$Q^`Q!d8Su|d-FyLD_*hPy(PR8DnLYT$RA%j)5M8;!Gs{3v#RaTQo;92|sL6fV z!*f=SO)N>iN2Os%U7XSb$>k?-3(!WR2#_(Wz8y{N{vD2=WLGWInK^8nqqYFshS(Vg zUSJrFi(0k?7f9IhzFEI;!DEdP^_535!t)XJQ4s=Z0yV}P6sfc7r1k}pb<*|xXlwQT zxgZ0JGZSZx`Kq{l&Vrn=nvMH$WRm;? zT16Bo!%2j%$o+Kcj+P|3v=KuaALST+@2&of?F=1?YhV3=j}ViM!y>cO|G2W9=Nl%d zkB zq~c0{6GK>=5mbr&UdvdyR$6uTH9B_6R6=ydUNhT`>(iz{Tp2~dJLeQ5H=?Q;b0zH` zA;$Dh<&+4f_ch!tayHcWzF6gWPtps8SE?Y7e`>wOU07F^P_bGS5gJaN~*1%d}fw{Y$O$yM+Zds>-TfTkzzKk z+r`h331^l^YP#bi_v>;}xSWxlgp0kOq8H2>-q2}n^+O7uiLV+W{Zt{zC>mMq_Y$Am zB`|r^n&UHmPbX9JSc~G_!-pi-feG1pUU8qqhGb60v#&&?T7%irB_#)ANR?qZt^mM> zj(Si7u+Y;03yayo!YU@qqR;ikP@AO)?MM~E3A2Ml%@L-Nw?_wm^a#IiXGi@>88I3y zt^1rAXwv>d;IJlX=H!**rqy~@2*0fbUL6(Ehvv>wNoN~+>28O1W~0Iy zK3nZ(PK12Wsy{m-@LvQEc3L3nuQQt~1{Vn0(kd+p{x&r_HE1SO{XXH%EgG-U{#j=JjLApdOPM(viZGkRg8mt+9@kY~d!0sAXU@`8#h~K^R{ptOKp>9^OZ2nQR%+tP) zxel!Qg+3uE%<*CNc-6h<#2KF~cIj5)U!3)UR^y-Htk4Gw&iaf=;PgZOG%)Q}(*XJG zE^0r9K~edy5nOf38>i&L7ztMck-S2ltKovY2UoaqPOii{8?H;dLRQyV*mSmB>gm(n`{W#6FF>XNd15`WK z;Ki$J+-Be$#fQ<*tmnzUv-+Ix<-NcbKozE@x&8W>PqiypF2!h**|nR$|t ziL;wxifs8enexuL367Zr{i8trXg#N&*=swPEc#$^X@5+Sz{mVs01##)O)^h+Z%3i& zKnyWYYu|eZ1PO_20p@0A!ex27f`dXy>iz$+bhcvk6?XTsFS(Cz2w&q;a}0`bgeZfV z#Fk*v8*|YGYU&3x56a$2$Z=G>(PqaGc&&KF=g)k+3;r<5#rsZ}XZ{LS@2c|r0&`!q z%cVRa>L;=ImNm6?Jd1g-8Eadr8~Gy^|z1jg1<1#r4qL7oM7p#PP{D<%O8$a zR(s<8x35gpFCD&@!34sneAUutD-cd~AblLBxQ%S(VIs*};F%=6QnF zb*)ZdYQKVIarLWX!WOJH!{bj+Nv@jS%lx9cu+W>Gk+NJSax#0bSnJESEiaf`VJm%R zVYBr}xFCte!7V7wI2kacX*CNAq|y+odE;k%Or#&%kevI-z4-;(4{1(f<8>mPCtV#4 zDxR?k6G;}JIU)D0U`NW=w3?QgNyQ2M4<%Z*XHdcB#K9_KOSm5K_epgQV0 zvCre%_tsAayP*%$u1M!I5;|5>9=i$-djD|g>Ry2GI4NTcR(T%Ww6$n*4()K>8A7&c zE!Rer6R++ryHTNJWOMeBCEQKG*P@oV4rTD|65+{?U4g=6c%3Sq4m3th!FN8A|qA zGT4*UUD8>+mf~1ZC}Io6uyt199n|8h(8^8IO&xc5hcD;=Tv0SAn90$xO9UJayz*0r zy7N+B%X$&N|Mc>d(v>SU=v!{JSEeOEzjRvou1-L?4&hF+H5Nx6rwmtt)v{nHyl-q{ zKOys$$Sotbm_*%RIk$kjouxL(j+hquD1ppdfQP!k?t5JlZK|hw zM(XLXH@}GQ4p#mh4{vTe^QUSOJqCjNHWB!HUz2koO51NIT7q`w%jwiVcPQ${R_*={ zr@gZ%m|0ef_b0;un}HB0WlU4~B68429@ryDPouvhLnbvDoUQXyXSYL#NE1^~tog^6 z`a$X~pnNc6>RmEW^}tNqIO5*P440U|hc?oU)>{BMi(93&@pkkY+IJJ}ud&$q5oN0I z*MZpv_%oS_k_^CpiJpmRUFl5oF0a?P_}-TyYz326hjVT5_}l`{z;)eSU&#?DIYn|y zerVAVM)LUpYN^?CkM(Y25Gw#wlKP6Mf#< zINcY9@|b!}OStrOIM;XeTj3cEa~W6e*R{AeYn%S##3OP89Z7`WjL#AAgwA&+)C}uVt-~Srv_-&+)I=f8(%dGt7%`tfi`d3+}|y) z49I1M>8#J6KU`RfYe9LEEj2z_saiJ`Cq*~pZv$@P=c~PAvNIp{yYEP#uI1Q%UcP!D zlYI%KPIlnX6s_~HSfRGTuxrvg*gE*R{=4VHZp&xP17AzwRr{c9q5!?tfb`VPP%SpG zAM<}m5|Z7z|J#96w_~F2X{gjMvEvpaY$%hf= z;B2K$aj^htfOmAh<*d}$aw(2B0^l~nS1OvB6}O6da7}TO|9UuU$vjJO&)O;D9sl|e zs`i6#W&gYmsG4u2o9?B-Z;R3jCN6)Gw$(hz-q+B&{kkqKeosbglLytMC)Z zcj?pxhCqJ23l?AU3xszZ%lEPDrBxNjrjNRoqo2(L#M6n5Y$Guw-RXLXCy>U0^$Eue zOhEKonv~A^CbomaX5Pv`Rm&=4iJ6O_ME@@Hd7`(gRX4yx?%z_RE+J!7@oN+qsN*?H0 z=us~&bzAt&p#=4NS^-ZRh{oh-a26} z{Cia8%A3HU%R9W7{$;D*Ibz-mX0z#+#hmZurO4-FdN-7p7BJAj$av2NZeR*x5 zx=EQ4HH%aoI+#D6E*3fyR2SlGoeg3k-^^2ZKp#we2FYGM7phGB3 zKH938_qpoHhGAkOr`c#I&zhMr9O*bpJt(woR$nY5t6*juZ1sA#iXZTn@r zc<1|JLXG&SiC4Y%B^2^eW6(2T*KWrv|DuZyYcIw*`J<@y+)||+<5-Il;%YrSxqxgs zs1t6#QnD<%o^H!ik#!94m#5QUmg^lankGOx?RS@w{mn`SNVZ75SqExrpB`>~{ob>8 zMR;E%uI;hxSBKi2XKU1NgTdPmj^T6K2(x_YK)xWOQxoRzmS!KsX)m=V(MUMIEXz zCVdB8o2<&0KI&bgZKOw7`SmIy7}R_ZEI@Iw`(V=N!OBt)m*U=&Fmf=iornYsQ&lA7??*ymhJv!H= zKW@yjv?%gp1=0GqiD5c-(i5x>_1*}AVB!pv zx;Y=qXwr$^OvGwLSIcx^Puaq=&CEwLXH306#62XFLRE9d53CtgRG@@=4zBw*c6L64 zSGU-w92w(=Y^wR+2_3LfH4vob$VJA$HqwzHYcXq|l)H%u4aLG8ZQKrcRcYgaEJx9W ziLLeFB{dK-jeT_68BpKRkKqvcdBh5m5ngfkyHd6|3)^5#UBWN5Iq9B5*c~2hv4>sb zcgab}ds~%7wCi}r*`V6c%7d{ayIX*fKK*t5_)jNIzv`oj!PCgY*6tZSY-vWRDT~-G zAbsNHz0;Sm#(sEs?nMIxLW|7oDI0Bfpz%&wPwcETT5_`I90Sp3Kn4;(m{;VCcTr3uBfsg#@A7MS^O4AWmoOuJpxq|!rSP?_^9 zzSu|e=@)?K4j!pgUE*&?fnXhqFeov~M7nHF$fpdI^Q5VQoI;O}>_x1&@OP9hQICBt za~TTIxMatqSpCWW6q?B8`L)O&T9m$<*Kvc=BfuxrxALWP*Za>*;#hjl$@%J4GF6iy znojvn!`9B}Vs^;qemWKY_D*t=dVDsFryK=*sGdhn@_NQOIr2K5`&gc`w1*~oE_0l& z>FA7`BKdDkt1BBQecb>T)mM*kCda}b{yzF9AkJuTbd6E{^0?y?gu36yt@4p0zxyuR zeOnrCr|m0yQ@s}F!J}N1`p%MbSi2ryMakQiRDqx7QuRnZ`S1jYJB3V3P0YjhHd#(P zetP_F_|fyA^DirOW>R_4p~PrSp656KzYl-PmE2c+LBX4*<$mHcxMW#ziC~mIklnK} Vl<$I^uVhlF)O(K)r5=8Z`wt6Q5+(ou literal 0 HcmV?d00001 diff --git a/Fitness/Frontend/src/assets/images/strength.jpg b/Fitness/Frontend/src/assets/images/strength.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea340cd4391eb93b0a8821dc9de45db1f046cb5a GIT binary patch literal 114482 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 R&HIp)D-bmV&F=*T5b2<>!Huvl>E#6_%zx& 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

Im_MZsq*1jq5 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 Date: Tue, 4 Feb 2025 20:28:48 +0100 Subject: [PATCH 079/118] New: client frontend first page relates to #57 --- Fitness/Frontend/src/router/index.js | 2 +- .../Frontend/src/services/data_services.js | 7 ++ .../src/views/pages/VideoTrainings.vue | 103 +++++++++++++++++- 3 files changed, 106 insertions(+), 6 deletions(-) diff --git a/Fitness/Frontend/src/router/index.js b/Fitness/Frontend/src/router/index.js index a74bc96..8ef06ca 100644 --- a/Fitness/Frontend/src/router/index.js +++ b/Fitness/Frontend/src/router/index.js @@ -104,7 +104,7 @@ const routes = [ path: '/trainer/:id/videotrainings', name: 'Video Trainings', component: () => import('@/views/pages/VideoTrainings.vue') - } + }, { path: '/client/:id/pay-chat/:trainerId', diff --git a/Fitness/Frontend/src/services/data_services.js b/Fitness/Frontend/src/services/data_services.js index 660cfe2..47eeba1 100644 --- a/Fitness/Frontend/src/services/data_services.js +++ b/Fitness/Frontend/src/services/data_services.js @@ -9,6 +9,8 @@ const AUTH_URL = `${GATEWAY_URL}/authentication`; const MSSQL_USERS = `${GATEWAY_URL}/user`; const PAYMENT = `${GATEWAY_URL}/payment`; +const TRAININGS = "http://localhost:8007"; + //const TRAINERS = "http://localhost:8000/api/v1/Trainer"; //const REVIEW = "http://localhost:8001/api/v1/Review"; @@ -209,5 +211,10 @@ export default { axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; return axios.post(`${REVIEW}/trainer/${request.trainerId}`, request); }, + + get_trainings_for_client(cli_id){ + axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; + return axios.get(`${TRAININGS}/api/v1/Training/training/trainingClient/${cli_id}`); + } } } diff --git a/Fitness/Frontend/src/views/pages/VideoTrainings.vue b/Fitness/Frontend/src/views/pages/VideoTrainings.vue index 3a9c38b..391ecd4 100644 --- a/Fitness/Frontend/src/views/pages/VideoTrainings.vue +++ b/Fitness/Frontend/src/views/pages/VideoTrainings.vue @@ -1,13 +1,106 @@ + + - + From a38d34c0e1ba50d7a3d437aa353845571bb94e1e Mon Sep 17 00:00:00 2001 From: NataMata Date: Tue, 4 Feb 2025 20:33:08 +0100 Subject: [PATCH 080/118] Fix: typo changes. --- .../Controllers/TrainingContoroller.cs | 162 ------------------ .../appsettings.Development.json | 2 +- .../videoTrainingService.API.csproj | 9 +- 3 files changed, 9 insertions(+), 164 deletions(-) delete mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs deleted file mode 100644 index 8aee646..0000000 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/TrainingContoroller.cs +++ /dev/null @@ -1,162 +0,0 @@ -using Microsoft.AspNetCore.Mvc; -using videoTrainingService.API.Entities; -using videoTrainingService.API.Repositories; - -namespace videoTrainingService.API.Controllers -{ - [ApiController] - [Route("api/v1/[controller]")] - - public class TrainingContoroller : ControllerBase - { - private readonly ITrainingRepository _repository; - - public TrainingContoroller(ITrainingRepository repository) - { - _repository = repository ?? throw new ArgumentNullException(nameof(repository)); - } - - [HttpGet("exercises/{trainerId}")] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - public async Task>> GetExercises(string trainerId) - { - var exercises = await _repository.GetExercises(trainerId); - return Ok(exercises); - } - - [HttpGet("exercise/{id}", Name = "GetExercise")] - [ProducesResponseType(typeof(Exercise), StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task> GetExercise(string id) - { - var exercise = await _repository.GetExercise(id); - if (exercise == null) - { - return NotFound(); - } - return Ok(exercise); - } - - [HttpPost("exercise")] - [ProducesResponseType(typeof(Exercise), StatusCodes.Status201Created)] - public async Task CreateExercise([FromBody] Exercise exercise) - { - await _repository.CreateExercise(exercise); - return CreatedAtRoute("GetExercise", new { id = exercise.Id} , exercise); - } - - [HttpPut("exercise")] - [ProducesResponseType(typeof(Exercise), StatusCodes.Status200OK)] - public async Task UpdateExercise([FromBody] Exercise exercise) - { - var result = await _repository.UpdateExercise(exercise); - return Ok(result); - } - - [HttpDelete("exercise/{id}")] - [ProducesResponseType(typeof(Exercise), StatusCodes.Status200OK)] - public async Task DeleteExercise(string id) - { - var result = await _repository.DeleteExercise(id); - return Ok(result); - } - - [HttpGet("training/trainingClient/{clientId}", Name = "GetTrainingsForClient")] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - public async Task>> GetTrainingsForClient(string clientId) - { - var trainings = _repository.GetTrainingsForClient(clientId); - return Ok(trainings); - } - - [HttpGet("training/trainingTrainer/{trainerId}", Name = "GetTrainingsForTrainer")] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - public async Task>> GetTrainingsForTrainer(string trainerId) - { - var trainings = _repository.GetTrainingsForTrainer(trainerId); - return Ok(trainings); - } - - [HttpGet("training/{id}", Name = "GetTraining")] - [ProducesResponseType(typeof(Training), StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task> GetTraining(string id) - { - var training = await _repository.GetTraining(id); - if (training == null) - { - return NotFound(); - } - return Ok(training); - } - - [HttpPost("training")] - [ProducesResponseType(typeof(Training), StatusCodes.Status201Created)] - public async Task CreateTraining([FromBody] Training training) - { - await _repository.CreateTraining(training); - return CreatedAtRoute("GetTraining", new { id = training.TrainingId} , training); - } - - [HttpPut("training")] - [ProducesResponseType(typeof(Training), StatusCodes.Status200OK)] - public async Task UpdateTraining([FromBody] Training training) - { - var result = await _repository.UpdateTraining(training); - return Ok(result); - } - - [HttpDelete("training/{id}")] - [ProducesResponseType(typeof(Training), StatusCodes.Status200OK)] - public async Task DeleteTraining(string id) - { - var result = await _repository.DeleteTraining(id); - return Ok(result); - } - - [HttpGet("trainingExercises/{trainingId}", Name = "GetTrainingExercises")] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - public async Task>> GetTrainingExercises(string trainingId) - { - var trainingExercises = _repository.GetTrainingExercises(trainingId); - return Ok(trainingExercises); - } - - [HttpGet("trainingExercise/{id}", Name = "GetTrainingExercise")] - [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task> GetTrainingExercise(string id) - { - var trainingExercise = await _repository.GetTrainingExercise(id); - if (trainingExercise == null) - { - return NotFound(); - } - return Ok(trainingExercise); - } - - [HttpPost("trainingExercise")] - [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status201Created)] - public async Task CreateTrainingExercise([FromBody] TrainingExercise trainingExercise) - { - await _repository.CreateTrainingExercise(trainingExercise); - return CreatedAtRoute("GetTrainingExercise", new { id = trainingExercise.Id} , trainingExercise); - } - - [HttpPut("trainingExercise")] - [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status200OK)] - public async Task UpdateTrainingExercise([FromBody] TrainingExercise trainingExercises) - { - var result = await _repository.UpdateTrainingExercise(trainingExercises); - return Ok(result); - } - - [HttpDelete("trainingExercise/{id}")] - [ProducesResponseType(typeof(TrainingExercise), StatusCodes.Status200OK)] - public async Task DeleteTrainingExercise(string id) - { - var result = await _repository.DeleteTrainingExercise(id); - return Ok(result); - } - } -} \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.Development.json b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.Development.json index 3580e6d..ee42267 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.Development.json +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/appsettings.Development.json @@ -7,7 +7,7 @@ }, "DatabaseSettings": { - "ConnectionString": "mongodb://localhost:27017" + "ConnectionString": "mongodb://videotrainingdb:27017" } } diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj index e62f26d..d1b6105 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/videoTrainingService.API.csproj @@ -4,12 +4,13 @@ net8.0 enable enable + Linux - + @@ -21,4 +22,10 @@ + + + .dockerignore + + + From 2acdf311e475a58c59d06589531fe25f3d8831dc Mon Sep 17 00:00:00 2001 From: NataMata Date: Tue, 4 Feb 2025 20:41:02 +0100 Subject: [PATCH 081/118] Delete: .idea file removed. #16 --- .../.idea.videoTrainingService/.idea/.gitignore | 13 ------------- .../.idea/indexLayout.xml | 8 -------- .../.idea/.idea.videoTrainingService/.idea/vcs.xml | 6 ------ 3 files changed, 27 deletions(-) delete mode 100644 Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/.gitignore delete mode 100644 Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/indexLayout.xml delete mode 100644 Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/vcs.xml diff --git a/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/.gitignore b/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/.gitignore deleted file mode 100644 index b349466..0000000 --- a/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Rider ignored files -/projectSettingsUpdater.xml -/.idea.videoTrainingService.iml -/modules.xml -/contentModel.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/indexLayout.xml b/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/indexLayout.xml deleted file mode 100644 index 7b08163..0000000 --- a/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/vcs.xml b/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/vcs.xml deleted file mode 100644 index 4fce1d8..0000000 --- a/Fitness/Backend/Services/videoTrainingService/.idea/.idea.videoTrainingService/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From daae15273e3a1fa26a3667130fb67e2666f332ac Mon Sep 17 00:00:00 2001 From: NataMata Date: Sat, 22 Feb 2025 20:12:35 +0100 Subject: [PATCH 082/118] Change: changed icon for video training service. --- Fitness/Frontend/src/_nav.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Fitness/Frontend/src/_nav.js b/Fitness/Frontend/src/_nav.js index 6e3ecbf..b0ae38a 100644 --- a/Fitness/Frontend/src/_nav.js +++ b/Fitness/Frontend/src/_nav.js @@ -30,7 +30,7 @@ export function generateTrainerNav(id) { component: 'CNavItem', name: 'Video trainings', to: `/trainer/${id}/videotrainings`, - icon: 'cil-user' + icon: 'cil-media-play' }, { @@ -72,7 +72,7 @@ export function generateClientNav(id) { component: 'CNavItem', name: 'Video trainings', to: `/client/${id}/videotrainings`, - icon: 'cil-user' + icon: 'cil-media-play' }, { component: 'CNavItem', From 91111d3574f29d975f035df853c52f8486d42af5 Mon Sep 17 00:00:00 2001 From: NataMata Date: Sat, 22 Feb 2025 20:14:47 +0100 Subject: [PATCH 083/118] Refactor: separated client and trainer pages. --- ...Trainings.vue => VideoTrainingsClient.vue} | 27 ++--- .../src/views/pages/VideoTrainingsTrainer.vue | 103 ++++++++++++++++++ 2 files changed, 115 insertions(+), 15 deletions(-) rename Fitness/Frontend/src/views/pages/{VideoTrainings.vue => VideoTrainingsClient.vue} (71%) create mode 100644 Fitness/Frontend/src/views/pages/VideoTrainingsTrainer.vue diff --git a/Fitness/Frontend/src/views/pages/VideoTrainings.vue b/Fitness/Frontend/src/views/pages/VideoTrainingsClient.vue similarity index 71% rename from Fitness/Frontend/src/views/pages/VideoTrainings.vue rename to Fitness/Frontend/src/views/pages/VideoTrainingsClient.vue index 391ecd4..7fec180 100644 --- a/Fitness/Frontend/src/views/pages/VideoTrainings.vue +++ b/Fitness/Frontend/src/views/pages/VideoTrainingsClient.vue @@ -10,7 +10,6 @@

{{ training.name }}

Svi imaju za sad isti opis.
Kao nesto pise.
- Trener: Ime i Prezime.

@@ -28,21 +27,19 @@ export default { isAvailable: false, message: 'Probna verzija!', trainings: [ - { name: 'Prvi', type: require('@/assets/images/running.jpeg')}, - { name: 'Drugi', type: require('@/assets/images/strength.jpg')}, - { name: 'Treci', type: require('@/assets/images/yoga.jpg')}, - { name: 'Cetvrti', type: require('@/assets/images/home.jpeg')}, - { name: 'Peti', type: require('@/assets/images/strength.jpg')}, - { name: 'Sesti', type: require('@/assets/images/running.jpeg')}, - ], + { name: 'Prvi', type: require('@/assets/images/running.jpeg')}, + { name: 'Drugi', type: require('@/assets/images/strength.jpg')}, + { name: 'Treci', type: require('@/assets/images/yoga.jpg')}, + { name: 'Cetvrti', type: require('@/assets/images/home.jpeg')}, + { name: 'Peti', type: require('@/assets/images/strength.jpg')}, + { name: 'Sesti', type: require('@/assets/images/running.jpeg')}, + ] } }, methods: { - getTraining(){ - // await dataServices.methods.get_trainings_for_client(this.$route.params.id); - - this.message = 'Radim!'; + async getTraining(){ + this.message = 'Radim za klijenta!'; }, buyProgram(){ @@ -51,9 +48,9 @@ export default { }, - //beforeMount() { - // this.getTraining(); - //}, + beforeMount() { + this.getTraining(); + }, mounted() { this.$parent.$parent.$parent.setUserData(this.$route.params.id, "client"); diff --git a/Fitness/Frontend/src/views/pages/VideoTrainingsTrainer.vue b/Fitness/Frontend/src/views/pages/VideoTrainingsTrainer.vue new file mode 100644 index 0000000..fe7ab7d --- /dev/null +++ b/Fitness/Frontend/src/views/pages/VideoTrainingsTrainer.vue @@ -0,0 +1,103 @@ + + + + + From 5f8e8037c6a9d2c89480580a2878bb04a4061bb0 Mon Sep 17 00:00:00 2001 From: NataMata Date: Wed, 1 Oct 2025 18:49:20 +0200 Subject: [PATCH 084/118] Necessary backend changes to enable exercise add and show functionality. --- .../Controllers/UploadController.cs | 43 +++++++++++++++++++ .../videoTrainingService.API/Dockerfile | 6 ++- .../videoTrainingService.API/Program.cs | 27 ++++++++++++ .../Backend/docker-compose.development.yml | 1 + Fitness/Backend/docker-compose.yml | 2 + 5 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/UploadController.cs diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/UploadController.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/UploadController.cs new file mode 100644 index 0000000..b14d72a --- /dev/null +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Controllers/UploadController.cs @@ -0,0 +1,43 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Hosting; +using System.IO; +using System.Threading.Tasks; + +namespace videoTrainingService.API.Controllers + +{ + + [ApiController] + [Route("api/v1/[controller]")] + public class UploadController : ControllerBase + { + private readonly string _uploadsPath; + + public UploadController(IWebHostEnvironment env) + { + _uploadsPath = Path.Combine(env.ContentRootPath, "uploads"); + if (!Directory.Exists(_uploadsPath)) + { + Directory.CreateDirectory(_uploadsPath); + } + } + + [HttpPost("video")] + [ApiExplorerSettings(IgnoreApi = true)] + public async Task UploadVideo([FromForm] IFormFile file) + { + if (file == null || file.Length == 0) + return BadRequest("No file uploaded"); + + var filePath = Path.Combine(_uploadsPath, file.FileName); + + using (var stream = new FileStream(filePath, FileMode.Create)) + { + await file.CopyToAsync(stream); + } + + return Ok(new { FileName = file.FileName }); + } + } +} \ No newline at end of file diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Dockerfile b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Dockerfile index 84d1a98..eea1da6 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Dockerfile +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Dockerfile @@ -1,6 +1,10 @@ FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base -USER $APP_UID + WORKDIR /app +RUN mkdir /app/uploads +RUN chmod 777 /app/uploads +RUN chown -R $APP_UID /app/uploads + EXPOSE 8080 EXPOSE 8081 diff --git a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs index ca3d35f..eaf3a99 100644 --- a/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs +++ b/Fitness/Backend/Services/videoTrainingService/videoTrainingService.API/Program.cs @@ -1,5 +1,6 @@ using videoTrainingService.API.Data; using videoTrainingService.API.Repositories; +using Microsoft.Extensions.FileProviders; var builder = WebApplication.CreateBuilder(args); @@ -14,6 +15,19 @@ builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); +builder.Services.AddCors(options => +{ + options.AddPolicy("AllowAll", + policy => + { + policy.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader(); + }); +}); + +builder.Services.AddControllers(); + var app = builder.Build(); // Configure the HTTP request pipeline. @@ -23,6 +37,19 @@ app.UseSwaggerUI(); } +var uploadsPath = Path.Combine(Directory.GetCurrentDirectory(), "uploads"); +if (!Directory.Exists(uploadsPath)) +{ + Directory.CreateDirectory(uploadsPath); +} + +app.UseStaticFiles(new StaticFileOptions +{ + FileProvider = new PhysicalFileProvider(uploadsPath), + RequestPath = "/uploads" +}); + +app.UseCors("AllowAll"); app.UseHttpsRedirection(); app.MapControllers(); app.Run(); diff --git a/Fitness/Backend/docker-compose.development.yml b/Fitness/Backend/docker-compose.development.yml index 82a90c7..db60073 100644 --- a/Fitness/Backend/docker-compose.development.yml +++ b/Fitness/Backend/docker-compose.development.yml @@ -84,6 +84,7 @@ services: - SA_PASSWORD=MATF12345678rs2 - ACCEPT_EULA=Y restart: always + user: root ports: - "1433:1433" volumes: diff --git a/Fitness/Backend/docker-compose.yml b/Fitness/Backend/docker-compose.yml index cc79d79..5faa5d2 100644 --- a/Fitness/Backend/docker-compose.yml +++ b/Fitness/Backend/docker-compose.yml @@ -161,6 +161,8 @@ services: dockerfile: Services/videoTrainingService/videoTrainingService.API/Dockerfile depends_on: - videotrainingdb + volumes: + - ./uploads:/app/uploads volumes: trainermongo_data: From 2a218a83204c3b479aeef0a8198849a7f135317b Mon Sep 17 00:00:00 2001 From: NataMata Date: Wed, 1 Oct 2025 18:50:14 +0200 Subject: [PATCH 085/118] Add: frontend for exercise add and show functionality. --- Fitness/Frontend/src/router/index.js | 10 +- .../Frontend/src/services/data_services.js | 34 +- .../src/views/pages/VideoTrainingsClient.vue | 31 +- .../src/views/pages/VideoTrainingsTrainer.vue | 573 ++++++++++++++++-- 4 files changed, 563 insertions(+), 85 deletions(-) diff --git a/Fitness/Frontend/src/router/index.js b/Fitness/Frontend/src/router/index.js index 8ef06ca..21f4474 100644 --- a/Fitness/Frontend/src/router/index.js +++ b/Fitness/Frontend/src/router/index.js @@ -96,8 +96,14 @@ const routes = [ { path: '/client/:id/videotrainings', - name: 'Video Trainings', - component: () => import('@/views/pages/VideoTrainings.vue') + name: 'Video Trainings Client', + component: () => import('@/views/pages/VideoTrainingsClient.vue') + }, + + { + path: '/trainer/:id/videotrainings', + name: 'Video Trainings Trainer', + component: () => import('@/views/pages/VideoTrainingsTrainer.vue') }, { diff --git a/Fitness/Frontend/src/services/data_services.js b/Fitness/Frontend/src/services/data_services.js index 47eeba1..9b6acba 100644 --- a/Fitness/Frontend/src/services/data_services.js +++ b/Fitness/Frontend/src/services/data_services.js @@ -18,6 +18,7 @@ const TRAININGS = "http://localhost:8007"; //const AUTH_URL = "http://localhost:4000/api/v1/authentication/"; //const MSSQL_USERS = "http://localhost:4000/api/v1/User/"; //const PAYMENT = "http://localhost:8003/api/v1/Payment"; +//const TRAININGS = `${GATEWAY_URL}/training`; export default { methods: { @@ -214,7 +215,38 @@ export default { get_trainings_for_client(cli_id){ axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; - return axios.get(`${TRAININGS}/api/v1/Training/training/trainingClient/${cli_id}`); + return axios.get(`${TRAININGS}/trainingClient/${cli_id}`); + }, + + get_trainings_for_trainer(trainer_id){ + //axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; + try{ + const data = axios.get(`${TRAININGS}/trainingTrainer/${trainer_id}`); + } catch (error) { + console.error("Error fetching trainings!", error); + throw error; + } + }, + + create_exercise(exercise) { + axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; + return axios.post(`${TRAININGS}/exercise`, exercise); + }, + + get_exercises_by_trainer(trainer_id){ + axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; + return axios.get(`${TRAININGS}/exercises/${trainer_id}`); + }, + + upload_video(file) { + axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; + const formData = new FormData(); + formData.append("file", file); + const response = axios.post(`http://localhost:8004/api/v1/upload/video`, formData, { + headers: { "Content-Type": "multipart/form-data" }, + }); + + return response.data; // { fileName: "imeFajla.mp4" } } } } diff --git a/Fitness/Frontend/src/views/pages/VideoTrainingsClient.vue b/Fitness/Frontend/src/views/pages/VideoTrainingsClient.vue index 7fec180..2fd654d 100644 --- a/Fitness/Frontend/src/views/pages/VideoTrainingsClient.vue +++ b/Fitness/Frontend/src/views/pages/VideoTrainingsClient.vue @@ -1,9 +1,4 @@ @@ -324,4 +383,25 @@ export default { transition: background 0.3s, color 0.3s, transform 0.2s; } + .buttons-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; + margin-bottom: 30px; + } + + .clientBtn { + margin: 5px; + padding: 10px 18px; + border-radius: 8px; + font-size: 16px; + font-weight: 500; + cursor: pointer; + background-color: #fff; + color: #333; + border: 2px solid #e67e22; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); + transition: background 0.3s, color 0.3s, transform 0.2s; + } + From 15af0a524d2593b8b844d34e4e9d9754684b0d7f Mon Sep 17 00:00:00 2001 From: Milan Mitreski Date: Sun, 12 Oct 2025 19:02:50 +0200 Subject: [PATCH 090/118] Rebased videoTrainingService on analyticsService. Payment integrated into videoTrainingService. --- Fitness/Backend/.gitignore | 3 +- .../20241129113928_Initial.Designer.cs | 342 ------------------ .../Migrations/20241129113928_Initial.cs | 265 -------------- .../Backend/docker-compose.development.yml | 2 +- Fitness/Frontend/src/router/index.js | 6 - .../Frontend/src/services/data_services.js | 8 +- .../src/views/pages/PaymentSuccess.vue | 26 +- .../src/views/pages/VideoTrainingsClient.vue | 73 ++-- .../src/views/pages/VideoTrainingsTrainer.vue | 5 +- 9 files changed, 80 insertions(+), 650 deletions(-) delete mode 100644 Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.Designer.cs delete mode 100644 Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.cs diff --git a/Fitness/Backend/.gitignore b/Fitness/Backend/.gitignore index da9eb05..7bddc9b 100644 --- a/Fitness/Backend/.gitignore +++ b/Fitness/Backend/.gitignore @@ -490,4 +490,5 @@ FodyWeavers.xsd .DS_Store # .env -**/.env \ No newline at end of file +**/.env +uploads/** \ No newline at end of file diff --git a/Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.Designer.cs b/Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.Designer.cs deleted file mode 100644 index ab3f3c3..0000000 --- a/Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.Designer.cs +++ /dev/null @@ -1,342 +0,0 @@ -// -using System; -using IdentityServer.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace IdentityServer.Migrations -{ - [DbContext(typeof(ApplicationContext))] - [Migration("20241129113928_Initial")] - partial class Initial - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.7") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("IdentityServer.Entities.RefreshToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ExpiryTime") - .HasColumnType("datetime2"); - - b.Property("Token") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("RefreshTokens"); - }); - - modelBuilder.Entity("IdentityServer.Entities.User", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("AccessFailedCount") - .HasColumnType("int"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("bit"); - - b.Property("FirstName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("LastName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("LockoutEnabled") - .HasColumnType("bit"); - - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("PasswordHash") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumber") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("bit"); - - b.Property("SecurityStamp") - .HasColumnType("nvarchar(max)"); - - b.Property("TwoFactorEnabled") - .HasColumnType("bit"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex") - .HasFilter("[NormalizedUserName] IS NOT NULL"); - - b.ToTable("AspNetUsers", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex") - .HasFilter("[NormalizedName] IS NOT NULL"); - - b.ToTable("AspNetRoles", (string)null); - - b.HasData( - new - { - Id = "b87c880c-bc30-4e20-ab81-5d22e55b093b", - Name = "Admin", - NormalizedName = "ADMIN" - }, - new - { - Id = "6273c7e7-7430-4ddc-8a3c-71948427c459", - Name = "Trainer", - NormalizedName = "TRAINER" - }, - new - { - Id = "298871fd-917c-42e9-9a4d-b5a0ba262fe7", - Name = "Client", - NormalizedName = "CLIENT" - }); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("nvarchar(max)"); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(max)"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("nvarchar(max)"); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(max)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("nvarchar(450)"); - - b.Property("ProviderKey") - .HasColumnType("nvarchar(450)"); - - b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(max)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.Property("RoleId") - .HasColumnType("nvarchar(450)"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.Property("LoginProvider") - .HasColumnType("nvarchar(450)"); - - b.Property("Name") - .HasColumnType("nvarchar(450)"); - - b.Property("Value") - .HasColumnType("nvarchar(max)"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens", (string)null); - }); - - modelBuilder.Entity("IdentityServer.Entities.RefreshToken", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany("RefreshTokens") - .HasForeignKey("UserId"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("IdentityServer.Entities.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("IdentityServer.Entities.User", b => - { - b.Navigation("RefreshTokens"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.cs b/Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.cs deleted file mode 100644 index c821a45..0000000 --- a/Fitness/Backend/Security/IdentityServer/Migrations/20241129113928_Initial.cs +++ /dev/null @@ -1,265 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional - -namespace IdentityServer.Migrations -{ - /// - public partial class Initial : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "AspNetRoles", - columns: table => new - { - Id = table.Column(type: "nvarchar(450)", nullable: false), - Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetUsers", - columns: table => new - { - Id = table.Column(type: "nvarchar(450)", nullable: false), - FirstName = table.Column(type: "nvarchar(max)", nullable: false), - LastName = table.Column(type: "nvarchar(max)", nullable: false), - UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - EmailConfirmed = table.Column(type: "bit", nullable: false), - PasswordHash = table.Column(type: "nvarchar(max)", nullable: true), - SecurityStamp = table.Column(type: "nvarchar(max)", nullable: true), - ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true), - PhoneNumber = table.Column(type: "nvarchar(max)", nullable: true), - PhoneNumberConfirmed = table.Column(type: "bit", nullable: false), - TwoFactorEnabled = table.Column(type: "bit", nullable: false), - LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), - LockoutEnabled = table.Column(type: "bit", nullable: false), - AccessFailedCount = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetRoleClaims", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - RoleId = table.Column(type: "nvarchar(450)", nullable: false), - ClaimType = table.Column(type: "nvarchar(max)", nullable: true), - ClaimValue = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserClaims", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - UserId = table.Column(type: "nvarchar(450)", nullable: false), - ClaimType = table.Column(type: "nvarchar(max)", nullable: true), - ClaimValue = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetUserClaims_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserLogins", - columns: table => new - { - LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), - ProviderKey = table.Column(type: "nvarchar(450)", nullable: false), - ProviderDisplayName = table.Column(type: "nvarchar(max)", nullable: true), - UserId = table.Column(type: "nvarchar(450)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); - table.ForeignKey( - name: "FK_AspNetUserLogins_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserRoles", - columns: table => new - { - UserId = table.Column(type: "nvarchar(450)", nullable: false), - RoleId = table.Column(type: "nvarchar(450)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserTokens", - columns: table => new - { - UserId = table.Column(type: "nvarchar(450)", nullable: false), - LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), - Name = table.Column(type: "nvarchar(450)", nullable: false), - Value = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AspNetUserTokens_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "RefreshTokens", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Token = table.Column(type: "nvarchar(max)", nullable: false), - ExpiryTime = table.Column(type: "datetime2", nullable: false), - UserId = table.Column(type: "nvarchar(450)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_RefreshTokens", x => x.Id); - table.ForeignKey( - name: "FK_RefreshTokens_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id"); - }); - - migrationBuilder.InsertData( - table: "AspNetRoles", - columns: new[] { "Id", "ConcurrencyStamp", "Name", "NormalizedName" }, - values: new object[,] - { - { "298871fd-917c-42e9-9a4d-b5a0ba262fe7", null, "Client", "CLIENT" }, - { "6273c7e7-7430-4ddc-8a3c-71948427c459", null, "Trainer", "TRAINER" }, - { "b87c880c-bc30-4e20-ab81-5d22e55b093b", null, "Admin", "ADMIN" } - }); - - migrationBuilder.CreateIndex( - name: "IX_AspNetRoleClaims_RoleId", - table: "AspNetRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "RoleNameIndex", - table: "AspNetRoles", - column: "NormalizedName", - unique: true, - filter: "[NormalizedName] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserClaims_UserId", - table: "AspNetUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserLogins_UserId", - table: "AspNetUserLogins", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserRoles_RoleId", - table: "AspNetUserRoles", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "EmailIndex", - table: "AspNetUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "UserNameIndex", - table: "AspNetUsers", - column: "NormalizedUserName", - unique: true, - filter: "[NormalizedUserName] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_RefreshTokens_UserId", - table: "RefreshTokens", - column: "UserId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AspNetRoleClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserLogins"); - - migrationBuilder.DropTable( - name: "AspNetUserRoles"); - - migrationBuilder.DropTable( - name: "AspNetUserTokens"); - - migrationBuilder.DropTable( - name: "RefreshTokens"); - - migrationBuilder.DropTable( - name: "AspNetRoles"); - - migrationBuilder.DropTable( - name: "AspNetUsers"); - } - } -} diff --git a/Fitness/Backend/docker-compose.development.yml b/Fitness/Backend/docker-compose.development.yml index db60073..3a41064 100644 --- a/Fitness/Backend/docker-compose.development.yml +++ b/Fitness/Backend/docker-compose.development.yml @@ -35,7 +35,7 @@ services: container_name: videotrainingdb restart: always ports: - - 27021:27017 + - "27030:27017" volumes: - videotrainingmongo_data:/data/db diff --git a/Fitness/Frontend/src/router/index.js b/Fitness/Frontend/src/router/index.js index 21f4474..efef5ce 100644 --- a/Fitness/Frontend/src/router/index.js +++ b/Fitness/Frontend/src/router/index.js @@ -106,12 +106,6 @@ const routes = [ component: () => import('@/views/pages/VideoTrainingsTrainer.vue') }, - { - path: '/trainer/:id/videotrainings', - name: 'Video Trainings', - component: () => import('@/views/pages/VideoTrainings.vue') - }, - { path: '/client/:id/pay-chat/:trainerId', name: 'PayChat', diff --git a/Fitness/Frontend/src/services/data_services.js b/Fitness/Frontend/src/services/data_services.js index fe52d03..59d89d9 100644 --- a/Fitness/Frontend/src/services/data_services.js +++ b/Fitness/Frontend/src/services/data_services.js @@ -9,7 +9,8 @@ const AUTH_URL = `${GATEWAY_URL}/authentication`; const MSSQL_USERS = `${GATEWAY_URL}/user`; const PAYMENT = `${GATEWAY_URL}/payment`; -const TRAININGS = "http://localhost:8007"; +const TRAININGS = "http://localhost:8007/api/v1/Training"; +const UPLOAD = "http://localhost:8007/api/v1/Upload" //const TRAINERS = "http://localhost:8000/api/v1/Trainer"; @@ -232,7 +233,7 @@ export default { axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; const formData = new FormData(); formData.append("file", file); - const response = axios.post(`http://localhost:8004/api/v1/upload/video`, formData, { + const response = axios.post(`${UPLOAD}/video`, formData, { headers: { "Content-Type": "multipart/form-data" }, }); @@ -241,11 +242,12 @@ export default { delete_video(fileName){ axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; - const response = axios.delete(`http://localhost:8004/api/v1/upload/video/delete/${fileName}`); + const response = axios.delete(`${UPLOAD}/video/delete/${fileName}`); }, create_training(training){ axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; + console.log(JSON.stringify(training)) return axios.post(`${TRAININGS}/training`, training); }, diff --git a/Fitness/Frontend/src/views/pages/PaymentSuccess.vue b/Fitness/Frontend/src/views/pages/PaymentSuccess.vue index 98be786..e466df8 100644 --- a/Fitness/Frontend/src/views/pages/PaymentSuccess.vue +++ b/Fitness/Frontend/src/views/pages/PaymentSuccess.vue @@ -43,7 +43,8 @@ export default { const cancelData = sessionStorage.getItem("cancelData"); const chatData = sessionStorage.getItem("chatData"); const extendData = sessionStorage.getItem("extendData"); - + const videoData = sessionStorage.getItem("videoData") + if (bookData) { this.processBooking(JSON.parse(bookData)); sessionStorage.removeItem("bookData"); @@ -56,6 +57,9 @@ export default { } else if(cancelData) { this.processCancel(JSON.parse(cancelData)); sessionStorage.removeItem("cancelData"); + } else if(videoData) { + this.processVideo(JSON.parse(videoData)); + sessionStorage.removeItem("videoData"); } else { console.log("No data found in session."); } @@ -136,6 +140,26 @@ export default { this.$router.push(`/client/${extendData.clientId}/chat`); }); }, + + processVideo(videoData) { + console.log("Paying video data..."); + + dataServices.methods.buy_training(videoData.trainingId, videoData.clientId) + .then((response) => { + if (response.status === 200) { + alert("Video training bought successfully"); + } else { + alert("Failed to buy video training."); + } + }) + .catch((error) => { + console.error("Video training buying error:", error); + alert("An error occurred while buyinh the video training."); + }) + .then(() => { + this.$router.push(`/client/${videoData.clientId}/videotrainings`); + }); + }, }, }; diff --git a/Fitness/Frontend/src/views/pages/VideoTrainingsClient.vue b/Fitness/Frontend/src/views/pages/VideoTrainingsClient.vue index 391c073..be70b5b 100644 --- a/Fitness/Frontend/src/views/pages/VideoTrainingsClient.vue +++ b/Fitness/Frontend/src/views/pages/VideoTrainingsClient.vue @@ -96,12 +96,6 @@ export default { }, methods: { - - buyProgram(){ - alert("Kupili ste program!"); - - }, - async loadTrainings(){ const clientId = this.$route.params.id; @@ -130,11 +124,20 @@ export default { async loadPurchased(){ const clientId = this.$route.params.id; - try { const response = await dataServices.methods.get_purchased_trainings(clientId); if (response.data) { this.purchasedTrainings = response.data; + this.purchasedTrainings.forEach(async training => { + try { + const exercisesResponse = await dataServices.methods.get_training_exercises(training.trainingId); + if (exercisesResponse.data) { + this.trainingExercises.push(...exercisesResponse.data); + } + } catch (error) { + console.error("Greška pri dohvatanju vezbi iz treninga: ", training.trainingId , " ", error); + } + }) } } catch (error) { console.error("Greška pri dohvatanju treninga za klijenta:", error); @@ -164,30 +167,46 @@ export default { return trainer.averageRating; }, + async initiatePayment(videoData, price) { + try { + let trainer = await dataServices.methods.get_trainer_by_id(videoData.trainerId) + const request = { + id: "", + userId: videoData.clientId, + amount: price, + currency: "USD", + trainerPayPalEmail: trainer.data.contactEmail + }; + let response = await dataServices.methods.create_payment(request); + + const paymentId = response.data.payment.id; + const approvalUrl = response.data.paymentLink; + + console.log("Payment initiated with ID:", paymentId); + window.location.href = approvalUrl; + } catch(error) { + console.error("Error initiating payment:", error); + alert("Failed to initiate payment."); + return false; + } + }, + async handleTrainingClick(training) { const clientId = this.$route.params.id; if (!this.isPurchased(training)) { if (confirm(`Da li želiš da kupiš trening?`)) { - - try{ - const exercisesResponse = await dataServices.methods.buy_training(training.trainingId, clientId); - } catch (error) { - console.error("Greška pri kupovini treninga: ", training.trainingId , " ", error); - } - - try{ - const exercisesResponse = await dataServices.methods.get_training_exercises(training.trainingId); - if (exercisesResponse.data) { - this.trainingExercises.push(...exercisesResponse.data); - } - } catch (error) { - console.error("Greška pri dohvatanju vezbi iz treninga: ", training.trainingId , " ", error); - } - - this.trainings = this.trainings.filter(t => t.trainingId !== training.trainingId); - this.loadPurchased(); + const videoData = { + trainingId: training.trainingId, + trainerId: training.trainerId, + clientId: clientId + }; + const price = 60; // USD + + sessionStorage.setItem("videoData", JSON.stringify(videoData)); + + return this.initiatePayment(videoData, price); } } else { this.expandedTrainingId = training.trainingId; @@ -217,14 +236,10 @@ export default { }, mounted() { - const id = this.$route.params.id; - this.$parent.$parent.$parent.setUserData(id, "client"); - this.loadTrainings(); this.loadPurchased(); - } } diff --git a/Fitness/Frontend/src/views/pages/VideoTrainingsTrainer.vue b/Fitness/Frontend/src/views/pages/VideoTrainingsTrainer.vue index 2ac7598..d54ad5f 100644 --- a/Fitness/Frontend/src/views/pages/VideoTrainingsTrainer.vue +++ b/Fitness/Frontend/src/views/pages/VideoTrainingsTrainer.vue @@ -42,7 +42,7 @@ @@ -345,7 +345,8 @@ export default { TrainingId: "", TrainerId: trainerId, Type: this.trainingType, - Description: this.note + Description: this.note, + ClientIds: [] } const response = await dataServices.methods.create_training(training); From d9bfad763f29eece0aff91ab8117115f0d899de1 Mon Sep 17 00:00:00 2001 From: anjaanjaa10 Date: Sun, 28 Sep 2025 02:03:06 +0200 Subject: [PATCH 091/118] Init NutritionService --- Fitness/Backend/Fitness.sln | 12 +++++++ .../Controllers/HealthController.cs | 12 +++++++ .../NutritionService.API/Dockerfile | 31 +++++++++++++++++++ .../NutritionService.API.csproj | 19 ++++++++++++ .../NutritionService.API/Program.cs | 23 ++++++++++++++ .../appsettings.Development.json | 16 ++++++++++ .../NutritionService.API/appsettings.json | 10 ++++++ .../Backend/docker-compose.development.yml | 16 +++++++++- Fitness/Backend/docker-compose.yml | 9 ++++++ 9 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/HealthController.cs create mode 100644 Fitness/Backend/Services/NutritionService/NutritionService.API/Dockerfile create mode 100644 Fitness/Backend/Services/NutritionService/NutritionService.API/NutritionService.API.csproj create mode 100644 Fitness/Backend/Services/NutritionService/NutritionService.API/Program.cs create mode 100644 Fitness/Backend/Services/NutritionService/NutritionService.API/appsettings.Development.json create mode 100644 Fitness/Backend/Services/NutritionService/NutritionService.API/appsettings.json diff --git a/Fitness/Backend/Fitness.sln b/Fitness/Backend/Fitness.sln index 56618f3..0ab488e 100644 --- a/Fitness/Backend/Fitness.sln +++ b/Fitness/Backend/Fitness.sln @@ -49,6 +49,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GatewayService.API", "Servi EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsulConfig.Settings", "Common\ConsulConfig.Settings\ConsulConfig.Settings.csproj", "{E8032951-A2BF-4DA6-B433-C3004A2D1021}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{1D121431-9B0F-4592-9D0B-90B2E191AA64}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NutritionService", "NutritionService", "{F2366384-2A1A-4EFE-8CDC-284F923B0A84}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NutritionService.API", "Services\NutritionService\NutritionService.API\NutritionService.API.csproj", "{7D625DE7-ABFB-4782-8F3F-5D9A701439D1}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "videoTrainingService.API", "Services\videoTrainingService\videoTrainingService.API\videoTrainingService.API.csproj", "{5A3A398E-4133-43EF-A92C-338E8E13715C}" EndProject Global @@ -145,6 +151,10 @@ Global {5A3A398E-4133-43EF-A92C-338E8E13715C}.Debug|Any CPU.Build.0 = Debug|Any CPU {5A3A398E-4133-43EF-A92C-338E8E13715C}.Release|Any CPU.ActiveCfg = Release|Any CPU {5A3A398E-4133-43EF-A92C-338E8E13715C}.Release|Any CPU.Build.0 = Release|Any CPU + {7D625DE7-ABFB-4782-8F3F-5D9A701439D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7D625DE7-ABFB-4782-8F3F-5D9A701439D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7D625DE7-ABFB-4782-8F3F-5D9A701439D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D625DE7-ABFB-4782-8F3F-5D9A701439D1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -153,6 +163,8 @@ Global {DD1D07DE-12AA-437E-AC5C-B6F21A9D64C8} = {89F11E05-9275-456A-B680-9E47AEFC6A05} {4E7EFF7C-F700-473B-9265-48C289A497BF} = {08A30FB7-C7FE-49F3-B26F-FB0F9945EF7A} {E8032951-A2BF-4DA6-B433-C3004A2D1021} = {08A30FB7-C7FE-49F3-B26F-FB0F9945EF7A} + {F2366384-2A1A-4EFE-8CDC-284F923B0A84} = {1D121431-9B0F-4592-9D0B-90B2E191AA64} + {7D625DE7-ABFB-4782-8F3F-5D9A701439D1} = {F2366384-2A1A-4EFE-8CDC-284F923B0A84} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {B317DCB6-F066-4D68-9E03-E9DF67260B22} diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/HealthController.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/HealthController.cs new file mode 100644 index 0000000..aa343b9 --- /dev/null +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/HealthController.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNetCore.Mvc; + +namespace NutritionService.API.Controllers +{ + [ApiController] + [Route("api/[controller]")] + public class HealthController : ControllerBase + { + [HttpGet] + public IActionResult Get() => Ok("NutritionService running.."); + } +} diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Dockerfile b/Fitness/Backend/Services/NutritionService/NutritionService.API/Dockerfile new file mode 100644 index 0000000..90db480 --- /dev/null +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Dockerfile @@ -0,0 +1,31 @@ +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +WORKDIR /app +EXPOSE 8080 + +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +WORKDIR /src + +# Kopiraj csproj fajlove +COPY ["Services/NutritionService/NutritionService.API/NutritionService.API.csproj", "Services/NutritionService/NutritionService.API/"] +COPY ["Common/ConsulConfig.Settings/ConsulConfig.Settings.csproj", "Common/ConsulConfig.Settings/"] +COPY ["Common/EventBus.Messages/EventBus.Messages.csproj", "Common/EventBus.Messages/"] + +# Restore +RUN dotnet restore "Services/NutritionService/NutritionService.API/NutritionService.API.csproj" + +# Kopiraj ceo projekat +COPY . . + +# Build +WORKDIR "/src/Services/NutritionService/NutritionService.API" +RUN dotnet build "NutritionService.API.csproj" -c Release -o /app/build + +FROM build AS publish +RUN dotnet publish "NutritionService.API.csproj" -c Release -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "NutritionService.API.dll"] + + diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/NutritionService.API.csproj b/Fitness/Backend/Services/NutritionService/NutritionService.API/NutritionService.API.csproj new file mode 100644 index 0000000..d4b6ecc --- /dev/null +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/NutritionService.API.csproj @@ -0,0 +1,19 @@ + + + net8.0 + enable + enable + Linux + ..\..\.. + ..\..\..\docker-compose.dcproj + + + + + + + + + + + diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Program.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Program.cs new file mode 100644 index 0000000..b372282 --- /dev/null +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Program.cs @@ -0,0 +1,23 @@ +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); +builder.Services.AddCors(o => +{ + o.AddPolicy("CorsPolicy", p => p.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()); +}); + +var app = builder.Build(); + +app.UseCors("CorsPolicy"); + +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.MapControllers(); + +app.Run(); diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/appsettings.Development.json b/Fitness/Backend/Services/NutritionService/NutritionService.API/appsettings.Development.json new file mode 100644 index 0000000..4f31530 --- /dev/null +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/appsettings.Development.json @@ -0,0 +1,16 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "ConsulConfig": { + "Address": "http://consul:8500", + "ServiceName": "NutritionService.API", + "ServiceId": "NutritionService.API-1", + "ServiceAddress": "nutritionservice.api", + "ServicePort": 8080 + } + } + \ No newline at end of file diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/appsettings.json b/Fitness/Backend/Services/NutritionService/NutritionService.API/appsettings.json new file mode 100644 index 0000000..5004041 --- /dev/null +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" + } + \ No newline at end of file diff --git a/Fitness/Backend/docker-compose.development.yml b/Fitness/Backend/docker-compose.development.yml index 3a41064..52df1c3 100644 --- a/Fitness/Backend/docker-compose.development.yml +++ b/Fitness/Backend/docker-compose.development.yml @@ -229,4 +229,18 @@ services: - ASPNETCORE_ENVIRONMENT=Development - "DatabaseSetting:ConnectionString=mongodb://videotrainingdb:27017" ports: - - "8007:8080" \ No newline at end of file + - "8007:8080" + + nutritionservice.api: + ports: + - "8157:8080" + #volumes: + # - ./Services/NutritionService/NutritionService.API:/app + environment: + - DOTNET_USE_POLLING_FILE_WATCHER=1 + - DOTNET_RUNNING_IN_CONTAINER=true + - DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false + - ASPNETCORE_ENVIRONMENT=Development + - ASPNETCORE_URLS=http://+:8080 + + diff --git a/Fitness/Backend/docker-compose.yml b/Fitness/Backend/docker-compose.yml index 5faa5d2..2ec2964 100644 --- a/Fitness/Backend/docker-compose.yml +++ b/Fitness/Backend/docker-compose.yml @@ -153,6 +153,15 @@ services: - chatdb - rabbitmq - consul + + nutritionservice.api: + image: ${DOCKER_REGISTRY-}nutritionserviceapi + build: + context: . + dockerfile: Services/NutritionService/NutritionService.API/Dockerfile + depends_on: + - consul + videotrainingservice.api: image: ${DOCKER_REGISTRY-}videotrainingserviceapi From 4222ee90d84c5720eeb74ef79a11d341e9b7b597 Mon Sep 17 00:00:00 2001 From: anjaanjaa10 Date: Sun, 28 Sep 2025 17:47:04 +0200 Subject: [PATCH 092/118] Added Food and Goals API with Mongo integration and calorie calculation --- .../Controllers/FoodController.cs | 29 +++++++++++++ .../Controllers/GoalsController.cs | 41 +++++++++++++++++++ .../NutritionService.API/Dockerfile | 3 -- .../NutritionService.API/Models/Food.cs | 13 ++++++ .../NutritionService.API/Models/UserGoal.cs | 13 ++++++ .../NutritionService.API.csproj | 5 +++ .../NutritionService.API/Program.cs | 7 ++++ .../Repositories/FoodRepository.cs | 32 +++++++++++++++ .../Repositories/IFoodRepository.cs | 13 ++++++ .../appsettings.Development.json | 12 ++++-- .../Backend/docker-compose.development.yml | 12 ++++++ Fitness/Backend/docker-compose.yml | 5 +++ 12 files changed, 179 insertions(+), 6 deletions(-) create mode 100644 Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs create mode 100644 Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs create mode 100644 Fitness/Backend/Services/NutritionService/NutritionService.API/Models/Food.cs create mode 100644 Fitness/Backend/Services/NutritionService/NutritionService.API/Models/UserGoal.cs create mode 100644 Fitness/Backend/Services/NutritionService/NutritionService.API/Repositories/FoodRepository.cs create mode 100644 Fitness/Backend/Services/NutritionService/NutritionService.API/Repositories/IFoodRepository.cs diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs new file mode 100644 index 0000000..e20eb83 --- /dev/null +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.Mvc; +using NutritionService.API.Models; +using NutritionService.API.Repositories; + +namespace NutritionService.API.Controllers +{ + [ApiController] + [Route("api/[controller]")] + public class FoodController : ControllerBase + { + private readonly IFoodRepository _repository; + + public FoodController(IFoodRepository repository) + { + _repository = repository; + } + + [HttpGet] + public async Task GetAll() => + Ok(await _repository.GetAllAsync()); + + [HttpPost] + public async Task Create(Food food) + { + await _repository.CreateAsync(food); + return CreatedAtAction(nameof(GetAll), food); + } + } +} diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs new file mode 100644 index 0000000..a944b77 --- /dev/null +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs @@ -0,0 +1,41 @@ +using Microsoft.AspNetCore.Mvc; +using NutritionService.API.Models; + +namespace NutritionService.API.Controllers +{ + [ApiController] + [Route("api/[controller]")] + public class GoalsController : ControllerBase + { + [HttpPost] + public IActionResult SetGoal([FromBody] UserGoal goal) + { + int baseline = 2000; + int adjustment = 0; + + if (goal.TargetWeight < goal.CurrentWeight) + { + adjustment = goal.Pace switch + { + "slow" => -300, + "medium" => -500, + "fast" => -700, + _ => -500 + }; + } + else if (goal.TargetWeight > goal.CurrentWeight) + { + adjustment = goal.Pace switch + { + "slow" => +200, + "medium" => +300, + "fast" => +500, + _ => +300 + }; + } + + goal.TargetKcal = baseline + adjustment; + return Ok(goal); + } + } +} diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Dockerfile b/Fitness/Backend/Services/NutritionService/NutritionService.API/Dockerfile index 90db480..11a2560 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Dockerfile +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Dockerfile @@ -10,13 +10,10 @@ COPY ["Services/NutritionService/NutritionService.API/NutritionService.API.cspro COPY ["Common/ConsulConfig.Settings/ConsulConfig.Settings.csproj", "Common/ConsulConfig.Settings/"] COPY ["Common/EventBus.Messages/EventBus.Messages.csproj", "Common/EventBus.Messages/"] -# Restore RUN dotnet restore "Services/NutritionService/NutritionService.API/NutritionService.API.csproj" -# Kopiraj ceo projekat COPY . . -# Build WORKDIR "/src/Services/NutritionService/NutritionService.API" RUN dotnet build "NutritionService.API.csproj" -c Release -o /app/build diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/Food.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/Food.cs new file mode 100644 index 0000000..4f1d820 --- /dev/null +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/Food.cs @@ -0,0 +1,13 @@ +namespace NutritionService.API.Models +{ + public class Food + { + public string? Id { get; set; } + public string Name { get; set; } + public int Calories { get; set; } + public double Protein { get; set; } + public double Carbs { get; set; } + public double Fat { get; set; } + } +} + diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/UserGoal.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/UserGoal.cs new file mode 100644 index 0000000..fa6d628 --- /dev/null +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/UserGoal.cs @@ -0,0 +1,13 @@ +namespace NutritionService.API.Models +{ + public class UserGoal + { + public string? Id { get; set; } + public string ClientId { get; set; } + public double CurrentWeight { get; set; } + public double TargetWeight { get; set; } + public string Pace { get; set; } + public int TargetKcal { get; set; } + } +} + diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/NutritionService.API.csproj b/Fitness/Backend/Services/NutritionService/NutritionService.API/NutritionService.API.csproj index d4b6ecc..c6832f9 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/NutritionService.API.csproj +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/NutritionService.API.csproj @@ -16,4 +16,9 @@ + + + + + diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Program.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Program.cs index b372282..647c121 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Program.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Program.cs @@ -1,3 +1,6 @@ +using NutritionService.API.Repositories; + + var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); @@ -8,6 +11,8 @@ o.AddPolicy("CorsPolicy", p => p.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()); }); +builder.Services.AddSingleton(); + var app = builder.Build(); app.UseCors("CorsPolicy"); @@ -21,3 +26,5 @@ app.MapControllers(); app.Run(); + + diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Repositories/FoodRepository.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Repositories/FoodRepository.cs new file mode 100644 index 0000000..9a65540 --- /dev/null +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Repositories/FoodRepository.cs @@ -0,0 +1,32 @@ +using MongoDB.Driver; +using NutritionService.API.Models; + +namespace NutritionService.API.Repositories +{ + public class FoodRepository : IFoodRepository + { + private readonly IMongoCollection _foods; + + public FoodRepository(IConfiguration config) + { + var client = new MongoClient(config.GetValue("DatabaseSettings:ConnectionString")); + var database = client.GetDatabase(config.GetValue("DatabaseSettings:DatabaseName")); + _foods = database.GetCollection("Foods"); + } + + public async Task> GetAllAsync() => + await _foods.Find(f => true).ToListAsync(); + + public async Task GetByIdAsync(string id) => + await _foods.Find(f => f.Id == id).FirstOrDefaultAsync(); + + public async Task CreateAsync(Food food) => + await _foods.InsertOneAsync(food); + + public async Task UpdateAsync(Food food) => + await _foods.ReplaceOneAsync(f => f.Id == food.Id, food); + + public async Task DeleteAsync(string id) => + await _foods.DeleteOneAsync(f => f.Id == id); + } +} diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Repositories/IFoodRepository.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Repositories/IFoodRepository.cs new file mode 100644 index 0000000..47779aa --- /dev/null +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Repositories/IFoodRepository.cs @@ -0,0 +1,13 @@ +using NutritionService.API.Models; + +namespace NutritionService.API.Repositories +{ + public interface IFoodRepository + { + Task> GetAllAsync(); + Task GetByIdAsync(string id); + Task CreateAsync(Food food); + Task UpdateAsync(Food food); + Task DeleteAsync(string id); + } +} diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/appsettings.Development.json b/Fitness/Backend/Services/NutritionService/NutritionService.API/appsettings.Development.json index 4f31530..228094a 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/appsettings.Development.json +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/appsettings.Development.json @@ -11,6 +11,12 @@ "ServiceId": "NutritionService.API-1", "ServiceAddress": "nutritionservice.api", "ServicePort": 8080 - } - } - \ No newline at end of file + }, + "DatabaseSettings": { + "ConnectionString": "mongodb://nutritiondb:27017", + "DatabaseName": "NutritionDb" + } + + +} + diff --git a/Fitness/Backend/docker-compose.development.yml b/Fitness/Backend/docker-compose.development.yml index 52df1c3..8f24ad1 100644 --- a/Fitness/Backend/docker-compose.development.yml +++ b/Fitness/Backend/docker-compose.development.yml @@ -54,6 +54,15 @@ services: - "27022:27017" volumes: - chatmongo_data:/data/db + + nutritiondb: + container_name: nutritiondb + restart: always + ports: + - "27037:27017" + volumes: + - nutritionmongo_data:/data/db + reservationdb: container_name: reservationdb @@ -242,5 +251,8 @@ services: - DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://+:8080 + depends_on: + - nutritiondb + - consul diff --git a/Fitness/Backend/docker-compose.yml b/Fitness/Backend/docker-compose.yml index 2ec2964..a5d6948 100644 --- a/Fitness/Backend/docker-compose.yml +++ b/Fitness/Backend/docker-compose.yml @@ -25,6 +25,9 @@ services: analyticsdb: image: mongo + + nutritiondb: + image: mongo rabbitmq: image: rabbitmq:3-management-alpine @@ -183,6 +186,8 @@ volumes: chatmongo_data: reservationmongo_data: videotrainingmongo_data: + nutritionmongo_data: mssql_data: mssql_volume: consul_data: + From 67a19621a38ca723aad26df015ba3d7684dff0cd Mon Sep 17 00:00:00 2001 From: anjaanjaa10 Date: Wed, 1 Oct 2025 02:26:59 +0200 Subject: [PATCH 093/118] Added Nutrition Plan sidebar items and created routes in frontend Closes #105 --- Fitness/Backend/docker-compose.development.yml | 1 + Fitness/Frontend/src/_nav.js | 12 ++++++++++++ Fitness/Frontend/src/router/index.js | 13 +++++++++++++ .../src/views/pages/ClientNutritionPlan.vue | 5 +++++ .../src/views/pages/TrainerNutritionPlan.vue | 5 +++++ 5 files changed, 36 insertions(+) create mode 100644 Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue create mode 100644 Fitness/Frontend/src/views/pages/TrainerNutritionPlan.vue diff --git a/Fitness/Backend/docker-compose.development.yml b/Fitness/Backend/docker-compose.development.yml index 8f24ad1..610dc94 100644 --- a/Fitness/Backend/docker-compose.development.yml +++ b/Fitness/Backend/docker-compose.development.yml @@ -241,6 +241,7 @@ services: - "8007:8080" nutritionservice.api: + container_name: nutritionservice.api ports: - "8157:8080" #volumes: diff --git a/Fitness/Frontend/src/_nav.js b/Fitness/Frontend/src/_nav.js index b0ae38a..8090cba 100644 --- a/Fitness/Frontend/src/_nav.js +++ b/Fitness/Frontend/src/_nav.js @@ -19,6 +19,12 @@ export function generateTrainerNav(id) { to: `/trainer/${id}/individualTrainings`, icon: 'cil-people', }, + { + component: 'CNavItem', + name: 'Nutrition Plan', + to: `/trainer/${id}/nutrition-plan`, + icon: 'cil-pencil', + }, { component: 'CNavItem', name: 'Chat', @@ -62,6 +68,12 @@ export function generateClientNav(id) { to: `/client/${id}/individualTrainings`, icon: 'cil-user-follow', }, + { + component: 'CNavItem', + name: 'Nutrition Plan', + to: `/client/${id}/nutrition-plan`, + icon: 'cil-pencil', + }, { component: 'CNavItem', name: 'Chat', diff --git a/Fitness/Frontend/src/router/index.js b/Fitness/Frontend/src/router/index.js index efef5ce..9cc7e46 100644 --- a/Fitness/Frontend/src/router/index.js +++ b/Fitness/Frontend/src/router/index.js @@ -93,6 +93,19 @@ const routes = [ name: 'Client Chat', component: () => import('@/views/pages/ClientChat.vue'), }, + + { + path: '/client/:id/nutrition-plan', + name: 'Client Nutrition Plan', + component: () => import('@/views/pages/ClientNutritionPlan.vue'), + }, + + { + path: '/trainer/:id/nutrition-plan', + name: 'Trainer Nutrition Plan', + component: () => import('@/views/pages/TrainerNutritionPlan.vue'), + }, + { path: '/client/:id/videotrainings', diff --git a/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue b/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue new file mode 100644 index 0000000..27ff729 --- /dev/null +++ b/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue @@ -0,0 +1,5 @@ + diff --git a/Fitness/Frontend/src/views/pages/TrainerNutritionPlan.vue b/Fitness/Frontend/src/views/pages/TrainerNutritionPlan.vue new file mode 100644 index 0000000..54f119f --- /dev/null +++ b/Fitness/Frontend/src/views/pages/TrainerNutritionPlan.vue @@ -0,0 +1,5 @@ + From 82c2ca592b9a5a1f613f7ae4373c6fcb34255bea Mon Sep 17 00:00:00 2001 From: anjaanjaa10 Date: Tue, 7 Oct 2025 04:33:14 +0200 Subject: [PATCH 094/118] Added NutritionService with calorie and BMI calculation + frontend integration --- .../Controllers/GoalsController.cs | 83 +++++++++---- .../NutritionService.API/Dockerfile | 2 +- .../NutritionService.API/Models/UserGoal.cs | 21 +++- .../NutritionService.API.csproj | 8 +- .../NutritionService.API/Program.cs | 8 ++ .../Backend/docker-compose.development.yml | 5 + Fitness/Frontend/package.json | 1 + .../src/views/pages/ClientNutritionPlan.vue | 116 +++++++++++++++++- 8 files changed, 210 insertions(+), 34 deletions(-) diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs index a944b77..7eba89f 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Mvc; using NutritionService.API.Models; +using MongoDB.Driver; namespace NutritionService.API.Controllers { @@ -7,35 +8,71 @@ namespace NutritionService.API.Controllers [Route("api/[controller]")] public class GoalsController : ControllerBase { + private readonly IMongoCollection _goals; + + public GoalsController(IMongoDatabase db) + { + _goals = db.GetCollection("Goals"); + } [HttpPost] - public IActionResult SetGoal([FromBody] UserGoal goal) + public async Task SetGoal([FromBody] UserGoal goal) { - int baseline = 2000; - int adjustment = 0; + // 1) BMR (Mifflin–St Jeor sa interneta formula) + int bmr = goal.Sex == "male" + ? (int)(10 * goal.CurrentWeight + 6.25 * goal.Height - 5 * goal.Age + 5) + : (int)(10 * goal.CurrentWeight + 6.25 * goal.Height - 5 * goal.Age - 161); + + // 2) Aktivnost (TDEE) + double activityFactor = goal.ActivityLevel switch + { + "sedentary" => 1.2, + "light" => 1.375, + "moderate" => 1.55, + "active" => 1.725, + "veryActive" => 1.9, + _ => 1.2 + }; + int tdee = (int)(bmr * activityFactor); - if (goal.TargetWeight < goal.CurrentWeight) + // 3) Intensity + int adjust = goal.Intensity switch { - adjustment = goal.Pace switch - { - "slow" => -300, - "medium" => -500, - "fast" => -700, - _ => -500 - }; - } - else if (goal.TargetWeight > goal.CurrentWeight) + "low" => 300, + "medium" => 500, + "high" => 700, + _ => 500 + }; + + // 4) GoalType + goal.TargetKcal = goal.GoalType switch { - adjustment = goal.Pace switch - { - "slow" => +200, - "medium" => +300, - "fast" => +500, - _ => +300 - }; - } - - goal.TargetKcal = baseline + adjustment; + "lose" => Math.Max(1200, tdee - adjust), + "gain" => tdee + adjust, + "maintain" => tdee, + _ => tdee + }; + + // 5) BMI + var h = goal.Height / 100.0; + goal.BMI = Math.Round(goal.CurrentWeight / (h * h), 2); + + await _goals.InsertOneAsync(goal); return Ok(goal); } + + [HttpGet("plan/{clientId}")] + public async Task GetPlan(string clientId) + { + var goal = await _goals + .Find(g => g.ClientId == clientId) + .SortByDescending(g => g.Id) + .FirstOrDefaultAsync(); + + if (goal == null) return NotFound("No goal found for this client."); + return Ok(goal); + } + + + } } diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Dockerfile b/Fitness/Backend/Services/NutritionService/NutritionService.API/Dockerfile index 11a2560..c84425d 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Dockerfile +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Dockerfile @@ -5,11 +5,11 @@ EXPOSE 8080 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src -# Kopiraj csproj fajlove COPY ["Services/NutritionService/NutritionService.API/NutritionService.API.csproj", "Services/NutritionService/NutritionService.API/"] COPY ["Common/ConsulConfig.Settings/ConsulConfig.Settings.csproj", "Common/ConsulConfig.Settings/"] COPY ["Common/EventBus.Messages/EventBus.Messages.csproj", "Common/EventBus.Messages/"] + RUN dotnet restore "Services/NutritionService/NutritionService.API/NutritionService.API.csproj" COPY . . diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/UserGoal.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/UserGoal.cs index fa6d628..7845a28 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/UserGoal.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/UserGoal.cs @@ -1,13 +1,28 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + namespace NutritionService.API.Models { public class UserGoal + { + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] public string? Id { get; set; } public string ClientId { get; set; } + // Podaci koje klijent unosi + public string Sex { get; set; } + public int Age { get; set; } + public double Height { get; set; } public double CurrentWeight { get; set; } - public double TargetWeight { get; set; } - public string Pace { get; set; } + public string ActivityLevel { get; set; } + public string GoalType { get; set; } + public string Intensity {get; set; } + + public int TargetKcal { get; set; } - } + public double BMI { get; set; } + +} } diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/NutritionService.API.csproj b/Fitness/Backend/Services/NutritionService/NutritionService.API/NutritionService.API.csproj index c6832f9..2bbff4c 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/NutritionService.API.csproj +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/NutritionService.API.csproj @@ -11,14 +11,12 @@ + + - - - - - + diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Program.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Program.cs index 647c121..398f7c4 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Program.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Program.cs @@ -1,8 +1,16 @@ +using MongoDB.Driver; using NutritionService.API.Repositories; var builder = WebApplication.CreateBuilder(args); +builder.Services.AddSingleton(sp => +{ + var config = builder.Configuration.GetSection("DatabaseSettings"); + var client = new MongoClient(config["ConnectionString"]); + return client.GetDatabase(config["DatabaseName"]); +}); + builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); diff --git a/Fitness/Backend/docker-compose.development.yml b/Fitness/Backend/docker-compose.development.yml index 610dc94..a532595 100644 --- a/Fitness/Backend/docker-compose.development.yml +++ b/Fitness/Backend/docker-compose.development.yml @@ -242,6 +242,9 @@ services: nutritionservice.api: container_name: nutritionservice.api + build: + context: . + dockerfile: Services/NutritionService/NutritionService.API/Dockerfile ports: - "8157:8080" #volumes: @@ -252,6 +255,8 @@ services: - DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://+:8080 + - "DatabaseSettings:ConnectionString=mongodb://nutritiondb:27017" + - "DatabaseSettings:DatabaseName=NutritionDb" depends_on: - nutritiondb - consul diff --git a/Fitness/Frontend/package.json b/Fitness/Frontend/package.json index 21a07be..93fe07d 100644 --- a/Fitness/Frontend/package.json +++ b/Fitness/Frontend/package.json @@ -34,6 +34,7 @@ "axios": "^1.4.0", "chart.js": "^4.5.0", "core-js": "^3.26.1", + "jwt-decode": "^4.0.0", "vue": "^3.2.45", "vue-chartjs": "^5.3.2", "vue-loading-overlay": "^6.0.3", diff --git a/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue b/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue index 27ff729..e6c5f88 100644 --- a/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue +++ b/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue @@ -1,5 +1,117 @@ + + + + + From 5dfa1ac8dd2b90f38901a1fd2bed7829ddec7189 Mon Sep 17 00:00:00 2001 From: anjaanjaa10 Date: Tue, 7 Oct 2025 20:24:01 +0200 Subject: [PATCH 095/118] Implemented Food and MealPlan endpoints for NutritionService (refs #107) --- .../Controllers/FoodController.cs | 29 ++++++++----- .../Controllers/MealPlansController.cs | 41 +++++++++++++++++++ .../NutritionService.API/Models/Food.cs | 7 ++++ .../NutritionService.API/Models/MealPlan.cs | 23 +++++++++++ 4 files changed, 89 insertions(+), 11 deletions(-) create mode 100644 Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs create mode 100644 Fitness/Backend/Services/NutritionService/NutritionService.API/Models/MealPlan.cs diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs index e20eb83..7993bb5 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Mvc; +using MongoDB.Driver; using NutritionService.API.Models; -using NutritionService.API.Repositories; namespace NutritionService.API.Controllers { @@ -8,22 +8,29 @@ namespace NutritionService.API.Controllers [Route("api/[controller]")] public class FoodController : ControllerBase { - private readonly IFoodRepository _repository; + private readonly IMongoCollection _foods; - public FoodController(IFoodRepository repository) + public FoodController(IMongoDatabase db) { - _repository = repository; + _foods = db.GetCollection("Food"); } - [HttpGet] - public async Task GetAll() => - Ok(await _repository.GetAllAsync()); - [HttpPost] - public async Task Create(Food food) + public async Task AddFood([FromBody] Food food) + { + if (string.IsNullOrWhiteSpace(food.Name)) + return BadRequest("Name is required"); + + await _foods.InsertOneAsync(food); + return Ok(food); + } + + [HttpGet] + public async Task GetAllFoods() { - await _repository.CreateAsync(food); - return CreatedAtAction(nameof(GetAll), food); + var foods = await _foods.Find(_ => true).ToListAsync(); + return Ok(foods); } } } + diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs new file mode 100644 index 0000000..df6a967 --- /dev/null +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs @@ -0,0 +1,41 @@ +using Microsoft.AspNetCore.Mvc; +using MongoDB.Driver; +using NutritionService.API.Models; + +namespace NutritionService.API.Controllers +{ + [ApiController] + [Route("api/[controller]")] + public class MealPlanController : ControllerBase + { + private readonly IMongoCollection _plans; + + public MealPlanController(IMongoDatabase db) + { + _plans = db.GetCollection("MealPlans"); + } + + + [HttpPost] + public async Task CreatePlan([FromBody] MealPlan plan) + { + await _plans.InsertOneAsync(plan); + return Ok(plan); + } + + + [HttpGet("{clientId}")] + public async Task GetPlan(string clientId) + { + var plan = await _plans.Find(p => p.ClientId == clientId) + .SortByDescending(p => p.CreatedAt) + .FirstOrDefaultAsync(); + + if (plan == null) + return NotFound(new { message = "Meal plan not created yet." }); + + return Ok(plan); + } + } +} + diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/Food.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/Food.cs index 4f1d820..5623e1d 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/Food.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/Food.cs @@ -1,8 +1,14 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + namespace NutritionService.API.Models { public class Food { + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] public string? Id { get; set; } + public string Name { get; set; } public int Calories { get; set; } public double Protein { get; set; } @@ -11,3 +17,4 @@ public class Food } } + diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/MealPlan.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/MealPlan.cs new file mode 100644 index 0000000..df88a62 --- /dev/null +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/MealPlan.cs @@ -0,0 +1,23 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace NutritionService.API.Models +{ + public class MealPlan + { + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string? Id { get; set; } + + public string ClientId { get; set; } + public string TrainerName { get; set; } + + public List Breakfast { get; set; } = new(); + public List Lunch { get; set; } = new(); + public List Dinner { get; set; } = new(); + public List Snacks { get; set; } = new(); + + public DateTime CreatedAt { get; set; } = DateTime.UtcNow; + } +} + From 005ec80197e17378631b93499c54369783e40064 Mon Sep 17 00:00:00 2001 From: anjaanjaa10 Date: Sun, 12 Oct 2025 12:20:32 +0200 Subject: [PATCH 096/118] Redesigned and added nutrition plan management, added frontend for trainer and client views. Closes #108 --- .../Controllers/FoodController.cs | 1 - .../Controllers/GoalsController.cs | 64 +++-- .../Controllers/MealPlansController.cs | 61 ++++- .../NutritionService.API/Models/MealPlan.cs | 17 +- .../src/views/pages/ClientNutritionPlan.vue | 229 +++++++++++------- .../src/views/pages/TrainerNutritionPlan.vue | 186 +++++++++++++- 6 files changed, 432 insertions(+), 126 deletions(-) diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs index 7993bb5..8065adf 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs @@ -33,4 +33,3 @@ public async Task GetAllFoods() } } } - diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs index 7eba89f..ca6bcc4 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Mvc; -using NutritionService.API.Models; using MongoDB.Driver; +using NutritionService.API.Models; namespace NutritionService.API.Controllers { @@ -14,48 +14,50 @@ public GoalsController(IMongoDatabase db) { _goals = db.GetCollection("Goals"); } + [HttpPost] - public async Task SetGoal([FromBody] UserGoal goal) + public async Task SetGoal([FromBody] UserGoal goal) { - // 1) BMR (Mifflin–St Jeor sa interneta formula) - int bmr = goal.Sex == "male" - ? (int)(10 * goal.CurrentWeight + 6.25 * goal.Height - 5 * goal.Age + 5) - : (int)(10 * goal.CurrentWeight + 6.25 * goal.Height - 5 * goal.Age - 161); + int bmr = + goal.Sex == "male" + ? (int)(10 * goal.CurrentWeight + 6.25 * goal.Height - 5 * goal.Age + 5) + : (int)(10 * goal.CurrentWeight + 6.25 * goal.Height - 5 * goal.Age - 161); - // 2) Aktivnost (TDEE) double activityFactor = goal.ActivityLevel switch { - "sedentary" => 1.2, - "light" => 1.375, - "moderate" => 1.55, - "active" => 1.725, + "sedentary" => 1.2, + "light" => 1.375, + "moderate" => 1.55, + "active" => 1.725, "veryActive" => 1.9, - _ => 1.2 + _ => 1.2, }; int tdee = (int)(bmr * activityFactor); - // 3) Intensity int adjust = goal.Intensity switch { - "low" => 300, + "low" => 300, "medium" => 500, - "high" => 700, - _ => 500 + "high" => 700, + _ => 500, }; - // 4) GoalType goal.TargetKcal = goal.GoalType switch { - "lose" => Math.Max(1200, tdee - adjust), - "gain" => tdee + adjust, + "lose" => Math.Max(1200, tdee - adjust), + "gain" => tdee + adjust, "maintain" => tdee, - _ => tdee + _ => tdee, }; - // 5) BMI var h = goal.Height / 100.0; goal.BMI = Math.Round(goal.CurrentWeight / (h * h), 2); + if (string.IsNullOrWhiteSpace(goal.ClientId)) + { + goal.ClientId = Guid.NewGuid().ToString(); + } + await _goals.InsertOneAsync(goal); return Ok(goal); } @@ -68,11 +70,27 @@ public async Task GetPlan(string clientId) .SortByDescending(g => g.Id) .FirstOrDefaultAsync(); - if (goal == null) return NotFound("No goal found for this client."); + if (goal == null) + return NotFound("No goal found for this client."); return Ok(goal); } + [HttpGet("all")] + public async Task GetAllGoals() + { + var allGoals = await _goals.Find(_ => true).ToListAsync(); + + if (allGoals == null || allGoals.Count == 0) + return NotFound("No goals found."); - + var simplified = allGoals.Select(g => new + { + g.ClientId, + g.BMI, + g.TargetKcal, + }); + + return Ok(simplified); + } } } diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs index df6a967..7c20ede 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs @@ -6,36 +6,75 @@ namespace NutritionService.API.Controllers { [ApiController] [Route("api/[controller]")] - public class MealPlanController : ControllerBase + public class MealPlansController : ControllerBase { private readonly IMongoCollection _plans; + private readonly IMongoCollection _foods; - public MealPlanController(IMongoDatabase db) + public MealPlansController(IMongoDatabase db) { _plans = db.GetCollection("MealPlans"); + _foods = db.GetCollection("Food"); } - [HttpPost] public async Task CreatePlan([FromBody] MealPlan plan) { + if (string.IsNullOrEmpty(plan.GoalType)) + return BadRequest(new { message = "GoalType is required." }); + + async Task> FillFoodsAsync(List foods) + { + var filled = new List(); + foreach (var f in foods) + { + var dbFood = await _foods.Find(x => x.Name == f.Name).FirstOrDefaultAsync(); + if (dbFood != null) + filled.Add(dbFood); + } + return filled; + } + + plan.Breakfast = await FillFoodsAsync(plan.Breakfast); + plan.Lunch = await FillFoodsAsync(plan.Lunch); + plan.Dinner = await FillFoodsAsync(plan.Dinner); + plan.Snacks = await FillFoodsAsync(plan.Snacks); + + plan.CreatedAt = DateTime.UtcNow; await _plans.InsertOneAsync(plan); return Ok(plan); } - - [HttpGet("{clientId}")] - public async Task GetPlan(string clientId) + [HttpGet("{goalType}")] + public async Task GetPlanByGoalType(string goalType) { - var plan = await _plans.Find(p => p.ClientId == clientId) - .SortByDescending(p => p.CreatedAt) - .FirstOrDefaultAsync(); + var plan = await _plans + .Find(p => p.GoalType == goalType) + .SortByDescending(p => p.CreatedAt) + .FirstOrDefaultAsync(); if (plan == null) - return NotFound(new { message = "Meal plan not created yet." }); + return NotFound(new { message = "No plan found for this goal type." }); return Ok(plan); } + + [HttpGet] + public async Task GetAllPlans() + { + var plans = await _plans.Find(_ => true).ToListAsync(); + return Ok(plans); + } + + [HttpDelete("{goalType}")] + public async Task DeletePlan(string goalType) + { + var result = await _plans.DeleteOneAsync(p => p.GoalType == goalType); + + if (result.DeletedCount == 0) + return NotFound(new { message = $"No plan found for goal type '{goalType}'." }); + + return Ok(new { message = $"Plan for goal type '{goalType}' deleted successfully." }); + } } } - diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/MealPlan.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/MealPlan.cs index df88a62..7acfdca 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/MealPlan.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/MealPlan.cs @@ -1,5 +1,7 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; +using NutritionService.API.Models; + namespace NutritionService.API.Models { @@ -9,15 +11,16 @@ public class MealPlan [BsonRepresentation(BsonType.ObjectId)] public string? Id { get; set; } - public string ClientId { get; set; } - public string TrainerName { get; set; } - - public List Breakfast { get; set; } = new(); - public List Lunch { get; set; } = new(); - public List Dinner { get; set; } = new(); - public List Snacks { get; set; } = new(); + public string GoalType { get; set; } + public List Breakfast { get; set; } = new(); + public List Lunch { get; set; } = new(); + public List Dinner { get; set; } = new(); + public List Snacks { get; set; } = new(); public DateTime CreatedAt { get; set; } = DateTime.UtcNow; } } + + + diff --git a/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue b/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue index e6c5f88..1b6718c 100644 --- a/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue +++ b/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue @@ -1,70 +1,117 @@ @@ -72,46 +119,64 @@ + + diff --git a/Fitness/Frontend/src/views/pages/TrainerNutritionPlan.vue b/Fitness/Frontend/src/views/pages/TrainerNutritionPlan.vue index 54f119f..def53ed 100644 --- a/Fitness/Frontend/src/views/pages/TrainerNutritionPlan.vue +++ b/Fitness/Frontend/src/views/pages/TrainerNutritionPlan.vue @@ -1,5 +1,187 @@ + + + + + From 3e9f6022d8938b12f29db4acc221e632ccaa11d3 Mon Sep 17 00:00:00 2001 From: anjaanjaa10 Date: Sun, 12 Oct 2025 19:33:39 +0200 Subject: [PATCH 097/118] Added multiplans selection by trainers per client --- .../Controllers/MealPlansController.cs | 56 ++++++-- .../NutritionService.API/Models/MealPlan.cs | 7 +- .../NutritionService.API/Models/UserGoal.cs | 25 ++-- .../src/views/pages/ClientNutritionPlan.vue | 135 ++++++++++++++---- .../src/views/pages/TrainerNutritionPlan.vue | 65 +++++---- 5 files changed, 210 insertions(+), 78 deletions(-) diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs index 7c20ede..ac1174f 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs @@ -20,6 +20,9 @@ public MealPlansController(IMongoDatabase db) [HttpPost] public async Task CreatePlan([FromBody] MealPlan plan) { + if (string.IsNullOrEmpty(plan.TrainerId) || string.IsNullOrEmpty(plan.TrainerName)) + return BadRequest(new { message = "TrainerId and TrainerName are required." }); + if (string.IsNullOrEmpty(plan.GoalType)) return BadRequest(new { message = "GoalType is required." }); @@ -39,22 +42,32 @@ async Task> FillFoodsAsync(List foods) plan.Lunch = await FillFoodsAsync(plan.Lunch); plan.Dinner = await FillFoodsAsync(plan.Dinner); plan.Snacks = await FillFoodsAsync(plan.Snacks); - plan.CreatedAt = DateTime.UtcNow; + + + var existing = await _plans + .Find(p => p.TrainerId == plan.TrainerId && p.GoalType == plan.GoalType) + .FirstOrDefaultAsync(); + + if (existing != null) + { + await _plans.DeleteOneAsync(p => p.Id == existing.Id); + } + await _plans.InsertOneAsync(plan); return Ok(plan); } - [HttpGet("{goalType}")] - public async Task GetPlanByGoalType(string goalType) + [HttpGet("trainer/{trainerId}/goal/{goalType}")] + public async Task GetPlanByTrainerAndGoal(string trainerId, string goalType) { var plan = await _plans - .Find(p => p.GoalType == goalType) + .Find(p => p.TrainerId == trainerId && p.GoalType == goalType) .SortByDescending(p => p.CreatedAt) .FirstOrDefaultAsync(); if (plan == null) - return NotFound(new { message = "No plan found for this goal type." }); + return NotFound(new { message = "No plan found for this trainer and goal type." }); return Ok(plan); } @@ -66,15 +79,38 @@ public async Task GetAllPlans() return Ok(plans); } - [HttpDelete("{goalType}")] - public async Task DeletePlan(string goalType) + [HttpGet("trainer/{trainerId}")] + public async Task GetPlansForTrainer(string trainerId) { - var result = await _plans.DeleteOneAsync(p => p.GoalType == goalType); + var trainerPlans = await _plans.Find(p => p.TrainerId == trainerId).ToListAsync(); + + if (!trainerPlans.Any()) + return NotFound(new { message = "No plans found for this trainer." }); + + return Ok(trainerPlans); + } + + [HttpDelete("trainer/{trainerId}/goal/{goalType}")] + public async Task DeletePlan(string trainerId, string goalType) + { + var result = await _plans.DeleteOneAsync(p => + p.TrainerId == trainerId && p.GoalType == goalType + ); if (result.DeletedCount == 0) - return NotFound(new { message = $"No plan found for goal type '{goalType}'." }); + return NotFound( + new + { + message = $"No plan found for trainer '{trainerId}' and goal '{goalType}'.", + } + ); - return Ok(new { message = $"Plan for goal type '{goalType}' deleted successfully." }); + return Ok( + new + { + message = $"Plan for trainer '{trainerId}' and goal '{goalType}' deleted successfully.", + } + ); } } } diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/MealPlan.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/MealPlan.cs index 7acfdca..60d1c16 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/MealPlan.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/MealPlan.cs @@ -1,7 +1,5 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -using NutritionService.API.Models; - namespace NutritionService.API.Models { @@ -11,7 +9,10 @@ public class MealPlan [BsonRepresentation(BsonType.ObjectId)] public string? Id { get; set; } - public string GoalType { get; set; } + public string TrainerId { get; set; } = string.Empty; + public string TrainerName { get; set; } = string.Empty; + public string GoalType { get; set; } = string.Empty; + public List Breakfast { get; set; } = new(); public List Lunch { get; set; } = new(); public List Dinner { get; set; } = new(); diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/UserGoal.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/UserGoal.cs index 7845a28..69aec35 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/UserGoal.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Models/UserGoal.cs @@ -4,25 +4,22 @@ namespace NutritionService.API.Models { public class UserGoal - { - [BsonId] - [BsonRepresentation(BsonType.ObjectId)] - public string? Id { get; set; } + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string? Id { get; set; } public string ClientId { get; set; } - // Podaci koje klijent unosi - public string Sex { get; set; } + + // Podaci koje klijent unosi + public string Sex { get; set; } public int Age { get; set; } - public double Height { get; set; } + public double Height { get; set; } public double CurrentWeight { get; set; } - public string ActivityLevel { get; set; } - public string GoalType { get; set; } - public string Intensity {get; set; } + public string ActivityLevel { get; set; } + public string GoalType { get; set; } + public string Intensity { get; set; } - public int TargetKcal { get; set; } public double BMI { get; set; } - + } } -} - diff --git a/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue b/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue index 1b6718c..617f10b 100644 --- a/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue +++ b/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue @@ -1,6 +1,7 @@ - - - - - diff --git a/Fitness/Frontend/src/views/pages/TrainerNutritionPlan.vue b/Fitness/Frontend/src/views/pages/TrainerNutritionPlan.vue index 18649f4..8ae7a12 100644 --- a/Fitness/Frontend/src/views/pages/TrainerNutritionPlan.vue +++ b/Fitness/Frontend/src/views/pages/TrainerNutritionPlan.vue @@ -2,7 +2,6 @@

Nutrition Plans

-

Create or Update Plan

@@ -35,7 +34,6 @@
-

Existing Plans Overview

@@ -70,7 +68,6 @@ -
Plan for: {{ selectedPlan.goalType }}
@@ -88,106 +85,149 @@
- - - - From b353263110c3e95345d9aabc232b1584cce9a514 Mon Sep 17 00:00:00 2001 From: anjaanjaa10 Date: Mon, 13 Oct 2025 23:39:20 +0200 Subject: [PATCH 101/118] refactored by moving axios logic to js for client and trainer --- .../Controllers/FoodController.cs | 2 +- .../Controllers/GoalsController.cs | 2 +- .../Controllers/HealthController.cs | 2 +- .../Controllers/MealPlansController.cs | 2 +- .../Frontend/src/services/NutritionService.js | 85 ++++++++++++ .../src/views/pages/ClientNutritionPlan.vue | 77 +++-------- .../src/views/pages/TrainerNutritionPlan.vue | 126 ++++-------------- 7 files changed, 134 insertions(+), 162 deletions(-) create mode 100644 Fitness/Frontend/src/services/NutritionService.js diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs index 8065adf..4c8f936 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/FoodController.cs @@ -5,7 +5,7 @@ namespace NutritionService.API.Controllers { [ApiController] - [Route("api/[controller]")] + [Route("api/v1/[controller]")] public class FoodController : ControllerBase { private readonly IMongoCollection _foods; diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs index ca6bcc4..6e912e8 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/GoalsController.cs @@ -5,7 +5,7 @@ namespace NutritionService.API.Controllers { [ApiController] - [Route("api/[controller]")] + [Route("api/v1/[controller]")] public class GoalsController : ControllerBase { private readonly IMongoCollection _goals; diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/HealthController.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/HealthController.cs index aa343b9..cec3124 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/HealthController.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/HealthController.cs @@ -3,7 +3,7 @@ namespace NutritionService.API.Controllers { [ApiController] - [Route("api/[controller]")] + [Route("api/v1/[controller]")] public class HealthController : ControllerBase { [HttpGet] diff --git a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs index ac1174f..b2c9610 100644 --- a/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs +++ b/Fitness/Backend/Services/NutritionService/NutritionService.API/Controllers/MealPlansController.cs @@ -5,7 +5,7 @@ namespace NutritionService.API.Controllers { [ApiController] - [Route("api/[controller]")] + [Route("api/v1/[controller]")] public class MealPlansController : ControllerBase { private readonly IMongoCollection _plans; diff --git a/Fitness/Frontend/src/services/NutritionService.js b/Fitness/Frontend/src/services/NutritionService.js new file mode 100644 index 0000000..a533b57 --- /dev/null +++ b/Fitness/Frontend/src/services/NutritionService.js @@ -0,0 +1,85 @@ +import axios from "axios"; + +const BASE_URL = "http://localhost:8157/api/v1"; + + +export async function getAllFoods() { + try { + const res = await axios.get(`${BASE_URL}/food`); + return res.data; + } catch (err) { + console.error("Error fetching foods:", err); + throw err; + } +} + + +//trener + +export async function getMealPlansForTrainer(trainerId) { + try { + const res = await axios.get(`${BASE_URL}/mealplans/trainer/${trainerId}`); + return res.data || []; + } catch (err) { + console.error("Error fetching trainer meal plans:", err); + throw err; + } +} + +export async function saveMealPlan(plan) { + try { + const res = await axios.post(`${BASE_URL}/mealplans`, plan); + return res.data; + } catch (err) { + console.error("Error saving meal plan:", err); + throw err; + } +} + +export async function deleteMealPlan(trainerId, goalType) { + try { + const res = await axios.delete(`${BASE_URL}/MealPlans/trainer/${trainerId}/goal/${goalType}`); + return res.data; + } catch (err) { + console.error("Error deleting meal plan:", err); + throw err; + } +} + +//klijent + +export async function loadTrainers() { + try { + const res = await axios.get(`${BASE_URL}/mealplans`); + const seen = new Map(); + for (const p of res.data) { + if (!seen.has(p.trainerId)) { + seen.set(p.trainerId, { id: p.trainerId, name: p.trainerName }); + } + } + return Array.from(seen.values()); + } catch (err) { + console.error("Error loading trainers:", err); + throw err; + } +} + +export async function calculateGoal(goal) { + try { + const res = await axios.post(`${BASE_URL}/goals`, goal); + return res.data; + } catch (error) { + console.error("Error calculating goal:", error); + throw error; + } +} + +export async function fetchPlan(trainerId, goalType) { + try { + const res = await axios.get(`${BASE_URL}/MealPlans/trainer/${trainerId}/goal/${goalType}`); + return res.data; + } catch (error) { + console.error("Error fetching plan:", error); + throw error; + } +} diff --git a/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue b/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue index ef6abb2..8677273 100644 --- a/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue +++ b/Fitness/Frontend/src/views/pages/ClientNutritionPlan.vue @@ -157,7 +157,11 @@ + diff --git a/Fitness/Frontend/src/views/pages/VideoTrainingsTrainer.vue b/Fitness/Frontend/src/views/pages/VideoTrainingsTrainer.vue index d54ad5f..19597e9 100644 --- a/Fitness/Frontend/src/views/pages/VideoTrainingsTrainer.vue +++ b/Fitness/Frontend/src/views/pages/VideoTrainingsTrainer.vue @@ -17,7 +17,7 @@

- {{ index + 1 }}.{{ getExerciseName(exercise.exerciseId) }} - {{ exercise.exerciseReps }} ponavljanja, {{ exercise.setReps }} setova + {{ index + 1 }}.{{ getExerciseName(exercise.exerciseId) }} - {{ exercise.exerciseReps }} ponavljanja, {{ exercise.setReps }} {{ exercise.setReps < 5 ? 'seta ' : 'setova'}}
- {{ getExerciseName(exercise.selectedExercise) }} - {{ exercise.reps }} ponavljanja, {{ exercise.sets }} setova + {{ getExerciseName(exercise.selectedExercise) }} - {{ exercise.reps }} ponavljanja, {{ exercise.sets }} {{ exercise.sets < 5 ? 'seta ' : 'setova'}}
From 88d30e091389f06a9e74d140b6a7bdf1cf955e3f Mon Sep 17 00:00:00 2001 From: stemil01 Date: Mon, 13 Oct 2025 08:18:52 +0200 Subject: [PATCH 104/118] Connect the client-side analytics frontend with backend. Relates to #84. --- .../Frontend/src/services/AnalyticsService.js | 25 +- .../src/views/pages/ClientAnalytics.vue | 284 +++++++++++++----- 2 files changed, 235 insertions(+), 74 deletions(-) diff --git a/Fitness/Frontend/src/services/AnalyticsService.js b/Fitness/Frontend/src/services/AnalyticsService.js index 61c3424..14f6b07 100644 --- a/Fitness/Frontend/src/services/AnalyticsService.js +++ b/Fitness/Frontend/src/services/AnalyticsService.js @@ -1,11 +1,32 @@ import axios from "axios"; +const GATEWAY_URL = "http://localhost:8005"; +// const ANALYTICS_URL = `${GATEWAY_URL}/analytics`; + const ANALYTICS_URL = "http://localhost:8018/api/v1/Analytics"; const analyticsService = { - async getClientAnalytics(clientId) { + async getTrainerIndividualTrainings(trainerId) { + axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; + let response = await axios.get(`${ANALYTICS_URL}/individual/trainer/${trainerId}`); + return response; + }, + + async getClientIndividualTrainings(clientId) { + axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; + let response = await axios.get(`${ANALYTICS_URL}/individual/client/${clientId}`); + return response; + }, + + async getTrainerGroupTrainings(trainerId) { + axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; + let response = await axios.get(`${ANALYTICS_URL}/group/trainer/${clientId}`); + return response; + }, + + async getClientGroupTrainings(clientId) { axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; - let response = await axios.get(`${ANALYTICS_URL}/ClientTrainings?clientId=${clientId}`); + let response = await axios.get(`${ANALYTICS_URL}/group/client/${clientId}`); return response; } } diff --git a/Fitness/Frontend/src/views/pages/ClientAnalytics.vue b/Fitness/Frontend/src/views/pages/ClientAnalytics.vue index 11bcf14..d017d2d 100644 --- a/Fitness/Frontend/src/views/pages/ClientAnalytics.vue +++ b/Fitness/Frontend/src/views/pages/ClientAnalytics.vue @@ -8,19 +8,36 @@

Individual trainings


-
+
Total number of individual trainings: - {{ totalTrainings }} + {{ numberOfIndividualTrainings }}
+ Individual training status: +
+ +
+
+ +
My average rating: - {{ myAverageRating }} + {{ averageIndividualRating }}
-
+
Trainer average rating: - {{ trainerAverageRating }} + {{ trainerAverageIndividualRating }}
@@ -36,7 +53,7 @@ labels: this.months, datasets: [{ label: 'Trainings', - data: this.trainingsPerMonth, + data: individualTrainingsPerMonth, backgroundColor: '#31872e' }] }" @@ -51,10 +68,10 @@ id="trainers-worked-with" :options="{ responsive: true }" :data="{ - labels: this.trainersWorkedWith, + labels: trainerNames, datasets: [{ backgroundColor: ['#41B883', '#E46651', '#00D8FF', '#DD1B16'], - data: this.numTrainingsByTrainer + data: individualTrainingsPerTrainer }] }" /> @@ -63,20 +80,25 @@
Number of trainings per training types: -
- +
+
@@ -87,24 +109,41 @@
-
+
Total number of group trainings: - {{ totalTrainings }} + {{ numberOfGroupTrainings }}
+ Group training status: +
+ +
+
+ +
My average rating: - {{ myAverageRating }} + {{ averageMyGroupRating }}
-
+
Average group rating: - {{ trainerAverageRating }} + {{ averageGroupRating }}
-
+
Trainer average rating: - {{ trainerAverageRating }} + {{ averageTrainerGroupRating }}
@@ -120,7 +159,7 @@ labels: this.months, datasets: [{ label: 'Trainings', - data: this.trainingsPerMonth, + data: groupTrainingsPerMonth, backgroundColor: '#31872e' }] }" @@ -135,10 +174,10 @@ id="trainers-worked-with" :options="{ responsive: true }" :data="{ - labels: this.trainersWorkedWith, + labels: trainerNames, datasets: [{ backgroundColor: ['#41B883', '#E46651', '#00D8FF', '#DD1B16'], - data: this.numTrainingsByTrainer + data: groupTrainingsPerTrainer }] }" /> @@ -153,9 +192,8 @@ @@ -416,6 +548,12 @@ button:disabled { flex-direction: column; } +.num-stat { + width: 100%; + display: flex; + flex-direction: row; +} + .label { font-weight: bold; } @@ -423,6 +561,8 @@ button:disabled { .value { font-size: 1.2rem; color: #333; + margin-top: -2px; + margin-left: 5px; } .histogram { From 3bc44f7670b9e2e55cf341a92d48e8f1a9be1d19 Mon Sep 17 00:00:00 2001 From: stemil01 Date: Mon, 13 Oct 2025 11:24:50 +0200 Subject: [PATCH 105/118] Connect the trainer-side analytics frontend with backend. Relates to #84. --- .../Frontend/src/services/AnalyticsService.js | 2 +- .../src/views/pages/ClientAnalytics.vue | 4 +- .../src/views/pages/TrainerAnalytics.vue | 373 ++++++++++++++---- 3 files changed, 293 insertions(+), 86 deletions(-) diff --git a/Fitness/Frontend/src/services/AnalyticsService.js b/Fitness/Frontend/src/services/AnalyticsService.js index 14f6b07..3a4ecf8 100644 --- a/Fitness/Frontend/src/services/AnalyticsService.js +++ b/Fitness/Frontend/src/services/AnalyticsService.js @@ -20,7 +20,7 @@ const analyticsService = { async getTrainerGroupTrainings(trainerId) { axios.defaults.headers.common = { 'Authorization': `Bearer ${sessionStorage.getItem('accessToken')}` }; - let response = await axios.get(`${ANALYTICS_URL}/group/trainer/${clientId}`); + let response = await axios.get(`${ANALYTICS_URL}/group/trainer/${trainerId}`); return response; }, diff --git a/Fitness/Frontend/src/views/pages/ClientAnalytics.vue b/Fitness/Frontend/src/views/pages/ClientAnalytics.vue index d017d2d..41554f2 100644 --- a/Fitness/Frontend/src/views/pages/ClientAnalytics.vue +++ b/Fitness/Frontend/src/views/pages/ClientAnalytics.vue @@ -1,5 +1,5 @@

DGA=^>tx^oow9U;5 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

$rV*ug=Zzndvgh zBkbD6+`amyPT_M~ZNUoqPJkLB6I-qg&5Hgbn%tFeZyPxE!$YJbep*ko^EN4osHZkko zcY6zCOeEN75eq_8?`k&ub+z%VW~sfLWI;lDYp1qhE+#Y=h*~jq#|7s(&Cyx}FgOtf z1}o<%;5zG0JJoZ7I9>Q!>e?BggDjOan@NWQV3m3^gK&x;=Nk;x&IOTBHj|Erz5Vwo zC>CTZHi9Ew`c%*M;ax_8@dl=dOyN?T=sYiMEzNAvsY3N1)^-V})1*)~zle-HS8sQ^THSsLzkCiBld8t$h~M0Gr>xR<)agpvPgL>lh$V{s!@ zW5se1&Eh09xTP6JP}FihNbcMtL-%l!#f_*Nj@ElWh7e6 z+UK7utLms_osNyb`(y?o)aLhczVHWbXHjx$ap;aRg|=yl2?~a8Of0aSfD&CnXUUwa z?8sE!@AJH?QZq!!|HXpBCK9xov6VW@-DPg??{A|3zIq&OMSKzt2E4!TgE^E_YmbWohXKe`6SuKQz8mg&g8ZB*-!Kx`$^VtXId6PPD zChIU`bw<&R^BnEQ8Bl1O$d7H$&qv6sl5=JKH#0|TJ!0x4QzM{rr{P{LXYkW4i}>(C z4t}bD=w_9@(*Nh!a*7)F^V~mdtl^(g+tF`4?}fG~s`@`4S$yrX_7LyVybbTwyw|pV z$s8WZIAoDG^KAoSKeRgjk%McBZM(MYXv2CpxwHP6)9=< zg>90svHkPIx<;c7087-tvx|W;BI}W`*LvXtws=3zCYLA8W|4JxcvPL%tjIrveKQdB z)B{0S0^K43yTpgTt1rO!R+9HQ~7=t-|Z9`?H z>Fh~!v{s=7s?WnTwWG>O&YR{So!WSM^v&9lfdJ+Q{Avx8f{|<`#E9F(n1HkvU2@rr zqq_bdBDzNZg)(chPNUc7_*b*eBZ{4C&*#=5bL#@St_~cdU5AJ8p^Q~Wz)$PTm4ktF z&reE6=8<#*@{~?cgoB1$gxf{NMr`IzOkaZsbQAEaefg9gdxiEviF|7Hlz1BxpwHw1 z+9a)1Q_du*pP1$Rfc<3cA1dGu5X;sH_z}Qn3|>s#Y^zA`Yur!o)l)8Vcao*MC!rI9 zTZ!HskK)% zN!3?-hXZo;bk`!`l+|s}wTFsyLQ;lPvf1PT`fV*|q}*t@$G?IuVaq+r_`v2GHK0P^ znK<=X>s&@fuuA%vg@Kh*-MF5uu6MjoF6>2JDEA73;hRBh$!cjI^d@JBBcpEn)WGX} za&--R$J7m-vbE0wew!`+`f4>kl+e)S2iij4{7Z&oD4#lm2sOZ+8nKb(>CfI)-!ji^~TqQ%!@GQqP2+J3p8RaX!sy* zMEgqR=HB7R7sWMvJvi@?1~tVQt0)P0JIjGhGK@Pu19gT5qLn>U|Hgr8qX@b(21$3Q zrsdYUjpU%AT_qW9gSPq5seWvmSs_@7?GW~)xFN9I=Mk*B?)AbJ_{69LWBLv~T0Mi% zPH$;rD3ViaTXSWJ@;UMrV?kFkXVgrRmR0Nb@VV{j3D0B=O#cmJ+ZT*$ywp3YZmmhi z?w6cQL>Crr&(Q5Waal$G#;xI?7E8vLdkTaHiU>Ii$KwZA*xTXPNMyg0*F1Tw)JG<+y)GAW}+<1FFpw#2loSn2%} zqC-Y!_bptJ2ws>|=P%S#zc#Z|FC+~c7w~T;>xGRY+vagPXL8@TKlK@YWv5w+Jj%lq zvBx5`oV?-xB1-qw_zR!A7}IN7Z5mcF#7#6QWv03IxdQ3hBnL!)Bk_H6gPe_&{>cKt z&E(_I@p*M@UpmW>iPih%Rczp)L1)EHIn%6pz#0S(eZ!B@gI~l99>b^_*T^d zXSbf*5c(#E0^f?QtXtJtPxs_y0NDuX&pL{~&i8z8P~Q3Lb;v_86yYxiO3K!gGeQr5 zghkjndhvSmTi5^3KCbhKw`X-k2FiPDbZWA~dW+DnciDu#Jxr8?s0__twP1Y1Hm|Yk|6XxsqAUc#2RdnX;y-h)sBE97qUiGHKe}H|BYY;GK3`RCRPR(!ET+_3ueb^)>Bmk zIeJwbFHA0`>SVev!ep*tILGNpwFNPz1NT%Zt0>h7>Xq~B1&fQ@2_R=Q*c+kXieis9 zpoOL^{?M&E*=1xUfI0}NJfghxTu znIsh0{n1*P)fCnA;PvJQzo|!^2}hjJcaqO~ehydWa?r>Gk?AW(>>oP%8Ftq+qqeV~ znM%%BwN)nXg#7-uxtSWHzu~C$N7*YnyJwoSerj@~ZFPQTD6oK|W`0ZQUEDfD{BTuYm* z@mKOQ6_5D~s|v4u^h`%o?L2b%rks~zKlFctHL zcqn;8&;UZXFx~5+!3Za%LH9`^At@jS9w%y+Pl?qf^BvrCxf0Es<*1`DMDn)`ToR_UR-HYol$AA-ameM8D!NfQ^$ai@ zBW2Ffh2JG2myRCJh>fP(yM21<>Q)7C$;vbPuhb<<>vXIKF*Bu=_)(kXcyRVp3Z=E+ zO3;uEC&&wlmlP{(KnKHV4D zGUGI(`%}$@7x@xE!F{ca4csE;v4XnC9Y$b^eAE|>lCmaH1*LUGZaOk2mv?UGP9yg# zvYf>kABpSJ?(EUw$Cj246;97W53Q@ETjmEjmR^gSIwKf$JHiZs#cU!ZZ8?WCl-WG+5t|k&pZ87Q2SFmNlqB_1ccd9wa3BJb7n==tgZ8_0Cb%*R(jB6M8pNIUANd zgZ%7?sT>aXgy9n(mq9-;*=^5VL4UMU6{KdO?5aIc+a-M3K`5M*jzf#;`CKzbs;PnI zpp(1_gR)(_-^YJN&(_x>Nsew2Y=Eo8d4n?~6%tcrKnW}bUU8ur>Nm1Iy(%3i_b2M< zofl;aG{XG}(Ug%p>{<~6r?Vt~#w&OPvR5UAhz^$yyPF-*p$>mh>EpJ{7^qmDKd}%d z5#FqBySply_x=jrv2Qb{qdq@B1iJH}z1zDzR-o9nmDp%D%Oetz5)Y9Zh`k0;P)4QM z&pcGLRRxX^3-4@Af9bcAHWT2@SgTV5A+8cA*-ZR>aMccMz_HzZ$iCnE$^0fn*|xI6E2H0PT|!Gl#hNp$?hY2O7V^y2hLV z$&cw@MZOu+aQifP4G|qBLf04tTM6fPo{%3bG*TdZcKg_1$#DIqCZWEN8NeCDhw2|c zkJu-r6!Fb4h{AbSNrt>g_uQ+~$d^F7x)jU@wtri=n)&_{KUR9D9|XdA?X-L3&tjO{ zWvng&nHm2(onmhLdP-X2=-UB>W>XNc1*^}A_ec_L2g?d4Z673Xn%$BD1`P4YfcP76 zkCflh^ghVyeX*d;2Mg5~hFGsWPUp2fSCD=r56KRCv0=&Vf?GE` zddkS7?GG+;2BLTPyizvO;@Fp*?O#AA&TUDmE}Ig};YKilGk@8-r#bG3%vEzqmfhV; zLW?ymZ^0H?&mG1@mSZ&ScKf_k%}SX;XWjLBg)6ero12NaXru5bWZx6n@Kj3di!P6^ zUbmm2pFDkkt0?0`*Irr39p8An%Z*v?%fsWJbi4_7R&&&3=J0bh1B^Eg(h8-I_-?k! zCg=vD%z#A%Cj+6OlO4JsV!5-JFOif%1Q)5+QZd&AITVv_l`gCYvB(<`hLq_ zB0tzA54r!Rv+_5Uk$$)Y0Ht#N9IH>3kvNSL`2xz2?Cb8sC=B#|CkRVnFwVCP0cps>~^fXU;0_&rGW4Z4TCq*`T=fjpWUEZ+L zW9Jb2^v%)-hz1%)iRD$yNQchhIG2oV#cvj$2I$tCA>5E>edX|bg))&l(-TczEu=13H+HBQ6r4Bltc zK-77q6iavg(58b8L|KzirTW3)XV>J67{@Lk+*lz|ubhqVa-q5U>es*ig$eD`lYq{t zZ!Oq$9`UC2fJVI`quK1-n=WSiZ>Z3Zbc*q8Y5a+S*DQ018|?$+%LH!x?WILigNdW+ zH%dRdZzTR9+xAmQy#!L@-+jU+P|gL!H_&dJmzo;Rr1JPzE&I<*)N&@a`lVSCa_(>> z>%F>!KO%Kd~$VU$VB=9wkvs*M&{fa@ zi(;qnLZvVR1Xk-7R%W2ruaH!kD|e}pdA;iB6gKIBbR^<_eB*(dZL;%*w8I30Sp)Ok z{p7{Ap+2{Ou?Cr^EWK?Y6xcq!?RkK6wue`-^I!TIa)<0sa2}65M(eHc;=R-dc$6!Q zJf<50KXdEaSPAV>w{(-AezaVTZmWL7ZDk8W0!+^d`SX(sA1#u3LV8cXOI;cvX|QI? zJ{cp`y$VK!XX(ZIcO!xCY|8ND0SZOOBj<`bm9~7x*ch$qJdx2@1c;-!Bmv!^zI4w!JfM z;|E@UyhJhHAFQOZ_pmTX?^I0orG?HUx12?feIYI7-Ht~I(c}b@#uXHK=f1LNVQFxA z%2vZ1QMCS79ZB`pLDp*C94MhzOlmC8=MC;%`4-=w&S@S{74;)p;C*bT0NLXrw@ywg zv5&MG3OUDWEHGH9XN;NzHKoXp@8}qsXaio|nw!AuaGclRn^v@MaLYXtlrk@aPmT%7 zP4I8cBJZMvu^#h(cu}6k7Pcj?Jf_x)NFNR+wiz0HdlxgBYPR#BLj(UB?;_(1b0jH)U}4vlFz8_` zTa?jDKRz5Akv3Z@GCjvby9vVVCm-{S6SGmlkv|>HmkH}JPELiBpYGW9O6I<;9Zwc5 z4_^PqTe3he_doEmWEe%XTyVOxUeRR+*z51xnwO6< zgAn+$@KC3Vt;-&znX#!w5XZCYpEt?tTi<|>TR)W~-gt9YRqz@>V+Q}-SX>Z;DPyaZU_7XsEjsE7g8ZkC4B>&Cx zUgz7Nt%Xh=wV$n-w*+Fz{}+z{iwFHJasZ;5e;aW;NhHfTMZDK9IgN}Gp^#plOLQLJ&$UVL-ewUZ) zxkKQeL!RN7YL4+NBLpDud*t-r%U165_x@-cD10BgPS|!2KaXR!QGf6Ej+#r$15##+ zX8PTr^^H#@^KxY%A!q(xXeawGt@J)V_>aP!88z3lgI9O91D~t;PHszs|Af8n0w^Hw z^#A6)ZXoh_S}zQ|MjeBJ%^1YKWZvSRrx$;x!rxcZ1i(Rv8xf2NSj23f8pmZ4%@g`u z-uZx$@}E^-!$2rdn63ap>FVz^VaOzD{$K39cUY78x;3n0VH`k49c568N)r)KP>`0` z0Olqq9RQcq)QD=5b0eA2_h;&AfcCpB2of`5FsQGLg0NU)3!5vpR=#` zT<>?TZ~LD>^8D&u)>`-dSeZ$+Bkraio)G-Al<*DUM|6Qw;Wy1s(?r0aHG10MzDF=! z;K^2qXo32A4KMtdM~$uKD*8zBM0^+5bGQ1)ktFxrkrT!5UCBNHojV&8&Kot4xg}=K zxA5f>UDU$w6JiYCQ%rg9481{!>F0C*as0YKwK4(^1Tp>;X)4)9%`8S>Y_d5;@kr0m zSre%Q_o%1I$m>N%bK6L%2y>`+gR`2SDgV&sa40bXA`Nb}Pm?`rQ+%2xeM}F2h!LRO zkI%dDSUu58*yN8#1OFqi6~L0J=~jv}4v73XIeZFSn)9qqfn}+-uqzdaq+*Nvnje6J#gLMVEj9dcOj$PF>tq@@x5ayiwKDQ5U=@j&|9Io18 z>FTK1yfV8mjhNC971pY`y++ZN78NTN^^A5_BlW`Q;(RUut2h|%U#-OweG|>{sy-Z- zuQFp_8H>A>+($)l3I0CYOvPV%SN$ilWh4PXP#wQ+UQ@i0B|EVV%|iQV;2v$Pchc%b z*xM6jb~xy}zL62)Szji>Kd2af;d98sr!=N*%g?EGRKZ4uNx`YnC?T*2=2oSzH|C8M z9;0gOh^Y;G((OlVesfd0v7pZcA?8YUl4abXXu8HId`$#y0eTqdcJnp>`gVwK5GN$P z61{pqhP|P7#y0bPFgjJp_lCeK*CCExm`#iTebtA7U!6jwR)nS*byCOGsz9?s8f7EB zevL?{f+awSq~X|4f>7QwSbx&7>UEs;_DX>bPb`$nNJSZ0!DZ4;FD&F2W10m&V!l#~ z@A}wZ&)PWgFlxC`a1B#X&g4gtQDgJPKlOM7D~ zraTt}H3GUR*Yx7m`T#_!r7s`I;e8N{X>rl0D4yBAcP1jC_wS%PNJHFQb;Em`xxkeyY@~@l-;ZcnZHXl<|UKoX6ByssJ|iXIU~f z@~eIMiaU`lETUy||Hj7ETuwIX@K=a4Mnz6#Hn0F}aL{?rfuWsUm~piq?_3#M9FK?) z%4F&EBqaN|jSvpB=ELojqptk!2(DciYpWjFS9$U}Y&ma4>1)6^XN#_Z3E1fHklvj* zhV4qCKuvR`4{R8x<3Q2|QyVRYg|0qg_yRver@gv-Ys12l92Ocma&p;7qyr+m-d$ev z5(a;9nAcTE-2L_y%QSWM`;+FNfhv>gvZn`u&z=e!l@y>X@zJZw2-o|r9v=WI z)2I=L|Df)^wspKAL^V1wGsWh5j#eP@iheVfppLQe>_Q$5i_%jCFs_F}Cl3D5OPIn& zYWWIMM3L=<8@_?IjOEJY*O7kNlpzxI#_SJj)X;@(dwh1^)8VN>oaN3n08MTI(4p!B z!eZTu3O}eU%9sua{aNh+01|)`@?Ef=86IIj^fUC_eMDoA=Pp*zmQPd>)bTO~i}euR zt1T8huR~;?{G-dc2CxB}9%sjtVqtk^z&|i&a=^leZAEndGrto@ScwCz+1ys`pZ(Ff zPf@-N04PC~$HpuBMxL%$9QdPBpQYSt9K|Ek`7!#2u0ZbycrA#vrwLF&7;V~vfa zAlT4huEcT?%ZPC`#2JLpE-gN;7staZ7+art5cq384q%aQ1#P}|G-aEkyJH7VhKukC zA~`Rrev}$ID3vP;HUuk~eSE598H_EZ9CU~*x(>T%DqKBu)>P-BhrUAd{H&7vozKS^ z_^-ZYooUm)z*lhC_!BuU-o*V|>F$n2&aH?$NZ>lG z;=r$5OvU%V{`83uxGZe1C`0eqxVJGWV7k;-dZt2f+-bBf&}KbG6;m-ma-uqsepWCu zRDwr7RiLM*o5MQa4(G;&i!?uP$N}mu@EMJ^tC`~iLb}c4)>&lRXdzwf^T0NGFfOKt z?x6`iMzS5?6ts=pNqdiN@y~4z?TXl!n<%{nSNfS-y2oonX2h2ZDiJ7Cr4y&EXJ(sy zrN6wnYE%6g`ev9hVAI*+FWS5>L>1v%-Oy;$ZIN$tSx)Hj)=IaFZznadyXp(p(fSH&<REvn!vs-!J;XZ!Jfc`yCy^^K9#EG+) zRf9;fNuppKFuY<`b^{^p*v;dn5qtJ5>B2sC1D6k+O(7Fr5YR{&2^cxztekqRjWFTo zbFeFm4;C)Pt{R`r+Q_yq+IlR?J0Xb2c@)5=BTp0`OP3o99B-|1r;OG0r z%34pGX>tgK1ziAO_WP&?VqToThKPVOpnuwvJcFr?cAk~J|3<5dqQ4KcUe?Wgo9WiE zmf~j5(up3IsZmc+ZRRq_#dTvOQ$4O8ble-Y%1_t0zj50w2-ZEzFS+Kh8q{+UJWyu(!u+l|Gh+I${N3$N`<4OBrnFe$c^2}b|gRI$ZPO42q z_h<)k)@h+pdH>vEo%_Sp?LJ?Zs(~%rpkcpWB}NM{xQ=i+?0dL3+WFaXTl`|3jWWI@``b*_bES?(!+mUP11S&lNV-;+9UME=RS+9xz_l!9<74V@8ZjYW`oOpgasWLz+Mu1Jgziw96=f%?( zKi{JmQ}1z=v+lTORa#|?HxM(@l#SkNi=07<=y-4_iS^Iz=JEV^PI~!8NO52^!ARlka`QS0-OI{@%{=rQ~(pU#hgxr ztj*6i)^kO(iu1sy0wz!Z-Xf^|PB5vuDXP)7d$7sY(_QTvFv6@Og;9HAf}8p8M4#xN zbcnHen7sVGFc%0nd^lQE3RoKK{bZ4y=NzI6%zqLUOJTvMN5!OV?$-@92--%}biLGV zj(mHBnizsv+Z8ySBN=%NfWTzb4^Y#7-KAg8e0q5=#+jHbbdAcE>YXce;&1?Z0w1t7 zd=HuJ;d^vHad0oG3H;J7R;HCaGGQo{bex%t;|6tGNNtgX59YR=&O;sJ^PbsHrE%}S zhaVw*&r|LZZd#OlCdmW1R$|NMheSX9Of85Ri$)y6fNpO0BJH`f6ADC$QPD1(L1e*IqFeO#!@b-0|T5k$%83VFa|2%~5|lnnPj6 zgXjL#jf&7bU4!BrSf!t9@K~oQRC#ND4}g0u49Fi?Lj?p%9EBI8#dk*4>BY(gT0sw- zKSGnaIO(%Fmj~NUZqJGg75tg!Hig3gr$V{-`AvnDZp0RB_-gyoo*Dsad>`?5&Xmfv z>h5sZ)p(c7U z{j?n&Zh%qBfDUU&TXDanvwTH};rixSj{gRu0VTC(uERX!fI(DDwDX&?HqXxkAOPP) z`T$_4qx?9dW9Z)<0Q%m7by!Myk73!Z*_4;_HYYj$*=RbOBcHjmJ{Q`wFFxxac=ln^ z3->nDNSW2UnB;hS@K9=TMb}t2Vy-ES21KnM^$UETp zm3C!C@CTq{v|R}+O4P8*;d3ouBtXs4!zmlAzX<@xgyS_@EI-~@G9V_Q>6 zEt~U%V0F-h=r4mS-e5JP!(VOlyU6hno_5*5;b&}B{>2+#%IwyS7SJYT90p>rq}c7U z<4fM#avlIAj7$sSZsv-)6v|dm*)U^sNwJoBe2pjP=A#olFXYx8!Cf}O;EDzaF*l~O zD~7h`olr>3^-^HyBTlxvXg1*}D=aZQp$Ao1~l*G z2VStyKAvaW$-JctyVjIvIgDTG_KWo@69UcUu_RT$*{h&vfw>A8FVKLw^-@i|)^(s( zc9zz#eD`_n8i?mc_1@2oJLkqxsU`QLxgV}P@P(SDDo#<(P-b1dEIQCV)x-iR{?O{B zT+z+*==4z=_PCjY1PMaOP#{Q8Y51MhT6K%X8EoXD!r%%{$W5Po5@to{o9eG67mHS` zY+YK$Z@921xB{u<^VwHHLl<_Qr&YFl{F-CC0#d8-aftNiR7Al2zM;nP5E-yoOzl`k zTOb)YCE0*}M998EL5B8|fEqQiLP)i|cIwiCU<}7Tux436c~yJLHgv0?V)%Xo zHWw)I`$${!DiezeWyS#%PS<6;qKUtKW~&{*_^;;AN|tf?{1g2cfttXf>C031FDb@7 z2%S@U#ig%CAz!B4Pc+rP%+oDPfVn}b4Ro{!SeiLA1t{#9@}0C~Sy;0M(O8()mo2IA zeD!;hqBnq^p!gZ2WJHyv&Qp zv<|@aR5aYKNZ2%Hcex7JHd&WTfCtzV|1H|%Z=c0${2{pUE%(dZ^#A2GX;1 zjMyG`@aLc_$3A~~W}x)N^!eY$Pi zj~>{b(ec`@x2wB<#3kL8FhJy3`um6MYYtlP*eE3H)ZQEaN zdHNk2dcVJ7#{Tp1|FNY584Ffh$zF*-&w@-WY=$w(wn~x^d6G3X@lVW2N_PMIIy1W-Ii%6M^IayU<3ZLg;6`tiq4%j|D$&8YK z42I5+%F1Q;9v&#USIcYP;^4X1-!{5HV_m0Hze{Aq-opBff@*F^B*(W}p}sy@tTVvH zl@}v*(*|Fh5%{FcZ@AqN`{sAskO`Mx{HjmD@Sf2fOh&cRaV`n}Yy5swphN}g!`o|^ zGIy1)!&+uu3Fi0qekraMhpmU6@n5sGA1bw{M3-xKS}*TTtiA7WgT6D-duX@(Ib+ze zC;d1q%|qwmI2xbLVdh8NJ#sv}DOw2d4c{Glbf8^5yN!FL^cYjyGK1 z1a`BOcU$In_AVz zn-!ZvJUzXm>!u(Jg0<`~(OfE#+xmdl8)?IaLWT{fJKddTbvj1!EH2@qrm8tKS;=N7 z?uOABz0%Rq=>|WMPh^}Eb;!Aiq@_M`II2g8F}gO}^VPxKb;iCTQ_(;NC9D(rxH$=8 zJ9)@35!i(i?U=Vb7p_Dg71k18U%{=uf{U>1i(7ResGp<+PI+wGvm1N1Z47AY&O)P) z@3S*zXDzV&E_+E*&(*nVxn!i`SB;sUFElJDYr(S9B1^9rx_Bj&UjP(_2loq(+Z&A} zSoA^aqsnzb`Dq2A6jgbwrB&8=i0^v$;MqIp7^B*I5DdL_twgr8^_inJO! zkGc*Mva}Rjvh*(Eg)Urhr}+6>mX50}lpDne^zL08L!gr8uPYUPRxn5s0)N3(dNJDW zJo@r3Xgd4yvW$_PZ(m;5M23)F=NZQQ45n;$l6`zi#=hk$ZgJGUxEFlVpv^)kVMJ7% z9P*0b{_WGD*I_?n?4K~2Uy_XayVylee?bH-j6NieQss5{rKoAoFhbtGTBVeh?+1Og zORNmvoR)B=s0s8wM1lTq%-6Oq7jW^EOnvGpA7+BUPFZ=$UpjRx@o(Pl$2g zEKcqmLR}(xWgtI$js|dj-cc_cMs%3!j<1j-8BA-GJOztE!EN@AZr@-Ap6XFs`f+632u@7N9fNd-UZ@%~v#W zB4fJ2z5+hnQg$zgv1)`FnjD?l6C+?|IV8ko&fQ~{Qy^|Bo4oq{y;b1m%rvjA_RPF% z+O9gdwG9#cuXbp9=)x-ec2&fu_CNAAiC~*u`}uzGP{vDt7G1HsaG$qB`)+aSRf}C8 z+Kt)^wFo_b{OfsPj$6QsG*+*T6zq)ZgFbZX>`@VJsgEew{9{3zq3>xU1>F&|^AYzWc%r4(OhtmI@2!Gy5jC z(V0^MR_|^cuCRTpyV&OV`C?{ryQN}C?cOID#pz~=Rr$|^Gt7U@`NuSWe*LJ5V>t|M z!pW=VaR~23ywP{*+~Q#m@h-2*QlVG?Tih^(nE?U&uHI^o-wE!J%YQf)>T<=O%sX@R zR51FHi!HwBkJ_3@sXMQJ`2Xo*8mA??Q^Jc|awI-#Bs$=bjx`0nIaxO=Y;{|$c$ShY z)F#Dk&1@zQb;ue@CFY^kY651H#}W#3D{-IvYL;GSw_foTk|~5!sl3U&xx7-63G*}V z+KXQ(0fpMir8iPXe(*yUIuU)V2o?3H$qLkPmAs}XUSE8kl^^q@LU9eoc!EBtj?O(+ zxQzU;v__Zt$CFl~1k|xJq*WFgHGwfbUwzQngiZv9rf?iN=QF-Q<<(qhR9(m_Vv#E^ z6G-Yv%{4nyGEhRaaM;0nm9=mf`r$tQJ{Jzs%;;E)!2R_DrpMK0z5_%j33oAR*Y~=c zeyz9i4-Y?HzuYfZ9vDswpMN!U7I@YgF9EkE3rTY-V3BXht93`O!-U)L&nQ-@vCiJK z>{ETh=&WMn=5SF%`i!eAoY`{cn^WdH(;TVxNXmXxMMe5WK1WHnl+r=^gG6YCzQFBp zNe=+z_j=xDA+??_Bj7x6NIP19uA;f1FsM{I5UPt~Z=WOe>dULdl+f zJk{EVmFYBUy8N6MGC!fi1_z0qCSR*XLp#>!Ny>(mV+EDrNq)Y} zegbu{>gM8`mxO_LD@*;d2;Jqi9(7KYXVj^!@L z2Wbu~klA_qfxWqL@NgSblObERV+DhRi?>Cykp(Q>;?CBmp>0DM1}1iYR9g zKf%15(T1+mD|8hm!D&rCv*WXg(ChNqx~VtzSY2fY_z(VY{6k>7v#XJdOR3pf?)=TJ z`2o5!1+WpLl={L%h{biM;v5NXUD)`VbLGL~Z7p|+-D`tZ|1e*-hUg~7$SHcl1!B0F z*T8Cc#MF1)D+`nRqiyz{nb~z*ok#Mf2XNMZ(uTcp28$VxtY}q;$;GzYro$>+&<|W7 zx;8meHoD^0Qr%EG*_69$u0ktOi#eADK`jycQ|j9)$L#oWIpiEZ7l}g#XNVc&7keT+ zfl@PNdhcfs@@k^@T7DM}qT{d8o4|3#mfmps5ZrJH(%t7U*|#*XM0EmYkCL28;*%pT z@9rw26>2%**UHGH=%+ns{Ns)JS0asba0fu}oD+X1Afup4CRZ7Wv5|a> zoZ8%Mo@?h8sh3$7vu)P)Hj(suQw!wetL922VY6gbTNP5tmsn$iwDZ#!kvDox@W|-_ z8L6JHr`H^mC$5xL)}s`fT6ivMwoKC!;g)*27o6dy$YxliGdCLU8SP%+L>83qot8E| z)`bJ#tzH{4njs2lyQj4<3GwZdxjA{xivFP1g4` zG3%8=C#VqpD7ezf+HN)knR?mXJQ{L+(zteO#$EjG!$bjplE13+4wSF|CooQ!*t!gM zG$tE3xz5>pgN-De)}cy$RrRP^B7kZAqVKKFS3^0LV$|(WIkAAZLOJ(D1bGHHlJm7U z?zsz+-6o>aKvlEVp{w1CRav|)s`QuvzX9e= zpayMWMVhuiABlIl*yj(AxV1NwlNE5APtKrk&i9jr(ZdG&C1Y+yx)*aF9=p2uS@Wi9 z-&dss1Ma+OdW}L)4%ywa1B4_GjZp6a^Va8{w!THd=neIaB)j9Kb&h?XV~^K)NGFPP z@h4hY6*HBqdN#Iy0Q7Syv$hvo*4*n=&2B>*LF>C#57hGjy}eV-$cnTjF=$$4pM_$i zNJ>2<(bkdViEX^#B|w6IbNC9gQThis4BWGG_NYXJooOWS3|8+dr?>8{6HnNrg1E}M2{%C<7 zU>g)@<*F&i9{eYe{i9&~|7BKyU|ij5|GeW(#UCU4Nv;jdcULX{f0B^@(Twg1JuXHq zA^{MUDwB;c|DNx?xqbOBQm&lqRy>Lhwf6=W zUi%FVBN7$Pd1m#P@XwUhWYQe*MO8|_mnTRX|5Y03&}-DX{?5Jxgvd+I^gewf;ltrP zBfz!T>is5WbZhv7Y56VF)G9~+0t>#5v{XyY6D*uF@3zIA&)@ju#P2f5zy0Jph**-0 zXLe6&c z;YnJnUW5|8s>N@2s#-c2R=MY zFj&f?1~h%}hTMTWG|h7opg4j}|L~)=Uz|*=X4#3vXWDEVfVZYv3+rM zQ64!EU{R}#WHp%NGUbl15%iKN71dL&7El-uD;u0@-Bx;&aP1gw*EChD0(G)Up5~2A zAbvT$P=(4_@hi8E1G)OlFX?qy5cf{_!vnOQq!9hZJ$1zJx@NEDmWD*E<0?o-Fcg9gX1x$E^Oum{QlG%KjSPQ#^la-`;TZ7A(L zqob{s^aaT~%<)Au5S$2gP;oDz0rZwOk!cqLvFTrP$9AZeGhW|LHaxbE@N_655CUgW zw7Rk6hgD(q7PjPK#Y=}{;ipkWZOX&-Xp%0m-(x}0zYhP9s^#Q6U^&z<8%#W!J5+=5 z%SK{3^-#UI;yFf@a@oFHT(lWi0l!QWtB#_csFyvdfMDU71MS6GXCt${zo8U}5$-ed zK_jNnOUI9%GVW=*_Q3x@x7z%NytIcg`#&5^yNqHv1)^0_y?0qG6ZmoM!VX68_# zT@|Gw&CgVcpY5pOccnwS3$!orpAsj!UVf$Qn%_r!oK=t0{5x8l_ZXf!rc2O;ghw2_I7EB@rm4=d;6-Q z61neDtLOOyM^(zHiDO9hnZRc3%B(^=9g`G~I_nLpM;537yJ~hoASAi%91v`RKF-f` z*6gyT*8%Sn;^V`pjg4^^ibDg&tepf5?4d3L9`D|zP0|}5lo#2UcnZ9e7IAn{ajP7( z^xdFKUqjVgg;Zw@w6x_h;d(K6$eZjNj6y9EJN6db8~yyMDs6D(yk9wPC~pi}KCmM~ zUh)~%wr!HT-6vgq2rZp73ooblOIpAq$PdStC;BS=*X~Ey4+hT=sSl88-Hbc8zIucF zU9?gmV-(S5X?3OsC5up1Kn?F`@*2_(xL0iI-{NFFvv?#W8J_`c5Dgs%PxD&Qo(U*e zB^zRiqw|`RY)!Lk-Bq#mJM*ZQJD18Q^huoAOJGR>7+9m_E;FsJ`XWIWZ`r-SYed+o ztH=2~fvr&A}sSd$N7z4 z!8;-_NJ3jcSatW_!UEbysw1~aB{Y(_heDcYC6*?H59dlfD8%v3Mbdy?!}Jd~jJ+$# z^0bLr``WZDpx3I)S|OZ!C~U5F+3;~wndL|&J7(PHu`>qbm7{Iq+~JViu`sP;e{6NS>t=S}d zCAY!QU!gO+-2noFlq;3cC#2V}iFtNV6{MkSqP;!l`SN})|JoWt)~#Li)a`p)=G|2x zedqGRE|qN>Hx@@>KSE-6n_;hEsSMOSxSw7BT+yn;plgsl^nv?<^y0=}Bx3MYs3H;W z;?Z=?;XTpH6026Xuu7go)1KMAlz@-jAh`kE5s$tP)$a-^U;F!;s?`aQ2uLkCH#dlT z23zNW3?E>QSH!J);qQXm>atTzKF(P+_>-u)(E_GsT4Y_XH{y6VhlhirD&re9Ws zCo!63m7K>4JGabb)==V&^=5G@NanN4+z)xI0t0hNtxTYaNS>z+_tAPA0b#-d+J@=KEnDOa!5U($HtpjY#e`|>^_BpLd&+O>s%_+V*i zl~BK7Afp_(CodAXLp7M3gybQw8D|wm*eLK-T}74X1NSBMwF!|eZ)7VyR8lS^9GY^&_>d zwm>$J!KWvfp;hS032*Bn?mOSq0OILS%x8fK%KnhmE>QWW#EH+`;|7%w2OYVQGF z)aHNjzN@gjBRFz`V?}h=YUM+}nB65Yf`z$Te(lTSYdQ-jUvn$+9E{U#xfT|=Dx}Xc zeot^aC`wN6v3>_cq&&Zq05GePi&mX&2@9Xu-Lgj7Jf%){ZR`=Nxnc?vF!SAc`}-~T zvZjIp2iDl@q359|+Q+X5t$!zWKsOw&D_1EsqY^j}jEWdXDGucoOConn7lpg3?SjL7+s-q%s!_FCo@gYiqjoOAj_OfI{aSe zDB_(~T(vb~WXEHG9kO8>zE10b6r1EUc&BvBUrrRz%@;s^WK|Shk}t29AF*(xIw5j9 zs=jNfkzlf#3Iuc8f|F*ime=PxvW(QW+|kXM+~O1=)weo8TZ#Rc*vR+`zzZx_^~xX7 zMAUzhnHrgV=(idA6~+~UnGfe@aA6a|&wue^i54p|e)KEkKLk)inDpOh9KdCLU`6wz zbl0T{Rk`=NF;W^H&z=Vm>M!ptK)2Dc;(`1Z=7O#+Tbihm!%_ZGpXUPI58TlW@3UIh znp>C;3WuCHu)hpcc^a}an(vx=akxFKLT~aBuDgDyH-%1$=OWml3T>o}ySlpB*KV4H zSJ?}!+aUPaSG@yhooHw2bQVCVM&( zKP`F(-91(*8z(=h0=)SP6lsgU^}+M1zb8(6dI?+8v_{}bSW@v$J(hxwo5l^m4$?~p zDO?W$Q%+>whI*}YF^f@HkCARH8wx%d(xs|TJZU@Pj3u7!Byu|?L16jfRa`a1j1-7{ z8CM?YV6T%O{MT60@EA~A9uTLz%s=9Md#LC6_iVEUfy;J$wD+MV^@^`X98HI6Dke-d zHE#=fqo$gl`K5}3qinlpE`W~YU}LiN+3x;Tl-!cwK~<5X2@f)&`Cte3qkj&O{ba2> zuzB^c6*fEGF`_N4>|>+`T7m)@nQ07;UT)^pFF9zKOi7CO!)zT*5QGc?%=pT8_&pk{ z@bP%;l=q7K>1m;<`W~T{^&KlFM^@=!z~O)6{T% zNj>qddjiqY(-Th2Sje1KuWNk-HVj+S2ieTPhTZ3PFi(;s10O?)m&b%um3-=bsyMiEyz~5RA z6oWbK((!jOLm&B+o{Dh~oSyiOXN%D-Wj_^I!aBS~DZkhXYfw`I2P=^m3w*s61bIWf z=Qv7(0-0AsdioCRpXJJ5U%ho~GdXrDy!V};*3Il0oX&2Q2{M9RoZcGggA(q`|8v^7 zg(xs%rr@0Pg!P6&@+LdIXf?dvITyLjdY>nW<176X9|ulr{2~~)dVRPlEV@SPgqx5-~#^s&ymv>11a|s+1Mdhi_$l<2KAo(g7~~Ry-?g_d$W7 zz)h|h-UI(31PMC0O?M~J4wFs!Og67a`wPR!eH(zpe*sniVtYZ&d__PlezfbGeC%)W zkAH?LH0@#kD@y!dB;nkr0J^{N}JmvLE>?ZNmSK&9V&M&f;HD1JXC6o$`$YpRM`T z2fUJzZcA0OU} z+UD*WnJ*4VBL=#!-YD*BC3571Ae3*((d{++boIIK@X_)L?(_lgcn@zohd3VYNcC6y z26FmmCpzG{re+Fjd9{e$DS7_TnJpUBTOrvGHlNL zfEERxoM!ER9~R*UO_J6b>IT(Ex0fVvVrIg!KiUpi9~JP97GNFxRrc~vAFRoh9#U{k zMY@fnAY|7HE{AfYgl&bKttztfM;B54P&v}|URTRVgav|of2SG=_^+_(%JmIi5Wiy7|x@7NLAm(E>Ns_tx;gX8)`Tlx+iuAF!$-JwwF z*_{x+m)Rz5m&B0M`uW9WKc^jFtp_h`kBM+S>DYuH41oHGJ6{@#lIbGgGU|80>-{8t zRlxr(hzeLc?gaizT=M%upW2`eu>7}+MX!74J-V%4LiYKpj6P# zSzZ7-mqqU<*Hf<+g3GOdrwIR-o{}pBe%IjRog`5^W*r;z`8p?B?wB#xq3;@Pt~-|u z&#HYz)2T)c%=zBisN_pidp3hr<(~7543z5<&hmqIQg@`$d7xxz{kMKN|HK$?F5-n6 zFy^OoyH;JK-|+=-jSxuJ<8UIzgPy?@Crq{Xb5MpvpLJzzIO$Bx8})-+rSpgIFrwNr zNUKbUz*$w@kJ|Op``@u&r^RDpr}_R3BU|J6WUj6wt+>C5c_*=^xx4|FK{P;X`A^-=Wm!RBL0A%_-@mGI? z#sB{4&4Nvsj}pbN`(}NV3yvA60p9i%=F5}rjVPh)cX0V{F5D*Xpb$v^!9X;}r9uI7 z)k4;&V)NN*|LWN)%qI-1^n z?fJG8Q}U0RKY-nn{oI~$sW0n43c-IvZV8ZcVe;wm?*H;)n^=w3{M5E- zlT<9|TIHJ~-Tz-0DZcXWqg2u)dwim9-Rb12f&~9!cj87R=CqMSLQgMqUb7dIBYMPi z!vCF#x9(%+f!XphXK%zioT2|ni1SgZQA-YY0%rLu%A_xU;Zs1a)}H(GWL`qI8zpZ; zUPK1^+(k(ede4Psg@{{c++@(V#mXv%6iG=OHQlNafa|Py7H~Hu*F(a#UCxTs#C2SsW)aQ zjyEDT{g~DDfhiDg|Gmb{WmG2n@LSaaFe^KEHFM-tVi$Yu7$*@(mVj*!f>X z^Pbc_nlDz3%LaLbq>sV}q%HvE^e+eVIc$LU0wXo70+v(}5&q|=^zXIH6*4ZRx^j=9 z)(cK;@pMx!RN(s^rc5}0aY-s#;BLldD*X4E%}_vtKJxokj{R?}=v|a9Zqbe%VbD8= zu#xLcu5>u36Htih?DOy@^7*qWhvGieZH;>GDjt}n{|(VKj!M>jNe_K)mzD=N-dNEl zpmimZnZUMWyy0uDj!YPuOSLAMmn5%6pBAXjO6uO@Kjz8Pv2w84k5=XQ*jxF7Gp2%~ zrC7cs+TW{H$YqRBHXWXWdszr!gs9)q*K$FTouc|FYqo{C?KPQdOml5pdfUgqpbrty zwbg)U)yJwinM%$i>o3_BwPfC7X<6sGAl>C&bN7u8tt zr~6-`Q_x*~`b~o%@BlHrZu$rj2_?(CX9l>|)mKuZ6D`GEmzI`OI;YHet|KV3xS#tP zqJ3C3#PPL^Ei~CWPV1P$bybPpNuZO+X8&@uWcWv}Xuc*Xy_RK_%|O#h#j|#7E*|J% z{nE6GXox-9J8zxwO@;*Q)h}F41jl<*~6 z7f2nVC*M3)qC)tANPu3@a{^CPCeA4~^^(r}D@FU#tVh#C?Ll|=M3;Db7E=xvjI899 zeFbVmjkJAWo$!+~KiwlmnH~!TsiCyrBg88us8a+@8 z;I0+|clBsbjf|9k>l3Iegz4&z)>vmHiOCSvim5sFiDX4$REd-#@%?=OmV_+TG}Lq| z*S{p4DB4vmv1G7?V4WVlT`POB-sg%Y8(H!4)?U@@dpX4dve*J?6i~7G8#Pv(EM?qj zwMLd&o=adYGRHN2mnW2Iwo1^Bs86skZ%Lsu(@^)vfr7MfHhJb=5l9%4t45!2chST-&s`RpXh?zFiXD(Uh8R1_%e+FRCX#2Io6b6CHNb+P zXW+;?$YxTYb2p0E{|epZnZrv^CCcW4<-qpxM~et|u!;>;hKj^+rD^gJmN}M@H!Y7| zf@YlAxFOHRS5v3e2g+`(Fpc^J+89|yy<90{QOb66OAjuUqwOY}NZ+qVym3x%SS%1B zMB3u)bLvGg7Zh{v68Dx5*`Uj~SlfJZYk9ft^?;BN<)J}x$LpO;ovozKbO7mKnpkq2 z@epVrw^>2gvf&lx5@=sD1y`?7U>!R3T$n^ag1N^A%e~kg^vFzPrPI~wrwjb;Wm4{~ zwVCXDmmZ0+K&KOGKWm)gKBxNHMc;Nd{3r6Gm;Sd_z9?o_;0CRa;n)e<4VMd4xyu2O zI^Mi6#k0f3RggA(I-wdo0D8VQJGU|fiY+kOIMUAz1Rl;R9BL^&t4|`gfs70ip)#J5 zt)IYj29-n{yJ2Z{x5~xy!9eFL#Ga$@BKi~^a<6~nD9wNA#bZjLwFL>cQrfm?58*Jt z$Xy(+!k0$kle|*e=5-5^RTj1*-Bsf$h*@cQ=i;ZbecZqz(^6b#%ovL8+lDA*ExirH zFEfFBgnH`hyfpT>5^HMZO+Vr4XBtBe$%LpnGE1kFI%mzNSG5b&tMX^Bf_wi5iN=lH z7+{~DV)vV@E=ZLcZvLR|Gn#I`f6(^3?)4?Vup#qOoHuc=scgkcrb@HZj4PiwW8Jdkhse)w zMdww~lJ+*C+gDYS&Jaoj_P7%)v*(G9kwxI9oEdX@5Ph|EzLW{6xYr1Y_g_uob4^Cw zdt>eg9MrbIclnN_9|&grS`Ul)g==` z7}yF5&kT?5{t#bNQd%8T+wLa$%e%5^+*=uNz(iH`rE=h2U@AzhZjteY)kCYE4$egY z3Vx|StcC9V{}9(GdeJ zDguJZJnA5%jDYo58aY^z*IHVMSDRrRNCf>mU?c}Y?X5OlgTtpj~s>if`accI$r#}2oawR*i zbTXxA1D82vBmk!HlQ>eJ-{E}wr1_cdM9;k#Gj6SEsD~u)JN7-ufCZizW)xm^=89TP zsCqBACVY5KZ#tZE1G~p&xKz7Mb1yQ5(d(vLP54M^sgQTJbToxDuL+abDaOsDU2eX} z!W^bn40<4axHC{!br5{0hH#yt>q@VA-7=e;gN5LlT@)$v0h&IrYJ3=k-;40Xf6#yo zem-oU%UMf&xPQ6|Qec*g_dV@-&j6k^Ml~**J=7q7Z5l_fEhiSNtoAf4&^(iU@!k)O zCj-n}!J}(A*dbCNBpEeSC!0KsP@7aF=GqaLRhc9)I3XW;CRR31L2f*Orv9=XF2*_s zw`BRKK-;J7wd2)=SaQ()`AZFT(@FS|G@E33geX<+wPDUcjdZm9NDekggKuM()M2jx zz1jbLj?n6*lyQ48pm#rH*{;CdsQl*D1@2BpVDFU3W&xnA;d091lw&bvmuh?- zK%+bpF26%l)7=gV^4D1@nFYU}Xe+yFCy^(7xpTs7lUXr$65F?5JR^G;=r%3)hT4dB z67eLeg&aKoH@KJii927i@#_Fjo3T--Sh^EyGQ3^>xJ5S#Iu_*4hcw24;_C6u{PcGn z;Z`Q?&W#xqes}zrxb}?##k->^6Uy7gj9X#Qejp5r?!OMS3R!Z?6rvu|N*up_-Um@b z$l%{B3IzlUvQ`4BT?SVw4~b1%N8QUudG~z7$^L!r{?9Vv|L``yOLzYkqx`3; z*S`TK|96mVw#MgS&u1?JJveb}n>43_Q`l2H^!ZcMf;I>(`yTV(IcBt2_3tYJ$ zRQ~2RepB1~M