add basic versions of retrieving answers by question or completion

This commit is contained in:
Вячеслав 2025-05-31 01:24:48 +05:00
parent 637e6c9824
commit d73e0a104f
7 changed files with 95 additions and 16 deletions

View file

@ -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<IActionResult> 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<IActionResult> GetAnswersByCompletionId(int id)
{
var models = await _answerService.GetAnswersByCompletionIdAsync(id);
var result = models.Select(AnswerMapper.ModelToOutputDto);
return Ok(result);
}
}

View file

@ -52,16 +52,15 @@ public class AnswerVariantsController : ControllerBase
/// <summary> /// <summary>
/// Обновить вариант ответа на вопрос /// Обновить вариант ответа на вопрос
/// </summary> /// </summary>
/// <param name="surveyId">Идентификатор опроса</param>
/// <param name="questionId">Идентификатор вопроса</param>
/// <param name="id">Идентификатор варианта ответа</param> /// <param name="id">Идентификатор варианта ответа</param>
/// <param name="dto">Объект с данными для обновления варианта ответа</param> /// <param name="dto">Объект с данными для обновления варианта ответа</param>
/// <returns>Результат обновленного варианта ответа</returns> /// <returns>Результат обновленного варианта ответа</returns>
[Authorize] [Authorize]
[HttpPut("{id}")] [HttpPut]
public async Task<IActionResult> Update(int surveyId, int questionId, int id, [FromBody] AnswerVariantUpdateDto dto) [Route("/api/answerVariants/{id:int}")]
public async Task<IActionResult> Update(int id, [FromBody] AnswerVariantUpdateDto dto)
{ {
var model = AnswerVariantMapper.UpdateDtoToModel(dto, questionId, id); var model = AnswerVariantMapper.UpdateDtoToModel(dto, id);
await _answerVariantsService.UpdateAnswerVariantAsync(model); await _answerVariantsService.UpdateAnswerVariantAsync(model);
var result = AnswerVariantMapper.ModelToOutputDto(model); var result = AnswerVariantMapper.ModelToOutputDto(model);
return Ok(result); return Ok(result);
@ -70,13 +69,12 @@ public class AnswerVariantsController : ControllerBase
/// <summary> /// <summary>
/// Удалить вариант ответа на вопрос /// Удалить вариант ответа на вопрос
/// </summary> /// </summary>
/// <param name="surveyId">Идентификатор опроса</param>
/// <param name="questionId">Идентификатор вопроса</param>
/// <param name="id">Идентификатор варианта ответа</param> /// <param name="id">Идентификатор варианта ответа</param>
/// <returns>Результат операции удаления</returns> /// <returns>Результат операции удаления</returns>
[Authorize] [Authorize]
[HttpDelete("{id}")] [HttpDelete]
public async Task<IActionResult> Delete(int surveyId, int questionId, int id) [Route("/api/answerVariants/{id:int}")]
public async Task<IActionResult> Delete(int id)
{ {
await _answerVariantsService.DeleteAnswerVariantAsync(id); await _answerVariantsService.DeleteAnswerVariantAsync(id);
return Ok(); return Ok();

View file

@ -11,10 +11,9 @@ public static class AnswerVariantMapper
Text = dto.Text Text = dto.Text
}; };
public static AnswerVariant UpdateDtoToModel(AnswerVariantUpdateDto dto, int questionId, int answerVariantId) => public static AnswerVariant UpdateDtoToModel(AnswerVariantUpdateDto dto, int answerVariantId) =>
new AnswerVariant new AnswerVariant
{ {
QuestionId = questionId,
Id = answerVariantId, Id = answerVariantId,
Text = dto.Text Text = dto.Text
}; };

View file

@ -69,21 +69,16 @@ public static class QuestionMapper
{ {
Id = questionId, Id = questionId,
Title = dto.Title, Title = dto.Title,
SurveyId = 0, // bad logic, need to do something
}, },
"singleanswerquestion" => new SingleAnswerQuestion "singleanswerquestion" => new SingleAnswerQuestion
{ {
Id = questionId, Id = questionId,
Title = dto.Title, Title = dto.Title,
SurveyId = 0,
AnswerVariants = [],
}, },
"multipleanswerquestion" => new MultipleAnswerQuestion "multipleanswerquestion" => new MultipleAnswerQuestion
{ {
Id = questionId, Id = questionId,
Title = dto.Title, Title = dto.Title,
SurveyId = 0,
AnswerVariants = []
}, },
_ => throw new BadRequestException("Unknown question type") _ => throw new BadRequestException("Unknown question type")
}; };

View file

@ -51,11 +51,13 @@ public class Program
builder.Services.AddScoped<IQuestionRepository, QuestionRepository>(); builder.Services.AddScoped<IQuestionRepository, QuestionRepository>();
builder.Services.AddScoped<IAnswerVariantsRepository, AnswerVariantsRepository>(); builder.Services.AddScoped<IAnswerVariantsRepository, AnswerVariantsRepository>();
builder.Services.AddScoped<ICompletionRepository, CompletionRepository>(); builder.Services.AddScoped<ICompletionRepository, CompletionRepository>();
builder.Services.AddScoped<IAnswerRepository, AnswerRepository>();
builder.Services.AddScoped<ISurveyService, SurveyService>(); builder.Services.AddScoped<ISurveyService, SurveyService>();
builder.Services.AddScoped<IQuestionService, QuestionService>(); builder.Services.AddScoped<IQuestionService, QuestionService>();
builder.Services.AddScoped<IAnswerVariantsService, AnswerVariantsService>(); builder.Services.AddScoped<IAnswerVariantsService, AnswerVariantsService>();
builder.Services.AddScoped<ICompletionService, CompletionService>(); builder.Services.AddScoped<ICompletionService, CompletionService>();
builder.Services.AddScoped<IAnswerService, AnswerService>();
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)

View file

@ -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<IEnumerable<Answer>> GetAnswersByCompletionIdAsync(int completionId)
{
return await _answerRepository.GetAnswersByCompletionIdAsync(completionId);
}
public async Task<IEnumerable<Answer>> GetAnswersByQuestionIdAsync(int questionId)
{
return await _answerRepository.GetAnswersByQuestionIdAsync(questionId);
}
}

View file

@ -22,6 +22,14 @@ public class AnswerVariantsService : IAnswerVariantsService
public async Task UpdateAnswerVariantAsync(AnswerVariant answerVariant) public async Task UpdateAnswerVariantAsync(AnswerVariant answerVariant)
{ {
// TODO: опять проверка существования, но еще и варианта // 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); await _answerVariantsRepository.UpdateAsync(answerVariant);
} }