diff --git a/gaseous-server/Classes/Metadata/Games.cs b/gaseous-server/Classes/Metadata/Games.cs index 9e50b98..539c2e5 100644 --- a/gaseous-server/Classes/Metadata/Games.cs +++ b/gaseous-server/Classes/Metadata/Games.cs @@ -30,7 +30,7 @@ namespace gaseous_server.Classes.Metadata returnValue = new Game { Id = 0, - Name = "Unknown" + Name = "Unknown Title" }; Storage.NewCacheValue(returnValue); diff --git a/gaseous-server/Classes/Metadata/Platforms.cs b/gaseous-server/Classes/Metadata/Platforms.cs index 4182a93..97c618b 100644 --- a/gaseous-server/Classes/Metadata/Platforms.cs +++ b/gaseous-server/Classes/Metadata/Platforms.cs @@ -32,7 +32,7 @@ namespace gaseous_server.Classes.Metadata returnValue = new Platform { Id = 0, - Name = "Unknown" + Name = "Unknown Platform" }; Storage.NewCacheValue(returnValue); diff --git a/gaseous-server/Classes/Roms.cs b/gaseous-server/Classes/Roms.cs index 20f8a17..a36decd 100644 --- a/gaseous-server/Classes/Roms.cs +++ b/gaseous-server/Classes/Roms.cs @@ -6,6 +6,30 @@ namespace gaseous_server.Classes { public class Roms { + public static List GetRoms(long GameId) + { + Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string sql = "SELECT * FROM games_roms WHERE gameid = @id ORDER BY `name`"; + Dictionary dbDict = new Dictionary(); + dbDict.Add("id", GameId); + DataTable romDT = db.ExecuteCMD(sql, dbDict); + + if (romDT.Rows.Count > 0) + { + List romItems = new List(); + foreach (DataRow romDR in romDT.Rows) + { + romItems.Add(BuildRom(romDR)); + } + + return romItems; + } + else + { + throw new Exception("Unknown Game Id"); + } + } + public static RomItem GetRom(long RomId) { Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); @@ -17,23 +41,7 @@ namespace gaseous_server.Classes if (romDT.Rows.Count > 0) { DataRow romDR = romDT.Rows[0]; - RomItem romItem = new RomItem - { - Id = (long)romDR["id"], - PlatformId = (long)romDR["platformid"], - GameId = (long)romDR["gameid"], - Name = (string)romDR["name"], - Size = (long)romDR["size"], - CRC = (string)romDR["crc"], - MD5 = (string)romDR["md5"], - SHA1 = (string)romDR["sha1"], - DevelopmentStatus = (string)romDR["developmentstatus"], - Flags = Newtonsoft.Json.JsonConvert.DeserializeObject((string)romDR["flags"]), - RomType = (int)romDR["romtype"], - RomTypeMedia = (string)romDR["romtypemedia"], - MediaLabel = (string)romDR["medialabel"], - Path = (string)romDR["path"] - }; + RomItem romItem = BuildRom(romDR); return romItem; } else @@ -42,6 +50,28 @@ namespace gaseous_server.Classes } } + private static RomItem BuildRom(DataRow romDR) + { + RomItem romItem = new RomItem + { + Id = (long)romDR["id"], + PlatformId = (long)romDR["platformid"], + GameId = (long)romDR["gameid"], + Name = (string)romDR["name"], + Size = (long)romDR["size"], + CRC = (string)romDR["crc"], + MD5 = (string)romDR["md5"], + SHA1 = (string)romDR["sha1"], + DevelopmentStatus = (string)romDR["developmentstatus"], + Flags = Newtonsoft.Json.JsonConvert.DeserializeObject((string)romDR["flags"]), + RomType = (int)romDR["romtype"], + RomTypeMedia = (string)romDR["romtypemedia"], + MediaLabel = (string)romDR["medialabel"], + Path = (string)romDR["path"] + }; + return romItem; + } + public class RomItem { public long Id { get; set; } diff --git a/gaseous-server/Controllers/GamesController.cs b/gaseous-server/Controllers/GamesController.cs index 3c62d3c..3e44bf2 100644 --- a/gaseous-server/Controllers/GamesController.cs +++ b/gaseous-server/Controllers/GamesController.cs @@ -433,6 +433,97 @@ namespace gaseous_server.Controllers } } + [HttpGet] + [Route("{GameId}/roms")] + [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public ActionResult GameRom(long GameId) + { + try + { + Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false); + + List roms = Classes.Roms.GetRoms(GameId); + + return Ok(roms); + } + catch + { + return NotFound(); + } + } + + [HttpGet] + [Route("{GameId}/roms/{RomId}")] + [ProducesResponseType(typeof(Classes.Roms.RomItem), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public ActionResult GameRom(long GameId, long RomId) + { + try + { + Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false); + + Classes.Roms.RomItem rom = Classes.Roms.GetRom(RomId); + if (rom.GameId == GameId) + { + return Ok(rom); + } + else + { + return NotFound(); + } + } + catch + { + return NotFound(); + } + } + + [HttpGet] + [Route("{GameId}/roms/{RomId}/file")] + [ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public ActionResult GameRomFile(long GameId, long RomId) + { + try + { + IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false); + + Classes.Roms.RomItem rom = Classes.Roms.GetRom(RomId); + if (rom.GameId != GameId) + { + return NotFound(); + } + + string romFilePath = rom.Path; + if (System.IO.File.Exists(romFilePath)) + { + string filename = Path.GetFileName(romFilePath); + string filepath = romFilePath; + byte[] filedata = System.IO.File.ReadAllBytes(filepath); + string contentType = "application/octet-stream"; + + var cd = new System.Net.Mime.ContentDisposition + { + FileName = filename, + Inline = false, + }; + + Response.Headers.Add("Content-Disposition", cd.ToString()); + + return File(filedata, contentType); + } + else + { + return NotFound(); + } + } + catch + { + return NotFound(); + } + } + [HttpGet] [Route("{GameId}/screenshots")] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] diff --git a/gaseous-server/Program.cs b/gaseous-server/Program.cs index 1cb716e..542ea6c 100644 --- a/gaseous-server/Program.cs +++ b/gaseous-server/Program.cs @@ -35,7 +35,10 @@ builder.Services.AddControllers().AddJsonOptions(x => // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); -builder.Services.AddSwaggerGen(); +builder.Services.AddSwaggerGen(options => +{ + options.CustomSchemaIds(type => type.ToString()); +}); builder.Services.AddHostedService(); var app = builder.Build();