diff --git a/API_SQLuedo/API/Controllers/QueryController.cs b/API_SQLuedo/API/Controllers/QueryController.cs index 9ab92d7..e0fdb81 100644 --- a/API_SQLuedo/API/Controllers/QueryController.cs +++ b/API_SQLuedo/API/Controllers/QueryController.cs @@ -28,5 +28,38 @@ namespace API.Controllers logger.LogInformation("[INFORMATION] La requête a renvoyé : {result} ", 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); + } } } diff --git a/API_SQLuedo/API/Service/QueryDataServiceApi.cs b/API_SQLuedo/API/Service/QueryDataServiceApi.cs index e2e8f3c..284b79c 100644 --- a/API_SQLuedo/API/Service/QueryDataServiceApi.cs +++ b/API_SQLuedo/API/Service/QueryDataServiceApi.cs @@ -6,6 +6,7 @@ using Shared; using Shared.Mapper; using System.Text; using Newtonsoft.Json; +using Microsoft.EntityFrameworkCore.Metadata.Internal; namespace API.Service; @@ -21,49 +22,150 @@ public class QueryDataServiceApi : IQueryService return new QueryDto { Result = "Le nom de la base de données est requis." }; } - using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) + try { - connection.Open(); - using (NpgsqlCommand command = new NpgsqlCommand(query, connection)) + using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) { - using (NpgsqlDataReader reader = command.ExecuteReader()) + connection.Open(); + using (NpgsqlCommand command = new NpgsqlCommand(query, connection)) { - List> resultList = new List>(); - - - List columnNames = new List(); - for (int i = 0; i < reader.FieldCount; i++) + using (NpgsqlDataReader reader = command.ExecuteReader()) { - columnNames.Add(reader.GetName(i)); - } + List> resultList = new List>(); - while (reader.Read()) - { - Dictionary row = new Dictionary(); + + List columnNames = new List(); for (int i = 0; i < reader.FieldCount; i++) { - row[columnNames[i]] = reader[i].ToString(); + columnNames.Add(reader.GetName(i)); } - resultList.Add(row); - } + while (reader.Read()) + { + Dictionary row = new Dictionary(); + for (int i = 0; i < reader.FieldCount; i++) + { + row[columnNames[i]] = reader[i].ToString(); + } + + resultList.Add(row); + } - string resultJson = JsonConvert.SerializeObject(resultList); + string resultJson = JsonConvert.SerializeObject(resultList); - QueryDto queryDto = new QueryDto { Result = resultJson }; - return queryDto; + QueryDto queryDto = new QueryDto { Result = resultJson }; + return queryDto; + } } } } + catch (Exception ex) + { + return new QueryDto { Result = ex.Message }; + } } - public IEnumerable 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 tableNames = new List(); + + while (reader.Read()) + { + tableNames.Add(reader["table_name"].ToString()); + } + + Dictionary tablesDict = new Dictionary(); + foreach (string tableName in tableNames) + { + tablesDict[tableName] = tableName; + } + + string tablesJson = JsonConvert.SerializeObject(tablesDict); + + QueryDto queryDto = new QueryDto { Result = tablesJson }; + return queryDto; + } + } + } + } + catch (Exception ex) + { + return new QueryDto { Result = ex.Message }; + } } - public IEnumerable GetColumns(string database, string table) + public QueryDto GetColumns(string database, string table) { - throw new NotImplementedException(); + 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 columnsNames = new List(); + + while (reader.Read()) + { + columnsNames.Add(reader["column_name"].ToString()); + } + + Dictionary columnsDict = new Dictionary(); + foreach (string colName in columnsNames) + { + columnsDict[colName] = colName; + } + + string tablesJson = JsonConvert.SerializeObject(columnsDict); + + Console.WriteLine(tablesJson); + + QueryDto queryDto = new QueryDto { Result = tablesJson }; + return queryDto; + } + } + } + } } \ No newline at end of file diff --git a/API_SQLuedo/Shared/IQueryService.cs b/API_SQLuedo/Shared/IQueryService.cs index 85ecdf2..d09ec6e 100644 --- a/API_SQLuedo/Shared/IQueryService.cs +++ b/API_SQLuedo/Shared/IQueryService.cs @@ -5,13 +5,14 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Dto; namespace Shared { public interface IQueryService { public TQuery ExecuteQuery(string query, string database); - public IEnumerable GetTables(string database); - public IEnumerable GetColumns(string database,string table); + public QueryDto GetTables(string database); + public QueryDto GetColumns(string database,string table); } }