|
|
@ -1,13 +1,15 @@
|
|
|
|
|
|
|
|
using System.ComponentModel.DataAnnotations;
|
|
|
|
using System.Runtime.CompilerServices;
|
|
|
|
using System.Runtime.CompilerServices;
|
|
|
|
using API.Context;
|
|
|
|
using API.Context;
|
|
|
|
using API.DTO;
|
|
|
|
using API.DTO;
|
|
|
|
using AppContext.Entities;
|
|
|
|
using API.Validation;
|
|
|
|
using Microsoft.AspNetCore.Authorization;
|
|
|
|
using Microsoft.AspNetCore.Authorization;
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
using Model;
|
|
|
|
using Model;
|
|
|
|
using Services;
|
|
|
|
using Services;
|
|
|
|
|
|
|
|
|
|
|
|
[assembly: InternalsVisibleTo("UnitTests")]
|
|
|
|
[assembly: InternalsVisibleTo("UnitTests")]
|
|
|
|
|
|
|
|
|
|
|
|
namespace API.Controllers;
|
|
|
|
namespace API.Controllers;
|
|
|
|
|
|
|
|
|
|
|
|
[ApiController]
|
|
|
|
[ApiController]
|
|
|
@ -36,19 +38,49 @@ public class UsersController(IUserService users, ITeamService teams, ITacticServ
|
|
|
|
var userTactics = await tactics.ListTacticsOf(userId);
|
|
|
|
var userTactics = await tactics.ListTacticsOf(userId);
|
|
|
|
return new GetUserDataResponse(userTeams.ToArray(), userTactics.Select(t => t.ToDto()).ToArray());
|
|
|
|
return new GetUserDataResponse(userTeams.ToArray(), userTactics.Select(t => t.ToDto()).ToArray());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public record ChangeUserInformationRequest(
|
|
|
|
|
|
|
|
[EmailAddress] string? Email = null,
|
|
|
|
|
|
|
|
[Name] string? Name = null,
|
|
|
|
|
|
|
|
[StringLength(1024)] string? ProfilePicture = null,
|
|
|
|
|
|
|
|
[StringLength(256, MinimumLength = 4, ErrorMessage = "password length must be between 4 and 256")]
|
|
|
|
|
|
|
|
string? Password = null
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[HttpPut("/user")]
|
|
|
|
|
|
|
|
[Authorize]
|
|
|
|
|
|
|
|
public async Task<IActionResult> ChangeUserInformation([FromBody] ChangeUserInformationRequest req)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var userId = accessor.CurrentUserId(HttpContext);
|
|
|
|
|
|
|
|
var currentUser = (await users.GetUser(userId))!;
|
|
|
|
|
|
|
|
await users.UpdateUser(
|
|
|
|
|
|
|
|
new User(
|
|
|
|
|
|
|
|
userId,
|
|
|
|
|
|
|
|
req.Name ?? currentUser.Name,
|
|
|
|
|
|
|
|
req.Email ?? currentUser.Email,
|
|
|
|
|
|
|
|
req.ProfilePicture ?? currentUser.ProfilePicture,
|
|
|
|
|
|
|
|
currentUser.IsAdmin
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
req.Password
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Ok();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public record ShareTacticToUserRequest(
|
|
|
|
public record ShareTacticToUserRequest(
|
|
|
|
int TacticId,
|
|
|
|
int TacticId,
|
|
|
|
int UserId
|
|
|
|
int UserId
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
[HttpPost("/user/share-tactic")]
|
|
|
|
[HttpPost("/user/share-tactic")]
|
|
|
|
[Authorize]
|
|
|
|
[Authorize]
|
|
|
|
public async Task<IActionResult> ShareTactic([FromBody] ShareTacticToUserRequest sharedTactic)
|
|
|
|
public async Task<IActionResult> ShareTactic([FromBody] ShareTacticToUserRequest sharedTactic)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var currentUserId = accessor.CurrentUserId(HttpContext);
|
|
|
|
var currentUserId = accessor.CurrentUserId(HttpContext);
|
|
|
|
var tactic = await tactics.GetTactic(sharedTactic.TacticId);
|
|
|
|
var tactic = await tactics.GetTactic(sharedTactic.TacticId);
|
|
|
|
|
|
|
|
|
|
|
|
if (tactic == null)
|
|
|
|
if (tactic == null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return NotFound();
|
|
|
|
return NotFound();
|
|
|
@ -62,7 +94,7 @@ public class UsersController(IUserService users, ITeamService teams, ITacticServ
|
|
|
|
var result = await tactics.ShareTactic(sharedTactic.TacticId, sharedTactic.UserId, null);
|
|
|
|
var result = await tactics.ShareTactic(sharedTactic.TacticId, sharedTactic.UserId, null);
|
|
|
|
return result ? Ok() : NotFound();
|
|
|
|
return result ? Ok() : NotFound();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[HttpDelete("/tactics/shared/{tacticId:int}/user/{userId:int}")]
|
|
|
|
[HttpDelete("/tactics/shared/{tacticId:int}/user/{userId:int}")]
|
|
|
|
[Authorize]
|
|
|
|
[Authorize]
|
|
|
|
public async Task<IActionResult> UnshareTactic(int tacticId, int userId)
|
|
|
|
public async Task<IActionResult> UnshareTactic(int tacticId, int userId)
|
|
|
@ -74,6 +106,7 @@ public class UsersController(IUserService users, ITeamService teams, ITacticServ
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return NotFound();
|
|
|
|
return NotFound();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (currentUserId != tactic.OwnerId)
|
|
|
|
if (currentUserId != tactic.OwnerId)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return Unauthorized();
|
|
|
|
return Unauthorized();
|
|
|
@ -82,7 +115,7 @@ public class UsersController(IUserService users, ITeamService teams, ITacticServ
|
|
|
|
var success = await tactics.UnshareTactic(tacticId, userId, null);
|
|
|
|
var success = await tactics.UnshareTactic(tacticId, userId, null);
|
|
|
|
return success ? Ok() : NotFound();
|
|
|
|
return success ? Ok() : NotFound();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[HttpGet("/tactics/shared/user/{userId:int}")]
|
|
|
|
[HttpGet("/tactics/shared/user/{userId:int}")]
|
|
|
|
[Authorize]
|
|
|
|
[Authorize]
|
|
|
|
public async Task<IActionResult> GetSharedTacticsToUser(int userId)
|
|
|
|
public async Task<IActionResult> GetSharedTacticsToUser(int userId)
|
|
|
@ -94,6 +127,6 @@ public class UsersController(IUserService users, ITeamService teams, ITacticServ
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var sharedTactics = await users.GetSharedTacticsToUser(userId);
|
|
|
|
var sharedTactics = await users.GetSharedTacticsToUser(userId);
|
|
|
|
return sharedTactics != null ? Ok(sharedTactics) : NotFound();
|
|
|
|
return Ok(sharedTactics);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|