@@ -31,7 +31,50 @@ public IReadOnlyList<CharacterProfileBackup> GetBackups()
3131 }
3232 }
3333
34- public void Save ( string ident , string characterLabel , ProfileVisibility visibility , CharacterProfileDocumentDto document )
34+ public CharacterProfileDraft ? GetDraft ( string ident )
35+ {
36+ if ( string . IsNullOrWhiteSpace ( ident ) ) return null ;
37+
38+ lock ( _syncRoot )
39+ {
40+ var draft = _file . Drafts . FirstOrDefault ( d => d . Ident . Equals ( ident , StringComparison . Ordinal ) ) ;
41+ return draft == null ? null : Clone ( draft ) ;
42+ }
43+ }
44+
45+ public void SaveDraft ( string ident , string characterLabel , CharacterProfileDocumentDto document )
46+ {
47+ if ( string . IsNullOrWhiteSpace ( ident ) ) return ;
48+
49+ lock ( _syncRoot )
50+ {
51+ var draft = _file . Drafts . FirstOrDefault ( d => d . Ident . Equals ( ident , StringComparison . Ordinal ) ) ;
52+ if ( draft == null )
53+ {
54+ draft = new CharacterProfileDraft { Ident = ident } ;
55+ _file . Drafts . Add ( draft ) ;
56+ }
57+
58+ if ( ! string . IsNullOrWhiteSpace ( characterLabel ) )
59+ draft . CharacterLabel = characterLabel . Trim ( ) ;
60+ draft . Document = document ;
61+ draft . UpdatedAtUtc = DateTimeOffset . UtcNow ;
62+ Persist ( ) ;
63+ }
64+ }
65+
66+ public void ClearDraft ( string ident )
67+ {
68+ if ( string . IsNullOrWhiteSpace ( ident ) ) return ;
69+
70+ lock ( _syncRoot )
71+ {
72+ if ( _file . Drafts . RemoveAll ( d => d . Ident . Equals ( ident , StringComparison . Ordinal ) ) > 0 )
73+ Persist ( ) ;
74+ }
75+ }
76+
77+ public void Save ( string ident , string characterLabel , CharacterProfileDocumentDto document )
3578 {
3679 if ( string . IsNullOrWhiteSpace ( ident ) ) return ;
3780
@@ -49,21 +92,18 @@ public void Save(string ident, string characterLabel, ProfileVisibility visibili
4992 if ( ! string . IsNullOrWhiteSpace ( characterLabel ) )
5093 backup . CharacterLabel = characterLabel . Trim ( ) ;
5194
52- if ( visibility == ProfileVisibility . Public )
53- backup . PublicProfile = document ;
54- else
55- backup . PrivateProfile = document ;
95+ backup . Profile = document ;
5696 backup . UpdatedAtUtc = DateTimeOffset . UtcNow ;
5797 Persist ( ) ;
5898 }
5999 }
60100
61- public CharacterProfileDocumentDto ? GetDocument ( Guid backupId , ProfileVisibility visibility )
101+ public CharacterProfileDocumentDto ? GetDocument ( Guid backupId )
62102 {
63103 lock ( _syncRoot )
64104 {
65105 var backup = _file . Profiles . SingleOrDefault ( p => p . Id == backupId ) ;
66- return visibility == ProfileVisibility . Public ? backup ? . PublicProfile : backup ? . PrivateProfile ;
106+ return backup ? . Profile ?? backup ? . PrivateProfile ?? backup ? . PublicProfile ;
67107 }
68108 }
69109
@@ -104,16 +144,29 @@ private static CharacterProfileBackup Clone(CharacterProfileBackup profile)
104144 Id = profile . Id ,
105145 CharacterLabel = profile . CharacterLabel ,
106146 KnownIdents = [ .. profile . KnownIdents ] ,
147+ Profile = profile . Profile ,
107148 PublicProfile = profile . PublicProfile ,
108149 PrivateProfile = profile . PrivateProfile ,
109150 UpdatedAtUtc = profile . UpdatedAtUtc ,
110151 } ;
111152 }
112153
154+ private static CharacterProfileDraft Clone ( CharacterProfileDraft draft )
155+ {
156+ return new CharacterProfileDraft
157+ {
158+ Ident = draft . Ident ,
159+ CharacterLabel = draft . CharacterLabel ,
160+ Document = draft . Document ,
161+ UpdatedAtUtc = draft . UpdatedAtUtc ,
162+ } ;
163+ }
164+
113165 private sealed class CharacterProfileBackupFile
114166 {
115- public int Version { get ; set ; } = 1 ;
167+ public int Version { get ; set ; } = 2 ;
116168 public List < CharacterProfileBackup > Profiles { get ; set ; } = [ ] ;
169+ public List < CharacterProfileDraft > Drafts { get ; set ; } = [ ] ;
117170 }
118171}
119172
@@ -122,7 +175,16 @@ public sealed class CharacterProfileBackup
122175 public Guid Id { get ; set ; } = Guid . NewGuid ( ) ;
123176 public string CharacterLabel { get ; set ; } = string . Empty ;
124177 public List < string > KnownIdents { get ; set ; } = [ ] ;
178+ public CharacterProfileDocumentDto ? Profile { get ; set ; }
125179 public CharacterProfileDocumentDto ? PublicProfile { get ; set ; }
126180 public CharacterProfileDocumentDto ? PrivateProfile { get ; set ; }
127181 public DateTimeOffset UpdatedAtUtc { get ; set ; } = DateTimeOffset . UtcNow ;
128182}
183+
184+ public sealed class CharacterProfileDraft
185+ {
186+ public string Ident { get ; set ; } = string . Empty ;
187+ public string CharacterLabel { get ; set ; } = string . Empty ;
188+ public CharacterProfileDocumentDto Document { get ; set ; } = new ( ) ;
189+ public DateTimeOffset UpdatedAtUtc { get ; set ; } = DateTimeOffset . UtcNow ;
190+ }
0 commit comments