diff --git a/CFCoreAPI/Endpoints/Categories/CategoriesAPI.cs b/CFCoreAPI/Endpoints/Categories/CategoriesAPI.cs new file mode 100644 index 0000000..01cc2e1 --- /dev/null +++ b/CFCoreAPI/Endpoints/Categories/CategoriesAPI.cs @@ -0,0 +1,28 @@ +using System.Text.Json; +using CFCoreAPI.Endpoints.Categories.Responses; +using Microsoft.AspNetCore.WebUtilities; + +namespace CFCoreAPI.Endpoints.Categories +{ + public class CategoriesAPI : APIBase + { + public CategoriesAPI(HttpClient httpClient) : base(httpClient) + { + } + + public async Task GetCategories(int gameId, int? classId) + { + string url = "/v1/categories"; + url = QueryHelpers.AddQueryString(url, "gameId", gameId.ToString()); + if (classId != null) url = QueryHelpers.AddQueryString(url, "classId", classId.ToString()); + HttpResponseMessage response = await httpClient.GetAsync(url); + + CategoriesResponse result; + using (Stream contentStream = await response.Content.ReadAsStreamAsync()) + { + result = (await JsonSerializer.DeserializeAsync(contentStream))!; + } + return result; + } + } +} \ No newline at end of file diff --git a/CFCoreAPI/Endpoints/Categories/Responses/CategoriesResponse.cs b/CFCoreAPI/Endpoints/Categories/Responses/CategoriesResponse.cs new file mode 100644 index 0000000..dee852f --- /dev/null +++ b/CFCoreAPI/Endpoints/Categories/Responses/CategoriesResponse.cs @@ -0,0 +1,62 @@ +using System.Text.Json.Serialization; + +namespace CFCoreAPI.Endpoints.Categories.Responses +{ + public class CategoriesResponse + { + [JsonConstructor] + public CategoriesResponse( + List data + ) + { + this.Data = data; + } + + public IReadOnlyList Data { get; } + + public class DataModel + { + [JsonConstructor] + public DataModel( + int id, + int gameId, + string name, + string slug, + string url, + string iconUrl, + DateTime dateModified, + bool isClass, + int classId, + int parentCategoryId, + int displayIndex + ) + { + this.Id = id; + this.GameId = gameId; + this.Name = name; + this.Slug = slug; + this.Url = url; + this.IconUrl = iconUrl; + this.DateModified = dateModified; + this.IsClass = isClass; + this.ClassId = classId; + this.ParentCategoryId = parentCategoryId; + this.DisplayIndex = displayIndex; + } + + public int Id { get; } + public int GameId { get; } + public string Name { get; } + public string Slug { get; } + public string Url { get; } + public string IconUrl { get; } + public DateTime DateModified { get; } + public bool IsClass { get; } + public int ClassId { get; } + public int ParentCategoryId { get; } + public int DisplayIndex { get; } + } + } + + +} \ No newline at end of file diff --git a/CFCoreAPI/Endpoints/Files/FilesAPI.cs b/CFCoreAPI/Endpoints/Files/FilesAPI.cs index d5718ba..8be90f8 100644 --- a/CFCoreAPI/Endpoints/Files/FilesAPI.cs +++ b/CFCoreAPI/Endpoints/Files/FilesAPI.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using CFCoreAPI.Endpoints.Files.Requests; using CFCoreAPI.Endpoints.Files.Responses; using Microsoft.AspNetCore.WebUtilities; @@ -34,8 +35,8 @@ namespace CFCoreAPI.Endpoints.Files if (index != null) QueryHelpers.AddQueryString(url, "index", index.ToString()); if (pageSize != null) QueryHelpers.AddQueryString(url, "pageSize", pageSize.ToString()); HttpResponseMessage response = await httpClient.GetAsync(url); - ModFilesResponse result; + ModFilesResponse result; using (Stream contentStream = await response.Content.ReadAsStreamAsync()) { result = await JsonSerializer.DeserializeAsync(contentStream); @@ -43,5 +44,46 @@ namespace CFCoreAPI.Endpoints.Files return result; } + public async Task GetFilesAsync(ModFilesRequest request) + { + string url = "/v1/mods/files"; + HttpContent content = new StringContent(JsonSerializer.Serialize(request)); + HttpResponseMessage response = await httpClient.PostAsync(url, content); + + FileResponse result; + using (Stream contentStream = await response.Content.ReadAsStreamAsync()) + { + result = await JsonSerializer.DeserializeAsync(contentStream); + } + return result; + } + + public async Task GetModFileChangelog(int modId, int field) + { + string url = "/v1/mods/{0}/files/{1}/changelog"; + string.Format(url, modId, field); + HttpResponseMessage response = await httpClient.GetAsync(url); + + StringResponse result; + using (Stream contentStream = await response.Content.ReadAsStreamAsync()) + { + result = await JsonSerializer.DeserializeAsync(contentStream); + } + return result; + } + + public async Task GetModFileDownloadURL(int modId, int field) + { + string url = "/v1/mods/{0}/files/{1}/download-url"; + string.Format(url, modId, field); + HttpResponseMessage response = await httpClient.GetAsync(url); + + StringResponse result; + using (Stream contentStream = await response.Content.ReadAsStreamAsync()) + { + result = await JsonSerializer.DeserializeAsync(contentStream); + } + return result; + } } } \ No newline at end of file diff --git a/CFCoreAPI/Endpoints/Files/Requests/ModFilesRequest.cs b/CFCoreAPI/Endpoints/Files/Requests/ModFilesRequest.cs new file mode 100644 index 0000000..dded31b --- /dev/null +++ b/CFCoreAPI/Endpoints/Files/Requests/ModFilesRequest.cs @@ -0,0 +1,19 @@ +using System.Text.Json.Serialization; + +namespace CFCoreAPI.Endpoints.Files.Requests +{ + public class ModFilesRequest + { + [JsonConstructor] + public ModFilesRequest( + List modIds + ) + { + this.ModIds = modIds; + } + + public IReadOnlyList ModIds { get; } + } + + +} \ No newline at end of file diff --git a/CFCoreAPI/Endpoints/Files/Responses/FileResponse.cs b/CFCoreAPI/Endpoints/Files/Responses/FileResponse.cs new file mode 100644 index 0000000..9cdca65 --- /dev/null +++ b/CFCoreAPI/Endpoints/Files/Responses/FileResponse.cs @@ -0,0 +1,172 @@ +using System.Text.Json.Serialization; + +namespace CFCoreAPI.Endpoints.Files.Responses +{ + public struct FileResponse + { + [JsonConstructor] + public FileResponse( + List data + ) + { + this.Data = data; + } + + public IReadOnlyList Data { get; } + + public struct DataModel + { + [JsonConstructor] + public DataModel( + int id, + int gameId, + int modId, + bool isAvailable, + string displayName, + string fileName, + int releaseType, + int fileStatus, + List hashes, + DateTime fileDate, + int fileLength, + int downloadCount, + string downloadUrl, + List gameVersions, + List sortableGameVersions, + List dependencies, + bool exposeAsAlternative, + int parentProjectFileId, + int alternateFileId, + bool isServerPack, + int serverPackFileId, + int fileFingerprint, + List modules + ) + { + this.Id = id; + this.GameId = gameId; + this.ModId = modId; + this.IsAvailable = isAvailable; + this.DisplayName = displayName; + this.FileName = fileName; + this.ReleaseType = releaseType; + this.FileStatus = fileStatus; + this.Hashes = hashes; + this.FileDate = fileDate; + this.FileLength = fileLength; + this.DownloadCount = downloadCount; + this.DownloadUrl = downloadUrl; + this.GameVersions = gameVersions; + this.SortableGameVersions = sortableGameVersions; + this.Dependencies = dependencies; + this.ExposeAsAlternative = exposeAsAlternative; + this.ParentProjectFileId = parentProjectFileId; + this.AlternateFileId = alternateFileId; + this.IsServerPack = isServerPack; + this.ServerPackFileId = serverPackFileId; + this.FileFingerprint = fileFingerprint; + this.Modules = modules; + } + + public int Id { get; } + public int GameId { get; } + public int ModId { get; } + public bool IsAvailable { get; } + public string DisplayName { get; } + public string FileName { get; } + public int ReleaseType { get; } + public int FileStatus { get; } + public IReadOnlyList Hashes { get; } + public DateTime FileDate { get; } + public int FileLength { get; } + public int DownloadCount { get; } + public string DownloadUrl { get; } + public IReadOnlyList GameVersions { get; } + public IReadOnlyList SortableGameVersions { get; } + public IReadOnlyList Dependencies { get; } + public bool ExposeAsAlternative { get; } + public int ParentProjectFileId { get; } + public int AlternateFileId { get; } + public bool IsServerPack { get; } + public int ServerPackFileId { get; } + public int FileFingerprint { get; } + public IReadOnlyList Modules { get; } + } + + public struct DependencyModel + { + [JsonConstructor] + public DependencyModel( + int modId, + int relationType + ) + { + this.ModId = modId; + this.RelationType = relationType; + } + + public int ModId { get; } + public int RelationType { get; } + } + + public struct HashModel + { + [JsonConstructor] + public HashModel( + string value, + int algo + ) + { + this.Value = value; + this.Algo = algo; + } + + public string Value { get; } + public int Algo { get; } + } + + public struct ModuleModel + { + [JsonConstructor] + public ModuleModel( + string name, + int fingerprint + ) + { + this.Name = name; + this.Fingerprint = fingerprint; + } + + public string Name { get; } + public int Fingerprint { get; } + } + + public struct SortableGameVersion + { + [JsonConstructor] + public SortableGameVersion( + string gameVersionName, + string gameVersionPadded, + string gameVersion, + DateTime gameVersionReleaseDate, + int gameVersionTypeId + ) + { + this.GameVersionName = gameVersionName; + this.GameVersionPadded = gameVersionPadded; + this.GameVersion = gameVersion; + this.GameVersionReleaseDate = gameVersionReleaseDate; + this.GameVersionTypeId = gameVersionTypeId; + } + + public string GameVersionName { get; } + public string GameVersionPadded { get; } + public string GameVersion { get; } + public DateTime GameVersionReleaseDate { get; } + public int GameVersionTypeId { get; } + } + } + + + +} \ No newline at end of file diff --git a/CFCoreAPI/Endpoints/Fingerprints/FingerprintsAPI.cs b/CFCoreAPI/Endpoints/Fingerprints/FingerprintsAPI.cs new file mode 100644 index 0000000..f64aff3 --- /dev/null +++ b/CFCoreAPI/Endpoints/Fingerprints/FingerprintsAPI.cs @@ -0,0 +1,10 @@ +namespace CFCoreAPI.Endpoints.Fingerprints +{ + public class FingerprintsAPI : APIBase + { + public FingerprintsAPI(HttpClient httpClient) : base(httpClient) + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/CFCoreAPI/Endpoints/Minecraft/MinecraftAPI.cs b/CFCoreAPI/Endpoints/Minecraft/MinecraftAPI.cs new file mode 100644 index 0000000..cdc4cb3 --- /dev/null +++ b/CFCoreAPI/Endpoints/Minecraft/MinecraftAPI.cs @@ -0,0 +1,10 @@ +namespace CFCoreAPI.Endpoints.Minecraft +{ + public class MinecraftAPI : APIBase + { + public MinecraftAPI(HttpClient httpClient) : base(httpClient) + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/CFCoreAPI/Endpoints/Mods/ModsAPI.cs b/CFCoreAPI/Endpoints/Mods/ModsAPI.cs new file mode 100644 index 0000000..663112f --- /dev/null +++ b/CFCoreAPI/Endpoints/Mods/ModsAPI.cs @@ -0,0 +1,10 @@ +namespace CFCoreAPI.Endpoints.Mods +{ + public class ModsAPI : APIBase + { + public ModsAPI(HttpClient httpClient) : base(httpClient) + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/CFCoreAPI/Endpoints/Responses/StringResponse.cs b/CFCoreAPI/Endpoints/Responses/StringResponse.cs new file mode 100644 index 0000000..9dc3d3b --- /dev/null +++ b/CFCoreAPI/Endpoints/Responses/StringResponse.cs @@ -0,0 +1,17 @@ +using System.Text.Json.Serialization; + +namespace CFCoreAPI.Endpoints.Files.Responses +{ + public struct StringResponse + { + [JsonConstructor] + public StringResponse( + string data + ) + { + this.Data = data; + } + + public string Data { get; } + } +} \ No newline at end of file