Skip to content

Commit

Permalink
Refactor partner contact API
Browse files Browse the repository at this point in the history
  • Loading branch information
IliyanIlievPH committed Jun 1, 2020
1 parent e610558 commit 1b088f9
Show file tree
Hide file tree
Showing 7 changed files with 42 additions and 177 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System.Threading.Tasks;
using System.Threading.Tasks;
using JetBrains.Annotations;
using MAVN.Service.CustomerProfile.Client.Models;
using MAVN.Service.CustomerProfile.Client.Models.Enums;
Expand Down Expand Up @@ -41,20 +41,14 @@ public interface IPartnerContactApi
/// <param name="partnerContactRequest">The data with which the Partner contact needs to be created</param>
/// <returns></returns>
[Post("/api/partnerContacts")]
Task<PartnerContactErrorCodes> CreateIfNotExistAsync([Body] PartnerContactRequestModel partnerContactRequest);
Task CreateOrUpdateAsync([Body] PartnerContactRequestModel partnerContactRequest);

/// <summary>
/// Updates Partner contact.
/// </summary>
/// <param name="partnerContactUpdate">The Partner contact data.</param>
[Put("/api/partnerContacts")]
Task<PartnerContactErrorCodes> UpdateAsync([Body] PartnerContactUpdateRequestModel partnerContactUpdate);

/// <summary>
/// Deletes/Archives a specific Partner contact
/// </summary>
/// <param name="locationId">The Location Id</param>
[Delete("/api/partnerContacts/{locationId}")]
Task DeleteAsync(string locationId);
Task DeleteIfExistAsync(string locationId);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System.Collections.Generic;
using System.Collections.Generic;
using System.Threading.Tasks;
using MAVN.Service.CustomerProfile.Domain.Enums;
using MAVN.Service.CustomerProfile.Domain.Models;
Expand All @@ -10,10 +10,9 @@ public interface IPartnerContactRepository
Task<IPartnerContact> GetByLocationIdAsync(string locationId);
Task<IPartnerContact> GetByEmailAsync(string email);
Task<IPartnerContact> GetByPhoneAsync(string phone);
Task<bool> DeleteAsync(string locationId);
Task DeleteIfExistsAsync(string locationId);
Task<IEnumerable<IPartnerContact>> GetPaginatedAsync(int skip, int take);
Task<int> GetTotalAsync();
Task<PartnerContactErrorCodes> CreateIfNotExistAsync(PartnerContactModel partnerContact);
Task<PartnerContactErrorCodes> UpdateAsync(string locationId, string firstName, string lastName, string phoneNumber, string email);
Task CreateOrUpdateAsync(PartnerContactModel partnerContact);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System.Threading.Tasks;
using System.Threading.Tasks;
using MAVN.Service.CustomerProfile.Domain.Enums;
using MAVN.Service.CustomerProfile.Domain.Models;

Expand All @@ -8,8 +8,7 @@ public interface IPartnerContactService
{
Task<PartnerContactResult> GetByLocationIdAsync(string locationId);
Task<PaginatedPartnerContactsModel> GetPaginatedAsync(int currentPage, int pageSize);
Task<PartnerContactErrorCodes> CreateIfNotExistsAsync(PartnerContactModel partnerContact);
Task<PartnerContactErrorCodes> UpdateAsync(string modelLocationId, string modelFirstName, string modelLastName, string modelPhoneNumber, string modelEmail);
Task RemoveAsync(string locationId);
Task CreateOrUpdateAsync(PartnerContactModel partnerContact);
Task RemoveIfExistsAsync(string locationId);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Threading.Tasks;
using Common.Log;
using Lykke.Common.Log;
Expand Down Expand Up @@ -63,46 +63,16 @@ public async Task<PaginatedPartnerContactsModel> GetPaginatedAsync(int currentPa
};
}

public async Task<PartnerContactErrorCodes> CreateIfNotExistsAsync(PartnerContactModel partnerContact)
public async Task CreateOrUpdateAsync(PartnerContactModel partnerContact)
{
var creationResult = await _partnerContactRepository.CreateIfNotExistAsync(partnerContact);
await _partnerContactRepository.CreateOrUpdateAsync(partnerContact);

if (creationResult == PartnerContactErrorCodes.PartnerContactAlreadyExists)
{
_log.Warning("Partner Contact already exists", context: partnerContact.LocationId);
return creationResult;
}

_log.Info("Partner Contact is created", context: partnerContact.LocationId);

return creationResult;
_log.Info("Partner Contact is created or updated", context: partnerContact.LocationId);
}

public async Task<PartnerContactErrorCodes> UpdateAsync(string locationId, string firstName, string lastName, string phoneNumber,
string email)
public Task RemoveIfExistsAsync(string locationId)
{
var result = await _partnerContactRepository.UpdateAsync(locationId, firstName, lastName, phoneNumber, email);

if (result == PartnerContactErrorCodes.PartnerContactDoesNotExist)
{
_log.Warning("Partner Contact was not updated", context: locationId);
}

return result;
}

public async Task RemoveAsync(string locationId)
{
var deleted = await _partnerContactRepository.DeleteAsync(locationId);

if (deleted)
{
_log.Info("Partner Contact was removed", context: locationId);
}
else
{
_log.Warning("Partner Contact was not removed", context: locationId);
}
return _partnerContactRepository.DeleteIfExistsAsync(locationId);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
Expand Down Expand Up @@ -104,7 +104,7 @@ public async Task<IPartnerContact> GetByPhoneAsync(string phone)
}
}

public async Task<bool> DeleteAsync(string locationId)
public async Task DeleteIfExistsAsync(string locationId)
{
using (var context = _contextFactory.CreateDataContext())
{
Expand All @@ -116,7 +116,7 @@ public async Task<bool> DeleteAsync(string locationId)
.FirstOrDefaultAsync(c => c.LocationId == locationId);

if (entity == null)
return false;
return;

var archiveEntity = PartnerContactArchiveEntity.Create(entity);

Expand All @@ -131,12 +131,9 @@ public async Task<bool> DeleteAsync(string locationId)
catch (Exception e)
{
_log.Error(e, "Error occured while deleting partner contact ", $"locationId = {locationId}");
return false;
}
}
}

return true;
}

public async Task<IEnumerable<IPartnerContact>> GetPaginatedAsync(int skip, int take)
Expand All @@ -162,7 +159,7 @@ public async Task<int> GetTotalAsync()
}
}

public async Task<PartnerContactErrorCodes> CreateIfNotExistAsync(PartnerContactModel partnerContact)
public async Task CreateOrUpdateAsync(PartnerContactModel partnerContact)
{
using (var context = _contextFactory.CreateDataContext())
{
Expand All @@ -171,44 +168,27 @@ public async Task<PartnerContactErrorCodes> CreateIfNotExistAsync(PartnerContact

if (existentPartnerContact != null)
{
return PartnerContactErrorCodes.PartnerContactAlreadyExists;
}

var entity = PartnerContactEntity.Create(partnerContact);

entity = _encryptionService.Encrypt(entity);

context.PartnerContacts.Add(entity);

await context.SaveChangesAsync();

return PartnerContactErrorCodes.None;
}
}

public async Task<PartnerContactErrorCodes> UpdateAsync(string locationId, string firstName, string lastName, string phoneNumber, string email)
{
using (var context = _contextFactory.CreateDataContext())
{
var entity = await context.PartnerContacts.FirstOrDefaultAsync(o => o.LocationId == locationId);
existentPartnerContact = _encryptionService.Decrypt(existentPartnerContact);

if (entity == null)
return PartnerContactErrorCodes.PartnerContactDoesNotExist;
existentPartnerContact.FirstName = partnerContact.FirstName;
existentPartnerContact.LastName = partnerContact.LastName;
existentPartnerContact.PhoneNumber = partnerContact.PhoneNumber;
existentPartnerContact.Email = partnerContact.Email;

entity = _encryptionService.Decrypt(entity);
existentPartnerContact = _encryptionService.Encrypt(existentPartnerContact);

entity.FirstName = firstName;
entity.LastName = lastName;
entity.PhoneNumber = phoneNumber;
entity.Email = email;
context.PartnerContacts.Update(existentPartnerContact);
}
else
{
var entity = PartnerContactEntity.Create(partnerContact);

entity = _encryptionService.Encrypt(entity);
entity = _encryptionService.Encrypt(entity);

context.PartnerContacts.Update(entity);
context.PartnerContacts.Add(entity);
}

await context.SaveChangesAsync();

return PartnerContactErrorCodes.None;
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Net;
Expand Down Expand Up @@ -87,33 +87,10 @@ public async Task<PaginatedPartnerContactsResponse> GetPartnerContactsPaginatedA
/// </summary>
/// <returns><see cref="PartnerContactErrorCodes"/></returns>
[HttpPost]
[ProducesResponseType(typeof(PartnerContactErrorCodes), (int)HttpStatusCode.OK)]
public async Task<PartnerContactErrorCodes> CreateIfNotExistAsync([FromBody]PartnerContactRequestModel partnerContactRequest)
[ProducesResponseType((int)HttpStatusCode.NoContent)]
public async Task CreateOrUpdateAsync([FromBody]PartnerContactRequestModel partnerContactRequest)
{
var result = await _partnerContactService.CreateIfNotExistsAsync(_mapper.Map<PartnerContactModel>(partnerContactRequest));

return _mapper.Map<PartnerContactErrorCodes>(result);
}

/// <summary>
/// Updates Partner contact profile.
/// </summary>
/// <remarks>
///
/// Error codes:
/// - **PartnerContactDoesNotExist**
/// </remarks>
/// <returns>
/// 200 - Partner contact profile successfully updated.
/// 400 - if an invalid input data was provided
/// </returns>
[HttpPut]
[ProducesResponseType(typeof(PartnerContactErrorCodes), (int)HttpStatusCode.OK)]
public async Task<PartnerContactErrorCodes> UpdateAsync([FromBody] PartnerContactUpdateRequestModel model)
{
var result = await _partnerContactService.UpdateAsync(model.LocationId, model.FirstName, model.LastName,
model.PhoneNumber, model.Email);
return _mapper.Map<PartnerContactErrorCodes>(result);
await _partnerContactService.CreateOrUpdateAsync(_mapper.Map<PartnerContactModel>(partnerContactRequest));
}

/// <summary>
Expand All @@ -122,12 +99,12 @@ public async Task<PartnerContactErrorCodes> UpdateAsync([FromBody] PartnerContac
[HttpDelete("{locationId}")]
[ProducesResponseType(typeof(void), (int)HttpStatusCode.OK)]
[ProducesResponseType(typeof(ErrorResponse), (int)HttpStatusCode.BadRequest)]
public Task DeleteAsync([Required][FromRoute] string locationId)
public Task DeleteIfExistAsync([Required][FromRoute] string locationId)
{
if (string.IsNullOrWhiteSpace(locationId))
throw new BadRequestException($"{nameof(locationId)} can't be empty");

return _partnerContactService.RemoveAsync(locationId);
return _partnerContactService.RemoveIfExistsAsync(locationId);
}

private string GetApiKeyName()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
Expand All @@ -15,59 +15,6 @@ namespace MAVN.Service.CustomerProfile.Tests
{
public class ProfileContactServiceTests
{
[Fact]
public async Task TryingToCreateProfileContact_EverythingValid_SuccessfullyCreated()
{
var partnerContactRepository = new Mock<IPartnerContactRepository>();
var partnerContactResult = PartnerContactErrorCodes.None;
partnerContactRepository
.Setup(x => x.CreateIfNotExistAsync(It.IsAny<PartnerContactModel>()))
.ReturnsAsync(partnerContactResult)
.Verifiable();

PartnerContactService partnerContactService;

using (var logFactory = LogFactory.Create().AddUnbufferedConsole())
{
partnerContactService = new PartnerContactService(
partnerContactRepository.Object,
logFactory);
}

var actual = await partnerContactService.CreateIfNotExistsAsync(new PartnerContactModel
{

});

Assert.Equal(partnerContactResult, actual);
}

[Fact]
public async Task TryingToCreateProfileContact_ProfileContactAlreadyExists_ErrorCodeIsReturned()
{
var partnerContactRepository = new Mock<IPartnerContactRepository>();
var partnerContactResult = PartnerContactErrorCodes.PartnerContactAlreadyExists;

partnerContactRepository
.Setup(x => x.CreateIfNotExistAsync(It.IsAny<PartnerContactModel>()))
.ReturnsAsync(partnerContactResult);

PartnerContactService partnerContactService;

using (var logFactory = LogFactory.Create().AddUnbufferedConsole())
{
partnerContactService = new PartnerContactService(
partnerContactRepository.Object,
logFactory);
}

var actual = await partnerContactService.CreateIfNotExistsAsync(new PartnerContactModel
{
});

Assert.Equal(partnerContactResult, actual);
}

[Fact]
public async Task TryingToGetProfileContactByLocationId_ValidLocationId_SuccessfullyReturned()
{
Expand Down Expand Up @@ -121,8 +68,7 @@ public async Task TryingToDeleteProfileContactByLocationId_ValidLocationId_Succe
{
var partnerContactRepository = new Mock<IPartnerContactRepository>();
partnerContactRepository
.Setup(x => x.DeleteAsync(It.IsAny<string>()))
.ReturnsAsync(true)
.Setup(x => x.DeleteIfExistsAsync(It.IsAny<string>()))
.Verifiable();

PartnerContactService partnerContactService;
Expand All @@ -134,7 +80,7 @@ public async Task TryingToDeleteProfileContactByLocationId_ValidLocationId_Succe
logFactory);
}

await partnerContactService.RemoveAsync("testContactId");
await partnerContactService.RemoveIfExistsAsync("testContactId");

partnerContactRepository.Verify();
}
Expand Down

0 comments on commit 1b088f9

Please sign in to comment.