A music rating site using MusicBrainz API for artist and release metadata, and CoverArtArchive API for art. Users can rate albums and create collages of their highest-rated albums, with an option to constrain results to a particular era.
When viewing a page for a release that has yet to be rated, the MusicBrainz API is called to retreive metadata and the CoverArtArchive API is called to retreive a URL for the artwork, if available. Upon first rating of any release, this data is saved to the database to circumvent future API calls and decrease time to load release pages.
Users can also create and view artwork collages for other users, or view the site-wide top 10 based on average ratings of all users.
To try it out, feel free to use the following account: name "testuser", password "qwerty123".
Podcast Site Builder is a website templates for podcasts. Upon launching, an admin can set any RSS feed and the site will populate with the title and episodes of the podcast. The admin can then add a description for the podcast, social media links, hosts, and social media links for the hosts.
Upon initial admin registration after launching, that admin will be marked in the database as "head admin". Only the head admin is able to add and remove other admins, but subsequent admins otherwise share the same permissions.
Upon login, the "admin" (and "head", if logged in as the first admin) attributes is stored in the browser session and checked on all "/admin" routes to ensure edits are only made by users with the correct permissions.
If an image is uploaded for a host, it is given a random 16-digit alphanumeric string as a key (while confirming that the key is not already in use by another hero portrait, in case of the unlikely event that the same key is generated twice) and stored in an Amazon S3 bucket while the key is stored in the database.
As an example, I've created a website for the podcast "My Brother, My Brother and Me".
This site is based on the "Ability Draft" mode in Dota 2. Using an existing Dota 2 character as a base, mix and match any of the spells in the game to create your own hero with a new name, biography, and optional custom portrait.
For custom hero potraits, the same key generation method is used as with Podcast Site Builder to store the image in an S3 bucket. If an image is not uploaded, the "image" attribute is left null in the database, resulting in the portrait of the selected base hero being used, as with the third custom hero in the above image.
To account for the wide variety of spells - for example, while all spells will have a name and a description, attributes such as area of effect and cooldown will not always be applicable - most spell data is stored in the database as a single "details" attribute, in the form of a string formatted to be later parseable as a JSON object.
If users create an account, they can rate other users' heroes, allowing display of all user-created heroes antheral (as with Musicollage, feel free to log in with "testuser / qwerty123").
Note: not all hero and spell data is currently entered and the game is updated frequently, so forms for data entry and updates exist in an admin-only section of the site.
All of the above projects were built in C# with ASP.NET Core and MySQL.