Skip to content

Commit da75c4e

Browse files
authored
Default character template (#2830)
* Add DefaultTemplateCharacterId * add TODO about running migrations * Add CharacterSelector * Allow to edit DefaultTemplateCharacterId * Use default template character
1 parent c0a3f18 commit da75c4e

36 files changed

+614
-80
lines changed

src/JoinRpg.Blazor.Client/ApiClients/CharacterGroupsClient.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,8 @@
33

44
namespace JoinRpg.Blazor.Client.ApiClients;
55

6-
public class CharacterGroupsClient : ICharacterGroupsClient
6+
public class CharacterGroupsClient(HttpClient httpClient) : ICharacterGroupsClient
77
{
8-
private readonly HttpClient httpClient;
9-
private readonly ILogger<CharacterGroupsClient> logger;
10-
private readonly CsrfTokenProvider csrfTokenProvider;
11-
12-
public CharacterGroupsClient(HttpClient httpClient, ILogger<CharacterGroupsClient> logger, CsrfTokenProvider csrfTokenProvider)
13-
{
14-
this.httpClient = httpClient;
15-
this.logger = logger;
16-
this.csrfTokenProvider = csrfTokenProvider;
17-
}
18-
198
public async Task<List<CharacterGroupDto>> GetCharacterGroups(int projectId)
209
{
2110
return await httpClient.GetFromJsonAsync<List<CharacterGroupDto>>(
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System.Net.Http.Json;
2+
using JoinRpg.Web.ProjectCommon;
3+
4+
namespace JoinRpg.Blazor.Client.ApiClients;
5+
6+
public class CharactersClient(HttpClient httpClient) : ICharactersClient
7+
{
8+
public async Task<List<CharacterGroupDto>> GetCharacterGroups(int projectId)
9+
{
10+
return await httpClient.GetFromJsonAsync<List<CharacterGroupDto>>(
11+
$"/webapi/character-groups/GetCharacterGroups?projectId={projectId}")
12+
?? throw new Exception("Couldn't get result from server");
13+
}
14+
15+
public async Task<List<CharacterDto>> GetCharacters(int projectId)
16+
{
17+
return await httpClient.GetFromJsonAsync<List<CharacterDto>>(
18+
$"/webapi/character-groups/GetCharacters?projectId={projectId}")
19+
?? throw new Exception("Couldn't get result from server");
20+
}
21+
22+
public async Task<List<CharacterDto>> GetTemplateCharacters(int projectId)
23+
{
24+
return await httpClient.GetFromJsonAsync<List<CharacterDto>>(
25+
$"/webapi/character-groups/GetTempalteCharacters?projectId={projectId}")
26+
?? throw new Exception("Couldn't get result from server");
27+
}
28+
}

src/JoinRpg.Blazor.Client/ApiClients/HttpClientRegistration.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public static WebAssemblyHostBuilder AddHttpClients(this WebAssemblyHostBuilder
2525
.AddHttpClient<IMasterClient, MasterClient>()
2626
.AddHttpClient<IGameSubscribeClient, GameSubscribeClient>()
2727
.AddHttpClient<ICharacterGroupsClient, CharacterGroupsClient>()
28+
.AddHttpClient<ICharactersClient, CharactersClient>()
2829
.AddHttpClient<ICheckInClient, CheckInClient>()
2930
.AddHttpClient<IResponsibleMasterRuleClient, ResponsibleMasterRuleClient>();
3031
}

src/JoinRpg.Dal.Impl/Migrations/202410150618458_DefaultTemplate.Designer.cs

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace JoinRpg.Dal.Impl.Migrations;
2+
3+
using System.Data.Entity.Migrations;
4+
5+
public partial class DefaultTemplate : DbMigration
6+
{
7+
public override void Up()
8+
{
9+
AddColumn("dbo.ProjectDetails", "DefaultTemplateCharacterId", c => c.Int());
10+
CreateIndex("dbo.ProjectDetails", "DefaultTemplateCharacterId");
11+
AddForeignKey("dbo.ProjectDetails", "DefaultTemplateCharacterId", "dbo.Characters", "CharacterId");
12+
}
13+
14+
public override void Down()
15+
{
16+
DropForeignKey("dbo.ProjectDetails", "DefaultTemplateCharacterId", "dbo.Characters");
17+
DropIndex("dbo.ProjectDetails", new[] { "DefaultTemplateCharacterId" });
18+
DropColumn("dbo.ProjectDetails", "DefaultTemplateCharacterId");
19+
}
20+
}

src/JoinRpg.Dal.Impl/Migrations/202410150618458_DefaultTemplate.resx

Lines changed: 126 additions & 0 deletions
Large diffs are not rendered by default.

src/JoinRpg.Dal.Impl/Repositories/CharacterRepositoryImpl.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,23 @@ public async Task<IEnumerable<Character>> GetAvailableCharacters(int projectId)
119119
.OrderBy(c => c.CharacterName).ToListAsync();
120120
}
121121

122+
public async Task<IEnumerable<Character>> GetAllCharacters(int projectId)
123+
{
124+
return await Ctx.Set<Character>()
125+
.Where(c => c.ProjectId == projectId)
126+
.OrderBy(c => c.CharacterName)
127+
.ToListAsync();
128+
}
129+
130+
public async Task<IEnumerable<Character>> GetTemplateCharacters(int projectId)
131+
{
132+
return await Ctx.Set<Character>()
133+
.Where(c => c.ProjectId == projectId)
134+
.Where(c => c.CharacterType == PrimitiveTypes.CharacterType.Slot)
135+
.OrderBy(c => c.CharacterName)
136+
.ToListAsync();
137+
}
138+
122139
public async Task<Character> GetCharacterAsync(int projectId, int characterId)
123140
{
124141
await LoadProjectFields(projectId);

src/JoinRpg.Dal.Impl/Repositories/ProjectRepository.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,8 @@ internal static ProjectInfo CreateInfoFromProject(Project project, ProjectIdenti
339339
CreateFields(project, fieldSettings).ToList(),
340340
fieldSettings,
341341
financeSettings,
342-
project.Details.EnableAccommodation);
342+
project.Details.EnableAccommodation,
343+
CharacterIdentification.FromOptional(projectId, project.Details.DefaultTemplateCharacterId));
343344

344345
IEnumerable<ProjectFieldInfo> CreateFields(Project project, ProjectFieldSettings fieldSettings)
345346
{

src/JoinRpg.Data.Interfaces/ICharacterRepository.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ public interface ICharacterRepository : IDisposable
1919
Task<Character> GetCharacterWithDetails(int projectId, int characterId);
2020
Task<CharacterView> GetCharacterViewAsync(int projectId, int characterId);
2121
Task<IEnumerable<Character>> GetAvailableCharacters(int projectId);
22+
Task<IEnumerable<Character>> GetAllCharacters(int projectId);
23+
Task<IEnumerable<Character>> GetTemplateCharacters(int projectId);
2224
}
2325

2426
public class CharacterView : IFieldContainter

src/JoinRpg.DataModel/Projects/ProjectDetails.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.ComponentModel.DataAnnotations;
2+
using System.ComponentModel.DataAnnotations.Schema;
23
using JoinRpg.PrimitiveTypes.ProjectMetadata;
34

45
namespace JoinRpg.DataModel;
@@ -40,6 +41,11 @@ public class ProjectDetails : IValidatableObject
4041

4142
public string FieldsOrdering { get; set; }
4243

44+
[ForeignKey(nameof(DefaultTemplateCharacter))]
45+
public int? DefaultTemplateCharacterId { get; set; }
46+
47+
public virtual Character? DefaultTemplateCharacter { get; set; }
48+
4349
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
4450
{
4551
if (CharacterNameField != null)

0 commit comments

Comments
 (0)