@@ -26,6 +26,15 @@ public class PrefabDataManager : IPrefabDataManager
26
26
27
27
bool IsOnlineMode => ! this . applicationSettings . IsOfflineMode ;
28
28
29
+ /// <summary>
30
+ /// constructor
31
+ /// </summary>
32
+ /// <param name="applicationSettings"></param>
33
+ /// <param name="serializer"></param>
34
+ /// <param name="applicationFileSystem"></param>
35
+ /// <param name="prefabsRepositoryClient"></param>
36
+ /// <param name="filesRepositoryClient"></param>
37
+ /// <param name="referencesRepositoryClient"></param>
29
38
public PrefabDataManager ( ApplicationSettings applicationSettings , ISerializer serializer , IApplicationFileSystem applicationFileSystem ,
30
39
IPrefabsRepositoryClient prefabsRepositoryClient , IPrefabFilesRepositoryClient filesRepositoryClient , IReferencesRepositoryClient referencesRepositoryClient )
31
40
{
@@ -37,6 +46,7 @@ public PrefabDataManager(ApplicationSettings applicationSettings, ISerializer se
37
46
this . applicationFileSystem = Guard . Argument ( applicationFileSystem ) . NotNull ( ) . Value ;
38
47
}
39
48
49
+ ///<inheritdoc/>
40
50
public IEnumerable < PrefabProject > GetAllPrefabs ( string applicationId )
41
51
{
42
52
if ( ! prefabsCache . ContainsKey ( applicationId ) )
@@ -46,6 +56,7 @@ public IEnumerable<PrefabProject> GetAllPrefabs(string applicationId)
46
56
return prefabsCache [ applicationId ] ;
47
57
}
48
58
59
+ ///<inheritdoc/>
49
60
public IEnumerable < PrefabProject > GetPrefabsForScreen ( ApplicationDescription applicationDescription , string screenName )
50
61
{
51
62
if ( applicationDescription . AvailablePrefabs . ContainsKey ( screenName ) )
@@ -63,15 +74,38 @@ public IEnumerable<PrefabProject> GetPrefabsForScreen(ApplicationDescription app
63
74
yield break ;
64
75
}
65
76
77
+ ///<inheritdoc/>
78
+ public async Task DownloadPrefabDataAsync ( string applicationId , string prefabId , string prefabVersion )
79
+ {
80
+ Guard . Argument ( applicationId , nameof ( applicationId ) ) . NotNull ( ) . NotEmpty ( ) ;
81
+ Guard . Argument ( prefabId , nameof ( prefabId ) ) . NotNull ( ) . NotEmpty ( ) ;
82
+ Guard . Argument ( prefabVersion , nameof ( prefabVersion ) ) . NotNull ( ) . NotEmpty ( ) ;
83
+ var prefabProject = LoadPrefabFromLocalStorage ( applicationId , prefabId ) ;
84
+ var versionToDownload = prefabProject . AvailableVersions . FirstOrDefault ( a => a . Version . ToString ( ) . Equals ( prefabVersion ) )
85
+ ?? throw new ArgumentException ( $ "Version { prefabVersion } doesn't exist for prefab { prefabProject . PrefabName } ") ;
86
+ await DownloadPrefabDataAsync ( prefabProject , versionToDownload ) ;
87
+ }
88
+
89
+ ///<inheritdoc/>
66
90
public async Task DownloadPrefabDataAsync ( PrefabProject prefabProject , PrefabVersion prefabVersion )
67
91
{
92
+ Guard . Argument ( prefabProject , nameof ( prefabProject ) ) . NotNull ( ) ;
93
+ Guard . Argument ( prefabVersion , nameof ( prefabVersion ) ) . NotNull ( ) ;
94
+
68
95
var prefabsDirectory = Path . Combine ( this . applicationFileSystem . GetPrefabProjectDirectory ( prefabProject ) , prefabVersion . ToString ( ) ) ;
69
- if ( ! Directory . Exists ( prefabsDirectory ) )
96
+ if ( ! Directory . Exists ( prefabsDirectory ) )
70
97
{
71
98
Directory . CreateDirectory ( prefabsDirectory ) ;
72
- }
99
+ }
100
+
73
101
if ( IsOnlineMode )
74
- {
102
+ {
103
+ if ( HasMostRecentDataAlreadyAvailable ( ) )
104
+ {
105
+ logger . Information ( "Skip download of version {0} of prefab project {1}. Data already available." , prefabVersion , prefabProject . PrefabName ) ;
106
+ return ;
107
+ }
108
+
75
109
//Download project references data
76
110
var projectReferences = await this . referencesRepositoryClient . GetProjectReferencesAsync ( prefabProject . PrefabId , prefabVersion . ToString ( ) ) ;
77
111
if ( projectReferences != null )
@@ -80,9 +114,27 @@ public async Task DownloadPrefabDataAsync(PrefabProject prefabProject, PrefabVer
80
114
this . serializer . Serialize ( prefabReferencesFile , projectReferences ) ;
81
115
}
82
116
await DownloadFilesWithTagsAsync ( prefabProject , prefabVersion , new [ ] { prefabProject . PrefabId } ) ;
117
+ logger . Information ( "Download completed for version {0} of prefab project {1}" , prefabVersion , prefabProject . PrefabName ) ;
118
+ }
119
+
120
+ bool HasMostRecentDataAlreadyAvailable ( )
121
+ {
122
+ string lastUpdatedDataFile = Path . Combine ( prefabsDirectory , Constants . LastUpdatedFileName ) ;
123
+ DateTime lastUpdated = DateTime . MinValue . ToUniversalTime ( ) ;
124
+ if ( File . Exists ( lastUpdatedDataFile ) )
125
+ {
126
+ if ( ! DateTime . TryParse ( File . ReadAllText ( lastUpdatedDataFile ) , out lastUpdated ) )
127
+ {
128
+ throw new Exception ( $ "Failed to read last updated data from file : { lastUpdatedDataFile } ") ;
129
+ }
130
+ File . Delete ( lastUpdatedDataFile ) ;
131
+ }
132
+ File . WriteAllText ( lastUpdatedDataFile , DateTime . Now . ToUniversalTime ( ) . ToString ( "O" ) ) ;
133
+ return ( prefabVersion . IsPublished && prefabVersion . PublishedOn < lastUpdated ) ;
83
134
}
84
135
}
85
136
137
+ ///<inheritdoc/>
86
138
public async Task DownloadPrefabsAsync ( )
87
139
{
88
140
if ( IsOnlineMode )
@@ -102,10 +154,11 @@ public async Task DownloadPrefabsAsync()
102
154
}
103
155
serializer . Serialize ( prefabFile , prefab ) ;
104
156
}
157
+ logger . Information ( "Download of Prefabs completed" ) ;
105
158
}
106
159
}
107
160
108
-
161
+ ///<inheritdoc/>
109
162
public async Task AddPrefabAsync ( PrefabProject prefabProject )
110
163
{
111
164
if ( IsOnlineMode )
@@ -127,6 +180,8 @@ public async Task AddPrefabAsync(PrefabProject prefabProject)
127
180
{
128
181
await AddOrUpdateDataFileAsync ( prefabProject , prefabProject . LatestActiveVersion , file , prefabProject . PrefabId ) ;
129
182
}
183
+
184
+ logger . Information ( "Prefab project {@prefabProject} was added." , prefabProject ) ;
130
185
}
131
186
132
187
////when a new prefab is created , add it to the prefabs cache
@@ -159,6 +214,7 @@ await this.filesClient.AddProjectDataFile(new Core.Models.ProjectDataFile()
159
214
FilePath = Path . GetRelativePath ( prefabsDirectory , filePath ) ,
160
215
Tag = tag ,
161
216
} , filePath ) ;
217
+ logger . Information ( "File {0} belonging to version {1} of prefab project {2} was added/updated." , Path . GetFileName ( filePath ) , prefabVersion . ToString ( ) , prefabProject . PrefabName ) ;
162
218
}
163
219
}
164
220
@@ -173,8 +229,10 @@ public async Task DeleteDataFileAsync(PrefabProject prefabProject, PrefabVersion
173
229
{
174
230
File . Delete ( fileToDelete ) ;
175
231
}
232
+ logger . Information ( "File {0} belonging to version {1} of prefab project {2} was deleted." , Path . GetFileName ( fileToDelete ) , prefabVersion . ToString ( ) , prefabProject . PrefabName ) ;
176
233
}
177
234
235
+ ///<inheritdoc/>
178
236
public async Task AddPrefabVersionAsync ( PrefabProject prefabProject , PrefabVersion newVersion , PrefabVersion cloneFrom )
179
237
{
180
238
if ( IsOnlineMode )
@@ -197,7 +255,6 @@ void CopyAll(DirectoryInfo source, DirectoryInfo target)
197
255
{
198
256
fi . CopyTo ( Path . Combine ( target . FullName , fi . Name ) , true ) ;
199
257
}
200
-
201
258
// Copy each subdirectory using recursion.
202
259
foreach ( DirectoryInfo diSourceSubDir in source . GetDirectories ( ) )
203
260
{
@@ -207,13 +264,13 @@ void CopyAll(DirectoryInfo source, DirectoryInfo target)
207
264
}
208
265
}
209
266
210
-
211
267
prefabProject . AvailableVersions . Add ( newVersion ) ;
212
268
string prefabDescriptionFile = this . applicationFileSystem . GetPrefabProjectFile ( prefabProject ) ;
213
269
serializer . Serialize < PrefabProject > ( prefabDescriptionFile , prefabProject ) ;
214
-
270
+ logger . Information ( "Added new version {0} of prefab {1} from version {2}." , newVersion . ToString ( ) , prefabProject . PrefabName , cloneFrom . ToString ( ) ) ;
215
271
}
216
272
273
+ ///<inheritdoc/>
217
274
public async Task UpdatePrefabVersionAsync ( PrefabProject prefabProject , PrefabVersion prefabVersion )
218
275
{
219
276
if ( IsOnlineMode )
@@ -222,37 +279,41 @@ public async Task UpdatePrefabVersionAsync(PrefabProject prefabProject, PrefabVe
222
279
}
223
280
string prefabDescriptionFile = this . applicationFileSystem . GetPrefabProjectFile ( prefabProject ) ;
224
281
serializer . Serialize < PrefabProject > ( prefabDescriptionFile , prefabProject ) ;
282
+ logger . Information ( "Version {0} of prefab {1} was updated." , prefabVersion . ToString ( ) , prefabProject . PrefabName ) ;
225
283
}
226
-
227
- public async Task SavePrefabDataAsync ( PrefabProject prefabProject , PrefabVersion prefabVerssion )
284
+
285
+ ///<inheritdoc/>
286
+ public async Task SavePrefabDataAsync ( PrefabProject prefabProject , PrefabVersion prefabVersion )
228
287
{
229
288
if ( IsOnlineMode )
230
289
{
231
- string projectDirectory = Path . Combine ( this . applicationFileSystem . GetPrefabProjectDirectory ( prefabProject ) , prefabVerssion . ToString ( ) ) ;
290
+ string projectDirectory = Path . Combine ( this . applicationFileSystem . GetPrefabProjectDirectory ( prefabProject ) , prefabVersion . ToString ( ) ) ;
232
291
233
292
string processsFile = Path . Combine ( projectDirectory , Constants . PrefabProcessFileName ) ;
234
- await AddOrUpdateDataFileAsync ( prefabProject , prefabVerssion , processsFile , prefabProject . PrefabId ) ;
293
+ await AddOrUpdateDataFileAsync ( prefabProject , prefabVersion , processsFile , prefabProject . PrefabId ) ;
235
294
236
295
string templateFile = Path . Combine ( projectDirectory , Constants . PrefabTemplateFileName ) ;
237
296
if ( File . Exists ( templateFile ) )
238
297
{
239
- await AddOrUpdateDataFileAsync ( prefabProject , prefabVerssion , templateFile , prefabProject . PrefabId ) ;
298
+ await AddOrUpdateDataFileAsync ( prefabProject , prefabVersion , templateFile , prefabProject . PrefabId ) ;
240
299
}
241
300
242
301
foreach ( var file in Directory . EnumerateFiles ( Path . Combine ( projectDirectory , Constants . ReferencesDirectory ) , "*.*" ) )
243
302
{
244
- await AddOrUpdateDataFileAsync ( prefabProject , prefabVerssion , file , prefabProject . PrefabId ) ;
303
+ await AddOrUpdateDataFileAsync ( prefabProject , prefabVersion , file , prefabProject . PrefabId ) ;
245
304
}
246
305
247
306
foreach ( var file in Directory . EnumerateFiles ( Path . Combine ( projectDirectory , Constants . DataModelDirectory ) , "*.cs" ) )
248
307
{
249
- await AddOrUpdateDataFileAsync ( prefabProject , prefabVerssion , file , prefabProject . PrefabId ) ;
308
+ await AddOrUpdateDataFileAsync ( prefabProject , prefabVersion , file , prefabProject . PrefabId ) ;
250
309
}
251
310
252
311
foreach ( var file in Directory . EnumerateFiles ( Path . Combine ( projectDirectory , Constants . ScriptsDirectory ) , "*.csx" ) )
253
312
{
254
- await AddOrUpdateDataFileAsync ( prefabProject , prefabVerssion , file , prefabProject . PrefabId ) ;
313
+ await AddOrUpdateDataFileAsync ( prefabProject , prefabVersion , file , prefabProject . PrefabId ) ;
255
314
}
315
+
316
+ logger . Information ( "Data for version {0} of prefab {1} was saved." , prefabVersion . ToString ( ) , prefabProject . PrefabName ) ;
256
317
}
257
318
}
258
319
@@ -300,4 +361,15 @@ private List<PrefabProject> LoadPrefabsFromLocalStorage(string applicationId)
300
361
return prefabProjects ;
301
362
}
302
363
364
+ private PrefabProject LoadPrefabFromLocalStorage ( string applicationId , string prefabId )
365
+ {
366
+ var prefabProjectFile = Path . Combine ( this . applicationFileSystem . GetApplicationPrefabsDirectory ( applicationId ) , prefabId , $ "{ prefabId } .atm") ;
367
+ if ( File . Exists ( prefabProjectFile ) )
368
+ {
369
+ PrefabProject prefabProject = serializer . Deserialize < PrefabProject > ( prefabProjectFile ) ;
370
+ return prefabProject ;
371
+ }
372
+ throw new FileNotFoundException ( $ "File { prefabProjectFile } doesn't exist.") ;
373
+ }
374
+
303
375
}
0 commit comments