Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@
</PropertyGroup>

<PropertyGroup>
<NullableReferenceTypes>enable</NullableReferenceTypes>
<NullableReferenceTypes>disable</NullableReferenceTypes>
</PropertyGroup>
</Project>
219 changes: 109 additions & 110 deletions HwProj.APIGateway/HwProj.APIGateway.API/Controllers/AccountController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,135 +14,134 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace HwProj.APIGateway.API.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class AccountController : AggregationController
{
private readonly ICoursesServiceClient _coursesClient;
private readonly ISolutionsServiceClient _solutionsServiceClient;
namespace HwProj.APIGateway.API.Controllers;

public AccountController(
IAuthServiceClient authClient,
ICoursesServiceClient coursesClient,
ISolutionsServiceClient solutionsServiceClient) : base(authClient)
{
_coursesClient = coursesClient;
_solutionsServiceClient = solutionsServiceClient;
}
[Route("api/[controller]")]
[ApiController]
public class AccountController : AggregationController
{
private readonly ICoursesServiceClient _coursesClient;
private readonly ISolutionsServiceClient _solutionsServiceClient;

[HttpGet("getUserData/{userId}")]
[ProducesResponseType(typeof(AccountDataDto), (int)HttpStatusCode.OK)]
public async Task<IActionResult> GetUserDataById(string userId)
{
var result = await AuthServiceClient.GetAccountData(userId);
return result == null
? NotFound() as IActionResult
: Ok(result);
}
public AccountController(
IAuthServiceClient authClient,
ICoursesServiceClient coursesClient,
ISolutionsServiceClient solutionsServiceClient) : base(authClient)
{
_coursesClient = coursesClient;
_solutionsServiceClient = solutionsServiceClient;
}

//TODO: separate for mentor and student
[HttpGet("getUserData")]
[Authorize]
[ProducesResponseType(typeof(UserDataDto), (int)HttpStatusCode.OK)]
public async Task<IActionResult> GetUserData()
{
var getAccountDataTask = AuthServiceClient.GetAccountData(UserId);
var getCoursesTask = _coursesClient.GetAllUserCourses();
[HttpGet("getUserData/{userId}")]
[ProducesResponseType(typeof(AccountDataDto), (int)HttpStatusCode.OK)]
public async Task<IActionResult> GetUserDataById(string userId)
{
var result = await AuthServiceClient.GetAccountData(userId);
return result == null
? NotFound()
: Ok(result);
}

await Task.WhenAll(getAccountDataTask, getCoursesTask);
//TODO: separate for mentor and student
[HttpGet("getUserData")]
[Authorize]
[ProducesResponseType(typeof(UserDataDto), (int)HttpStatusCode.OK)]
public async Task<IActionResult> GetUserData()
{
var getAccountDataTask = AuthServiceClient.GetAccountData(UserId);
var getCoursesTask = _coursesClient.GetAllUserCourses();

var courses = GetCoursePreviews(getCoursesTask.Result);
await Task.WhenAll(getAccountDataTask, getCoursesTask);

if (User.IsInRole(Roles.LecturerRole))
{
return Ok(new UserDataDto
{
UserData = getAccountDataTask.Result,
Courses = await courses,
TaskDeadlines = Array.Empty<TaskDeadlineView>()
});
}

var taskDeadlines = await _coursesClient.GetTaskDeadlines();
var taskIds = taskDeadlines.Select(t => t.TaskId).ToArray();
var solutions = await _solutionsServiceClient.GetLastTaskSolutions(taskIds, UserId);
var taskDeadlinesInfo = taskDeadlines.Select((d, i) => new TaskDeadlineView
{
Deadline = d,
SolutionState = solutions[i]?.State,
Rating = solutions[i]?.Rating,
MaxRating = taskDeadlines[i].MaxRating
}).ToArray();
var courses = GetCoursePreviews(getCoursesTask.Result);

var aggregatedResult = new UserDataDto
if (User.IsInRole(Roles.LecturerRole))
{
return Ok(new UserDataDto
{
UserData = getAccountDataTask.Result,
Courses = await courses,
TaskDeadlines = taskDeadlinesInfo
};
return Ok(aggregatedResult);
TaskDeadlines = Array.Empty<TaskDeadlineView>()
});
}

[HttpPost("register")]
[ProducesResponseType(typeof(Result<TokenCredentials>), (int)HttpStatusCode.OK)]
public async Task<IActionResult> Register(RegisterViewModel model)
var taskDeadlines = await _coursesClient.GetTaskDeadlines();
var taskIds = taskDeadlines.Select(t => t.TaskId).ToArray();
var solutions = await _solutionsServiceClient.GetLastTaskSolutions(taskIds, UserId);
var taskDeadlinesInfo = taskDeadlines.Select((d, i) => new TaskDeadlineView
{
var result = await AuthServiceClient.Register(model);
return Ok(result);
}
Deadline = d,
SolutionState = solutions[i]?.State,
Rating = solutions[i]?.Rating,
MaxRating = taskDeadlines[i].MaxRating
}).ToArray();

[HttpPost("login")]
[ProducesResponseType(typeof(Result<TokenCredentials>), (int)HttpStatusCode.OK)]
public async Task<IActionResult> Login(LoginViewModel model)
var aggregatedResult = new UserDataDto
{
var tokenMeta = await AuthServiceClient.Login(model).ConfigureAwait(false);
return Ok(tokenMeta);
}
UserData = getAccountDataTask.Result,
Courses = await courses,
TaskDeadlines = taskDeadlinesInfo
};
return Ok(aggregatedResult);
}

[HttpPut("edit")]
[Authorize]
[ProducesResponseType(typeof(Result), (int)HttpStatusCode.OK)]
public async Task<IActionResult> Edit(EditAccountViewModel model)
{
var result = await AuthServiceClient.Edit(model, UserId);
return Ok(result);
}
[HttpPost("register")]
[ProducesResponseType(typeof(Result<TokenCredentials>), (int)HttpStatusCode.OK)]
public async Task<IActionResult> Register(RegisterViewModel model)
{
var result = await AuthServiceClient.Register(model);
return Ok(result);
}

[HttpPost("inviteNewLecturer")]
[Authorize(Roles = Roles.LecturerRole)]
[ProducesResponseType(typeof(Result), (int)HttpStatusCode.OK)]
public async Task<IActionResult> InviteNewLecturer(InviteLecturerViewModel model)
{
var result = await AuthServiceClient.InviteNewLecturer(model).ConfigureAwait(false);
return Ok(result);
}
[HttpPost("login")]
[ProducesResponseType(typeof(Result<TokenCredentials>), (int)HttpStatusCode.OK)]
public async Task<IActionResult> Login(LoginViewModel model)
{
var tokenMeta = await AuthServiceClient.Login(model).ConfigureAwait(false);
return Ok(tokenMeta);
}

[HttpPost("google")]
[ProducesResponseType(typeof(Result<TokenCredentials>), (int)HttpStatusCode.OK)]
public async Task<IActionResult> LoginByGoogle(string tokenId)
{
var tokenMeta = await AuthServiceClient.LoginByGoogle(tokenId).ConfigureAwait(false);
return Ok(tokenMeta);
}
[HttpPut("edit")]
[Authorize]
[ProducesResponseType(typeof(Result), (int)HttpStatusCode.OK)]
public async Task<IActionResult> Edit(EditAccountViewModel model)
{
var result = await AuthServiceClient.Edit(model, UserId);
return Ok(result);
}

[HttpPut("editExternal")]
[Authorize]
[ProducesResponseType(typeof(Result), (int)HttpStatusCode.OK)]
public async Task<IActionResult> EditExternal(EditExternalViewModel model)
{
var result = await AuthServiceClient.EditExternal(model, UserId);
return Ok(result);
}
[HttpPost("inviteNewLecturer")]
[Authorize(Roles = Roles.LecturerRole)]
[ProducesResponseType(typeof(Result), (int)HttpStatusCode.OK)]
public async Task<IActionResult> InviteNewLecturer(InviteLecturerViewModel model)
{
var result = await AuthServiceClient.InviteNewLecturer(model).ConfigureAwait(false);
return Ok(result);
}

[HttpGet("getAllStudents")]
[Authorize(Roles = Roles.LecturerRole)]
[ProducesResponseType(typeof(AccountDataDto[]), (int)HttpStatusCode.OK)]
public async Task<IActionResult> GetAllStudents()
{
var result = await AuthServiceClient.GetAllStudents();
return Ok(result);
}
[HttpPost("google")]
[ProducesResponseType(typeof(Result<TokenCredentials>), (int)HttpStatusCode.OK)]
public async Task<IActionResult> LoginByGoogle(string tokenId)
{
var tokenMeta = await AuthServiceClient.LoginByGoogle(tokenId).ConfigureAwait(false);
return Ok(tokenMeta);
}

[HttpPut("editExternal")]
[Authorize]
[ProducesResponseType(typeof(Result), (int)HttpStatusCode.OK)]
public async Task<IActionResult> EditExternal(EditExternalViewModel model)
{
var result = await AuthServiceClient.EditExternal(model, UserId);
return Ok(result);
}

[HttpGet("getAllStudents")]
[Authorize(Roles = Roles.LecturerRole)]
[ProducesResponseType(typeof(AccountDataDto[]), (int)HttpStatusCode.OK)]
public async Task<IActionResult> GetAllStudents()
{
var result = await AuthServiceClient.GetAllStudents();
return Ok(result);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,39 +5,38 @@
using HwProj.Models.CoursesService.ViewModels;
using Microsoft.AspNetCore.Mvc;

namespace HwProj.APIGateway.API.Controllers
namespace HwProj.APIGateway.API.Controllers;

public class AggregationController : ControllerBase
{
public class AggregationController : ControllerBase
{
protected readonly IAuthServiceClient AuthServiceClient;
protected readonly IAuthServiceClient AuthServiceClient;

protected AggregationController(IAuthServiceClient authServiceClient)
{
AuthServiceClient = authServiceClient;
}
protected AggregationController(IAuthServiceClient authServiceClient)
{
AuthServiceClient = authServiceClient;
}

protected string? UserId =>
Request.HttpContext.User.Claims
.FirstOrDefault(claim => claim.Type.ToString() == "_id")
?.Value;
protected string? UserId =>
Request.HttpContext.User.Claims
.FirstOrDefault(claim => claim.Type.ToString() == "_id")
?.Value;

protected async Task<CoursePreviewView[]> GetCoursePreviews(CoursePreview[] courses)
{
var getMentorsTasks = courses.Select(t => AuthServiceClient.GetAccountsData(t.MentorIds)).ToList();
await Task.WhenAll(getMentorsTasks);
var mentorDTOs = getMentorsTasks.Select(t => t.Result);
protected async Task<CoursePreviewView[]> GetCoursePreviews(CoursePreview[] courses)
{
var getMentorsTasks = courses.Select(t => AuthServiceClient.GetAccountsData(t.MentorIds)).ToList();
await Task.WhenAll(getMentorsTasks);
var mentorDTOs = getMentorsTasks.Select(t => t.Result);

var result = courses.Zip(mentorDTOs, (course, mentors) =>
new CoursePreviewView
{
Id = course.Id,
Name = course.Name,
GroupName = course.GroupName,
IsCompleted = course.IsCompleted,
Mentors = mentors.Where(t => t != null).ToArray()
}).ToArray();
var result = courses.Zip(mentorDTOs, (course, mentors) =>
new CoursePreviewView
{
Id = course.Id,
Name = course.Name,
GroupName = course.GroupName,
IsCompleted = course.IsCompleted,
Mentors = mentors.Where(t => t != null).ToArray()
}).ToArray();

return result;
}
return result;
}
}
}
Loading