diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetAdDetailsTests.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetAdDetailsTests.cs index b8d3fda1..00d19ec1 100644 --- a/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetAdDetailsTests.cs +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetAdDetailsTests.cs @@ -1,6 +1,6 @@ -using TutorLizard.BusinessLogic.Enums; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models; +using TutorLizard.BusinessLogic.Models; +using TutorLizard.Shared.Enums; +using TutorLizard.Shared.Models.DTOs.Requests; namespace TutorLizard.BusinessLogic.Tests.Services.Browse; public class BrowseServiceGetAdDetailsTests : BrowseServiceTestsBase diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetBrowseAdsPageTests.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetBrowseAdsPageTests.cs index a69d261b..a9774b45 100644 --- a/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetBrowseAdsPageTests.cs +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetBrowseAdsPageTests.cs @@ -1,8 +1,8 @@ using TutorLizard.BusinessLogic.Models; -using TutorLizard.BusinessLogic.Models.DTOs; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; using TutorLizard.BusinessLogic.Services; +using TutorLizard.Shared.Models.DTOs; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; namespace TutorLizard.BusinessLogic.Tests.Services.Browse; public class BrowseServiceGetBrowseAdsPageTests : BrowseServiceTestsBase diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetUsersScheduleTests.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetUsersScheduleTests.cs index b6bd30e8..82640753 100644 --- a/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetUsersScheduleTests.cs +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetUsersScheduleTests.cs @@ -1,7 +1,7 @@ using TutorLizard.BusinessLogic.Models; -using TutorLizard.BusinessLogic.Models.DTOs; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; using TutorLizard.BusinessLogic.Services; +using TutorLizard.Shared.Models.DTOs; +using TutorLizard.Shared.Models.DTOs.Requests; namespace TutorLizard.BusinessLogic.Tests.Services.Browse; public class BrowseServiceGetUsersScheduleTests : BrowseServiceTestsBase diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceTestsBase.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceTestsBase.cs index 753c38f9..f4f1ae1d 100644 --- a/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceTestsBase.cs +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceTestsBase.cs @@ -1,7 +1,5 @@ using AutoFixture; -using Microsoft.EntityFrameworkCore; using Moq; -using TutorLizard.BusinessLogic.Data; using TutorLizard.BusinessLogic.Interfaces.Data.Repositories; using TutorLizard.BusinessLogic.Models; using TutorLizard.BusinessLogic.Services; diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs new file mode 100644 index 00000000..a1cdacea --- /dev/null +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs @@ -0,0 +1,77 @@ +using Moq; +using TutorLizard.BusinessLogic.Models; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.BusinessLogic.Services; + +namespace TutorLizard.BusinessLogic.Tests.Services.Student +{ + public class StudentServiceScheduleItemRequestTests : StudentServiceTestBase + { + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task CreateScheduleItemRequest_ShouldSetIsRemoteCorrectly(bool isRemote) + { + // Arrange + var ad = new Ad + { + Description = "Test Description", + Location = "Test Location", + Subject = "Test Subject", + Title = "Test Title", + TutorId = 2 + }; + var scheduleItem = new ScheduleItem { Id = 1, Ad = ad }; + + SetupMockGetScheduleItemById(scheduleItem); + SetupMockGetAllScheduleItems(new List { scheduleItem }); + + var request = new CreateScheduleItemRequestRequest + { + StudentId = 3, + ScheduleItemId = 1, + IsRemote = isRemote + }; + + MockScheduleItemRequestRepository + .Setup(x => x.Create(It.Is(req => req.IsRemote == isRemote))) + .Returns((ScheduleItemRequest req) => Task.FromResult(req)) + .Verifiable(Times.Once); + + // Act + await StudentService.CreateScheduleItemRequest(request); + + // Assert + MockScheduleItemRequestRepository.VerifyAll(); + } + + [Fact] + public async Task CreateScheduleItemRequest_WhenRequestSent_ShouldReturnSuccess() + { + // Arrange + var scheduleItem = new ScheduleItem { Id = 1 }; + var studentId = 1; + var isRemote = true; + + SetupMockGetScheduleItemById(scheduleItem); + + var request = new CreateScheduleItemRequestRequest + { + StudentId = studentId, + ScheduleItemId = scheduleItem.Id, + IsRemote = isRemote + }; + + // Act + var response = await StudentService.CreateScheduleItemRequest(request); + + // Assert + Assert.True(response.Success); + } + + + + + + } +} diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceTestBase.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceTestBase.cs new file mode 100644 index 00000000..98408524 --- /dev/null +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceTestBase.cs @@ -0,0 +1,55 @@ +using AutoFixture; +using Moq; +using TutorLizard.BusinessLogic.Interfaces.Data.Repositories; +using TutorLizard.BusinessLogic.Models; +using TutorLizard.BusinessLogic.Services; + +namespace TutorLizard.BusinessLogic.Tests.Services.Student +{ + public class StudentServiceTestBase : TestsWithInMemoryDbBase + { + protected StudentService StudentService; + protected Fixture Fixture = new(); + protected Mock> MockAdRepository = new(); + protected Mock> MockAdRequestRepository = new(); + protected Mock> MockScheduleItemRepository = new(); + protected Mock> MockScheduleItemRequestRepository = new(); + + + protected StudentServiceTestBase() : base() + { + StudentService = new StudentService(MockAdRepository.Object, + MockAdRequestRepository.Object, + MockScheduleItemRepository.Object, + MockScheduleItemRequestRepository.Object); + } + + protected void SetupMockGetScheduleItemById(ScheduleItem? scheduleItem) + { + MockScheduleItemRepository + .Setup(x => x.GetById(It.IsAny())) + .Returns(Task.FromResult(scheduleItem)); + } + + protected void SetupMockGetAllScheduleItems(List scheduleItems) + { + var scheduleItemsInDb = AddEntitiesToInMemoryDb(scheduleItems); + MockScheduleItemRepository + .Setup(x => x.GetAll()) + .Returns(scheduleItemsInDb); + } + + protected IQueryable AddEntitiesToInMemoryDb(List entities) + where TEntity : class + { + DbContext + .Set() + .AddRange(entities); + DbContext.SaveChanges(); + + return DbContext + .Set() + .AsQueryable(); + } + } +} diff --git a/Tests/TutorLizard.Web.Tests/Controllers/Browse/BrowseControllerAdDetailsTests.cs b/Tests/TutorLizard.Web.Tests/Controllers/Browse/BrowseControllerAdDetailsTests.cs index 51f566e4..c1404fa0 100644 --- a/Tests/TutorLizard.Web.Tests/Controllers/Browse/BrowseControllerAdDetailsTests.cs +++ b/Tests/TutorLizard.Web.Tests/Controllers/Browse/BrowseControllerAdDetailsTests.cs @@ -1,8 +1,8 @@ using AutoFixture; using Microsoft.AspNetCore.Mvc; using Moq; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; namespace TutorLizard.Web.Tests.Controllers.Browse; public class BrowseControllerAdDetailsTests : BrowseControllerTestsBase diff --git a/Tests/TutorLizard.Web.Tests/Controllers/Browse/BrowseControllerAdsTests.cs b/Tests/TutorLizard.Web.Tests/Controllers/Browse/BrowseControllerAdsTests.cs index 9855d1a6..9ec3411f 100644 --- a/Tests/TutorLizard.Web.Tests/Controllers/Browse/BrowseControllerAdsTests.cs +++ b/Tests/TutorLizard.Web.Tests/Controllers/Browse/BrowseControllerAdsTests.cs @@ -1,9 +1,9 @@ using AutoFixture; using Microsoft.AspNetCore.Mvc; using Moq; -using TutorLizard.BusinessLogic.Models.DTOs; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; namespace TutorLizard.Web.Tests.Controllers.Browse; public class BrowseControllerAdsTests : BrowseControllerTestsBase diff --git a/Tests/TutorLizard.Web.Tests/Controllers/Browse/BrowseControllerScheduleTests.cs b/Tests/TutorLizard.Web.Tests/Controllers/Browse/BrowseControllerScheduleTests.cs index 723b7814..a3c4b3c8 100644 --- a/Tests/TutorLizard.Web.Tests/Controllers/Browse/BrowseControllerScheduleTests.cs +++ b/Tests/TutorLizard.Web.Tests/Controllers/Browse/BrowseControllerScheduleTests.cs @@ -1,8 +1,8 @@ using AutoFixture; using Microsoft.AspNetCore.Mvc; using Moq; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; namespace TutorLizard.Web.Tests.Controllers.Browse; public class BrowseControllerScheduleTests : BrowseControllerTestsBase diff --git a/TutorLizard.Blazor/Components/_Imports.razor b/TutorLizard.Blazor/Components/_Imports.razor new file mode 100644 index 00000000..1db2b846 --- /dev/null +++ b/TutorLizard.Blazor/Components/_Imports.razor @@ -0,0 +1,10 @@ +@using System.Net.Http +@using System.Net.Http.Json +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using static Microsoft.AspNetCore.Components.Web.RenderMode +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.JSInterop +@using TutorLizard.Blazor +@using TutorLizard.Blazor.Components \ No newline at end of file diff --git a/TutorLizard.Blazor/Program.cs b/TutorLizard.Blazor/Program.cs new file mode 100644 index 00000000..519269f2 --- /dev/null +++ b/TutorLizard.Blazor/Program.cs @@ -0,0 +1,5 @@ +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; + +var builder = WebAssemblyHostBuilder.CreateDefault(args); + +await builder.Build().RunAsync(); diff --git a/TutorLizard.Blazor/TutorLizard.Blazor.csproj b/TutorLizard.Blazor/TutorLizard.Blazor.csproj new file mode 100644 index 00000000..1fd99884 --- /dev/null +++ b/TutorLizard.Blazor/TutorLizard.Blazor.csproj @@ -0,0 +1,19 @@ + + + + net8.0 + enable + enable + true + Default + + + + + + + + + + + diff --git a/TutorLizard.BusinessLogic/Data/JaszczurContext.cs b/TutorLizard.BusinessLogic/Data/JaszczurContext.cs index b8de0174..284b26c9 100644 --- a/TutorLizard.BusinessLogic/Data/JaszczurContext.cs +++ b/TutorLizard.BusinessLogic/Data/JaszczurContext.cs @@ -20,6 +20,11 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .Property(user => user.Id) .ValueGeneratedOnAdd(); + modelBuilder.Entity() + .Property(user => user.IsActive) + .HasDefaultValue(false) + .IsRequired(); + modelBuilder.Entity() .Property(user => user.UserType) .HasConversion(); diff --git a/TutorLizard.BusinessLogic/Data/Repositories/Json/UserJsonRepository.cs b/TutorLizard.BusinessLogic/Data/Repositories/Json/UserJsonRepository.cs index f46d22b2..128d95ee 100644 --- a/TutorLizard.BusinessLogic/Data/Repositories/Json/UserJsonRepository.cs +++ b/TutorLizard.BusinessLogic/Data/Repositories/Json/UserJsonRepository.cs @@ -1,5 +1,5 @@ using Microsoft.Extensions.Options; -using TutorLizard.BusinessLogic.Enums; +using TutorLizard.Shared.Enums; using TutorLizard.BusinessLogic.Interfaces.Data.Repositories; using TutorLizard.BusinessLogic.Models; using TutorLizard.BusinessLogic.Options; @@ -15,9 +15,9 @@ public UserJsonRepository(IOptions options) : base(options.Va } - public User CreateUser(string name, UserType type, string email, string passwordHash) + public User CreateUser(string name, UserType type, string email, string passwordHash, string googleid) { - User newUser = new(GetNewId(), name, type, email, passwordHash); + User newUser = new(GetNewId(), name, type, email, passwordHash, googleid); Data.Add(newUser); SaveToJson(); diff --git a/TutorLizard.BusinessLogic/Enums/UserType.cs b/TutorLizard.BusinessLogic/Enums/UserType.cs deleted file mode 100644 index 5add649c..00000000 --- a/TutorLizard.BusinessLogic/Enums/UserType.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace TutorLizard.BusinessLogic.Enums; - -public enum UserType { Regular, Admin } diff --git a/TutorLizard.BusinessLogic/Extensions/DtoExtensions.cs b/TutorLizard.BusinessLogic/Extensions/DtoExtensions.cs index 1882bc47..513ca581 100644 --- a/TutorLizard.BusinessLogic/Extensions/DtoExtensions.cs +++ b/TutorLizard.BusinessLogic/Extensions/DtoExtensions.cs @@ -1,30 +1,19 @@ using TutorLizard.BusinessLogic.Models; -using TutorLizard.BusinessLogic.Models.DTOs; +using TutorLizard.Shared.Models.DTOs; namespace TutorLizard.BusinessLogic.Extensions; public static class DtoExtensions { - private static readonly ScheduleItemDto.ScheduleItemRequestStatus status; + public static CategoryDto ToDto(this Category category) + => new CategoryDto(category.Id, + category.Name, + category.Description); - public static AdDto ToDto(this Ad ad) => new AdDto(ad); - public static AdRequestDto ToDto(this AdRequest adRequest) => new AdRequestDto(adRequest); - public static CategoryDto ToDto(this Category category) => new CategoryDto(category); - public static ScheduleItemDto ToDto(this ScheduleItem scheduleItem) => new ScheduleItemDto(scheduleItem, status); - public static ScheduleItemRequestDto ToDto(this ScheduleItemRequest scheduleItemRequest) => new ScheduleItemRequestDto(scheduleItemRequest); - public static UserDto ToDto(this User user) => new UserDto(user); - - public static AdListItemDto ToAdListItemDto(this Ad ad) - { - return new AdListItemDto(id: ad.Id, - tutorId: ad.TutorId, - tutorName: ad.User.Name, - subject: ad.Subject, - title: ad.Title, - description: ad.Description, - categoryId: ad.CategoryId, - categoryName: ad.Category.Name, - price: ad.Price, - location: ad.Location, - isRemote: ad.IsRemote); - } + public static UserDto ToDto(this User user) + => new UserDto(user.Id, + user.Name, + user.UserType, + user.Email, + user.DateCreated, + user.GoogleId); } diff --git a/TutorLizard.BusinessLogic/Interfaces/Data/Repositories/IUserRepository.cs b/TutorLizard.BusinessLogic/Interfaces/Data/Repositories/IUserRepository.cs index 55018a8f..f5062402 100644 --- a/TutorLizard.BusinessLogic/Interfaces/Data/Repositories/IUserRepository.cs +++ b/TutorLizard.BusinessLogic/Interfaces/Data/Repositories/IUserRepository.cs @@ -1,11 +1,10 @@ -using TutorLizard.BusinessLogic.Enums; +using TutorLizard.Shared.Enums; using TutorLizard.BusinessLogic.Models; -using TutorLizard.BusinessLogic.Models.DTOs; namespace TutorLizard.BusinessLogic.Interfaces.Data.Repositories; public interface IUserRepository { - User CreateUser(string name, UserType type, string email, string passwordHash); + User CreateUser(string name, UserType type, string email, string passwordHash, string googleId); void DeleteUserById(int id); List GetAllUsers(); User? GetUserById(int id); diff --git a/TutorLizard.BusinessLogic/Interfaces/Services/IBrowseService.cs b/TutorLizard.BusinessLogic/Interfaces/Services/IBrowseService.cs index c212783f..bee02453 100644 --- a/TutorLizard.BusinessLogic/Interfaces/Services/IBrowseService.cs +++ b/TutorLizard.BusinessLogic/Interfaces/Services/IBrowseService.cs @@ -1,5 +1,5 @@ -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; namespace TutorLizard.BusinessLogic.Interfaces.Services; diff --git a/TutorLizard.BusinessLogic/Interfaces/Services/ICategoryService.cs b/TutorLizard.BusinessLogic/Interfaces/Services/ICategoryService.cs index 547bee7e..547b1640 100644 --- a/TutorLizard.BusinessLogic/Interfaces/Services/ICategoryService.cs +++ b/TutorLizard.BusinessLogic/Interfaces/Services/ICategoryService.cs @@ -1,5 +1,5 @@ -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; namespace TutorLizard.BusinessLogic.Interfaces.Services; public interface ICategoryService diff --git a/TutorLizard.BusinessLogic/Interfaces/Services/IStudentService.cs b/TutorLizard.BusinessLogic/Interfaces/Services/IStudentService.cs index 37695307..48f03c4f 100644 --- a/TutorLizard.BusinessLogic/Interfaces/Services/IStudentService.cs +++ b/TutorLizard.BusinessLogic/Interfaces/Services/IStudentService.cs @@ -1,16 +1,15 @@ -using TutorLizard.BusinessLogic.Models; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; namespace TutorLizard.BusinessLogic.Interfaces.Services; public interface IStudentService { - Task ViewAcceptedAds(StudentsAcceptedAdsRequest request); - Task ViewAdRequests(StudentsAdRequestsRequest request); - Task ViewAdRequestStatus(AdRequestStatusRequest request); - Task DeleteAdRequest(StudentCancelAdRequestRequest request); + Task GetStudentsAcceptedAds(GetStudentsAcceptedAdsRequest request); + Task GetStudentsAdRequests(GetStudentsAdRequestsRequest request); + Task GetAdRequestStatus(GetAdRequestStatusRequest request); + Task DeleteAdRequest(DeleteAdRequestRequest request); Task CreateScheduleItemRequest(CreateScheduleItemRequestRequest request); - Task GetAvailableScheduleForAd(AvailableScheduleForAdRequest request); + Task GetAvailableScheduleForAd(GetAvailableScheduleForAdRequest request); Task CreateAdRequest(CreateAdRequestRequest request); } \ No newline at end of file diff --git a/TutorLizard.BusinessLogic/Interfaces/Services/ITutorService.cs b/TutorLizard.BusinessLogic/Interfaces/Services/ITutorService.cs index e4f8e9ff..9a983945 100644 --- a/TutorLizard.BusinessLogic/Interfaces/Services/ITutorService.cs +++ b/TutorLizard.BusinessLogic/Interfaces/Services/ITutorService.cs @@ -1,5 +1,5 @@ -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; namespace TutorLizard.BusinessLogic.Interfaces.Services; @@ -7,12 +7,12 @@ public interface ITutorService { Task AcceptScheduleItemRequest(AcceptScheduleItemRequestRequest request); Task CrateAd(CreateAdRequest request); - Task GetTutorsScheduleForAd(TutorsScheduleForAdRequest request); + Task GetTutorsScheduleForAd(GetTutorsScheduleForAdRequest request); Task CreateScheduleItem(CreateScheduleItemRequest request); Task IsUserTheAdOwner(IsUserTheAdOwnerRequest request); Task UnacceptScheduleItemRequest(UnacceptScheduleItemRequestRequest request); - Task UpdateAdRequest(UpdateTutorsPendingAdRequestRequest request); - Task ViewAllPendingAdRequests(TutorsPendingAdRequestsRequest request); - Task ViewAllAdRequests(TutorAllAdRequestsRequest request); - Task ViewTutorsAds(TutorsAdsRequest request); + Task UpdateAdRequest(UpdateAdRequestRequest request); + Task GetTutorsPendingAdRequests(GetTutorsPendingAdRequestsRequest request); + Task GetTutorsAllAdRequests(GetTutorsAllAdRequestsRequest request); + Task GetTutorsAds(GetTutorsAdsRequest request); } \ No newline at end of file diff --git a/TutorLizard.BusinessLogic/Interfaces/Services/IUserService.cs b/TutorLizard.BusinessLogic/Interfaces/Services/IUserService.cs index 9c1bfa0f..970fde6f 100644 --- a/TutorLizard.BusinessLogic/Interfaces/Services/IUserService.cs +++ b/TutorLizard.BusinessLogic/Interfaces/Services/IUserService.cs @@ -1,10 +1,14 @@ -using TutorLizard.BusinessLogic.Enums; -using TutorLizard.BusinessLogic.Models.DTOs; +using TutorLizard.Shared.Enums; +using TutorLizard.Shared.Models.DTOs; namespace TutorLizard.BusinessLogic.Interfaces.Services; public interface IUserService { - public Task LogIn(string username, string password); - public Task RegisterUser(string userName, UserType type, string email, string password); + public Task LogIn(string username, string password); + public Task RegisterUser(string userName, UserType type, string email, string password, string activationCode); + Task ActivateUserAsync(string activationCode); + public Task RegisterUserWithGoogle(string username, string email, string googleId); + public Task IsTheGoogleUserRegistered(string googleId); + public Task LogInWithGoogle(string username, string googleId); } diff --git a/TutorLizard.BusinessLogic/Models/DTOs/AdDto.cs b/TutorLizard.BusinessLogic/Models/DTOs/AdDto.cs deleted file mode 100644 index d04bb157..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/AdDto.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace TutorLizard.BusinessLogic.Models.DTOs; -public class AdDto -{ - public int Id { get; set; } - public int TutorId { get; set; } - - [Required(ErrorMessage = "Please provide subject!")] - [StringLength(25)] - public string Subject { get; set; } - - [Required(ErrorMessage = "Please provide title!")] - [StringLength(25)] - public string Title { get; set; } - - [Required(ErrorMessage = "Please provide description!")] - [StringLength(250)] - public string Description { get; set; } - - [Display(Name = "Category")] - [Required(ErrorMessage = "Please provide category!")] - public int CategoryId { get; set; } - - [Required(ErrorMessage = "Please provide price!")] - [Range(0, double.MaxValue, ErrorMessage = "The price must be greater than 0!")] - public decimal Price { get; set; } - - [Required(ErrorMessage = "Please provide location!")] - [StringLength(25)] - public string Location { get; set; } - public bool IsRemote { get; set; } - - public AdDto(Ad ad) - { - Id = ad.Id; - TutorId = ad.TutorId; - Subject = ad.Subject; - Title = ad.Title; - Description = ad.Description; - CategoryId = ad.CategoryId; - Price = ad.Price; - Location = ad.Location; - IsRemote = ad.IsRemote; - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/AdRequestDto.cs b/TutorLizard.BusinessLogic/Models/DTOs/AdRequestDto.cs deleted file mode 100644 index b9b044aa..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/AdRequestDto.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace TutorLizard.BusinessLogic.Models.DTOs; -public class AdRequestDto -{ - public int Id { get; set; } - - [Required(ErrorMessage = "Please provide Ad Id!")] - [Range(0, int.MaxValue, ErrorMessage = "Ad Id must be greater than 0!")] - public int AdId { get; set; } - - [Required(ErrorMessage = "Please provide your id!")] - [Range(0, int.MaxValue, ErrorMessage = "Id must be greater than 0!")] - public int StudentId { get; set; } - public bool IsAccepted { get; set; } - - [Required(ErrorMessage = "Please write a message!")] - [MaxLength(150)] - public string Message { get; set; } - public string? ReplyMessage { get; set; } - public DateTime? ReviewDate { get; set; } - public bool IsRemote { get; set; } - - public AdRequestDto(AdRequest adRequest) - { - Id = adRequest.Id; - AdId = adRequest.AdId; - StudentId = adRequest.StudentId; - IsAccepted = adRequest.IsAccepted; - Message = adRequest.Message; - ReplyMessage = adRequest.ReplyMessage; - ReviewDate = adRequest.ReviewDate; - IsRemote = adRequest.IsRemote; - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/CategoryDto.cs b/TutorLizard.BusinessLogic/Models/DTOs/CategoryDto.cs deleted file mode 100644 index 7ccd43b5..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/CategoryDto.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace TutorLizard.BusinessLogic.Models.DTOs; -public class CategoryDto -{ - public int Id { get; set; } - - [Required] - [MinLength(1)] - [MaxLength(20)] - public string Name { get; set; } - public string? Description { get; set; } - - public CategoryDto(Category category) - { - Id = category.Id; - Name = category.Name; - Description = category.Description; - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/AdRequestStatusRequest.cs b/TutorLizard.BusinessLogic/Models/DTOs/Requests/AdRequestStatusRequest.cs deleted file mode 100644 index af77fb36..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/AdRequestStatusRequest.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests; -public class AdRequestStatusRequest -{ - public int AdId { get; set; } - public int StudentId { get; set; } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/AvailableScheduleForAdRequest.cs b/TutorLizard.BusinessLogic/Models/DTOs/Requests/AvailableScheduleForAdRequest.cs deleted file mode 100644 index 64524e79..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/AvailableScheduleForAdRequest.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests -{ - public class AvailableScheduleForAdRequest - { - public int AdId { get; set; } - public int StudentId { get; set; } - public AvailableScheduleForAdRequest(int adId, int studentId) - { - AdId = adId; - StudentId = studentId; - } - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateScheduleItemRequest.cs b/TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateScheduleItemRequest.cs deleted file mode 100644 index 8147625b..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateScheduleItemRequest.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests -{ - public class CreateScheduleItemRequest - { - public CreateScheduleItemRequest() - { - } - - public CreateScheduleItemRequest(int adId, - int userId, - DateTime dateTime) - { - AdId = adId; - UserId = userId; - DateTime = dateTime; - } - - public int AdId { get; set; } - public int UserId { get; set; } - - [DisplayName("Data")] - [Required(ErrorMessage = "To pole jest wymagane")] - public DateTime DateTime { get; set; } - - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateScheduleItemRequestRequest.cs b/TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateScheduleItemRequestRequest.cs deleted file mode 100644 index 39784bc7..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateScheduleItemRequestRequest.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests -{ - public class CreateScheduleItemRequestRequest - { - public int StudentId { get; set; } - public int ScheduleItemId { get; set; } - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/GetCategoriesRequest.cs b/TutorLizard.BusinessLogic/Models/DTOs/Requests/GetCategoriesRequest.cs deleted file mode 100644 index 8a17f5f8..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/GetCategoriesRequest.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests; - -public class GetCategoriesRequest -{ -} \ No newline at end of file diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/StudentCancelAdRequestRequest.cs b/TutorLizard.BusinessLogic/Models/DTOs/Requests/StudentCancelAdRequestRequest.cs deleted file mode 100644 index d0bb07fb..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/StudentCancelAdRequestRequest.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests; - -public class StudentCancelAdRequestRequest(int adRequestId) -{ - public int Id { get; set; } = adRequestId; -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/StudentsAcceptedAdsRequest.cs b/TutorLizard.BusinessLogic/Models/DTOs/Requests/StudentsAcceptedAdsRequest.cs deleted file mode 100644 index de8a57ba..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/StudentsAcceptedAdsRequest.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests -{ - public class StudentsAcceptedAdsRequest - { - public int StudentId { get; set; } - public StudentsAcceptedAdsRequest(int? studentId) - { - StudentId = (int)studentId; - } - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/StudentsAdRequestsRequest.cs b/TutorLizard.BusinessLogic/Models/DTOs/Requests/StudentsAdRequestsRequest.cs deleted file mode 100644 index f4e22acc..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/StudentsAdRequestsRequest.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests -{ - public class StudentsAdRequestsRequest - { - public int StudentId { get; set; } - public StudentsAdRequestsRequest(int? studentId) - { - StudentId = (int)studentId; - } - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/TutorAllAdRequestsRequest.cs b/TutorLizard.BusinessLogic/Models/DTOs/Requests/TutorAllAdRequestsRequest.cs deleted file mode 100644 index 52949bca..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/TutorAllAdRequestsRequest.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests; - -public class TutorAllAdRequestsRequest -{ - public int TutorId { get; set; } - public TutorAllAdRequestsRequest(int? tutorId) - { - TutorId = (int)tutorId; - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/TutorsAdsRequest.cs b/TutorLizard.BusinessLogic/Models/DTOs/Requests/TutorsAdsRequest.cs deleted file mode 100644 index 0dfe5653..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/TutorsAdsRequest.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; - -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests -{ - public class TutorsAdsRequest - { - public int TutorId { get; set; } - - public TutorsAdsRequest(int? tutorId) - { - TutorId = (int)tutorId; - } - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/TutorsPendingAdRequestsRequest.cs b/TutorLizard.BusinessLogic/Models/DTOs/Requests/TutorsPendingAdRequestsRequest.cs deleted file mode 100644 index 31b5c9b9..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/TutorsPendingAdRequestsRequest.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests; - -public class TutorsPendingAdRequestsRequest -{ - public int TutorId { get; set; } - public TutorsPendingAdRequestsRequest(int? tutorId) - { - TutorId = (int)tutorId; - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/TutorsScheduleForAdRequest.cs b/TutorLizard.BusinessLogic/Models/DTOs/Requests/TutorsScheduleForAdRequest.cs deleted file mode 100644 index fb1d83b1..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/TutorsScheduleForAdRequest.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests; -public class TutorsScheduleForAdRequest -{ - public int AdId { get; set; } - public int TutorId { get; set; } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/AvailableScheduleForAdResponse.cs b/TutorLizard.BusinessLogic/Models/DTOs/Responses/AvailableScheduleForAdResponse.cs deleted file mode 100644 index dc3ae1e9..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/AvailableScheduleForAdResponse.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses -{ - public class AvailableScheduleForAdResponse - { - public List Items { get; set; } = new(); - public bool IsAccepted { get; set; } = true; - public int AdId { get; set; } - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateScheduleItemRequestResponse.cs b/TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateScheduleItemRequestResponse.cs deleted file mode 100644 index c66eeda4..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateScheduleItemRequestResponse.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses -{ - public class CreateScheduleItemRequestResponse - { - public bool Success { get; set; } - public int CreatedScheduleItemRequestId { get; set; } - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateScheduleItemResponse.cs b/TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateScheduleItemResponse.cs deleted file mode 100644 index 20ca9f52..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateScheduleItemResponse.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses -{ - public class CreateScheduleItemResponse - { - public bool Success { get; set; } - public int CreatedItemId { get; set; } - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/StudentCancelAdRequestResponse.cs b/TutorLizard.BusinessLogic/Models/DTOs/Responses/StudentCancelAdRequestResponse.cs deleted file mode 100644 index 5a937988..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/StudentCancelAdRequestResponse.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses; - -public class StudentCancelAdRequestResponse -{ - public bool IsSuccessful { get; set; } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/StudentsAcceptedAdsResponse.cs b/TutorLizard.BusinessLogic/Models/DTOs/Responses/StudentsAcceptedAdsResponse.cs deleted file mode 100644 index a73b2337..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/StudentsAcceptedAdsResponse.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses -{ - public class StudentsAcceptedAdsResponse - { - public List Ads { get; set; } = new(); - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/StudentsAdRequestsResponse.cs b/TutorLizard.BusinessLogic/Models/DTOs/Responses/StudentsAdRequestsResponse.cs deleted file mode 100644 index 7f80d6aa..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/StudentsAdRequestsResponse.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses -{ - public class StudentsAdRequestsResponse - { - public List AdRequests { get; set; } = new(); - } - -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/TutorAllAdRequestsResponse.cs b/TutorLizard.BusinessLogic/Models/DTOs/Responses/TutorAllAdRequestsResponse.cs deleted file mode 100644 index d0f4491b..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/TutorAllAdRequestsResponse.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses; - -public class TutorAllAdRequestsResponse -{ - public List AdRequests { get; set; } = new(); -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/TutorsAdsResponse.cs b/TutorLizard.BusinessLogic/Models/DTOs/Responses/TutorsAdsResponse.cs deleted file mode 100644 index 51c0a5e5..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/TutorsAdsResponse.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses -{ - public class TutorsAdsResponse - { - public List AdList { get; set; } = new(); - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/TutorsPendingAdRequestsResponse.cs b/TutorLizard.BusinessLogic/Models/DTOs/Responses/TutorsPendingAdRequestsResponse.cs deleted file mode 100644 index e5ba4698..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/TutorsPendingAdRequestsResponse.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses; - -public class TutorsPendingAdRequestsResponse -{ - public List AdRequests { get; set; } = new(); -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/UpdateTutorsPendingAdRequestResponse.cs b/TutorLizard.BusinessLogic/Models/DTOs/Responses/UpdateTutorsPendingAdRequestResponse.cs deleted file mode 100644 index b7e82981..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/UpdateTutorsPendingAdRequestResponse.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses; - -public class UpdateTutorsPendingAdRequestResponse() -{ - public bool IsSuccessful { get; set; } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/ScheduleItemDto.cs b/TutorLizard.BusinessLogic/Models/DTOs/ScheduleItemDto.cs deleted file mode 100644 index 8b3f0b0f..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/ScheduleItemDto.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs; -public class ScheduleItemDto -{ - public int Id { get; set; } - public int AdId { get; set; } - public DateTime DateTime { get; set; } - public ScheduleItemRequestStatus Status { get; set; } - - public ScheduleItemDto(ScheduleItem scheduleItem, ScheduleItemRequestStatus status) - { - Id = scheduleItem.Id; - AdId = scheduleItem.AdId; - DateTime = scheduleItem.DateTime; - Status = status; - } - - public ScheduleItemDto() - { - - } - - public enum ScheduleItemRequestStatus - { - Accepted, - Pending, - Rejected, - RequestNotSent - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/ScheduleItemRequestDto.cs b/TutorLizard.BusinessLogic/Models/DTOs/ScheduleItemRequestDto.cs deleted file mode 100644 index 4db732df..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/ScheduleItemRequestDto.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs; -public class ScheduleItemRequestDto -{ - public int Id { get; set; } - public int ScheduleItemId { get; set; } - public int StudentId { get; set; } - public bool IsAccepted { get; set; } - public bool IsRemote { get; set; } - - public ScheduleItemRequestDto(ScheduleItemRequest scheduleItemRequest) - { - Id = scheduleItemRequest.Id; - ScheduleItemId = scheduleItemRequest.ScheduleItemId; - StudentId = scheduleItemRequest.StudentId; - IsAccepted = scheduleItemRequest.IsAccepted; - IsRemote = scheduleItemRequest.IsRemote; - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/StudentScheduleItemRequestDto.cs b/TutorLizard.BusinessLogic/Models/DTOs/StudentScheduleItemRequestDto.cs deleted file mode 100644 index 9cf23588..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/StudentScheduleItemRequestDto.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TutorLizard.BusinessLogic.Models.DTOs -{ - public class StudentScheduleItemRequestDto - { - public int Id { get; set; } - public bool IsAccepted { get; set; } - public DateTime DateCreated { get; set; } - } -} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/UserDto.cs b/TutorLizard.BusinessLogic/Models/DTOs/UserDto.cs deleted file mode 100644 index 3002b166..00000000 --- a/TutorLizard.BusinessLogic/Models/DTOs/UserDto.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using TutorLizard.BusinessLogic.Enums; - -namespace TutorLizard.BusinessLogic.Models.DTOs; -public class UserDto -{ - public int Id { get; set; } - - [Required(ErrorMessage = "Podaj nazwę użytkownika.")] - [Display(Name = "Nazwa użytkownika")] - [MinLength(5, ErrorMessage = "Minimalna długość: 5 znaków")] - [MaxLength(20, ErrorMessage = "Maksymalna długość: 20 znaków")] - public string Name { get; set; } - - [Display(Name = "Typ użytkownika")] - public UserType UserType { get; set; } - - [Required(ErrorMessage = "Podaj adres email.")] - [EmailAddress(ErrorMessage = "Podaj prawidłowy adres email.")] - [Display(Name = "Adres email")] - public string Email { get; set; } - - [Display(Name = "Data rejestracji")] - public DateTime DateCreated { get; set; } = DateTime.Now; - - public UserDto(User user) - { - Id = user.Id; - Name = user.Name; - UserType = user.UserType; - Email = user.Email; - DateCreated = user.DateCreated; - } -} diff --git a/TutorLizard.BusinessLogic/Models/User.cs b/TutorLizard.BusinessLogic/Models/User.cs index 59ac7641..f8848b2a 100644 --- a/TutorLizard.BusinessLogic/Models/User.cs +++ b/TutorLizard.BusinessLogic/Models/User.cs @@ -1,11 +1,12 @@ using System.ComponentModel.DataAnnotations; -using TutorLizard.BusinessLogic.Enums; +using TutorLizard.Shared.Enums; namespace TutorLizard.BusinessLogic.Models; -public class User +public class User { public int Id { get; set; } + public bool IsActive { get; set; } [Required] [MinLength(5)] @@ -19,21 +20,23 @@ public class User [MaxLength(100)] public string Email { get; set; } - [Required] [DataType(DataType.Password)] [MinLength(8)] [MaxLength(100)] - public string PasswordHash { get; set; } + public string? PasswordHash { get; set; } public DateTime DateCreated { get; set; } = DateTime.Now; - public User(int id, string name, UserType userType, string email, string passwordHash) + public string? GoogleId { get; set; } + + public User(int id, string name, UserType userType, string email, string passwordHash, string? googleId) { Id = id; Name = name; UserType = userType; Email = email; PasswordHash = passwordHash; + GoogleId = googleId; } public User() { @@ -43,4 +46,5 @@ public User() public ICollection Ads { get; set; } = new List(); public ICollection AdRequests { get; set; } = new List(); public ICollection ScheduleItemRequests { get; set; } = new List(); + public string? ActivationCode { get; set; } } diff --git a/TutorLizard.BusinessLogic/Services/BrowseService.cs b/TutorLizard.BusinessLogic/Services/BrowseService.cs index 6bdb7855..3c1f4a60 100644 --- a/TutorLizard.BusinessLogic/Services/BrowseService.cs +++ b/TutorLizard.BusinessLogic/Services/BrowseService.cs @@ -1,11 +1,11 @@ using Microsoft.EntityFrameworkCore; -using TutorLizard.BusinessLogic.Enums; +using TutorLizard.Shared.Enums; using TutorLizard.BusinessLogic.Interfaces.Data.Repositories; using TutorLizard.BusinessLogic.Interfaces.Services; using TutorLizard.BusinessLogic.Models; -using TutorLizard.BusinessLogic.Models.DTOs; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; namespace TutorLizard.BusinessLogic.Services; public class BrowseService : IBrowseService diff --git a/TutorLizard.BusinessLogic/Services/CategoryService.cs b/TutorLizard.BusinessLogic/Services/CategoryService.cs index 5f807e62..ae7a7ef2 100644 --- a/TutorLizard.BusinessLogic/Services/CategoryService.cs +++ b/TutorLizard.BusinessLogic/Services/CategoryService.cs @@ -3,9 +3,9 @@ using TutorLizard.BusinessLogic.Interfaces.Data.Repositories; using TutorLizard.BusinessLogic.Interfaces.Services; using TutorLizard.BusinessLogic.Models; -using TutorLizard.BusinessLogic.Models.DTOs; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; namespace TutorLizard.BusinessLogic.Services; public class CategoryService : ICategoryService diff --git a/TutorLizard.BusinessLogic/Services/StudentService.cs b/TutorLizard.BusinessLogic/Services/StudentService.cs index 21ed1c49..9dc04452 100644 --- a/TutorLizard.BusinessLogic/Services/StudentService.cs +++ b/TutorLizard.BusinessLogic/Services/StudentService.cs @@ -1,11 +1,10 @@ using Microsoft.EntityFrameworkCore; -using System.Runtime.InteropServices; using TutorLizard.BusinessLogic.Interfaces.Data.Repositories; using TutorLizard.BusinessLogic.Interfaces.Services; using TutorLizard.BusinessLogic.Models; -using TutorLizard.BusinessLogic.Models.DTOs; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; namespace TutorLizard.BusinessLogic.Services; public class StudentService : IStudentService @@ -25,6 +24,7 @@ public StudentService(IDbRepository adRepository, _scheduleItemRequestRepository = scheduleItemRequestRepository; } + #region Schedule public async Task CreateScheduleItemRequest(CreateScheduleItemRequestRequest request) { int studentId = request.StudentId; @@ -48,19 +48,58 @@ public async Task CreateScheduleItemRequest(C ScheduleItemId = scheduleItemId, DateCreated = DateTime.UtcNow, StudentId = studentId, - IsAccepted = false + IsAccepted = false, + IsRemote = request.IsRemote }; await _scheduleItemRequestRepository.Create(scheduleItemRequest); - return new CreateScheduleItemRequestResponse - { + + return new CreateScheduleItemRequestResponse + { Success = true, - CreatedScheduleItemRequestId = scheduleItemRequest.Id, + CreatedScheduleItemRequestId = scheduleItemRequest.Id }; } - public async Task ViewAcceptedAds(StudentsAcceptedAdsRequest request) + public async Task GetAvailableScheduleForAd(GetAvailableScheduleForAdRequest request) + { + List items = await _scheduleItemRepository.GetAll() + .Where(si => si.Ad.AdRequests.Any(ar => ar.StudentId == request.StudentId && ar.IsAccepted)) + .Select(si => new ScheduleItemDto() + { + AdId = si.AdId, + DateTime = si.DateTime, + Id = si.Id, + Status = si.ScheduleItemRequests.Any(sir => sir.StudentId == request.StudentId && sir.IsAccepted) ? ScheduleItemDto.ScheduleItemRequestStatus.Accepted + : si.ScheduleItemRequests.Any(sir => sir.StudentId == request.StudentId) ? ScheduleItemDto.ScheduleItemRequestStatus.Pending + : ScheduleItemDto.ScheduleItemRequestStatus.RequestNotSent + }) + .ToListAsync(); + + bool isAccepted = await _adRequestRepository.GetAll() + .Where(ar => ar.AdId == request.AdId) + .AnyAsync(ar => ar.StudentId == request.StudentId && ar.IsAccepted); + + bool isRemote = await _adRepository.GetAll() + .Where(ad => ad.Id == request.AdId) + .Select(ad => ad.IsRemote) + .FirstOrDefaultAsync(); + + GetAvailableScheduleForAdResponse response = new() + { + AdId = request.AdId, + IsAccepted = isAccepted, + IsRemote = isRemote, + Items = items + }; + + return response; + } + + #endregion + #region Ads + public async Task GetStudentsAcceptedAds(GetStudentsAcceptedAdsRequest request) { var studentId = request.StudentId; @@ -92,13 +131,13 @@ public async Task ViewAcceptedAds(StudentsAcceptedA }) .ToList(); - return new StudentsAcceptedAdsResponse + return new GetStudentsAcceptedAdsResponse { Ads = adListDtos, }; } - public async Task ViewAdRequests(StudentsAdRequestsRequest request) + public async Task GetStudentsAdRequests(GetStudentsAdRequestsRequest request) { var studentId = request.StudentId; @@ -125,13 +164,13 @@ public async Task ViewAdRequests(StudentsAdRequestsR }) .ToList(); - return new StudentsAdRequestsResponse + return new GetStudentsAdRequestsResponse { AdRequests = adRequestsListDtos }; } - public async Task ViewAdRequestStatus(AdRequestStatusRequest request) + public async Task GetAdRequestStatus(GetAdRequestStatusRequest request) { var adRequestDetails = await _adRequestRepository.GetAll() .Include(adrequest => adrequest.Ad) @@ -142,9 +181,9 @@ public async Task ViewAdRequestStatus(AdRequestStatusRe .FirstOrDefaultAsync(); if (adRequestDetails is null) - return new AdRequestStatusResponse() { IsSuccessful = false }; + return new GetAdRequestStatusResponse() { IsSuccessful = false }; - AdRequestStatusResponse response = new AdRequestStatusResponse() + GetAdRequestStatusResponse response = new GetAdRequestStatusResponse() { Id = adRequestDetails.Id, AdId = adRequestDetails.AdId, @@ -152,18 +191,18 @@ public async Task ViewAdRequestStatus(AdRequestStatusRe ReplyMessage = adRequestDetails.ReplyMessage, DateCreated = adRequestDetails.DateCreated, ReviewDate = adRequestDetails.ReviewDate, - Status = adRequestDetails.ReviewDate == null ? AdRequestStatusResponse.RequestStatus.Pending : AdRequestStatusResponse.RequestStatus.Rejected, + Status = adRequestDetails.ReviewDate == null ? GetAdRequestStatusResponse.RequestStatus.Pending : GetAdRequestStatusResponse.RequestStatus.Rejected, IsSuccessful = true }; return response; } - public async Task DeleteAdRequest(StudentCancelAdRequestRequest request) + public async Task DeleteAdRequest(DeleteAdRequestRequest request) { var deletedAdRequest = await _adRequestRepository.Delete(request.Id); - StudentCancelAdRequestResponse response = new StudentCancelAdRequestResponse(); + DeleteAdRequestResponse response = new DeleteAdRequestResponse(); if (deletedAdRequest == null) response.IsSuccessful = true; else @@ -232,33 +271,5 @@ public async Task CreateAdRequest(CreateAdRequestReques Success = true }; } - - public async Task GetAvailableScheduleForAd(AvailableScheduleForAdRequest request) - { - List items = await _scheduleItemRepository.GetAll() - .Where(si => si.Ad.AdRequests.Any(ar => ar.StudentId == request.StudentId && ar.IsAccepted) && si.AdId == request.AdId) - .Select(si => new ScheduleItemDto() - { - AdId = si.AdId, - DateTime = si.DateTime, - Id = si.Id, - Status = si.ScheduleItemRequests.Any(sir => sir.StudentId == request.StudentId && sir.IsAccepted) ? ScheduleItemDto.ScheduleItemRequestStatus.Accepted - : si.ScheduleItemRequests.Any(sir => sir.StudentId == request.StudentId) ? ScheduleItemDto.ScheduleItemRequestStatus.Pending - : ScheduleItemDto.ScheduleItemRequestStatus.RequestNotSent - }) - .ToListAsync(); - - bool isAccepted = await _adRequestRepository.GetAll() - .Where(ar => ar.AdId == request.AdId) - .AnyAsync(ar => ar.StudentId == request.StudentId && ar.IsAccepted); - - AvailableScheduleForAdResponse response = new() - { - AdId = request.AdId, - IsAccepted = isAccepted, - Items = items - }; - - return response; - } } +#endregion \ No newline at end of file diff --git a/TutorLizard.BusinessLogic/Services/TutorService.cs b/TutorLizard.BusinessLogic/Services/TutorService.cs index e96b525a..f4f12934 100644 --- a/TutorLizard.BusinessLogic/Services/TutorService.cs +++ b/TutorLizard.BusinessLogic/Services/TutorService.cs @@ -2,9 +2,9 @@ using TutorLizard.BusinessLogic.Interfaces.Data.Repositories; using TutorLizard.BusinessLogic.Interfaces.Services; using TutorLizard.BusinessLogic.Models; -using TutorLizard.BusinessLogic.Models.DTOs; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; namespace TutorLizard.BusinessLogic.Services; public class TutorService : ITutorService @@ -79,7 +79,7 @@ public async Task CreateScheduleItem(CreateScheduleI }; } - public async Task GetTutorsScheduleForAd(TutorsScheduleForAdRequest request) + public async Task GetTutorsScheduleForAd(GetTutorsScheduleForAdRequest request) { List scheduleItems = await _scheduleItemRepository.GetAll() .Where(item => item.AdId == request.AdId) @@ -105,7 +105,7 @@ public async Task GetTutorsScheduleForAd(TutorsSche .ToListAsync(); - TutorsScheduleForAdResponse response = new() + GetTutorsScheduleForAdResponse response = new() { AdId = request.AdId, ScheduleItems = scheduleItems @@ -182,7 +182,7 @@ public async Task UnacceptScheduleItemReque }; } - public async Task ViewAllAdRequests(TutorAllAdRequestsRequest request) + public async Task GetTutorsAllAdRequests(GetTutorsAllAdRequestsRequest request) { List adRequestsList = await _adRequestRepository.GetAll() .Include(adrequest => adrequest.Ad) @@ -201,7 +201,7 @@ public async Task ViewAllAdRequests(TutorAllAdReques adrequest.ReviewDate)) .ToListAsync(); - TutorAllAdRequestsResponse response = new() + GetTutorsAllAdRequestsResponse response = new() { AdRequests = adRequestsList }; @@ -209,7 +209,7 @@ public async Task ViewAllAdRequests(TutorAllAdReques return response; } - public async Task ViewAllPendingAdRequests(TutorsPendingAdRequestsRequest request) + public async Task GetTutorsPendingAdRequests(GetTutorsPendingAdRequestsRequest request) { List adRequests = await _adRequestRepository.GetAll() .Where(adrequest => @@ -231,7 +231,7 @@ public async Task ViewAllPendingAdRequests(Tuto adrequest.ReviewDate)) .ToListAsync(); - TutorsPendingAdRequestsResponse response = new() + GetTutorsPendingAdRequestsResponse response = new() { AdRequests = adRequests }; @@ -239,7 +239,7 @@ public async Task ViewAllPendingAdRequests(Tuto return response; } - public async Task UpdateAdRequest(UpdateTutorsPendingAdRequestRequest request) + public async Task UpdateAdRequest(UpdateAdRequestRequest request) { var adRequest = await _adRequestRepository .Update(request.AdRequestId, entity => @@ -248,13 +248,13 @@ public async Task UpdateAdRequest(UpdateTu entity.ReplyMessage = request.ReplyMessage; }); - if (request.Action == UpdateTutorsPendingAdRequestRequest.UpdateAction.Accept) + if (request.Action == UpdateAdRequestRequest.UpdateAction.Accept) { adRequest = await _adRequestRepository .Update(request.AdRequestId, entity => entity.IsAccepted = true); } - UpdateTutorsPendingAdRequestResponse response = new(); + UpdateAdRequestResponse response = new(); if (adRequest is null) response.IsSuccessful = false; @@ -264,7 +264,7 @@ public async Task UpdateAdRequest(UpdateTu return response; } - public async Task ViewTutorsAds(TutorsAdsRequest request) + public async Task GetTutorsAds(GetTutorsAdsRequest request) { var tutorId = request.TutorId; @@ -291,7 +291,7 @@ public async Task ViewTutorsAds(TutorsAdsRequest request) }) .ToList(); - return new TutorsAdsResponse + return new GetTutorsAdsResponse { AdList = adListDtos }; diff --git a/TutorLizard.BusinessLogic/Services/UserService.cs b/TutorLizard.BusinessLogic/Services/UserService.cs index 4110ccb5..a8d3beb2 100644 --- a/TutorLizard.BusinessLogic/Services/UserService.cs +++ b/TutorLizard.BusinessLogic/Services/UserService.cs @@ -1,11 +1,11 @@ using Microsoft.AspNetCore.Identity; -using TutorLizard.BusinessLogic.Models.DTOs; +using TutorLizard.Shared.Models.DTOs; using TutorLizard.BusinessLogic.Models; using TutorLizard.BusinessLogic.Interfaces.Data.Repositories; using TutorLizard.BusinessLogic.Extensions; using TutorLizard.BusinessLogic.Interfaces.Services; using Microsoft.EntityFrameworkCore; -using TutorLizard.BusinessLogic.Enums; +using TutorLizard.Shared.Enums; namespace TutorLizard.BusinessLogic.Services; @@ -18,28 +18,63 @@ public UserService(IDbRepository userRepository) { _userRepository = userRepository; } - public async Task LogIn(string username, string password) + + public async Task LogIn(string username, string password) { var user = await _userRepository.GetAll() .FirstOrDefaultAsync(user => user.Name == username); if (user == null) { - return null; + return new LogInResult + { + ResultCode = LogInResultCode.UserNotFound + }; + } + + if (!user.IsActive) + { + return new LogInResult + { + ResultCode = LogInResultCode.InactiveAccount + }; } - var result = _passwordHasher - .VerifyHashedPassword(user, - user.PasswordHash, - password); + var result = _passwordHasher.VerifyHashedPassword(user, user.PasswordHash, password); if (result == PasswordVerificationResult.Success) + { + return new LogInResult + { + ResultCode = LogInResultCode.Success, + User = user.ToDto() + }; + } + + return new LogInResult + { + ResultCode = LogInResultCode.InvalidPassword + }; + } + + public async Task LogInWithGoogle(string username, string googleId) + { + var user = await _userRepository.GetAll() + .FirstOrDefaultAsync(user => user.GoogleId == googleId); + + if (user == null) + { + return null; + } + + if (user.GoogleId == googleId) return user.ToDto(); return null; } - public async Task RegisterUser(string userName, UserType type, string email, string password) + + public async Task RegisterUser(string userName, UserType type, string email, string password, string activationCode) { if (await _userRepository.GetAll().AnyAsync(user => user.Name == userName)) return false; @@ -49,7 +84,9 @@ public async Task RegisterUser(string userName, UserType type, string emai Name = userName, UserType = type, Email = email, - PasswordHash = password + PasswordHash = password, + ActivationCode = activationCode, + IsActive = false }; user.PasswordHash = _passwordHasher.HashPassword(user, password); @@ -58,4 +95,60 @@ public async Task RegisterUser(string userName, UserType type, string emai return true; } + + public async Task RegisterUserWithGoogle(string username, string email, string googleId) + { + if (await _userRepository.GetAll().AnyAsync(user => user.Name == username)) + return false; + + User user = new() + { + Name = username, + UserType = UserType.Regular, + Email = email, + GoogleId = googleId + }; + + await _userRepository.Create(user); + + return true; + } + + public async Task IsTheGoogleUserRegistered(string googleId) + { + if (await _userRepository.GetAll().AnyAsync(user => user.GoogleId == googleId)) + return true; + + return false; + } + + public async Task ActivateUserAsync(string activationCode) + { + + var user = await _userRepository.GetAll() + .FirstOrDefaultAsync(u => u.ActivationCode == activationCode && u.IsActive == false); + + if (user != null) + { + user.IsActive = true; + user.ActivationCode = "ACTIVATED"; + + await _userRepository.Update(user.Id, u => + { + u.IsActive = user.IsActive; + u.ActivationCode = user.ActivationCode; + }); + + return new ActivationResultDto + { + IsActivated = true, + ActivationCode = activationCode + }; + } + return new ActivationResultDto + { + IsActivated = false, + ActivationCode = activationCode + }; + } } \ No newline at end of file diff --git a/TutorLizard.BusinessLogic/TutorLizard.BusinessLogic.csproj b/TutorLizard.BusinessLogic/TutorLizard.BusinessLogic.csproj index 294a3d5d..9864666e 100644 --- a/TutorLizard.BusinessLogic/TutorLizard.BusinessLogic.csproj +++ b/TutorLizard.BusinessLogic/TutorLizard.BusinessLogic.csproj @@ -7,7 +7,7 @@ - + @@ -22,4 +22,8 @@ + + + + diff --git a/TutorLizard.BusinessLogic/Enums/AdToUserRelationship.cs b/TutorLizard.Shared/Enums/AdToUserRelationship.cs similarity index 68% rename from TutorLizard.BusinessLogic/Enums/AdToUserRelationship.cs rename to TutorLizard.Shared/Enums/AdToUserRelationship.cs index 2c85904e..3f3d54e8 100644 --- a/TutorLizard.BusinessLogic/Enums/AdToUserRelationship.cs +++ b/TutorLizard.Shared/Enums/AdToUserRelationship.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Enums; +namespace TutorLizard.Shared.Enums; public enum AdToUserRelationship { None, diff --git a/TutorLizard.Shared/Enums/LogInResultCode.cs b/TutorLizard.Shared/Enums/LogInResultCode.cs new file mode 100644 index 00000000..9cfa7036 --- /dev/null +++ b/TutorLizard.Shared/Enums/LogInResultCode.cs @@ -0,0 +1,10 @@ +namespace TutorLizard.Shared.Enums +{ + public enum LogInResultCode + { + Success, + UserNotFound, + InactiveAccount, + InvalidPassword + } +} diff --git a/TutorLizard.Shared/Enums/UserType.cs b/TutorLizard.Shared/Enums/UserType.cs new file mode 100644 index 00000000..bb83c55b --- /dev/null +++ b/TutorLizard.Shared/Enums/UserType.cs @@ -0,0 +1,3 @@ +namespace TutorLizard.Shared.Enums; + +public enum UserType { Regular, Admin } diff --git a/TutorLizard.Shared/Models/DTOs/ActivationResultDto.cs b/TutorLizard.Shared/Models/DTOs/ActivationResultDto.cs new file mode 100644 index 00000000..db3d3e89 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/ActivationResultDto.cs @@ -0,0 +1,8 @@ +namespace TutorLizard.Shared.Models.DTOs +{ + public class ActivationResultDto + { + public bool IsActivated { get; set; } + public string ActivationCode { get; set; } + } +} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/AdListItemDto.cs b/TutorLizard.Shared/Models/DTOs/AdListItemDto.cs similarity index 96% rename from TutorLizard.BusinessLogic/Models/DTOs/AdListItemDto.cs rename to TutorLizard.Shared/Models/DTOs/AdListItemDto.cs index e2ee5e67..4aba0aa1 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/AdListItemDto.cs +++ b/TutorLizard.Shared/Models/DTOs/AdListItemDto.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs; +namespace TutorLizard.Shared.Models.DTOs; public class AdListItemDto { public int Id { get; set; } diff --git a/TutorLizard.BusinessLogic/Models/DTOs/AdRequestsListDto.cs b/TutorLizard.Shared/Models/DTOs/AdRequestsListDto.cs similarity index 96% rename from TutorLizard.BusinessLogic/Models/DTOs/AdRequestsListDto.cs rename to TutorLizard.Shared/Models/DTOs/AdRequestsListDto.cs index 816e285c..e8be5b40 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/AdRequestsListDto.cs +++ b/TutorLizard.Shared/Models/DTOs/AdRequestsListDto.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs; +namespace TutorLizard.Shared.Models.DTOs; public class AdRequestsListDto { diff --git a/TutorLizard.BusinessLogic/Models/DTOs/AdSearchCriteriaDto.cs b/TutorLizard.Shared/Models/DTOs/AdSearchCriteriaDto.cs similarity index 92% rename from TutorLizard.BusinessLogic/Models/DTOs/AdSearchCriteriaDto.cs rename to TutorLizard.Shared/Models/DTOs/AdSearchCriteriaDto.cs index f710d128..fdece446 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/AdSearchCriteriaDto.cs +++ b/TutorLizard.Shared/Models/DTOs/AdSearchCriteriaDto.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace TutorLizard.BusinessLogic.Models.DTOs; +namespace TutorLizard.Shared.Models.DTOs; public class AdSearchCriteriaDto { public string? Text { get; set; } diff --git a/TutorLizard.Shared/Models/DTOs/CategoryDto.cs b/TutorLizard.Shared/Models/DTOs/CategoryDto.cs new file mode 100644 index 00000000..e6402083 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/CategoryDto.cs @@ -0,0 +1,14 @@ +namespace TutorLizard.Shared.Models.DTOs; +public class CategoryDto +{ + + public int Id { get; set; } + public string Name { get; set; } + public string? Description { get; set; } + public CategoryDto(int id, string name, string? description) + { + Id = id; + Name = name; + Description = description; + } +} diff --git a/TutorLizard.Shared/Models/DTOs/LogInResult.cs b/TutorLizard.Shared/Models/DTOs/LogInResult.cs new file mode 100644 index 00000000..4e6bf696 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/LogInResult.cs @@ -0,0 +1,10 @@ +using TutorLizard.Shared.Enums; + +namespace TutorLizard.Shared.Models.DTOs +{ + public class LogInResult + { + public LogInResultCode ResultCode { get; set; } + public UserDto? User { get; set; } + } +} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/AcceptScheduleItemRequestRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/AcceptScheduleItemRequestRequest.cs similarity index 69% rename from TutorLizard.BusinessLogic/Models/DTOs/Requests/AcceptScheduleItemRequestRequest.cs rename to TutorLizard.Shared/Models/DTOs/Requests/AcceptScheduleItemRequestRequest.cs index 87d96f68..a708ac2e 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/AcceptScheduleItemRequestRequest.cs +++ b/TutorLizard.Shared/Models/DTOs/Requests/AcceptScheduleItemRequestRequest.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests; +namespace TutorLizard.Shared.Models.DTOs.Requests; public class AcceptScheduleItemRequestRequest { public int TutorId { get; set; } diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateAdRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/CreateAdRequest.cs similarity index 97% rename from TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateAdRequest.cs rename to TutorLizard.Shared/Models/DTOs/Requests/CreateAdRequest.cs index a239395a..e94d0cb7 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateAdRequest.cs +++ b/TutorLizard.Shared/Models/DTOs/Requests/CreateAdRequest.cs @@ -1,7 +1,7 @@ using System.ComponentModel; using System.ComponentModel.DataAnnotations; -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests; +namespace TutorLizard.Shared.Models.DTOs.Requests; public class CreateAdRequest { public CreateAdRequest() diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateAdRequestRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/CreateAdRequestRequest.cs similarity index 89% rename from TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateAdRequestRequest.cs rename to TutorLizard.Shared/Models/DTOs/Requests/CreateAdRequestRequest.cs index fd200db1..56f46203 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateAdRequestRequest.cs +++ b/TutorLizard.Shared/Models/DTOs/Requests/CreateAdRequestRequest.cs @@ -1,7 +1,7 @@ using System.ComponentModel; using System.ComponentModel.DataAnnotations; -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests; +namespace TutorLizard.Shared.Models.DTOs.Requests; public class CreateAdRequestRequest { public int StudentId { get; set; } diff --git a/TutorLizard.Shared/Models/DTOs/Requests/CreateScheduleItemRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/CreateScheduleItemRequest.cs new file mode 100644 index 00000000..57dea9c4 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Requests/CreateScheduleItemRequest.cs @@ -0,0 +1,28 @@ +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; + +namespace TutorLizard.Shared.Models.DTOs.Requests; + +public class CreateScheduleItemRequest +{ + public CreateScheduleItemRequest() + { + } + + public CreateScheduleItemRequest(int adId, + int userId, + DateTime dateTime) + { + AdId = adId; + UserId = userId; + DateTime = dateTime; + } + + public int AdId { get; set; } + public int UserId { get; set; } + + [DisplayName("Data")] + [Required(ErrorMessage = "To pole jest wymagane")] + public DateTime DateTime { get; set; } + +} diff --git a/TutorLizard.Shared/Models/DTOs/Requests/CreateScheduleItemRequestRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/CreateScheduleItemRequestRequest.cs new file mode 100644 index 00000000..b2d8fa40 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Requests/CreateScheduleItemRequestRequest.cs @@ -0,0 +1,8 @@ +namespace TutorLizard.Shared.Models.DTOs.Requests; + +public class CreateScheduleItemRequestRequest +{ + public int StudentId { get; set; } + public int ScheduleItemId { get; set; } + public bool IsRemote { get; set; } +} diff --git a/TutorLizard.Shared/Models/DTOs/Requests/DeleteAdRequestRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/DeleteAdRequestRequest.cs new file mode 100644 index 00000000..7c275df2 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Requests/DeleteAdRequestRequest.cs @@ -0,0 +1,6 @@ +namespace TutorLizard.Shared.Models.DTOs.Requests; + +public class DeleteAdRequestRequest(int adRequestId) +{ + public int Id { get; set; } = adRequestId; +} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/GetAdDetailsRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/GetAdDetailsRequest.cs similarity index 63% rename from TutorLizard.BusinessLogic/Models/DTOs/Requests/GetAdDetailsRequest.cs rename to TutorLizard.Shared/Models/DTOs/Requests/GetAdDetailsRequest.cs index 241fa604..f4784ccc 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/GetAdDetailsRequest.cs +++ b/TutorLizard.Shared/Models/DTOs/Requests/GetAdDetailsRequest.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests; +namespace TutorLizard.Shared.Models.DTOs.Requests; public class GetAdDetailsRequest { public int AdId { get; set; } diff --git a/TutorLizard.Shared/Models/DTOs/Requests/GetAdRequestStatusRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/GetAdRequestStatusRequest.cs new file mode 100644 index 00000000..fef45c57 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Requests/GetAdRequestStatusRequest.cs @@ -0,0 +1,6 @@ +namespace TutorLizard.Shared.Models.DTOs.Requests; +public class GetAdRequestStatusRequest +{ + public int AdId { get; set; } + public int StudentId { get; set; } +} diff --git a/TutorLizard.Shared/Models/DTOs/Requests/GetAvailableScheduleForAdRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/GetAvailableScheduleForAdRequest.cs new file mode 100644 index 00000000..8a25375c --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Requests/GetAvailableScheduleForAdRequest.cs @@ -0,0 +1,12 @@ +namespace TutorLizard.Shared.Models.DTOs.Requests; + +public class GetAvailableScheduleForAdRequest +{ + public int AdId { get; set; } + public int StudentId { get; set; } + public GetAvailableScheduleForAdRequest(int adId, int studentId) + { + AdId = adId; + StudentId = studentId; + } +} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/GetBrowseAdsPageRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/GetBrowseAdsPageRequest.cs similarity index 90% rename from TutorLizard.BusinessLogic/Models/DTOs/Requests/GetBrowseAdsPageRequest.cs rename to TutorLizard.Shared/Models/DTOs/Requests/GetBrowseAdsPageRequest.cs index 09288150..191cfb8e 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/GetBrowseAdsPageRequest.cs +++ b/TutorLizard.Shared/Models/DTOs/Requests/GetBrowseAdsPageRequest.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests; +namespace TutorLizard.Shared.Models.DTOs.Requests; public class GetBrowseAdsPageRequest { public int PageNumber { get; set; } diff --git a/TutorLizard.Shared/Models/DTOs/Requests/GetCategoriesRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/GetCategoriesRequest.cs new file mode 100644 index 00000000..06e96386 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Requests/GetCategoriesRequest.cs @@ -0,0 +1,5 @@ +namespace TutorLizard.Shared.Models.DTOs.Requests; + +public class GetCategoriesRequest +{ +} \ No newline at end of file diff --git a/TutorLizard.Shared/Models/DTOs/Requests/GetStudentsAcceptedAdsRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/GetStudentsAcceptedAdsRequest.cs new file mode 100644 index 00000000..a90860e3 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Requests/GetStudentsAcceptedAdsRequest.cs @@ -0,0 +1,10 @@ +namespace TutorLizard.Shared.Models.DTOs.Requests; + +public class GetStudentsAcceptedAdsRequest +{ + public int StudentId { get; set; } + public GetStudentsAcceptedAdsRequest(int? studentId) + { + StudentId = (int)studentId; + } +} diff --git a/TutorLizard.Shared/Models/DTOs/Requests/GetStudentsAdRequestsRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/GetStudentsAdRequestsRequest.cs new file mode 100644 index 00000000..27a1e8b7 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Requests/GetStudentsAdRequestsRequest.cs @@ -0,0 +1,10 @@ +namespace TutorLizard.Shared.Models.DTOs.Requests; + +public class GetStudentsAdRequestsRequest +{ + public int StudentId { get; set; } + public GetStudentsAdRequestsRequest(int? studentId) + { + StudentId = (int)studentId; + } +} diff --git a/TutorLizard.Shared/Models/DTOs/Requests/GetTutorsAdsRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/GetTutorsAdsRequest.cs new file mode 100644 index 00000000..2651cc2f --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Requests/GetTutorsAdsRequest.cs @@ -0,0 +1,11 @@ +namespace TutorLizard.Shared.Models.DTOs.Requests; + +public class GetTutorsAdsRequest +{ + public int TutorId { get; set; } + + public GetTutorsAdsRequest(int tutorId) + { + TutorId = tutorId; + } +} diff --git a/TutorLizard.Shared/Models/DTOs/Requests/GetTutorsAllAdRequestsRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/GetTutorsAllAdRequestsRequest.cs new file mode 100644 index 00000000..317d6621 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Requests/GetTutorsAllAdRequestsRequest.cs @@ -0,0 +1,10 @@ +namespace TutorLizard.Shared.Models.DTOs.Requests; + +public class GetTutorsAllAdRequestsRequest +{ + public int TutorId { get; set; } + public GetTutorsAllAdRequestsRequest(int? tutorId) + { + TutorId = (int)tutorId; + } +} diff --git a/TutorLizard.Shared/Models/DTOs/Requests/GetTutorsPendingAdRequestsRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/GetTutorsPendingAdRequestsRequest.cs new file mode 100644 index 00000000..c49c47bb --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Requests/GetTutorsPendingAdRequestsRequest.cs @@ -0,0 +1,10 @@ +namespace TutorLizard.Shared.Models.DTOs.Requests; + +public class GetTutorsPendingAdRequestsRequest +{ + public int TutorId { get; set; } + public GetTutorsPendingAdRequestsRequest(int? tutorId) + { + TutorId = (int)tutorId; + } +} diff --git a/TutorLizard.Shared/Models/DTOs/Requests/GetTutorsScheduleForAdRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/GetTutorsScheduleForAdRequest.cs new file mode 100644 index 00000000..e293bb9a --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Requests/GetTutorsScheduleForAdRequest.cs @@ -0,0 +1,6 @@ +namespace TutorLizard.Shared.Models.DTOs.Requests; +public class GetTutorsScheduleForAdRequest +{ + public int AdId { get; set; } + public int TutorId { get; set; } +} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/GetUsersScheduleRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/GetUsersScheduleRequest.cs similarity index 55% rename from TutorLizard.BusinessLogic/Models/DTOs/Requests/GetUsersScheduleRequest.cs rename to TutorLizard.Shared/Models/DTOs/Requests/GetUsersScheduleRequest.cs index 271e80b8..565660eb 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/GetUsersScheduleRequest.cs +++ b/TutorLizard.Shared/Models/DTOs/Requests/GetUsersScheduleRequest.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests; +namespace TutorLizard.Shared.Models.DTOs.Requests; public class GetUsersScheduleRequest { public int UserId { get; set; } diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/IsUserTheAdOwnerRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/IsUserTheAdOwnerRequest.cs similarity index 74% rename from TutorLizard.BusinessLogic/Models/DTOs/Requests/IsUserTheAdOwnerRequest.cs rename to TutorLizard.Shared/Models/DTOs/Requests/IsUserTheAdOwnerRequest.cs index fb425f15..a896f29e 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/IsUserTheAdOwnerRequest.cs +++ b/TutorLizard.Shared/Models/DTOs/Requests/IsUserTheAdOwnerRequest.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests +namespace TutorLizard.Shared.Models.DTOs.Requests { public class IsUserTheAdOwnerRequest(int adId, int? userId) { diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/UnacceptScheduleItemRequestRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/UnacceptScheduleItemRequestRequest.cs similarity index 69% rename from TutorLizard.BusinessLogic/Models/DTOs/Requests/UnacceptScheduleItemRequestRequest.cs rename to TutorLizard.Shared/Models/DTOs/Requests/UnacceptScheduleItemRequestRequest.cs index 9a3b5d85..a790b17b 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/UnacceptScheduleItemRequestRequest.cs +++ b/TutorLizard.Shared/Models/DTOs/Requests/UnacceptScheduleItemRequestRequest.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests; +namespace TutorLizard.Shared.Models.DTOs.Requests; public class UnacceptScheduleItemRequestRequest { public int TutorId { get; set; } diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/UpdateTutorsPendingAdRequestRequest.cs b/TutorLizard.Shared/Models/DTOs/Requests/UpdateAdRequestRequest.cs similarity index 59% rename from TutorLizard.BusinessLogic/Models/DTOs/Requests/UpdateTutorsPendingAdRequestRequest.cs rename to TutorLizard.Shared/Models/DTOs/Requests/UpdateAdRequestRequest.cs index 48c720cf..2779f27a 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/UpdateTutorsPendingAdRequestRequest.cs +++ b/TutorLizard.Shared/Models/DTOs/Requests/UpdateAdRequestRequest.cs @@ -1,6 +1,6 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Requests; +namespace TutorLizard.Shared.Models.DTOs.Requests; -public class UpdateTutorsPendingAdRequestRequest(int adRequestId, string replyMessage) +public class UpdateAdRequestRequest(int adRequestId, string replyMessage) { public int AdRequestId { get; set; } = adRequestId; public string ReplyMessage { get; set; } = replyMessage; diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/AcceptScheduleItemRequestResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/AcceptScheduleItemRequestResponse.cs similarity index 58% rename from TutorLizard.BusinessLogic/Models/DTOs/Responses/AcceptScheduleItemRequestResponse.cs rename to TutorLizard.Shared/Models/DTOs/Responses/AcceptScheduleItemRequestResponse.cs index 9363c935..9740d8d5 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/AcceptScheduleItemRequestResponse.cs +++ b/TutorLizard.Shared/Models/DTOs/Responses/AcceptScheduleItemRequestResponse.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses; +namespace TutorLizard.Shared.Models.DTOs.Responses; public class AcceptScheduleItemRequestResponse { public bool Success { get; set; } diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateAdRequestResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/CreateAdRequestResponse.cs similarity index 56% rename from TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateAdRequestResponse.cs rename to TutorLizard.Shared/Models/DTOs/Responses/CreateAdRequestResponse.cs index f59fef33..45e7f057 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateAdRequestResponse.cs +++ b/TutorLizard.Shared/Models/DTOs/Responses/CreateAdRequestResponse.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses; +namespace TutorLizard.Shared.Models.DTOs.Responses; public class CreateAdRequestResponse { public bool Success { get; set; } diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateAdResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/CreateAdResponse.cs similarity index 66% rename from TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateAdResponse.cs rename to TutorLizard.Shared/Models/DTOs/Responses/CreateAdResponse.cs index 219c1e99..e2bbf808 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateAdResponse.cs +++ b/TutorLizard.Shared/Models/DTOs/Responses/CreateAdResponse.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses; +namespace TutorLizard.Shared.Models.DTOs.Responses; public class CreateAdResponse { public bool SuccessfullyCreated { get; set; } diff --git a/TutorLizard.Shared/Models/DTOs/Responses/CreateScheduleItemRequestResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/CreateScheduleItemRequestResponse.cs new file mode 100644 index 00000000..4e2b1d22 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Responses/CreateScheduleItemRequestResponse.cs @@ -0,0 +1,8 @@ +namespace TutorLizard.Shared.Models.DTOs.Responses; + +public class CreateScheduleItemRequestResponse +{ + public bool Success { get; set; } + public int CreatedScheduleItemRequestId { get; set; } + public bool IsRemote { get; set; } +} diff --git a/TutorLizard.Shared/Models/DTOs/Responses/CreateScheduleItemResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/CreateScheduleItemResponse.cs new file mode 100644 index 00000000..c5042d04 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Responses/CreateScheduleItemResponse.cs @@ -0,0 +1,7 @@ +namespace TutorLizard.Shared.Models.DTOs.Responses; + +public class CreateScheduleItemResponse +{ + public bool Success { get; set; } + public int CreatedItemId { get; set; } +} diff --git a/TutorLizard.Shared/Models/DTOs/Responses/DeleteAdRequestResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/DeleteAdRequestResponse.cs new file mode 100644 index 00000000..61d1a4f1 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Responses/DeleteAdRequestResponse.cs @@ -0,0 +1,6 @@ +namespace TutorLizard.Shared.Models.DTOs.Responses; + +public class DeleteAdRequestResponse +{ + public bool IsSuccessful { get; set; } +} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/GetAdDetailsResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/GetAdDetailsResponse.cs similarity index 84% rename from TutorLizard.BusinessLogic/Models/DTOs/Responses/GetAdDetailsResponse.cs rename to TutorLizard.Shared/Models/DTOs/Responses/GetAdDetailsResponse.cs index 92c84f79..dfd384db 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/GetAdDetailsResponse.cs +++ b/TutorLizard.Shared/Models/DTOs/Responses/GetAdDetailsResponse.cs @@ -1,6 +1,6 @@ -using TutorLizard.BusinessLogic.Enums; +using TutorLizard.Shared.Enums; -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses; +namespace TutorLizard.Shared.Models.DTOs.Responses; public class GetAdDetailsResponse { public int AdId { get; set; } diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/AdRequestStatusResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/GetAdRequestStatusResponse.cs similarity index 81% rename from TutorLizard.BusinessLogic/Models/DTOs/Responses/AdRequestStatusResponse.cs rename to TutorLizard.Shared/Models/DTOs/Responses/GetAdRequestStatusResponse.cs index 43d454ab..b149ce27 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/AdRequestStatusResponse.cs +++ b/TutorLizard.Shared/Models/DTOs/Responses/GetAdRequestStatusResponse.cs @@ -1,5 +1,5 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses; -public class AdRequestStatusResponse +namespace TutorLizard.Shared.Models.DTOs.Responses; +public class GetAdRequestStatusResponse { public int Id { get; set; } public int AdId { get; set; } diff --git a/TutorLizard.Shared/Models/DTOs/Responses/GetAvailableScheduleForAdResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/GetAvailableScheduleForAdResponse.cs new file mode 100644 index 00000000..9ee13d6b --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Responses/GetAvailableScheduleForAdResponse.cs @@ -0,0 +1,9 @@ +namespace TutorLizard.Shared.Models.DTOs.Responses; + +public class GetAvailableScheduleForAdResponse +{ + public List Items { get; set; } = new(); + public bool IsAccepted { get; set; } = true; + public bool IsRemote { get; set; } + public int AdId { get; set; } +} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/GetBrowseAdsPageResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/GetBrowseAdsPageResponse.cs similarity index 85% rename from TutorLizard.BusinessLogic/Models/DTOs/Responses/GetBrowseAdsPageResponse.cs rename to TutorLizard.Shared/Models/DTOs/Responses/GetBrowseAdsPageResponse.cs index 2df5cde9..c3946521 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/GetBrowseAdsPageResponse.cs +++ b/TutorLizard.Shared/Models/DTOs/Responses/GetBrowseAdsPageResponse.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses; +namespace TutorLizard.Shared.Models.DTOs.Responses; public class GetBrowseAdsPageResponse { public bool Success { get; set; } diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/GetCategoriesResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/GetCategoriesResponse.cs similarity index 69% rename from TutorLizard.BusinessLogic/Models/DTOs/Responses/GetCategoriesResponse.cs rename to TutorLizard.Shared/Models/DTOs/Responses/GetCategoriesResponse.cs index 42a84ed3..6762c73e 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/GetCategoriesResponse.cs +++ b/TutorLizard.Shared/Models/DTOs/Responses/GetCategoriesResponse.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses; +namespace TutorLizard.Shared.Models.DTOs.Responses; public class GetCategoriesResponse { public bool Success { get; set; } diff --git a/TutorLizard.Shared/Models/DTOs/Responses/GetStudentsAcceptedAdsResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/GetStudentsAcceptedAdsResponse.cs new file mode 100644 index 00000000..9680e3bd --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Responses/GetStudentsAcceptedAdsResponse.cs @@ -0,0 +1,6 @@ +namespace TutorLizard.Shared.Models.DTOs.Responses; + +public class GetStudentsAcceptedAdsResponse +{ + public List Ads { get; set; } = new(); +} diff --git a/TutorLizard.Shared/Models/DTOs/Responses/GetStudentsAdRequestsResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/GetStudentsAdRequestsResponse.cs new file mode 100644 index 00000000..38a29d16 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Responses/GetStudentsAdRequestsResponse.cs @@ -0,0 +1,6 @@ +namespace TutorLizard.Shared.Models.DTOs.Responses; + +public class GetStudentsAdRequestsResponse +{ + public List AdRequests { get; set; } = new(); +} diff --git a/TutorLizard.Shared/Models/DTOs/Responses/GetTutorsAdsResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/GetTutorsAdsResponse.cs new file mode 100644 index 00000000..df88b6a4 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Responses/GetTutorsAdsResponse.cs @@ -0,0 +1,6 @@ +namespace TutorLizard.Shared.Models.DTOs.Responses; + +public class GetTutorsAdsResponse +{ + public List AdList { get; set; } = new(); +} diff --git a/TutorLizard.Shared/Models/DTOs/Responses/GetTutorsAllAdRequestsResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/GetTutorsAllAdRequestsResponse.cs new file mode 100644 index 00000000..41fd9fb0 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Responses/GetTutorsAllAdRequestsResponse.cs @@ -0,0 +1,6 @@ +namespace TutorLizard.Shared.Models.DTOs.Responses; + +public class GetTutorsAllAdRequestsResponse +{ + public List AdRequests { get; set; } = new(); +} diff --git a/TutorLizard.Shared/Models/DTOs/Responses/GetTutorsPendingAdRequestsResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/GetTutorsPendingAdRequestsResponse.cs new file mode 100644 index 00000000..0b320d34 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Responses/GetTutorsPendingAdRequestsResponse.cs @@ -0,0 +1,6 @@ +namespace TutorLizard.Shared.Models.DTOs.Responses; + +public class GetTutorsPendingAdRequestsResponse +{ + public List AdRequests { get; set; } = new(); +} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/TutorsScheduleForAdResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/GetTutorsScheduleForAdResponse.cs similarity index 51% rename from TutorLizard.BusinessLogic/Models/DTOs/Responses/TutorsScheduleForAdResponse.cs rename to TutorLizard.Shared/Models/DTOs/Responses/GetTutorsScheduleForAdResponse.cs index 5e1a5a4e..58f5ecba 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/TutorsScheduleForAdResponse.cs +++ b/TutorLizard.Shared/Models/DTOs/Responses/GetTutorsScheduleForAdResponse.cs @@ -1,5 +1,5 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses; -public class TutorsScheduleForAdResponse +namespace TutorLizard.Shared.Models.DTOs.Responses; +public class GetTutorsScheduleForAdResponse { public int AdId { get; set; } public List ScheduleItems { get; set; } = []; diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/GetUsersScheduleResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/GetUsersScheduleResponse.cs similarity index 77% rename from TutorLizard.BusinessLogic/Models/DTOs/Responses/GetUsersScheduleResponse.cs rename to TutorLizard.Shared/Models/DTOs/Responses/GetUsersScheduleResponse.cs index 4cfe5aed..4039fab2 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/GetUsersScheduleResponse.cs +++ b/TutorLizard.Shared/Models/DTOs/Responses/GetUsersScheduleResponse.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses; +namespace TutorLizard.Shared.Models.DTOs.Responses; public class GetUsersScheduleResponse { public List TutorsSchedule { get; set; } = []; diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/IsUserTheAdOwnerResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/IsUserTheAdOwnerResponse.cs similarity index 62% rename from TutorLizard.BusinessLogic/Models/DTOs/Responses/IsUserTheAdOwnerResponse.cs rename to TutorLizard.Shared/Models/DTOs/Responses/IsUserTheAdOwnerResponse.cs index e85a986c..986d3774 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/IsUserTheAdOwnerResponse.cs +++ b/TutorLizard.Shared/Models/DTOs/Responses/IsUserTheAdOwnerResponse.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses +namespace TutorLizard.Shared.Models.DTOs.Responses { public class IsUserTheAdOwnerResponse { diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/UnacceptScheduleItemRequestResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/UnacceptScheduleItemRequestResponse.cs similarity index 59% rename from TutorLizard.BusinessLogic/Models/DTOs/Responses/UnacceptScheduleItemRequestResponse.cs rename to TutorLizard.Shared/Models/DTOs/Responses/UnacceptScheduleItemRequestResponse.cs index 32df8b27..b6515981 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/UnacceptScheduleItemRequestResponse.cs +++ b/TutorLizard.Shared/Models/DTOs/Responses/UnacceptScheduleItemRequestResponse.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs.Responses; +namespace TutorLizard.Shared.Models.DTOs.Responses; public class UnacceptScheduleItemRequestResponse { public bool Success { get; set; } diff --git a/TutorLizard.Shared/Models/DTOs/Responses/UpdateAdRequestResponse.cs b/TutorLizard.Shared/Models/DTOs/Responses/UpdateAdRequestResponse.cs new file mode 100644 index 00000000..fd63ec0c --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/Responses/UpdateAdRequestResponse.cs @@ -0,0 +1,6 @@ +namespace TutorLizard.Shared.Models.DTOs.Responses; + +public class UpdateAdRequestResponse() +{ + public bool IsSuccessful { get; set; } +} diff --git a/TutorLizard.Shared/Models/DTOs/ScheduleItemDto.cs b/TutorLizard.Shared/Models/DTOs/ScheduleItemDto.cs new file mode 100644 index 00000000..b13e2a34 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/ScheduleItemDto.cs @@ -0,0 +1,16 @@ +namespace TutorLizard.Shared.Models.DTOs; +public class ScheduleItemDto +{ + public int Id { get; set; } + public int AdId { get; set; } + public DateTime DateTime { get; set; } + public ScheduleItemRequestStatus Status { get; set; } + + public enum ScheduleItemRequestStatus + { + Accepted, + Pending, + Rejected, + RequestNotSent + } +} diff --git a/TutorLizard.Shared/Models/DTOs/StudentScheduleItemRequestDto.cs b/TutorLizard.Shared/Models/DTOs/StudentScheduleItemRequestDto.cs new file mode 100644 index 00000000..2a354ed4 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/StudentScheduleItemRequestDto.cs @@ -0,0 +1,9 @@ +namespace TutorLizard.Shared.Models.DTOs +{ + public class StudentScheduleItemRequestDto + { + public int Id { get; set; } + public bool IsAccepted { get; set; } + public DateTime DateCreated { get; set; } + } +} diff --git a/TutorLizard.BusinessLogic/Models/DTOs/StudentsScheduleItemSummaryDto.cs b/TutorLizard.Shared/Models/DTOs/StudentsScheduleItemSummaryDto.cs similarity index 87% rename from TutorLizard.BusinessLogic/Models/DTOs/StudentsScheduleItemSummaryDto.cs rename to TutorLizard.Shared/Models/DTOs/StudentsScheduleItemSummaryDto.cs index 28985f74..ef9182b2 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/StudentsScheduleItemSummaryDto.cs +++ b/TutorLizard.Shared/Models/DTOs/StudentsScheduleItemSummaryDto.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs; +namespace TutorLizard.Shared.Models.DTOs; public class StudentsScheduleItemSummaryDto { public int Id { get; set; } diff --git a/TutorLizard.BusinessLogic/Models/DTOs/TutorsScheduleItemDto.cs b/TutorLizard.Shared/Models/DTOs/TutorsScheduleItemDto.cs similarity index 81% rename from TutorLizard.BusinessLogic/Models/DTOs/TutorsScheduleItemDto.cs rename to TutorLizard.Shared/Models/DTOs/TutorsScheduleItemDto.cs index f086a15b..d9f430c9 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/TutorsScheduleItemDto.cs +++ b/TutorLizard.Shared/Models/DTOs/TutorsScheduleItemDto.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs; +namespace TutorLizard.Shared.Models.DTOs; public class TutorsScheduleItemDto { public int Id { get; set; } diff --git a/TutorLizard.BusinessLogic/Models/DTOs/TutorsScheduleItemRequestDto.cs b/TutorLizard.Shared/Models/DTOs/TutorsScheduleItemRequestDto.cs similarity index 86% rename from TutorLizard.BusinessLogic/Models/DTOs/TutorsScheduleItemRequestDto.cs rename to TutorLizard.Shared/Models/DTOs/TutorsScheduleItemRequestDto.cs index fdea2a0e..3404d57e 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/TutorsScheduleItemRequestDto.cs +++ b/TutorLizard.Shared/Models/DTOs/TutorsScheduleItemRequestDto.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs; +namespace TutorLizard.Shared.Models.DTOs; public class TutorsScheduleItemRequestDto { public int Id { get; set; } diff --git a/TutorLizard.BusinessLogic/Models/DTOs/TutorsScheduleItemSummaryDto.cs b/TutorLizard.Shared/Models/DTOs/TutorsScheduleItemSummaryDto.cs similarity index 84% rename from TutorLizard.BusinessLogic/Models/DTOs/TutorsScheduleItemSummaryDto.cs rename to TutorLizard.Shared/Models/DTOs/TutorsScheduleItemSummaryDto.cs index 19b42c61..c93c4c8e 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/TutorsScheduleItemSummaryDto.cs +++ b/TutorLizard.Shared/Models/DTOs/TutorsScheduleItemSummaryDto.cs @@ -1,4 +1,4 @@ -namespace TutorLizard.BusinessLogic.Models.DTOs; +namespace TutorLizard.Shared.Models.DTOs; public class TutorsScheduleItemSummaryDto { public int Id { get; set; } diff --git a/TutorLizard.Shared/Models/DTOs/UserDto.cs b/TutorLizard.Shared/Models/DTOs/UserDto.cs new file mode 100644 index 00000000..0ed1a072 --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/UserDto.cs @@ -0,0 +1,24 @@ +using System.ComponentModel.DataAnnotations; +using TutorLizard.Shared.Enums; + +namespace TutorLizard.Shared.Models.DTOs; +public class UserDto +{ + public int Id { get; set; } + public bool? IsActive { get; set; } + public string Name { get; set; } + public UserType UserType { get; set; } + public string Email { get; set; } + public DateTime DateCreated { get; set; } = DateTime.Now; + public string? GoogleId { get; set; } + + public UserDto(int id, string name, UserType userType, string email, DateTime dateCreated, string? googleId) + { + Id = id; + Name = name; + UserType = userType; + Email = email; + DateCreated = dateCreated; + GoogleId = googleId; + } +} diff --git a/TutorLizard.Shared/TutorLizard.Shared.csproj b/TutorLizard.Shared/TutorLizard.Shared.csproj new file mode 100644 index 00000000..fa71b7ae --- /dev/null +++ b/TutorLizard.Shared/TutorLizard.Shared.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/TutorLizard.Web/Components/App.razor b/TutorLizard.Web/Components/App.razor new file mode 100644 index 00000000..caf75c0e --- /dev/null +++ b/TutorLizard.Web/Components/App.razor @@ -0,0 +1 @@ +@* No-op App component *@ \ No newline at end of file diff --git a/TutorLizard.Web/Controllers/AccountController.cs b/TutorLizard.Web/Controllers/AccountController.cs index 6390d7eb..4fe21c65 100644 --- a/TutorLizard.Web/Controllers/AccountController.cs +++ b/TutorLizard.Web/Controllers/AccountController.cs @@ -1,21 +1,35 @@ -using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Authentication.Google; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using TutorLizard.BusinessLogic.Enums; +using System.Security.Authentication; +using System.Security.Claims; +using System.ComponentModel; +using System.Net; +using System.Net.Mail; using TutorLizard.BusinessLogic.Interfaces.Services; +using TutorLizard.Shared.Enums; using TutorLizard.Web.Interfaces.Services; using TutorLizard.Web.Models; +using TutorLizard.Shared.Models.DTOs; + namespace TutorLizard.Web.Controllers; + public class AccountController : Controller { private readonly IUserAuthenticationService _userAuthenticationService; private readonly IUiMessagesService _uiMessagesService; + private readonly IUserService _userService; public AccountController(IUserAuthenticationService userAuthenticationService, - IUiMessagesService uiMessagesService) + IUiMessagesService uiMessagesService, + IUserService userService) { _userAuthenticationService = userAuthenticationService; _uiMessagesService = uiMessagesService; + _userService = userService; } public IActionResult Index() @@ -23,15 +37,76 @@ public IActionResult Index() return View(); } - public IActionResult Login([FromQuery] string? returnUrl) + public async Task Login([FromQuery] string? returnUrl) { if (returnUrl is not null) { TempData["returnUrl"] = returnUrl; } + return View(); } + public async Task GoogleLogin() + { + await HttpContext.ChallengeAsync(GoogleDefaults.AuthenticationScheme, + new AuthenticationProperties + { + RedirectUri = Url.Action("GoogleResponse"), + Items = + { + { "prompt", "select_account" } + } + }); + } + + public async Task GoogleResponse() + { + try + { + var result = await HttpContext.AuthenticateAsync(GoogleDefaults.AuthenticationScheme); + + if (result?.Succeeded != true) + { + return RedirectToAction("Login"); + } + + var claims = result.Principal.Identities.FirstOrDefault()?.Claims.ToList(); + + var claimNameIdentifier = claims?.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value; + var claimName = claims?.FirstOrDefault(x => x.Type == ClaimTypes.Name)?.Value; + var claimEmail = claims?.FirstOrDefault(x => x.Type == ClaimTypes.Email)?.Value; + + if(!(await _userAuthenticationService.IsGoogleUserRegistered(claimNameIdentifier))) + { + try + { + await _userAuthenticationService.RegisterUserWithGoogle(claimName, claimEmail, claimNameIdentifier); + } + catch (Exception ex) + { + _uiMessagesService.ShowFailureMessage("Rejestracja użytkownika za pomocą konta google się nie powiodła"); + return RedirectToAction("Login"); + } + } + + var loggedIn = await _userAuthenticationService.LogInWithGoogleAsync(claimName,claimNameIdentifier); + + if (!loggedIn) + { + _uiMessagesService.ShowFailureMessage("Logowanie nieudane."); + return RedirectToAction("Login"); + } + + return RedirectToAction("Index", "Home"); + } + catch (Exception ex) + { + _uiMessagesService.ShowFailureMessage("Logowanie nieudane."); + return RedirectToAction("Login"); + } + } + [HttpPost] [ValidateAntiForgeryToken] public async Task Login(LoginModel model) @@ -44,14 +119,39 @@ public async Task Login(LoginModel model) try { - if (ModelState.IsValid && await _userAuthenticationService.LogInAsync(model.UserName, model.Password)) + if (ModelState.IsValid) { - _uiMessagesService.ShowSuccessMessage("Jesteś zalogowany/a."); - if (string.IsNullOrEmpty(returnUrl)) + var logInResult = await _userAuthenticationService.LogInAsync(model.UserName, model.Password); + + switch (logInResult.ResultCode) { - return RedirectToAction("Index", "Home"); + case LogInResultCode.Success: + _uiMessagesService.ShowSuccessMessage("Jesteś zalogowany/a."); + if (string.IsNullOrEmpty(returnUrl)) + { + return RedirectToAction("Index", "Home"); + } + return Redirect(returnUrl); + + case LogInResultCode.UserNotFound: + case LogInResultCode.InvalidPassword: + _uiMessagesService.ShowFailureMessage("Logowanie nieudane. Nieprawidłowa nazwa użytkownika lub hasło."); + return RedirectToAction(nameof(Login), new { returnUrl = returnUrl }); + + case LogInResultCode.InactiveAccount: + _uiMessagesService.ShowFailureMessage("Logowanie nieudane. Konto nie jest aktywne."); + return LocalRedirect("/Home/Index"); + + default: + throw new InvalidEnumArgumentException(argumentName: nameof(LogInResult.ResultCode), + invalidValue: (int)logInResult.ResultCode, + enumClass: typeof(LogInResult)); } - return Redirect(returnUrl); + } + else + { + _uiMessagesService.ShowFailureMessage("Logowanie nieudane. Proszę wypełnić poprawnie formularz."); + return RedirectToAction(nameof(Login), new { returnUrl = returnUrl }); } } catch @@ -59,29 +159,43 @@ public async Task Login(LoginModel model) _uiMessagesService.ShowFailureMessage("Logowanie nieudane."); return LocalRedirect("/Home/Index"); } - _uiMessagesService.ShowFailureMessage("Logowanie nieudane."); - return RedirectToAction(nameof(Login), new { returnUrl = returnUrl }); } + [Authorize] public async Task Logout() { await _userAuthenticationService.LogOutAsync(); + return RedirectToAction("Index", "Home"); } public IActionResult Register() { return View(); } + [HttpPost] [ValidateAntiForgeryToken] public async Task Register(RegisterUserModel model) { try { - if (ModelState.IsValid - && await _userAuthenticationService.RegisterUser(model.UserName, UserType.Regular, model.Email, model.Password)) + if (!ModelState.IsValid) { - _uiMessagesService.ShowSuccessMessage("Użytkownik zarejestrowany."); + var errors = ModelState.Values.SelectMany(v => v.Errors); + foreach (var error in errors) + { + Console.WriteLine(error.ErrorMessage); + } + return View(model); + } + + var (registrationResult, activationCode) = await _userAuthenticationService.RegisterUser( + model.UserName, UserType.Regular, model.Email, model.Password); + + if (registrationResult) + { + _userAuthenticationService.SendActivationEmail(model.Email, activationCode); + _uiMessagesService.ShowSuccessMessage("Wysłano mail aktywacyjny."); return LocalRedirect("/Home/Index"); } } @@ -94,6 +208,23 @@ public async Task Register(RegisterUserModel model) return LocalRedirect("/Home/Index"); } + [HttpGet] + public async Task ActivateAccount(string activationCode) + { + var result = await _userService.ActivateUserAsync(activationCode); + + if (result.IsActivated) + { + _uiMessagesService.ShowSuccessMessage("Atywacja udana."); + return View("ActivateAccount"); + } + else + { + _uiMessagesService.ShowFailureMessage("Aktywacja konta nie powiodła się."); + return LocalRedirect("/Home/Index"); + } + } + public IActionResult AccessDenied() { return View(); diff --git a/TutorLizard.Web/Controllers/AdController.cs b/TutorLizard.Web/Controllers/AdController.cs index 52d3a635..c025b594 100644 --- a/TutorLizard.Web/Controllers/AdController.cs +++ b/TutorLizard.Web/Controllers/AdController.cs @@ -4,7 +4,7 @@ using TutorLizard.BusinessLogic.Extensions; using TutorLizard.BusinessLogic.Interfaces.Data.Repositories; using TutorLizard.BusinessLogic.Models; -using TutorLizard.BusinessLogic.Models.DTOs; +using TutorLizard.Shared.Models.DTOs; namespace TutorLizard.Web.Controllers { diff --git a/TutorLizard.Web/Controllers/BrowseController.cs b/TutorLizard.Web/Controllers/BrowseController.cs index 96259568..85a77e59 100644 --- a/TutorLizard.Web/Controllers/BrowseController.cs +++ b/TutorLizard.Web/Controllers/BrowseController.cs @@ -2,9 +2,9 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using TutorLizard.BusinessLogic.Interfaces.Services; -using TutorLizard.BusinessLogic.Models.DTOs; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; using TutorLizard.Web.Interfaces.Services; using TutorLizard.Web.Models; using TutorLizard.Web.Extensions; diff --git a/TutorLizard.Web/Controllers/StudentController.cs b/TutorLizard.Web/Controllers/StudentController.cs index 8d44471e..0c87ea23 100644 --- a/TutorLizard.Web/Controllers/StudentController.cs +++ b/TutorLizard.Web/Controllers/StudentController.cs @@ -1,11 +1,8 @@ -using Microsoft.AspNetCore.Antiforgery; -using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using Microsoft.Identity.Client; using TutorLizard.BusinessLogic.Interfaces.Services; -using TutorLizard.BusinessLogic.Models.DTOs; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; using TutorLizard.Web.Interfaces.Services; namespace TutorLizard.Web.Controllers; @@ -39,9 +36,9 @@ public async Task AcceptedAds() return Forbid(); } - StudentsAcceptedAdsRequest request = new(studentId); + GetStudentsAcceptedAdsRequest request = new(studentId); - StudentsAcceptedAdsResponse response = await _studentService.ViewAcceptedAds(request); + GetStudentsAcceptedAdsResponse response = await _studentService.GetStudentsAcceptedAds(request); return View(response); } @@ -62,9 +59,9 @@ public async Task AdRequests(IFormCollection buttonAction) return Forbid(); } - StudentsAdRequestsRequest request = new(studentId); + GetStudentsAdRequestsRequest request = new(studentId); - StudentsAdRequestsResponse response = await _studentService.ViewAdRequests(request); + GetStudentsAdRequestsResponse response = await _studentService.GetStudentsAdRequests(request); return View(response); } @@ -77,7 +74,7 @@ public async Task AdRequests(IFormCollection buttonAction) [HttpPost] [ValidateAntiForgeryToken] - public async Task CreateScheduleItemRequest(int scheduleItemId, int adId) + public async Task CreateScheduleItemRequest(int scheduleItemId, int adId, bool isRemote) { int? studentId = _userAuthenticationService.GetLoggedInUserId(); @@ -89,7 +86,8 @@ public async Task CreateScheduleItemRequest(int scheduleItemId, i CreateScheduleItemRequestRequest request = new() { StudentId = (int)studentId, - ScheduleItemId = scheduleItemId + ScheduleItemId = scheduleItemId, + IsRemote = isRemote }; CreateScheduleItemRequestResponse response = await _studentService.CreateScheduleItemRequest(request); @@ -97,7 +95,7 @@ public async Task CreateScheduleItemRequest(int scheduleItemId, i if (response.Success) { _uiMessagesService.ShowSuccessMessage("Zgłoszenie do terminu wysłane."); - return RedirectToAction("AdDetails", "Browse", new {id = adId }); + return RedirectToAction("AdDetails", "Browse", new { id = adId }); } else { @@ -141,8 +139,8 @@ public async Task CreateAdRequest(CreateAdRequestRequest request) [ValidateAntiForgeryToken] public async Task CancelAdRequest(int adRequestId) { - StudentCancelAdRequestRequest request = new StudentCancelAdRequestRequest(adRequestId); - StudentCancelAdRequestResponse response = await _studentService.DeleteAdRequest(request); + DeleteAdRequestRequest request = new DeleteAdRequestRequest(adRequestId); + DeleteAdRequestResponse response = await _studentService.DeleteAdRequest(request); if (response.IsSuccessful) { diff --git a/TutorLizard.Web/Controllers/TutorController.cs b/TutorLizard.Web/Controllers/TutorController.cs index 66abbb90..b6c6409d 100644 --- a/TutorLizard.Web/Controllers/TutorController.cs +++ b/TutorLizard.Web/Controllers/TutorController.cs @@ -7,9 +7,9 @@ using TutorLizard.BusinessLogic.Interfaces.Data.Repositories; using TutorLizard.BusinessLogic.Interfaces.Services; using TutorLizard.BusinessLogic.Models; -using TutorLizard.BusinessLogic.Models.DTOs; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; using TutorLizard.Web.Interfaces.Services; namespace TutorLizard.Web.Controllers; @@ -210,9 +210,9 @@ public async Task ViewPendingAdRequests() return Forbid(); } - TutorsPendingAdRequestsRequest request = new(tutorId); + GetTutorsPendingAdRequestsRequest request = new(tutorId); - TutorsPendingAdRequestsResponse response = await _tutorService.ViewAllPendingAdRequests(request); + GetTutorsPendingAdRequestsResponse response = await _tutorService.GetTutorsPendingAdRequests(request); return View(response); } @@ -232,34 +232,34 @@ public async Task UpdatePendingAdRequest(IFormCollection form, in return Forbid(); } - UpdateTutorsPendingAdRequestRequest request = new(adRequestId, form["replyMessage"]); + UpdateAdRequestRequest request = new(adRequestId, form["replyMessage"]); try { if (!form["btnAccept"].IsNullOrEmpty()) - request.Action = UpdateTutorsPendingAdRequestRequest.UpdateAction.Accept; + request.Action = UpdateAdRequestRequest.UpdateAction.Accept; else if (!form["btnReject"].IsNullOrEmpty()) - request.Action = UpdateTutorsPendingAdRequestRequest.UpdateAction.Reject; + request.Action = UpdateAdRequestRequest.UpdateAction.Reject; var response = await _tutorService.UpdateAdRequest(request); if (!response.IsSuccessful) { - if(request.Action == UpdateTutorsPendingAdRequestRequest.UpdateAction.Accept) + if(request.Action == UpdateAdRequestRequest.UpdateAction.Accept) { _uiMessagesService.ShowFailureMessage("Wystąpił błąd. Akceptacja zgłoszenia nieudana."); } - else if (request.Action == UpdateTutorsPendingAdRequestRequest.UpdateAction.Reject) + else if (request.Action == UpdateAdRequestRequest.UpdateAction.Reject) { _uiMessagesService.ShowFailureMessage("Wystąpił błąd. Odrzucenie zgłoszenia nieudane."); } RedirectToAction(nameof(AdRequest)); } - if(request.Action == UpdateTutorsPendingAdRequestRequest.UpdateAction.Accept) + if(request.Action == UpdateAdRequestRequest.UpdateAction.Accept) { _uiMessagesService.ShowSuccessMessage("Ogłoszenie zaakceptowane."); } - else if (request.Action == UpdateTutorsPendingAdRequestRequest.UpdateAction.Reject) + else if (request.Action == UpdateAdRequestRequest.UpdateAction.Reject) { _uiMessagesService.ShowSuccessMessage("Ogłoszenie odrzucone."); } @@ -282,9 +282,9 @@ public async Task ViewAllAdRequests() return Forbid(); } - TutorAllAdRequestsRequest request = new(tutorId); + GetTutorsAllAdRequestsRequest request = new(tutorId); - TutorAllAdRequestsResponse response = await _tutorService.ViewAllAdRequests(request); + GetTutorsAllAdRequestsResponse response = await _tutorService.GetTutorsAllAdRequests(request); return View(response); } @@ -305,9 +305,9 @@ public async Task TutorsAdsList() return Forbid(); } - TutorsAdsRequest request = new(tutorId); + GetTutorsAdsRequest request = new((int)tutorId); - TutorsAdsResponse response = await _tutorService.ViewTutorsAds(request); + GetTutorsAdsResponse response = await _tutorService.GetTutorsAds(request); return View(response); } diff --git a/TutorLizard.Web/Extensions/AdSearchCriteriaDtoExtensions.cs b/TutorLizard.Web/Extensions/AdSearchCriteriaDtoExtensions.cs index f14a6081..43c9d0d0 100644 --- a/TutorLizard.Web/Extensions/AdSearchCriteriaDtoExtensions.cs +++ b/TutorLizard.Web/Extensions/AdSearchCriteriaDtoExtensions.cs @@ -1,6 +1,6 @@ using System.Text.Json; using System.Text.Json.Serialization; -using TutorLizard.BusinessLogic.Models.DTOs; +using TutorLizard.Shared.Models.DTOs; using TutorLizard.Web.Models; namespace TutorLizard.Web.Extensions; diff --git a/TutorLizard.Web/Interfaces/Services/IUserAuthenticationService.cs b/TutorLizard.Web/Interfaces/Services/IUserAuthenticationService.cs index 73b079b0..c82ae73f 100644 --- a/TutorLizard.Web/Interfaces/Services/IUserAuthenticationService.cs +++ b/TutorLizard.Web/Interfaces/Services/IUserAuthenticationService.cs @@ -1,4 +1,5 @@ -using TutorLizard.BusinessLogic.Enums; +using TutorLizard.Shared.Enums; +using TutorLizard.Shared.Models.DTOs; namespace TutorLizard.BusinessLogic.Interfaces.Services; @@ -6,7 +7,11 @@ public interface IUserAuthenticationService { int? GetLoggedInUserId(); - public Task LogInAsync(string username, string password); + Task LogInAsync(string username, string password); public Task LogOutAsync(); - public Task RegisterUser(string username, UserType type, string email, string password); + public Task IsGoogleUserRegistered(string googleid); + public Task RegisterUserWithGoogle(string username, string email, string googleId); + public Task LogInWithGoogleAsync(string username, string googleId); + Task<(bool, string)> RegisterUser(string username, UserType type, string email, string password); + void SendActivationEmail(string email, string activationCode); } diff --git a/TutorLizard.Web/Migrations/20240602175824_Add-IsRemote-In-StudentService.Designer.cs b/TutorLizard.Web/Migrations/20240602175824_Add-IsRemote-In-StudentService.Designer.cs new file mode 100644 index 00000000..b2e7a1bd --- /dev/null +++ b/TutorLizard.Web/Migrations/20240602175824_Add-IsRemote-In-StudentService.Designer.cs @@ -0,0 +1,336 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using TutorLizard.BusinessLogic.Data; + +#nullable disable + +namespace TutorLizard.Web.Migrations +{ + [DbContext(typeof(JaszczurContext))] + [Migration("20240602175824_Add-IsRemote-In-StudentService")] + partial class AddIsRemoteInStudentService + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CategoryId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(3000) + .HasColumnType("nvarchar(3000)"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("Location") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Price") + .HasPrecision(7, 2) + .HasColumnType("decimal(7,2)"); + + b.Property("Subject") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("TutorId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.HasIndex("TutorId"); + + b.ToTable("Ads"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.AdRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AdId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("IsAccepted") + .HasColumnType("bit"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("ReplyMessage") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("ReviewDate") + .HasColumnType("datetime2"); + + b.Property("StudentId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("AdId"); + + b.HasIndex("StudentId"); + + b.ToTable("AdRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Category", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.HasKey("Id"); + + b.ToTable("Categories"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AdId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("DateTime") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("AdId"); + + b.ToTable("ScheduleItems"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItemRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("IsAccepted") + .HasColumnType("bit"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("ScheduleItemId") + .HasColumnType("int"); + + b.Property("StudentId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ScheduleItemId"); + + b.HasIndex("StudentId"); + + b.ToTable("ScheduleItemRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)"); + + b.Property("PasswordHash") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("UserType") + .HasColumnType("tinyint"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Category", "Category") + .WithMany("Ads") + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("Ads") + .HasForeignKey("TutorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.AdRequest", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Ad", "Ad") + .WithMany("AdRequests") + .HasForeignKey("AdId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("AdRequests") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Ad"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Ad", "Ad") + .WithMany("ScheduleItems") + .HasForeignKey("AdId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ad"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItemRequest", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.ScheduleItem", "ScheduleItem") + .WithMany("ScheduleItemRequests") + .HasForeignKey("ScheduleItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("ScheduleItemRequests") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("ScheduleItem"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.Navigation("AdRequests"); + + b.Navigation("ScheduleItems"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Category", b => + { + b.Navigation("Ads"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.Navigation("ScheduleItemRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.User", b => + { + b.Navigation("AdRequests"); + + b.Navigation("Ads"); + + b.Navigation("ScheduleItemRequests"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TutorLizard.Web/Migrations/20240602175824_Add-IsRemote-In-StudentService.cs b/TutorLizard.Web/Migrations/20240602175824_Add-IsRemote-In-StudentService.cs new file mode 100644 index 00000000..a9856426 --- /dev/null +++ b/TutorLizard.Web/Migrations/20240602175824_Add-IsRemote-In-StudentService.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TutorLizard.Web.Migrations +{ + /// + public partial class AddIsRemoteInStudentService : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/TutorLizard.Web/Migrations/20240606152246_Add-Activation-Emails.Designer.cs b/TutorLizard.Web/Migrations/20240606152246_Add-Activation-Emails.Designer.cs new file mode 100644 index 00000000..69e4f217 --- /dev/null +++ b/TutorLizard.Web/Migrations/20240606152246_Add-Activation-Emails.Designer.cs @@ -0,0 +1,345 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using TutorLizard.BusinessLogic.Data; + +#nullable disable + +namespace TutorLizard.Web.Migrations +{ + [DbContext(typeof(JaszczurContext))] + [Migration("20240606152246_Add-Activation-Emails")] + partial class AddActivationEmails + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CategoryId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(3000) + .HasColumnType("nvarchar(3000)"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("Location") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Price") + .HasPrecision(7, 2) + .HasColumnType("decimal(7,2)"); + + b.Property("Subject") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("TutorId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.HasIndex("TutorId"); + + b.ToTable("Ads"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.AdRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AdId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("IsAccepted") + .HasColumnType("bit"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("ReplyMessage") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("ReviewDate") + .HasColumnType("datetime2"); + + b.Property("StudentId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("AdId"); + + b.HasIndex("StudentId"); + + b.ToTable("AdRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Category", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.HasKey("Id"); + + b.ToTable("Categories"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AdId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("DateTime") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("AdId"); + + b.ToTable("ScheduleItems"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItemRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("IsAccepted") + .HasColumnType("bit"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("ScheduleItemId") + .HasColumnType("int"); + + b.Property("StudentId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ScheduleItemId"); + + b.HasIndex("StudentId"); + + b.ToTable("ScheduleItemRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ActivationCode") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("Name") + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)"); + + b.Property("PasswordHash") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("UserType") + .HasColumnType("tinyint"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Category", "Category") + .WithMany("Ads") + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("Ads") + .HasForeignKey("TutorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.AdRequest", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Ad", "Ad") + .WithMany("AdRequests") + .HasForeignKey("AdId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("AdRequests") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Ad"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Ad", "Ad") + .WithMany("ScheduleItems") + .HasForeignKey("AdId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ad"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItemRequest", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.ScheduleItem", "ScheduleItem") + .WithMany("ScheduleItemRequests") + .HasForeignKey("ScheduleItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("ScheduleItemRequests") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("ScheduleItem"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.Navigation("AdRequests"); + + b.Navigation("ScheduleItems"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Category", b => + { + b.Navigation("Ads"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.Navigation("ScheduleItemRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.User", b => + { + b.Navigation("AdRequests"); + + b.Navigation("Ads"); + + b.Navigation("ScheduleItemRequests"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TutorLizard.Web/Migrations/20240606152246_Add-Activation-Emails.cs b/TutorLizard.Web/Migrations/20240606152246_Add-Activation-Emails.cs new file mode 100644 index 00000000..14a7d81c --- /dev/null +++ b/TutorLizard.Web/Migrations/20240606152246_Add-Activation-Emails.cs @@ -0,0 +1,40 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TutorLizard.Web.Migrations +{ + /// + public partial class AddActivationEmails : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ActivationCode", + table: "Users", + type: "nvarchar(max)", + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "IsActive", + table: "Users", + type: "bit", + nullable: false, + defaultValue: false); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ActivationCode", + table: "Users"); + + migrationBuilder.DropColumn( + name: "IsActive", + table: "Users"); + } + } +} diff --git a/TutorLizard.Web/Migrations/20240614131623_AddGoogleIdToUser.Designer.cs b/TutorLizard.Web/Migrations/20240614131623_AddGoogleIdToUser.Designer.cs new file mode 100644 index 00000000..1c53d805 --- /dev/null +++ b/TutorLizard.Web/Migrations/20240614131623_AddGoogleIdToUser.Designer.cs @@ -0,0 +1,339 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using TutorLizard.BusinessLogic.Data; + +#nullable disable + +namespace TutorLizard.Web.Migrations +{ + [DbContext(typeof(JaszczurContext))] + [Migration("20240614131623_AddGoogleIdToUser")] + partial class AddGoogleIdToUser + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CategoryId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(3000) + .HasColumnType("nvarchar(3000)"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("Location") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Price") + .HasPrecision(7, 2) + .HasColumnType("decimal(7,2)"); + + b.Property("Subject") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("TutorId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.HasIndex("TutorId"); + + b.ToTable("Ads"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.AdRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AdId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("IsAccepted") + .HasColumnType("bit"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("ReplyMessage") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("ReviewDate") + .HasColumnType("datetime2"); + + b.Property("StudentId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("AdId"); + + b.HasIndex("StudentId"); + + b.ToTable("AdRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Category", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.HasKey("Id"); + + b.ToTable("Categories"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AdId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("DateTime") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("AdId"); + + b.ToTable("ScheduleItems"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItemRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("IsAccepted") + .HasColumnType("bit"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("ScheduleItemId") + .HasColumnType("int"); + + b.Property("StudentId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ScheduleItemId"); + + b.HasIndex("StudentId"); + + b.ToTable("ScheduleItemRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("GoogleId") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)"); + + b.Property("PasswordHash") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("UserType") + .HasColumnType("tinyint"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Category", "Category") + .WithMany("Ads") + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("Ads") + .HasForeignKey("TutorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.AdRequest", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Ad", "Ad") + .WithMany("AdRequests") + .HasForeignKey("AdId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("AdRequests") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Ad"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Ad", "Ad") + .WithMany("ScheduleItems") + .HasForeignKey("AdId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ad"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItemRequest", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.ScheduleItem", "ScheduleItem") + .WithMany("ScheduleItemRequests") + .HasForeignKey("ScheduleItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("ScheduleItemRequests") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("ScheduleItem"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.Navigation("AdRequests"); + + b.Navigation("ScheduleItems"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Category", b => + { + b.Navigation("Ads"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.Navigation("ScheduleItemRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.User", b => + { + b.Navigation("AdRequests"); + + b.Navigation("Ads"); + + b.Navigation("ScheduleItemRequests"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TutorLizard.Web/Migrations/20240614131623_AddGoogleIdToUser.cs b/TutorLizard.Web/Migrations/20240614131623_AddGoogleIdToUser.cs new file mode 100644 index 00000000..7d4bf0cf --- /dev/null +++ b/TutorLizard.Web/Migrations/20240614131623_AddGoogleIdToUser.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TutorLizard.Web.Migrations +{ + /// + public partial class AddGoogleIdToUser : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "GoogleId", + table: "Users", + type: "nvarchar(max)", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "GoogleId", + table: "Users"); + } + } +} diff --git a/TutorLizard.Web/Migrations/20240616164044_ChangePasswordHashToNullable.Designer.cs b/TutorLizard.Web/Migrations/20240616164044_ChangePasswordHashToNullable.Designer.cs new file mode 100644 index 00000000..002c703e --- /dev/null +++ b/TutorLizard.Web/Migrations/20240616164044_ChangePasswordHashToNullable.Designer.cs @@ -0,0 +1,339 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using TutorLizard.BusinessLogic.Data; + +#nullable disable + +namespace TutorLizard.Web.Migrations +{ + [DbContext(typeof(JaszczurContext))] + [Migration("20240616164044_ChangePasswordHashToNullable")] + partial class ChangePasswordHashToNullable + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CategoryId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(3000) + .HasColumnType("nvarchar(3000)"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("Location") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Price") + .HasPrecision(7, 2) + .HasColumnType("decimal(7,2)"); + + b.Property("Subject") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("TutorId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.HasIndex("TutorId"); + + b.ToTable("Ads"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.AdRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AdId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("IsAccepted") + .HasColumnType("bit"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("ReplyMessage") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("ReviewDate") + .HasColumnType("datetime2"); + + b.Property("StudentId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("AdId"); + + b.HasIndex("StudentId"); + + b.ToTable("AdRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Category", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.HasKey("Id"); + + b.ToTable("Categories"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AdId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("DateTime") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("AdId"); + + b.ToTable("ScheduleItems"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItemRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("IsAccepted") + .HasColumnType("bit"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("ScheduleItemId") + .HasColumnType("int"); + + b.Property("StudentId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ScheduleItemId"); + + b.HasIndex("StudentId"); + + b.ToTable("ScheduleItemRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("GoogleId") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)"); + + b.Property("PasswordHash") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("UserType") + .HasColumnType("tinyint"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Category", "Category") + .WithMany("Ads") + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("Ads") + .HasForeignKey("TutorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.AdRequest", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Ad", "Ad") + .WithMany("AdRequests") + .HasForeignKey("AdId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("AdRequests") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Ad"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Ad", "Ad") + .WithMany("ScheduleItems") + .HasForeignKey("AdId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ad"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItemRequest", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.ScheduleItem", "ScheduleItem") + .WithMany("ScheduleItemRequests") + .HasForeignKey("ScheduleItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("ScheduleItemRequests") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("ScheduleItem"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.Navigation("AdRequests"); + + b.Navigation("ScheduleItems"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Category", b => + { + b.Navigation("Ads"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.Navigation("ScheduleItemRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.User", b => + { + b.Navigation("AdRequests"); + + b.Navigation("Ads"); + + b.Navigation("ScheduleItemRequests"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TutorLizard.Web/Migrations/20240616164044_ChangePasswordHashToNullable.cs b/TutorLizard.Web/Migrations/20240616164044_ChangePasswordHashToNullable.cs new file mode 100644 index 00000000..fdd6bff9 --- /dev/null +++ b/TutorLizard.Web/Migrations/20240616164044_ChangePasswordHashToNullable.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TutorLizard.Web.Migrations +{ + /// + public partial class ChangePasswordHashToNullable : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/TutorLizard.Web/Migrations/20240616164645_PasswordHashToNullable.Designer.cs b/TutorLizard.Web/Migrations/20240616164645_PasswordHashToNullable.Designer.cs new file mode 100644 index 00000000..a0b51d4c --- /dev/null +++ b/TutorLizard.Web/Migrations/20240616164645_PasswordHashToNullable.Designer.cs @@ -0,0 +1,338 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using TutorLizard.BusinessLogic.Data; + +#nullable disable + +namespace TutorLizard.Web.Migrations +{ + [DbContext(typeof(JaszczurContext))] + [Migration("20240616164645_PasswordHashToNullable")] + partial class PasswordHashToNullable + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CategoryId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(3000) + .HasColumnType("nvarchar(3000)"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("Location") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Price") + .HasPrecision(7, 2) + .HasColumnType("decimal(7,2)"); + + b.Property("Subject") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("TutorId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.HasIndex("TutorId"); + + b.ToTable("Ads"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.AdRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AdId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("IsAccepted") + .HasColumnType("bit"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("ReplyMessage") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("ReviewDate") + .HasColumnType("datetime2"); + + b.Property("StudentId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("AdId"); + + b.HasIndex("StudentId"); + + b.ToTable("AdRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Category", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.HasKey("Id"); + + b.ToTable("Categories"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AdId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("DateTime") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("AdId"); + + b.ToTable("ScheduleItems"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItemRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("IsAccepted") + .HasColumnType("bit"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("ScheduleItemId") + .HasColumnType("int"); + + b.Property("StudentId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ScheduleItemId"); + + b.HasIndex("StudentId"); + + b.ToTable("ScheduleItemRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("GoogleId") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)"); + + b.Property("PasswordHash") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("UserType") + .HasColumnType("tinyint"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Category", "Category") + .WithMany("Ads") + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("Ads") + .HasForeignKey("TutorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.AdRequest", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Ad", "Ad") + .WithMany("AdRequests") + .HasForeignKey("AdId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("AdRequests") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Ad"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Ad", "Ad") + .WithMany("ScheduleItems") + .HasForeignKey("AdId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ad"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItemRequest", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.ScheduleItem", "ScheduleItem") + .WithMany("ScheduleItemRequests") + .HasForeignKey("ScheduleItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("ScheduleItemRequests") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("ScheduleItem"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.Navigation("AdRequests"); + + b.Navigation("ScheduleItems"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Category", b => + { + b.Navigation("Ads"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.Navigation("ScheduleItemRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.User", b => + { + b.Navigation("AdRequests"); + + b.Navigation("Ads"); + + b.Navigation("ScheduleItemRequests"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TutorLizard.Web/Migrations/20240616164645_PasswordHashToNullable.cs b/TutorLizard.Web/Migrations/20240616164645_PasswordHashToNullable.cs new file mode 100644 index 00000000..5073e0fd --- /dev/null +++ b/TutorLizard.Web/Migrations/20240616164645_PasswordHashToNullable.cs @@ -0,0 +1,40 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TutorLizard.Web.Migrations +{ + /// + public partial class PasswordHashToNullable : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "PasswordHash", + table: "Users", + type: "nvarchar(100)", + maxLength: 100, + nullable: true, + oldClrType: typeof(string), + oldType: "nvarchar(100)", + oldMaxLength: 100); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "PasswordHash", + table: "Users", + type: "nvarchar(100)", + maxLength: 100, + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "nvarchar(100)", + oldMaxLength: 100, + oldNullable: true); + } + } +} diff --git a/TutorLizard.Web/Migrations/JaszczurContextModelSnapshot.cs b/TutorLizard.Web/Migrations/JaszczurContextModelSnapshot.cs index 146d001c..ba34cd76 100644 --- a/TutorLizard.Web/Migrations/JaszczurContextModelSnapshot.cs +++ b/TutorLizard.Web/Migrations/JaszczurContextModelSnapshot.cs @@ -17,7 +17,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("ProductVersion", "8.0.6") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -208,6 +208,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + b.Property("ActivationCode") + .IsRequired() + .HasColumnType("nvarchar(max)"); + b.Property("DateCreated") .HasColumnType("datetime2"); @@ -216,13 +220,20 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(100) .HasColumnType("nvarchar(100)"); + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("GoogleId") + .HasColumnType("nvarchar(max)"); + b.Property("Name") .IsRequired() .HasMaxLength(40) .HasColumnType("nvarchar(40)"); b.Property("PasswordHash") - .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)"); diff --git a/TutorLizard.Web/Models/EmailSettings.cs b/TutorLizard.Web/Models/EmailSettings.cs new file mode 100644 index 00000000..481bb807 --- /dev/null +++ b/TutorLizard.Web/Models/EmailSettings.cs @@ -0,0 +1,13 @@ +namespace TutorLizard.Web.Models +{ + public class EmailSettings + { + public string FromAddress { get; set; } + public string FromPassword { get; set; } + public string ActivationLink { get; set; } + public string Host { get; set; } + public int Port { get; set; } + public bool EnableSsl { get; set; } + } + +} diff --git a/TutorLizard.Web/Models/LoginModel.cs b/TutorLizard.Web/Models/LoginModel.cs index 01f686c3..3fca4cf6 100644 --- a/TutorLizard.Web/Models/LoginModel.cs +++ b/TutorLizard.Web/Models/LoginModel.cs @@ -1,8 +1,9 @@ -using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Authentication; +using System.ComponentModel.DataAnnotations; namespace TutorLizard.Web.Models; -public class LoginModel +public class LoginModel { [Required] public string UserName { get; set; } diff --git a/TutorLizard.Web/Models/RegisterUserModel.cs b/TutorLizard.Web/Models/RegisterUserModel.cs index d73935c8..a58db6f5 100644 --- a/TutorLizard.Web/Models/RegisterUserModel.cs +++ b/TutorLizard.Web/Models/RegisterUserModel.cs @@ -1,5 +1,5 @@ using System.ComponentModel.DataAnnotations; -using TutorLizard.BusinessLogic.Enums; +using TutorLizard.Shared.Enums; namespace TutorLizard.Web.Models { diff --git a/TutorLizard.Web/Program.cs b/TutorLizard.Web/Program.cs index a14eac69..9a5837e1 100644 --- a/TutorLizard.Web/Program.cs +++ b/TutorLizard.Web/Program.cs @@ -1,3 +1,4 @@ +using Microsoft.AspNetCore.Authentication.Google; using Microsoft.EntityFrameworkCore; using Serilog; using TutorLizard.BusinessLogic.Data; @@ -6,7 +7,9 @@ using TutorLizard.BusinessLogic.Options; using TutorLizard.BusinessLogic.Services; using TutorLizard.Web.Interfaces.Services; +using TutorLizard.Web.Models; using TutorLizard.Web.Services; +using TutorLizard.Web.Components; var builder = WebApplication.CreateBuilder(args); @@ -19,6 +22,10 @@ builder.Services.AddControllersWithViews(); builder.Services.AddHttpContextAccessor(); builder.Services.AddRazorPages(); +builder.Services.AddRazorComponents() + .AddInteractiveServerComponents() + .AddInteractiveWebAssemblyComponents(); + builder.Services.AddTransient(); builder.Services.AddScoped(); builder.Services.AddScoped(); @@ -31,7 +38,25 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); -builder.Services.AddAuthentication("CookieAuth") +builder.Services.AddAuthentication(options => + { + options.DefaultScheme = "CookieAuth"; + }) + .AddGoogle(options => + { + options.ClientId = builder.Configuration["Auth:Google:ClientId"]; + options.ClientSecret = builder.Configuration["Auth:Google:ClientSecret"]; + options.SaveTokens = true; + options.Events = new Microsoft.AspNetCore.Authentication.OAuth.OAuthEvents + { + OnRemoteFailure = context => + { + context.HandleResponse(); + context.Response.Redirect("/Account/Login"); + return Task.FromResult(0); + } + }; + }) .AddCookie("CookieAuth", options => { options.ExpireTimeSpan = TimeSpan.FromDays(1); @@ -50,6 +75,7 @@ }); builder.Services.AddTutorLizardDbRepositories(); +builder.Services.Configure(builder.Configuration.GetSection("EmailSettings")); var app = builder.Build(); @@ -66,15 +92,35 @@ app.UseCookiePolicy(new CookiePolicyOptions { - MinimumSameSitePolicy = SameSiteMode.Strict + MinimumSameSitePolicy = SameSiteMode.None, + Secure = CookieSecurePolicy.Always }); app.UseRouting(); +app.UseAuthentication(); app.UseAuthorization(); +app.UseHttpsRedirection(); + +app.UseEndpoints(endpoints => +{ + endpoints.MapControllerRoute( + name: "default", + pattern: "{controller=Home}/{action=Index}/{id?}"); + endpoints.MapControllerRoute( + name: "ActivateAccount", + pattern: "{controller=Account}/{action=ActivateAccount}/{activationCode?}"); +}); + +app.UseAntiforgery(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); +app.MapRazorComponents() + .AddInteractiveServerRenderMode() + .AddInteractiveWebAssemblyRenderMode() + .AddAdditionalAssemblies(typeof(TutorLizard.Blazor.Components._Imports).Assembly); + app.Run(); diff --git a/TutorLizard.Web/Services/UserAuthenticationService.cs b/TutorLizard.Web/Services/UserAuthenticationService.cs index c1c0519a..d63e1d57 100644 --- a/TutorLizard.Web/Services/UserAuthenticationService.cs +++ b/TutorLizard.Web/Services/UserAuthenticationService.cs @@ -1,8 +1,15 @@ using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.Extensions.Options; +using System.Net; +using System.Net.Mail; using System.Security.Claims; -using TutorLizard.BusinessLogic.Enums; +using TutorLizard.BusinessLogic.Interfaces.Data.Repositories; using TutorLizard.BusinessLogic.Interfaces.Services; +using TutorLizard.BusinessLogic.Models; +using TutorLizard.Shared.Enums; +using TutorLizard.Shared.Models.DTOs; +using TutorLizard.Web.Models; namespace TutorLizard.BusinessLogic.Services; @@ -10,15 +17,55 @@ public class UserAuthenticationService : IUserAuthenticationService { private readonly IHttpContextAccessor _httpContextAccessor; private readonly IUserService _userService; + private readonly EmailSettings _emailSettings; + private readonly IDbRepository _userRepository; - public UserAuthenticationService(IHttpContextAccessor httpContextAccessor, IUserService userService) + public UserAuthenticationService(IHttpContextAccessor httpContextAccessor, IUserService userService, IOptions emailSettings, IDbRepository userRepository) { _httpContextAccessor = httpContextAccessor; _userService = userService; + _emailSettings = emailSettings.Value; + _userRepository = userRepository; } - public async Task LogInAsync(string username, string password) + + public async Task LogInAsync(string username, string password) + { + var logInResult = await _userService.LogIn(username, password); + + if (logInResult.ResultCode == LogInResultCode.Success && logInResult.User != null) + { + var claims = new List + { + new Claim(ClaimTypes.Email, logInResult.User.Email), + new Claim(ClaimTypes.Name, logInResult.User.Name), + new Claim(ClaimTypes.NameIdentifier, logInResult.User.Id.ToString()), + new Claim(ClaimTypes.Role, logInResult.User.UserType.ToString()) + }; + + var claimsIdentity = new ClaimsIdentity( + claims, CookieAuthenticationDefaults.AuthenticationScheme); + + var authProperties = new AuthenticationProperties + { + AllowRefresh = true, + ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10), + IsPersistent = true, + }; + + if (_httpContextAccessor.HttpContext != null) + { + await _httpContextAccessor.HttpContext.SignInAsync("CookieAuth", + new ClaimsPrincipal(claimsIdentity), + authProperties); + } + } + + return logInResult; + } + + public async Task LogInWithGoogleAsync(string username, string googleId) { - var user = await _userService.LogIn(username, password); + var user = await _userService.LogInWithGoogle(username, googleId); if (user is null) { @@ -46,6 +93,7 @@ public async Task LogInAsync(string username, string password) if (_httpContextAccessor.HttpContext is null) return false; + await _httpContextAccessor.HttpContext.SignOutAsync(); await _httpContextAccessor.HttpContext.SignInAsync("CookieAuth", new ClaimsPrincipal(claimsIdentity), authProperties); @@ -61,9 +109,27 @@ public async Task LogOutAsync() await _httpContextAccessor.HttpContext.SignOutAsync("CookieAuth"); } - public Task RegisterUser(string username, UserType type, string email, string password) + public async Task<(bool, string)> RegisterUser(string username, UserType type, string email, string password) + { + string activationCode = GenerateActivationCode(); + bool result = await _userService.RegisterUser(username, type, email, password, activationCode); + + return (result, activationCode); + } + + private string GenerateActivationCode() + { + return Guid.NewGuid().ToString(); + } + + public Task RegisterUserWithGoogle(string username, string email, string googleId) + { + return _userService.RegisterUserWithGoogle(username, email, googleId); + } + + public async Task IsGoogleUserRegistered(string googleid) { - return _userService.RegisterUser(username, type, email, password); + return await _userService.IsTheGoogleUserRegistered(googleid); } public int? GetLoggedInUserId() @@ -84,4 +150,33 @@ public Task RegisterUser(string username, UserType type, string email, str } return userId; } + + public void SendActivationEmail(string userEmail, string activationCode) + { + var fromAddress = new MailAddress(_emailSettings.FromAddress, "Tutor Lizard"); + var toAddress = new MailAddress(userEmail); + var fromPassword = _emailSettings.FromPassword; + + string subject = "Aktywacja konta"; + string body = $"Cześć tu zespół Tutor Lizard, \naby aktywować swoje konto, kliknij poniższy link: {_emailSettings.ActivationLink}{activationCode}"; + + var smtp = new SmtpClient + { + Host = _emailSettings.Host, + Port = _emailSettings.Port, + EnableSsl = _emailSettings.EnableSsl, + DeliveryMethod = SmtpDeliveryMethod.Network, + UseDefaultCredentials = false, + Credentials = new NetworkCredential(fromAddress.Address, fromPassword) + }; + using (var message = new MailMessage(fromAddress, toAddress) + { + Subject = subject, + Body = body + }) + { + smtp.Send(message); + } + } + } diff --git a/TutorLizard.Web/TutorLizard.Web.csproj b/TutorLizard.Web/TutorLizard.Web.csproj index 7da994b3..33e87095 100644 --- a/TutorLizard.Web/TutorLizard.Web.csproj +++ b/TutorLizard.Web/TutorLizard.Web.csproj @@ -8,10 +8,13 @@ + + + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -25,7 +28,9 @@ + + diff --git a/TutorLizard.Web/ViewComponents/AdRequestStatusForAd.cs b/TutorLizard.Web/ViewComponents/AdRequestStatusForAd.cs index 86c88dbf..17578c10 100644 --- a/TutorLizard.Web/ViewComponents/AdRequestStatusForAd.cs +++ b/TutorLizard.Web/ViewComponents/AdRequestStatusForAd.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; using TutorLizard.BusinessLogic.Interfaces.Services; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; namespace TutorLizard.Web.ViewComponents; [ViewComponent(Name = nameof(AdRequestStatusForAd))] @@ -25,13 +25,13 @@ public async Task InvokeAsync(int adId) return View(); } - AdRequestStatusRequest request = new() + GetAdRequestStatusRequest request = new() { AdId = adId, StudentId = (int)studentId }; - AdRequestStatusResponse response = await _studentService.ViewAdRequestStatus(request); + GetAdRequestStatusResponse response = await _studentService.GetAdRequestStatus(request); if (!response.IsSuccessful) return View(); diff --git a/TutorLizard.Web/ViewComponents/AvailableScheduleForAd.cs b/TutorLizard.Web/ViewComponents/AvailableScheduleForAd.cs index c21c0b8f..7e456aab 100644 --- a/TutorLizard.Web/ViewComponents/AvailableScheduleForAd.cs +++ b/TutorLizard.Web/ViewComponents/AvailableScheduleForAd.cs @@ -1,8 +1,7 @@ -using Microsoft.AspNetCore.Http.HttpResults; -using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc; using TutorLizard.BusinessLogic.Interfaces.Services; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; namespace TutorLizard.Web.ViewComponents { @@ -22,13 +21,13 @@ public AvailableScheduleForAd(IStudentService studentService, public async Task InvokeAsync(int adId) { int? studentId = _userAuthenticationService.GetLoggedInUserId(); - if(studentId is null) + if (studentId is null) { return View(); } - AvailableScheduleForAdRequest request = new(adId, (int)studentId); + GetAvailableScheduleForAdRequest request = new(adId, (int)studentId); - AvailableScheduleForAdResponse response = await _studentService.GetAvailableScheduleForAd(request); + GetAvailableScheduleForAdResponse response = await _studentService.GetAvailableScheduleForAd(request); return View(response); } diff --git a/TutorLizard.Web/ViewComponents/CreateRequestForAd.cs b/TutorLizard.Web/ViewComponents/CreateRequestForAd.cs index 16009607..9e0fc738 100644 --- a/TutorLizard.Web/ViewComponents/CreateRequestForAd.cs +++ b/TutorLizard.Web/ViewComponents/CreateRequestForAd.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Mvc; using TutorLizard.BusinessLogic.Interfaces.Services; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Requests; namespace TutorLizard.Web.ViewComponents; diff --git a/TutorLizard.Web/ViewComponents/TutorsScheduleForAd.cs b/TutorLizard.Web/ViewComponents/TutorsScheduleForAd.cs index 82377139..f6720243 100644 --- a/TutorLizard.Web/ViewComponents/TutorsScheduleForAd.cs +++ b/TutorLizard.Web/ViewComponents/TutorsScheduleForAd.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc; using TutorLizard.BusinessLogic.Interfaces.Services; -using TutorLizard.BusinessLogic.Models.DTOs.Requests; -using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.Shared.Models.DTOs.Requests; +using TutorLizard.Shared.Models.DTOs.Responses; namespace TutorLizard.Web.ViewComponents; @@ -25,13 +25,13 @@ public async Task InvokeAsync(int adId) { return View(); } - TutorsScheduleForAdRequest request = new() + GetTutorsScheduleForAdRequest request = new() { AdId = adId, TutorId = (int)tutorId }; - TutorsScheduleForAdResponse response = await _tutorService.GetTutorsScheduleForAd(request); + GetTutorsScheduleForAdResponse response = await _tutorService.GetTutorsScheduleForAd(request); return View(response); } diff --git a/TutorLizard.Web/Views/Account/ActivateAccount.cshtml b/TutorLizard.Web/Views/Account/ActivateAccount.cshtml new file mode 100644 index 00000000..c11389f5 --- /dev/null +++ b/TutorLizard.Web/Views/Account/ActivateAccount.cshtml @@ -0,0 +1,6 @@ +@{ + ViewData["Title"] = "Aktywacja konta"; +} +

@ViewData["Title"]

+ +

Twoje konto zostało aktywowane.

\ No newline at end of file diff --git a/TutorLizard.Web/Views/Account/Login.cshtml b/TutorLizard.Web/Views/Account/Login.cshtml index 432986fd..8d831391 100644 --- a/TutorLizard.Web/Views/Account/Login.cshtml +++ b/TutorLizard.Web/Views/Account/Login.cshtml @@ -27,6 +27,14 @@ +
+
+

Login using Google

+
+ +
diff --git a/TutorLizard.Web/Views/Account/Register.cshtml b/TutorLizard.Web/Views/Account/Register.cshtml index 778877b6..16a771bb 100644 --- a/TutorLizard.Web/Views/Account/Register.cshtml +++ b/TutorLizard.Web/Views/Account/Register.cshtml @@ -32,6 +32,14 @@
+
+
+

Register using Google

+
+ +
diff --git a/TutorLizard.Web/Views/Shared/Components/AdRequestStatusForAd/Default.cshtml b/TutorLizard.Web/Views/Shared/Components/AdRequestStatusForAd/Default.cshtml index b6671dca..4fbdf119 100644 --- a/TutorLizard.Web/Views/Shared/Components/AdRequestStatusForAd/Default.cshtml +++ b/TutorLizard.Web/Views/Shared/Components/AdRequestStatusForAd/Default.cshtml @@ -1,4 +1,4 @@ -@model AdRequestStatusResponse? +@model GetAdRequestStatusResponse? @if(Model is not null) { @@ -6,15 +6,15 @@

Twoje zgłoszenie

Status zgłoszenia: - @if(Model.Status == AdRequestStatusResponse.RequestStatus.Accepted) + @if(Model.Status == GetAdRequestStatusResponse.RequestStatus.Accepted) { Zaakceptowane } - else if(Model.Status == AdRequestStatusResponse.RequestStatus.Pending) + else if(Model.Status == GetAdRequestStatusResponse.RequestStatus.Pending) { Oczekuje na akceptację } - else if (Model.Status == AdRequestStatusResponse.RequestStatus.Rejected) + else if (Model.Status == GetAdRequestStatusResponse.RequestStatus.Rejected) { Odrzucone } diff --git a/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml b/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml index 7bb8378f..78510ae8 100644 --- a/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml +++ b/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml @@ -1,5 +1,5 @@ -@using static TutorLizard.BusinessLogic.Models.DTOs.ScheduleItemDto -@model AvailableScheduleForAdResponse? +@using static TutorLizard.Shared.Models.DTOs.ScheduleItemDto +@model GetAvailableScheduleForAdResponse? @if (Model is not null) { @@ -29,15 +29,21 @@ { Nie wysłano
- @if (item.Status == ScheduleItemRequestStatus.RequestNotSent) - { -
- + + @if (Model.IsRemote) + { +
+ +
+ } + +
- }
}
diff --git a/TutorLizard.Web/Views/Shared/Components/TutorsScheduleForAd/Default.cshtml b/TutorLizard.Web/Views/Shared/Components/TutorsScheduleForAd/Default.cshtml index 8e95680f..40452629 100644 --- a/TutorLizard.Web/Views/Shared/Components/TutorsScheduleForAd/Default.cshtml +++ b/TutorLizard.Web/Views/Shared/Components/TutorsScheduleForAd/Default.cshtml @@ -1,4 +1,4 @@ -@model TutorsScheduleForAdResponse? +@model GetTutorsScheduleForAdResponse? @if(Model is not null) { diff --git a/TutorLizard.Web/Views/Shared/_Layout.cshtml b/TutorLizard.Web/Views/Shared/_Layout.cshtml index 31889f69..50d37d6e 100644 --- a/TutorLizard.Web/Views/Shared/_Layout.cshtml +++ b/TutorLizard.Web/Views/Shared/_Layout.cshtml @@ -75,6 +75,7 @@ + @await RenderSectionAsync("Scripts", required: false) diff --git a/TutorLizard.Web/Views/Student/AcceptedAds.cshtml b/TutorLizard.Web/Views/Student/AcceptedAds.cshtml index 80d80d90..bd8874c5 100644 --- a/TutorLizard.Web/Views/Student/AcceptedAds.cshtml +++ b/TutorLizard.Web/Views/Student/AcceptedAds.cshtml @@ -1,4 +1,4 @@ -@model StudentsAcceptedAdsResponse +@model GetStudentsAcceptedAdsResponse @{ ViewData["Title"] = "AcceptedAds"; } diff --git a/TutorLizard.Web/Views/Student/AdRequests.cshtml b/TutorLizard.Web/Views/Student/AdRequests.cshtml index aca3ae58..abc10327 100644 --- a/TutorLizard.Web/Views/Student/AdRequests.cshtml +++ b/TutorLizard.Web/Views/Student/AdRequests.cshtml @@ -1,4 +1,4 @@ -@model StudentsAdRequestsResponse +@model GetStudentsAdRequestsResponse @{ ViewData["Title"] = "AdRequests"; } diff --git a/TutorLizard.Web/Views/Tutor/TutorsAdsList.cshtml b/TutorLizard.Web/Views/Tutor/TutorsAdsList.cshtml index baca6a07..851855eb 100644 --- a/TutorLizard.Web/Views/Tutor/TutorsAdsList.cshtml +++ b/TutorLizard.Web/Views/Tutor/TutorsAdsList.cshtml @@ -1,4 +1,4 @@ -@model TutorsAdsResponse +@model GetTutorsAdsResponse @{ ViewData["Title"] = "AdsList"; } diff --git a/TutorLizard.Web/Views/Tutor/ViewAllAdRequests.cshtml b/TutorLizard.Web/Views/Tutor/ViewAllAdRequests.cshtml index 273e0c54..c5e386a4 100644 --- a/TutorLizard.Web/Views/Tutor/ViewAllAdRequests.cshtml +++ b/TutorLizard.Web/Views/Tutor/ViewAllAdRequests.cshtml @@ -1,4 +1,4 @@ -@model TutorAllAdRequestsResponse +@model GetTutorsAllAdRequestsResponse @{ ViewData["Title"] = "ViewAdRequests"; diff --git a/TutorLizard.Web/Views/Tutor/ViewPendingAdRequests.cshtml b/TutorLizard.Web/Views/Tutor/ViewPendingAdRequests.cshtml index ff0aeef5..098f63d2 100644 --- a/TutorLizard.Web/Views/Tutor/ViewPendingAdRequests.cshtml +++ b/TutorLizard.Web/Views/Tutor/ViewPendingAdRequests.cshtml @@ -1,4 +1,4 @@ -@model TutorsPendingAdRequestsResponse +@model GetTutorsPendingAdRequestsResponse @{ ViewData["Title"] = "ViewPendingAdRequests"; diff --git a/TutorLizard.Web/Views/_ViewImports.cshtml b/TutorLizard.Web/Views/_ViewImports.cshtml index d8560b62..828b4f9d 100644 --- a/TutorLizard.Web/Views/_ViewImports.cshtml +++ b/TutorLizard.Web/Views/_ViewImports.cshtml @@ -1,10 +1,11 @@ @using TutorLizard.Web @using TutorLizard.Web.Models -@using TutorLizard.BusinessLogic.Enums +@using TutorLizard.Web.Strings @using TutorLizard.BusinessLogic.Models @using TutorLizard.BusinessLogic.Interfaces.Data.Repositories -@using TutorLizard.BusinessLogic.Models.DTOs -@using TutorLizard.BusinessLogic.Models.DTOs.Responses -@using TutorLizard.BusinessLogic.Models.DTOs.Requests -@using TutorLizard.Web.Strings +@using TutorLizard.Shared.Enums +@using TutorLizard.Shared.Models.DTOs +@using TutorLizard.Shared.Models.DTOs.Responses +@using TutorLizard.Shared.Models.DTOs.Requests +@using TutorLizard.Blazor.Components @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/TutorLizard.Web/appsettings.json b/TutorLizard.Web/appsettings.json index 91103fa9..816d75ab 100644 --- a/TutorLizard.Web/appsettings.json +++ b/TutorLizard.Web/appsettings.json @@ -28,5 +28,11 @@ }, "ConnectionStrings": { "Default": "" + }, + "Auth": { + "Google": { + "ClientId": "placeholder", + "ClientSecret": "placeholder" + } } } diff --git a/TutorLizard.sln b/TutorLizard.sln index af681556..e082ce82 100644 --- a/TutorLizard.sln +++ b/TutorLizard.sln @@ -9,9 +9,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TutorLizard.Web", "TutorLiz EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{DD9B1FDE-1E39-4C45-A1A0-8D3AE694CB2F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TutorLizard.BusinessLogic.Tests", "Tests\TutorLizard.BusinessLogic.Tests\TutorLizard.BusinessLogic.Tests.csproj", "{1F175297-3AF6-430A-B36E-353FC1B9F9F1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TutorLizard.BusinessLogic.Tests", "Tests\TutorLizard.BusinessLogic.Tests\TutorLizard.BusinessLogic.Tests.csproj", "{1F175297-3AF6-430A-B36E-353FC1B9F9F1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TutorLizard.Web.Tests", "Tests\TutorLizard.Web.Tests\TutorLizard.Web.Tests.csproj", "{8CA651DA-9229-4722-80D0-6F49E06DDBD3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TutorLizard.Web.Tests", "Tests\TutorLizard.Web.Tests\TutorLizard.Web.Tests.csproj", "{8CA651DA-9229-4722-80D0-6F49E06DDBD3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TutorLizard.Blazor", "TutorLizard.Blazor\TutorLizard.Blazor.csproj", "{C178E212-D193-4128-B9E4-C77341B478BE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TutorLizard.Shared", "TutorLizard.Shared\TutorLizard.Shared.csproj", "{FA2E2928-556A-4868-8C47-50D371E17580}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -35,6 +39,14 @@ Global {8CA651DA-9229-4722-80D0-6F49E06DDBD3}.Debug|Any CPU.Build.0 = Debug|Any CPU {8CA651DA-9229-4722-80D0-6F49E06DDBD3}.Release|Any CPU.ActiveCfg = Release|Any CPU {8CA651DA-9229-4722-80D0-6F49E06DDBD3}.Release|Any CPU.Build.0 = Release|Any CPU + {C178E212-D193-4128-B9E4-C77341B478BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C178E212-D193-4128-B9E4-C77341B478BE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C178E212-D193-4128-B9E4-C77341B478BE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C178E212-D193-4128-B9E4-C77341B478BE}.Release|Any CPU.Build.0 = Release|Any CPU + {FA2E2928-556A-4868-8C47-50D371E17580}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FA2E2928-556A-4868-8C47-50D371E17580}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FA2E2928-556A-4868-8C47-50D371E17580}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FA2E2928-556A-4868-8C47-50D371E17580}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE