using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Strata.Stratasphere.Biz.DataManagement; using Strata.Stratasphere.Biz.DataManagement.Models; using Strata.Stratasphere.Biz.Queries; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace Strata.Stratasphere.Api.Controllers { [ApiController] [ApiVersion("1.0")] [Route("api/v{api-version:apiVersion}/[controller]")] public class QueriesController : ControllerBase { private readonly DataManagementContext _dataManagementContext; private readonly IQueryService _queryService; private bool QueryExists(int queryId) => _dataManagementContext.Queries.Any(e => e.QueryId == queryId); public QueriesController(DataManagementContext dataManagementContext, IQueryService queryService) { _dataManagementContext = dataManagementContext; _queryService = queryService; } [HttpGet] [ProducesResponseType(StatusCodes.Status200OK)] public async Task> GetAll(CancellationToken cancellationToken) { var queries = await _dataManagementContext.Queries.ToListAsync(cancellationToken); return queries; } [HttpGet("{queryId}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesDefaultResponseType] public async Task> GetById(int queryId, CancellationToken cancellationToken) { var query = await _dataManagementContext.Queries.SingleOrDefaultAsync(p => p.QueryId == queryId, cancellationToken); if (query == null) { return NotFound(); } return query; } [HttpGet("{queryId}/[action]")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesDefaultResponseType] public async Task> Copy(int queryId, CancellationToken cancellationToken) { return await _queryService.Copy(queryId, cancellationToken); } [HttpPost] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesDefaultResponseType] public async Task> Create([FromBody] Query query, CancellationToken cancellationToken) { return await _queryService.Create(query, cancellationToken); } [HttpPut("{queryId}")] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesDefaultResponseType] public async Task Update(int queryId, Query queryDto, CancellationToken cancellationToken) { if (queryId != queryDto.QueryId) { return BadRequest(); } var updated = await _queryService.Update(queryDto, cancellationToken); if (!updated) { return NotFound(); } return NoContent(); } [HttpGet("{queryId}/[action]")] public async Task SaveToGithub(int queryId, CancellationToken cancellationToken) { if (queryId < 0) { return false; } var user = User?.Identity?.Name ?? ""; return await _queryService.SaveToGithub(queryId, user, cancellationToken); } [HttpDelete("{queryId}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesDefaultResponseType] public async Task Delete(int queryId, CancellationToken token) { var query = await _dataManagementContext.Queries.SingleOrDefaultAsync(p => p.QueryId == queryId, token); if (query == null) { return NotFound(); } _dataManagementContext.Remove(query); await _dataManagementContext.SaveChangesAsync(token); return NoContent(); } [HttpGet("{queryId}/[action]")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesDefaultResponseType] public async Task History(int queryId, CancellationToken cancellationToken) => Ok(await _queryService.History(queryId, User?.Identity?.Name ?? "")); } }