Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Meilisearch integration #66

Merged
merged 25 commits into from
Oct 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
2b79293
Add Meilisearch hosting
Alirexaa Oct 4, 2024
316a4cd
Merge branch 'main' into alirexaa/meilisearch
Alirexaa Oct 17, 2024
b6123d7
Add public api files
Alirexaa Oct 17, 2024
3e8da2f
Clean up csproj
Alirexaa Oct 17, 2024
4b3ef7d
remove configuration schema stuff
Alirexaa Oct 17, 2024
2957152
add tests
Alirexaa Oct 17, 2024
78bc644
fix build
Alirexaa Oct 17, 2024
a05fedb
Fix test by addib Aspire.Hosting.AppHost to Testing proj
Alirexaa Oct 17, 2024
f27d9b9
Add test for client package
Alirexaa Oct 17, 2024
6d80111
fix test on windows
Alirexaa Oct 17, 2024
42d83ca
Add example
Alirexaa Oct 17, 2024
38a3881
Address PR feedback
Alirexaa Oct 18, 2024
40979ca
Add logging for tests
Alirexaa Oct 18, 2024
ab70c71
Add readme for packages
Alirexaa Oct 18, 2024
b46bf3e
fix xml docs
Alirexaa Oct 18, 2024
89462d4
rename file
Alirexaa Oct 18, 2024
a01d3ff
Merge branch 'main' into alirexaa/meilisearch
Alirexaa Oct 18, 2024
45792d3
Remove xunit test classes and use Microsoft.DotNet.XUnitExtensions in…
Alirexaa Oct 21, 2024
a4a4ce0
Merge branch 'alirexaa/meilisearch' of https://github.com/CommunityTo…
Alirexaa Oct 21, 2024
84f4af2
Merge branch 'main' into alirexaa/meilisearch
Alirexaa Oct 21, 2024
f09e9be
Remove polly and use WaitForText instead
Alirexaa Oct 21, 2024
f200d81
Merge branch 'alirexaa/meilisearch' of https://github.com/CommunityTo…
Alirexaa Oct 21, 2024
4fd4699
Update codeowners
Alirexaa Oct 21, 2024
d4a4d28
Merge branch 'main' into alirexaa/meilisearch
aaronpowell Oct 22, 2024
2ee554c
Matching the correct naming structure
aaronpowell Oct 22, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,12 @@
/examples/golang/_ @tommasodotNET
/src/CommunityToolkit.Aspire.Hosting.Golang/_ @tommasodotNET
/tests/CommunityToolkit.Aspire.Hosting.Golang/_ @tommasodotNET

# CommunityToolkit.Aspire.Meilisearch
# CommunityToolkit.Aspire.Hosting.Meilisearch

/examples/meilisearch/_ @alirexaa
/src/CommunityToolkit.Aspire.Hosting.Meilisearch/_ @alirexaa
/tests/CommunityToolkit.Aspire.Hosting.Meilisearch/_ @alirexaa
/src/CommunityToolkit.Aspire.Meilisearch/_ @alirexaa
/tests/CommunityToolkit.Aspire.Meilisearch/_ @alirexaa
90 changes: 71 additions & 19 deletions CommunityToolkit.Aspire.sln

Large diffs are not rendered by default.

6 changes: 4 additions & 2 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@
<AspireVersion>8.2.0</AspireVersion>
<AspNetCoreVersion>8.0.7</AspNetCoreVersion>
<OpenTelemetryVersion>1.9.0</OpenTelemetryVersion>

<TestContainersVersion>3.10.0</TestContainersVersion>
<IsPackable>false</IsPackable>
<UsePublicApiAnalyzers>true</UsePublicApiAnalyzers>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>

<RepoRoot>$(MSBuildThisFileDirectory)</RepoRoot>
</PropertyGroup>

<PropertyGroup>
<ContinuousIntegrationBuild>false</ContinuousIntegrationBuild>
Expand Down
6 changes: 6 additions & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
<PackageVersion Include="JsonSchema.Net" Version="7.2.3" />
<!-- AspNetCore packages -->
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="$(AspNetCoreVersion)" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.2" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.1" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.6.2" />
<!-- .NET packages -->
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="8.7.0" />
Expand All @@ -33,9 +35,13 @@
<PackageVersion Include="xunit" Version="2.9.1" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
<PackageVersion Include="xunit.extensibility.execution" Version="2.9.1" />
<PackageVersion Include="Microsoft.DotNet.XUnitExtensions" Version="8.0.0-beta.24516.1" />
<!-- External packages -->
<PackageVersion Include="OllamaSharp" Version="3.0.7" />
<PackageVersion Include="MeiliSearch" Version="0.15.3" />
<!-- Build dependencies -->
<PackageVersion Include="Microsoft.CodeAnalysis.PublicApiAnalyzers" Version="3.3.4" />
<!-- Testcontainers packages -->
<PackageVersion Include="Testcontainers" Version="$(TestContainersVersion)" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\..\src\CommunityToolkit.Aspire.Meilisearch\CommunityToolkit.Aspire.Meilisearch.csproj" />
<ProjectReference Include="..\CommunityToolkit.Aspire.Hosting.Meilisearch.ServiceDefaults\CommunityToolkit.Aspire.Hosting.Meilisearch.ServiceDefaults.csproj" />

</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace CommunityToolkit.Aspire.Hosting.Meilisearch.ApiService;
public class Movie
{
public string? Id { get; set; }
public string? Title { get; set; }
public IEnumerable<string>? Genres { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
using CommunityToolkit.Aspire.Hosting.Meilisearch.ApiService;
using Meilisearch;

var builder = WebApplication.CreateBuilder(args);

builder.AddServiceDefaults();

builder.AddMeilisearchClient("meilisearch");

var app = builder.Build();

app.MapDefaultEndpoints();
app.MapGet("/search", async (MeilisearchClient meilisearch) =>
{
var index = meilisearch.Index("movies");

var result = await index.SearchAsync<Movie>(
"car",
new SearchQuery
{
AttributesToHighlight = ["title"],
});

return result;
});

app.MapGet("/create", async (MeilisearchClient meilisearch) =>
{
// An index is where the documents are stored.
var index = meilisearch.Index("movies");
var documents = new Movie[] {
new() { Id = "1", Title = "Carol", Genres = ["Romance", "Drama"] },
new() { Id = "2", Title = "Wonder Woman", Genres = ["Action", "Adventure"] },
new() { Id = "3", Title = "Life of Pi", Genres = ["Adventure", "Drama"] },
new() { Id = "4", Title = "Mad Max: Fury Road", Genres = ["Adventure", "Science Fiction"] },
new() { Id = "5", Title = "Moana", Genres = ["Fantasy", "Action"] },
new() { Id = "6", Title = "Philadelphia", Genres = ["Drama"] }
};

// If the index 'movies' does not exist, Meilisearch creates it when you first add the documents.
var task = await index.AddDocumentsAsync<Movie>(documents);

// Wait for the task to ensure the document is added. this line is necessary for passing tests.
var response = await index.WaitForTaskAsync(task.TaskUid);
return task;
});

app.MapGet("/get", async (MeilisearchClient meilisearch) =>
{
// An index is where the documents are stored.
var index = await meilisearch.GetIndexAsync("movies");
var data = await index.GetDocumentsAsync<Movie>();
return data.Results;
});

app.Run();
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:5232",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7042;http://localhost:5232",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsAspireHost>true</IsAspireHost>
<UserSecretsId>6adfc361-47fd-4c05-88de-c95763714bb0</UserSecretsId>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Aspire.Hosting.AppHost" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\..\src\CommunityToolkit.Aspire.Hosting.Meilisearch\CommunityToolkit.Aspire.Hosting.Meilisearch.csproj" IsAspireProjectResource="false" />
<ProjectReference Include="..\CommunityToolkit.Aspire.Hosting.Meilisearch.ApiService\CommunityToolkit.Aspire.Hosting.Meilisearch.ApiService.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using Projects;

var builder = DistributedApplication.CreateBuilder(args);

var meilisearch = builder.AddMeilisearch("meilisearch");

builder.AddProject<CommunityToolkit_Aspire_Hosting_Meilisearch_ApiService>("apiservice")
.WithReference(meilisearch);

builder.Build().Run();
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:18119;http://localhost:12037",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"DOTNET_ENVIRONMENT": "Development",
"DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:31475",
"DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:12700"
}
},
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:15073",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"DOTNET_ENVIRONMENT": "Development",
"DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19087",
"DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20252"
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"Aspire.Hosting.Dcp": "Warning"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsAspireSharedProject>true</IsAspireSharedProject>
</PropertyGroup>

<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />

<PackageReference Include="Microsoft.Extensions.Http.Resilience" />
<PackageReference Include="Microsoft.Extensions.ServiceDiscovery" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.ServiceDiscovery;
using OpenTelemetry;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;

namespace Microsoft.Extensions.Hosting;
// Adds common .NET Aspire services: service discovery, resilience, health checks, and OpenTelemetry.
// This project should be referenced by each service project in your solution.
// To learn more about using this project, see https://aka.ms/dotnet/aspire/service-defaults
public static class Extensions
{
public static IHostApplicationBuilder AddServiceDefaults(this IHostApplicationBuilder builder)
{
builder.ConfigureOpenTelemetry();

builder.AddDefaultHealthChecks();

builder.Services.AddServiceDiscovery();

builder.Services.ConfigureHttpClientDefaults(http =>
{
// Turn on resilience by default
http.AddStandardResilienceHandler();
// Turn on service discovery by default
http.AddServiceDiscovery();
});

// Uncomment the following to restrict the allowed schemes for service discovery.
// builder.Services.Configure<ServiceDiscoveryOptions>(options =>
// {
// options.AllowedSchemes = ["https"];
// });

return builder;
}

public static IHostApplicationBuilder ConfigureOpenTelemetry(this IHostApplicationBuilder builder)
{
builder.Logging.AddOpenTelemetry(logging =>
{
logging.IncludeFormattedMessage = true;
logging.IncludeScopes = true;
});

builder.Services.AddOpenTelemetry()
.WithMetrics(metrics =>
{
metrics.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddRuntimeInstrumentation();
})
.WithTracing(tracing =>
{
tracing.AddAspNetCoreInstrumentation()
// Uncomment the following line to enable gRPC instrumentation (requires the OpenTelemetry.Instrumentation.GrpcNetClient package)
//.AddGrpcClientInstrumentation()
.AddHttpClientInstrumentation();
});

builder.AddOpenTelemetryExporters();

return builder;
}

private static IHostApplicationBuilder AddOpenTelemetryExporters(this IHostApplicationBuilder builder)
{
var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);

if (useOtlpExporter)
{
builder.Services.AddOpenTelemetry().UseOtlpExporter();
}

// Uncomment the following lines to enable the Azure Monitor exporter (requires the Azure.Monitor.OpenTelemetry.AspNetCore package)
//if (!string.IsNullOrEmpty(builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]))
//{
// builder.Services.AddOpenTelemetry()
// .UseAzureMonitor();
//}

return builder;
}

public static IHostApplicationBuilder AddDefaultHealthChecks(this IHostApplicationBuilder builder)
{
builder.Services.AddHealthChecks()
// Add a default liveness check to ensure app is responsive
.AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]);

return builder;
}

public static WebApplication MapDefaultEndpoints(this WebApplication app)
{
// Adding health checks endpoints to applications in non-development environments has security implications.
// See https://aka.ms/dotnet/aspire/healthchecks for details before enabling these endpoints in non-development environments.
if (app.Environment.IsDevelopment())
{
// All health checks must pass for app to be considered ready to accept traffic after starting
app.MapHealthChecks("/health");

// Only health checks tagged with the "live" tag must pass for app to be considered alive
app.MapHealthChecks("/alive", new HealthCheckOptions
{
Predicate = r => r.Tags.Contains("live")
});
}

return app;
}
}
Loading