using DamageAssesment.Api.Documents.Db; using DamageAssesment.Api.Documents.Interfaces; using DamageAssesment.Api.Documents.Models; using DamageAssesment.Api.Documents.Providers; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace DamageAssesment.Api.Documents.Controllers { [ApiController] public class DocumentsController : ControllerBase { private readonly IDocumentsProvider documentsProvider; private readonly IUploadService uploadService; public DocumentsController(IDocumentsProvider documentsProvider,IUploadService uploadService) { this.documentsProvider = documentsProvider; this.uploadService = uploadService; } /// /// Get all document link type. /// [HttpGet] [Route("doculinks/types")] public async Task GetLinkTypesAsync() { var result = await this.documentsProvider.GetLinkTypesAsync(); if (result.IsSuccess) { return Ok(result.LinkTypes); } return NoContent(); } /// /// Get a document link type by id. /// [HttpGet] [Route("doculinks/types/{id}")] public async Task GetLinkTypeAsync(int id) { var result = await this.documentsProvider.GetLinkTypeAsync(id); if (result.IsSuccess) { return Ok(result.LinkType); } return NotFound(); } /// /// Update a existing document link type. /// [HttpPut] [Route("doculinks/types")] public async Task UpdateLinkType(Models.LinkType linkType) { if (linkType != null) { var result = await this.documentsProvider.UpdateLinkTypeAsync(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 document link 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 document link 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 documents. /// /// [Route("doculinks")] [Route("doculinks/{linktype:alpha}")] [Route("doculinks/{linktype:alpha}/{language:alpha}")] [HttpGet] public async Task GetDocumentsAsync(string? linktype, string? language) { var result = await this.documentsProvider.GetdocumentsByLinkAsync(linktype, language); if (result.IsSuccess) { return Ok(result.documents); } return NoContent(); } /// /// Get all documents. /// /// //[Route("doculinks/{language:alpha}")] //[Route("doculinks")] //[HttpGet] //public async Task GetDocumentsAsync(string? language) //{ // var result = await this.documentsProvider.GetdocumentsAsync(language); // if (result.IsSuccess) // { // return Ok(result.documents); // } // return NoContent(); //} /// /// Get a document 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(); } /// /// Upload new document. /// [HttpPut] [Route("doculinks/{id}")] public async Task UpdateDocument(int id,DocumentInfo documentInfo) { if (documentInfo != null) { var dbdoc = await this.documentsProvider.GetDocumentByidAsync(id); if (dbdoc.IsSuccess) { Models.Document document = uploadService.UpdateDocuments(dbdoc.Document, documentInfo); var result = await this.documentsProvider.UpdateDocumentAsync(id,document); if (result.IsSuccess) { return Ok(result.Document); } return NoContent(); } return NotFound(); } return BadRequest(documentInfo); } /// /// update existing document. /// [HttpPost] [Route("doculinks")] public async Task CreateDocument(DocumentInfo documentInfo) { try { if (documentInfo != null) { var documents = await this.documentsProvider.GetDocumentCounter(); Models.Document document = uploadService.UploadDocument(documents.counter, documentInfo); var result = await this.documentsProvider.PostDocumentAsync(document); if (result.IsSuccess) { return Ok(result.Document); } return NoContent(); } return BadRequest(documentInfo); } catch (Exception ex) { return BadRequest($"Internal server error: {ex}"); } } /// /// Delete document 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 uploadService.Movefile(result.Document.Path); return Ok(result.Document); } return NotFound(); } } }