add AnswerVariant

This commit is contained in:
Вячеслав 2025-05-20 17:35:43 +05:00
parent 8a80013c94
commit ae43e8c74c
10 changed files with 139 additions and 5 deletions

View file

@ -0,0 +1,84 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SurveyBackend.DTOs.AnswerVariant;
using SurveyBackend.Mappers;
using SurveyLib.Core.Services;
namespace SurveyBackend.Controllers;
[ApiController]
[Route("api/surveys/{surveyId}/questions/{questionId}/answerVariants")]
public class AnswerVariantsController : ControllerBase
{
private readonly IAnswerVariantsService _answerVariantsService;
public AnswerVariantsController(IAnswerVariantsService answerVariantsService)
{
_answerVariantsService = answerVariantsService;
}
/// <summary>
/// Получить варианты ответа на вопрос
/// </summary>
/// <param name="surveyId"></param>
/// <param name="questionId"></param>
/// <returns></returns>
[AllowAnonymous]
[HttpGet]
public async Task<IActionResult> Get(int surveyId, int questionId)
{
var answerVariants = await _answerVariantsService.GetAnswerVariantsByQuestionIdAsync(questionId);
var result = answerVariants.Select(AnswerVariantMapper.ModelToOutputDto);
return Ok(result);
}
/// <summary>
/// Добавить новый вариант ответа для вопроса
/// </summary>
/// <param name="surveyId">Идентификатор опроса</param>
/// <param name="questionId">Идентификатор вопроса</param>
/// <param name="dto">Объект с данными для создания варианта ответа</param>
/// <returns>Результат операции добавления</returns>
[Authorize]
[HttpPost]
public async Task<IActionResult> Add(int surveyId, int questionId, [FromBody] AnswerVariantCreateDto dto)
{
var model = AnswerVariantMapper.CreateDtoToModel(dto, questionId);
await _answerVariantsService.AddAnswerVariantAsync(model);
var result = AnswerVariantMapper.ModelToOutputDto(model);
return Ok(result);
}
/// <summary>
/// Обновить вариант ответа на вопрос
/// </summary>
/// <param name="surveyId">Идентификатор опроса</param>
/// <param name="questionId">Идентификатор вопроса</param>
/// <param name="id">Идентификатор варианта ответа</param>
/// <param name="dto">Объект с данными для обновления варианта ответа</param>
/// <returns>Результат обновленного варианта ответа</returns>
[Authorize]
[HttpPut("{id}")]
public async Task<IActionResult> Update(int surveyId, int questionId, int id, [FromBody] AnswerVariantUpdateDto dto)
{
var model = AnswerVariantMapper.UpdateDtoToModel(dto, questionId, id);
await _answerVariantsService.UpdateAnswerVariantAsync(model);
var result = AnswerVariantMapper.ModelToOutputDto(model);
return Ok(result);
}
/// <summary>
/// Удалить вариант ответа на вопрос
/// </summary>
/// <param name="surveyId">Идентификатор опроса</param>
/// <param name="questionId">Идентификатор вопроса</param>
/// <param name="id">Идентификатор варианта ответа</param>
/// <returns>Результат операции удаления</returns>
[Authorize]
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(int surveyId, int questionId, int id)
{
await _answerVariantsService.DeleteAnswerVariantAsync(id);
return Ok();
}
}

View file

@ -0,0 +1,6 @@
namespace SurveyBackend.DTOs.AnswerVariant;
public class AnswerVariantCreateDto
{
public required string Text { get; set; }
}

View file

@ -1,9 +1,9 @@
namespace SurveyBackend.DTOs.Question; namespace SurveyBackend.DTOs.AnswerVariant;
/// <summary> /// <summary>
/// Выходная схема вариантов ответа /// Выходная схема вариантов ответа
/// </summary> /// </summary>
public class OutputAnswerVariantDto public class AnswerVariantOutputDto
{ {
/// <summary> /// <summary>
/// ID варианта ответа /// ID варианта ответа

View file

@ -0,0 +1,5 @@
namespace SurveyBackend.DTOs.AnswerVariant;
public class AnswerVariantUpdateDto : AnswerVariantCreateDto
{
}

View file

@ -1,3 +1,5 @@
using SurveyBackend.DTOs.AnswerVariant;
namespace SurveyBackend.DTOs.Question; namespace SurveyBackend.DTOs.Question;
/// <summary> /// <summary>
@ -28,5 +30,5 @@ public class QuestionOutputDto
/// <summary> /// <summary>
/// Варианты ответа /// Варианты ответа
/// </summary> /// </summary>
public List<OutputAnswerVariantDto>? AnswerVariants { get; set; } public List<AnswerVariantOutputDto>? AnswerVariants { get; set; }
} }

View file

@ -9,16 +9,21 @@ public class SurveyOutputDto
/// ID опроса /// ID опроса
/// </summary> /// </summary>
public required int Id { get; set; } public required int Id { get; set; }
/// <summary> /// <summary>
/// Название опроса /// Название опроса
/// </summary> /// </summary>
public required string Title { get; set; } public required string Title { get; set; }
/// <summary> /// <summary>
/// Описание опроса /// Описание опроса
/// </summary> /// </summary>
public required string Description { get; set; } public required string Description { get; set; }
/// <summary> /// <summary>
/// Создатель опроса (опционально) /// Создатель опроса (опционально)
/// </summary> /// </summary>
public int? CreatedBy { get; set; } public int? CreatedBy { get; set; }
public required DateTime CreatedAt { get; set; }
} }

View file

@ -0,0 +1,28 @@
using SurveyBackend.DTOs.AnswerVariant;
using SurveyLib.Core.Models;
namespace SurveyBackend.Mappers;
public static class AnswerVariantMapper
{
public static AnswerVariant CreateDtoToModel(AnswerVariantCreateDto dto, int questionId) => new AnswerVariant
{
QuestionId = questionId,
Text = dto.Text
};
public static AnswerVariant UpdateDtoToModel(AnswerVariantUpdateDto dto, int answerVariantId, int questionId) =>
new AnswerVariant
{
QuestionId = questionId,
Id = answerVariantId,
Text = dto.Text
};
public static AnswerVariantOutputDto ModelToOutputDto(AnswerVariant model) => new AnswerVariantOutputDto
{
Id = model.Id,
QuestionId = model.QuestionId,
Text = model.Text
};
}

View file

@ -1,3 +1,4 @@
using SurveyBackend.DTOs.AnswerVariant;
using SurveyBackend.DTOs.Question; using SurveyBackend.DTOs.Question;
using SurveyBackend.Services.Exceptions; using SurveyBackend.Services.Exceptions;
using SurveyLib.Core.Models; using SurveyLib.Core.Models;
@ -88,9 +89,9 @@ public static class QuestionMapper
}; };
} }
private static List<OutputAnswerVariantDto> AnswerVariantsToDto(IEnumerable<AnswerVariant> answerVariants) private static List<AnswerVariantOutputDto> AnswerVariantsToDto(IEnumerable<AnswerVariant> answerVariants)
{ {
return answerVariants.Select(av => new OutputAnswerVariantDto return answerVariants.Select(av => new AnswerVariantOutputDto
{ {
Id = av.Id, Id = av.Id,
QuestionId = av.QuestionId, QuestionId = av.QuestionId,

View file

@ -45,6 +45,7 @@ public static class SurveyMapper
Title = survey.Title, Title = survey.Title,
Description = survey.Description, Description = survey.Description,
CreatedBy = survey.CreatedBy, CreatedBy = survey.CreatedBy,
CreatedAt = survey.CreatedAt,
}; };
} }
} }

View file

@ -48,9 +48,11 @@ public class Program
builder.Services.AddScoped<ISurveyRepository, SurveyRepository>(); builder.Services.AddScoped<ISurveyRepository, SurveyRepository>();
builder.Services.AddScoped<IQuestionRepository, QuestionRepository>(); builder.Services.AddScoped<IQuestionRepository, QuestionRepository>();
builder.Services.AddScoped<IAnswerVariantsRepository, AnswerVariantsRepository>();
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.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)