Skip to content

Commit 126be2d

Browse files
authored
Merge pull request #12 from argon-chat/contracts/user
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Release Notes - **New Features** - Introduced a new `UserInteractionService` for managing user interactions, including methods for retrieving user info, creating servers, and joining channels. - Added a new `IUserInteraction` interface to define user interaction methods. - Implemented implicit conversion operators for `ChannelStorage` and `ServerStorage` to enhance data handling. - Added new package references to support enhanced functionality. - **Changes** - Renamed authentication methods to reflect a shift towards authorization. - Enhanced `UserStorageDto` with mapping capabilities and implicit conversion to `UserResponse`. - Reformatted authorization-related records for improved clarity. - **Bug Fixes** - Simplified response handling in the `UserAuthorization` class. - **Chores** - Updated package references and formatting in project files. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
2 parents 19dd243 + f649688 commit 126be2d

File tree

14 files changed

+341
-45
lines changed

14 files changed

+341
-45
lines changed

src/Argon.Api/Argon.Api.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
<PackageReference Include="Flurl.Http" Version="4.0.2"/>
1212
<PackageReference Include="Flurl.Http.Newtonsoft" Version="0.9.1"/>
1313
<PackageReference Include="MemoryPack" Version="1.21.3"/>
14+
<PackageReference Include="MemoryPack.Generator" Version="1.21.3">
15+
<PrivateAssets>all</PrivateAssets>
16+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
17+
</PackageReference>
1418
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.10"/>
1519
<PackageReference Include="ActualLab.Fusion" Version="9.5.52"/>
1620
<PackageReference Include="ActualLab.Fusion.EntityFramework.Npgsql" Version="9.5.52"/>

src/Argon.Api/Controllers/UsersController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public async Task<ActionResult<UserStorageDto>> Post([FromBody] UserInputDto dto
2828
public async Task<ActionResult<string>> Authenticate([FromBody] UserInputDto dto)
2929
{
3030
var userManager = grainFactory.GetGrain<IUserManager>(dto.Username);
31-
var token = await userManager.Authenticate(dto.Password);
31+
var token = await userManager.Authorize(dto.Password);
3232
return token;
3333
}
3434

src/Argon.Api/Grains.Interfaces/IUserManager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ public interface IUserManager : IGrainWithStringKey
1111
[Alias("Get")]
1212
Task<UserStorageDto> Get();
1313

14-
[Alias("Authenticate")]
15-
Task<string> Authenticate(string password);
14+
[Alias("Authorize")]
15+
Task<string> Authorize(string password);
1616

1717
[Alias("CreateServer")]
1818
Task<ServerStorage> CreateServer(string name, string description);

src/Argon.Api/Grains.Persistence.States/ChannelStorage.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace Argon.Api.Grains.Persistence.States;
22

3+
using Contracts;
34
using MemoryPack;
45

56
[GenerateSerializer]
@@ -16,4 +17,18 @@ public sealed partial record ChannelStorage
1617
[Id(5)] public ServerRole AccessLevel { get; set; } = ServerRole.User;
1718
[Id(6)] public DateTime CreatedAt { get; } = DateTime.UtcNow;
1819
[Id(7)] public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
20+
21+
public static implicit operator ServerDetailsResponse(ChannelStorage channelStorage)
22+
{
23+
return new ServerDetailsResponse(
24+
channelStorage.Id,
25+
channelStorage.Name,
26+
channelStorage.Description,
27+
channelStorage.CreatedBy.ToString("N"),
28+
channelStorage.ChannelType.ToString(),
29+
channelStorage.AccessLevel.ToString(),
30+
channelStorage.CreatedAt,
31+
channelStorage.UpdatedAt
32+
);
33+
}
1934
}

src/Argon.Api/Grains.Persistence.States/ServerStorage.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace Argon.Api.Grains.Persistence.States;
22

3+
using Contracts;
34
using MemoryPack;
45

56
[GenerateSerializer]
@@ -15,4 +16,17 @@ public sealed partial record ServerStorage
1516
[Id(6)] public List<Guid> Channels { get; set; } = [];
1617
[Id(3)] public DateTime CreatedAt { get; } = DateTime.UtcNow;
1718
[Id(4)] public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
19+
20+
public static implicit operator ServerResponse(ServerStorage serverStorage)
21+
{
22+
return new ServerResponse(
23+
serverStorage.Id,
24+
serverStorage.Name,
25+
serverStorage.Description,
26+
serverStorage.AvatarUrl,
27+
serverStorage.Channels,
28+
serverStorage.CreatedAt,
29+
serverStorage.UpdatedAt
30+
);
31+
}
1832
}

src/Argon.Api/Grains.Persistence.States/UserStorage.cs

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,50 @@
11
namespace Argon.Api.Grains.Persistence.States;
22

3+
using System.Runtime.Serialization;
34
using MemoryPack;
5+
using MessagePack;
46

57
[GenerateSerializer]
68
[Serializable]
79
[MemoryPackable]
810
[Alias(nameof(UserStorage))]
911
public sealed partial record UserStorage
1012
{
11-
[Id(0)] public Guid Id { get; set; } = Guid.Empty;
12-
[Id(1)] public string Username { get; set; } = string.Empty;
13-
[Id(2)] public string Password { get; set; } = string.Empty;
14-
[Id(5)] public string AvatarUrl { get; set; } = string.Empty;
15-
[Id(3)] public DateTime CreatedAt { get; } = DateTime.UtcNow;
16-
[Id(4)] public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
13+
[property: DataMember(Order = 0)]
14+
[property: MemoryPackOrder(0)]
15+
[property: Key(0)]
16+
[Id(0)]
17+
public Guid Id { get; set; } = Guid.Empty;
18+
19+
[property: DataMember(Order = 1)]
20+
[property: MemoryPackOrder(1)]
21+
[property: Key(1)]
22+
[Id(1)]
23+
public string Username { get; set; } = string.Empty;
24+
25+
[property: DataMember(Order = 2)]
26+
[property: MemoryPackOrder(2)]
27+
[property: Key(2)]
28+
[Id(2)]
29+
public string Password { get; set; } = string.Empty;
30+
31+
[property: DataMember(Order = 5)]
32+
[property: MemoryPackOrder(5)]
33+
[property: Key(5)]
34+
[Id(5)]
35+
public string AvatarUrl { get; set; } = string.Empty;
36+
37+
[property: DataMember(Order = 3)]
38+
[property: MemoryPackOrder(3)]
39+
[property: Key(3)]
40+
[Id(3)]
41+
public DateTime CreatedAt { get; } = DateTime.UtcNow;
42+
43+
[property: DataMember(Order = 4)]
44+
[property: MemoryPackOrder(4)]
45+
[property: Key(4)]
46+
[Id(4)]
47+
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
1748

1849
public static implicit operator UserStorageDto(UserStorage userStorage)
1950
{
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
11
namespace Argon.Api.Grains.Persistence.States;
22

3+
using Contracts;
4+
using Mapster;
35
using MemoryPack;
46

57
[GenerateSerializer]
68
[Serializable]
79
[MemoryPackable]
810
[Alias(nameof(UserStorageDto))]
11+
[GenerateMapper]
912
public sealed partial record UserStorageDto
1013
{
1114
[Id(0)] public Guid Id { get; set; }
1215
[Id(1)] public string Username { get; set; } = string.Empty;
1316
[Id(4)] public string AvatarUrl { get; set; } = string.Empty;
1417
[Id(2)] public DateTime CreatedAt { get; set; }
1518
[Id(3)] public DateTime UpdatedAt { get; set; }
19+
20+
public static implicit operator UserResponse(UserStorageDto userStorageDto)
21+
{
22+
return new UserResponse(
23+
userStorageDto.Id,
24+
userStorageDto.Username,
25+
userStorageDto.AvatarUrl,
26+
userStorageDto.CreatedAt,
27+
userStorageDto.UpdatedAt
28+
);
29+
}
1630
}

src/Argon.Api/Grains/UserManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public async Task<UserStorageDto> Get()
3636
return userStore.State;
3737
}
3838

39-
public Task<string> Authenticate(string password)
39+
public Task<string> Authorize(string password)
4040
{
4141
var match = userStore.State.Password == HashPassword(password);
4242

src/Argon.Api/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
builder.Services.AddControllers(opts => { opts.Filters.Add<InjectUsernameFilter>(); });
1919
builder.Services.AddFusion(RpcServiceMode.Server, true)
2020
.Rpc.AddServer<IUserAuthorization, UserAuthorization>()
21+
.AddServer<IUserInteraction, UserInteractionService>()
2122
.AddWebSocketServer(true);
2223
builder.AddSwaggerWithAuthHeader();
2324
builder.AddJwt();
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
namespace Argon.Api.Services;
22

3-
using Grains.Interfaces;
43
using Contracts;
4+
using Grains.Interfaces;
55

66
public class UserAuthorization(IGrainFactory grainFactory) : IUserAuthorization
77
{
88
public async Task<AuthorizeResponse> AuthorizeAsync(AuthorizeRequest request)
99
{
1010
// TODO machineKey
11-
var token = await grainFactory.GetGrain<IUserManager>(request.username).Authenticate(request.password);
12-
return new AuthorizeResponse(token, [new ServerResponse(Guid.NewGuid(), "xuita", null)]);
11+
var token = await grainFactory.GetGrain<IUserManager>(request.username).Authorize(request.password);
12+
return new AuthorizeResponse(token);
1313
}
1414
}

0 commit comments

Comments
 (0)