Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
313d1c6
add: user group schema
ChienNQuang Jun 6, 2023
175418b
add: digital files and entries schema
ChienNQuang Jun 6, 2023
7b7f01c
update: digital files and entries schema
ChienNQuang Jun 6, 2023
3442eff
add: dtos for new tables
ChienNQuang Jun 6, 2023
305856a
add: base methods for entities
ChienNQuang Jun 6, 2023
19f3969
update: migrations indexing
ChienNQuang Jun 6, 2023
cb1dd8e
chore: merge from dev
ChienNQuang Jun 6, 2023
1ed6b01
test: add integration tests (#209)
StarryFolf Jun 7, 2023
94c85c6
test: add integration tests for approve borrow request (#204)
StarryFolf Jun 7, 2023
3991b50
test: add integration tests for borrow document (#208)
StarryFolf Jun 7, 2023
d577f59
Feat/reset password (#215)
ChienNQuang Jun 8, 2023
77075f2
refactor: add salt (#224)
kaitoz11 Jun 10, 2023
88c7007
fix: seed some more data and fix swagger not loading
ChienNQuang Jun 12, 2023
0585004
Merge branch 'dev' of https://github.com/ProFile-org/ProFile-BE into dev
ChienNQuang Jun 12, 2023
3240c67
add: logging entities
ChienNQuang Jun 12, 2023
46d0980
add: permission entity
ChienNQuang Jun 12, 2023
2ada175
add: request logs
ChienNQuang Jun 12, 2023
7e960c2
add: document now has IsPrivate property and user log
ChienNQuang Jun 12, 2023
55ded40
add: current user service and permission manager
ChienNQuang Jun 12, 2023
916881b
update: clear mapping for jwt claims
ChienNQuang Jun 13, 2023
0e83a5d
update: fix login
ChienNQuang Jun 13, 2023
a445726
fix: something
ChienNQuang Jun 13, 2023
f0fcff3
add: logging to room, locker, folder creation and update
ChienNQuang Jun 13, 2023
4981de2
add: logging to users and staffs
ChienNQuang Jun 13, 2023
1816244
update: restore import endpoint
ChienNQuang Jun 13, 2023
65fdc2e
Update/import (#239)
ChienNQuang Jun 13, 2023
1b109b3
a
ChienNQuang Jun 13, 2023
353b867
Merge branch 'final/iteration2' into update/borrow
ChienNQuang Jun 13, 2023
d29e9fc
modified: get all document now only return public document (#236)
vzart Jun 14, 2023
96bf826
get document log by id + get document logs paginated (#244)
vzart Jun 14, 2023
fe366c1
permission
ChienNQuang Jun 14, 2023
52a2e71
feat: get user log by id + get user logs paginated (#247)
kaitoz11 Jun 14, 2023
8be0cf2
feat: get folder log by id + get folder logs paginated (#251)
kaitoz11 Jun 14, 2023
e99f9c3
Feat: implement get locker logs paginated + get locker log by id (#256)
StarryFolf Jun 14, 2023
58ae80a
feat: implement get employees for the department the current user is …
StarryFolf Jun 14, 2023
77bdfc1
feat: get room log by ID and get room logs paginated (#241)
vzart Jun 14, 2023
39755ee
feat: implement get documents of a user (#240)
StarryFolf Jun 14, 2023
127646f
feat: implement get request logs paginated + get request log by id (#…
StarryFolf Jun 14, 2023
94cbe94
feat: get self documents (#238)
vzart Jun 14, 2023
a2e6e01
adsfads
ChienNQuang Jun 14, 2023
b361eba
fuck me
ChienNQuang Jun 14, 2023
742c8dc
Merge branch 'final/iteration2' into update/borrow
ChienNQuang Jun 14, 2023
a90d24d
fuck me
ChienNQuang Jun 15, 2023
279f03e
fuck me 2
ChienNQuang Jun 15, 2023
5935e06
fuck me 3
ChienNQuang Jun 16, 2023
3cad869
fuck me 4
ChienNQuang Jun 16, 2023
2047da0
haha
ChienNQuang Jun 17, 2023
4518f5b
fuck me
ChienNQuang Jun 18, 2023
229cd0f
i dont know what i do
vzart Jun 18, 2023
3442a37
fuck me 5
ChienNQuang Jun 19, 2023
f1585ef
borrow works now
vzart Jun 20, 2023
b52522b
refactor kinda oke i guess
vzart Jun 20, 2023
7b43de0
fuck
ChienNQuang Jun 20, 2023
2e0e0d5
add: migration for Logging
vzart Jun 20, 2023
7da027f
fix: migrations work now
vzart Jun 20, 2023
133bb47
test: borrow is end to end test ok I think, suppose, nothing gonna go…
vzart Jun 21, 2023
fbd8e8b
test: import request are done
vzart Jun 21, 2023
187dc53
final
ChienNQuang Jun 21, 2023
5bf9210
Delete .fleet directory
ChienNQuang Jun 21, 2023
86ee182
final 2
ChienNQuang Jun 21, 2023
873a7a1
Merge branch 'update/borrow' of https://github.com/ProFile-org/ProFil…
ChienNQuang Jun 21, 2023
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
1 change: 1 addition & 0 deletions src/Api/ConfigureServices.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,6 +14,7 @@ public static IServiceCollection AddApiServices(this IServiceCollection services
{
// Register services
services.AddServices();
services.AddHostedService<ExpiryPermissionService>();

services.AddControllers(opt =>
opt.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer())));
Expand Down
182 changes: 64 additions & 118 deletions src/Api/Controllers/BorrowsController.cs
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
using Api.Controllers.Payload.Requests;
using Api.Controllers.Payload.Requests.Borrows;
using Application.Borrows.Commands;
using Application.Borrows.Queries;
using Application.Common.Extensions;
using Application.Common.Interfaces;
using Application.Common.Models;
using Application.Common.Models.Dtos.Logging;
using Application.Common.Models.Dtos.Physical;
using Application.Identity;
using Infrastructure.Identity.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Api.Controllers;

[Route("api/v1/documents/[controller]")]
public class BorrowsController : ApiControllerBase
{
private readonly ICurrentUserService _currentUserService;
Expand All@@ -28,7 +32,8 @@ public BorrowsController(ICurrentUserService currentUserService)
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status409Conflict)]
public async Task<ActionResult<Result<BorrowDto>>> BorrowDocument([FromBody] BorrowDocumentRequest request)
public async Task<ActionResult<Result<BorrowDto>>> BorrowDocument(
[FromBody] BorrowDocumentRequest request)
{
var borrowerId = _currentUserService.GetCurrentUser().Id;
var command = new BorrowDocument.Command()
Expand All@@ -37,7 +42,7 @@ public async Task<ActionResult<Result<BorrowDto>>> BorrowDocument([FromBody] Bor
DocumentId = request.DocumentId,
BorrowFrom = request.BorrowFrom,
BorrowTo = request.BorrowTo,
Reason = request.Reason,
BorrowReason = request.Reason,
};
var result = await Mediator.Send(command);
return Ok(Result<BorrowDto>.Succeed(result));
Expand All@@ -53,7 +58,8 @@ public async Task<ActionResult<Result<BorrowDto>>> BorrowDocument([FromBody] Bor
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status409Conflict)]
public async Task<ActionResult<Result<BorrowDto>>> GetById([FromRoute] Guid borrowId)
public async Task<ActionResult<Result<BorrowDto>>> GetById(
[FromRoute] Guid borrowId)
{
var user = _currentUserService.GetCurrentUser();
var command = new GetBorrowRequestById.Query()
Expand All@@ -65,47 +71,25 @@ public async Task<ActionResult<Result<BorrowDto>>> GetById([FromRoute] Guid borr
return Ok(Result<BorrowDto>.Succeed(result));
}

[RequiresRole(IdentityData.Roles.Staff)]
[HttpGet("staffs")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status409Conflict)]
public async Task<ActionResult<Result<PaginatedList<BorrowDto>>>> GetAllRequestsAsStaffPaginated(
[FromQuery] GetAllBorrowRequestsPaginatedAsStaffQueryParameters queryParameters)
{
var departmentId = _currentUserService.GetCurrentDepartmentForStaff();
var command = new GetAllBorrowRequestsPaginated.Query()
{
DepartmentId = departmentId,
EmployeeId = queryParameters.EmployeeId,
DocumentId = queryParameters.DocumentId,
Page = queryParameters.Page,
Size = queryParameters.Size,
SortBy = queryParameters.SortBy,
SortOrder = queryParameters.SortOrder,
};
var result = await Mediator.Send(command);
return Ok(Result<PaginatedList<BorrowDto>>.Succeed(result));
}

/// <summary>
/// Get all borrow requests as admin paginated
///
/// </summary>
/// <param name="queryParameters"></param>
/// <returns></returns>
[RequiresRole(IdentityData.Roles.Admin)]
[RequiresRole(IdentityData.Roles.Admin, IdentityData.Roles.Staff, IdentityData.Roles.Employee)]
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status409Conflict)]
public async Task<ActionResult<Result<PaginatedList<BorrowDto>>>> GetAllRequestsAsAdminPaginated(
[FromQuery] GetAllBorrowRequestsPaginatedAsAdminQueryParameters queryParameters)
public async Task<ActionResult<Result<PaginatedList<BorrowDto>>>> GetAllRequestsPaginated(
[FromQuery] GetAllBorrowRequestsPaginatedQueryParameters queryParameters)
{
var currentUser = _currentUserService.GetCurrentUser();
var command = new GetAllBorrowRequestsPaginated.Query()
{
DepartmentId = queryParameters.DepartmentId,
CurrentUser = currentUser,
RoomId = queryParameters.RoomId,
EmployeeId = queryParameters.EmployeeId,
DocumentId = queryParameters.DocumentId,
Page = queryParameters.Page,
Expand All@@ -118,99 +102,28 @@ public async Task<ActionResult<Result<PaginatedList<BorrowDto>>>> GetAllRequests
}

/// <summary>
/// Get all borrow requests as employee paginated
/// </summary>
/// <param name="queryParameters"></param>
/// <returns></returns>
[RequiresRole(IdentityData.Roles.Employee)]
[HttpGet("employees")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status409Conflict)]
public async Task<ActionResult<Result<PaginatedList<BorrowDto>>>> GetAllRequestsAsEmployeePaginated(
[FromQuery] GetAllBorrowRequestsPaginatedAsEmployeeQueryParameters queryParameters)
{
var userId = _currentUserService.GetCurrentUser().Id;
var command = new GetAllBorrowRequestsPaginated.Query()
{
EmployeeId = userId,
DocumentId = queryParameters.DocumentId,
Page = queryParameters.Page,
Size = queryParameters.Size,
SortBy = queryParameters.SortBy,
SortOrder = queryParameters.SortOrder,
};
var result = await Mediator.Send(command);
return Ok(Result<PaginatedList<BorrowDto>>.Succeed(result));
}

/// <summary>
/// Get all borrow requests for a document paginated
/// </summary>
/// <param name="documentId"></param>
/// <param name="queryParameters"></param>
/// <returns></returns>
[RequiresRole(IdentityData.Roles.Admin, IdentityData.Roles.Staff)]
[HttpGet("documents/{documentId:guid}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status409Conflict)]
public async Task<ActionResult<Result<PaginatedList<BorrowDto>>>> GetAllRequestsForDocumentPaginated(
[FromRoute] Guid documentId,
[FromQuery] GetAllBorrowRequestsPaginatedForDocumentQueryParameters queryParameters)
{
var command = new GetAllBorrowRequestsPaginated.Query()
{
DocumentId = documentId,
Page = queryParameters.Page,
Size = queryParameters.Size,
SortBy = queryParameters.SortBy,
SortOrder = queryParameters.SortOrder,
Status = queryParameters.Status,
};
var result = await Mediator.Send(command);
return Ok(Result<PaginatedList<BorrowDto>>.Succeed(result));
}

/// <summary>
/// Approve a borrow request
/// Approve or Reject a borrow request
/// </summary>
/// <param name="borrowId">Id of the borrow request to be approved</param>
/// <param name="request"></param>
/// <returns>A BorrowDto of the approved borrow request</returns>
[RequiresRole(IdentityData.Roles.Staff)]
[HttpPost("approve/{borrowId:guid}")]
[HttpPut("staffs/{borrowId:guid}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status409Conflict)]
public async Task<ActionResult<Result<BorrowDto>>> ApproveRequest([FromRoute] Guid borrowId)
{
var command = new ApproveBorrowRequest.Command()
{
BorrowId = borrowId,
};
var result = await Mediator.Send(command);
return Ok(Result<BorrowDto>.Succeed(result));
}

/// <summary>
/// Reject a borrow request
/// </summary>
/// <param name="borrowId">Id of the borrow request to be rejected</param>
/// <returns>A BorrowDto of the rejected borrow request</returns>
[RequiresRole(IdentityData.Roles.Staff)]
[HttpPost("reject/{borrowId:guid}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status409Conflict)]
public async Task<ActionResult<Result<BorrowDto>>> RejectRequest([FromRoute] Guid borrowId)
public async Task<ActionResult<Result<BorrowDto>>> ApproveOrRejectRequest(
[FromRoute] Guid borrowId,
[FromBody] ApproveOrRejectBorrowRequestRequest request)
{
var command = new RejectBorrowRequest.Command()
var performingUserId = _currentUserService.GetId();
var command = new ApproveOrRejectBorrowRequest.Command()
{
CurrentUserId = performingUserId,
BorrowId = borrowId,
StaffReason = request.StaffReason,
Decision = request.Decision
};
var result = await Mediator.Send(command);
return Ok(Result<BorrowDto>.Succeed(result));
Expand All@@ -227,10 +140,13 @@ public async Task<ActionResult<Result<BorrowDto>>> RejectRequest([FromRoute] Gui
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status409Conflict)]
public async Task<ActionResult<Result<BorrowDto>>> Checkout([FromRoute] Guid borrowId)
public async Task<ActionResult<Result<BorrowDto>>> Checkout(
[FromRoute] Guid borrowId)
{
var currentStaff = _currentUserService.GetCurrentUser();
var command = new CheckoutDocument.Command()
{
CurrentStaff = currentStaff,
BorrowId = borrowId,
};
var result = await Mediator.Send(command);
Expand All@@ -248,10 +164,13 @@ public async Task<ActionResult<Result<BorrowDto>>> Checkout([FromRoute] Guid bor
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status409Conflict)]
public async Task<ActionResult<Result<BorrowDto>>> Return([FromRoute] Guid documentId)
public async Task<ActionResult<Result<BorrowDto>>> Return(
[FromRoute] Guid documentId)
{
var currentUser = _currentUserService.GetCurrentUser();
var command = new ReturnDocument.Command()
{
CurrentUser = currentUser,
DocumentId = documentId,
};
var result = await Mediator.Send(command);
Expand All@@ -274,12 +193,14 @@ public async Task<ActionResult<Result<BorrowDto>>> Update(
[FromRoute] Guid borrowId,
[FromBody] UpdateBorrowRequest request)
{
var currentUser = _currentUserService.GetCurrentUser();
var command = new UpdateBorrow.Command()
{
CurrentUser = currentUser,
BorrowId = borrowId,
BorrowFrom = request.BorrowFrom,
BorrowTo = request.BorrowTo,
Reason = request.Reason,
BorrowReason = request.Reason,
};
var result = await Mediator.Send(command);
return Ok(Result<BorrowDto>.Succeed(result));
Expand All@@ -296,13 +217,38 @@ public async Task<ActionResult<Result<BorrowDto>>> Update(
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status409Conflict)]
public async Task<ActionResult<Result<BorrowDto>>> Cancel([FromRoute] Guid borrowId)
public async Task<ActionResult<Result<BorrowDto>>> Cancel(
[FromRoute] Guid borrowId)
{
var currentUserId = _currentUserService.GetId();
var command = new CancelBorrowRequest.Command()
{
CurrentUserId = currentUserId,
BorrowId = borrowId,
};
var result = await Mediator.Send(command);
return Ok(Result<BorrowDto>.Succeed(result));
}

/// <summary>
/// Get all logs related to requests.
/// </summary>
/// <param name="queryParameters">Query parameters</param>
/// <returns>A list of RequestLogsDtos.</returns>
[RequiresRole(IdentityData.Roles.Admin)]
[HttpGet("logs")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
public async Task<ActionResult<Result<PaginatedList<RequestLogDto>>>> GetAllRequestLogs(
[FromQuery] GetAllLogsPaginatedQueryParameters queryParameters)
{
var query = new GetAllRequestLogsPaginated.Query()
{
SearchTerm = queryParameters.SearchTerm,
Page = queryParameters.Page,
Size = queryParameters.Size,
};
var result = await Mediator.Send(query);
return Ok(Result<PaginatedList<RequestLogDto>>.Succeed(result));
}
}
Loading