Skip to content

Commit 62fad91

Browse files
authored
add user profile logic (#25)
* add user profile logic * use Bo instead of Entity * modify userBo logic
1 parent b7e06aa commit 62fad91

5 files changed

Lines changed: 63 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: 50 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 userBo = MapToBo(await context.Users
48+
.AsNoTracking()
49+
.FirstOrDefaultAsync(u => u.Uid == userId)
50+
?? throw new KeyNotFoundException($"User with UID {userId} was not found."));
51+
52+
userBo = await ApplyUserPrivacyLevel(userBo, userId, consumerId);
53+
54+
return userBo;
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,37 @@ public Task Delete(Guid userId)
85100
user.LastName,
86101
user.EmailAddress
87102
);
103+
104+
private async Task<UserBo> ApplyUserPrivacyLevel(UserBo userBo, Guid userId, Guid consumerId)
105+
{
106+
if (consumerId != Guid.Empty)
107+
{
108+
var privacyLevel = await privacyLevelPersonalRepository.GetPrivacyLevelPersonalBoAsync(userId, consumerId);
109+
110+
userBo = userBo with
111+
{
112+
FirstName = privacyLevel.IsFirstNameVisible ? userBo.FirstName : null,
113+
LastName = privacyLevel.IsLastNameVisible ? userBo.LastName : null,
114+
EmailAddress = privacyLevel.IsEmailVisible ? userBo.EmailAddress : null
115+
};
116+
}
117+
else
118+
{
119+
var activist = await context.Activists
120+
.AsNoTracking()
121+
.FirstOrDefaultAsync(a => a.UserUid == userId);
122+
123+
if (activist is not null)
124+
{
125+
userBo = userBo with
126+
{
127+
FirstName = activist.IsFirstNameVisible ? userBo.FirstName : null,
128+
LastName = activist.IsLastNameVisible ? userBo.LastName : null,
129+
EmailAddress = activist.IsEmailVisible ? userBo.EmailAddress : null
130+
};
131+
}
132+
}
133+
134+
return userBo;
135+
}
88136
}

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)