diff --git a/.gitignore b/.gitignore index f3a3613..9eb6de2 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,6 @@ appsettings.Development.json *.db *.db-shm *.db-wal -*.csproj.user \ No newline at end of file +*.csproj.user + +game-data \ No newline at end of file diff --git a/Controllers/BaseController.cs b/Controllers/BaseController.cs new file mode 100644 index 0000000..62d23c2 --- /dev/null +++ b/Controllers/BaseController.cs @@ -0,0 +1,13 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace PetCompanion.Controllers +{ + [Authorize] + [ApiController] + [Route("api/v1/[controller]")] + public class BaseController : Controller + { + protected string userId => User.Claims.FirstOrDefault(c => c.Type == "user_id").Value; + } +} diff --git a/Controllers/GameDataController.cs b/Controllers/GameDataController.cs index 8d8110b..17552bc 100644 --- a/Controllers/GameDataController.cs +++ b/Controllers/GameDataController.cs @@ -3,13 +3,10 @@ using PetCompanion.Repositories; namespace PetCompanion.Controllers { - [ApiController] - [Route("api/v1/[controller]")] - public class GameDataController : Controller + public class GameDataController : BaseController { private readonly GameItemsRepository gameItemsRepository; private readonly ILogger logger; - private readonly Guid userId = Guid.Parse("f5f4b3b3-3b7b-4b7b-8b7b-7b7b7b7b7b7b"); public GameDataController( ILogger logger, @@ -19,7 +16,20 @@ namespace PetCompanion.Controllers this.gameItemsRepository = gameItemsRepository; } - [HttpGet("item/icon/{itemId}")] + [HttpGet("item/{itemId}")] + public IActionResult GetItemInfo(int itemId) + { + try + { + return Ok(gameItemsRepository.GetById(itemId)); + } + catch (Exception ex) + { + return BadRequest(ex.Message); + } + } + + [HttpGet("item/{itemId}/icon")] public IActionResult GetItemIcon(int itemId) { try diff --git a/Controllers/InventoryController.cs b/Controllers/InventoryController.cs index 8599e15..f966197 100644 --- a/Controllers/InventoryController.cs +++ b/Controllers/InventoryController.cs @@ -1,16 +1,14 @@ using Microsoft.AspNetCore.Mvc; -using PetCompanion.Models; using PetCompanion.Services; namespace PetCompanion.Controllers { [ApiController] [Route("api/v1/[controller]")] - public class InventoryController : ControllerBase + public class InventoryController : BaseController { private readonly PetInventoryService inventoryService; private readonly ILogger logger; - private readonly Guid userId = Guid.Parse("f5f4b3b3-3b7b-4b7b-8b7b-7b7b7b7b7b7b"); public InventoryController( ILogger logger, diff --git a/Controllers/PetController.cs b/Controllers/PetController.cs index e541fb8..779ea25 100644 --- a/Controllers/PetController.cs +++ b/Controllers/PetController.cs @@ -4,14 +4,11 @@ using PetCompanion.Services; namespace PetCompanion.Controllers { - [ApiController] - [Route("api/v1/[controller]")] - public class PetController : ControllerBase + public class PetController : BaseController { private readonly PetService petService; private readonly PetClassService petClassService; private readonly ILogger logger; - private Guid userId = Guid.Parse("f5f4b3b3-3b7b-4b7b-8b7b-7b7b7b7b7b7b"); public PetController( ILogger logger, diff --git a/Controllers/SkillController.cs b/Controllers/SkillController.cs index cc0b5ef..9c5158b 100644 --- a/Controllers/SkillController.cs +++ b/Controllers/SkillController.cs @@ -3,14 +3,11 @@ using PetCompanion.Services; namespace PetCompanion.Controllers { - [ApiController] - [Route("api/v1/[controller]")] - public class SkillController : ControllerBase + public class SkillController : BaseController { private readonly SkillService _skillService; private readonly PetSkillService _petSkillService; private readonly ILogger _logger; - private Guid userId = Guid.Parse("f5f4b3b3-3b7b-4b7b-8b7b-7b7b7b7b7b7b"); public SkillController( ILogger logger, @@ -34,7 +31,7 @@ namespace PetCompanion.Controllers { try { - var skills = _petSkillService.GetPetSkills(petId, userId.ToString()); + var skills = _petSkillService.GetPetSkills(petId, userId); return Ok(skills); } catch (Exception ex) @@ -48,7 +45,7 @@ namespace PetCompanion.Controllers { try { - var result = _petSkillService.UpgradeSkill(petId, userId.ToString(), skillId); + var result = _petSkillService.UpgradeSkill(petId, userId, skillId); return Ok(result); } catch (Exception ex) diff --git a/Program.cs b/Program.cs index 1f22f7b..6f1e21c 100644 --- a/Program.cs +++ b/Program.cs @@ -1,4 +1,6 @@ +using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.EntityFrameworkCore; +using Microsoft.IdentityModel.Tokens; using PetCompanion.Data; using PetCompanion.Repositories; using PetCompanion.Services; @@ -12,6 +14,10 @@ namespace PetCompanion { var builder = WebApplication.CreateBuilder(args); + // Read Firebase configuration from environment variables + var firebaseAppId = Environment.GetEnvironmentVariable("FIREBASE_APP_ID") ?? + throw new InvalidOperationException("FIREBASE_APP_ID environment variable is not set"); + // Add services to the container. builder.Services.AddControllers() .AddJsonOptions(options => @@ -57,6 +63,21 @@ namespace PetCompanion }); }); + builder.Services + .AddAuthentication(JwtBearerDefaults.AuthenticationScheme) + .AddJwtBearer(options => + { + options.Authority = $"https://securetoken.google.com/{firebaseAppId}"; + options.TokenValidationParameters = new TokenValidationParameters + { + ValidateIssuer = true, + ValidIssuer = $"https://securetoken.google.com/{firebaseAppId}", + ValidateAudience = true, + ValidAudience = firebaseAppId, + ValidateLifetime = true + }; + }); + var app = builder.Build(); // Configure the HTTP request pipeline. @@ -67,6 +88,8 @@ namespace PetCompanion } app.UseHttpsRedirection(); + + app.UseAuthentication(); app.UseAuthorization(); // After app builder is created diff --git a/Services/PetActionService.cs b/Services/PetActionService.cs index abd5ff5..cf985a1 100644 --- a/Services/PetActionService.cs +++ b/Services/PetActionService.cs @@ -64,11 +64,11 @@ namespace PetCompanion.Services var gathered = new List(); - var baseRate = timeElapsed + pet.Level * 10; // Base rate per hour + var baseRate = (timeElapsed + pet.Level) / 10; // Base rate per hour gathered.Add(new ActionGathered { Resource = "Junk", - Amount = (int)(baseRate * 2) + Amount = (int)(baseRate * 0.2) }); var random = new Random(); @@ -79,28 +79,28 @@ namespace PetCompanion.Services gathered.Add(new ActionGathered { Resource = "Wisdom", - Amount = (int)(baseRate * (pet.Stats.Intelligence * 2)) + Amount = (int)(baseRate * (pet.Stats.Intelligence * 0.5)) }); break; case PetActionGather.GATHERING_GOLD: gathered.Add(new ActionGathered { Resource = "Gold", - Amount = (int)(baseRate * (pet.Stats.Charisma * 2)) + Amount = (int)(baseRate * (pet.Stats.Charisma * 0.5)) }); break; case PetActionGather.GATHERING_FOOD: gathered.Add(new ActionGathered { Resource = "Food", - Amount = (int)(baseRate * (pet.Stats.Strength * 1.5)) + Amount = (int)(baseRate * (pet.Stats.Strength * 0.5)) }); break; case PetActionGather.EXPLORE: gathered.Add(new ActionGathered { Resource = "Wisdom", - Amount = (int)(baseRate * (pet.Stats.Strength * 3)) + Amount = (int)(baseRate * (pet.Stats.Strength * 0.25)) }); if (random.Next(0, 100) < 5) @@ -122,7 +122,7 @@ namespace PetCompanion.Services gathered.Add(new ActionGathered { Resource = "Gold", - Amount = (int)(baseRate * (pet.Stats.Strength * 3)) + Amount = (int)(baseRate * (pet.Stats.Strength * 0.25)) }); if (random.Next(0, 100) < 10) @@ -130,7 +130,7 @@ namespace PetCompanion.Services pet.Health -= random.Next(5, 10); } - if (random.Next(0, 100) < 500) + if (random.Next(0, 100) < 10) { gathered.Add(new ActionGathered { diff --git a/Services/PetService.cs b/Services/PetService.cs index 5991296..a518a24 100644 --- a/Services/PetService.cs +++ b/Services/PetService.cs @@ -29,18 +29,18 @@ namespace PetCompanion.Services this.petActionService = petActionService; } - public IEnumerable GetAllPets(Guid userId) + public IEnumerable GetAllPets(string userId) { - return petRepository.GetPetsByUserId(userId.ToString()); + return petRepository.GetPetsByUserId(userId); } - public Pet CreatePet(Guid userId, PetCreationRequest petRequest) + public Pet CreatePet(string userId, PetCreationRequest petRequest) { var petId = Guid.NewGuid().ToString(); var pet = new Pet { Id = petId, - UserId = userId.ToString(), + UserId = userId, Name = petRequest.Name, Class = petRequest.Class, Health = 100, diff --git a/pet-companion-api.csproj b/pet-companion-api.csproj index da20927..ca70ec9 100644 --- a/pet-companion-api.csproj +++ b/pet-companion-api.csproj @@ -12,6 +12,7 @@ + all