From f48663006ae43b05bf91d66140810cf0c99c9159 Mon Sep 17 00:00:00 2001 From: VladislavRkm Date: Sat, 6 Jul 2024 20:51:24 +0300 Subject: [PATCH 01/14] -let's go --- .gitignore | 17 +++++ backend/CargoDelivery.API/.dockerignore | 30 ++++++++ .../CargoDelivery.API.csproj | 32 ++++++++ .../CargoDelivery.API.csproj.user | 9 +++ .../CargoDelivery.API/CargoDelivery.API.http | 6 ++ backend/CargoDelivery.API/CargoDelivery.sln | 47 ++++++++++++ .../Contracts/OrderRequest.cs | 11 +++ .../Contracts/OrderResponse.cs | 13 ++++ .../Controllers/OrdersController.cs | 57 ++++++++++++++ backend/CargoDelivery.API/Dockerfile | 29 +++++++ backend/CargoDelivery.API/Program.cs | 44 +++++++++++ .../Properties/launchSettings.json | 52 +++++++++++++ .../appsettings.Development.json | 8 ++ backend/CargoDelivery.API/appsettings.json | 11 +++ backend/CargoDelivery.API/docker-compose.yml | 16 ++++ .../CargoDelivery.Application.csproj | 13 ++++ .../Services/OrderService.cs | 30 ++++++++ .../Abstractions/IOrderRepository.cs | 12 +++ .../Abstractions/IOrderService.cs | 12 +++ .../CargoDelivery.Core.csproj | 14 ++++ backend/CargoDelivery.Core/Models/Order.cs | 76 +++++++++++++++++++ .../CargoDelivery.DataAccess.csproj | 26 +++++++ .../Configurations/OrderConfiguration.cs | 22 ++++++ .../DatabaseContext.cs | 14 ++++ .../Entities/OrderEntity.cs | 25 ++++++ .../20240706000137_init.Designer.cs | 67 ++++++++++++++++ .../Migrations/20240706000137_init.cs | 40 ++++++++++ .../DatabaseContextModelSnapshot.cs | 64 ++++++++++++++++ .../Repositories/OrderRepository.cs | 62 +++++++++++++++ .../obj/.EntityFrameworkCore.targets | 28 +++++++ 30 files changed, 887 insertions(+) create mode 100644 .gitignore create mode 100644 backend/CargoDelivery.API/.dockerignore create mode 100644 backend/CargoDelivery.API/CargoDelivery.API.csproj create mode 100644 backend/CargoDelivery.API/CargoDelivery.API.csproj.user create mode 100644 backend/CargoDelivery.API/CargoDelivery.API.http create mode 100644 backend/CargoDelivery.API/CargoDelivery.sln create mode 100644 backend/CargoDelivery.API/Contracts/OrderRequest.cs create mode 100644 backend/CargoDelivery.API/Contracts/OrderResponse.cs create mode 100644 backend/CargoDelivery.API/Controllers/OrdersController.cs create mode 100644 backend/CargoDelivery.API/Dockerfile create mode 100644 backend/CargoDelivery.API/Program.cs create mode 100644 backend/CargoDelivery.API/Properties/launchSettings.json create mode 100644 backend/CargoDelivery.API/appsettings.Development.json create mode 100644 backend/CargoDelivery.API/appsettings.json create mode 100644 backend/CargoDelivery.API/docker-compose.yml create mode 100644 backend/CargoDelivery.Application/CargoDelivery.Application.csproj create mode 100644 backend/CargoDelivery.Application/Services/OrderService.cs create mode 100644 backend/CargoDelivery.Core/Abstractions/IOrderRepository.cs create mode 100644 backend/CargoDelivery.Core/Abstractions/IOrderService.cs create mode 100644 backend/CargoDelivery.Core/CargoDelivery.Core.csproj create mode 100644 backend/CargoDelivery.Core/Models/Order.cs create mode 100644 backend/CargoDelivery.DataAccess/CargoDelivery.DataAccess.csproj create mode 100644 backend/CargoDelivery.DataAccess/Configurations/OrderConfiguration.cs create mode 100644 backend/CargoDelivery.DataAccess/DatabaseContext.cs create mode 100644 backend/CargoDelivery.DataAccess/Entities/OrderEntity.cs create mode 100644 backend/CargoDelivery.DataAccess/Migrations/20240706000137_init.Designer.cs create mode 100644 backend/CargoDelivery.DataAccess/Migrations/20240706000137_init.cs create mode 100644 backend/CargoDelivery.DataAccess/Migrations/DatabaseContextModelSnapshot.cs create mode 100644 backend/CargoDelivery.DataAccess/Repositories/OrderRepository.cs create mode 100644 backend/CargoDelivry.DataAccess/obj/.EntityFrameworkCore.targets diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2fbaa8d --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +################################################################################ +# Данный GITIGNORE-файл был автоматически создан Microsoft(R) Visual Studio. +################################################################################ + +/.vs/TestTaskForVersta/FileContentIndex +/.vs +/backend/CargoDelivery.API/bin/Debug/net8.0 +/backend/CargoDelivery.API/.vs +/backend/CargoDelivery.API/obj +/backend/CargoDelivery.Application/bin/Debug/net8.0 +/backend/CargoDelivery.Application/obj +/backend/CargoDelivery.Core/bin/Debug/net8.0 +/backend/CargoDelivery.Core/obj +/backend/CargoDelivery.DataAccess/bin/Debug/net8.0 +/backend/CargoDelivery.DataAccess/obj +/frontend/node_modules +/frontend diff --git a/backend/CargoDelivery.API/.dockerignore b/backend/CargoDelivery.API/.dockerignore new file mode 100644 index 0000000..fe1152b --- /dev/null +++ b/backend/CargoDelivery.API/.dockerignore @@ -0,0 +1,30 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md +!**/.gitignore +!.git/HEAD +!.git/config +!.git/packed-refs +!.git/refs/heads/** \ No newline at end of file diff --git a/backend/CargoDelivery.API/CargoDelivery.API.csproj b/backend/CargoDelivery.API/CargoDelivery.API.csproj new file mode 100644 index 0000000..9453d09 --- /dev/null +++ b/backend/CargoDelivery.API/CargoDelivery.API.csproj @@ -0,0 +1,32 @@ + + + + net8.0 + enable + enable + 70e9f40d-985e-4d30-b9f2-959dabf4dc9c + Linux + . + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + diff --git a/backend/CargoDelivery.API/CargoDelivery.API.csproj.user b/backend/CargoDelivery.API/CargoDelivery.API.csproj.user new file mode 100644 index 0000000..983ecfc --- /dev/null +++ b/backend/CargoDelivery.API/CargoDelivery.API.csproj.user @@ -0,0 +1,9 @@ + + + + http + + + ProjectDebugger + + \ No newline at end of file diff --git a/backend/CargoDelivery.API/CargoDelivery.API.http b/backend/CargoDelivery.API/CargoDelivery.API.http new file mode 100644 index 0000000..19fa1dd --- /dev/null +++ b/backend/CargoDelivery.API/CargoDelivery.API.http @@ -0,0 +1,6 @@ +@CargoDelivery.API_HostAddress = http://localhost:5298 + +GET {{CargoDelivery.API_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/backend/CargoDelivery.API/CargoDelivery.sln b/backend/CargoDelivery.API/CargoDelivery.sln new file mode 100644 index 0000000..ead9f5c --- /dev/null +++ b/backend/CargoDelivery.API/CargoDelivery.sln @@ -0,0 +1,47 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.10.35013.160 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CargoDelivery.API", "CargoDelivery.API.csproj", "{539CE379-B35B-41B7-A20A-F581CEEDE422}" + ProjectSection(ProjectDependencies) = postProject + {60CC839E-94A5-4F41-88C8-EACFED9FC89D} = {60CC839E-94A5-4F41-88C8-EACFED9FC89D} + {D9E9F7C0-6649-4DF0-B236-57748F306AC9} = {D9E9F7C0-6649-4DF0-B236-57748F306AC9} + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CargoDelivery.Core", "..\CargoDelivery.Core\CargoDelivery.Core.csproj", "{AB950833-2C0F-4E3C-AA4B-B57F44C631BD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CargoDelivery.DataAccess", "..\CargoDelivery.DataAccess\CargoDelivery.DataAccess.csproj", "{D9E9F7C0-6649-4DF0-B236-57748F306AC9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CargoDelivery.Application", "..\CargoDelivery.Application\CargoDelivery.Application.csproj", "{60CC839E-94A5-4F41-88C8-EACFED9FC89D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {539CE379-B35B-41B7-A20A-F581CEEDE422}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {539CE379-B35B-41B7-A20A-F581CEEDE422}.Debug|Any CPU.Build.0 = Debug|Any CPU + {539CE379-B35B-41B7-A20A-F581CEEDE422}.Release|Any CPU.ActiveCfg = Release|Any CPU + {539CE379-B35B-41B7-A20A-F581CEEDE422}.Release|Any CPU.Build.0 = Release|Any CPU + {AB950833-2C0F-4E3C-AA4B-B57F44C631BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB950833-2C0F-4E3C-AA4B-B57F44C631BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB950833-2C0F-4E3C-AA4B-B57F44C631BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB950833-2C0F-4E3C-AA4B-B57F44C631BD}.Release|Any CPU.Build.0 = Release|Any CPU + {D9E9F7C0-6649-4DF0-B236-57748F306AC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D9E9F7C0-6649-4DF0-B236-57748F306AC9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9E9F7C0-6649-4DF0-B236-57748F306AC9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D9E9F7C0-6649-4DF0-B236-57748F306AC9}.Release|Any CPU.Build.0 = Release|Any CPU + {60CC839E-94A5-4F41-88C8-EACFED9FC89D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60CC839E-94A5-4F41-88C8-EACFED9FC89D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60CC839E-94A5-4F41-88C8-EACFED9FC89D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60CC839E-94A5-4F41-88C8-EACFED9FC89D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {BC1836CA-DD1B-40EF-8EFC-4F4B3101097D} + EndGlobalSection +EndGlobal diff --git a/backend/CargoDelivery.API/Contracts/OrderRequest.cs b/backend/CargoDelivery.API/Contracts/OrderRequest.cs new file mode 100644 index 0000000..4d7f8c4 --- /dev/null +++ b/backend/CargoDelivery.API/Contracts/OrderRequest.cs @@ -0,0 +1,11 @@ +namespace CargoDelivery.API.Contracts; +public record OrderRequest + ( + string SenderCity, + string SenderAddress, + string RecipientCity, + string RecipientAddress, + float Weight, + DateTime PickUpDate + ); + diff --git a/backend/CargoDelivery.API/Contracts/OrderResponse.cs b/backend/CargoDelivery.API/Contracts/OrderResponse.cs new file mode 100644 index 0000000..063c1c3 --- /dev/null +++ b/backend/CargoDelivery.API/Contracts/OrderResponse.cs @@ -0,0 +1,13 @@ +namespace CargoDelivery.API.Contracts; + +public record OrderResponse( + Guid id, + string OrderNumber, + string SenderCity, + string SenderAddress, + string RecipientCity, + string RecipientAddress, + float Weight, + DateTime PickUpDate + ); + diff --git a/backend/CargoDelivery.API/Controllers/OrdersController.cs b/backend/CargoDelivery.API/Controllers/OrdersController.cs new file mode 100644 index 0000000..5a7b6d8 --- /dev/null +++ b/backend/CargoDelivery.API/Controllers/OrdersController.cs @@ -0,0 +1,57 @@ +using CargoDelivery.API.Contracts; +using CargoDelivery.Application.Services; +using CargoDelivery.Core.Models; +using Microsoft.AspNetCore.Http.HttpResults; +using Microsoft.AspNetCore.Mvc; + +namespace CargoDelivery.API.Controllers; + +[ApiController] +[Route("[controller]")] +public class OrdersController : ControllerBase +{ + private readonly IOrderService _orderService; + + public OrdersController(IOrderService orderService) + { + _orderService = orderService; + } + [HttpGet] + public async Task>> GetOrders() + { + var orders = await _orderService.GetAllOrders(); + + var response = orders.Select(o => new OrderResponse(o.Id, o.OrderNumber, o.SenderCity, o.SenderAddress, o.RecipientCity, o.RecipientAddress, o.Weight, o.PickUpDate)); + return Ok(response); + } + [HttpPost] + public async Task> CreateOrder([FromBody] OrderRequest orderRequest) + { + var (order, error) = Order.Create( + Guid.NewGuid(), + orderRequest.SenderCity, + orderRequest.SenderAddress, + orderRequest.RecipientCity, + orderRequest.RecipientAddress, + orderRequest.Weight, + orderRequest.PickUpDate); + + if (!string.IsNullOrEmpty(error)) + { + return BadRequest(error); + } + var orderId = await _orderService.CreateOrder(order); + return Ok(orderId); + } + [HttpPut("{id:guid}")] + public async Task> UpdateOrder(Guid id, string orderNumber, [FromBody] OrderRequest orderRequest) + { + var orderId = await _orderService.UpdateOrder(id, orderRequest.SenderCity, orderRequest.SenderAddress, orderRequest.RecipientCity, orderRequest.RecipientAddress, orderRequest.Weight, orderRequest.PickUpDate); + return Ok(orderId); + } + [HttpDelete("{id:guid}")] + public async Task> DeleteOrder(Guid id) + { + return Ok(await _orderService.DeleteOrder(id)); + } +} diff --git a/backend/CargoDelivery.API/Dockerfile b/backend/CargoDelivery.API/Dockerfile new file mode 100644 index 0000000..6c42998 --- /dev/null +++ b/backend/CargoDelivery.API/Dockerfile @@ -0,0 +1,29 @@ +#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. + +#Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed. +#For more information, please see https://aka.ms/containercompat + +FROM mcr.microsoft.com/dotnet/aspnet:8.0-nanoserver-1809 AS base +WORKDIR /app +EXPOSE 8080 +EXPOSE 8081 + +FROM mcr.microsoft.com/dotnet/sdk:8.0-nanoserver-1809 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["CargoDelivery.API.csproj", "."] +COPY ["CargoDelivery.DataAccess/CargoDelivery.DataAccess.csproj", "CargoDelivery.DataAccess/"] +COPY ["CargoDelivery.Core/CargoDelivery.Core.csproj", "CargoDelivery.Core/"] +RUN dotnet restore "./CargoDelivery.API.csdocproj" +COPY . . +WORKDIR "/src/." +RUN dotnet build "./CargoDelivery.API.csproj" -c %BUILD_CONFIGURATION% -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./CargoDelivery.API.csproj" -c %BUILD_CONFIGURATION% -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "CargoDelivery.API.dll"] \ No newline at end of file diff --git a/backend/CargoDelivery.API/Program.cs b/backend/CargoDelivery.API/Program.cs new file mode 100644 index 0000000..d77fb16 --- /dev/null +++ b/backend/CargoDelivery.API/Program.cs @@ -0,0 +1,44 @@ +using CargoDelivery.Application.Services; +using CargoDelivery.Core.Abstractions; +using CargoDelivery.DataAccess; +using CargoDelivery.DataAccess.Repositories; +using Microsoft.EntityFrameworkCore; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); + +builder.Services.AddDbContext( + options => + { + options.UseNpgsql(builder.Configuration.GetConnectionString(nameof(DatabaseContext))); + }); + +builder.Services.AddScoped(); +builder.Services.AddScoped(); + +var app = builder.Build(); + + +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.UseHttpsRedirection(); + +app.UseAuthorization(); + +app.MapControllers(); +app.UseCors(x => +{ + x.WithHeaders().AllowAnyHeader(); + x.WithOrigins("http://localhost:3000"); + x.WithMethods().AllowAnyMethod(); +}); + + +app.Run(); diff --git a/backend/CargoDelivery.API/Properties/launchSettings.json b/backend/CargoDelivery.API/Properties/launchSettings.json new file mode 100644 index 0000000..57ad3a8 --- /dev/null +++ b/backend/CargoDelivery.API/Properties/launchSettings.json @@ -0,0 +1,52 @@ +{ + "profiles": { + "http": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "applicationUrl": "http://localhost:5298" + }, + "https": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "applicationUrl": "https://localhost:7273;http://localhost:5298" + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Container (Dockerfile)": { + "commandName": "Docker", + "launchBrowser": true, + "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger", + "environmentVariables": { + "ASPNETCORE_HTTPS_PORTS": "8081", + "ASPNETCORE_HTTP_PORTS": "8080" + }, + "publishAllPorts": true, + "useSSL": true + } + }, + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:13879", + "sslPort": 44308 + } + } +} \ No newline at end of file diff --git a/backend/CargoDelivery.API/appsettings.Development.json b/backend/CargoDelivery.API/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/backend/CargoDelivery.API/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/backend/CargoDelivery.API/appsettings.json b/backend/CargoDelivery.API/appsettings.json new file mode 100644 index 0000000..73d8afd --- /dev/null +++ b/backend/CargoDelivery.API/appsettings.json @@ -0,0 +1,11 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "ConnectionStrings": { + "DatabaseContext": "User ID=postgres; Password=123; Host=localhost;Port=5432;Database=CargoDelivery;" + } +} diff --git a/backend/CargoDelivery.API/docker-compose.yml b/backend/CargoDelivery.API/docker-compose.yml new file mode 100644 index 0000000..201a6d2 --- /dev/null +++ b/backend/CargoDelivery.API/docker-compose.yml @@ -0,0 +1,16 @@ +services: + postgres: + image: postgres:latest + container_name: postgres + environment: + POSTGRES_DB: "CargoDelivery" + POSTGRES_USER: "postgres" + POSTGRES_PASSWORD: "123" + volumes: + - postgres-data:/var/lib/postgresql/data + + ports: + - "5432:5432" + +volumes: + postgres-data: \ No newline at end of file diff --git a/backend/CargoDelivery.Application/CargoDelivery.Application.csproj b/backend/CargoDelivery.Application/CargoDelivery.Application.csproj new file mode 100644 index 0000000..2285c41 --- /dev/null +++ b/backend/CargoDelivery.Application/CargoDelivery.Application.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/backend/CargoDelivery.Application/Services/OrderService.cs b/backend/CargoDelivery.Application/Services/OrderService.cs new file mode 100644 index 0000000..7fef999 --- /dev/null +++ b/backend/CargoDelivery.Application/Services/OrderService.cs @@ -0,0 +1,30 @@ +using CargoDelivery.Core.Abstractions; +using CargoDelivery.Core.Models; + +namespace CargoDelivery.Application.Services; + +public class OrderService : IOrderService +{ + private readonly IOrderRepository _orderRepository; + public OrderService(IOrderRepository orderRepository) + { + _orderRepository = orderRepository; + } + public async Task> GetAllOrders() + { + return await _orderRepository.GetOrders(); + } + + public async Task CreateOrder(Order order) + { + return await _orderRepository.Create(order); + } + public async Task UpdateOrder(Guid id, string SenderCity, string SenderAddress, string RecipientCity, string RecipientAddress, float Weight, DateTime PickUpDate) + { + return await (_orderRepository.Update(id, SenderCity, SenderAddress, RecipientCity, RecipientAddress, Weight, PickUpDate)); + } + public async Task DeleteOrder(Guid id) + { + return await _orderRepository.Delete(id); + } +} diff --git a/backend/CargoDelivery.Core/Abstractions/IOrderRepository.cs b/backend/CargoDelivery.Core/Abstractions/IOrderRepository.cs new file mode 100644 index 0000000..3313d89 --- /dev/null +++ b/backend/CargoDelivery.Core/Abstractions/IOrderRepository.cs @@ -0,0 +1,12 @@ +using CargoDelivery.Core.Models; + +namespace CargoDelivery.Core.Abstractions; + +public interface IOrderRepository +{ + Task Create(Order order); + Task Delete(Guid id); + Task> GetOrders(); + Task Update(Guid id, string SenderCity, string SenderAddress, string RecipientCity, string RecipientAddress, float Weight, DateTime PickUpDate); + +} diff --git a/backend/CargoDelivery.Core/Abstractions/IOrderService.cs b/backend/CargoDelivery.Core/Abstractions/IOrderService.cs new file mode 100644 index 0000000..22e1826 --- /dev/null +++ b/backend/CargoDelivery.Core/Abstractions/IOrderService.cs @@ -0,0 +1,12 @@ +using CargoDelivery.Core.Models; + +namespace CargoDelivery.Application.Services +{ + public interface IOrderService + { + Task CreateOrder(Order order); + Task DeleteOrder(Guid id); + Task> GetAllOrders(); + Task UpdateOrder(Guid id, string SenderCity, string SenderAddress, string RecipientCity, string RecipientAddress, float Weight, DateTime PickUpDate); + } +} \ No newline at end of file diff --git a/backend/CargoDelivery.Core/CargoDelivery.Core.csproj b/backend/CargoDelivery.Core/CargoDelivery.Core.csproj new file mode 100644 index 0000000..9f7bc45 --- /dev/null +++ b/backend/CargoDelivery.Core/CargoDelivery.Core.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + enable + enable + + + + + + + + diff --git a/backend/CargoDelivery.Core/Models/Order.cs b/backend/CargoDelivery.Core/Models/Order.cs new file mode 100644 index 0000000..18b272f --- /dev/null +++ b/backend/CargoDelivery.Core/Models/Order.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; +namespace CargoDelivery.Core.Models; + +public class Order +{ + + public const int MAX_GEO_LENGTH = 250; + public Order(Guid id, string senderCity, string senderAddress, string recipientCity, string recipientAddress, float weight, DateTime pickUpDate) + { + Id = id; + OrderNumber = GenerateOrderNumber(); + SenderCity = senderCity; + SenderAddress = senderAddress; + RecipientCity = recipientCity; + RecipientAddress = recipientAddress; + Weight = weight; + PickUpDate = pickUpDate; + } + + public Guid Id { get; } + public string OrderNumber { get; } = string.Empty; + + public string SenderCity { get; } = string.Empty; + + public string SenderAddress { get; } = string.Empty; + + public string RecipientCity { get; } = string.Empty; + + public string RecipientAddress { get; } = string.Empty; + + public float Weight { get; } + + public DateTime PickUpDate { get; } + + public static (Order Order, string Error) Create(Guid id, string senderCity, string senderAddress, string recipientCity, string recipientAddress, float weight, DateTime pickUpDate) + { + var error = string.Empty; + if (string.IsNullOrEmpty(senderCity) || senderCity.Length > MAX_GEO_LENGTH) + { + error = "Sender's city can not be empty or longer than 250 symbols"; + } + else if (string.IsNullOrEmpty(senderAddress) || senderAddress.Length > MAX_GEO_LENGTH) + { + error = "Sender's address can not be empty or longer than 250 symbols"; + } + else if (string.IsNullOrEmpty(recipientCity) || recipientCity.Length > MAX_GEO_LENGTH) + { + error = "Recipient's city can not be empty or longer than 250 symbols"; + } + else if (string.IsNullOrEmpty(recipientAddress) || recipientAddress.Length > MAX_GEO_LENGTH) + { + error = "Recipient's address can not be empty or longer than 250 symbols"; + } + var order = new Order(id, senderCity, senderAddress, recipientCity, recipientAddress, weight, pickUpDate); + return (order, error); + } + + Random rng = new Random(); + + public string GenerateOrderNumber() + { + long orderPart1 = rng.Next(100000, 9999999); + int orderPart2 = rng.Next(1000, 9999); + string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + char firstLetter = letters[rng.Next(letters.Length)]; + char secondLetter = letters[rng.Next(letters.Length)]; + string orderNumber = $"{firstLetter}{secondLetter}-{orderPart1}-{orderPart2}"; + return orderNumber; + } + +} \ No newline at end of file diff --git a/backend/CargoDelivery.DataAccess/CargoDelivery.DataAccess.csproj b/backend/CargoDelivery.DataAccess/CargoDelivery.DataAccess.csproj new file mode 100644 index 0000000..41307b4 --- /dev/null +++ b/backend/CargoDelivery.DataAccess/CargoDelivery.DataAccess.csproj @@ -0,0 +1,26 @@ + + + + net8.0 + enable + enable + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + diff --git a/backend/CargoDelivery.DataAccess/Configurations/OrderConfiguration.cs b/backend/CargoDelivery.DataAccess/Configurations/OrderConfiguration.cs new file mode 100644 index 0000000..4e66aad --- /dev/null +++ b/backend/CargoDelivery.DataAccess/Configurations/OrderConfiguration.cs @@ -0,0 +1,22 @@ +using CargoDelivery.Core.Models; +using CargoDelivery.DataAccess.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + + +namespace CargoDelivery.DataAccess.Configurations; + +public class OrderConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.HasKey(k => k.Id); + builder.Property(o => o.SenderCity).HasMaxLength(Order.MAX_GEO_LENGTH).IsRequired(); + builder.Property(o => o.SenderAddress).HasMaxLength(Order.MAX_GEO_LENGTH).IsRequired(); + builder.Property(o => o.RecipientCity).HasMaxLength(Order.MAX_GEO_LENGTH).IsRequired(); + builder.Property(o => o.RecipientAddress).HasMaxLength(Order.MAX_GEO_LENGTH).IsRequired(); + builder.Property(o => o.Weight).IsRequired(); + builder.Property(o => o.PickUpDate).IsRequired(); + + } +} diff --git a/backend/CargoDelivery.DataAccess/DatabaseContext.cs b/backend/CargoDelivery.DataAccess/DatabaseContext.cs new file mode 100644 index 0000000..52fb2a2 --- /dev/null +++ b/backend/CargoDelivery.DataAccess/DatabaseContext.cs @@ -0,0 +1,14 @@ +using CargoDelivery.DataAccess.Entities; +using Microsoft.EntityFrameworkCore; + + +namespace CargoDelivery.DataAccess; + +public class DatabaseContext : DbContext +{ + public DatabaseContext(DbContextOptions options) : base(options) + { + } + + public DbSet Orders { get; set; } +} diff --git a/backend/CargoDelivery.DataAccess/Entities/OrderEntity.cs b/backend/CargoDelivery.DataAccess/Entities/OrderEntity.cs new file mode 100644 index 0000000..dbf7fa8 --- /dev/null +++ b/backend/CargoDelivery.DataAccess/Entities/OrderEntity.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CargoDelivery.DataAccess.Entities; + +public class OrderEntity +{ + public Guid Id { get; set; } + public string OrderNumber { get; set; } = string.Empty; + + public string SenderCity { get; set; } = string.Empty; + + public string SenderAddress { get; set; } = string.Empty; + + public string RecipientCity { get; set; } = string.Empty; + + public string RecipientAddress { get; set; } = string.Empty; + + public float Weight { get; set; } + + public DateTime PickUpDate { get; set; } +} diff --git a/backend/CargoDelivery.DataAccess/Migrations/20240706000137_init.Designer.cs b/backend/CargoDelivery.DataAccess/Migrations/20240706000137_init.Designer.cs new file mode 100644 index 0000000..f26c2cd --- /dev/null +++ b/backend/CargoDelivery.DataAccess/Migrations/20240706000137_init.Designer.cs @@ -0,0 +1,67 @@ +// +using System; +using CargoDelivery.DataAccess; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CargoDelivery.DataAccess.Migrations +{ + [DbContext(typeof(DatabaseContext))] + [Migration("20240706000137_init")] + partial class init + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CargoDelivery.DataAccess.Entities.OrderEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("OrderNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("PickUpDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RecipientAddress") + .IsRequired() + .HasColumnType("text"); + + b.Property("RecipientCity") + .IsRequired() + .HasColumnType("text"); + + b.Property("SenderAddress") + .IsRequired() + .HasColumnType("text"); + + b.Property("SenderCity") + .IsRequired() + .HasColumnType("text"); + + b.Property("Weight") + .HasColumnType("real"); + + b.HasKey("Id"); + + b.ToTable("Orders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/backend/CargoDelivery.DataAccess/Migrations/20240706000137_init.cs b/backend/CargoDelivery.DataAccess/Migrations/20240706000137_init.cs new file mode 100644 index 0000000..44285b2 --- /dev/null +++ b/backend/CargoDelivery.DataAccess/Migrations/20240706000137_init.cs @@ -0,0 +1,40 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace CargoDelivery.DataAccess.Migrations +{ + /// + public partial class init : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Orders", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + OrderNumber = table.Column(type: "text", nullable: false), + SenderCity = table.Column(type: "text", nullable: false), + SenderAddress = table.Column(type: "text", nullable: false), + RecipientCity = table.Column(type: "text", nullable: false), + RecipientAddress = table.Column(type: "text", nullable: false), + Weight = table.Column(type: "real", nullable: false), + PickUpDate = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Orders", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Orders"); + } + } +} diff --git a/backend/CargoDelivery.DataAccess/Migrations/DatabaseContextModelSnapshot.cs b/backend/CargoDelivery.DataAccess/Migrations/DatabaseContextModelSnapshot.cs new file mode 100644 index 0000000..07da2b4 --- /dev/null +++ b/backend/CargoDelivery.DataAccess/Migrations/DatabaseContextModelSnapshot.cs @@ -0,0 +1,64 @@ +// +using System; +using CargoDelivery.DataAccess; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CargoDelivery.DataAccess.Migrations +{ + [DbContext(typeof(DatabaseContext))] + partial class DatabaseContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CargoDelivery.DataAccess.Entities.OrderEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("OrderNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("PickUpDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RecipientAddress") + .IsRequired() + .HasColumnType("text"); + + b.Property("RecipientCity") + .IsRequired() + .HasColumnType("text"); + + b.Property("SenderAddress") + .IsRequired() + .HasColumnType("text"); + + b.Property("SenderCity") + .IsRequired() + .HasColumnType("text"); + + b.Property("Weight") + .HasColumnType("real"); + + b.HasKey("Id"); + + b.ToTable("Orders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/backend/CargoDelivery.DataAccess/Repositories/OrderRepository.cs b/backend/CargoDelivery.DataAccess/Repositories/OrderRepository.cs new file mode 100644 index 0000000..7f1f68f --- /dev/null +++ b/backend/CargoDelivery.DataAccess/Repositories/OrderRepository.cs @@ -0,0 +1,62 @@ +using CargoDelivery.Core.Abstractions; +using CargoDelivery.Core.Models; +using CargoDelivery.DataAccess.Entities; +using Microsoft.EntityFrameworkCore; +using System.Net.WebSockets; + +namespace CargoDelivery.DataAccess.Repositories; + +public class OrderRepository : IOrderRepository +{ + private readonly DatabaseContext _context; + public OrderRepository(DatabaseContext context) + { + _context = context; + } + public async Task> GetOrders() + { + var orderEntities = await _context.Orders.AsNoTracking().ToListAsync(); + var orders = orderEntities + .Select(o => Order.Create(o.Id, o.SenderCity, o.SenderAddress, o.RecipientCity, o.RecipientAddress, o.Weight, o.PickUpDate).Order) + .ToList(); + return orders; + } + public async Task Create(Order order) + { + var orderEntity = new OrderEntity() + { + Id = order.Id, + OrderNumber = order.OrderNumber, + SenderCity = order.SenderCity, + SenderAddress = order.SenderAddress, + RecipientCity = order.RecipientCity, + RecipientAddress = order.RecipientAddress, + Weight = order.Weight, + PickUpDate = order.PickUpDate, + }; + + await _context.Orders.AddAsync(orderEntity); + await _context.SaveChangesAsync(); + + return orderEntity.Id; + } + public async Task Update(Guid id, string SenderCity, string SenderAddress, string RecipientCity, string RecipientAddress, float Weight, DateTime PickUpDate) + { + await _context.Orders.Where(o => o.Id == id).ExecuteUpdateAsync(u => u + .SetProperty(o => o.SenderCity, o => SenderCity) + .SetProperty(o => o.SenderAddress, o => SenderAddress) + .SetProperty(o => o.RecipientCity, o => RecipientCity) + .SetProperty(o => o.RecipientAddress, o => RecipientAddress) + .SetProperty(o => o.Weight, o => Weight) + .SetProperty(o => o.PickUpDate, o => PickUpDate)); + + return id; + } + + public async Task Delete(Guid id) + { + await _context.Orders.Where(b => b.Id == id).ExecuteDeleteAsync(); + + return id; + } +} diff --git a/backend/CargoDelivry.DataAccess/obj/.EntityFrameworkCore.targets b/backend/CargoDelivry.DataAccess/obj/.EntityFrameworkCore.targets new file mode 100644 index 0000000..7d6485d --- /dev/null +++ b/backend/CargoDelivry.DataAccess/obj/.EntityFrameworkCore.targets @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + From d75aa80ffc8762d9a2f240a5972b4d9ef82a9106 Mon Sep 17 00:00:00 2001 From: VladislavRkm <113041279+VladislavRkm@users.noreply.github.com> Date: Sat, 6 Jul 2024 20:57:00 +0300 Subject: [PATCH 02/14] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 45ef0f6..3174257 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ -# TestTaskForVersta \ No newline at end of file +# TestTaskForVersta +Проверка русского языка From 794c230ed8d210f56be82b21d08a836c1e88f00c Mon Sep 17 00:00:00 2001 From: VladislavRkm <113041279+VladislavRkm@users.noreply.github.com> Date: Sun, 7 Jul 2024 01:42:21 +0300 Subject: [PATCH 03/14] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3174257..b636b6a 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ # TestTaskForVersta -Проверка русского языка +![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/4af54062-a543-42bd-bcbb-fc0799627fb9) From 84d03d45d8603f3d361176c24ac36875a0c68682 Mon Sep 17 00:00:00 2001 From: VladislavRkm <113041279+VladislavRkm@users.noreply.github.com> Date: Sun, 7 Jul 2024 02:14:50 +0300 Subject: [PATCH 04/14] Update README.md --- README.md | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b636b6a..a4c67e9 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,64 @@ # TestTaskForVersta -![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/4af54062-a543-42bd-bcbb-fc0799627fb9) +## Техническое задание: +*Реализовать простое Web приложение для приемки заказа на доставку со следующим функционалом:* + +*1. Форма создания нового заказа (все поля обязательны для заполнения):* +*Город отправителя +Адрес отправителя +Город получателя +Адрес получателя +Вес груза +Дата забора груза* + +*2. Форма отображения списка заказов: все созданные заказы должны отображаться в отдельной форме. Помимо полей, введенных пользователем при создании заказа, должен отображаться автоматически сгенерированный номер заказа.* + +*3. Форма просмотра созданного заказа в режиме чтения. Должна открываться при клике на заказ в списке заказов.* + +___ +## Стек технологий: +-ASP.NET 8 на backend +-React.JS, Next.JS, Ant Design +-Entity Framework +-PostgreSQL +-Docker +___ + Я решил написать данное приложение с использованием луковой(чистой) архитектуры. Как известно, всё начинается с доменных сущностей: + ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/4af54062-a543-42bd-bcbb-fc0799627fb9) + (Все слои и взаимодействия можно увидеть в структкуре проекта.) + Не буду тянуть. Когда все сущности, модели, контекст, репозитории, интерфейсы, сервисы и контроллеры были написаны, я подключил базу данных PostgreSQL и поднял её в Docker-контейнере. + ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/0785811f-eac8-4ee0-a266-43d88a19e48d) + ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/608d291e-1f46-4b99-b3b5-e36904ec9453) + ___ + Можно запускать проект. При запуске у нас открывается страница Swagger'a со следующими http-запросами: + ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/b6f43d69-5cd5-4f92-9833-a6e7d51b3f41) + ___ + Проверим их работоспособность, и первым делом создадим заказ на перевозку груза: + ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/b6295f9b-87f5-4351-8108-d92a115f9e1b) + ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/13440220-455c-4132-ae4b-100dd13e67c1) + Видим код "200", радуемся жизни и отправляем GET-запрос и получаем наши заказы, дабы убедиться, что всё не зря: + ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/79abdfb1-084a-4aba-ae17-1e00c607851f) + Перед нами два заказа, один из которых не несёт в себе никакой содержательной информации. Удалим его и проверим, работоспособность DELETE-запроса. Копируем id заказа, который хотим удалить и вставляем в поле для заполнения. +![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/62a83acf-4280-4615-9302-679a4fb4e8b8) +![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/81e87d2e-8e1c-4648-aeee-76e147cfe6de) +___ +Теперь представим, что экспедитору попался ненадёжный заказчик и ему нужно подкорректировать детали заказа. Корректируем данные, отправляем UPDATE-запрос, а затем GET-запрос, чтобы убедиться, что внесённые изменения сохранены. +![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/b179ba10-056d-48a0-a1cd-4f87aea475da) +![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/e9a901ac-846b-403a-a423-bca654235a71) +![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/83d16269-7291-4858-955a-db6e0e3fc1f9) +___ +Наконец, убедимся, что в базе данных всё также сохраняется: +![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/434803a5-0f7e-4220-b1a1-e545dc57aa44) + + + + + + + + + + + + + + From 2c27eb8fcdcb1f4aea00ed4cf038e01c4dbc447b Mon Sep 17 00:00:00 2001 From: VladislavRkm <113041279+VladislavRkm@users.noreply.github.com> Date: Sun, 7 Jul 2024 02:17:23 +0300 Subject: [PATCH 05/14] Update README.md --- README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a4c67e9..92baee4 100644 --- a/README.md +++ b/README.md @@ -16,15 +16,18 @@ ___ ## Стек технологий: --ASP.NET 8 на backend --React.JS, Next.JS, Ant Design --Entity Framework --PostgreSQL --Docker + +* ASP.NET 8 на backend +* React.JS, Next.JS, Ant Design +* Entity Framework +* PostgreSQL +* Docker ___ Я решил написать данное приложение с использованием луковой(чистой) архитектуры. Как известно, всё начинается с доменных сущностей: + ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/4af54062-a543-42bd-bcbb-fc0799627fb9) (Все слои и взаимодействия можно увидеть в структкуре проекта.) + Не буду тянуть. Когда все сущности, модели, контекст, репозитории, интерфейсы, сервисы и контроллеры были написаны, я подключил базу данных PostgreSQL и поднял её в Docker-контейнере. ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/0785811f-eac8-4ee0-a266-43d88a19e48d) ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/608d291e-1f46-4b99-b3b5-e36904ec9453) From ce7536cfcdd06ebc5b0228225724c635327683da Mon Sep 17 00:00:00 2001 From: VladislavRkm <113041279+VladislavRkm@users.noreply.github.com> Date: Sun, 7 Jul 2024 02:29:12 +0300 Subject: [PATCH 06/14] Update README.md --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 92baee4..c6f17ad 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ ___ * PostgreSQL * Docker ___ +## Backend: Я решил написать данное приложение с использованием луковой(чистой) архитектуры. Как известно, всё начинается с доменных сущностей: ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/4af54062-a543-42bd-bcbb-fc0799627fb9) @@ -40,7 +41,7 @@ ___ ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/13440220-455c-4132-ae4b-100dd13e67c1) Видим код "200", радуемся жизни и отправляем GET-запрос и получаем наши заказы, дабы убедиться, что всё не зря: ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/79abdfb1-084a-4aba-ae17-1e00c607851f) - Перед нами два заказа, один из которых не несёт в себе никакой содержательной информации. Удалим его и проверим, работоспособность DELETE-запроса. Копируем id заказа, который хотим удалить и вставляем в поле для заполнения. + Перед нами два заказа, один из которых не несёт в себе никакой содержательной информации. Удалим его и проверим работоспособность DELETE-запроса. Копируем id заказа, который хотим удалить и вставляем в поле для заполнения. ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/62a83acf-4280-4615-9302-679a4fb4e8b8) ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/81e87d2e-8e1c-4648-aeee-76e147cfe6de) ___ @@ -51,6 +52,17 @@ ___ ___ Наконец, убедимся, что в базе данных всё также сохраняется: ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/434803a5-0f7e-4220-b1a1-e545dc57aa44) +___ + +## Frontend: +Главная страница выглядит следующим образом. Есть домашняя страница и страница для создания, просмотра и редактирования заказ(а/ов): + +![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/88f6f4ec-916d-4e1a-932c-2628b9eaf72b) +___ + +Хорошее на этом, к сожалению, заканчивается. Ибо техническая реализация **полностью готова**___(можно убедиться в папке frontend)___, но страница не открывается из-за неизвестной мне ошибки. К несчастью, у меня нет опыта frontend-разработки, и возможно, мне стоило выбрать более лёгкий путь и писать frontend с использованием ASP.NET MVC, но время на переписывание frontend части уже вышло. Я бы с удовольствием довёл до ума этот проект, если бы мне дали фидбэк и направили в нужное русло для исправления данной ошибки. Спасибо! +![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/c9c66405-9192-410c-9d0e-0ac8ea4745ea) +___ From a9131bd1a27754ca524ead862eaf420ca792bf2f Mon Sep 17 00:00:00 2001 From: VladislavRkm <113041279+VladislavRkm@users.noreply.github.com> Date: Sun, 7 Jul 2024 02:36:56 +0300 Subject: [PATCH 07/14] Add files via upload --- frontend.rar | Bin 0 -> 130639 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 frontend.rar diff --git a/frontend.rar b/frontend.rar new file mode 100644 index 0000000000000000000000000000000000000000..8c4bfb0e4bfe9cdb5496ae0ab6a3989057dc73ab GIT binary patch literal 130639 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

KgLQD? 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 Date: Sun, 7 Jul 2024 02:37:28 +0300 Subject: [PATCH 08/14] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c6f17ad..97f5e85 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ ___ ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/88f6f4ec-916d-4e1a-932c-2628b9eaf72b) ___ -Хорошее на этом, к сожалению, заканчивается. Ибо техническая реализация **полностью готова**___(можно убедиться в папке frontend)___, но страница не открывается из-за неизвестной мне ошибки. К несчастью, у меня нет опыта frontend-разработки, и возможно, мне стоило выбрать более лёгкий путь и писать frontend с использованием ASP.NET MVC, но время на переписывание frontend части уже вышло. Я бы с удовольствием довёл до ума этот проект, если бы мне дали фидбэк и направили в нужное русло для исправления данной ошибки. Спасибо! +Хорошее на этом, к сожалению, заканчивается. Ибо техническая реализация **полностью готова**___(можно убедиться в файле frontend)___, но страница не открывается из-за неизвестной мне ошибки. К несчастью, у меня нет опыта frontend-разработки, и возможно, мне стоило выбрать более лёгкий путь и писать frontend с использованием ASP.NET MVC, но время на переписывание frontend части уже вышло. Я бы с удовольствием довёл до ума этот проект, если бы мне дали фидбэк и направили в нужное русло для исправления данной ошибки. Спасибо! ![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/c9c66405-9192-410c-9d0e-0ac8ea4745ea) ___ From 542cdcaba742169398172206124879394c2ce304 Mon Sep 17 00:00:00 2001 From: VladislavRkm <113041279+VladislavRkm@users.noreply.github.com> Date: Mon, 15 Jul 2024 01:28:27 +0300 Subject: [PATCH 09/14] Update README.md --- README.md | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 97f5e85..a426858 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ ___ ## Стек технологий: * ASP.NET 8 на backend -* React.JS, Next.JS, Ant Design +* Razor Pages * Entity Framework * PostgreSQL * Docker @@ -55,14 +55,33 @@ ___ ___ ## Frontend: -Главная страница выглядит следующим образом. Есть домашняя страница и страница для создания, просмотра и редактирования заказ(а/ов): +Главная страница выглядит следующим образом. Мы можем увидеть кнопку для формирования нового заказа и форму для просмотра уже существующих заказов (пока что она пуста): -![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/88f6f4ec-916d-4e1a-932c-2628b9eaf72b) +![image](https://github.com/user-attachments/assets/997906dc-ab77-48f9-b29e-9870da7f7b07) + +Убедимся, что наша база данных также пуста и перейдём к ручному тестированию функционала страницы. + +![image](https://github.com/user-attachments/assets/5b2ec1cb-35a7-4e27-8d13-a933d150d421) ___ +Создадим новый заказ, нажимаем кнопку "Отправить". Возращаемся на главную станицу и видим, что заказ отобразился. +![image](https://github.com/user-attachments/assets/88bbd53e-9e73-4148-94bd-a90042cab887) -Хорошее на этом, к сожалению, заканчивается. Ибо техническая реализация **полностью готова**___(можно убедиться в файле frontend)___, но страница не открывается из-за неизвестной мне ошибки. К несчастью, у меня нет опыта frontend-разработки, и возможно, мне стоило выбрать более лёгкий путь и писать frontend с использованием ASP.NET MVC, но время на переписывание frontend части уже вышло. Я бы с удовольствием довёл до ума этот проект, если бы мне дали фидбэк и направили в нужное русло для исправления данной ошибки. Спасибо! -![image](https://github.com/VladislavRkm/TestTaskForVersta/assets/113041279/c9c66405-9192-410c-9d0e-0ac8ea4745ea) + +Проверим его наличие в БД: +![image](https://github.com/user-attachments/assets/01652685-38dd-4889-9914-1fe013c8ad97) +Видим, что заказ отобразился и все данные совпадают с тем, что отражено на странице. ___ +Перейдём к тестированию кнопок "Просмотр заказа", "Редактировать", "Удалить": + +Просмотр осуществляется в режиме чтения. Открываем заказ, попробуем стереть введённые данные: +![image](https://github.com/user-attachments/assets/15cce1ad-5c84-4558-a33b-848bfbe6c9db) +Нажимаем кнопку закрыть и всё возвращается на свои места: +![image](https://github.com/user-attachments/assets/ac5d1f96-7c36-4644-9ac4-ae1fdd7bdd77) +Теперь отредактируем наш заказ: +![image](https://github.com/user-attachments/assets/77ef5c3a-c8c4-45ed-85e1-df245a964fc6) + + + From e157c58e4545d927dcee42cba473dbf079d0d589 Mon Sep 17 00:00:00 2001 From: VladislavRkm <113041279+VladislavRkm@users.noreply.github.com> Date: Mon, 15 Jul 2024 01:38:47 +0300 Subject: [PATCH 10/14] Update README.md --- README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a426858..e0ee649 100644 --- a/README.md +++ b/README.md @@ -64,21 +64,24 @@ ___ ![image](https://github.com/user-attachments/assets/5b2ec1cb-35a7-4e27-8d13-a933d150d421) ___ Создадим новый заказ, нажимаем кнопку "Отправить". Возращаемся на главную станицу и видим, что заказ отобразился. -![image](https://github.com/user-attachments/assets/88bbd53e-9e73-4148-94bd-a90042cab887) - +![image](https://github.com/user-attachments/assets/1cd30de6-62d4-43db-870e-eb0c99e0ba12) +![image](https://github.com/user-attachments/assets/ba0b8325-d65a-41b2-a635-03ffb5a38973) Проверим его наличие в БД: -![image](https://github.com/user-attachments/assets/01652685-38dd-4889-9914-1fe013c8ad97) +![image](https://github.com/user-attachments/assets/224a4216-a08d-4151-a4bb-fa5fa5285177) + Видим, что заказ отобразился и все данные совпадают с тем, что отражено на странице. ___ Перейдём к тестированию кнопок "Просмотр заказа", "Редактировать", "Удалить": Просмотр осуществляется в режиме чтения. Открываем заказ, попробуем стереть введённые данные: -![image](https://github.com/user-attachments/assets/15cce1ad-5c84-4558-a33b-848bfbe6c9db) +![image](https://github.com/user-attachments/assets/bf404dc5-5cee-4ffb-9ea8-9989e7076f4a) + Нажимаем кнопку закрыть и всё возвращается на свои места: -![image](https://github.com/user-attachments/assets/ac5d1f96-7c36-4644-9ac4-ae1fdd7bdd77) +![image](https://github.com/user-attachments/assets/f5cf7bea-d3f1-4273-944c-667c6b5081ec) + Теперь отредактируем наш заказ: -![image](https://github.com/user-attachments/assets/77ef5c3a-c8c4-45ed-85e1-df245a964fc6) + From b63e3ac9dae3a743fb51b45360351874fbed0c87 Mon Sep 17 00:00:00 2001 From: VladislavRkm <113041279+VladislavRkm@users.noreply.github.com> Date: Mon, 15 Jul 2024 01:45:07 +0300 Subject: [PATCH 11/14] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index e0ee649..81b31d1 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,10 @@ ___ ![image](https://github.com/user-attachments/assets/f5cf7bea-d3f1-4273-944c-667c6b5081ec) Теперь отредактируем наш заказ: +![image](https://github.com/user-attachments/assets/bb6d4ccb-7ead-4db0-84fd-f5c43e989c4c) + +Заказ отобразился, при этом заметим, что номер заказа у нас _не редактируется и не меняется_, то есть с точки зрения бизнес-логики это тот же самый заказ, в котором изменились некоторые поля. + From 939c22ebabefa32844b3043f9321161beba85591 Mon Sep 17 00:00:00 2001 From: VladislavRkm <113041279+VladislavRkm@users.noreply.github.com> Date: Mon, 15 Jul 2024 01:51:57 +0300 Subject: [PATCH 12/14] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 81b31d1..7a38565 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,10 @@ ___ ![image](https://github.com/user-attachments/assets/bb6d4ccb-7ead-4db0-84fd-f5c43e989c4c) Заказ отобразился, при этом заметим, что номер заказа у нас _не редактируется и не меняется_, то есть с точки зрения бизнес-логики это тот же самый заказ, в котором изменились некоторые поля. +![image](https://github.com/user-attachments/assets/ecbbc533-71b8-44b6-bd57-2e4f0ea95346) + +В базе данных изменения также отображаются: +![image](https://github.com/user-attachments/assets/07975d8e-81c7-4451-b370-fc715e1b9bd8) From 7fd4ecfe1812be0ef2147fa879095d0fc1cdbeea Mon Sep 17 00:00:00 2001 From: VladislavRkm <113041279+VladislavRkm@users.noreply.github.com> Date: Mon, 15 Jul 2024 01:55:58 +0300 Subject: [PATCH 13/14] Update README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 7a38565..c013401 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,7 @@ ___ Нажимаем кнопку закрыть и всё возвращается на свои места: ![image](https://github.com/user-attachments/assets/f5cf7bea-d3f1-4273-944c-667c6b5081ec) +___ Теперь отредактируем наш заказ: ![image](https://github.com/user-attachments/assets/bb6d4ccb-7ead-4db0-84fd-f5c43e989c4c) @@ -88,6 +89,14 @@ ___ В базе данных изменения также отображаются: ![image](https://github.com/user-attachments/assets/07975d8e-81c7-4451-b370-fc715e1b9bd8) +___ + +Давайте теперь удалим наш заказ. Для этого воспользуемся кнопкой "Удалить". +![image](https://github.com/user-attachments/assets/feec350c-2542-4a53-b6b8-d4585a98dc51) + +Из базы данных запись удаляется соответственно: +![image](https://github.com/user-attachments/assets/2c8d6622-7766-4b8b-a012-65ff7f3dc977) + From 0d913f35a94a3015ccc5ced3d9221f2da4c45351 Mon Sep 17 00:00:00 2001 From: VladislavRkm <113041279+VladislavRkm@users.noreply.github.com> Date: Mon, 15 Jul 2024 02:21:11 +0300 Subject: [PATCH 14/14] Update README.md --- README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/README.md b/README.md index c013401..1797100 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,39 @@ ___ Из базы данных запись удаляется соответственно: ![image](https://github.com/user-attachments/assets/2c8d6622-7766-4b8b-a012-65ff7f3dc977) +___ +Теперь проверим синхронизацию бэкенда и фронтенда. Создадим какой-нибудь заказ через Swagger UI. +![image](https://github.com/user-attachments/assets/2cbc660b-5a27-46a6-ae19-ec1f84619986) +Обновим страницу и увидим заказ на нашей страничке: + +![image](https://github.com/user-attachments/assets/21bf185a-d473-435b-8eca-c5408e37c556) +___ +Теперь в обратную сторону, проверим как работают http-запросы с заказами, созданными через Razor Pages. +![image](https://github.com/user-attachments/assets/37ecdbee-ee90-4d59-b253-8531e0474239) +![image](https://github.com/user-attachments/assets/424f9451-5918-47b9-9deb-8d256ead09a7) + +Выполняем GET-запрос в Swagger UI и он нам возвращает наши заказы. +![image](https://github.com/user-attachments/assets/caebeab5-1699-4ce3-a430-9eac87b128dc) + +Остальные запросы выполнять не будем, так как очевидно, что они будут работать. +___ +Подведём итоги. +Технические требования к реализации: + +- [x] Форма заказа с обязательными для заполнения полями +- [x] Форма для отображения сформированных заказов с автоматически сгенерированным номером для каждого заказа +- [x] Форма для просмотра заказа в режиме чтения + +Технологии: + +- [x] ASP.NET 8 на backend +- [ ] React.JS (предпочтительно) на front +- [x] Razor Pages на front +- [x] Entity Framework +- [x] Docker (дополнительно) +- [x] PostgreSQL + +