diff --git a/DotPrompt.Sql/SqlPromptRepository.cs b/DotPrompt.Sql/SqlPromptRepository.cs index fbf9b37..1068ab2 100644 --- a/DotPrompt.Sql/SqlPromptRepository.cs +++ b/DotPrompt.Sql/SqlPromptRepository.cs @@ -131,8 +131,66 @@ public IEnumerable Load() } /// - public Task GetLatestPromptByName(string promptName) + public async Task GetLatestPromptByName(string promptName) { - throw new NotImplementedException(); + // Load the SQL query to fetch the latest prompt by name + string? query = DatabaseConfigReader.LoadQuery("GetLatestPromptByName.sql"); + if (string.IsNullOrEmpty(query)) + { + throw new InvalidOperationException( + "Failed to load SQL query file 'GetLatestPromptByName.sql'. The file could not be found or loaded."); + } + + // Retrieve the prompt row + var prompt = await _connection.QueryFirstOrDefaultAsync( + query, + new { PromptName = promptName } + ); + + if (prompt == null) + { + return null; + } + + // Query to fetch parameters and defaults for the latest version of this prompt + const string parameterQuery = @" + WITH LatestVersion AS ( + SELECT MAX(VersionNumber) AS VersionNumber + FROM PromptParameters + WHERE PromptId = @PromptId + ) + SELECT pp.ParameterName, pp.ParameterValue, pd.DefaultValue + FROM PromptParameters pp + LEFT JOIN ParameterDefaults pd ON pp.ParameterId = pd.ParameterId AND pp.VersionNumber = pd.VersionNumber + CROSS JOIN LatestVersion + WHERE pp.PromptId = @PromptId + AND pp.VersionNumber = LatestVersion.VersionNumber;"; + + var parameters = await _connection.QueryAsync( + parameterQuery, + new { PromptId = prompt.PromptId } + ); + + prompt.Parameters = new Dictionary(); + prompt.Default = new Dictionary(); + + foreach (var param in parameters) + { + if (string.IsNullOrEmpty(param.ParameterName)) return prompt; + if (!prompt.Parameters.ContainsKey(param.ParameterName)) + { + prompt.Parameters.Add(param.ParameterName, param.ParameterValue); + } + + if (param.DefaultValue == null || prompt.Default.ContainsKey(param.ParameterName)) return prompt; + prompt.Parameters.TryAdd(param.ParameterName, param.ParameterValue); + + if (param.DefaultValue != null) + { + prompt.Default.TryAdd(param.ParameterName, param.DefaultValue); + } + } + + return prompt; } } \ No newline at end of file