Skip to content
This repository was archived by the owner on Jun 2, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 92 commits
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
880a34c
Setup dtos and services
piotrprzybyszdev Apr 1, 2025
08b546d
Split RoomUpdate into AddStudent and RemoveStudent
piotrprzybyszdev Apr 2, 2025
5062015
Added saving file to disk
piotrprzybyszdev Apr 3, 2025
bb2301c
setup controllers and requests
piotrprzybyszdev Mar 31, 2025
aca427a
Setup FileStorage
piotrprzybyszdev Mar 31, 2025
0340239
Mocked file download
piotrprzybyszdev Apr 3, 2025
6f4251f
Setup dtos and services
piotrprzybyszdev Apr 1, 2025
5fd3fbe
Room list
piotrprzybyszdev Apr 7, 2025
f7ee73d
Room controller setup
piotrprzybyszdev Apr 8, 2025
797c6fd
Added splitting rooms by floor
piotrprzybyszdev Apr 8, 2025
83f9eb4
rooms table, create room endpoint
Popke523 Apr 8, 2025
6aba638
Room popups
piotrprzybyszdev Apr 8, 2025
d61dabf
Student lookup
piotrprzybyszdev Apr 8, 2025
b04a43f
work in progress
Popke523 Apr 9, 2025
0a69f3c
room get endpoint work in progress
Popke523 Apr 9, 2025
fdfff0b
fix GetStudentsByRoomId
Popke523 Apr 9, 2025
83b4021
get all rooms
Popke523 Apr 11, 2025
4651269
update sample data
Popke523 Apr 11, 2025
27867b8
delete room endpoint
Popke523 Apr 11, 2025
0661a7a
delete non-empty room handling and exception fixes
Popke523 Apr 11, 2025
e2b6ce5
add student to room
Popke523 Apr 11, 2025
efdc09e
remove student from room
Popke523 Apr 11, 2025
216b17e
Room lookup
piotrprzybyszdev Apr 12, 2025
1dc5e72
Student applications
piotrprzybyszdev Apr 12, 2025
e08b3e8
Added room popup to student list
piotrprzybyszdev Apr 12, 2025
1155730
merge room-add
NotAnCookie Apr 12, 2025
3223978
merge room-details
NotAnCookie Apr 12, 2025
8baa869
merge admin-application-list | non cut version
NotAnCookie Apr 12, 2025
47c8134
Merge pull request #14 from piotrprzybyszdev/rooms-front-force-merge
NotAnCookie Apr 12, 2025
6d78092
fix closing button
NotAnCookie Apr 12, 2025
248dfad
applications-filters | non fixed student get
NotAnCookie Apr 12, 2025
9acd5b8
fix student get
NotAnCookie Apr 12, 2025
ac0b481
Applications backend (#15)
pietraldo Apr 12, 2025
73dd82f
Azure blob storage mock
piotrprzybyszdev Apr 13, 2025
948fdd7
return list of RoomDisplay in get all rooms
Popke523 Apr 13, 2025
f16e967
refactoring
pietraldo Apr 13, 2025
2ef5aec
inserting constatn data into database
pietraldo Apr 13, 2025
6d200ec
refactoring
pietraldo Apr 13, 2025
87166cb
use GetStudentIdsByRoomId
Popke523 Apr 13, 2025
5a40bac
Merge branch 'rooms-and-applications-backend' of github.com:piotrprzy…
Popke523 Apr 13, 2025
32bfa02
application-details
NotAnCookie Apr 13, 2025
097af69
room list refresh
piotrprzybyszdev Apr 13, 2025
fa17f86
unique room number
Popke523 Apr 13, 2025
f53e033
idk co tu się dzieje
jarus2 Apr 13, 2025
b11a64a
Merge branch 'rooms-and-applications-frontend' of https://github.com/…
jarus2 Apr 13, 2025
138b6fe
fix merge
NotAnCookie Apr 13, 2025
cdb1a42
move student tests to student folder
Popke523 Apr 13, 2025
93a9801
add swagger example
pietraldo Apr 13, 2025
8b5b8ea
Merge branch 'rooms-and-applications-backend' of https://github.com/p…
pietraldo Apr 13, 2025
fa937e6
created test classes
pietraldo Apr 13, 2025
a31c523
redirect if unauthorized
piotrprzybyszdev Apr 13, 2025
b288886
better application details
NotAnCookie Apr 13, 2025
1ac34c3
change return value of endpoin application/get
pietraldo Apr 13, 2025
80033d5
Application type dropdown
piotrprzybyszdev Apr 13, 2025
9ee99a9
Merge branch 'rooms-and-applications-frontend' of https://github.com/…
piotrprzybyszdev Apr 13, 2025
74749f1
fix application list layout
piotrprzybyszdev Apr 13, 2025
445ce17
filters
NotAnCookie Apr 13, 2025
61521ff
Updated exception handling
piotrprzybyszdev Apr 13, 2025
0d2300c
fixed exceptions not being available in tests
Popke523 Apr 13, 2025
203ec85
Streamed file download
piotrprzybyszdev Apr 13, 2025
46171bd
Merge branch 'rooms-and-applications-backend' of https://github.com/p…
piotrprzybyszdev Apr 13, 2025
7d854db
DownloadCommandHandlerTest
Popke523 Apr 13, 2025
9c7629a
resolve application tests
Popke523 Apr 13, 2025
ce811c9
submit application tests
Popke523 Apr 13, 2025
ad36d42
GetStudentQueryHandlerTest
Popke523 Apr 13, 2025
86c3122
application list fix
piotrprzybyszdev Apr 13, 2025
8a0e3b3
pdf sample files
pietraldo Apr 13, 2025
8d55a3c
Merge branch 'rooms-and-applications-backend' of https://github.com/p…
pietraldo Apr 13, 2025
807b87a
delete applications on deleting student
Popke523 Apr 13, 2025
8cce517
fixed exception handling
Popke523 Apr 13, 2025
1871f6e
fix
pietraldo Apr 13, 2025
fd02fc7
tests
pietraldo Apr 13, 2025
7119cd8
merge
pietraldo Apr 13, 2025
7872987
add student handler test
pietraldo Apr 13, 2025
377d71f
room create test
pietraldo Apr 13, 2025
27234b3
fix
pietraldo Apr 13, 2025
b598d0a
delete room test
pietraldo Apr 13, 2025
3749e68
query all rooms
pietraldo Apr 13, 2025
2c9ed13
skeletons of tests
pietraldo Apr 13, 2025
7f2cc4b
get room test
pietraldo Apr 13, 2025
a5c6c0f
Fix sample files
piotrprzybyszdev Apr 13, 2025
1bd359a
Update tests
piotrprzybyszdev Apr 13, 2025
ac5d96f
Remove sample ApplicationTypes
piotrprzybyszdev Apr 13, 2025
1834837
Merge pull request #16 from piotrprzybyszdev/rooms-and-applications-f…
piotrprzybyszdev Apr 13, 2025
0edd871
Merge branch 'development' into rooms-and-applications-backend
piotrprzybyszdev Apr 13, 2025
b74191f
Merge pull request #17 from piotrprzybyszdev/rooms-and-applications-b…
piotrprzybyszdev Apr 13, 2025
d123186
Azure blob config for github actions integration test
piotrprzybyszdev Apr 13, 2025
0190a41
fix
pietraldo Apr 13, 2025
87e69b7
Merge branch 'development' of https://github.com/piotrprzybyszdev/Sof…
pietraldo Apr 13, 2025
179c2bf
fix2
pietraldo Apr 13, 2025
a361630
npm audit fix
piotrprzybyszdev Apr 13, 2025
cc5b400
workflow update
piotrprzybyszdev Apr 14, 2025
e3e9556
workflow update
piotrprzybyszdev Apr 14, 2025
8836788
workflow update
piotrprzybyszdev Apr 14, 2025
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
91 changes: 91 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
[*.cs]

# CS1591: Missing XML comment for publicly visible type or member
dotnet_diagnostic.CS1591.severity = none
csharp_indent_labels = one_less_than_current
csharp_using_directive_placement = outside_namespace:silent
csharp_prefer_simple_using_statement = true:suggestion
csharp_prefer_braces = true:silent
csharp_style_namespace_declarations = block_scoped:silent
csharp_style_prefer_method_group_conversion = true:silent
csharp_style_prefer_top_level_statements = true:silent
csharp_style_prefer_primary_constructors = true:suggestion
csharp_prefer_system_threading_lock = true:suggestion
csharp_style_expression_bodied_methods = false:silent
csharp_style_expression_bodied_constructors = false:silent
csharp_style_expression_bodied_operators = false:silent
csharp_style_expression_bodied_properties = true:silent
csharp_style_expression_bodied_indexers = true:silent
csharp_style_expression_bodied_accessors = true:silent
csharp_style_expression_bodied_lambdas = true:silent
csharp_style_expression_bodied_local_functions = false:silent
csharp_style_throw_expression = true:suggestion
csharp_space_around_binary_operators = before_and_after

[*.{cs,vb}]
#### Naming styles ####

# Naming rules

dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i

dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case

dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case

# Symbol specifications

dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers =

dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.types.required_modifiers =

dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.required_modifiers =

# Naming styles

dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix =
dotnet_naming_style.begins_with_i.word_separator =
dotnet_naming_style.begins_with_i.capitalization = pascal_case

dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case

dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_style_operator_placement_when_wrapping = beginning_of_line
tab_width = 4
indent_size = 4
end_of_line = crlf
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
dotnet_style_prefer_auto_properties = true:silent
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
dotnet_style_prefer_conditional_expression_over_return = true:silent
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_compound_assignment = true:suggestion
dotnet_style_prefer_simplified_interpolation = true:suggestion
dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
dotnet_style_namespace_match_folder = true:suggestion
3 changes: 2 additions & 1 deletion .github/workflows/deploy-to-azure.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,12 @@ jobs:
with:
files: './package/appsettings.json'
env:
DB.Connection-String: ${{ secrets.APPSETTINGS_DB_CONNECTION_STRING }}
DB.ConnectionString: ${{ secrets.APPSETTINGS_DB_CONNECTION_STRING }}
Email.Sender: ${{ secrets.APPSETTINGS_EMAIL_SENDER }}
Email.Password: ${{ secrets.APPSETTINGS_EMAIL_PASSWORD }}
Jwt.Key: ${{ secrets.APPSETTINGS_JWT_KEY }}
App.Url: ${{ vars.APP_URL }}
FileStorage.ConnectionString: ${{ secrets.APPSETTINGS_FILE_STORAGE_CONNECTION_STRING }}

- name: Login to Azure
uses: azure/login@v2
Expand Down
7 changes: 7 additions & 0 deletions .github/workflows/run-integration-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@ jobs:
runs-on: ubuntu-latest

services:
blobstorage:
image: mcr.microsoft.com/azure-storage/azurite:latest
ports:
- 10000:10000
options:
azurite-blob --blobHost 0.0.0.0 -l /data/blob

sqlserver:
image: mcr.microsoft.com/mssql/server:2022-latest
env:
Expand Down
5 changes: 5 additions & 0 deletions PoZiomka.sln
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-co
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoZiomkaIntegrationTest", "PoZiomkaIntegrationTest\PoZiomkaIntegrationTest.csproj", "{2271DA28-2D91-4FAE-8328-42120F5B221F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A4CC1BDF-C56E-4751-B62D-9D1F86B67C19}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down
8 changes: 8 additions & 0 deletions PoZiomkaApi/Common/NetworkFile.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using PoZiomkaDomain.Application;

namespace PoZiomkaApi.Common;

public class NetworkFile(IFormFile file) : IFile
{
public Stream Stream => file.OpenReadStream();
}
24 changes: 24 additions & 0 deletions PoZiomkaApi/Common/SwaggerServiceExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using Microsoft.OpenApi.Models;
using System.Reflection;

public static class SwaggerServiceExtensions
{
public static IServiceCollection AddCustomSwagger(this IServiceCollection services)
{
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new OpenApiInfo
{
Title = "PoZiomkaApi",
Version = "v1"
});

// Enable XML comments (for <summary>, <example>, etc.)
var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFilename);
options.IncludeXmlComments(xmlPath);
});

return services;
}
}
75 changes: 75 additions & 0 deletions PoZiomkaApi/Controllers/ApplicationController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using PoZiomkaApi.Common;
using PoZiomkaApi.Requests.Application;
using PoZiomkaDomain.Application.Commands.DownloadApplication;
using PoZiomkaDomain.Application.Commands.ResolveApplication;
using PoZiomkaDomain.Application.Commands.SubmitApplication;
using PoZiomkaDomain.Application.Dtos;
using PoZiomkaDomain.Application.Queries.GetStudent;
using PoZiomkaDomain.Application.Queries.GetTypes;
using PoZiomkaDomain.Common;
using System.Net.Mime;

namespace PoZiomkaApi.Controllers;

[Route("/application")]
[ApiController]
public class ApplicationController(IMediator mediator) : ControllerBase
{
[HttpGet("get-types")]
[Authorize(Roles = $"{Roles.Student},{Roles.Administrator}")]
public async Task<IActionResult> GetTypes()
{
var result = await mediator.Send(new GetTypesQuery());
return Ok(result);
}

[HttpGet("get")]
[Authorize(Roles = Roles.Administrator)]
public async Task<IActionResult> Get([FromQuery] GetRequest getRequest)
{
var result = await mediator.Send(getRequest.ToQuery());
return Ok(result);
}

[HttpGet("get-student")]
[Authorize(Roles = Roles.Student)]
public async Task<IActionResult> GetStudent()
{
var result = await mediator.Send(new GetStudentQuery(User));
return Ok(result);
}

[HttpPost("submit/{id}")]
[Authorize(Roles = Roles.Student)]
public async Task<IActionResult> Submit(int id, IFormFile file)
{
if (file.ContentType != MediaTypeNames.Application.Pdf)
return BadRequest("File must be a PDF");

var command = new SubmitApplicationCommand(id, new NetworkFile(file), User);
await mediator.Send(command);
return Ok();
}

[HttpPut("resolve/{id}")]
[Authorize(Roles = Roles.Administrator)]
public async Task<IActionResult> Resolve(int id, ApplicationStatus status)
{
var command = new ResolveApplicationCommand(id, status);
await mediator.Send(command);
return Ok();
}

[HttpGet("download/{id}")]
[Authorize(Roles = $"{Roles.Student},{Roles.Administrator}")]
public async Task<IActionResult> Get(int id)
{
var command = new DownloadApplicationCommand(id, User);
var result = await mediator.Send(command);

return File(result.Stream, MediaTypeNames.Application.Pdf, $"Application-{id}.pdf");
}
}
7 changes: 4 additions & 3 deletions PoZiomkaApi/Controllers/AuthController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ namespace PoZiomkaApi.Controllers;
public class AuthController(IMediator mediator) : ControllerBase
{
[HttpPost("signup")]
public async Task<IActionResult> Signup([FromBody] SignupRequest signupRequest)
public async Task<IActionResult> Signup(SignupRequest signupRequest)
{
await mediator.Send(signupRequest.ToSignupStudent());
return Ok();
}

[HttpPost("login")]
public async Task<IActionResult> Login([FromBody] LoginRequest loginRequest)
public async Task<IActionResult> Login(LoginRequest loginRequest)
{
IEnumerable<Claim> claims = await mediator.Send(loginRequest.ToLoginStudentCommand());

Expand All @@ -31,7 +31,7 @@ public async Task<IActionResult> Login([FromBody] LoginRequest loginRequest)
}

[HttpPost("admin-login")]
public async Task<IActionResult> AdminLogin([FromBody] AdminLoginRequest loginRequest)
public async Task<IActionResult> AdminLogin(AdminLoginRequest loginRequest)
{
IEnumerable<Claim> claims = await mediator.Send(loginRequest.ToLoginAdminCommand());

Expand All @@ -42,6 +42,7 @@ public async Task<IActionResult> AdminLogin([FromBody] AdminLoginRequest loginRe
return Ok();
}


[HttpPost("logout")]
public async Task<IActionResult> Logout()
{
Expand Down
67 changes: 67 additions & 0 deletions PoZiomkaApi/Controllers/RoomController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using PoZiomkaApi.Requests.Room;
using PoZiomkaDomain.Common;
using PoZiomkaDomain.Room.Commands.DeleteRoom;
using PoZiomkaDomain.Room.Queries.GetAllRooms;
using PoZiomkaDomain.Room.Queries.GetRoom;

namespace PoZiomkaApi.Controllers;

[Route("/room")]
[ApiController]
public class RoomController(IMediator mediator) : ControllerBase
{
[HttpGet("get")]
[Authorize(Roles = Roles.Administrator)]
public async Task<IActionResult> Get()
{
var command = new GetAllRoomsQuery();
return Ok(await mediator.Send(command));
}

[HttpGet("get/{id}")]
[Authorize(Roles = $"{Roles.Student},{Roles.Administrator}")]
public async Task<IActionResult> GetById(int id)
{
var getRoom = new GetRoomQuery(id, User);
var room = await mediator.Send(getRoom);

return Ok(room);
}

[HttpPost("create")]
[Authorize(Roles = Roles.Administrator)]
public async Task<IActionResult> Create([FromBody] CreateRequest createRequest)
{
await mediator.Send(createRequest.ToCreateRoomCommand());
return Ok();
}

[HttpPut("add-student")]
[Authorize(Roles = Roles.Administrator)]
public async Task<IActionResult> AddStudent([FromBody] AddStudentRequest addStudentRequest)
{
await mediator.Send(addStudentRequest.ToAddStudentCommand());
return Ok();
}

[HttpPut("remove-student")]
[Authorize(Roles = Roles.Administrator)]
public async Task<IActionResult> RemoveStudent([FromBody] RemoveStudentRequest removeStudentRequest)
{
await mediator.Send(removeStudentRequest.ToRemoveStudentCommand());
return Ok();
}

[HttpDelete("delete/{id}")]
[Authorize(Roles = Roles.Administrator)]
public async Task<IActionResult> Delete(int id)
{
var command = new DeleteRoomCommand(id);
await mediator.Send(command);

return Ok();
}
}
6 changes: 3 additions & 3 deletions PoZiomkaApi/Controllers/StudentController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ namespace PoZiomkaApi.Controllers;
public class StudentController(IMediator mediator) : Controller
{
[HttpPut("confirm")]
public async Task<IActionResult> Confirm([FromBody] ConfirmRequest confirmRequest)
public async Task<IActionResult> Confirm(ConfirmRequest confirmRequest)
{
await mediator.Send(confirmRequest.ToConfirmStudentCommand());
return Ok();
Expand Down Expand Up @@ -78,14 +78,14 @@ public async Task<IActionResult> DeleteStudent(int id)
}

[HttpPost("request-password-reset")]
public async Task<IActionResult> RequestPasswordReset([FromBody] RequestPasswordResetRequest requestPasswordResetRequest)
public async Task<IActionResult> RequestPasswordReset(RequestPasswordResetRequest requestPasswordResetRequest)
{
await mediator.Send(requestPasswordResetRequest.ToRequestPasswordResetCommand());
return Ok();
}

[HttpPut("password-reset")]
public async Task<IActionResult> PasswordReset([FromBody] PasswordResetRequest passwordResetRequest)
public async Task<IActionResult> PasswordReset(PasswordResetRequest passwordResetRequest)
{
await mediator.Send(passwordResetRequest.ToResetPasswordCommand());
return Ok();
Expand Down
Loading
Loading