diff --git a/.vs/ASP.NET/v17/.wsuo b/.vs/ASP.NET/v17/.wsuo new file mode 100644 index 00000000..7b12e11b Binary files /dev/null and b/.vs/ASP.NET/v17/.wsuo differ diff --git a/.vs/ASP.NET/v17/DocumentLayout.json b/.vs/ASP.NET/v17/DocumentLayout.json new file mode 100644 index 00000000..733a76db --- /dev/null +++ b/.vs/ASP.NET/v17/DocumentLayout.json @@ -0,0 +1,139 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\Users\\\u041C\u0430\u0448\u0438\u043D\u0430\\Desktop\\OTUS_2025\\HomeWorks\\HW2\\ASP.NET\\", + "Documents": [], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": -1, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:131:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:132:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:133:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:133:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:134:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:135:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:139:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:138:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:141:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:143:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:140:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:142:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:147:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:149:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:148:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:151:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:152:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:153:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:154:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:155:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:157:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:158:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:159:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:160:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:161:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:162:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:163:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:156:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:129:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:130:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Repositories/IRepository.cs b/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Repositories/IRepository.cs index 3fe683e5..26cc9819 100644 --- a/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Repositories/IRepository.cs +++ b/Homeworks/Base/src/PromoCodeFactory.Core/Abstractions/Repositories/IRepository.cs @@ -10,5 +10,11 @@ public interface IRepository where T: BaseEntity Task> GetAllAsync(); Task GetByIdAsync(Guid id); + + Task CreateAsync(T entity); + + void Update(T entity); + + void Delete(Guid id); } } \ No newline at end of file diff --git a/Homeworks/Base/src/PromoCodeFactory.DataAccess/Repositories/InMemoryRepository.cs b/Homeworks/Base/src/PromoCodeFactory.DataAccess/Repositories/InMemoryRepository.cs index 0f1e04d7..859eccaf 100644 --- a/Homeworks/Base/src/PromoCodeFactory.DataAccess/Repositories/InMemoryRepository.cs +++ b/Homeworks/Base/src/PromoCodeFactory.DataAccess/Repositories/InMemoryRepository.cs @@ -24,5 +24,27 @@ public Task GetByIdAsync(Guid id) { return Task.FromResult(Data.FirstOrDefault(x => x.Id == id)); } + + public Task CreateAsync(T entity) + { + Data = Data.Concat(new[] { entity }); + return Task.FromResult(entity); + } + + public void Update(T entity) + { + var dataList = Data.ToList(); + var indexbyId = dataList.FindIndex(t => t.Id == entity.Id); + if (indexbyId == -1) + { + dataList[indexbyId] = entity; + } + Data = dataList.AsEnumerable(); + } + + public void Delete(Guid id) + { + Data = Data.Where(T => T.Id != id); + } } } \ No newline at end of file diff --git a/Homeworks/Base/src/PromoCodeFactory.WebHost/Controllers/EmployeesController.cs b/Homeworks/Base/src/PromoCodeFactory.WebHost/Controllers/EmployeesController.cs index df1c41dd..d9d8604b 100644 --- a/Homeworks/Base/src/PromoCodeFactory.WebHost/Controllers/EmployeesController.cs +++ b/Homeworks/Base/src/PromoCodeFactory.WebHost/Controllers/EmployeesController.cs @@ -6,6 +6,7 @@ using PromoCodeFactory.Core.Abstractions.Repositories; using PromoCodeFactory.Core.Domain.Administration; using PromoCodeFactory.WebHost.Models; +using PromoCodeFactory.WebHost.Request; namespace PromoCodeFactory.WebHost.Controllers { @@ -70,5 +71,91 @@ public async Task> GetEmployeeByIdAsync(Guid id) return employeeModel; } + + /// + /// Получить неполные данные сотрудника по Id + /// + /// + [HttpGet("short/{id:guid}", Name = "GetEmployeeShort")] + [ProducesResponseType(typeof(EmployeeShortResponse), 200)] + [ProducesResponseType(404)] + public async Task> GetShortEmployeeByIdAsync(Guid id) + { + var employee = await _employeeRepository.GetByIdAsync(id); + + if (employee == null) + return NotFound(); + + var employeeModel = new EmployeeShortResponse() + { + Id = employee.Id, + Email = employee.Email, + FullName = employee.FullName, + }; + + return Ok(employeeModel); + } + + /// + /// Добавить нового сотрудника + /// + /// + /// + [HttpPost] + [ProducesResponseType(typeof(EmployeeResponse), 201)] + [ProducesResponseType(400)] + public async Task CreateEmployeeAsync(CreateEmployeeRequest employeeRequest) + { + var employee = new Employee() + { + Id = Guid.NewGuid(), + Email = employeeRequest.Email, + Roles = new List(), + FirstName = employeeRequest.FirstName, + LastName = employeeRequest.LastName, + AppliedPromocodesCount = employeeRequest.AppliedPromocodesCount + }; + var createdEmployee = await _employeeRepository.CreateAsync(employee); + if (createdEmployee == null) return Problem("Не удалось создать сотрудника"); + var employeeShortResponse = new EmployeeShortResponse() + { + Id = createdEmployee.Id, + Email = createdEmployee.Email, + FullName = createdEmployee.FullName, + }; + + return CreatedAtRoute("GetEmployeeShort", new { id = createdEmployee.Id }, employeeShortResponse); + } + + [HttpPut("{id:guid}")] + [ProducesResponseType(204)] + [ProducesResponseType(400)] + [ProducesResponseType(404)] + public async Task Update(Guid id, UpdateEmployeeRequest request) + { + var employeeExist = await _employeeRepository.GetByIdAsync(id); + + if (employeeExist == null) + return NotFound(); + + employeeExist.Email = request.Email; + employeeExist.FirstName = request.FirstName; + employeeExist.LastName = request.LastName; + employeeExist.AppliedPromocodesCount = request.AppliedPromocodesCount; + + _employeeRepository.Update(employeeExist); + return Ok(id); + } + + [HttpDelete("{id:guid}")] + [ProducesResponseType(204)] + [ProducesResponseType(400)] + [ProducesResponseType(404)] + public IActionResult Delete(Guid id) + { + _employeeRepository.Delete(id); + return NoContent(); + + } } } \ No newline at end of file diff --git a/Homeworks/Base/src/PromoCodeFactory.WebHost/PromoCodeFactory.WebHost.csproj b/Homeworks/Base/src/PromoCodeFactory.WebHost/PromoCodeFactory.WebHost.csproj index 3769460c..aa44d1fc 100644 --- a/Homeworks/Base/src/PromoCodeFactory.WebHost/PromoCodeFactory.WebHost.csproj +++ b/Homeworks/Base/src/PromoCodeFactory.WebHost/PromoCodeFactory.WebHost.csproj @@ -15,4 +15,8 @@ + + + + diff --git a/Homeworks/Base/src/PromoCodeFactory.WebHost/Request/CreateEmployeeRequest.cs b/Homeworks/Base/src/PromoCodeFactory.WebHost/Request/CreateEmployeeRequest.cs new file mode 100644 index 00000000..06781412 --- /dev/null +++ b/Homeworks/Base/src/PromoCodeFactory.WebHost/Request/CreateEmployeeRequest.cs @@ -0,0 +1,13 @@ +namespace PromoCodeFactory.WebHost.Request +{ + public class CreateEmployeeRequest + { + public string FirstName { get; set; } + + public string LastName { get; set; } + + public string Email { get; set; } + + public int AppliedPromocodesCount { get; set; } + } +} diff --git a/Homeworks/Base/src/PromoCodeFactory.WebHost/Request/UpdateEmployeeRequest.cs b/Homeworks/Base/src/PromoCodeFactory.WebHost/Request/UpdateEmployeeRequest.cs new file mode 100644 index 00000000..2abc0698 --- /dev/null +++ b/Homeworks/Base/src/PromoCodeFactory.WebHost/Request/UpdateEmployeeRequest.cs @@ -0,0 +1,13 @@ +namespace PromoCodeFactory.WebHost.Request +{ + public class UpdateEmployeeRequest + { + public string FirstName { get; set; } + + public string LastName { get; set; } + + public string Email { get; set; } + + public int AppliedPromocodesCount { get; set; } + } +} diff --git a/Homeworks/Base/src/PromoCodeFactory.WebHost/wwwroot/Test_HTTP.http b/Homeworks/Base/src/PromoCodeFactory.WebHost/wwwroot/Test_HTTP.http new file mode 100644 index 00000000..186576be --- /dev/null +++ b/Homeworks/Base/src/PromoCodeFactory.WebHost/wwwroot/Test_HTTP.http @@ -0,0 +1,29 @@ +@baseURL = https://localhost:5001 + +### +GET {{baseURL}}/api/v1/Employees + +### +POST {{baseURL}}/api/v1/Employees +Content-Type: application/json + +{ + "firstName": "Ivan", + "lastName": "Petrov", + "email": "Petrov@somemail.ru", + "appliedPromocodesCount": 0 +} + +### +PUT {{baseURL}}/api/v1/Employees/f766e2bf-340a-46ea-bff3-f1700b435895 +Content-Type: application/json + +{ + "firstName": "����", + "lastName": "�������", + "email": "andreevNew@somemail.ru", + "appliedPromocodesCount": 5 +} + +### +DELETE {{baseURL}}/api/v1/Employees/f766e2bf-340a-46ea-bff3-f1700b435895