Fix user lookup by provider id

This commit is contained in:
Zoe Roux 2024-03-02 16:20:53 +01:00
parent 98e9ba0fa7
commit 3bb36f5e78
3 changed files with 36 additions and 17 deletions

View File

@ -10,6 +10,7 @@
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<ProjectReference Include="../Kyoo.Abstractions/Kyoo.Abstractions.csproj" /> <ProjectReference Include="../Kyoo.Abstractions/Kyoo.Abstractions.csproj" />
<ProjectReference Include="../Kyoo.Core/Kyoo.Core.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -19,7 +19,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Net.Http.Json; using System.Net.Http.Json;
using System.Text; using System.Text;
@ -32,13 +31,11 @@ using Kyoo.Abstractions.Models.Permissions;
using Kyoo.Abstractions.Models.Utils; using Kyoo.Abstractions.Models.Utils;
using Kyoo.Authentication.Models; using Kyoo.Authentication.Models;
using Kyoo.Authentication.Models.DTO; using Kyoo.Authentication.Models.DTO;
using Kyoo.Core.Controllers;
using Kyoo.Models; using Kyoo.Models;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using static Kyoo.Abstractions.Models.Utils.Constants; using static Kyoo.Abstractions.Models.Utils.Constants;
using BCryptNet = BCrypt.Net.BCrypt; using BCryptNet = BCrypt.Net.BCrypt;
@ -51,7 +48,7 @@ namespace Kyoo.Authentication.Views
[Route("auth")] [Route("auth")]
[ApiDefinition("Authentication", Group = UsersGroup)] [ApiDefinition("Authentication", Group = UsersGroup)]
public class AuthApi( public class AuthApi(
IRepository<User> users, UserRepository users,
ITokenController tokenController, ITokenController tokenController,
IThumbnailsManager thumbs, IThumbnailsManager thumbs,
IHttpClientFactory clientFactory, IHttpClientFactory clientFactory,
@ -184,11 +181,8 @@ namespace Kyoo.Authentication.Views
User newUser = new(); User newUser = new();
if (profile.Email is not null) if (profile.Email is not null)
newUser.Email = profile.Email; newUser.Email = profile.Email;
if (profile.Username is not null) string? username = profile.Username ?? profile.Name;
newUser.Username = profile.Username; if (username is null)
else if (profile.Name is not null)
newUser.Username = profile.Name;
else
{ {
return BadRequest( return BadRequest(
new RequestError( new RequestError(
@ -196,12 +190,11 @@ namespace Kyoo.Authentication.Views
) )
); );
} }
newUser.Username = username;
newUser.Slug = Utils.Utility.ToSlug(newUser.Username); newUser.Slug = Utils.Utility.ToSlug(newUser.Username);
newUser.ExternalId.Add(provider, extToken); newUser.ExternalId.Add(provider, extToken);
User? user = await users.GetOrDefault( User? user = await users.GetByExternalId(provider, extToken.Id);
new Filter<User>.Lambda(x => x.ExternalId[provider].Id == extToken.Id)
);
if (user == null) if (user == null)
user = await users.Create(newUser); user = await users.Create(newUser);
return new JwtToken( return new JwtToken(

View File

@ -18,6 +18,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.Common;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Controllers;
@ -35,10 +36,12 @@ namespace Kyoo.Core.Controllers;
/// <remarks> /// <remarks>
/// Create a new <see cref="UserRepository"/> /// Create a new <see cref="UserRepository"/>
/// </remarks> /// </remarks>
/// <param name="database">The database handle to use</param> public class UserRepository(
/// <param name="thumbs">The thumbnail manager used to store images.</param> DatabaseContext database,
public class UserRepository(DatabaseContext database, IThumbnailsManager thumbs) DbConnection db,
: LocalRepository<User>(database, thumbs) SqlVariableContext context,
IThumbnailsManager thumbs
) : LocalRepository<User>(database, thumbs)
{ {
/// <summary> /// <summary>
/// The database handle /// The database handle
@ -84,4 +87,26 @@ public class UserRepository(DatabaseContext database, IThumbnailsManager thumbs)
await _database.SaveChangesAsync(); await _database.SaveChangesAsync();
await base.Delete(obj); await base.Delete(obj);
} }
public Task<User?> GetByExternalId(string provider, string id)
{
// language=PostgreSQL
return db.QuerySingle<User>(
$"""
select
u.* -- User as u
/* includes */
from
users as u
where
u.external_id->{provider}->>'id' = {id}
""",
new() { ["u"] = typeof(User) },
(items) => (items[0] as User)!,
context,
null,
null,
null
);
}
} }