using System; using System.Net.Http; using System.Text; using System.Threading.Tasks; using System.Web; using System.Text.Json; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Configuration; using System.Reflection.Metadata.Ecma335; using Shared.Models; namespace Client; public class Client { public string baseUri; public string apiKey; public string searchdomain; public Client(string baseUri, string apiKey = "", string searchdomain = "") { this.baseUri = baseUri; this.apiKey = apiKey; this.searchdomain = searchdomain; } public Client(IConfiguration configuration) { string? baseUri = configuration.GetSection("Embeddingsearch").GetValue("BaseUri"); string? apiKey = configuration.GetSection("Embeddingsearch").GetValue("ApiKey"); string? searchdomain = configuration.GetSection("Embeddingsearch").GetValue("Searchdomain"); this.baseUri = baseUri ?? ""; this.apiKey = apiKey ?? ""; this.searchdomain = searchdomain ?? ""; } public async Task SearchdomainListAsync() { return await GetUrlAndProcessJson(GetUrl($"{baseUri}/Searchdomain", "List", apiKey, [])); } public async Task SearchdomainDeleteAsync() { return await SearchdomainDeleteAsync(searchdomain); } public async Task SearchdomainDeleteAsync(string searchdomain) { return await GetUrlAndProcessJson(GetUrl($"{baseUri}/Searchdomain", "Delete", apiKey, new Dictionary() { {"searchdomain", searchdomain} })); } public async Task SearchdomainCreateAsync() { return await SearchdomainCreateAsync(searchdomain); } public async Task SearchdomainCreateAsync(string searchdomain) { return await GetUrlAndProcessJson(GetUrl($"{baseUri}/Searchdomain", "Create", apiKey, new Dictionary() { {"searchdomain", searchdomain} })); } public async Task SearchdomainUpdateAsync(string newName, string settings = "{}") { SearchdomainUpdateResults updateResults = await SearchdomainUpdateAsync(searchdomain, newName, settings); searchdomain = newName; return updateResults; } public async Task SearchdomainUpdateAsync(string searchdomain, string newName, string settings = "{}") { return await GetUrlAndProcessJson(GetUrl($"{baseUri}/Searchdomain", "Update", apiKey, new Dictionary() { {"searchdomain", searchdomain}, {"newName", newName}, {"settings", settings} })); } public async Task EntityQueryAsync(string query) { return await EntityQueryAsync(searchdomain, query); } public async Task EntityQueryAsync(string searchdomain, string query) { return await GetUrlAndProcessJson(GetUrl($"{baseUri}/Searchdomain", "Query", apiKey, new Dictionary() { {"searchdomain", searchdomain}, {"query", query} })); } public async Task EntityIndexAsync(List jsonEntity) { return await EntityIndexAsync(JsonSerializer.Serialize(jsonEntity)); } public async Task EntityIndexAsync(string jsonEntity) { var content = new StringContent(jsonEntity, Encoding.UTF8, "application/json"); return await PostUrlAndProcessJson(GetUrl($"{baseUri}/Entity", "Index", apiKey, []), content);//new FormUrlEncodedContent(values)); } public async Task EntityListAsync(bool returnEmbeddings = false) { return await EntityListAsync(searchdomain, returnEmbeddings); } public async Task EntityListAsync(string searchdomain, bool returnEmbeddings = false) { var url = $"{baseUri}/Entity/List?apiKey={HttpUtility.UrlEncode(apiKey)}&searchdomain={HttpUtility.UrlEncode(searchdomain)}&returnEmbeddings={HttpUtility.UrlEncode(returnEmbeddings.ToString())}"; return await GetUrlAndProcessJson(url); } public async Task EntityDeleteAsync(string entityName) { return await EntityDeleteAsync(searchdomain, entityName); } public async Task EntityDeleteAsync(string searchdomain, string entityName) { var url = $"{baseUri}/Entity/Delete?apiKey={HttpUtility.UrlEncode(apiKey)}&searchdomain={HttpUtility.UrlEncode(searchdomain)}&entity={HttpUtility.UrlEncode(entityName)}"; return await GetUrlAndProcessJson(url); } private static async Task GetUrlAndProcessJson(string url) { using var client = new HttpClient(); var response = await client.GetAsync(url); string responseContent = await response.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize(responseContent) ?? throw new Exception($"Failed to deserialize JSON to type {typeof(T).Name}"); return result; } private static async Task PostUrlAndProcessJson(string url, HttpContent content) { using var client = new HttpClient(); var response = await client.PostAsync(url, content); string responseContent = await response.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize(responseContent) ?? throw new Exception($"Failed to deserialize JSON to type {typeof(T).Name}"); return result; } public static string GetUrl(string baseUri, string endpoint, string apiKey, Dictionary parameters) { var uriBuilder = new UriBuilder($"{baseUri}/{endpoint}"); var query = HttpUtility.ParseQueryString(uriBuilder.Query); if (apiKey.Length > 0) query["apiKey"] = apiKey; foreach (var param in parameters) { query[param.Key] = param.Value; } uriBuilder.Query = query.ToString() ?? ""; return uriBuilder.Uri.ToString(); } }