fix: added Token reaccessing
This commit is contained in:
parent
171757705a
commit
dd1364f744
@ -15,11 +15,13 @@ public class User
|
|||||||
|
|
||||||
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
||||||
|
|
||||||
[MaxLength(255)] public string? AccessToken { get; set; } = null;
|
[MaxLength(255)] public string? AccessToken { get; set; }
|
||||||
[MaxLength(255)] public string? RefreshToken { get; set; } = null;
|
[MaxLength(255)] public string? RefreshToken { get; set; }
|
||||||
|
|
||||||
public bool Eula { get; set; } = false;
|
public long? ExpiresIn { get; set; } = null;
|
||||||
[MaxLength(255)] public string? CvUrl { get; set; } = null;
|
|
||||||
|
public bool Eula { get; set; }
|
||||||
|
[MaxLength(255)] public string? CvUrl { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: Негоже это маппинги в DAL ложить
|
//TODO: Негоже это маппинги в DAL ложить
|
||||||
|
@ -116,6 +116,7 @@ public class HeadHunterService(
|
|||||||
|
|
||||||
user.AccessToken = responseDto.AccessToken;
|
user.AccessToken = responseDto.AccessToken;
|
||||||
user.RefreshToken = responseDto.RefreshToken;
|
user.RefreshToken = responseDto.RefreshToken;
|
||||||
|
user.ExpiresIn = responseDto.ExpiresIn;
|
||||||
|
|
||||||
await dbContext.SaveChangesAsync();
|
await dbContext.SaveChangesAsync();
|
||||||
|
|
||||||
@ -133,9 +134,9 @@ public class HeadHunterService(
|
|||||||
|
|
||||||
public async Task<Status> UpdateUserAccessToken(User user)
|
public async Task<Status> UpdateUserAccessToken(User user)
|
||||||
{
|
{
|
||||||
if(user.RefreshToken == null)
|
if (user.RefreshToken == null)
|
||||||
return Status.UserAuthRejectedError;
|
return Status.UserAuthRejectedError;
|
||||||
|
|
||||||
using var client = new HttpClient(); //TODO: Написать wrapper для работы с HH API
|
using var client = new HttpClient(); //TODO: Написать wrapper для работы с HH API
|
||||||
var form = new Dictionary<string, string>
|
var form = new Dictionary<string, string>
|
||||||
{
|
{
|
||||||
@ -156,24 +157,25 @@ public class HeadHunterService(
|
|||||||
{
|
{
|
||||||
Content = new FormUrlEncodedContent(form)
|
Content = new FormUrlEncodedContent(form)
|
||||||
});
|
});
|
||||||
|
|
||||||
var responseDto =
|
var responseDto =
|
||||||
JsonSerializer.Deserialize<HeadHunterTokenResponseDto>(await res.Content.ReadAsStringAsync());
|
JsonSerializer.Deserialize<HeadHunterTokenResponseDto>(await res.Content.ReadAsStringAsync());
|
||||||
|
|
||||||
if (responseDto == null)
|
if (responseDto == null)
|
||||||
{
|
{
|
||||||
logger.LogWarning($"User {user.UserId} access token accept completed with error " +
|
logger.LogWarning(
|
||||||
$"{nameof(Status.HeadHunterResponseDeserializationFailedError)}");
|
$"User {user.Username ?? user.UserId.ToString()} access token accept completed with error " +
|
||||||
|
$"{nameof(Status.HeadHunterResponseDeserializationFailedError)}");
|
||||||
return Status.HeadHunterResponseDeserializationFailedError;
|
return Status.HeadHunterResponseDeserializationFailedError;
|
||||||
}
|
}
|
||||||
|
|
||||||
user.RefreshToken = responseDto.RefreshToken;
|
user.RefreshToken = responseDto.RefreshToken;
|
||||||
user.AccessToken = responseDto.AccessToken;
|
user.AccessToken = responseDto.AccessToken;
|
||||||
await dbContext.SaveChangesAsync();
|
await dbContext.SaveChangesAsync();
|
||||||
|
|
||||||
return Status.Success;
|
return Status.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetRedirectUrl(long userId)
|
private string GetRedirectUrl(long userId)
|
||||||
{
|
{
|
||||||
return new UriBuilder(_config.Links.HookDomain)
|
return new UriBuilder(_config.Links.HookDomain)
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
using System.Net.Http.Headers;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using JOBot.Backend.DAL.Context;
|
using JOBot.Backend.DAL.Context;
|
||||||
using JOBot.Backend.DTOs.HeadHunterApi;
|
using JOBot.Backend.DTOs.HeadHunterApi;
|
||||||
@ -9,7 +10,9 @@ namespace JOBot.Backend.Services;
|
|||||||
|
|
||||||
public class ResumeService(
|
public class ResumeService(
|
||||||
AppDbContext dbContext,
|
AppDbContext dbContext,
|
||||||
IOptions<HeadHunterConfig> config)
|
ILogger<ResumeService> logger,
|
||||||
|
IOptions<HeadHunterConfig> config,
|
||||||
|
HeadHunterService headHunterService)
|
||||||
{
|
{
|
||||||
public async Task<(Status Status, List<Resume>? Resume)> GetAvailableResumes(long userId)
|
public async Task<(Status Status, List<Resume>? Resume)> GetAvailableResumes(long userId)
|
||||||
{
|
{
|
||||||
@ -19,6 +22,16 @@ public class ResumeService(
|
|||||||
return new(Status.UserNotFound, null);
|
return new(Status.UserNotFound, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!user.ExpiresIn.HasValue || new DateTime().AddSeconds(user.ExpiresIn.Value) > DateTime.Now)
|
||||||
|
{
|
||||||
|
var status = await headHunterService.UpdateUserAccessToken(user);
|
||||||
|
if (status != HeadHunterService.Status.Success)
|
||||||
|
{
|
||||||
|
logger.LogError($"User {userId} has expired access and update of it was unsuccessful: {status}");
|
||||||
|
return (Status.TokenExpired, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
using var client = new HttpClient(); //TODO: Написать wrapper для работы с HH API
|
using var client = new HttpClient(); //TODO: Написать wrapper для работы с HH API
|
||||||
client.BaseAddress = new UriBuilder(config.Value.Links.HeadHunterApiDomain)
|
client.BaseAddress = new UriBuilder(config.Value.Links.HeadHunterApiDomain)
|
||||||
{
|
{
|
||||||
@ -26,13 +39,21 @@ public class ResumeService(
|
|||||||
Scheme = "https"
|
Scheme = "https"
|
||||||
}.Uri;
|
}.Uri;
|
||||||
client.DefaultRequestHeaders.UserAgent.ParseAdd("Jobot BackEnd Service");
|
client.DefaultRequestHeaders.UserAgent.ParseAdd("Jobot BackEnd Service");
|
||||||
|
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", user.AccessToken);
|
||||||
|
|
||||||
using var res = await client.GetAsync("/resumes/mine");
|
using var res = await client.GetAsync("/resumes/mine");
|
||||||
|
|
||||||
|
if (!res.IsSuccessStatusCode)
|
||||||
|
{
|
||||||
|
logger.LogWarning(
|
||||||
|
$"User {user.Username ?? user.UserId.ToString()} resume list is unavailable by unsuccessful status code: {res.StatusCode}");
|
||||||
|
return new(Status.RequestError, null);
|
||||||
|
}
|
||||||
|
|
||||||
var responseDto = JsonSerializer.Deserialize<ListOfResumeResponseDto>(await res.Content.ReadAsStringAsync());
|
var responseDto = JsonSerializer.Deserialize<ListOfResumeResponseDto>(await res.Content.ReadAsStringAsync());
|
||||||
if (responseDto == null)
|
if (responseDto == null)
|
||||||
return new(Status.Error, null);
|
return new(Status.Error, null);
|
||||||
|
|
||||||
return new(Status.Success, responseDto.Items);
|
return new(Status.Success, responseDto.Items);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,6 +61,8 @@ public class ResumeService(
|
|||||||
{
|
{
|
||||||
Success,
|
Success,
|
||||||
UserNotFound,
|
UserNotFound,
|
||||||
Error
|
Error,
|
||||||
|
RequestError,
|
||||||
|
TokenExpired
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user