Skip to content

Commit

Permalink
feat(registration): add endpoint for decline registration data (#388)
Browse files Browse the repository at this point in the history
* add endpoint returning data required for decline-application-by-invited-user page
* add unit tests
---------
Co-authored-by: Norbert Truchsess <[email protected]>
Reviewed-by: Norbert Truchsess <[email protected]>
  • Loading branch information
AnuragNagpure authored Dec 19, 2023
1 parent 2d99938 commit 514d2ed
Show file tree
Hide file tree
Showing 9 changed files with 98 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,11 @@ public record CompanyApplicationWithStatus
IEnumerable<ApplicationChecklistData> ApplicationChecklist
);
public record ApplicationChecklistData(ApplicationChecklistEntryTypeId TypeId, ApplicationChecklistEntryStatusId StatusId);

public record CompanyApplicationDeclineData(
Guid ApplicationId,
CompanyApplicationStatusId ApplicationStatus,
string CompanyName,
IEnumerable<string> Users
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,20 @@ public IQueryable<CompanyApplication> GetCompanyApplicationsFilteredQuery(string
.Select(identifier => new ValueTuple<UniqueIdentifierId, string>(identifier.UniqueIdentifierId, identifier.Value))))
.SingleOrDefaultAsync();

public IAsyncEnumerable<CompanyApplicationDeclineData> GetCompanyApplicationsDeclineData(Guid userCompanyId, IEnumerable<CompanyApplicationStatusId> applicationStatusIds) =>
_dbContext.CompanyApplications
.AsNoTracking()
.Where(application =>
application.Company!.Id == userCompanyId &&
applicationStatusIds.Contains(application.ApplicationStatusId))
.Select(application => new CompanyApplicationDeclineData(
application.Id,
application.ApplicationStatusId,
application.Company!.Name,
application.Company!.Identities.Where(identity => identity.CompanyUser!.Email != null).Select(
identity => identity.CompanyUser!.Email!)))
.AsAsyncEnumerable();

public Task<(bool IsValidApplicationId, Guid CompanyId, bool IsSubmitted)> GetCompanyIdSubmissionStatusForApplication(Guid applicationId) =>
_dbContext.CompanyApplications
.AsNoTracking()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public interface IApplicationRepository
Task<CompanyApplicationUserEmailData?> GetOwnCompanyApplicationUserEmailDataAsync(Guid applicationId, Guid companyUserId, IEnumerable<DocumentTypeId> submitDocumentTypeIds);
IQueryable<CompanyApplication> GetCompanyApplicationsFilteredQuery(string? companyName = null, IEnumerable<CompanyApplicationStatusId>? applicationStatusIds = null);
Task<CompanyApplicationDetailData?> GetCompanyApplicationDetailDataAsync(Guid applicationId, Guid userCompanyId, Guid? companyId = null);
IAsyncEnumerable<CompanyApplicationDeclineData> GetCompanyApplicationsDeclineData(Guid userCompanyId, IEnumerable<CompanyApplicationStatusId> applicationStatusIds);
Task<(bool IsValidApplicationId, Guid CompanyId, bool IsSubmitted)> GetCompanyIdSubmissionStatusForApplication(Guid applicationId);
Task<(Guid CompanyId, string CompanyName, string? BusinessPartnerNumber, IEnumerable<string> IamIdpAliasse, CompanyApplicationTypeId ApplicationTypeId, Guid? NetworkRegistrationProcessId)> GetCompanyAndApplicationDetailsForApprovalAsync(Guid applicationId);
Task<(Guid CompanyId, string CompanyName, string? BusinessPartnerNumber)> GetCompanyAndApplicationDetailsForCreateWalletAsync(Guid applicationId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public interface IRegistrationBusinessLogic
Task<(string FileName, byte[] Content, string MediaType)> GetDocumentContentAsync(Guid documentId);

IAsyncEnumerable<CompanyApplicationWithStatus> GetAllApplicationsForUserWithStatus();
IAsyncEnumerable<CompanyApplicationDeclineData> GetApplicationsDeclineData();
Task<CompanyDetailData> GetCompanyDetailData(Guid applicationId);
Task SetCompanyDetailDataAsync(Guid applicationId, CompanyDetailData companyDetails);
Task<int> InviteNewUserAsync(Guid applicationId, UserCreationInfoWithMessage userCreationInfo);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,9 @@ public async Task<int> UploadDocumentAsync(Guid applicationId, IFormFile documen
public IAsyncEnumerable<CompanyApplicationWithStatus> GetAllApplicationsForUserWithStatus() =>
_portalRepositories.GetInstance<IUserRepository>().GetApplicationsWithStatusUntrackedAsync(_identityData.CompanyId);

public IAsyncEnumerable<CompanyApplicationDeclineData> GetApplicationsDeclineData() =>
_portalRepositories.GetInstance<IApplicationRepository>().GetCompanyApplicationsDeclineData(_identityData.CompanyId, _settings.ApplicationDeclineStatusIds);

public async Task<CompanyDetailData> GetCompanyDetailData(Guid applicationId)
{
var result = await _portalRepositories.GetInstance<IApplicationRepository>().GetCompanyApplicationDetailDataAsync(applicationId, _identityData.CompanyId).ConfigureAwait(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,23 @@ public RegistrationSettings()
public IEnumerable<DocumentTypeId> DocumentTypeIds { get; set; } = null!;

/// <summary>
/// Document Type Id
/// ApplicationStatusIds that permit deletion of documents
/// </summary>
/// <value></value>
[Required]
[EnumEnumeration]
[DistinctValues]
public IEnumerable<CompanyApplicationStatusId> ApplicationStatusIds { get; set; } = null!;

/// <summary>
/// ApplicationStatusIds that permit decline of application by invited user
/// </summary>
/// <value></value>
[Required]
[EnumEnumeration]
[DistinctValues]
public IEnumerable<CompanyApplicationStatusId> ApplicationDeclineStatusIds { get; set; } = null!;

/// <summary>
/// RegistrationDocument Type Id
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,20 @@ public IAsyncEnumerable<string> GetClientRolesComposite() =>
public IAsyncEnumerable<CompanyApplicationWithStatus> GetApplicationsWithStatusAsync() =>
_registrationBusinessLogic.GetAllApplicationsForUserWithStatus();

/// <summary>
/// Gets the applications with each status, company-name and linked users
/// </summary>
/// <returns>Returns a list of company applications</returns>
/// <remarks>Example: Get: /api/registration/applications/declinedata</remarks>
/// <response code="200">Returns a list of company applications</response>
[HttpGet]
[Authorize(Roles = "view_registration")]
[Authorize(Policy = PolicyTypes.ValidCompany)]
[Route("applications/declinedata")]
[ProducesResponseType(typeof(IAsyncEnumerable<CompanyApplicationDeclineData>), StatusCodes.Status200OK)]
public IAsyncEnumerable<CompanyApplicationDeclineData> GetApplicationsDeclineData() =>
_registrationBusinessLogic.GetApplicationsDeclineData();

/// <summary>
/// Sets the status of a specific application.
/// </summary>
Expand Down
1 change: 1 addition & 0 deletions src/registration/Registration.Service/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
"KeycloakClientID": "",
"BasePortalAddress": "https://portal.example.org/registration",
"ApplicationStatusIds": [],
"ApplicationDeclineStatusIds": [],
"DocumentTypeIds": [],
"RegistrationDocumentTypeIds": [],
"SubmitDocumentTypeIds": []
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
********************************************************************************/

using Microsoft.EntityFrameworkCore;
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Models;
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositories;
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Tests.Setup;
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities;
Expand Down Expand Up @@ -533,6 +534,52 @@ public async Task AttachAndModifyCompanyApplications()

#endregion

#region GetCompanyApplicationsDeclineData

[Fact]
public async Task GetCompanyApplicationsDeclineData_ReturnsExpected()
{
// Arrange
var sut = await CreateSut().ConfigureAwait(false);
var statusIds = new[] {
CompanyApplicationStatusId.CREATED,
CompanyApplicationStatusId.ADD_COMPANY_DATA,
CompanyApplicationStatusId.INVITE_USER,
CompanyApplicationStatusId.SELECT_COMPANY_ROLE,
CompanyApplicationStatusId.UPLOAD_DOCUMENTS,
CompanyApplicationStatusId.VERIFY
};

// Act
var result = await sut.GetCompanyApplicationsDeclineData(CompanyId, statusIds).ToListAsync().ConfigureAwait(false);

// Assert
result.Should().BeEmpty();
}

[Fact]
public async Task GetCompanyApplicationsDeclineData_WithSubmittedApplication_ReturnsExpected()
{
// Arrange
var sut = await CreateSut().ConfigureAwait(false);
var statusIds = new[] {
CompanyApplicationStatusId.SUBMITTED
};

// Act
var result = await sut.GetCompanyApplicationsDeclineData(CompanyId, statusIds).ToListAsync().ConfigureAwait(false);

// Assert
result.Should().ContainSingle().Which.Should().Match<CompanyApplicationDeclineData>(x =>
x.ApplicationId == new Guid("6b2d1263-c073-4a48-bfaf-704dc154ca9f") &&
x.ApplicationStatus == CompanyApplicationStatusId.SUBMITTED &&
x.CompanyName == "CX-Test-Access" &&
x.Users.Count() == 1 &&
x.Users.First() == "[email protected]");
}

#endregion

private async Task<(IApplicationRepository sut, PortalDbContext context)> CreateSutWithContext()
{
var context = await _dbTestDbFixture.GetPortalDbContext().ConfigureAwait(false);
Expand Down

0 comments on commit 514d2ed

Please sign in to comment.