From d73e0a104f81f789ffe14734c5aefe3c2f8437fc Mon Sep 17 00:00:00 2001 From: shept Date: Sat, 31 May 2025 01:24:48 +0500 Subject: [PATCH] add basic versions of retrieving answers by question or completion --- .../Controllers/AnswerController.cs | 37 +++++++++++++++++ .../Controllers/AnswerVariantsController.cs | 16 ++++---- .../Mappers/AnswerVariantMapper.cs | 3 +- .../Mappers/QuestionMapper.cs | 5 --- SurveyBackend/SurveyBackend.API/Program.cs | 2 + .../Services/AnswerService.cs | 40 +++++++++++++++++++ .../Services/AnswerVariantsService.cs | 8 ++++ 7 files changed, 95 insertions(+), 16 deletions(-) create mode 100644 SurveyBackend/SurveyBackend.API/Controllers/AnswerController.cs create mode 100644 SurveyBackend/SurveyBackend.Services/Services/AnswerService.cs diff --git a/SurveyBackend/SurveyBackend.API/Controllers/AnswerController.cs b/SurveyBackend/SurveyBackend.API/Controllers/AnswerController.cs new file mode 100644 index 0000000..27453e6 --- /dev/null +++ b/SurveyBackend/SurveyBackend.API/Controllers/AnswerController.cs @@ -0,0 +1,37 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using SurveyBackend.Mappers; +using SurveyLib.Core.Services; + +namespace SurveyBackend.Controllers; + +[ApiController] +public class AnswerController : ControllerBase +{ + private readonly IAnswerService _answerService; + + public AnswerController(IAnswerService answerService) + { + _answerService = answerService; + } + + [Authorize] + [HttpGet] + [Route("api/questions/{id:int}/answers")] + public async Task GetAnswersByQuestionId(int id) + { + var models = await _answerService.GetAnswersByQuestionIdAsync(id); + var result = models.Select(AnswerMapper.ModelToOutputDto); + return Ok(result); + } + + [Authorize] + [HttpGet] + [Route("api/completions/{id:int}/answers")] + public async Task GetAnswersByCompletionId(int id) + { + var models = await _answerService.GetAnswersByCompletionIdAsync(id); + var result = models.Select(AnswerMapper.ModelToOutputDto); + return Ok(result); + } +} \ No newline at end of file diff --git a/SurveyBackend/SurveyBackend.API/Controllers/AnswerVariantsController.cs b/SurveyBackend/SurveyBackend.API/Controllers/AnswerVariantsController.cs index fe44196..1aca7f9 100644 --- a/SurveyBackend/SurveyBackend.API/Controllers/AnswerVariantsController.cs +++ b/SurveyBackend/SurveyBackend.API/Controllers/AnswerVariantsController.cs @@ -52,16 +52,15 @@ public class AnswerVariantsController : ControllerBase /// /// Обновить вариант ответа на вопрос /// - /// Идентификатор опроса - /// Идентификатор вопроса /// Идентификатор варианта ответа /// Объект с данными для обновления варианта ответа /// Результат обновленного варианта ответа [Authorize] - [HttpPut("{id}")] - public async Task Update(int surveyId, int questionId, int id, [FromBody] AnswerVariantUpdateDto dto) + [HttpPut] + [Route("/api/answerVariants/{id:int}")] + public async Task Update(int id, [FromBody] AnswerVariantUpdateDto dto) { - var model = AnswerVariantMapper.UpdateDtoToModel(dto, questionId, id); + var model = AnswerVariantMapper.UpdateDtoToModel(dto, id); await _answerVariantsService.UpdateAnswerVariantAsync(model); var result = AnswerVariantMapper.ModelToOutputDto(model); return Ok(result); @@ -70,13 +69,12 @@ public class AnswerVariantsController : ControllerBase /// /// Удалить вариант ответа на вопрос /// - /// Идентификатор опроса - /// Идентификатор вопроса /// Идентификатор варианта ответа /// Результат операции удаления [Authorize] - [HttpDelete("{id}")] - public async Task Delete(int surveyId, int questionId, int id) + [HttpDelete] + [Route("/api/answerVariants/{id:int}")] + public async Task Delete(int id) { await _answerVariantsService.DeleteAnswerVariantAsync(id); return Ok(); diff --git a/SurveyBackend/SurveyBackend.API/Mappers/AnswerVariantMapper.cs b/SurveyBackend/SurveyBackend.API/Mappers/AnswerVariantMapper.cs index 337f043..97e6892 100644 --- a/SurveyBackend/SurveyBackend.API/Mappers/AnswerVariantMapper.cs +++ b/SurveyBackend/SurveyBackend.API/Mappers/AnswerVariantMapper.cs @@ -11,10 +11,9 @@ public static class AnswerVariantMapper Text = dto.Text }; - public static AnswerVariant UpdateDtoToModel(AnswerVariantUpdateDto dto, int questionId, int answerVariantId) => + public static AnswerVariant UpdateDtoToModel(AnswerVariantUpdateDto dto, int answerVariantId) => new AnswerVariant { - QuestionId = questionId, Id = answerVariantId, Text = dto.Text }; diff --git a/SurveyBackend/SurveyBackend.API/Mappers/QuestionMapper.cs b/SurveyBackend/SurveyBackend.API/Mappers/QuestionMapper.cs index 53da810..6cc41dc 100644 --- a/SurveyBackend/SurveyBackend.API/Mappers/QuestionMapper.cs +++ b/SurveyBackend/SurveyBackend.API/Mappers/QuestionMapper.cs @@ -69,21 +69,16 @@ public static class QuestionMapper { Id = questionId, Title = dto.Title, - SurveyId = 0, // bad logic, need to do something }, "singleanswerquestion" => new SingleAnswerQuestion { Id = questionId, Title = dto.Title, - SurveyId = 0, - AnswerVariants = [], }, "multipleanswerquestion" => new MultipleAnswerQuestion { Id = questionId, Title = dto.Title, - SurveyId = 0, - AnswerVariants = [] }, _ => throw new BadRequestException("Unknown question type") }; diff --git a/SurveyBackend/SurveyBackend.API/Program.cs b/SurveyBackend/SurveyBackend.API/Program.cs index 54545b3..4e09b03 100644 --- a/SurveyBackend/SurveyBackend.API/Program.cs +++ b/SurveyBackend/SurveyBackend.API/Program.cs @@ -51,11 +51,13 @@ public class Program builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); + builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); + builder.Services.AddScoped(); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) diff --git a/SurveyBackend/SurveyBackend.Services/Services/AnswerService.cs b/SurveyBackend/SurveyBackend.Services/Services/AnswerService.cs new file mode 100644 index 0000000..758a513 --- /dev/null +++ b/SurveyBackend/SurveyBackend.Services/Services/AnswerService.cs @@ -0,0 +1,40 @@ +using SurveyLib.Core.Models; +using SurveyLib.Core.Repositories; +using SurveyLib.Core.Services; + +namespace SurveyBackend.Services.Services; + +public class AnswerService : IAnswerService +{ + private readonly IAnswerRepository _answerRepository; + + public AnswerService(IAnswerRepository answerRepository) + { + _answerRepository = answerRepository; + } + + public async Task AddAnswerAsync(Answer answer) + { + await _answerRepository.AddAsync(answer); + } + + public async Task UpdateAnswerAsync(Answer answer) + { + await _answerRepository.UpdateAsync(answer); + } + + public async Task DeleteAnswerAsync(int id) + { + await _answerRepository.DeleteAsync(id); + } + + public async Task> GetAnswersByCompletionIdAsync(int completionId) + { + return await _answerRepository.GetAnswersByCompletionIdAsync(completionId); + } + + public async Task> GetAnswersByQuestionIdAsync(int questionId) + { + return await _answerRepository.GetAnswersByQuestionIdAsync(questionId); + } +} \ No newline at end of file diff --git a/SurveyBackend/SurveyBackend.Services/Services/AnswerVariantsService.cs b/SurveyBackend/SurveyBackend.Services/Services/AnswerVariantsService.cs index 9808150..cd02fbc 100644 --- a/SurveyBackend/SurveyBackend.Services/Services/AnswerVariantsService.cs +++ b/SurveyBackend/SurveyBackend.Services/Services/AnswerVariantsService.cs @@ -22,6 +22,14 @@ public class AnswerVariantsService : IAnswerVariantsService public async Task UpdateAnswerVariantAsync(AnswerVariant answerVariant) { // TODO: опять проверка существования, но еще и варианта + var answerVariantBase = await _answerVariantsRepository.GetByIdAsNoTrackingAsync(answerVariant.Id); + if (answerVariantBase is null) + { + throw new Exception("Answer Variant not found"); + } + + answerVariant.QuestionId = answerVariantBase.QuestionId; + await _answerVariantsRepository.UpdateAsync(answerVariant); }