Adding update endpoint for location, player, spawnable, and user
This commit is contained in:
@@ -45,6 +45,30 @@ public class LocationController : ControllerBase
|
|||||||
return Ok(newLoc);
|
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}")]
|
[HttpDelete("{id}")]
|
||||||
[Authorize(Roles = "SUPER")]
|
[Authorize(Roles = "SUPER")]
|
||||||
public async Task<IActionResult> Delete(string id)
|
public async Task<IActionResult> Delete(string id)
|
||||||
|
|||||||
@@ -93,6 +93,21 @@ public class PlayerController : ControllerBase
|
|||||||
return Ok(player);
|
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]
|
[HttpDelete]
|
||||||
[Authorize(Roles = "USER,SUPER")]
|
[Authorize(Roles = "USER,SUPER")]
|
||||||
public async Task<IActionResult> Delete()
|
public async Task<IActionResult> Delete()
|
||||||
|
|||||||
@@ -33,6 +33,23 @@ public class SpawnableController : ControllerBase
|
|||||||
return Ok(spawnable);
|
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]
|
[HttpGet]
|
||||||
[Authorize(Roles = "SUPER")]
|
[Authorize(Roles = "SUPER")]
|
||||||
public async Task<IActionResult> GetAll()
|
public async Task<IActionResult> GetAll()
|
||||||
|
|||||||
@@ -26,6 +26,20 @@ public class UserController : ControllerBase
|
|||||||
return Ok(users);
|
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
|
// DELETE: /api/User?username=foo
|
||||||
[HttpDelete]
|
[HttpDelete]
|
||||||
[Authorize(Roles = "SUPER")]
|
[Authorize(Roles = "SUPER")]
|
||||||
|
|||||||
@@ -37,4 +37,16 @@ public class LocationControllerTests
|
|||||||
|
|
||||||
Assert.IsType<NotFoundObjectResult>(result);
|
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);
|
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]
|
[Fact]
|
||||||
public async Task AdminTeleport_PlayerNotFound()
|
public async Task AdminTeleport_PlayerNotFound()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -66,4 +66,16 @@ public class SpawnableControllerTests
|
|||||||
|
|
||||||
Assert.IsType<NotFoundObjectResult>(result);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,4 +43,22 @@ public class UserControllerTests
|
|||||||
|
|
||||||
Assert.IsType<NotFoundObjectResult>(result);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace GameAuthApi.Models;
|
||||||
|
|
||||||
|
public class UpdatePlayerRequest
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
public int Climbing { get; set; }
|
||||||
|
}
|
||||||
@@ -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; } = [];
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace GameAuthApi.Models;
|
||||||
|
|
||||||
|
public class UpdateUserRequest
|
||||||
|
{
|
||||||
|
public string Role { get; set; }
|
||||||
|
public string Email { get; set; }
|
||||||
|
}
|
||||||
@@ -45,4 +45,9 @@ public class SpawnableService
|
|||||||
{
|
{
|
||||||
await _spawnables.DeleteOneAsync(s => s.Id == id);
|
await _spawnables.DeleteOneAsync(s => s.Id == id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual async Task UpdateAsync(Spawnable spawnable)
|
||||||
|
{
|
||||||
|
await _spawnables.ReplaceOneAsync(s => s.Id == spawnable.Id, spawnable);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user