Ajout de getTables et getColumns pour le queryController
continuous-integration/drone/push Build is passing Details

deploiement^2^2
Maxime SAPOUNTZIS 1 year ago
parent 4e60b51384
commit 0161832d9e

@ -28,5 +28,38 @@ namespace API.Controllers
logger.LogInformation("[INFORMATION] La requête a renvoyé : {result} ", queryResult); logger.LogInformation("[INFORMATION] La requête a renvoyé : {result} ", queryResult);
return Ok(queryResult); return Ok(queryResult);
} }
[HttpGet("{database}/Tables")]
[ProducesResponseType(typeof(QueryDto), 200)]
[ProducesResponseType(typeof(string), 204)]
public IActionResult GetTables(string database)
{
var queryResult = queryService.GetTables(database);
if (queryResult == null)
{
logger.LogError("[ERREUR] La requête n'a rien renvoyé.");
return StatusCode(204);
}
logger.LogInformation("[INFORMATION] La requête a renvoyé : {result} ", queryResult);
return Ok(queryResult);
}
[HttpGet("{database}/{table}/Columns")]
[ProducesResponseType(typeof(QueryDto), 200)]
[ProducesResponseType(typeof(string), 204)]
public IActionResult GetColumns(string database,string table)
{
var queryResult = queryService.GetColumns(database,table);
if (queryResult == null)
{
logger.LogError("[ERREUR] La requête n'a rien renvoyé.");
return StatusCode(204);
}
logger.LogInformation("[INFORMATION] La requête a renvoyé : {result} ", queryResult);
return Ok(queryResult);
}
} }
} }

@ -6,6 +6,7 @@ using Shared;
using Shared.Mapper; using Shared.Mapper;
using System.Text; using System.Text;
using Newtonsoft.Json; using Newtonsoft.Json;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
namespace API.Service; namespace API.Service;
@ -21,6 +22,8 @@ public class QueryDataServiceApi : IQueryService<QueryDto>
return new QueryDto { Result = "Le nom de la base de données est requis." }; return new QueryDto { Result = "Le nom de la base de données est requis." };
} }
try
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
{ {
connection.Open(); connection.Open();
@ -56,14 +59,113 @@ public class QueryDataServiceApi : IQueryService<QueryDto>
} }
} }
} }
catch (Exception ex)
{
return new QueryDto { Result = ex.Message };
}
}
public IEnumerable<string> GetTables(string database) public QueryDto GetTables(string database)
{ {
throw new NotImplementedException(); string connectionString =
$"Host=localhost;Username=admin;Password=motdepasse;Database={database}";
try
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
{
connection.Open();
using (NpgsqlCommand command = new NpgsqlCommand())
{
command.Connection = connection;
// Donner et exclure les bonnes permissions au rôle en question
// GRANT SELECT ON TABLE information_schema.tables TO votre_utilisateur;
// GRANT SELECT ON TABLE information_schema.columns TO votre_utilisateur;
// REVOKE ALL ON SCHEMA information_schema FROM PUBLIC;
command.CommandText =
"SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';";
using (NpgsqlDataReader reader = command.ExecuteReader())
{
List<string> tableNames = new List<string>();
while (reader.Read())
{
tableNames.Add(reader["table_name"].ToString());
}
Dictionary<string, string> tablesDict = new Dictionary<string, string>();
foreach (string tableName in tableNames)
{
tablesDict[tableName] = tableName;
} }
public IEnumerable<string> GetColumns(string database, string table) string tablesJson = JsonConvert.SerializeObject(tablesDict);
QueryDto queryDto = new QueryDto { Result = tablesJson };
return queryDto;
}
}
}
}
catch (Exception ex)
{ {
throw new NotImplementedException(); return new QueryDto { Result = ex.Message };
}
}
public QueryDto GetColumns(string database, string table)
{
string connectionString =
$"Host=localhost;Username=admin;Password=motdepasse;Database={database}";
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
{
connection.Open();
using (NpgsqlCommand command = new NpgsqlCommand())
{
command.Connection = connection;
// Donner et exclure les bonnes permissions au rôle en question
//GRANT SELECT ON TABLE information_schema.tables TO votre_utilisateur;
//GRANT SELECT ON TABLE information_schema.columns TO votre_utilisateur;
//REVOKE ALL ON SCHEMA information_schema FROM PUBLIC;
command.CommandText =
$"SELECT column_name FROM information_schema.columns WHERE table_name = '{table}';";
Console.WriteLine(command.CommandText);
using (NpgsqlDataReader reader = command.ExecuteReader())
{
List<string> columnsNames = new List<string>();
while (reader.Read())
{
columnsNames.Add(reader["column_name"].ToString());
}
Dictionary<string, string> columnsDict = new Dictionary<string, string>();
foreach (string colName in columnsNames)
{
columnsDict[colName] = colName;
}
string tablesJson = JsonConvert.SerializeObject(columnsDict);
Console.WriteLine(tablesJson);
QueryDto queryDto = new QueryDto { Result = tablesJson };
return queryDto;
}
}
}
} }
} }

@ -5,13 +5,14 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Dto;
namespace Shared namespace Shared
{ {
public interface IQueryService<TQuery> public interface IQueryService<TQuery>
{ {
public TQuery ExecuteQuery(string query, string database); public TQuery ExecuteQuery(string query, string database);
public IEnumerable<string> GetTables(string database); public QueryDto GetTables(string database);
public IEnumerable<string> GetColumns(string database,string table); public QueryDto GetColumns(string database,string table);
} }
} }

Loading…
Cancel
Save