[FA-55] User Service backend initial setup
This commit is contained in:
@@ -1,38 +1,53 @@
|
||||
using FictionArchive.Service.Shared.Constants;
|
||||
using System.Security.Claims;
|
||||
using FictionArchive.Service.UserService.Models.DTOs;
|
||||
using FictionArchive.Service.UserService.Services;
|
||||
using HotChocolate.Authorization;
|
||||
using HotChocolate.Types;
|
||||
|
||||
namespace FictionArchive.Service.UserService.GraphQL;
|
||||
|
||||
public class Mutation
|
||||
{
|
||||
[Authorize(Roles = [AuthorizationConstants.Roles.Admin])]
|
||||
public async Task<UserDto> RegisterUser(string username, string email, string oAuthProviderId,
|
||||
string? inviterOAuthProviderId, UserManagementService userManagementService)
|
||||
[Authorize]
|
||||
[Error<InvalidOperationException>]
|
||||
public async Task<UserDto> InviteUser(
|
||||
string email,
|
||||
string username,
|
||||
UserManagementService userManagementService,
|
||||
ClaimsPrincipal claimsPrincipal)
|
||||
{
|
||||
var user = await userManagementService.RegisterUser(username, email, oAuthProviderId, inviterOAuthProviderId);
|
||||
// Get the current user's OAuth provider ID from claims
|
||||
var oAuthProviderId = claimsPrincipal.FindFirst("sub")?.Value;
|
||||
if (string.IsNullOrEmpty(oAuthProviderId))
|
||||
{
|
||||
throw new InvalidOperationException("Unable to determine current user identity");
|
||||
}
|
||||
|
||||
// Get the inviter from the database
|
||||
var inviter = await userManagementService.GetUserByOAuthProviderIdAsync(oAuthProviderId);
|
||||
if (inviter == null)
|
||||
{
|
||||
throw new InvalidOperationException("Current user not found in the system");
|
||||
}
|
||||
|
||||
// Invite the new user
|
||||
var newUser = await userManagementService.InviteUserAsync(inviter, email, username);
|
||||
if (newUser == null)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"Failed to invite user. Either you have no available invites, or the email/username is already in use.");
|
||||
}
|
||||
|
||||
return new UserDto
|
||||
{
|
||||
Id = user.Id,
|
||||
CreatedTime = user.CreatedTime,
|
||||
LastUpdatedTime = user.LastUpdatedTime,
|
||||
Username = user.Username,
|
||||
Email = user.Email,
|
||||
Disabled = user.Disabled,
|
||||
Inviter = user.Inviter != null
|
||||
? new UserDto
|
||||
{
|
||||
Id = user.Inviter.Id,
|
||||
CreatedTime = user.Inviter.CreatedTime,
|
||||
LastUpdatedTime = user.Inviter.LastUpdatedTime,
|
||||
Username = user.Inviter.Username,
|
||||
Email = user.Inviter.Email,
|
||||
Disabled = user.Inviter.Disabled,
|
||||
Inviter = null // Limit recursion to one level
|
||||
}
|
||||
: null
|
||||
Id = newUser.Id,
|
||||
CreatedTime = newUser.CreatedTime,
|
||||
LastUpdatedTime = newUser.LastUpdatedTime,
|
||||
Username = newUser.Username,
|
||||
Email = newUser.Email,
|
||||
Disabled = newUser.Disabled,
|
||||
AvailableInvites = newUser.AvailableInvites,
|
||||
InviterId = newUser.InviterId
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user