test av integration mot hardcover
This commit is contained in:
@@ -11,6 +11,8 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Dapper" Version="2.1.66" />
|
<PackageReference Include="Dapper" Version="2.1.66" />
|
||||||
|
<PackageReference Include="GraphQL.Client" Version="6.1.0" />
|
||||||
|
<PackageReference Include="GraphQL.Client.Serializer.Newtonsoft" Version="6.1.0" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.6" />
|
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.6" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.SpaProxy">
|
<PackageReference Include="Microsoft.AspNetCore.SpaProxy">
|
||||||
<Version>9.*-*</Version>
|
<Version>9.*-*</Version>
|
||||||
|
26
Server/Business/Clients/HardcoverAuthenticationHandler.cs
Normal file
26
Server/Business/Clients/HardcoverAuthenticationHandler.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
using Bibblan.Models;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using System.Net.Http.Headers;
|
||||||
|
|
||||||
|
namespace Bibblan.Business.Clients
|
||||||
|
{
|
||||||
|
public class HardcoverAuthenticationHandler : DelegatingHandler
|
||||||
|
{
|
||||||
|
public BibblanOptions settings;
|
||||||
|
|
||||||
|
public HardcoverAuthenticationHandler(IOptions<BibblanOptions> options) : base()
|
||||||
|
{
|
||||||
|
settings = options.Value;
|
||||||
|
InnerHandler = new HttpClientHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override async Task<HttpResponseMessage> SendAsync(
|
||||||
|
HttpRequestMessage request,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", settings.HardcoverApiToken);
|
||||||
|
|
||||||
|
return await base.SendAsync(request, cancellationToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,19 +1,60 @@
|
|||||||
using Bibblan.Business.Services;
|
using Bibblan.Business.Services;
|
||||||
|
using GraphQL;
|
||||||
|
using GraphQL.Client.Abstractions;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
namespace Bibblan.Controllers
|
namespace Bibblan.Controllers
|
||||||
{
|
{
|
||||||
|
public class Publisher
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
}
|
||||||
|
public class Image
|
||||||
|
{
|
||||||
|
public string Url { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Author
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
}
|
||||||
|
public class Contributor
|
||||||
|
{
|
||||||
|
public Author Author { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Edition
|
||||||
|
{
|
||||||
|
public long Id { get; set; }
|
||||||
|
public string Title { get; set; }
|
||||||
|
public string Edition_Format { get; set; }
|
||||||
|
public int? Pages { get; set; }
|
||||||
|
public DateTime? Release_Date { get; set; }
|
||||||
|
public string Isbn_10 { get; set; }
|
||||||
|
public string Isbn_13 { get; set; }
|
||||||
|
public Publisher Publisher { get; set; }
|
||||||
|
public List<Contributor> Contributions { get; set; }
|
||||||
|
public Image Image { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class EditionsCollectionType
|
||||||
|
{
|
||||||
|
public List<Edition> Editions { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("api/[controller]")]
|
[Route("api/[controller]")]
|
||||||
public class BibblanController : ControllerBase
|
public class BibblanController : ControllerBase
|
||||||
{
|
{
|
||||||
DatabaseService _db;
|
DatabaseService _db;
|
||||||
CalibreService _calibre;
|
CalibreService _calibre;
|
||||||
|
private readonly IGraphQLClient _client;
|
||||||
|
|
||||||
public BibblanController(DatabaseService databaseService, CalibreService calibre)
|
public BibblanController(DatabaseService databaseService, CalibreService calibre, IGraphQLClient client)
|
||||||
{
|
{
|
||||||
_db = databaseService;
|
_db = databaseService;
|
||||||
_calibre = calibre;
|
_calibre = calibre;
|
||||||
|
_client = client;
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("cover")]
|
[HttpGet("cover")]
|
||||||
@@ -99,5 +140,45 @@ namespace Bibblan.Controllers
|
|||||||
var tags = _db.GetTags(filter).ToList();
|
var tags = _db.GetTags(filter).ToList();
|
||||||
return Ok(tags);
|
return Ok(tags);
|
||||||
}
|
}
|
||||||
|
//test
|
||||||
|
[HttpGet("lookup")]
|
||||||
|
public async Task<IActionResult> HardcoverLookup(string title, string author)
|
||||||
|
{
|
||||||
|
var query = new GraphQLRequest
|
||||||
|
{
|
||||||
|
Query = @"
|
||||||
|
query SomeNameHere($title: String!, $author: String!) {
|
||||||
|
editions(
|
||||||
|
where: {title: {_eq: $title}, _and: {contributions: {author: {name: {_eq: $author}}}}}
|
||||||
|
) {
|
||||||
|
id
|
||||||
|
title
|
||||||
|
edition_format
|
||||||
|
pages
|
||||||
|
release_date
|
||||||
|
isbn_10
|
||||||
|
isbn_13
|
||||||
|
publisher {
|
||||||
|
name
|
||||||
|
}
|
||||||
|
contributions {
|
||||||
|
author {
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
image {
|
||||||
|
url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}",
|
||||||
|
Variables = new
|
||||||
|
{
|
||||||
|
title,
|
||||||
|
author
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var response = await _client.SendQueryAsync<EditionsCollectionType>(query);
|
||||||
|
return Ok(response.Data.Editions);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,5 +7,7 @@
|
|||||||
public string CalibreDb { get; set; } = String.Empty;
|
public string CalibreDb { get; set; } = String.Empty;
|
||||||
public string CalibreRoot { get; set; } = String.Empty;
|
public string CalibreRoot { get; set; } = String.Empty;
|
||||||
public string BibblanConnection { get; set; } = String.Empty;
|
public string BibblanConnection { get; set; } = String.Empty;
|
||||||
|
public string HardcoverApiToken { get; set; } = string.Empty;
|
||||||
|
public string HardcoverApiUrl { get; set; } = string.Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,10 +1,15 @@
|
|||||||
|
using Bibblan.Business.Clients;
|
||||||
using Bibblan.Business.Services;
|
using Bibblan.Business.Services;
|
||||||
using Bibblan.Models;
|
using Bibblan.Models;
|
||||||
using Bibblan.ViewModels;
|
using Bibblan.ViewModels;
|
||||||
using Dapper;
|
using Dapper;
|
||||||
|
using GraphQL.Client.Abstractions;
|
||||||
|
using GraphQL.Client.Http;
|
||||||
|
using GraphQL.Client.Serializer.Newtonsoft;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using System.Net.Http;
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
builder.Configuration.AddJsonFile($"appsettings.user.json", true, true);
|
builder.Configuration.AddJsonFile($"appsettings.user.json", true, true);
|
||||||
@@ -23,7 +28,15 @@ builder.Services.AddControllers();
|
|||||||
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
|
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
|
||||||
builder.Services.AddOpenApi();
|
builder.Services.AddOpenApi();
|
||||||
|
|
||||||
|
//hardcover registration
|
||||||
|
builder.Services.AddTransient<HardcoverAuthenticationHandler>();//m<>ste vara transient
|
||||||
|
builder.Services.AddScoped<IGraphQLClient>(s => new GraphQLHttpClient(new GraphQLHttpClientOptions
|
||||||
|
{
|
||||||
|
HttpMessageHandler = s.GetRequiredService<HardcoverAuthenticationHandler>(),
|
||||||
|
EndPoint = new Uri(config.HardcoverApiUrl),
|
||||||
|
}, new NewtonsoftJsonSerializer()));
|
||||||
|
|
||||||
|
//databases
|
||||||
builder.Services.AddDbContext<SqliteCalibreContext>(options => options.UseSqlite($"Data Source={config.CalibreDb};Mode=ReadOnly;"));
|
builder.Services.AddDbContext<SqliteCalibreContext>(options => options.UseSqlite($"Data Source={config.CalibreDb};Mode=ReadOnly;"));
|
||||||
builder.Services.AddDbContext<PostgresCalibreContext>(options => options.UseNpgsql(config.BibblanConnection));
|
builder.Services.AddDbContext<PostgresCalibreContext>(options => options.UseNpgsql(config.BibblanConnection));
|
||||||
|
|
||||||
|
@@ -9,6 +9,8 @@
|
|||||||
"Bibblan": {
|
"Bibblan": {
|
||||||
"CalibreDb": "metadata.db",
|
"CalibreDb": "metadata.db",
|
||||||
"CalibreRoot": "c:\\my_books\\",
|
"CalibreRoot": "c:\\my_books\\",
|
||||||
"BibblanConnection": "Server=localhost;Port=5432;Database=bibblan;User Id=bibblanuser;Password=1234567;"
|
"BibblanConnection": "Server=localhost;Port=5432;Database=bibblan;User Id=bibblanuser;Password=1234567;",
|
||||||
|
"HardcoverApiUrl": "https://api.hardcover.app/v1/graphql",
|
||||||
|
"HardcoverApiToken": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user