using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using RadicadeServer.DB; using RadicadeServer.Extensions; using RadicadeServer.RecNet.Avatar; using RadicadeServer.RecNet.Enums.Store; using RadicadeServer.RecNet.Store; using RadicadeServer.RecNet.Storefront; using RadicadeServer.API.Storefront; namespace RadicadeServer.API.Storefront.V1; [Route("api/storefronts/v1")] [Route("econ/api/storefronts/v1")] public class StorefrontsV1(RecDBContext db) : Controller { [HttpGet("season/{type}")] public IActionResult GetSeason(StorefrontTypes type) { if (type != StorefrontTypes.RecRoyale) return NotFound(); const int maxTiers = 20; const int elitePurchasableItemId = 200100; const int tierPriceTokens = 500; var tiers = new List(); for (int tier = 1; tier <= maxTiers; tier++) { var gift = new Gift { GiftDropId = StorefrontShared.NewGiftDropId(), FriendlyName = $"Season 1 Tier {tier} Reward", Tooltip = "Rec Royale Season 1 reward.", CurrencyType = CurrencyType.RecRoyale_Season1, Currency = 100 + tier * 50, Context = GiftContext.RecRoyale, Rarity = tier >= 15 ? Rarity.Epic : tier >= 8 ? Rarity.Rare : Rarity.Common }; tiers.Add(new SeasonTierDTO { PurchasableItemId = 200000 + tier, Type = PurchasableItem.PurchasableItemType.SeasonTier, IsFeatured = tier == 1, Prices = new List { new() { CurrencyType = CurrencyType.RecCenterTokens, Price = tierPriceTokens + (tier - 1) * 250 } }, SubscriberPrices = new List(), EndDate = null, NewUntil = DateTime.MaxValue, GiftDrops = new List { gift }, Tier = tier, Rewards = new List { new() { RequiresEliteUpgrade = false, GiftDrop = gift, SeasonXpBoost = 0f } } }); } var eliteGift = new Gift { GiftDropId = StorefrontShared.NewGiftDropId(), FriendlyName = "Rec Royale Season 1 Elite Upgrade", Tooltip = "Unlocks the elite track for every tier.", CurrencyType = CurrencyType.RecRoyale_Season1, Currency = 500, Context = GiftContext.RecRoyale, Rarity = Rarity.Epic }; var eliteUpgrade = new PurchasableGiftDrop { PurchasableItemId = elitePurchasableItemId, Type = PurchasableItem.PurchasableItemType.SeasonEliteUpgrade, IsFeatured = true, Prices = new List { new() { CurrencyType = CurrencyType.RecCenterTokens, Price = 2000 } }, SubscriberPrices = new List(), EndDate = null, GiftDrops = new List { eliteGift } }; var now = DateTime.UtcNow; var season = new SeasonStorefrontDTO { StorefrontType = StorefrontTypes.RecRoyale, NextUpdate = DateTime.MaxValue, NewUntil = DateTime.MaxValue, EndDate = DateTime.MaxValue, Season = 1, Name = "Rec Royale Season 1", StartAt = now.AddDays(-30), EndAt = now.AddDays(30), CurrencyType = CurrencyType.RecRoyale_Season1, EliteUpgrade = eliteUpgrade, Tiers = tiers, PersonalDetails = new SeasonPersonalDetailsDTO { HasEliteUpgrade = false, HasEliteUpgradePlatformMask = 0, CurrentSeasonTier = 0, ModifiedAt = now } }; return Ok(season); } [HttpGet("balanceAddType/{type}/{addType}"), Authorize] public IActionResult GetBalanceAddConfig(CurrencyType type, StorefrontBalanceAddTypes addType) { var userId = User.GetUserId(); return Ok(new StorefrontBalanceAddConfigDTO { BalanceAddType = addType, CurrencyType = type, BaseAward = 10, RateLimit = 0, Multiplier = 1f }); } [HttpGet("{type}")] public async Task GetStorefront(StorefrontTypes type) { var items = await StorefrontShared.GetStoreItems(db, (long)type); if (items.Count == 0 && !Enum.IsDefined(typeof(StorefrontTypes), type)) return NotFound(); return Ok(new GiftDropStorefront { NextUpdate = DateTime.MaxValue, NewUntil = null, StorefrontType = type, StoreItems = items }); } [HttpGet("toptoday")] public async Task GetTopItems() { var items = await StorefrontShared.GetStoreItems(db, (long)StorefrontTypes.Watch); return Ok(items.Where(x => x.IsFeatured).Select(x => x.PurchasableItemId).ToList()); } [HttpPost("objectives"), Authorize] public IActionResult CompleteObjectives([FromBody] List objectives) { var userId = User.GetUserId(); return Ok(); } [HttpGet("adcarouselitems")] public IActionResult GetAdCarouselItems() { return Ok(Array.Empty()); } }