1
- using Microsoft . AspNetCore . Http ;
2
1
using Microsoft . EntityFrameworkCore ;
2
+ using Microsoft . Extensions . Options ;
3
3
using OpenLoco . Dat . Data ;
4
4
using OpenLoco . Dat . FileParsing ;
5
5
using OpenLoco . Dat . Objects ;
6
+ using OpenLoco . Definitions ;
6
7
using OpenLoco . Definitions . Database ;
7
8
using OpenLoco . Definitions . DTO ;
9
+ using OpenLoco . Definitions . Web ;
8
10
9
- namespace OpenLoco . Definitions . Web
11
+ namespace OpenLoco . ObjectService
10
12
{
11
13
// this must be done because eager-loading related many-to-many data in entity framework is recursive and cannot be turned off...
12
14
internal record ExpandedTblLocoObject ( TblLocoObject Object , ICollection < TblAuthor > Authors , ICollection < TblTag > Tags , ICollection < TblModpack > Modpacks ) ;
13
15
14
- public static class Server
16
+ public class ObjectServiceSettings
15
17
{
18
+ public required string ObjectRootFolder { get ; set ; }
19
+ }
20
+
21
+ public class Server ( ObjectServiceSettings settings )
22
+ {
23
+ public Server ( IOptions < ObjectServiceSettings > options ) : this ( options . Value )
24
+ { }
25
+
16
26
// eg: https://localhost:7230/objects/list
17
27
public static async Task < IResult > ListObjects ( LocoDb db )
18
28
=> Results . Ok (
@@ -27,7 +37,7 @@ await db.Objects
27
37
x . VehicleType ) ) . ToListAsync ( ) ) ;
28
38
29
39
// eg: https://localhost:7230/objects/getdat?objectName=114&checksum=123$returnObjBytes=false
30
- public static async Task < IResult > GetDat ( string objectName , uint checksum , bool ? returnObjBytes , LocoDb db )
40
+ public async Task < IResult > GetDat ( string objectName , uint checksum , bool ? returnObjBytes , LocoDb db )
31
41
{
32
42
var eObj = await db . Objects
33
43
. Where ( x => x . OriginalName == objectName && x . OriginalChecksum == checksum )
@@ -37,11 +47,11 @@ public static async Task<IResult> GetDat(string objectName, uint checksum, bool?
37
47
38
48
return eObj == null || eObj . Object == null
39
49
? Results . NotFound ( )
40
- : Results . Ok ( await PrepareLocoObject ( eObj , returnObjBytes ?? false ) ) ;
50
+ : Results . Ok ( await PrepareLocoObject ( eObj , settings . ObjectRootFolder , returnObjBytes ?? false ) ) ;
41
51
}
42
52
43
53
// eg: https://localhost:7230/objects/getobject?uniqueObjectId=246263256&returnObjBytes=false
44
- public static async Task < IResult > GetObject ( int uniqueObjectId , bool ? returnObjBytes , LocoDb db )
54
+ public async Task < IResult > GetObject ( int uniqueObjectId , bool ? returnObjBytes , LocoDb db )
45
55
{
46
56
Console . WriteLine ( $ "Object [{ uniqueObjectId } ] requested") ;
47
57
var eObj = await db . Objects
@@ -52,11 +62,11 @@ public static async Task<IResult> GetObject(int uniqueObjectId, bool? returnObjB
52
62
53
63
return eObj == null || eObj . Object == null
54
64
? Results . NotFound ( )
55
- : Results . Ok ( await PrepareLocoObject ( eObj , returnObjBytes ?? false ) ) ;
65
+ : Results . Ok ( await PrepareLocoObject ( eObj , settings . ObjectRootFolder , returnObjBytes ?? false ) ) ;
56
66
}
57
67
58
68
// eg: https://localhost:7230/objects/originaldatfile?objectName=114&checksum=123
59
- public static async Task < IResult > GetDatFile ( string objectName , uint checksum , LocoDb db )
69
+ public async Task < IResult > GetDatFile ( string objectName , uint checksum , LocoDb db )
60
70
{
61
71
var obj = await db . Objects
62
72
. Where ( x => x . OriginalName == objectName && x . OriginalChecksum == checksum )
@@ -70,23 +80,36 @@ public static async Task<IResult> GetDatFile(string objectName, uint checksum, L
70
80
}
71
81
72
82
// eg: https://localhost:7230/objects/getobjectfile?objectName=114&checksum=123
73
- public static async Task < IResult > GetObjectFile ( int uniqueObjectId , LocoDb db )
83
+ public async Task < IResult > GetObjectFile ( int uniqueObjectId , LocoDb db )
74
84
{
75
85
var obj = await db . Objects
76
86
. Where ( x => x . Id == uniqueObjectId )
77
87
. SingleOrDefaultAsync ( ) ;
78
88
79
89
const string contentType = "application/octet-stream" ;
80
90
81
- return obj ? . IsVanilla == false && File . Exists ( obj . PathOnDisk )
82
- ? Results . File ( obj . PathOnDisk , contentType , Path . GetFileName ( obj . PathOnDisk ) )
91
+ if ( obj == null )
92
+ {
93
+ return Results . NotFound ( ) ;
94
+ }
95
+
96
+ if ( obj . IsVanilla )
97
+ {
98
+ return Results . BadRequest ( "Nice try genius. Downloading vanilla objects is not allowed." ) ;
99
+ }
100
+
101
+ var pathOnDisk = Path . Combine ( settings . ObjectRootFolder , obj . PathOnDisk ) ;
102
+ return File . Exists ( pathOnDisk )
103
+ ? Results . File ( pathOnDisk , contentType , Path . GetFileName ( pathOnDisk ) )
83
104
: Results . NotFound ( ) ;
84
105
}
85
106
86
- internal static async Task < DtoLocoObject > PrepareLocoObject ( ExpandedTblLocoObject eObj , bool returnObjBytes )
107
+ internal static async Task < DtoLocoObject > PrepareLocoObject ( ExpandedTblLocoObject eObj , string objectRootFolder , bool returnObjBytes )
87
108
{
88
109
var obj = eObj ! . Object ;
89
- var bytes = returnObjBytes && ! obj . IsVanilla && File . Exists ( obj . PathOnDisk ) ? Convert . ToBase64String ( await File . ReadAllBytesAsync ( obj . PathOnDisk ) ) : null ;
110
+
111
+ var pathOnDisk = Path . Combine ( objectRootFolder , obj . PathOnDisk ) ;
112
+ var bytes = returnObjBytes && ! obj . IsVanilla && File . Exists ( pathOnDisk ) ? Convert . ToBase64String ( await File . ReadAllBytesAsync ( pathOnDisk ) ) : null ;
90
113
91
114
return new DtoLocoObject (
92
115
obj . Id ,
@@ -109,7 +132,7 @@ internal static async Task<DtoLocoObject> PrepareLocoObject(ExpandedTblLocoObjec
109
132
}
110
133
111
134
// eg: <todo>
112
- public static async Task < IResult > UploadDat ( DtoUploadDat request , LocoDb db )
135
+ public async Task < IResult > UploadDat ( DtoUploadDat request , LocoDb db )
113
136
{
114
137
if ( string . IsNullOrEmpty ( request . DatBytesAsBase64 ) )
115
138
{
@@ -158,15 +181,17 @@ public static async Task<IResult> UploadDat(DtoUploadDat request, LocoDb db)
158
181
return Results . Accepted ( $ "Object already exists in the database. OriginalName={ s5Header . Name } OriginalChecksum={ s5Header . Checksum } UploadDate={ existingObject ! . UploadDate } ") ;
159
182
}
160
183
161
- const string UploadFolder = "Q:\\ Games\\ Locomotion\\ Server\\ CustomObjects\\ Uploaded" ;
184
+ const string SettingsPath = "Q:\\ Games\\ Locomotion\\ Server\\ CustomObjects" ;
185
+ const string UploadFolder = "UploadedObjects" ;
162
186
var uuid = Guid . NewGuid ( ) ;
163
- var saveFileName = Path . Combine ( UploadFolder , $ "{ uuid } .dat") ;
187
+ var saveFileName = Path . Combine ( SettingsPath , UploadFolder , $ "{ uuid } .dat") ;
188
+ File . WriteAllBytes ( saveFileName , datFileBytes ) ;
189
+
164
190
Console . WriteLine ( $ "File accepted OriginalName={ s5Header . Name } OriginalChecksum={ s5Header . Checksum } PathOnDisk={ saveFileName } ") ;
165
191
166
192
var locoTbl = new TblLocoObject ( )
167
193
{
168
194
Name = $ "{ s5Header . Name } _{ s5Header . Checksum } ", // same as DB seeder name
169
- PathOnDisk = saveFileName ,
170
195
OriginalName = s5Header . Name ,
171
196
OriginalChecksum = s5Header . Checksum ,
172
197
IsVanilla = false , // not possible to upload vanilla objects
0 commit comments