using DamageAssesment.Api.DocuLinks.Db; using DamageAssesment.Api.DocuLinks.Interfaces; using DamageAssesment.Api.DocuLinks.Models; using DamageAssesment.Api.DocuLinks.Providers; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace DamageAssesment.Api.DocuLinks.Controllers { [ApiController] public class DoculinkController : ControllerBase { private readonly IDoculinkProvider documentsProvider; private readonly IUploadService uploadService; public DoculinkController(IDoculinkProvider documentsProvider,IUploadService uploadService) { this.documentsProvider = documentsProvider; this.uploadService = uploadService; } /// /// Get all Doculink type. /// [HttpGet] [Route("doculinks/types")] [Route("doculinks/types/{language:alpha}")] public async Task GetLinkTypesAsync(string? language) { var result = await this.documentsProvider.GetLinkTypesAsync(language); if (result.IsSuccess) { return Ok(result.LinkTypes); } return NoContent(); } /// /// Get a Doculink type by id. /// [HttpGet] [Route("doculinks/types/{id}")] [Route("doculinks/types/{id}/{language:alpha}")] public async Task GetLinkTypeAsync(int id,string? language) { var result = await this.documentsProvider.GetLinkTypeAsync(id, language); if (result.IsSuccess) { return Ok(result.LinkType); } return NotFound(); } /// /// Update a existing Doculink type. /// [HttpPut] [Route("doculinks/types/{id}")] public async Task UpdateLinkType(int id,Models.LinkType linkType) { if (linkType != null) { var result = await this.documentsProvider.UpdateLinkTypeAsync(id,linkType); if (result.IsSuccess) { return Ok(result.LinkType); } if (result.ErrorMessage == "Not Found") return NotFound(result.ErrorMessage); return BadRequest(result.ErrorMessage); } return CreatedAtRoute("DefaultApi", new { id = linkType.Id }, linkType); } /// /// Create a new Doculink type. /// [HttpPost] [Route("doculinks/types")] public async Task CreateLinkType(Models.LinkType linkType) { if (linkType != null) { var result = await this.documentsProvider.PostLinkTypeAsync(linkType); if (result.IsSuccess) { return Ok(result.LinkType); } return BadRequest(result.ErrorMessage); } return CreatedAtRoute("DefaultApi", new { id = linkType.Id }, linkType); } /// /// Delete a existing Doculink type by id. /// [HttpDelete] [Route("doculinks/types/{id}")] public async Task DeleteLinkType(int id) { var result = await this.documentsProvider.DeleteLinkTypeAsync(id); if (result.IsSuccess) { return Ok(result.LinkType); } return NotFound(); } /// /// Get all Doculink. /// /// [Route("doculinks")] [Route("doculinks/{linktype:alpha}")] [Route("doculinks/{linktype:alpha}/{language:alpha}")] [HttpGet] public async Task GetDocumentsAsync(string? linktype, string? language,bool? isactive) { var result = await this.documentsProvider.GetdocumentsByLinkAsync(linktype, language, isactive); if (result.IsSuccess) { return Ok(result.documents); } return NoContent(); } /// /// Get all active Doculink. /// [Route("doculinks/active")] [Route("doculinks/active/{linktype:alpha}")] [Route("doculinks/active/{linktype:alpha}/{language:alpha}")] [HttpGet] public async Task GetDocumentsByActiveAsync(string? linktype, string? language) { var result = await this.documentsProvider.GetdocumentsByLinkAsync(linktype, language,true); if (result.IsSuccess) { return Ok(result.documents); } return NoContent(); } /// /// Get a Doculink by id. /// [HttpGet] [Route("doculinks/{id}")] [Route("doculinks/{id}/{linktype:alpha}")] [Route("doculinks/{id}/{linktype:alpha}/{language:alpha}")] public async Task GetDocumentAsync(int id,string? linktype, string? language) { var result = await this.documentsProvider.GetDocumentAsync(id, linktype, language); if (result.IsSuccess) { return Ok(result.Document); } return NotFound(); } /// /// update existing doclink. /// [HttpPut] [Route("doculinks/{id}")] public async Task UpdateDocument(int id,ReqDoculink documentInfo) { if (documentInfo != null) { var dbdoc = await this.documentsProvider.GetDocumentByidAsync(id); if (dbdoc.IsSuccess) { var documents = await this.documentsProvider.GetDocumentCounter(); Models.Doculink DocuLink= uploadService.UpdateDocuments(documents.counter,dbdoc.Document, documentInfo); var result = await this.documentsProvider.UpdateDocumentAsync(id, DocuLink); if (result.IsSuccess) { return Ok(result.Document); } return NoContent(); } return NotFound(); } return BadRequest(documentInfo); } /// /// Create new doclink. /// [HttpPost] [Route("doculinks")] public async Task CreateDocument(ReqDoculink documentInfo) { try { if (documentInfo != null) { var documents = await this.documentsProvider.GetDocumentCounter(); Models.Doculink DocuLink= uploadService.UploadDocument(documents.counter, documentInfo); var result = await this.documentsProvider.PostDocumentAsync(DocuLink); if (result.IsSuccess) { return Ok(result.Document); } return NoContent(); } return BadRequest(documentInfo); } catch (Exception ex) { return BadRequest($"Internal server error: {ex}"); } } /// /// Delete Doculink by id. /// [HttpDelete] [Route("doculinks/{id}")] public async Task DeleteDocument(int id) { // database soft delete var result = await this.documentsProvider.DeleteDocumentAsync(id); if (result.IsSuccess) { // deleting file from folder foreach (var item in result.Document.doclinksAttachments) { uploadService.Movefile(item.Path); } return Ok(result.Document); } return NotFound(); } } }