Skip to content

Commit e9a9703

Browse files
authored
Merge pull request #17 from THC-Software/query_refactoring
Query refactoring
2 parents a443b49 + f1f6153 commit e9a9703

35 files changed

+513
-73
lines changed

Application/Commands/CreatePlayOfferCommand.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
using PlayOfferService.Domain.Models;
33

44
namespace PlayOfferService.Application.Commands;
5-
public record CreatePlayOfferCommand(PlayOfferDto PlayOfferDto) : IRequest<Guid>
5+
public record CreatePlayOfferCommand(CreatePlayOfferDto CreatePlayOfferDto) : IRequest<Guid>
66
{
77
}

Application/Controllers/PlayOfferController.cs

+67-11
Original file line numberDiff line numberDiff line change
@@ -19,34 +19,90 @@ public PlayOfferController(IMediator mediator)
1919
}
2020

2121
///<summary>
22-
///Retrieve all Play Offers matching the query params
22+
///Retrieve all Play Offers of a club with a matching id
2323
///</summary>
24-
///<param name="playOfferId">The id of the play offer</param>
25-
///<param name="creatorId">The id of the creator of the play offer</param>
2624
///<param name="clubId">The id of the club of the play offer</param>
27-
///<returns>Play offer with a matching id</returns>
28-
///<response code="200">Returns a Play offer matching the query params</response>
25+
///<returns>Play offers with a matching club id</returns>
26+
///<response code="200">Returns a list of Play offers matching the query params</response>
2927
///<response code="204">No Play offer with matching properties was found</response>
3028
[HttpGet]
29+
[Route("club")]
30+
[ProducesResponseType(typeof(IEnumerable<PlayOfferDto>), StatusCodes.Status200OK)]
31+
[ProducesResponseType(typeof(ActionResult), StatusCodes.Status204NoContent)]
32+
[Consumes("application/json")]
33+
[Produces("application/json")]
34+
public async Task<ActionResult<IEnumerable<PlayOfferDto>>> GetByClubIdAsync([FromQuery] Guid clubId)
35+
{
36+
//TODO: refactor after jwt implementation to get clubId from token
37+
var result = await _mediator.Send(new GetPlayOffersByClubIdQuery(clubId));
38+
39+
if (result.Count() == 0)
40+
return NoContent();
41+
42+
return Ok(result);
43+
}
44+
45+
///<summary>
46+
///Retrieve all Play Offers of a participating member
47+
///</summary>
48+
///<param name="participantId">The id of the member participating in the play offer</param>
49+
///<returns>List of Play offers with where given member is creator or opponent</returns>
50+
///<response code="200">Returns a list of Play offers matching the query params</response>
51+
///<response code="204">No Play offer with matching properties was found</response>
52+
[HttpGet]
53+
[Route("participant")]
54+
[ProducesResponseType(typeof(IEnumerable<PlayOffer>), StatusCodes.Status200OK)]
55+
[ProducesResponseType(typeof(ActionResult), StatusCodes.Status204NoContent)]
56+
[Consumes("application/json")]
57+
[Produces("application/json")]
58+
public async Task<ActionResult<IEnumerable<PlayOfferDto>>> GetByParticipantIdAsync([FromQuery] Guid participantId)
59+
{
60+
//TODO: refactor after jwt implementation to get participantId from token
61+
var result = await _mediator.Send(new GetPlayOffersByParticipantIdQuery(participantId));
62+
63+
if (result.Count() == 0)
64+
return NoContent();
65+
66+
return Ok(result);
67+
}
68+
69+
///<summary>
70+
///Get all Play offers created by a member with a matching name
71+
///</summary>
72+
///<param name="creatorName">Name of the creator in the format '[FirstName] [LastName]', '[FirstName]' or '[LastName]'</param>
73+
///<returns>A list of Play offers with a matching id</returns>
74+
///<response code="200">Returns a List of Play offers with creator matching the query params</response>
75+
///<response code="204">No Play offers with matching creator was found</response>
76+
[HttpGet]
77+
[Route("search")]
3178
[ProducesResponseType(typeof(IEnumerable<PlayOffer>), StatusCodes.Status200OK)]
3279
[ProducesResponseType(typeof(ActionResult), StatusCodes.Status204NoContent)]
3380
[Consumes("application/json")]
3481
[Produces("application/json")]
35-
public async Task<ActionResult<IEnumerable<PlayOffer>>> GetByIdAsync([FromQuery] Guid? playOfferId, [FromQuery] Guid? creatorId, [FromQuery] Guid? clubId)
82+
public async Task<ActionResult<IEnumerable<PlayOfferDto>>> GetByCreatorNameAsync([FromQuery] string creatorName)
3683
{
37-
var result = await _mediator.Send(new GetPlayOffersByIdQuery(playOfferId, creatorId, clubId));
84+
IEnumerable<PlayOfferDto> result;
85+
try
86+
{
87+
result = await _mediator.Send(new GetPlayOffersByCreatorNameQuery(creatorName));
88+
}
89+
catch (Exception e)
90+
{
91+
return BadRequest(e.Message);
92+
}
3893

3994
if (result.Count() == 0)
4095
return NoContent();
4196

4297
return Ok(result);
4398
}
99+
44100

45101

46102
///<summary>
47103
///Create a new Play Offer
48104
///</summary>
49-
///<param name="playOfferDto">The Play Offer to create</param>
105+
///<param name="createPlayOfferDto">The Play Offer to create</param>
50106
///<returns>The newly created Play offer</returns>
51107
///<response code="200">Returns the id of the created Play Offer</response>
52108
///<response code="400">Invalid Play Offer structure</response>
@@ -55,12 +111,12 @@ public async Task<ActionResult<IEnumerable<PlayOffer>>> GetByIdAsync([FromQuery]
55111
[ProducesResponseType(typeof(ActionResult), StatusCodes.Status400BadRequest)]
56112
[Consumes("application/json")]
57113
[Produces("application/json")]
58-
public async Task<ActionResult<PlayOffer>> Create(PlayOfferDto playOfferDto)
114+
public async Task<ActionResult<PlayOffer>> Create(CreatePlayOfferDto createPlayOfferDto)
59115
{
60116
Guid result;
61117
try
62118
{
63-
result = await _mediator.Send(new CreatePlayOfferCommand(playOfferDto));
119+
result = await _mediator.Send(new CreatePlayOfferCommand(createPlayOfferDto));
64120
}
65121
catch (Exception e)
66122
{
@@ -104,7 +160,7 @@ public async Task<ActionResult> Delete(Guid playOfferId)
104160
///<response code="200">The opponentId was added to the Play Offer with the matching playOfferId</response>
105161
///<response code="400">No playOffer with a matching playOfferId found</response>
106162
[HttpPost]
107-
[Route("/join")]
163+
[Route("join")]
108164
[ProducesResponseType(typeof(ActionResult), StatusCodes.Status200OK)]
109165
[ProducesResponseType(typeof(ActionResult), StatusCodes.Status400BadRequest)]
110166
[Consumes("application/json")]

Application/Handlers/CreatePlayOfferHandler.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ public CreatePlayOfferHandler(WriteEventRepository writeEventRepository, ClubRep
2323

2424
public async Task<Guid> Handle(CreatePlayOfferCommand request, CancellationToken cancellationToken)
2525
{
26-
var playOfferDto = request.PlayOfferDto;
26+
var playOfferDto = request.CreatePlayOfferDto;
2727

2828
var club = await _clubRepository.GetClubById(playOfferDto.ClubId);
2929
if(club == null)
30-
throw new NotFoundException($"Club {request.PlayOfferDto.ClubId} not found");
30+
throw new NotFoundException($"Club {request.CreatePlayOfferDto.ClubId} not found");
3131
switch (club.Status)
3232
{
3333
case Status.LOCKED:
@@ -38,7 +38,7 @@ public async Task<Guid> Handle(CreatePlayOfferCommand request, CancellationToken
3838

3939
var creator = await _memberRepository.GetMemberById(playOfferDto.CreatorId);
4040
if(creator == null)
41-
throw new NotFoundException($"Member {request.PlayOfferDto.CreatorId} not found!");
41+
throw new NotFoundException($"Member {request.CreatePlayOfferDto.CreatorId} not found!");
4242
switch (creator.Status)
4343
{
4444
case Status.LOCKED:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using MediatR;
2+
using PlayOfferService.Application.Queries;
3+
using PlayOfferService.Domain.Models;
4+
using PlayOfferService.Domain.Repositories;
5+
6+
namespace PlayOfferService.Application.Handlers;
7+
public class GetPlayOffersByClubIdHandler : IRequestHandler<GetPlayOffersByClubIdQuery, IEnumerable<PlayOfferDto>>
8+
{
9+
private readonly PlayOfferRepository _playOfferRepository;
10+
private readonly MemberRepository _memberRepository;
11+
private readonly ClubRepository _clubRepository;
12+
private readonly ReservationRepository _reservationRepository;
13+
private readonly CourtRepository _courtRepository;
14+
15+
public GetPlayOffersByClubIdHandler(PlayOfferRepository playOfferRepository, MemberRepository memberRepository, ClubRepository clubRepository, ReservationRepository reservationRepository, CourtRepository courtRepository)
16+
{
17+
_playOfferRepository = playOfferRepository;
18+
_memberRepository = memberRepository;
19+
_clubRepository = clubRepository;
20+
_reservationRepository = reservationRepository;
21+
_courtRepository = courtRepository;
22+
}
23+
24+
public async Task<IEnumerable<PlayOfferDto>> Handle(GetPlayOffersByClubIdQuery request, CancellationToken cancellationToken)
25+
{
26+
var playOffers = await _playOfferRepository.GetPlayOffersByIds(null, null, request.ClubId);
27+
28+
var clubDto = new ClubDto((await _clubRepository.GetClubById(request.ClubId))!);
29+
var memberDtos = (await _memberRepository.GetAllMembers()).Select(member => new MemberDto(member)).ToList();
30+
var courtDtos = (await _courtRepository.GetAllCourts()).Select(court => new CourtDto(court)).ToList();
31+
var reservationDtos = (await _reservationRepository.GetAllReservations()).Select(reservation => new ReservationDto(reservation, courtDtos)).ToList();
32+
33+
var playOfferDtos = new List<PlayOfferDto>();
34+
foreach (var playOffer in playOffers)
35+
{
36+
var creator = memberDtos.First(member => member.Id == playOffer.CreatorId);
37+
var opponent = memberDtos.FirstOrDefault(member => member.Id == playOffer.OpponentId);
38+
var reservation = reservationDtos.FirstOrDefault(reservation => reservation.Id == playOffer.ReservationId);
39+
playOfferDtos.Add(new PlayOfferDto(playOffer, clubDto, creator, opponent, reservation));
40+
}
41+
42+
return playOfferDtos;
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using MediatR;
2+
using PlayOfferService.Application.Queries;
3+
using PlayOfferService.Domain.Models;
4+
using PlayOfferService.Domain.Repositories;
5+
6+
namespace PlayOfferService.Application.Handlers.Events;
7+
8+
public class GetPlayOffersByCreatorNameHandler : IRequestHandler<GetPlayOffersByCreatorNameQuery, IEnumerable<PlayOfferDto>>
9+
{
10+
private readonly PlayOfferRepository _playOfferRepository;
11+
private readonly MemberRepository _memberRepository;
12+
private readonly ClubRepository _clubRepository;
13+
private readonly ReservationRepository _reservationRepository;
14+
private readonly CourtRepository _courtRepository;
15+
16+
public GetPlayOffersByCreatorNameHandler(PlayOfferRepository playOfferRepository, MemberRepository memberRepository, ClubRepository clubRepository, ReservationRepository reservationRepository, CourtRepository courtRepository)
17+
{
18+
_playOfferRepository = playOfferRepository;
19+
_memberRepository = memberRepository;
20+
_clubRepository = clubRepository;
21+
_reservationRepository = reservationRepository;
22+
_courtRepository = courtRepository;
23+
}
24+
25+
public async Task<IEnumerable<PlayOfferDto>> Handle(GetPlayOffersByCreatorNameQuery request, CancellationToken cancellationToken)
26+
{
27+
if (request.CreatorName.Split(" ").Length > 2)
28+
throw new ArgumentException("Creator name must be in the format '<FirstName> <LastName>', '<FirstName>' or '<LastName>'");
29+
30+
var creators = await _memberRepository.GetMemberByName(request.CreatorName);
31+
var playOffers = new List<PlayOffer>();
32+
foreach (var creator in creators)
33+
{
34+
var playOffersByCreator = await _playOfferRepository.GetPlayOffersByIds(null, creator.Id);
35+
playOffers.AddRange(playOffersByCreator);
36+
}
37+
38+
var clubDto = (await _clubRepository.GetAllClubs()).Select(club => new ClubDto(club)).ToList();
39+
var memberDtos = (await _memberRepository.GetAllMembers()).Select(member => new MemberDto(member)).ToList();
40+
var courtDtos = (await _courtRepository.GetAllCourts()).Select(court => new CourtDto(court)).ToList();
41+
var reservationDtos = (await _reservationRepository.GetAllReservations()).Select(reservation => new ReservationDto(reservation, courtDtos)).ToList();
42+
43+
var playOfferDtos = new List<PlayOfferDto>();
44+
foreach (var playOffer in playOffers)
45+
{
46+
var club = clubDto.First(club => club.Id == playOffer.ClubId);
47+
var creator = memberDtos.First(member => member.Id == playOffer.CreatorId);
48+
var opponent = memberDtos.FirstOrDefault(member => member.Id == playOffer.OpponentId);
49+
var reservation = reservationDtos.FirstOrDefault(reservation => reservation.Id == playOffer.ReservationId);
50+
playOfferDtos.Add(new PlayOfferDto(playOffer, club, creator, opponent, reservation));
51+
}
52+
53+
return playOfferDtos;
54+
}
55+
}

Application/Handlers/GetPlayOffersByIdHandler.cs

-20
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using MediatR;
2+
using PlayOfferService.Application.Queries;
3+
using PlayOfferService.Domain.Models;
4+
using PlayOfferService.Domain.Repositories;
5+
6+
namespace PlayOfferService.Application.Handlers;
7+
public class GetPlayOffersByParticipantIdHandler : IRequestHandler<GetPlayOffersByParticipantIdQuery, IEnumerable<PlayOfferDto>>
8+
{
9+
private readonly PlayOfferRepository _playOfferRepository;
10+
private readonly MemberRepository _memberRepository;
11+
private readonly ClubRepository _clubRepository;
12+
private readonly ReservationRepository _reservationRepository;
13+
private readonly CourtRepository _courtRepository;
14+
15+
public GetPlayOffersByParticipantIdHandler(PlayOfferRepository playOfferRepository, MemberRepository memberRepository, ClubRepository clubRepository, ReservationRepository reservationRepository, CourtRepository courtRepository)
16+
{
17+
_playOfferRepository = playOfferRepository;
18+
_memberRepository = memberRepository;
19+
_clubRepository = clubRepository;
20+
_reservationRepository = reservationRepository;
21+
_courtRepository = courtRepository;
22+
}
23+
24+
public async Task<IEnumerable<PlayOfferDto>> Handle(GetPlayOffersByParticipantIdQuery request, CancellationToken cancellationToken)
25+
{
26+
var playOffers = await _playOfferRepository.GetPlayOffersByParticipantId(request.ParticipantId);
27+
28+
var clubDto = (await _clubRepository.GetAllClubs()).Select(club => new ClubDto(club)).ToList();
29+
var memberDtos = (await _memberRepository.GetAllMembers()).Select(member => new MemberDto(member)).ToList();
30+
var courtDtos = (await _courtRepository.GetAllCourts()).Select(court => new CourtDto(court)).ToList();
31+
var reservationDtos = (await _reservationRepository.GetAllReservations()).Select(reservation => new ReservationDto(reservation, courtDtos)).ToList();
32+
33+
var playOfferDtos = new List<PlayOfferDto>();
34+
foreach (var playOffer in playOffers)
35+
{
36+
var club = clubDto.First(club => club.Id == playOffer.ClubId);
37+
var creator = memberDtos.First(member => member.Id == playOffer.CreatorId);
38+
var opponent = memberDtos.FirstOrDefault(member => member.Id == playOffer.OpponentId);
39+
var reservation = reservationDtos.FirstOrDefault(reservation => reservation.Id == playOffer.ReservationId);
40+
playOfferDtos.Add(new PlayOfferDto(playOffer, club, creator, opponent, reservation));
41+
}
42+
43+
return playOfferDtos;
44+
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using MediatR;
2+
using PlayOfferService.Domain.Models;
3+
4+
namespace PlayOfferService.Application.Queries;
5+
public record GetPlayOffersByClubIdQuery(Guid ClubId) : IRequest<IEnumerable<PlayOfferDto>>
6+
{
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using MediatR;
2+
using PlayOfferService.Domain.Models;
3+
4+
namespace PlayOfferService.Application.Queries;
5+
6+
public record GetPlayOffersByCreatorNameQuery(string CreatorName) : IRequest<IEnumerable<PlayOfferDto>>
7+
{
8+
}

Application/Queries/GetPlayOffersByIdQuery.cs

-7
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using MediatR;
2+
using PlayOfferService.Domain.Models;
3+
4+
namespace PlayOfferService.Application.Queries;
5+
6+
public record GetPlayOffersByParticipantIdQuery(Guid ParticipantId) : IRequest<IEnumerable<PlayOfferDto>>
7+
{
8+
}

Application/RedisClubStreamService.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public RedisClubStreamService(IServiceScopeFactory serviceScopeFactory)
1919
_serviceScopeFactory = serviceScopeFactory;
2020
var tokenSource = new CancellationTokenSource();
2121
_cancellationToken = tokenSource.Token;
22-
var muxer = ConnectionMultiplexer.Connect("pos_redis");
22+
var muxer = ConnectionMultiplexer.Connect("redis");
2323
_db = muxer.GetDatabase();
2424
}
2525

Application/RedisCourtStreamService.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public RedisCourtStreamService(IServiceScopeFactory serviceScopeFactory)
2020
_serviceScopeFactory = serviceScopeFactory;
2121
var tokenSource = new CancellationTokenSource();
2222
_cancellationToken = tokenSource.Token;
23-
var muxer = ConnectionMultiplexer.Connect("pos_redis");
23+
var muxer = ConnectionMultiplexer.Connect("redis");
2424
_db = muxer.GetDatabase();
2525
}
2626

Application/RedisMemberStreamService.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public RedisMemberStreamService(IServiceScopeFactory serviceScopeFactory)
2121
_serviceScopeFactory = serviceScopeFactory;
2222
var tokenSource = new CancellationTokenSource();
2323
_cancellationToken = tokenSource.Token;
24-
var muxer = ConnectionMultiplexer.Connect("pos_redis");
24+
var muxer = ConnectionMultiplexer.Connect("redis");
2525
_db = muxer.GetDatabase();
2626
}
2727

Application/RedisPlayOfferStreamService.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public RedisPlayOfferStreamService(IServiceScopeFactory serviceScopeFactory)
2121
_serviceScopeFactory = serviceScopeFactory;
2222
var tokenSource = new CancellationTokenSource();
2323
_cancellationToken = tokenSource.Token;
24-
var muxer = ConnectionMultiplexer.Connect("pos_redis");
24+
var muxer = ConnectionMultiplexer.Connect("redis");
2525
_db = muxer.GetDatabase();
2626
}
2727

0 commit comments

Comments
 (0)