# NetStone API # API # Release Notes
### 3.2.0 20\. May 25 This release extends fallback support by handling the more granular privacy settings the Lodestone added. New endpoints allow retrieving characters and free companies from cache by name, and the landing page now shows libraries and their licenses. ##### New - Support for more granular privacy settings on profile - 503 now returned if profile generally accessible, but details are hidden - Endpoints for retrieving characters and free companies from cache by name - /Character/ByName/{name}/{world} - /FreeCompany/ByName/{name}/{world} - Result is always loaded from cache - Libraries and their licenses shown on [https://netstone.api.tawmy.net/libs](https://netstone.api.tawmy.net/libs) ##### Changed - Mount and minion counts now loaded from configuration instead of requiring code changes - 404 response codes not printed to console anymore ##### Removed - API V2
### 3.1.1 30\. Apr 25 ##### Changed - Total minion and mount numbers updated for 7.21 ##### Fixed - GlamourName and CreatorName returned empty string instead of being null if not set - Properties were already nullable, now they actually return null - Potentially a breaking change if client does not handle nullability for these properties correctly
### 3.1.0 20\. Apr 25 Version 3.0.0 added fallback support for when the Lodestone is entirely unreachable. This version extends this by also allowing fallbacks when the Lodestone is down for maintenance or when a profile is private. If no fallback is used, a 503 HTTP Status Code is returned. A new .NET SDK replaces the existing API Client, and there is various maintenance-related changes too. ##### New - .NET SDK - Rebuilt from the ground up for dependency injection, this new SDK replaces the existing NetStone API Client. - Changelog [here](https://wiki.tawmy.net/books/netstone-api/page/release-notes-IW4) - Basic usage guide [here](https://github.com/Tawmy/NetStone.Api.Sdk) - Handle private profiles and Lodestone maintenance - NetStone returns an empty object when either of these apply - API now has a check for when essential properties are empty and returns an 503 HTTP Status Code - When FallbackType is set to Any, fallback is used - Check added for Free Companies as well, but is untested - Data protection for ASP.NET Core encryption keys - Keys are encrypted using X.509 certificate and stored in database - Health checks for database and data protection certificate expiry - Tracing data now recorded for mapping extensions - Global exception handler for HTTP Status Code 404 and 503 results ##### Changed - Default API version is now 3 - API version 2 marked as obsolete - Will be removed in a future release - When retrieving free company members, full character profiles are only queued once - They were previously queued per-character, this should greatly improve performance - Parsing class jobs throws more appropriate exception - Remove redundant Console.WriteLine calls to prevent duplicate exception output
### 3.0.1 24\. Mar 25 ##### Changed - useFallback parameter accepts "None", "Http", and "Any" values now - Previously it was simple bool - "Any" behaves as previous "true", catching all exceptions - "Http" catches HttpRequestExceptions only - HttpRequestException is thrown when connection to the Lodestone fails (eg. when it's down, rate limited, etc) - Other exceptions are likely to be parsing bug and swallowing them may not be desired ##### Fixed - Landing page "OpenAPI Spec" button was opening V2 API spec ##### Maintenance - Fallbacks are logged as warnings ##### Breaking Changes - useFallback type changed from bool to FallbackType enum
### 3.0.0 23\. Mar 25 This version adds fallback support in case the Lodestone is unreachable. It also adds OpenTelemetry metrics and tracing support. Metrics give me insight in how much the API is used and whether it can process all requests. Tracing data allows me to tune performance and if things went wrong, see where they did. ##### New - API V3 with fallback support - New useFallback parameter - If set and parsing fails, API returns cached data - New V3 DTOs have fallbackUsed and fallbackReason properties for transparency - AutoMapper removed in API V3, replaced with manual mapping - OpenTelemetry Metrics - Helps getting an overview over how much each endpoint is used, how long requests take on average, and how many fail - OpenTelemetry Tracing - Helps getting insight into how long each part of a request takes exactly, for performance optimisations - New unit tests comparing API V2 and V3 responses ##### Maintenance - Runtime upgrade to .NET 9 - Switch to MIT license ##### Fixed - Free Company focus mapping - Character not assigned to achievements if retrieved after achievements were already cached - Error while retrieving free company members in edge case where character was retrieved before, but free company was not - Free Company not always updated when player changed/left FC ##### Removed - API V1 ##### Breaking Changes - API V1 removed - None in Grand Company affiliation renamed to NotSpecified
### 2.1.2 03\. Jan 25 ##### Fixed - Exception while attempting to cache character that had a name or world change
### 2.1.1 05\. Nov 24 ##### Fixed - Page margin too large on mobile - Landing page scrolling horizontally on mobile - Demo too wide on mobile once data loaded
### 2.1.0 03\. Nov 24 ##### New - [Landing Page](https://netstone.api.tawmy.net/ "Landing Page") - Basic introduction to the project - Demo for retrieving data - Links to Changelog, Swagger UI, and OpenAPI definition - "Data refreshed" exchanges - Previous queues were published to queues whenever data was requested through queue, no matter whether it was cached or not - New exchanges are published to whenever data is refreshed from Lodestone, not when it was cached ##### Changed - Outgoing queues are now exchanges - See "Breaking Changes" for further details - Default API version is now 2 - API version 1 marked as obsolete - Will be removed in a future release - Swagger UI now always available ##### Breaking Changes - Outgoing RabbitMQ messages are now published to exchanges instead of queues - Allows fanout exchange to publish messages to multiple queues - Requires manual configuration of exchange -> queue binding - If RabbitMQ was used before, both exchange and queue will exist and only
### 2.0.3 28\. Sep 24 ##### Fixed - Free company members failed to parse if at least one of its members had been cached before
### 2.0.2 27\. Sep 24 ##### Fixed - Grand Company parsing fails under certain circumstances
### 2.0.1 22\. Sep 24 ##### Changed - Version is printed to console on startup
### 2.0.0 22\. Sep 24 Complete revamp of the API. Instead of simply parsing and returning NetStone data, Lodestone data is now mapped onto database entities and cached. Retrieving character data can now return cached data as DTOs, or refresh data from the Lodestone and return as said DTOs. ##### New - Character achievement parsing - NetStone entity to database mapping - **Caching of database entities** - Character + attributes - Character ClassJobs - Character Minions - Character Mounts - Character Achievements - Free Company - Free Company Memberes - **NetStone.Api.Client project for easy data retrieval in .NET projects** - Various unit tests to compare parsed data and data mapped to database entities and DTOs - Additional properties in DTOs like whether data is cached, when it was last refreshed, and collection totals + percentages - RabbitMQ support for all endpoints
### 1.1.0 15\. Jul 24 ##### New - Dawntrail Jobs parsing - They were ignored before, now data is actually being parsed
### 1.0.3 01\. Jul 24 ##### Fixed - Exception when parsing Dawntrail jobs
### 1.0.2 15\. Apr 24 ##### Fixed - Exception when parsing free company rankings for free companies without ranking(s)
### 1.0.1 27\. Jan 24 ##### Fixed - Exception when parsing disciples of the hand/land
### 1.0.0 25\. Jan 24 ##### Initial Release - Character parsing - Character - ClassJobs - Minions - Mounts - Free Company parsing - Free Company - Free Company members
# RabbitMQ ### Queues (inbound)
NameREST API methodAssociated Exchanges (see below for details)
netstone-get-character[/Character/{lodestoneId}](https://api.netstone.tawmy.dev/swagger/index.html#/Character/get_Character__lodestoneId_ "/Character/{lodestoneId}")netstone-get-character-result netstone-get-character-refreshed
netstone-get-character-class-jobs[/Character/ClassJobs/{lodestoneId}](https://api.netstone.tawmy.dev/swagger/index.html#/Character/get_Character_ClassJobs__lodestoneId_ "/Character/ClassJobs/{lodestoneId}")netstone-get-character-class-jobs-result netstone-get-character-class-jobs-refreshed
netstone-get-character-minions[/Character/Minions/{lodestoneId}](https://api.netstone.tawmy.dev/swagger/index.html#/Character/get_Character_Minions__lodestoneId_ "/Character/Minions/{lodestoneId}")netstone-get-character-minions-result netstone-get-character-minions-refreshed
netstone-get-character-mounts[/Character/Mounts/{lodestoneId}](https://api.netstone.tawmy.dev/swagger/index.html#/Character/get_Character_Mounts__lodestoneId_ "/Character/Mounts/{lodestoneId}")netstone-get-character-mounts-result netstone-get-character-mounts-refreshed
netstone-get-character-achievements[/Character/Achievements/{lodestoneId}](https://api.netstone.tawmy.dev/swagger/index.html#/Character/get_Character_Achievements__lodestoneId_ "/Character/Achievements/{lodestoneId}")netstone-get-character-achievements-result netstone-get-character-achievements-refreshed
netstone-get-free-company[/FreeCompany/{lodestoneId}](https://api.netstone.tawmy.dev/swagger/index.html#/FreeCompany/get_FreeCompany__lodestoneId_ "/FreeCompany/{lodestoneId}")netstone-get-free-company-result netstone-get-free-company-refreshed
netstone-get-free-company-members[/FreeCompany/Members/{lodestoneId}](https://api.netstone.tawmy.dev/swagger/index.html#/FreeCompany/get_FreeCompany_Members__lodestoneId_ "/FreeCompany/Members/{lodestoneId}")netstone-get-free-company-members-result netstone-get-free-company-members-refreshed
### Exchanges (outbound)
NameSent When
netstone-get-character-resultCharacter data requested through queue.
netstone-get-character-refreshedCharacter data refreshed from Lodestone.
netstone-get-character-class-jobs-resultCharacter's class jobs requested through queue.
netstone-get-character-class-jobs-refreshedCharacter's class jobs refreshed from Lodestone.
netstone-get-character-minions-result Character's minions requested through queue.
netstone-get-character-minions-refreshed Character's minions refreshed from Lodestone.
netstone-get-character-mounts-result Character's mounts requested through queue.
netstone-get-character-mounts-refreshed Character's mounts refreshed from Lodestone.
netstone-get-character-achievements-result Character's achievements requested through queue.
netstone-get-character-achievements-refreshed Character's achievements refreshed from Lodestone.
netstone-get-free-company-result Free Company data requested through queue.
netstone-get-free-company-refreshed Free Company data refreshed from Lodestone.
netstone-get-free-company-members-result Free Company's members requested through queue.
netstone-get-free-company-members-refreshed Free Company's members refreshed from Lodestone.
\- "result" exchanges are always (cached or not) filled when data was requested through inbound queue, NOT when requested through API. \- "refreshed" exchanges are filled whenever data was refreshed from the Lodestone, no matter whether through inbound queue or API. It is however NOT filled when data was returned from cache. # Configuration and Deployment Local and DEV deployments are done through a combination of two compose files. - Local: compose.yml + compose.**local**.yml - DEV: compose.yml + compose.**dev**.yml Most environment variables are already set and committed to the repository. Some environment variables do not have values set, as they are confidential. Please set those values when deploying the compose project:
Environment Variable
DB\_PASSWORDPassword for Postgres database. Will be initialised with this value.
RABBITMQ\_DEFAULT\_USERDefault admin user for RabbitMQ. Please use a separate user for NetStone API.
RABBITMQ\_DEFAULT\_PASSDefault admin password for RabbitMQ. Please use a separate user for NetStone API.
RABBITMQ\_USERNAMEUser for RabbitMQ authentication. Please do not use the default admin user.
RABBITMQ\_PASSWORDUser for RabbitMQ authentication. Please do not use the default admin user.
The RabbitMQ connection will fail before the user is created. The rest of the API will work just fine. # API Client # Release Notes This project has been archived and replaced with [NetStone API SDK](https://wiki.tawmy.net/books/netstone-api/page/release-notes-IW4).
### 3.0.1 24\. Mar 25 ##### Breaking Changes - useFallback parameter now uses FallbackType enum instead of bool
### 3.0.0 23\. Mar 25 ##### New - API V3 & Fallback support - Methods now have optional useFallback parameter - If set to true and parsing fails, API returns cached data - New V3 DTOs have fallbackUsed and fallbackReason properties for transparency ##### Maintenance - Runtime upgrade to .NET 9 - Switch to MIT license ##### Breaking Changes - DTOs have gotten split into V2 and V3 - DTOs used by client now have V3 suffix
### 2.1.0 03\. Nov 24 ##### New - Resilience - Client now tries a request again if it fails - Replaces previous logic for access token refresh ##### Fixed - Typo in "Craftsmanship" attribute ##### Maintenance - Check amount of members returned by free company members endpoint - One error case was previously not caught by not checking length - Add missing free companies from NetStone API to client tests
### 2.0.3 29\. Sep 24 ##### Fixed - Free Company members were not being received
### 2.0.2 27\. Sep 24 ##### Fixed - Wrong primary attributes for Ninja and Viper ##### Maintenance - Add additional character tests previously added to API
### 2.0.1 22\. Sep 24 ##### Maintenance - Use common extension for version output
### 2.0.0 22\. Sep 24 ##### Initial Release - Full support for all NetStone API methods - Character - Free Company
# SDK # Release Notes
### 3.2.0 20\. May 25 ##### New - Support for custom request timeouts - Requesting achievements can take time, so increasing the default may be desired - Retrieval of characters and free companies from cache by name - NetStoneException carries more information about errors ##### Breaking Changes - "V3" removed from entity names
### 3.1.2 26\. Apr 25 Purely a maintenance update to keep the NetStone Common module up to date.
### 3.1.1 25\. Apr 25 The old NetStone API Client threw NotFoundExceptions if the response status code was a 404. The new SDK instead threw an ApiException, which was a breaking change and required a dependency on/an import of Refit. It now throws NotFoundExceptions again, and a generic NetStoneException on other unsuccessful response status codes. ##### Fixed - Exceptions would require dependency on/import of Refit - Errors now throw NetStoneException - 404 responses would throw Refit ApiException instead of NetStone Common NotFoundException - 404 responses now throw NotFoundException, just like NetStone API Client used to
### 3.1.0 20\. Apr 25 ##### Initial Release - Built for dependency injection - Default .NET resilience handler with extended timeouts built-in - Support for all Character and Free Company endpoints - Basic usage guide at [https://github.com/Tawmy/NetStone.Api.Sdk](https://github.com/Tawmy/NetStone.Api.Sdk) - Replaces previous NetStone.Api.Client