going to question management
This commit is contained in:
parent
00e93fde2e
commit
585d6ac6e3
7 changed files with 150 additions and 0 deletions
|
|
@ -0,0 +1,37 @@
|
||||||
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using SurveyBackend.Core.Contexts;
|
||||||
|
using SurveyBackend.DTOs.Question;
|
||||||
|
using SurveyBackend.Mappers.QuestionDTOs;
|
||||||
|
using SurveyLib.Core.Services;
|
||||||
|
|
||||||
|
namespace SurveyBackend.Controllers;
|
||||||
|
|
||||||
|
[ApiController]
|
||||||
|
[Route("api/questions")]
|
||||||
|
public class QuestionController : ControllerBase
|
||||||
|
{
|
||||||
|
private readonly IQuestionService _questionService;
|
||||||
|
|
||||||
|
public QuestionController(IQuestionService questionService, IUserContext userContext)
|
||||||
|
{
|
||||||
|
_questionService = questionService;
|
||||||
|
}
|
||||||
|
|
||||||
|
[AllowAnonymous]
|
||||||
|
[HttpGet("by_survey/{id}")]
|
||||||
|
public async Task<IActionResult> GetBySurveyId(int id)
|
||||||
|
{
|
||||||
|
var result = await _questionService.GetQuestionsBySurveyIdAsync(id);
|
||||||
|
return Ok(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Authorize]
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<IActionResult> AddQuestion(CreateQuestionDTO dto)
|
||||||
|
{
|
||||||
|
var model = QuestionCreationMapper.QuestionCreationToModel(dto);
|
||||||
|
await _questionService.AddQuestionAsync(model);
|
||||||
|
return Ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
namespace SurveyBackend.DTOs.Question;
|
||||||
|
|
||||||
|
public class CreateQuestionDTO
|
||||||
|
{
|
||||||
|
public required string Title { get; set; }
|
||||||
|
public required int SurveyId { get; set; }
|
||||||
|
public required string QuestionType { get; set; }
|
||||||
|
|
||||||
|
public List<string>? AnswerVariants { get; set; }
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
using SurveyBackend.DTOs.Question;
|
||||||
|
using SurveyBackend.Services.Exceptions;
|
||||||
|
using SurveyLib.Core.Models;
|
||||||
|
using SurveyLib.Core.Models.QuestionVariants;
|
||||||
|
|
||||||
|
namespace SurveyBackend.Mappers.QuestionDTOs;
|
||||||
|
|
||||||
|
public static class QuestionCreationMapper
|
||||||
|
{
|
||||||
|
public static QuestionBase QuestionCreationToModel(CreateQuestionDTO dto)
|
||||||
|
{
|
||||||
|
return dto.QuestionType.ToLower() switch
|
||||||
|
{
|
||||||
|
"text" => new TextQuestion
|
||||||
|
{
|
||||||
|
Title = dto.Title,
|
||||||
|
SurveyId = dto.SurveyId,
|
||||||
|
},
|
||||||
|
"single" => new SingleAnswerQuestion
|
||||||
|
{
|
||||||
|
Title = dto.Title,
|
||||||
|
SurveyId = dto.SurveyId,
|
||||||
|
AnswerVariants = dto.AnswerVariants?.Select(v => new AnswerVariant { Text = v }).ToList() ?? [],
|
||||||
|
},
|
||||||
|
"multiple" => new MultipleAnswerQuestion
|
||||||
|
{
|
||||||
|
Title = dto.Title,
|
||||||
|
SurveyId = dto.SurveyId,
|
||||||
|
AnswerVariants = dto.AnswerVariants?.Select(v => new AnswerVariant { Text = v }).ToList() ?? []
|
||||||
|
},
|
||||||
|
_ => throw new BadRequestException("Unknown question type")
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -45,7 +45,10 @@ public class Program
|
||||||
builder.Services.AddScoped<IAuthorizationService, AuthorizationService>();
|
builder.Services.AddScoped<IAuthorizationService, AuthorizationService>();
|
||||||
|
|
||||||
builder.Services.AddScoped<ISurveyRepository, SurveyRepository>();
|
builder.Services.AddScoped<ISurveyRepository, SurveyRepository>();
|
||||||
|
builder.Services.AddScoped<IQuestionRepository, QuestionRepository>();
|
||||||
|
|
||||||
builder.Services.AddScoped<ISurveyService, SurveyService>();
|
builder.Services.AddScoped<ISurveyService, SurveyService>();
|
||||||
|
builder.Services.AddScoped<IQuestionService, QuestionService>();
|
||||||
|
|
||||||
|
|
||||||
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
|
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
namespace SurveyBackend.Services.Exceptions;
|
||||||
|
|
||||||
|
public class BadRequestException : ServiceException
|
||||||
|
{
|
||||||
|
public override int StatusCode => 400;
|
||||||
|
|
||||||
|
public BadRequestException(string message) : base(message)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
using SurveyBackend.Core.Contexts;
|
||||||
|
using SurveyBackend.Services.Exceptions;
|
||||||
|
using SurveyLib.Core.Models;
|
||||||
|
using SurveyLib.Core.Repositories;
|
||||||
|
using SurveyLib.Core.Services;
|
||||||
|
|
||||||
|
namespace SurveyBackend.Services.Services;
|
||||||
|
|
||||||
|
public class QuestionService : IQuestionService
|
||||||
|
{
|
||||||
|
private readonly IQuestionRepository _questionRepository;
|
||||||
|
|
||||||
|
public QuestionService(IQuestionRepository questionRepository, IUserContext userContext)
|
||||||
|
{
|
||||||
|
_questionRepository = questionRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task AddQuestionAsync(QuestionBase question)
|
||||||
|
{
|
||||||
|
await _questionRepository.AddAsync(question);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateQuestionAsync(QuestionBase question)
|
||||||
|
{
|
||||||
|
await _questionRepository.UpdateAsync(question);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DeleteQuestionAsync(int id)
|
||||||
|
{
|
||||||
|
var question = await _questionRepository.GetByIdAsync(id);
|
||||||
|
if (question is null)
|
||||||
|
{
|
||||||
|
throw new NotFoundException("Question not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
await _questionRepository.DeleteAsync(question);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<QuestionBase> GetQuestionByIdAsync(int id)
|
||||||
|
{
|
||||||
|
var question = await _questionRepository.GetByIdAsync(id);
|
||||||
|
if (question is null)
|
||||||
|
{
|
||||||
|
throw new NotFoundException("Question not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
return question;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<QuestionBase>> GetQuestionsBySurveyIdAsync(int surveyId)
|
||||||
|
{
|
||||||
|
return await _questionRepository.GetQuestionsBySurveyId(surveyId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -42,6 +42,8 @@ public class SurveyService : ISurveyService
|
||||||
{
|
{
|
||||||
throw new UnauthorizedAccessException("You are not authorized to delete this survey.");
|
throw new UnauthorizedAccessException("You are not authorized to delete this survey.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await _surveyRepository.DeleteAsync(survey);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<Survey>> GetSurveysAsync()
|
public async Task<IEnumerable<Survey>> GetSurveysAsync()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue