using System; using System.Collections.Generic; using System.Threading.Tasks; using AutoMapper; using DevHive.Services.Interfaces; using DevHive.Services.Models.Language; using DevHive.Web.Models.Language; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace DevHive.Web.Controllers { /// /// All endpoints for interacting with the language layer /// [ApiController] [Route("/api/[controller]")] public class LanguageController { private readonly ILanguageService _languageService; private readonly IMapper _languageMapper; public LanguageController(ILanguageService languageService, IMapper mapper) { this._languageService = languageService; this._languageMapper = mapper; } /// /// Create a new language, so users can have a choice. Admin only! /// /// The new language's parametars /// The new language's Id [HttpPost] [Authorize(Roles = "Admin")] public async Task Create([FromBody] CreateLanguageWebModel createLanguageWebModel) { CreateLanguageServiceModel languageServiceModel = this._languageMapper.Map(createLanguageWebModel); Guid id = await this._languageService.CreateLanguage(languageServiceModel); return id == Guid.Empty ? new BadRequestObjectResult($"Could not create language {createLanguageWebModel.Name}") : new OkObjectResult(new { Id = id }); } /// /// Query full language data by Id /// /// The language's Id /// Full language data [HttpGet] [AllowAnonymous] public async Task GetById(Guid id) { ReadLanguageServiceModel languageServiceModel = await this._languageService.GetLanguageById(id); ReadLanguageWebModel languageWebModel = this._languageMapper.Map(languageServiceModel); return new OkObjectResult(languageWebModel); } /// /// Query all languages in the database /// /// All languages in the database [HttpGet] [Route("GetLanguages")] [Authorize(Roles = "User,Admin")] public IActionResult GetAllExistingLanguages() { HashSet languageServiceModels = this._languageService.GetLanguages(); HashSet languageWebModels = this._languageMapper.Map>(languageServiceModels); return new OkObjectResult(languageWebModels); } /// /// Alter language's properties. Admin only! /// /// The language's Id /// The langauge's new parametars /// Ok result [HttpPut] [Authorize(Roles = "Admin")] public async Task Update(Guid id, [FromBody] UpdateLanguageWebModel updateModel) { UpdateLanguageServiceModel updatelanguageServiceModel = this._languageMapper.Map(updateModel); updatelanguageServiceModel.Id = id; bool result = await this._languageService.UpdateLanguage(updatelanguageServiceModel); if (!result) return new BadRequestObjectResult("Could not update Language"); return new OkResult(); } /// /// Delete a language. Admin only! /// /// The language's Id /// Ok result [HttpDelete] [Authorize(Roles = "Admin")] public async Task Delete(Guid langaugeId) { bool result = await this._languageService.DeleteLanguage(langaugeId); if (!result) return new BadRequestObjectResult("Could not delete Language"); return new OkResult(); } } }