Adding update endpoint for location, player, spawnable, and user

This commit is contained in:
hz
2025-06-09 10:23:43 -05:00
parent 7aa192d728
commit 44f57a1121
13 changed files with 174 additions and 0 deletions
+24
View File
@@ -45,6 +45,30 @@ public class LocationController : ControllerBase
return Ok(newLoc);
}
[HttpPut("{id}")]
[Authorize(Roles = "SUPER")]
public async Task<IActionResult> Update(string id, [FromBody] UpdateLocationRequest req)
{
var location = await _locationService.GetByIdAsync(id);
if (location == null)
return NotFound("Location not found.");
location.X = req.X;
location.Y = req.Y;
location.Z = req.Z;
location.N = req.N;
location.NE = req.NE;
location.E = req.E;
location.SE = req.SE;
location.S = req.S;
location.SW = req.SW;
location.W = req.W;
location.NW = req.NW;
await _locationService.UpdateAsync(location);
return Ok(location);
}
[HttpDelete("{id}")]
[Authorize(Roles = "SUPER")]
public async Task<IActionResult> Delete(string id)
+15
View File
@@ -93,6 +93,21 @@ public class PlayerController : ControllerBase
return Ok(player);
}
[HttpPut]
[Authorize(Roles = "USER,SUPER")]
public async Task<IActionResult> Update([FromBody] UpdatePlayerRequest req)
{
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
var player = await _playerService.GetByUserIdAsync(userId);
if (player == null)
return NotFound("Player not found.");
player.Name = req.Name;
player.Climbing = req.Climbing;
await _playerService.UpdateAsync(player);
return Ok(player);
}
[HttpDelete]
[Authorize(Roles = "USER,SUPER")]
public async Task<IActionResult> Delete()
+17
View File
@@ -33,6 +33,23 @@ public class SpawnableController : ControllerBase
return Ok(spawnable);
}
[HttpPut("{id}")]
[Authorize(Roles = "SUPER")]
public async Task<IActionResult> Update(string id, [FromBody] UpdateSpawnableRequest req)
{
var spawnable = await _spawnableService.GetByIdAsync(id);
if (spawnable == null)
return NotFound("Spawnable not found.");
spawnable.Name = req.Name.ToLower();
spawnable.SpawnRate = req.SpawnRate;
spawnable.CollectAction = req.CollectAction;
spawnable.CollectResults = req.CollectResults;
await _spawnableService.UpdateAsync(spawnable);
return Ok(spawnable);
}
[HttpGet]
[Authorize(Roles = "SUPER")]
public async Task<IActionResult> GetAll()
+14
View File
@@ -26,6 +26,20 @@ public class UserController : ControllerBase
return Ok(users);
}
[HttpPut]
[Authorize(Roles = "SUPER")]
public async Task<IActionResult> UpdateUser([FromQuery] string username, [FromBody] UpdateUserRequest req)
{
var user = await _userService.GetByUsernameAsync(username);
if (user == null)
return NotFound($"User '{username}' not found.");
user.Role = req.Role;
user.Email = req.Email;
await _userService.UpdateAsync(user);
return Ok(user);
}
// DELETE: /api/User?username=foo
[HttpDelete]
[Authorize(Roles = "SUPER")]
@@ -37,4 +37,16 @@ public class LocationControllerTests
Assert.IsType<NotFoundObjectResult>(result);
}
[Fact]
public async Task Update_NotFound()
{
var svc = new Mock<LocationService>(config);
svc.Setup(l => l.GetByIdAsync("id")).ReturnsAsync((Location?)null);
var controller = new LocationController(svc.Object, new Mock<PlayerService>(config).Object);
var result = await controller.Update("id", new UpdateLocationRequest());
Assert.IsType<NotFoundObjectResult>(result);
}
}
@@ -61,6 +61,21 @@ public class PlayerControllerTests
Assert.IsType<NotFoundObjectResult>(result);
}
[Fact]
public async Task Update_PlayerNotFound()
{
var svc = new Mock<PlayerService>(cfg);
svc.Setup(p => p.GetByUserIdAsync("u")).ReturnsAsync((Player?)null);
var controller = new PlayerController(svc.Object, new Mock<LocationService>(cfg).Object, new Mock<SpawnableService>(cfg).Object, new Mock<ItemService>(cfg).Object)
{
ControllerContext = ContextWithUser("u")
};
var result = await controller.Update(new UpdatePlayerRequest { Name="n", Climbing=1 });
Assert.IsType<NotFoundObjectResult>(result);
}
[Fact]
public async Task AdminTeleport_PlayerNotFound()
{
@@ -66,4 +66,16 @@ public class SpawnableControllerTests
Assert.IsType<NotFoundObjectResult>(result);
}
[Fact]
public async Task Update_NotFound()
{
var svc = new Mock<SpawnableService>(config);
svc.Setup(s => s.GetByIdAsync("id")).ReturnsAsync((Spawnable)null);
var controller = new SpawnableController(svc.Object);
var result = await controller.Update("id", new UpdateSpawnableRequest { Name="n", SpawnRate=1, CollectAction="a" });
Assert.IsType<NotFoundObjectResult>(result);
}
}
+18
View File
@@ -43,4 +43,22 @@ public class UserControllerTests
Assert.IsType<NotFoundObjectResult>(result);
}
[Fact]
public async Task UpdateUser_NotFound()
{
var config = new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string,string>
{
{"MongoDB:ConnectionString","mongodb://localhost"},
{"MongoDB:DatabaseName","test"}
}).Build();
var mockService = new Mock<UserService>(config);
mockService.Setup(s => s.GetByUsernameAsync("no")).ReturnsAsync((User)null);
var controller = new UserController(mockService.Object);
var result = await controller.UpdateUser("no", new UpdateUserRequest { Email="e", Role="USER" });
Assert.IsType<NotFoundObjectResult>(result);
}
}
+17
View File
@@ -0,0 +1,17 @@
namespace GameAuthApi.Models;
public class UpdateLocationRequest
{
public int? X { get; set; }
public int? Y { get; set; }
public int? Z { get; set; }
public string N { get; set; }
public string NE { get; set; }
public string E { get; set; }
public string SE { get; set; }
public string S { get; set; }
public string SW { get; set; }
public string W { get; set; }
public string NW { get; set; }
}
+7
View File
@@ -0,0 +1,7 @@
namespace GameAuthApi.Models;
public class UpdatePlayerRequest
{
public string Name { get; set; }
public int Climbing { get; set; }
}
+11
View File
@@ -0,0 +1,11 @@
using System.Collections.Generic;
namespace GameAuthApi.Models;
public class UpdateSpawnableRequest
{
public string Name { get; set; }
public int SpawnRate { get; set; }
public string CollectAction { get; set; }
public List<CollectOutcome> CollectResults { get; set; } = [];
}
+7
View File
@@ -0,0 +1,7 @@
namespace GameAuthApi.Models;
public class UpdateUserRequest
{
public string Role { get; set; }
public string Email { get; set; }
}
+5
View File
@@ -45,4 +45,9 @@ public class SpawnableService
{
await _spawnables.DeleteOneAsync(s => s.Id == id);
}
public virtual async Task UpdateAsync(Spawnable spawnable)
{
await _spawnables.ReplaceOneAsync(s => s.Id == spawnable.Id, spawnable);
}
}