Skip to content

Commit be96265

Browse files
committed
add user profile logic
1 parent ab250b0 commit be96265

5 files changed

Lines changed: 57 additions & 2 deletions

File tree

src/backend/Hermes.SituationRoom.Data/Interface/IUserRepository.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ public interface IUserRepository
1212

1313
Task<UserBo> GetUserBoAsync(Guid userUid);
1414

15+
Task<UserBo> GetUserProfileBoAsync(Guid userUid, Guid consumerUid);
16+
1517
Task<IReadOnlyList<UserBo>> GetAllUserBosAsync();
1618

1719
Task<UserBo> Update(UserBo updatedUser);

src/backend/Hermes.SituationRoom.Data/Repositories/UserRepository.cs

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace Hermes.SituationRoom.Data.Repositories;
66
using Microsoft.EntityFrameworkCore;
77
using Shared.BusinessObjects;
88

9-
public sealed class UserRepository(IHermessituationRoomContext context) : IUserRepository
9+
public sealed class UserRepository(IHermessituationRoomContext context, IPrivacyLevelPersonalRepository privacyLevelPersonalRepository) : IUserRepository
1010
{
1111
public async Task<Guid> AddAsync(UserBo userBo)
1212
{
@@ -39,6 +39,21 @@ public async Task<UserBo> GetUserBoAsync(Guid userId)
3939
);
4040
}
4141

42+
public async Task<UserBo> GetUserProfileBoAsync(Guid userId, Guid consumerId)
43+
{
44+
if (userId == Guid.Empty)
45+
throw new ArgumentException("GUID must not be empty.", nameof(userId));
46+
47+
var user = await context.Users
48+
.AsNoTracking()
49+
.FirstOrDefaultAsync(u => u.Uid == userId)
50+
?? throw new KeyNotFoundException($"User with UID {userId} was not found.");
51+
52+
await ApplyUserPrivacyLevel(user, userId, consumerId);
53+
54+
return MapToBo(user);
55+
}
56+
4257
public async Task<IReadOnlyList<UserBo>> GetAllUserBosAsync() => await context.Users
4358
.AsNoTracking()
4459
.Select(u => MapToBo(u))
@@ -60,7 +75,7 @@ public async Task<UserBo> Update(UserBo updatedUser)
6075

6176
context.Users.Update(user);
6277
await context.SaveChangesAsync();
63-
78+
6479
return MapToBo(user);
6580
}
6681

@@ -85,4 +100,31 @@ public Task Delete(Guid userId)
85100
user.LastName,
86101
user.EmailAddress
87102
);
103+
104+
private async Task<User> ApplyUserPrivacyLevel(User user, Guid userId, Guid consumerId)
105+
{
106+
if (consumerId != Guid.Empty)
107+
{
108+
var privacyLevel = await privacyLevelPersonalRepository.GetPrivacyLevelPersonalBoAsync(userId, consumerId);
109+
110+
if (!privacyLevel.IsFirstNameVisible) user.FirstName = null;
111+
if (!privacyLevel.IsLastNameVisible) user.LastName = null;
112+
if (!privacyLevel.IsEmailVisible) user.EmailAddress = null;
113+
}
114+
else
115+
{
116+
var activist = await context.Activists
117+
.AsNoTracking()
118+
.FirstOrDefaultAsync(a => a.UserUid == userId);
119+
120+
if (activist is not null)
121+
{
122+
if (!activist.IsFirstNameVisible) user.FirstName = null;
123+
if (!activist.IsLastNameVisible) user.LastName = null;
124+
if (!activist.IsEmailVisible) user.EmailAddress = null;
125+
}
126+
}
127+
128+
return user;
129+
}
88130
}

src/backend/Hermes.SituationRoom.Domain/Interfaces/IUserService.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ public interface IUserService
66
{
77
Task<UserBo> GetUserAsync(Guid userUid);
88

9+
Task<UserBo> GetUserProfileAsync(Guid userUid, Guid consumerUid);
10+
911
Task<IReadOnlyList<UserBo>> GetUsersAsync();
1012

1113
Task<Guid> CreateUserAsync(UserBo userBo);

src/backend/Hermes.SituationRoom.Domain/Services/UserService.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ public class UserService(IUserRepository userRepository) : IUserService
88
{
99
public Task<UserBo> GetUserAsync(Guid userUid) => userRepository.GetUserBoAsync(userUid);
1010

11+
public Task<UserBo> GetUserProfileAsync(Guid userUid, Guid consumerUid) => userRepository.GetUserProfileBoAsync(userUid, consumerUid);
12+
1113
public Task<IReadOnlyList<UserBo>> GetUsersAsync() => userRepository.GetAllUserBosAsync();
1214

1315
public Task<Guid> CreateUserAsync(UserBo userBo) => userRepository.AddAsync(userBo);

src/backend/Hermes.SituationRoom.Web/Controllers/UserController.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ public class UserController(IControllerInfrastructure infra, IUserService userSe
1717
[ProducesResponseType(StatusCodes.Status404NotFound)]
1818
public async Task<ActionResult<UserBo>> GetUser(Guid uid) => Ok(await userService.GetUserAsync(uid));
1919

20+
[HttpGet("internal/user/profile/")]
21+
[SwaggerOperation(Tags = [SwaggerTagDescriptions.ENDPOINT_TAG_INTERNAL_USER])]
22+
[ProducesResponseType(typeof(UserBo), StatusCodes.Status200OK)]
23+
[ProducesResponseType(StatusCodes.Status404NotFound)]
24+
public async Task<ActionResult<UserBo>> GetUserProfile([FromQuery] Guid uid, [FromQuery] Guid consumerUid) =>
25+
Ok(await userService.GetUserProfileAsync(uid, consumerUid));
26+
2027
[HttpGet("internal/user/")]
2128
[SwaggerOperation(Tags = [SwaggerTagDescriptions.ENDPOINT_TAG_INTERNAL_USER])]
2229
[ProducesResponseType(typeof(IReadOnlyList<UserBo>), StatusCodes.Status200OK)]

0 commit comments

Comments
 (0)