diff --git a/WotBlitzStatisticsPro.Blazor/.config/dotnet-tools.json b/WotBlitzStatisticsPro.Blazor/.config/dotnet-tools.json new file mode 100644 index 0000000..d2c459a --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "strawberryshake.tools": { + "version": "11.2.2", + "commands": [ + "dotnet-graphql" + ] + } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/.graphqlrc.json b/WotBlitzStatisticsPro.Blazor/.graphqlrc.json new file mode 100644 index 0000000..5c30e57 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/.graphqlrc.json @@ -0,0 +1,30 @@ +{ + "schema": "schema.graphql", + "documents": "**/*.graphql", + "extensions": { + "strawberryShake": { + "name": "WotBlitzStatisticsProClient", + "namespace": "WotBlitzStatisticsPro.Blazor", + "url": "https://localhost:5001/graphql/", + "dependencyInjection": true, + "strictSchemaValidation": true, + "hashAlgorithm": "md5", + "useSingleFile": true, + "requestStrategy": "Default", + "outputDirectoryName": "Generated", + "noStore": false, + "emitGeneratedCode": true, + "razorComponents": false, + "records": { + "inputs": false, + "entities": false + }, + "transportProfiles": [ + { + "default": "Http", + "subscription": "WebSocket" + } + ] + } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/WotBlitzStatisticsPro.Blazor.csproj b/WotBlitzStatisticsPro.Blazor/WotBlitzStatisticsPro.Blazor.csproj index b670508..e44c58a 100644 --- a/WotBlitzStatisticsPro.Blazor/WotBlitzStatisticsPro.Blazor.csproj +++ b/WotBlitzStatisticsPro.Blazor/WotBlitzStatisticsPro.Blazor.csproj @@ -1,4 +1,4 @@ - + net5.0 @@ -11,8 +11,12 @@ + + + + diff --git a/WotBlitzStatisticsPro.Blazor/schema.extensions.graphql b/WotBlitzStatisticsPro.Blazor/schema.extensions.graphql new file mode 100644 index 0000000..0b5fbd9 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/schema.extensions.graphql @@ -0,0 +1,13 @@ +scalar _KeyFieldSet + +directive @key(fields: _KeyFieldSet!) on SCHEMA | OBJECT + +directive @serializationType(name: String!) on SCALAR + +directive @runtimeType(name: String!) on SCALAR + +directive @enumValue(value: String!) on ENUM_VALUE + +directive @rename(name: String!) on INPUT_FIELD_DEFINITION | INPUT_OBJECT | ENUM | ENUM_VALUE + +extend schema @key(fields: "id") \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/schema.graphql b/WotBlitzStatisticsPro.Blazor/schema.graphql new file mode 100644 index 0000000..3319655 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/schema.graphql @@ -0,0 +1,493 @@ +schema { + query: Query + mutation: Mutation +} + +type Query { + "Finds Wargaming accounts by nick" + findAccounts("Search string." accountNick: String! "Wargaming Realm." realmType: RealmType "Language for the output data." language: RequestLanguage): AccountsSearchResponse! + "Finds clans by search string" + findClans("Search string." searchString: String! "Wargaming Realm." realmType: RealmType "Language for the output data." language: RequestLanguage): ClanSearchResponse! + "Gathers all account information" + accountInfo("AccountId" accountId: Long! "Account region" realmType: RealmType "Request language" requestLanguage: RequestLanguage): AccountInfoResponse! + "Account statistics history for period since \"startDate\"" + accountInfoHistory("AccountId" accountId: Long! "Date from history started" startDate: DateTime! "Account region" realmType: RealmType "Request language" requestLanguage: RequestLanguage): AccountInfoHistoryResponse! + "Tank statistics history for period since \"startDate\"" + tankInfoHistory("AccountId" accountId: Long! "TankId" tankId: Long! "Date from history started" startDate: DateTime! "Account region" realmType: RealmType "Request language" requestLanguage: RequestLanguage): TankInfoHistoryResponse! + "Returns information about player's achievements" + accountAchievements("AccountId" accountId: Long! "Account region" realmType: RealmType "Request language" requestLanguage: RequestLanguage): AccountAchievementsResponse! + "Returns information about player's tank achievements" + tankAchievements("AccountId" accountId: Long! "Account tank Id" tankId: Long! "Account region" realmType: RealmType "Request language" requestLanguage: RequestLanguage): AccountAchievementsResponse! +} + +type Mutation { + "Updates the necessary dictionaries in database.\n\n\n**Returns:**\nInformation about what was updated." + updateDictionaries("Determines what dictionaries should be updated." updateDictionariesRequest: UpdateDictionariesRequestInput!): [UpdateDictionariesResponseItem!]! + "Gathers all account information" + gatherAccountInformation("Account region" realmType: RealmType! "AccountId" accountId: Long! "Request language" requestLanguage: RequestLanguage!): AccountInfoResponse! + "This method accepts GitHub oauth code, and returns JWT token with GutHub user as claim" + gitHubAuthenticate("OAuth code can be generated by this URL https:\/\/github.com\/login\/oauth\/authorize?client_id={yourClientId}" oauthCode: String!): String! +} + +"Mastery" +enum MarkOfMastery { + "No mastery" + NONE + "Third mark of mastery" + RANK3 + "Second mark of mastery" + RANK2 + "First mark of mastery" + RANK1 + "Master mark" + MASTER +} + +"Wargaming API Realm" +enum RealmType { + "Russian region" + RU + "European region" + EU + "North America" + NA + "Asian region" + ASIA +} + +"Wargaming API request language" +enum RequestLanguage { + "Русский" + RU + "English" + EN + "Deutsch" + DE +} + +"Information about player" +type AccountInfoResponse { + "Clan info" + clanInfo: ClanInfoResponse + "Player account identifier" + accountId: Long! + "Account creation date" + createdAt: DateTime! + "Last battle time" + lastBattleTime: DateTime! + "Player's nick" + nickname: String + "Battles count" + battles: Long! + "Capture points" + capturePoints: Long! + "Total damage amount" + damageDealt: Long! + "Total amount of received damage" + damageReceived: Long! + "Dropped capture points" + droppedCapturePoints: Long! + "Total amount of frags" + frags: Long! + "Total amount of fras grater ten 8 lvl" + frags8P: Long! + "Total amount of hits" + hits: Long! + "Total amount of losses" + losses: Long! + "Max frags per battle" + maxFrags: Long! + "Tank id, which kills max frags per battle" + maxFragsTankId: Long! + "Max experience per battle" + maxXp: Long! + "Tank Id which created max experience per battle" + maxXpTankId: Long! + "Total shots count" + shots: Long! + "Total count of spotted vehicles" + spotted: Long! + "Total count of survived battles" + survivedBattles: Long! + "Total count of survived and winned battles" + winAndSurvived: Long! + "Total wins count" + wins: Long! + "Total amount of experience" + xp: Long! + "Average tier" + avgTier: Float! + "Wn7 coefficient" + wn7: Float! + "Player's win rate" + winRate: Decimal! + "Player's average damage" + avgDamage: Decimal! + "Player's average XP" + avgXp: Decimal! + "Damage coefficient" + damageCoefficient: Decimal! + "Rate of survival" + survivalRate: Decimal! + "All player's tanks" + tanks: [TankInfoResponse!] +} + +"Account search result item" +type AccountsSearchResponseItem { + "Player accountId" + accountId: Long! + "Player nick" + nickname: String + "Clan tag. Null if player doesn't have clan membership" + clanTag: String + "Win rate from 0 to 100" + winRate: Int! + "Player's battles count" + battlesCount: Long! + "Last battle time" + lastBattle: DateTime! +} + +"Response contains a list of found accounts" +type AccountsSearchResponse { + "Count of found accounts" + accountsCount: Int! + "Found accounts list" + accounts: [AccountsSearchResponseItem!] +} + +enum ApplyPolicy { + BEFORE_RESOLVER + AFTER_RESOLVER +} + +"Clan information" +type ClanInfoResponse { + "Clan ID" + clanId: Long! + "Date of joining clan" + joinedAt: DateTime! + "Player clan role ID" + role: String + "Player clan role" + roleLocalized: String! + "Clan name" + name: String + "Date of clan creation" + createdAt: DateTime! + "Clan creator account id" + creatorId: Long + "Clan creator nick" + creatorName: String + "Clan description" + description: String + "Html Clan description" + descriptionHtml: String + "Clan commander accountId" + leaderId: Long + "Clan commander nick" + leaderName: String + "Clan members count" + membersCount: Long + "Clan motto" + motto: String + "Renamed clan name" + oldName: String + "Renamed clan tag" + oldTag: String + "Clan tag" + tag: String + "Clan info updated at" + updatedAt: DateTime +} + +"The `Long` scalar type represents non-fractional signed whole 64-bit numeric values. Long can represent values between -(2^63) and 2^63 - 1." +scalar Long + +"The `DateTime` scalar represents an ISO-8601 compliant date time type." +scalar DateTime + +"The built-in `Decimal` scalar type." +scalar Decimal + +"Information about player's tank" +type TankInfoResponse { + "Player account identifier" + accountId: Long! + "Tank identifier" + tankId: Long! + "Total time in battle until tank killed" + battleLifeTimeInSeconds: Int! + "Last battle" + lastBattleTime: DateTime! + "Information is tank in garage or not. Information is not provided without Auth token" + inGarage: Boolean + "Mark of Mastery" + markOfMastery: MarkOfMastery! + "Battles count" + battles: Long! + "Base capture points" + capturePoints: Long! + "Damage dealt" + damageDealt: Long! + "Damage received" + damageReceived: Long! + "Base dropped capture points" + droppedCapturePoints: Long! + "Frags count" + frags: Long! + "Frags count after 8 tier" + frags8P: Long! + "Hits count" + hits: Long! + "Losses count" + losses: Long! + "Max frags per battle" + maxFrags: Long! + "Max XP per battle" + maxXp: Long! + "Shots count" + shots: Long! + "Spotted vehicles count" + spotted: Long! + "Amount of survived battles" + survivedBattles: Long! + "Amount of survived and wined battles" + winAndSurvived: Long! + "Wins count" + wins: Long! + "Total experience" + xp: Long! + "Wn7 coefficient" + wn7: Float! + "Average life time in battle until tank is killed." + avgBattleLifeTimeInMinutes: Decimal! + "Tank's win rate" + winRate: Decimal! + "Average tank's damage" + avgDamage: Decimal! + "Average XP" + avgXp: Decimal! + "Damage coefficient" + damageCoefficient: Decimal! + "Rate of survival" + survivalRate: Decimal! + "Tank name" + name: String + "Tank nation dictionary identifier" + tankNationId: String + "Localized tank nation name" + tankNation: String + "Tank tier" + tier: Int! + "Tank type dictionary identifier" + tankTypeId: String + "Localized tank type name" + tankType: String + "Is it premium tank or not" + isPremium: Boolean! +} + +"Request for update dictionaries mutation" +input UpdateDictionariesRequestInput { + "Determines what dictionaries should be updated. Usage: StaticDictionaries | Achievements | Vehicles" + dictionaryTypes: DictionaryType! +} + +"Represents the response of the Update dictionaries mutation" +type UpdateDictionariesResponseItem { + "Type of updated dictionary" + dictionaryType: DictionaryType! + "A bit summary about what have been updated" + description: String +} + +"Represents information about player's achievements" +type AccountAchievementsResponse { + "Player Id" + accountId: Long! + "Player Achievements by sections" + achievementSections: [AchievementSection!] +} + +"Information about tank statistics history" +type TankInfoHistoryResponse { + "Player account identifier" + accountId: Long! + "Tank identifier" + tankId: Long! + "Total time in battle until tank killed" + battleLifeTimeInSeconds: Int! + "Last battle" + lastBattleTime: DateTime! + "Mark of Mastery" + markOfMastery: MarkOfMastery! + "Tank name" + name: String + "Is vehicle premium" + isPremium: Boolean! + "Vehicle type id" + type: String + "Vehicle nationId" + nation: String + "Vehicle tier" + tier: Int! + "Vehicle preview image" + previewImage: String + "Vehicle normal image" + normalImage: String + "Overall statistics since tank was bought" + overallTankStatistics: ShortStatistics + "Statistics for period" + tankPeriodStatistics: ShortStatistics + "Difference between start and end of the period" + periodDifference: StatisticsDifference + "The detailed history" + statisticsHistory: [StatisticsDifference!] +} + +"Information about player statistics history" +type AccountInfoHistoryResponse { + "Player account identifier" + accountId: Long! + "Account creation date" + createdAt: DateTime! + "Player's nick" + nickname: String + "Overall statistics since account creation" + overallAccountStatistics: ShortStatistics + "Statistics for period" + periodAccountStatistics: ShortStatistics + "Difference between start and end of the period" + periodDifference: StatisticsDifference + "The detailed history" + statisticsHistory: [StatisticsDifference!] +} + +"Response with list of found clans" +type ClanSearchResponse { + "Count of clans in the list" + clansCount: Int! + "List of clans" + clans: [ClanSearchResponseItem!] +} + +"Found clans list item" +type ClanSearchResponseItem { + "Clan Id" + clanId: Long! + "Clan Tag" + tag: String + "Clan Name" + name: String + "Clan created at. (UNIX Epoch time)" + createdAt: Int! + "Clan members count" + membersCount: Int! +} + +"The difference between current statistics state and previous" +type StatisticsDifference { + "Last battle time" + lastBattleTime: DateTime! + "Difference in Battles count" + battles: StatisticsDifferenceItemOfInt64 + "Difference in Average tier" + avgTier: StatisticsDifferenceItemOfDouble + "Difference in Wn7 coefficient" + wn7: StatisticsDifferenceItemOfDouble + "Difference in Player's win rate" + winRate: StatisticsDifferenceItemOfDecimal + "Difference in Player's average damage" + avgDamage: StatisticsDifferenceItemOfDecimal + "Difference in Player's average XP" + avgXp: StatisticsDifferenceItemOfDecimal +} + +"Short statistics info" +type ShortStatistics { + "Last battle time" + lastBattleTime: DateTime! + "Battles count" + battles: Long! + "Average tier" + avgTier: Float! + "Wn7 coefficient" + wn7: Float! + "Player's win rate" + winRate: Decimal! + "Player's average damage" + avgDamage: Decimal! + "Player's average XP" + avgXp: Decimal! +} + +"Represents achievement section info and it's achievements list" +type AchievementSection { + "Section Identifier" + sectionId: String! + "Section order" + order: Int! + "Section Name" + name: String! + "Achievements in the section" + achievements: [Achievement!] +} + +"List of dictionaries" +enum DictionaryType { + "Static dictionaries - Languages, VehicleNations, VehicleTypes, AchievementSections, ClanRoles" + STATIC_DICTIONARIES + "Achievements" + ACHIEVEMENTS + "Vehicles encyclopedia" + VEHICLES + "Only vehicles and Achievements" + ACHIEVEMENTS_AND_VEHICLES + "All dictionaries" + ALL +} + +"Player's achievement information" +type Achievement { + "Achievement Id" + id: String! + "Achievement value" + achievementValue: Int! + "Achievement max series value" + maxSeriesValue: Int + "Achievement condition" + condition: String + "Achievement description" + description: String + "Achievement normal sized image" + image: String + "Achievement big image" + imageBig: String + "Achievement name" + name: String + "Order" + order: Long + "Section Id" + sectionId: String! + "Achievement type" + type: String! +} + +type StatisticsDifferenceItemOfDecimal { + currentValue: Decimal! + difference: Decimal +} + +type StatisticsDifferenceItemOfDouble { + currentValue: Float! + difference: Float +} + +type StatisticsDifferenceItemOfInt64 { + currentValue: Long! + difference: Long +} + +directive @authorize("The name of the authorization policy that determines access to the annotated resource." policy: String "Roles that are allowed to access the annotated resource." roles: [String!] "Defines when when the resolver shall be executed.By default the resolver is executed after the policy has determined that the current user is allowed to access the field." apply: ApplyPolicy! = BEFORE_RESOLVER) repeatable on SCHEMA | OBJECT | FIELD_DEFINITION \ No newline at end of file