Skip to content
This repository was archived by the owner on Jun 2, 2025. It is now read-only.

Commit 122b3b9

Browse files
Merge pull request #20 from piotrprzybyszdev/matches-and-communications
Matches and communications
2 parents ca5f7c8 + d4a3a6d commit 122b3b9

File tree

100 files changed

+2549
-223
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

100 files changed

+2549
-223
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using MediatR;
2+
using Microsoft.AspNetCore.Authorization;
3+
using Microsoft.AspNetCore.Mvc;
4+
using PoZiomkaApi.Requests.Communication;
5+
using PoZiomkaDomain.Common;
6+
using PoZiomkaDomain.Communication.Commands.DeleteCommunication;
7+
using PoZiomkaDomain.Communication.Dtos;
8+
using PoZiomkaDomain.Communication.Queries.GetStudentCommunications;
9+
10+
namespace PoZiomkaApi.Controllers;
11+
12+
[Route("/communication")]
13+
[ApiController]
14+
public class CommunicationController(IMediator mediator) : Controller
15+
{
16+
[HttpGet("get-student")]
17+
[Authorize(Roles = Roles.Student)]
18+
public async Task<IEnumerable<CommunicationDisplay>> GetStudentCommunications()
19+
{
20+
return await mediator.Send(new GetStudentCommunicationsQuery(User));
21+
}
22+
23+
[HttpPost("send")]
24+
[Authorize(Roles = Roles.Administrator)]
25+
public async Task<IActionResult> SendCommunication(CommunicationSendRequest sendRequest)
26+
{
27+
await mediator.Send(sendRequest.ToSendCommunicationCommand());
28+
return Ok();
29+
}
30+
31+
[HttpDelete("delete/{id}")]
32+
[Authorize(Roles = Roles.Student)]
33+
public async Task<IActionResult> DeleteCommunication(int id)
34+
{
35+
await mediator.Send(new DeleteCommunicationCommand(id, User));
36+
return Ok();
37+
}
38+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using MediatR;
2+
using Microsoft.AspNetCore.Authorization;
3+
using Microsoft.AspNetCore.Mvc;
4+
using PoZiomkaApi.Requests.Match;
5+
using PoZiomkaDomain.Common;
6+
using PoZiomkaDomain.Match.Commands.UpdateMatchCommand;
7+
using PoZiomkaDomain.Match.Dtos;
8+
using PoZiomkaDomain.Match.Queries.StudentMatchesQuery;
9+
using PoZiomkaDomain.StudentAnswers.Commands.Update;
10+
11+
namespace PoZiomkaApi.Controllers;
12+
13+
[Route("/match")]
14+
[ApiController]
15+
public class MatchController(IMediator mediator) : Controller
16+
{
17+
[HttpGet("get-student")]
18+
[Authorize(Roles = Roles.Student)]
19+
public async Task<IEnumerable<MatchModel>> GetStudentMatches()
20+
{
21+
StudentMatchQuery query = new(User);
22+
return await mediator.Send(query);
23+
}
24+
25+
[HttpPut("update")]
26+
[Authorize(Roles = Roles.Student)]
27+
public async Task<IActionResult> UpdateMatch(MatchUpdateRequest updateRequest)
28+
{
29+
UpdateMatchCommand command = new(User, updateRequest.Id, updateRequest.IsAcceptation);
30+
await mediator.Send(command);
31+
return Ok();
32+
}
33+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using MediatR;
2+
using Microsoft.AspNetCore.Authorization;
3+
using Microsoft.AspNetCore.Mvc;
4+
using PoZiomkaApi.Requests.Reservation;
5+
using PoZiomkaDomain.Common;
6+
using PoZiomkaDomain.Reservation.Commands.UpdateReservation;
7+
using PoZiomkaDomain.Reservation.Dtos;
8+
using PoZiomkaDomain.Reservation.Queries.GetReservation;
9+
using PoZiomkaDomain.Reservation.Queries.GetReservations;
10+
using PoZiomkaDomain.Room.Dtos;
11+
using PoZiomkaDomain.Student.Dtos;
12+
13+
namespace PoZiomkaApi.Controllers;
14+
15+
[Route("/reservation")]
16+
[ApiController]
17+
public class ReservationController(IMediator mediator) : Controller
18+
{
19+
[HttpGet("get")]
20+
[Authorize(Roles = Roles.Administrator)]
21+
public async Task<IEnumerable<ReservationModel>> GetReservations()
22+
{
23+
return await mediator.Send(new GetReservationsQuery());
24+
}
25+
26+
[HttpGet("get/{id}")]
27+
[Authorize(Roles = $"{Roles.Student},{Roles.Administrator}")]
28+
public async Task<ReservationDisplay> GetReservation(int id)
29+
{
30+
return await mediator.Send(new GetReservationQuery(id, User));
31+
}
32+
33+
[HttpPut("update")]
34+
[Authorize(Roles = $"{Roles.Student},{Roles.Administrator}")]
35+
public async Task<IActionResult> UpdateReservation(ReservationUpdateRequest updateRequest)
36+
{
37+
await mediator.Send(updateRequest.ToUpdateReservationCommand(User));
38+
return Ok();
39+
}
40+
}

PoZiomkaApi/Controllers/StudentAnswerController.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ namespace PoZiomkaApi.Controllers;
1414
[ApiController]
1515
public class StudentAnswerController(IMediator mediator) : ControllerBase
1616
{
17-
[HttpGet("get-student")]
17+
[HttpGet("get/{studentId}")]
1818
[Authorize(Roles = Roles.Student)]
19-
public async Task<IEnumerable<StudentAnswerStatus>> GetStudent()
19+
public async Task<IEnumerable<StudentAnswerStatus>> GetStudent(int studentId)
2020
{
21-
GetStudentAnswersQuery query = new(User);
21+
GetStudentAnswersQuery query = new(User, studentId);
2222
return await mediator.Send(query);
2323
}
2424

PoZiomkaApi/ExceptionMiddleware.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
using PoZiomkaDomain.Admin.Exceptions;
44
using PoZiomkaDomain.Application.Exceptions;
55
using PoZiomkaDomain.Common.Exceptions;
6+
using PoZiomkaDomain.Communication.Exceptions;
67
using PoZiomkaDomain.Exceptions;
78
using PoZiomkaDomain.Form.Exceptions;
9+
using PoZiomkaDomain.Reservation.Exceptions;
810
using PoZiomkaDomain.Room.Exceptions;
911
using PoZiomkaDomain.Student.Exceptions;
1012
using PoZiomkaDomain.StudentAnswers.Exceptions;
1113
using PoZiomkaInfrastructure.Exceptions;
14+
using System;
1215
using System.Text.Json;
1316

1417
namespace PoZiomkaApi;
@@ -232,6 +235,36 @@ public async Task Invoke(HttpContext context)
232235
Title = "User can't fill forms"
233236
};
234237
}
238+
catch (CommunicationNotFoundException exception)
239+
{
240+
context.Response.StatusCode = StatusCodes.Status404NotFound;
241+
problemDetails = new ProblemDetails()
242+
{
243+
Status = StatusCodes.Status404NotFound,
244+
Detail = exception.Message,
245+
Title = "Communication not found"
246+
};
247+
}
248+
catch (UnauthorizedDeleteException exception)
249+
{
250+
context.Response.StatusCode = StatusCodes.Status404NotFound;
251+
problemDetails = new ProblemDetails()
252+
{
253+
Status = StatusCodes.Status401Unauthorized,
254+
Detail = exception.Message,
255+
Title = "User not authorized to delete this notification"
256+
};
257+
}
258+
catch (ReservationNotFoundException exception)
259+
{
260+
context.Response.StatusCode = StatusCodes.Status404NotFound;
261+
problemDetails = new ProblemDetails()
262+
{
263+
Status = StatusCodes.Status404NotFound,
264+
Detail = exception.Message,
265+
Title = "Reservation not found"
266+
};
267+
}
235268
catch (DomainException exception)
236269
{
237270
context.Response.StatusCode = StatusCodes.Status500InternalServerError;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using PoZiomkaDomain.Communication.Commands.SendCommunication;
2+
3+
namespace PoZiomkaApi.Requests.Communication;
4+
5+
public record CommunicationSendRequest(IEnumerable<int> StudentIds, string Description)
6+
{
7+
public SendCommunicationCommand ToSendCommunicationCommand() => new(StudentIds, Description);
8+
};
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
namespace PoZiomkaApi.Requests.Match;
2+
3+
public record MatchUpdateRequest(int Id, bool IsAcceptation);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using PoZiomkaDomain.Reservation.Commands.UpdateReservation;
2+
using System.Security.Claims;
3+
4+
namespace PoZiomkaApi.Requests.Reservation;
5+
6+
public record ReservationUpdateRequest(int Id, bool IsAcceptation)
7+
{
8+
public UpdateReservationCommand ToUpdateReservationCommand(ClaimsPrincipal user) => new(Id, IsAcceptation, user);
9+
};

PoZiomkaApp/src/app/admin/admin.component.html

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,29 @@
44
<div class="d-flex flex-column h-100">
55
<div class="bg-white border border-secondary rounded-bottom-4 px-4 py-2">
66
<app-menu logoLink="/admin/dashboard" logoStyle="poziomka-logo-blue">
7-
<li class="nav-item mx-lg-2 my-1 my-lg-0">
7+
<li class="nav-item mx-xl-2 my-1 my-xl-0 ms-xl-5">
8+
<a class="nav-link active btn d-inline" (click)="onCommunicationsClick()">Komunikaty</a>
9+
</li>
10+
<li class="nav-item mx-xl-2 my-1 my-xl-0">
11+
<a class="nav-link active btn d-inline" (click)="onReservationsClick()">Rezerwacje</a>
12+
</li>
13+
<li class="nav-item mx-xl-2 my-1 my-xl-0">
814
<a class="nav-link active btn d-inline" (click)="onFormListClick()">Ankiety</a>
915
</li>
10-
<li class="nav-item mx-lg-2 my-1 my-lg-0">
16+
<li class="nav-item mx-xl-2 my-1 my-xl-0">
1117
<a class="nav-link active btn d-inline" (click)="onApplicationListClick()">Wnioski</a>
1218
</li>
13-
<li class="nav-item mx-lg-2 my-1 my-lg-0">
19+
<li class="nav-item mx-xl-2 my-1 my-xl-0">
1420
<a class="nav-link active btn d-inline" (click)="onRoomListClick()">Pokoje</a>
1521
</li>
16-
<li class="nav-item mx-lg-2 my-1 my-lg-0">
22+
<li class="nav-item mx-xl-2 my-1 my-xl-0">
1723
<a class="nav-link active btn d-inline" (click)="onStudentListClick()">Studenci</a>
1824
</li>
19-
<li class="nav-item mx-lg-2 my-1 my-lg-0">
20-
<a class="nav-link active btn d-inline" (click)="onProfileClick()">Profil</a>
25+
<li class="nav-item mx-xl-2 my-1 my-xl-0">
26+
<a class="nav-link active btn d-inline" (click)="onDashboardClick()">Panel główny</a>
2127
</li>
2228

23-
<li class="nav-item ms-lg-4 my-1 my-lg-0">
29+
<li class="nav-item my-1 my-xl-0 ms-xl-auto">
2430
<a class="nav-link active btn d-inline" (click)="logout()">Wyloguj się</a>
2531
</li>
2632
</app-menu>

PoZiomkaApp/src/app/admin/admin.component.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ export class AdminComponent {
1717
this.router.navigate(['/admin/applications']);
1818
}
1919

20-
onProfileClick(): void {
21-
this.router.navigate(['/admin/profile']);
20+
onDashboardClick(): void {
21+
this.router.navigate(['/admin/dashboard']);
2222
}
2323

2424
onStudentListClick(): void {
@@ -33,6 +33,14 @@ export class AdminComponent {
3333
this.router.navigate(['/admin/forms']);
3434
}
3535

36+
onReservationsClick(): void {
37+
this.router.navigate(['/admin/reservations']);
38+
}
39+
40+
onCommunicationsClick(): void {
41+
this.router.navigate(['/admin/communications']);
42+
}
43+
3644
logout(): void {
3745
this.authService.logOut().subscribe({
3846
next: _ => this.router.navigate(['/login'])

0 commit comments

Comments
 (0)