66using OpenLoco . Dat . Data ;
77using OpenLoco . Dat . FileParsing ;
88using OpenLoco . Dat . Objects ;
9+ using OpenLoco . Dat . Types ;
910using OpenLoco . Definitions ;
1011using OpenLoco . Definitions . Database ;
1112using OpenLoco . Definitions . DTO ;
@@ -35,12 +36,82 @@ public static void MapAdditionalRoutes(IEndpointRouteBuilder parentRoute)
3536 {
3637 _ = parentRoute . MapPost ( string . Empty , CreateDatAsync ) ; // old dat route
3738
39+ _ = parentRoute . MapGet ( RoutesV2 . Missing , ListMissingObjects ) ;
40+ _ = parentRoute . MapPost ( RoutesV2 . Missing , AddMissingObject ) ;
41+
3842 var resourceRoute = parentRoute . MapGroup ( RoutesV2 . ResourceRoute ) ;
3943 _ = resourceRoute . MapGet ( RoutesV2 . File , GetObjectFileAsync ) ;
4044 _ = resourceRoute . MapGet ( RoutesV2 . Images , GetObjectImagesAsync ) ;
4145 }
46+ static async Task < IResult > ListMissingObjects ( [ FromServices ] LocoDbContext db , [ FromServices ] ILogger < ObjectRouteHandler > logger )
47+ {
48+ logger . LogInformation ( "[ListMissingObjects] List requested for missing objects" ) ;
49+
50+ return Results . Ok (
51+ await db . Objects
52+ . Include ( x => x . DatObjects )
53+ . Where ( x => x . Availability == ObjectAvailability . Missing )
54+ . Select ( x => x . ToDtoEntry ( ) )
55+ . ToListAsync ( ) ) ;
56+ }
57+
58+ static async Task < IResult > AddMissingObject ( [ FromBody ] DtoMissingObjectEntry entry , [ FromServices ] LocoDbContext db , [ FromServices ] ILogger < ObjectRouteHandler > logger )
59+ {
60+ var objName = $ "{ entry . DatName } _{ entry . DatChecksum } ";
61+ var existing = await db . Objects . FirstOrDefaultAsync ( x => x . Name == objName ) ;
62+ if ( existing != null )
63+ {
64+ return Results . Conflict ( $ "Object already exists in the database. DatName={ entry . DatName } DatChecksum={ entry . DatChecksum } UploadedDate={ existing ! . UploadedDate } ") ;
65+ }
66+
67+ // double check it's missing
68+ if ( db . DoesObjectExist ( entry . DatName , entry . DatChecksum , out var existingObject ) && existingObject != null )
69+ {
70+ return Results . Conflict ( $ "Object already exists in the database. UniqueId={ existingObject . Id } DatName={ entry . DatName } DatChecksum={ entry . DatChecksum } UploadedDate={ existingObject ! . UploadedDate } ") ;
71+ }
72+
73+ // save to db if true
74+ var tblObject = new TblObject ( )
75+ {
76+ Name = $ "{ entry . DatName } _{ entry . DatChecksum } ",
77+ Description = string . Empty ,
78+ ObjectSource = ObjectSource . Custom ,
79+ ObjectType = entry . ObjectType ,
80+ VehicleType = null ,
81+ Availability = ObjectAvailability . Missing ,
82+ CreatedDate = null ,
83+ ModifiedDate = null ,
84+ UploadedDate = DateOnly . Today ,
85+ Authors = [ ] ,
86+ Tags = [ ] ,
87+ ObjectPacks = [ ] ,
88+ DatObjects = [ ] ,
89+ StringTable = [ ] ,
90+ SubObjectId = 0 ,
91+ Licence = null ,
92+ } ;
93+
94+
95+ _ = await db . Objects . AddAsync ( tblObject ) ;
96+ _ = await db . SaveChangesAsync ( ) ;
97+
98+ // make dat objects
99+ //var xxHash3 = XxHash3.HashToUInt64(datFileBytes);
100+ tblObject . DatObjects . Add ( new TblDatObject ( )
101+ {
102+ ObjectId = tblObject . Id ,
103+ DatName = entry . DatName ,
104+ DatChecksum = entry . DatChecksum ,
105+ xxHash3 = 0 ,
106+ Object = tblObject ,
107+ } ) ;
108+
109+ // save again
110+ _ = await db . SaveChangesAsync ( ) ;
111+ return Results . Created ( $ "Successfully added 'missing' DAT object { tblObject . Name } with checksum { entry . DatChecksum } and unique id { tblObject . Id } ", tblObject . Id ) ;
112+ }
42113
43- //static async Task<IResult> CreateAsync(DtoObjectDescriptor request, LocoDbContext db, [FromServices] IServiceProvider sp, [FromServices] ILogger<ObjectRouteHandler> logger)
114+ //static async Task<IResult> CreateAsync(DtoObjectDescriptor request, [FromServices] LocoDbContext db, [FromServices] IServiceProvider sp, [FromServices] ILogger<ObjectRouteHandler> logger)
44115 //{
45116 // logger.LogInformation("[CreateAsync] Upload requested");
46117
@@ -182,7 +253,7 @@ public static void MapAdditionalRoutes(IEndpointRouteBuilder parentRoute)
182253 // return Results.Created($"Successfully added {tblObject.Name} with unique id {tblObject.Id}", tblObject.Id);
183254 //}
184255
185- static async Task < IResult > CreateDatAsync ( DtoUploadDat request , LocoDbContext db , [ FromServices ] IServiceProvider sp , [ FromServices ] ILogger < ObjectRouteHandler > logger )
256+ static async Task < IResult > CreateDatAsync ( DtoUploadDat request , [ FromServices ] LocoDbContext db , [ FromServices ] IServiceProvider sp , [ FromServices ] ILogger < ObjectRouteHandler > logger )
186257 {
187258 logger . LogInformation ( "[CreateAsync] Upload requested" ) ;
188259
@@ -330,7 +401,7 @@ static async Task<IResult> CreateDatAsync(DtoUploadDat request, LocoDbContext db
330401 return Results . Created ( $ "Successfully added { tblObject . Name } with unique id { tblObject . Id } ", tblObject . Id ) ;
331402 }
332403
333- static async Task < IResult > ReadAsync ( [ FromRoute ] UniqueObjectId id , LocoDbContext db , [ FromServices ] IServiceProvider sp , [ FromServices ] ILogger < ObjectRouteHandler > logger )
404+ static async Task < IResult > ReadAsync ( [ FromRoute ] UniqueObjectId id , [ FromServices ] LocoDbContext db , [ FromServices ] IServiceProvider sp , [ FromServices ] ILogger < ObjectRouteHandler > logger )
334405 {
335406 logger . LogInformation ( "[ReadAsync] Read requested for object {ObjectId}" , id ) ;
336407
@@ -349,20 +420,20 @@ static async Task<IResult> ReadAsync([FromRoute] UniqueObjectId id, LocoDbContex
349420 return ReturnObject ( descriptor , sfm , logger ) ;
350421 }
351422
352- static async Task < IResult > UpdateAsync ( [ FromRoute ] UniqueObjectId id , DtoObjectDescriptor request , LocoDbContext db , [ FromServices ] ILogger < ObjectRouteHandler > logger )
423+ static async Task < IResult > UpdateAsync ( [ FromRoute ] UniqueObjectId id , DtoObjectDescriptor request , [ FromServices ] LocoDbContext db , [ FromServices ] ILogger < ObjectRouteHandler > logger )
353424 {
354425 logger . LogInformation ( "[UpdateAsync] Update requested for object {ObjectId}" , id ) ;
355426 return await Task . Run ( ( ) => Results . Problem ( statusCode : StatusCodes . Status501NotImplemented ) ) ;
356427 }
357428
358- static async Task < IResult > DeleteAsync ( [ FromRoute ] UniqueObjectId id , LocoDbContext db , [ FromServices ] ILogger < ObjectRouteHandler > logger )
429+ static async Task < IResult > DeleteAsync ( [ FromRoute ] UniqueObjectId id , [ FromServices ] LocoDbContext db , [ FromServices ] ILogger < ObjectRouteHandler > logger )
359430 {
360431 logger . LogInformation ( "[DeleteAsync] Delete requested for object {ObjectId}" , id ) ;
361432 // for now we could soft-delete by marking an object as Unavailable?
362433 return await Task . Run ( ( ) => Results . Problem ( statusCode : StatusCodes . Status501NotImplemented ) ) ;
363434 }
364435
365- static async Task < IResult > ListAsync ( HttpContext context , LocoDbContext db , [ FromServices ] ILogger < ObjectRouteHandler > logger )
436+ static async Task < IResult > ListAsync ( HttpContext context , [ FromServices ] LocoDbContext db , [ FromServices ] ILogger < ObjectRouteHandler > logger )
366437 {
367438 logger . LogInformation ( "[ListAsync] List requested for object" ) ;
368439
@@ -439,7 +510,7 @@ await db.Objects
439510 }
440511
441512 // eg: http://localhost:7229/v1/objects/{id}/images
442- static async Task < IResult > GetObjectImagesAsync ( [ FromRoute ] UniqueObjectId id , LocoDbContext db , [ FromServices ] IServiceProvider sp , [ FromServices ] ILogger < ObjectRouteHandler > logger )
513+ static async Task < IResult > GetObjectImagesAsync ( [ FromRoute ] UniqueObjectId id , [ FromServices ] LocoDbContext db , [ FromServices ] IServiceProvider sp , [ FromServices ] ILogger < ObjectRouteHandler > logger )
443514 {
444515 logger . LogInformation ( "[GetObjectImages] Get requested for object {ObjectId}" , id ) ;
445516
@@ -520,7 +591,7 @@ static async Task<IResult> GetObjectImagesAsync([FromRoute] UniqueObjectId id, L
520591 }
521592
522593 // eg: https://localhost:7230/objects/114
523- static async Task < IResult > GetObjectFileAsync ( [ FromRoute ] UniqueObjectId id , LocoDbContext db , [ FromServices ] IServiceProvider sp , [ FromServices ] ILogger < ObjectRouteHandler > logger )
594+ static async Task < IResult > GetObjectFileAsync ( [ FromRoute ] UniqueObjectId id , [ FromServices ] LocoDbContext db , [ FromServices ] IServiceProvider sp , [ FromServices ] ILogger < ObjectRouteHandler > logger )
524595 {
525596 logger . LogInformation ( "[GetObjectFile] Get requested for object {ObjectId}" , id ) ;
526597
0 commit comments