From 98e17766b203734a1817eed94338e2d25f4395f7 Mon Sep 17 00:00:00 2001 From: transtrike Date: Sat, 13 Feb 2021 16:20:18 +0200 Subject: Project Restructure P.1 --- .../DevHive.Common.Models/DevHive.Common.csproj | 15 + .../DevHive.Common.Models/Identity/TokenModel.cs | 12 + src/Common/DevHive.Common.Models/Misc/IdModel.cs | 9 + .../Misc/PasswordModifications.cs | 13 + src/Common/DevHive.Common.Models/Misc/Patch.cs | 9 + src/Data/DevHive.Data.Models/Comment.cs | 20 + .../DevHive.Data.Models/DevHive.Data.Models.csproj | 11 + src/Data/DevHive.Data.Models/Language.cs | 15 + src/Data/DevHive.Data.Models/Post.cs | 26 + src/Data/DevHive.Data.Models/ProfilePicture.cs | 15 + src/Data/DevHive.Data.Models/Rating.cs | 17 + src/Data/DevHive.Data.Models/Role.cs | 17 + src/Data/DevHive.Data.Models/Technology.cs | 15 + src/Data/DevHive.Data.Models/User.cs | 33 + .../DevHive.Data.Tests/CommentRepository.Tests.cs | 99 +++ .../DevHive.Data.Tests/DevHive.Data.Tests.csproj | 29 + .../DevHive.Data.Tests/FeedRepository.Tests.cs | 119 ++++ .../DevHive.Data.Tests/LenguageRepository.Tests.cs | 116 ++++ .../DevHive.Data.Tests/PostRepository.Tests.cs | 145 +++++ .../DevHive.Data.Tests/RoleRepository.Tests.cs | 119 ++++ .../TechnologyRepository.Tests.cs | 118 ++++ src/Data/DevHive.Data.Tests/UserRepositoryTests.cs | 350 +++++++++++ src/Data/DevHive.Data/ConnectionString.json | 5 + src/Data/DevHive.Data/DevHive.Data.csproj | 34 + src/Data/DevHive.Data/DevHiveContext.cs | 115 ++++ src/Data/DevHive.Data/DevHiveContextFactory.cs | 23 + .../DevHive.Data/Interfaces/Models/IComment.cs | 16 + .../DevHive.Data/Interfaces/Models/ILanguage.cs | 11 + src/Data/DevHive.Data/Interfaces/Models/IModel.cs | 9 + src/Data/DevHive.Data/Interfaces/Models/IPost.cs | 22 + .../Interfaces/Models/IProfilePicture.cs | 13 + src/Data/DevHive.Data/Interfaces/Models/IRating.cs | 14 + src/Data/DevHive.Data/Interfaces/Models/IRole.cs | 10 + .../DevHive.Data/Interfaces/Models/ITechnology.cs | 11 + src/Data/DevHive.Data/Interfaces/Models/IUser.cs | 21 + .../Interfaces/Repositories/ICommentRepository.cs | 16 + .../Interfaces/Repositories/IFeedRepository.cs | 13 + .../Interfaces/Repositories/ILanguageRepository.cs | 17 + .../Interfaces/Repositories/IPostRepository.cs | 19 + .../Interfaces/Repositories/IRatingRepository.cs | 13 + .../Interfaces/Repositories/IRepository.cs | 21 + .../Interfaces/Repositories/IRoleRepository.cs | 15 + .../Repositories/ITechnologyRepository.cs | 17 + .../Interfaces/Repositories/IUserRepository.cs | 22 + .../Migrations/20210205140955_rating.Designer.cs | 665 ++++++++++++++++++++ .../Migrations/20210205140955_rating.cs | 581 +++++++++++++++++ .../20210205150447_Friends_Init_Config.Designer.cs | 643 +++++++++++++++++++ .../20210205150447_Friends_Init_Config.cs | 45 ++ .../20210205154810_PostFileAttachments.Designer.cs | 691 +++++++++++++++++++++ .../20210205154810_PostFileAttachments.cs | 51 ++ .../20210205160520_Friends_First_Tweek.Designer.cs | 609 ++++++++++++++++++ .../20210205160520_Friends_First_Tweek.cs | 46 ++ .../Migrations/DevHiveContextModelSnapshot.cs | 658 ++++++++++++++++++++ .../DevHive.Data/RelationModels/PostAttachments.cs | 16 + src/Data/DevHive.Data/RelationModels/RatedPost.cs | 18 + src/Data/DevHive.Data/RelationModels/UserRate.cs | 18 + .../DevHive.Data/Repositories/BaseRepository.cs | 59 ++ .../DevHive.Data/Repositories/CommentRepository.cs | 74 +++ .../DevHive.Data/Repositories/FeedRepository.cs | 77 +++ .../Repositories/LanguageRepository.cs | 53 ++ .../DevHive.Data/Repositories/PostRepository.cs | 105 ++++ .../DevHive.Data/Repositories/RatingRepository.cs | 35 ++ .../DevHive.Data/Repositories/RoleRepository.cs | 55 ++ .../Repositories/TechnologyRepository.cs | 53 ++ .../DevHive.Data/Repositories/UserRepository.cs | 108 ++++ src/DevHive.Common/DevHive.Common.csproj | 15 - src/DevHive.Common/Models/Identity/TokenModel.cs | 12 - src/DevHive.Common/Models/Misc/IdModel.cs | 9 - .../Models/Misc/PasswordModifications.cs | 13 - src/DevHive.Common/Models/Misc/Patch.cs | 9 - src/DevHive.Data/ConnectionString.json | 5 - src/DevHive.Data/DevHive.Data.csproj | 30 - src/DevHive.Data/DevHiveContext.cs | 115 ---- src/DevHive.Data/DevHiveContextFactory.cs | 23 - src/DevHive.Data/Interfaces/Models/IComment.cs | 16 - src/DevHive.Data/Interfaces/Models/ILanguage.cs | 11 - src/DevHive.Data/Interfaces/Models/IModel.cs | 9 - src/DevHive.Data/Interfaces/Models/IPost.cs | 22 - .../Interfaces/Models/IProfilePicture.cs | 13 - src/DevHive.Data/Interfaces/Models/IRating.cs | 14 - src/DevHive.Data/Interfaces/Models/IRole.cs | 10 - src/DevHive.Data/Interfaces/Models/ITechnology.cs | 11 - src/DevHive.Data/Interfaces/Models/IUser.cs | 21 - .../Interfaces/Repositories/ICommentRepository.cs | 16 - .../Interfaces/Repositories/IFeedRepository.cs | 13 - .../Interfaces/Repositories/ILanguageRepository.cs | 17 - .../Interfaces/Repositories/IPostRepository.cs | 19 - .../Interfaces/Repositories/IRatingRepository.cs | 13 - .../Interfaces/Repositories/IRepository.cs | 21 - .../Interfaces/Repositories/IRoleRepository.cs | 15 - .../Repositories/ITechnologyRepository.cs | 17 - .../Interfaces/Repositories/IUserRepository.cs | 22 - .../Migrations/20210205140955_rating.Designer.cs | 665 -------------------- .../Migrations/20210205140955_rating.cs | 581 ----------------- .../20210205150447_Friends_Init_Config.Designer.cs | 643 ------------------- .../20210205150447_Friends_Init_Config.cs | 45 -- .../20210205154810_PostFileAttachments.Designer.cs | 691 --------------------- .../20210205154810_PostFileAttachments.cs | 51 -- .../20210205160520_Friends_First_Tweek.Designer.cs | 609 ------------------ .../20210205160520_Friends_First_Tweek.cs | 46 -- .../Migrations/DevHiveContextModelSnapshot.cs | 658 -------------------- src/DevHive.Data/Models/Comment.cs | 20 - src/DevHive.Data/Models/Language.cs | 15 - src/DevHive.Data/Models/Post.cs | 26 - src/DevHive.Data/Models/ProfilePicture.cs | 15 - src/DevHive.Data/Models/Rating.cs | 17 - src/DevHive.Data/Models/Role.cs | 17 - src/DevHive.Data/Models/Technology.cs | 15 - src/DevHive.Data/Models/User.cs | 33 - src/DevHive.Data/RelationModels/PostAttachments.cs | 16 - src/DevHive.Data/RelationModels/RatedPost.cs | 18 - src/DevHive.Data/RelationModels/UserRate.cs | 18 - src/DevHive.Data/Repositories/BaseRepository.cs | 59 -- src/DevHive.Data/Repositories/CommentRepository.cs | 74 --- src/DevHive.Data/Repositories/FeedRepository.cs | 77 --- .../Repositories/LanguageRepository.cs | 53 -- src/DevHive.Data/Repositories/PostRepository.cs | 105 ---- src/DevHive.Data/Repositories/RatingRepository.cs | 35 -- src/DevHive.Data/Repositories/RoleRepository.cs | 55 -- .../Repositories/TechnologyRepository.cs | 53 -- src/DevHive.Data/Repositories/UserRepository.cs | 108 ---- .../Configurations/Mapping/CommentMappings.cs | 27 - .../Configurations/Mapping/FeedMappings.cs | 11 - .../Configurations/Mapping/LanguageMappings.cs | 22 - .../Configurations/Mapping/PostMappings.cs | 33 - .../Configurations/Mapping/RatingMappings.cs | 15 - .../Configurations/Mapping/RoleMapings.cs | 19 - .../Configurations/Mapping/TechnologyMappings.cs | 21 - .../Configurations/Mapping/UserMappings.cs | 31 - src/DevHive.Services/DevHive.Services.csproj | 29 - src/DevHive.Services/Interfaces/ICloudService.cs | 16 - src/DevHive.Services/Interfaces/ICommentService.cs | 20 - src/DevHive.Services/Interfaces/IFeedService.cs | 11 - .../Interfaces/ILanguageService.cs | 19 - src/DevHive.Services/Interfaces/IPostService.cs | 20 - src/DevHive.Services/Interfaces/IRateService.cs | 14 - src/DevHive.Services/Interfaces/IRoleService.cs | 17 - .../Interfaces/ITechnologyService.cs | 19 - src/DevHive.Services/Interfaces/IUserService.cs | 25 - .../Models/Comment/CreateCommentServiceModel.cs | 13 - .../Models/Comment/ReadCommentServiceModel.cs | 21 - .../Models/Comment/UpdateCommentServiceModel.cs | 15 - .../Models/Feed/GetPageServiceModel.cs | 17 - .../Models/Feed/ReadPageServiceModel.cs | 10 - .../Models/Identity/Role/CreateRoleServiceModel.cs | 10 - .../Models/Identity/Role/RoleServiceModel.cs | 7 - .../Models/Identity/Role/UpdateRoleServiceModel.cs | 10 - .../Models/Identity/User/BaseUserServiceModel.cs | 10 - .../Models/Identity/User/FriendServiceModel.cs | 10 - .../Models/Identity/User/LoginServiceModel.cs | 8 - .../Identity/User/ProfilePictureServiceModel.cs | 7 - .../Models/Identity/User/RegisterServiceModel.cs | 15 - .../Identity/User/UpdateFriendServiceModel.cs | 10 - .../User/UpdateProfilePictureServiceModel.cs | 12 - .../Models/Identity/User/UpdateUserServiceModel.cs | 26 - .../Models/Identity/User/UserServiceModel.cs | 23 - .../Models/Language/CreateLanguageServiceModel.cs | 9 - .../Models/Language/LanguageServiceModel.cs | 9 - .../Models/Language/ReadLanguageServiceModel.cs | 11 - .../Models/Language/UpdateLanguageServiceModel.cs | 11 - .../Models/Post/CreatePostServiceModel.cs | 15 - .../Models/Post/Rating/RatePostServiceModel.cs | 13 - .../Post/Rating/ReadPostRatingServiceModel.cs | 15 - .../Models/Post/ReadPostServiceModel.cs | 26 - .../Models/Post/UpdatePostServiceModel.cs | 17 - .../Technology/CreateTechnologyServiceModel.cs | 9 - .../Technology/ReadTechnologyServiceModel.cs | 11 - .../Models/Technology/TechnologyServiceModel.cs | 9 - .../Technology/UpdateTechnologyServiceModel.cs | 11 - src/DevHive.Services/Options/JWTOptions.cs | 14 - src/DevHive.Services/Services/CloudinaryService.cs | 53 -- src/DevHive.Services/Services/CommentService.cs | 169 ----- src/DevHive.Services/Services/FeedService.cs | 84 --- src/DevHive.Services/Services/LanguageService.cs | 89 --- src/DevHive.Services/Services/PostService.cs | 239 ------- src/DevHive.Services/Services/RateService.cs | 80 --- src/DevHive.Services/Services/RoleService.cs | 70 --- src/DevHive.Services/Services/TechnologyService.cs | 90 --- src/DevHive.Services/Services/UserService.cs | 382 ------------ .../DevHive.Data.Tests/CommentRepository.Tests.cs | 99 --- .../DevHive.Data.Tests/DevHive.Data.Tests.csproj | 25 - .../DevHive.Data.Tests/FeedRepository.Tests.cs | 119 ---- .../DevHive.Data.Tests/LenguageRepository.Tests.cs | 116 ---- .../DevHive.Data.Tests/PostRepository.Tests.cs | 145 ----- .../DevHive.Data.Tests/RoleRepository.Tests.cs | 119 ---- .../TechnologyRepository.Tests.cs | 118 ---- .../DevHive.Data.Tests/UserRepositoryTests.cs | 350 ----------- .../DevHive.Services.Tests/CommentService.Tests.cs | 262 -------- .../DevHive.Services.Tests.csproj | 25 - .../DevHive.Services.Tests/FeedService.Tests.cs | 155 ----- .../LanguageService.Tests.cs | 262 -------- .../DevHive.Services.Tests/PostService.Tests.cs | 271 -------- .../DevHive.Services.Tests/RoleService.Tests.cs | 230 ------- .../TechnologyServices.Tests.cs | 262 -------- .../DevHive.Services.Tests/UserService.Tests.cs | 394 ------------ .../DevHive.Web.Tests/CommentController.Tests.cs | 256 -------- .../DevHive.Web.Tests/DevHive.Web.Tests.csproj | 24 - .../DevHive.Web.Tests/FeedController.Tests.cs | 98 --- .../DevHive.Web.Tests/LanguageController.Tests.cs | 201 ------ .../DevHive.Web.Tests/PostController.Tests.cs | 248 -------- .../DevHive.Web.Tests/RoleController.Tests.cs | 201 ------ .../TechnologyController.Tests.cs | 204 ------ .../DevHive.Web.Tests/UserController.Tests.cs | 257 -------- .../Attributes/GoodPasswordModelValidation.cs | 24 - .../Attributes/OnlyLettersModelValidation.cs | 20 - .../Extensions/ConfigureAutoMapper.cs | 24 - .../Configurations/Extensions/ConfigureDatabase.cs | 70 --- .../Extensions/ConfigureDependencyInjection.cs | 38 -- .../ConfigureExceptionHandlerMiddleware.cs | 16 - .../Configurations/Extensions/ConfigureJWT.cs | 54 -- .../Configurations/Extensions/ConfigureSwagger.cs | 23 - .../Configurations/Mapping/CommentMappings.cs | 17 - .../Configurations/Mapping/FeedMappings.cs | 18 - .../Configurations/Mapping/LanguageMappings.cs | 23 - .../Configurations/Mapping/PostMappings.cs | 17 - .../Configurations/Mapping/RatingMappings.cs | 16 - .../Configurations/Mapping/RoleMappings.cs | 21 - .../Configurations/Mapping/TechnologyMappings.cs | 23 - .../Configurations/Mapping/UserMappings.cs | 33 - src/DevHive.Web/Controllers/CommentController.cs | 83 --- src/DevHive.Web/Controllers/FeedController.cs | 54 -- src/DevHive.Web/Controllers/LanguageController.cs | 87 --- src/DevHive.Web/Controllers/PostController.cs | 89 --- src/DevHive.Web/Controllers/RateController.cs | 40 -- src/DevHive.Web/Controllers/RoleController.cs | 77 --- .../Controllers/TechnologyController.cs | 87 --- src/DevHive.Web/Controllers/UserController.cs | 140 ----- src/DevHive.Web/DevHive.Web.csproj | 27 - src/DevHive.Web/Middleware/ExceptionMiddleware.cs | 50 -- .../Models/Comment/CreateCommentWebModel.cs | 17 - .../Models/Comment/ReadCommentWebModel.cs | 21 - .../Models/Comment/UpdateCommentWebModel.cs | 13 - src/DevHive.Web/Models/Feed/GetPageWebModel.cs | 19 - src/DevHive.Web/Models/Feed/ReadPageWebModel.cs | 10 - .../Models/Identity/Role/CreateRoleWebModel.cs | 14 - .../Models/Identity/Role/RoleWebModel.cs | 14 - .../Models/Identity/Role/UpdateRoleWebModel.cs | 15 - .../Models/Identity/User/BaseUserWebModel.cs | 34 - .../Models/Identity/User/LoginWebModel.cs | 20 - .../Models/Identity/User/ProfilePictureWebModel.cs | 7 - .../Models/Identity/User/RegisterWebModel.cs | 14 - .../Models/Identity/User/TokenWebModel.cs | 12 - .../Identity/User/UpdateProfilePictureWebModel.cs | 9 - .../Models/Identity/User/UpdateUserWebModel.cs | 34 - .../Models/Identity/User/UserWebModel.cs | 33 - .../Models/Identity/User/UsernameWebModel.cs | 15 - .../Models/Language/CreateLanguageWebModel.cs | 14 - .../Models/Language/LanguageWebModel.cs | 13 - .../Models/Language/ReadLanguageWebModel.cs | 11 - .../Models/Language/UpdateLanguageWebModel.cs | 14 - src/DevHive.Web/Models/Post/CreatePostWebModel.cs | 16 - .../Models/Post/Rating/RatePostWebModel.cs | 11 - .../Models/Post/Rating/ReadPostRatingWebModel.cs | 15 - src/DevHive.Web/Models/Post/ReadPostWebModel.cs | 26 - src/DevHive.Web/Models/Post/UpdatePostWebModel.cs | 21 - .../Models/Technology/CreateTechnologyWebModel.cs | 14 - .../Models/Technology/ReadTechnologyWebModel.cs | 11 - .../Models/Technology/TechnologyWebModel.cs | 13 - .../Models/Technology/UpdateTechnologyWebModel.cs | 15 - src/DevHive.Web/Program.cs | 23 - src/DevHive.Web/Properties/launchSettings.json | 36 -- src/DevHive.Web/Startup.cs | 70 --- src/DevHive.Web/appsettings.json | 20 - src/DevHive.code-workspace | 44 +- src/DevHive.sln | 253 +++++--- .../Comment/CreateCommentServiceModel.cs | 13 + .../Comment/ReadCommentServiceModel.cs | 21 + .../Comment/UpdateCommentServiceModel.cs | 15 + .../DevHive.Services.Models.csproj | 11 + .../Feed/GetPageServiceModel.cs | 17 + .../Feed/ReadPageServiceModel.cs | 10 + .../Identity/Role/CreateRoleServiceModel.cs | 10 + .../Identity/Role/RoleServiceModel.cs | 7 + .../Identity/Role/UpdateRoleServiceModel.cs | 10 + .../Identity/User/BaseUserServiceModel.cs | 10 + .../Identity/User/FriendServiceModel.cs | 10 + .../Identity/User/LoginServiceModel.cs | 8 + .../Identity/User/ProfilePictureServiceModel.cs | 7 + .../Identity/User/RegisterServiceModel.cs | 15 + .../Identity/User/UpdateFriendServiceModel.cs | 10 + .../User/UpdateProfilePictureServiceModel.cs | 12 + .../Identity/User/UpdateUserServiceModel.cs | 26 + .../Identity/User/UserServiceModel.cs | 23 + .../Language/CreateLanguageServiceModel.cs | 9 + .../Language/LanguageServiceModel.cs | 9 + .../Language/ReadLanguageServiceModel.cs | 11 + .../Language/UpdateLanguageServiceModel.cs | 11 + .../Post/CreatePostServiceModel.cs | 15 + .../Post/Rating/RatePostServiceModel.cs | 13 + .../Post/Rating/ReadPostRatingServiceModel.cs | 15 + .../Post/ReadPostServiceModel.cs | 26 + .../Post/UpdatePostServiceModel.cs | 17 + .../Technology/CreateTechnologyServiceModel.cs | 9 + .../Technology/ReadTechnologyServiceModel.cs | 11 + .../Technology/TechnologyServiceModel.cs | 9 + .../Technology/UpdateTechnologyServiceModel.cs | 11 + .../DevHive.Services.Tests/CommentService.Tests.cs | 262 ++++++++ .../DevHive.Services.Tests.csproj | 29 + .../DevHive.Services.Tests/FeedService.Tests.cs | 155 +++++ .../LanguageService.Tests.cs | 262 ++++++++ .../DevHive.Services.Tests/PostService.Tests.cs | 271 ++++++++ .../DevHive.Services.Tests/RoleService.Tests.cs | 230 +++++++ .../TechnologyServices.Tests.cs | 262 ++++++++ .../DevHive.Services.Tests/UserService.Tests.cs | 394 ++++++++++++ .../Configurations/Mapping/CommentMappings.cs | 27 + .../Configurations/Mapping/FeedMappings.cs | 11 + .../Configurations/Mapping/LanguageMappings.cs | 22 + .../Configurations/Mapping/PostMappings.cs | 33 + .../Configurations/Mapping/RatingMappings.cs | 15 + .../Configurations/Mapping/RoleMapings.cs | 19 + .../Configurations/Mapping/TechnologyMappings.cs | 21 + .../Configurations/Mapping/UserMappings.cs | 31 + .../DevHive.Services/DevHive.Services.csproj | 31 + .../DevHive.Services/Interfaces/ICloudService.cs | 16 + .../DevHive.Services/Interfaces/ICommentService.cs | 20 + .../DevHive.Services/Interfaces/IFeedService.cs | 11 + .../Interfaces/ILanguageService.cs | 19 + .../DevHive.Services/Interfaces/IPostService.cs | 20 + .../DevHive.Services/Interfaces/IRateService.cs | 14 + .../DevHive.Services/Interfaces/IRoleService.cs | 17 + .../Interfaces/ITechnologyService.cs | 19 + .../DevHive.Services/Interfaces/IUserService.cs | 25 + .../DevHive.Services/Options/JWTOptions.cs | 14 + .../DevHive.Services/Services/CloudinaryService.cs | 53 ++ .../DevHive.Services/Services/CommentService.cs | 169 +++++ .../DevHive.Services/Services/FeedService.cs | 84 +++ .../DevHive.Services/Services/LanguageService.cs | 89 +++ .../DevHive.Services/Services/PostService.cs | 239 +++++++ .../DevHive.Services/Services/RateService.cs | 80 +++ .../DevHive.Services/Services/RoleService.cs | 70 +++ .../DevHive.Services/Services/TechnologyService.cs | 90 +++ .../DevHive.Services/Services/UserService.cs | 382 ++++++++++++ .../Comment/CreateCommentWebModel.cs | 17 + .../Comment/ReadCommentWebModel.cs | 21 + .../Comment/UpdateCommentWebModel.cs | 13 + .../DevHive.Web.Models/DevHive.Web.Models.csproj | 14 + src/Web/DevHive.Web.Models/Feed/GetPageWebModel.cs | 19 + .../DevHive.Web.Models/Feed/ReadPageWebModel.cs | 10 + .../Identity/Role/CreateRoleWebModel.cs | 14 + .../Identity/Role/RoleWebModel.cs | 14 + .../Identity/Role/UpdateRoleWebModel.cs | 15 + .../Identity/User/BaseUserWebModel.cs | 34 + .../Identity/User/LoginWebModel.cs | 20 + .../Identity/User/ProfilePictureWebModel.cs | 7 + .../Identity/User/RegisterWebModel.cs | 14 + .../Identity/User/TokenWebModel.cs | 12 + .../Identity/User/UpdateProfilePictureWebModel.cs | 9 + .../Identity/User/UpdateUserWebModel.cs | 34 + .../Identity/User/UserWebModel.cs | 33 + .../Identity/User/UsernameWebModel.cs | 15 + .../Language/CreateLanguageWebModel.cs | 14 + .../Language/LanguageWebModel.cs | 13 + .../Language/ReadLanguageWebModel.cs | 11 + .../Language/UpdateLanguageWebModel.cs | 14 + .../DevHive.Web.Models/Post/CreatePostWebModel.cs | 16 + .../Post/Rating/RatePostWebModel.cs | 11 + .../Post/Rating/ReadPostRatingWebModel.cs | 15 + .../DevHive.Web.Models/Post/ReadPostWebModel.cs | 26 + .../DevHive.Web.Models/Post/UpdatePostWebModel.cs | 21 + .../Technology/CreateTechnologyWebModel.cs | 14 + .../Technology/ReadTechnologyWebModel.cs | 11 + .../Technology/TechnologyWebModel.cs | 13 + .../Technology/UpdateTechnologyWebModel.cs | 15 + .../DevHive.Web.Tests/CommentController.Tests.cs | 256 ++++++++ src/Web/DevHive.Web.Tests/DevHive.Web.Tests.csproj | 27 + src/Web/DevHive.Web.Tests/FeedController.Tests.cs | 98 +++ .../DevHive.Web.Tests/LanguageController.Tests.cs | 201 ++++++ src/Web/DevHive.Web.Tests/PostController.Tests.cs | 248 ++++++++ src/Web/DevHive.Web.Tests/RoleController.Tests.cs | 201 ++++++ .../TechnologyController.Tests.cs | 204 ++++++ src/Web/DevHive.Web.Tests/UserController.Tests.cs | 257 ++++++++ .../Attributes/GoodPasswordModelValidation.cs | 24 + .../Attributes/OnlyLettersModelValidation.cs | 20 + .../Extensions/ConfigureAutoMapper.cs | 24 + .../Configurations/Extensions/ConfigureDatabase.cs | 70 +++ .../Extensions/ConfigureDependencyInjection.cs | 38 ++ .../ConfigureExceptionHandlerMiddleware.cs | 16 + .../Configurations/Extensions/ConfigureJWT.cs | 54 ++ .../Configurations/Extensions/ConfigureSwagger.cs | 23 + .../Configurations/Mapping/CommentMappings.cs | 17 + .../Configurations/Mapping/FeedMappings.cs | 18 + .../Configurations/Mapping/LanguageMappings.cs | 23 + .../Configurations/Mapping/PostMappings.cs | 17 + .../Configurations/Mapping/RatingMappings.cs | 16 + .../Configurations/Mapping/RoleMappings.cs | 21 + .../Configurations/Mapping/TechnologyMappings.cs | 23 + .../Configurations/Mapping/UserMappings.cs | 33 + .../DevHive.Web/Controllers/CommentController.cs | 83 +++ src/Web/DevHive.Web/Controllers/FeedController.cs | 54 ++ .../DevHive.Web/Controllers/LanguageController.cs | 87 +++ src/Web/DevHive.Web/Controllers/PostController.cs | 89 +++ src/Web/DevHive.Web/Controllers/RateController.cs | 40 ++ src/Web/DevHive.Web/Controllers/RoleController.cs | 77 +++ .../Controllers/TechnologyController.cs | 87 +++ src/Web/DevHive.Web/Controllers/UserController.cs | 140 +++++ src/Web/DevHive.Web/DevHive.Web.csproj | 30 + .../DevHive.Web/Middleware/ExceptionMiddleware.cs | 50 ++ src/Web/DevHive.Web/Program.cs | 23 + src/Web/DevHive.Web/Properties/launchSettings.json | 36 ++ src/Web/DevHive.Web/Startup.cs | 70 +++ src/Web/DevHive.Web/appsettings.json | 20 + 401 files changed, 13844 insertions(+), 13737 deletions(-) create mode 100644 src/Common/DevHive.Common.Models/DevHive.Common.csproj create mode 100644 src/Common/DevHive.Common.Models/Identity/TokenModel.cs create mode 100644 src/Common/DevHive.Common.Models/Misc/IdModel.cs create mode 100644 src/Common/DevHive.Common.Models/Misc/PasswordModifications.cs create mode 100644 src/Common/DevHive.Common.Models/Misc/Patch.cs create mode 100644 src/Data/DevHive.Data.Models/Comment.cs create mode 100644 src/Data/DevHive.Data.Models/DevHive.Data.Models.csproj create mode 100644 src/Data/DevHive.Data.Models/Language.cs create mode 100644 src/Data/DevHive.Data.Models/Post.cs create mode 100644 src/Data/DevHive.Data.Models/ProfilePicture.cs create mode 100644 src/Data/DevHive.Data.Models/Rating.cs create mode 100644 src/Data/DevHive.Data.Models/Role.cs create mode 100644 src/Data/DevHive.Data.Models/Technology.cs create mode 100644 src/Data/DevHive.Data.Models/User.cs create mode 100644 src/Data/DevHive.Data.Tests/CommentRepository.Tests.cs create mode 100644 src/Data/DevHive.Data.Tests/DevHive.Data.Tests.csproj create mode 100644 src/Data/DevHive.Data.Tests/FeedRepository.Tests.cs create mode 100644 src/Data/DevHive.Data.Tests/LenguageRepository.Tests.cs create mode 100644 src/Data/DevHive.Data.Tests/PostRepository.Tests.cs create mode 100644 src/Data/DevHive.Data.Tests/RoleRepository.Tests.cs create mode 100644 src/Data/DevHive.Data.Tests/TechnologyRepository.Tests.cs create mode 100644 src/Data/DevHive.Data.Tests/UserRepositoryTests.cs create mode 100644 src/Data/DevHive.Data/ConnectionString.json create mode 100644 src/Data/DevHive.Data/DevHive.Data.csproj create mode 100644 src/Data/DevHive.Data/DevHiveContext.cs create mode 100644 src/Data/DevHive.Data/DevHiveContextFactory.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Models/IComment.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Models/ILanguage.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Models/IModel.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Models/IPost.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Models/IProfilePicture.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Models/IRating.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Models/IRole.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Models/ITechnology.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Models/IUser.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Repositories/ICommentRepository.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Repositories/IFeedRepository.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Repositories/ILanguageRepository.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Repositories/IPostRepository.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Repositories/IRatingRepository.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Repositories/IRepository.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Repositories/IRoleRepository.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Repositories/ITechnologyRepository.cs create mode 100644 src/Data/DevHive.Data/Interfaces/Repositories/IUserRepository.cs create mode 100644 src/Data/DevHive.Data/Migrations/20210205140955_rating.Designer.cs create mode 100644 src/Data/DevHive.Data/Migrations/20210205140955_rating.cs create mode 100644 src/Data/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.Designer.cs create mode 100644 src/Data/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.cs create mode 100644 src/Data/DevHive.Data/Migrations/20210205154810_PostFileAttachments.Designer.cs create mode 100644 src/Data/DevHive.Data/Migrations/20210205154810_PostFileAttachments.cs create mode 100644 src/Data/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.Designer.cs create mode 100644 src/Data/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.cs create mode 100644 src/Data/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs create mode 100644 src/Data/DevHive.Data/RelationModels/PostAttachments.cs create mode 100644 src/Data/DevHive.Data/RelationModels/RatedPost.cs create mode 100644 src/Data/DevHive.Data/RelationModels/UserRate.cs create mode 100644 src/Data/DevHive.Data/Repositories/BaseRepository.cs create mode 100644 src/Data/DevHive.Data/Repositories/CommentRepository.cs create mode 100644 src/Data/DevHive.Data/Repositories/FeedRepository.cs create mode 100644 src/Data/DevHive.Data/Repositories/LanguageRepository.cs create mode 100644 src/Data/DevHive.Data/Repositories/PostRepository.cs create mode 100644 src/Data/DevHive.Data/Repositories/RatingRepository.cs create mode 100644 src/Data/DevHive.Data/Repositories/RoleRepository.cs create mode 100644 src/Data/DevHive.Data/Repositories/TechnologyRepository.cs create mode 100644 src/Data/DevHive.Data/Repositories/UserRepository.cs delete mode 100644 src/DevHive.Common/DevHive.Common.csproj delete mode 100644 src/DevHive.Common/Models/Identity/TokenModel.cs delete mode 100644 src/DevHive.Common/Models/Misc/IdModel.cs delete mode 100644 src/DevHive.Common/Models/Misc/PasswordModifications.cs delete mode 100644 src/DevHive.Common/Models/Misc/Patch.cs delete mode 100644 src/DevHive.Data/ConnectionString.json delete mode 100644 src/DevHive.Data/DevHive.Data.csproj delete mode 100644 src/DevHive.Data/DevHiveContext.cs delete mode 100644 src/DevHive.Data/DevHiveContextFactory.cs delete mode 100644 src/DevHive.Data/Interfaces/Models/IComment.cs delete mode 100644 src/DevHive.Data/Interfaces/Models/ILanguage.cs delete mode 100644 src/DevHive.Data/Interfaces/Models/IModel.cs delete mode 100644 src/DevHive.Data/Interfaces/Models/IPost.cs delete mode 100644 src/DevHive.Data/Interfaces/Models/IProfilePicture.cs delete mode 100644 src/DevHive.Data/Interfaces/Models/IRating.cs delete mode 100644 src/DevHive.Data/Interfaces/Models/IRole.cs delete mode 100644 src/DevHive.Data/Interfaces/Models/ITechnology.cs delete mode 100644 src/DevHive.Data/Interfaces/Models/IUser.cs delete mode 100644 src/DevHive.Data/Interfaces/Repositories/ICommentRepository.cs delete mode 100644 src/DevHive.Data/Interfaces/Repositories/IFeedRepository.cs delete mode 100644 src/DevHive.Data/Interfaces/Repositories/ILanguageRepository.cs delete mode 100644 src/DevHive.Data/Interfaces/Repositories/IPostRepository.cs delete mode 100644 src/DevHive.Data/Interfaces/Repositories/IRatingRepository.cs delete mode 100644 src/DevHive.Data/Interfaces/Repositories/IRepository.cs delete mode 100644 src/DevHive.Data/Interfaces/Repositories/IRoleRepository.cs delete mode 100644 src/DevHive.Data/Interfaces/Repositories/ITechnologyRepository.cs delete mode 100644 src/DevHive.Data/Interfaces/Repositories/IUserRepository.cs delete mode 100644 src/DevHive.Data/Migrations/20210205140955_rating.Designer.cs delete mode 100644 src/DevHive.Data/Migrations/20210205140955_rating.cs delete mode 100644 src/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.Designer.cs delete mode 100644 src/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.cs delete mode 100644 src/DevHive.Data/Migrations/20210205154810_PostFileAttachments.Designer.cs delete mode 100644 src/DevHive.Data/Migrations/20210205154810_PostFileAttachments.cs delete mode 100644 src/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.Designer.cs delete mode 100644 src/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.cs delete mode 100644 src/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs delete mode 100644 src/DevHive.Data/Models/Comment.cs delete mode 100644 src/DevHive.Data/Models/Language.cs delete mode 100644 src/DevHive.Data/Models/Post.cs delete mode 100644 src/DevHive.Data/Models/ProfilePicture.cs delete mode 100644 src/DevHive.Data/Models/Rating.cs delete mode 100644 src/DevHive.Data/Models/Role.cs delete mode 100644 src/DevHive.Data/Models/Technology.cs delete mode 100644 src/DevHive.Data/Models/User.cs delete mode 100644 src/DevHive.Data/RelationModels/PostAttachments.cs delete mode 100644 src/DevHive.Data/RelationModels/RatedPost.cs delete mode 100644 src/DevHive.Data/RelationModels/UserRate.cs delete mode 100644 src/DevHive.Data/Repositories/BaseRepository.cs delete mode 100644 src/DevHive.Data/Repositories/CommentRepository.cs delete mode 100644 src/DevHive.Data/Repositories/FeedRepository.cs delete mode 100644 src/DevHive.Data/Repositories/LanguageRepository.cs delete mode 100644 src/DevHive.Data/Repositories/PostRepository.cs delete mode 100644 src/DevHive.Data/Repositories/RatingRepository.cs delete mode 100644 src/DevHive.Data/Repositories/RoleRepository.cs delete mode 100644 src/DevHive.Data/Repositories/TechnologyRepository.cs delete mode 100644 src/DevHive.Data/Repositories/UserRepository.cs delete mode 100644 src/DevHive.Services/Configurations/Mapping/CommentMappings.cs delete mode 100644 src/DevHive.Services/Configurations/Mapping/FeedMappings.cs delete mode 100644 src/DevHive.Services/Configurations/Mapping/LanguageMappings.cs delete mode 100644 src/DevHive.Services/Configurations/Mapping/PostMappings.cs delete mode 100644 src/DevHive.Services/Configurations/Mapping/RatingMappings.cs delete mode 100644 src/DevHive.Services/Configurations/Mapping/RoleMapings.cs delete mode 100644 src/DevHive.Services/Configurations/Mapping/TechnologyMappings.cs delete mode 100644 src/DevHive.Services/Configurations/Mapping/UserMappings.cs delete mode 100644 src/DevHive.Services/DevHive.Services.csproj delete mode 100644 src/DevHive.Services/Interfaces/ICloudService.cs delete mode 100644 src/DevHive.Services/Interfaces/ICommentService.cs delete mode 100644 src/DevHive.Services/Interfaces/IFeedService.cs delete mode 100644 src/DevHive.Services/Interfaces/ILanguageService.cs delete mode 100644 src/DevHive.Services/Interfaces/IPostService.cs delete mode 100644 src/DevHive.Services/Interfaces/IRateService.cs delete mode 100644 src/DevHive.Services/Interfaces/IRoleService.cs delete mode 100644 src/DevHive.Services/Interfaces/ITechnologyService.cs delete mode 100644 src/DevHive.Services/Interfaces/IUserService.cs delete mode 100644 src/DevHive.Services/Models/Comment/CreateCommentServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Comment/ReadCommentServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Comment/UpdateCommentServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Feed/GetPageServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Feed/ReadPageServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Identity/Role/CreateRoleServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Identity/Role/RoleServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Identity/Role/UpdateRoleServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Identity/User/BaseUserServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Identity/User/FriendServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Identity/User/LoginServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Identity/User/ProfilePictureServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Identity/User/RegisterServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Identity/User/UpdateFriendServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Identity/User/UpdateProfilePictureServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Identity/User/UpdateUserServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Identity/User/UserServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Language/CreateLanguageServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Language/LanguageServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Language/ReadLanguageServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Language/UpdateLanguageServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Post/CreatePostServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Post/Rating/RatePostServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Post/Rating/ReadPostRatingServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Post/ReadPostServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Post/UpdatePostServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Technology/CreateTechnologyServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Technology/ReadTechnologyServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Technology/TechnologyServiceModel.cs delete mode 100644 src/DevHive.Services/Models/Technology/UpdateTechnologyServiceModel.cs delete mode 100644 src/DevHive.Services/Options/JWTOptions.cs delete mode 100644 src/DevHive.Services/Services/CloudinaryService.cs delete mode 100644 src/DevHive.Services/Services/CommentService.cs delete mode 100644 src/DevHive.Services/Services/FeedService.cs delete mode 100644 src/DevHive.Services/Services/LanguageService.cs delete mode 100644 src/DevHive.Services/Services/PostService.cs delete mode 100644 src/DevHive.Services/Services/RateService.cs delete mode 100644 src/DevHive.Services/Services/RoleService.cs delete mode 100644 src/DevHive.Services/Services/TechnologyService.cs delete mode 100644 src/DevHive.Services/Services/UserService.cs delete mode 100644 src/DevHive.Tests/DevHive.Data.Tests/CommentRepository.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Data.Tests/DevHive.Data.Tests.csproj delete mode 100644 src/DevHive.Tests/DevHive.Data.Tests/FeedRepository.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Data.Tests/LenguageRepository.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Data.Tests/PostRepository.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Data.Tests/RoleRepository.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Data.Tests/UserRepositoryTests.cs delete mode 100644 src/DevHive.Tests/DevHive.Services.Tests/CommentService.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Services.Tests/DevHive.Services.Tests.csproj delete mode 100644 src/DevHive.Tests/DevHive.Services.Tests/FeedService.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Services.Tests/LanguageService.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Services.Tests/PostService.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Services.Tests/RoleService.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Services.Tests/TechnologyServices.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Services.Tests/UserService.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Web.Tests/CommentController.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Web.Tests/DevHive.Web.Tests.csproj delete mode 100644 src/DevHive.Tests/DevHive.Web.Tests/FeedController.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Web.Tests/LanguageController.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Web.Tests/PostController.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Web.Tests/RoleController.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Web.Tests/TechnologyController.Tests.cs delete mode 100644 src/DevHive.Tests/DevHive.Web.Tests/UserController.Tests.cs delete mode 100644 src/DevHive.Web/Attributes/GoodPasswordModelValidation.cs delete mode 100644 src/DevHive.Web/Attributes/OnlyLettersModelValidation.cs delete mode 100644 src/DevHive.Web/Configurations/Extensions/ConfigureAutoMapper.cs delete mode 100644 src/DevHive.Web/Configurations/Extensions/ConfigureDatabase.cs delete mode 100644 src/DevHive.Web/Configurations/Extensions/ConfigureDependencyInjection.cs delete mode 100644 src/DevHive.Web/Configurations/Extensions/ConfigureExceptionHandlerMiddleware.cs delete mode 100644 src/DevHive.Web/Configurations/Extensions/ConfigureJWT.cs delete mode 100644 src/DevHive.Web/Configurations/Extensions/ConfigureSwagger.cs delete mode 100644 src/DevHive.Web/Configurations/Mapping/CommentMappings.cs delete mode 100644 src/DevHive.Web/Configurations/Mapping/FeedMappings.cs delete mode 100644 src/DevHive.Web/Configurations/Mapping/LanguageMappings.cs delete mode 100644 src/DevHive.Web/Configurations/Mapping/PostMappings.cs delete mode 100644 src/DevHive.Web/Configurations/Mapping/RatingMappings.cs delete mode 100644 src/DevHive.Web/Configurations/Mapping/RoleMappings.cs delete mode 100644 src/DevHive.Web/Configurations/Mapping/TechnologyMappings.cs delete mode 100644 src/DevHive.Web/Configurations/Mapping/UserMappings.cs delete mode 100644 src/DevHive.Web/Controllers/CommentController.cs delete mode 100644 src/DevHive.Web/Controllers/FeedController.cs delete mode 100644 src/DevHive.Web/Controllers/LanguageController.cs delete mode 100644 src/DevHive.Web/Controllers/PostController.cs delete mode 100644 src/DevHive.Web/Controllers/RateController.cs delete mode 100644 src/DevHive.Web/Controllers/RoleController.cs delete mode 100644 src/DevHive.Web/Controllers/TechnologyController.cs delete mode 100644 src/DevHive.Web/Controllers/UserController.cs delete mode 100644 src/DevHive.Web/DevHive.Web.csproj delete mode 100644 src/DevHive.Web/Middleware/ExceptionMiddleware.cs delete mode 100644 src/DevHive.Web/Models/Comment/CreateCommentWebModel.cs delete mode 100644 src/DevHive.Web/Models/Comment/ReadCommentWebModel.cs delete mode 100644 src/DevHive.Web/Models/Comment/UpdateCommentWebModel.cs delete mode 100644 src/DevHive.Web/Models/Feed/GetPageWebModel.cs delete mode 100644 src/DevHive.Web/Models/Feed/ReadPageWebModel.cs delete mode 100644 src/DevHive.Web/Models/Identity/Role/CreateRoleWebModel.cs delete mode 100644 src/DevHive.Web/Models/Identity/Role/RoleWebModel.cs delete mode 100644 src/DevHive.Web/Models/Identity/Role/UpdateRoleWebModel.cs delete mode 100644 src/DevHive.Web/Models/Identity/User/BaseUserWebModel.cs delete mode 100644 src/DevHive.Web/Models/Identity/User/LoginWebModel.cs delete mode 100644 src/DevHive.Web/Models/Identity/User/ProfilePictureWebModel.cs delete mode 100644 src/DevHive.Web/Models/Identity/User/RegisterWebModel.cs delete mode 100644 src/DevHive.Web/Models/Identity/User/TokenWebModel.cs delete mode 100644 src/DevHive.Web/Models/Identity/User/UpdateProfilePictureWebModel.cs delete mode 100644 src/DevHive.Web/Models/Identity/User/UpdateUserWebModel.cs delete mode 100644 src/DevHive.Web/Models/Identity/User/UserWebModel.cs delete mode 100644 src/DevHive.Web/Models/Identity/User/UsernameWebModel.cs delete mode 100644 src/DevHive.Web/Models/Language/CreateLanguageWebModel.cs delete mode 100644 src/DevHive.Web/Models/Language/LanguageWebModel.cs delete mode 100644 src/DevHive.Web/Models/Language/ReadLanguageWebModel.cs delete mode 100644 src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs delete mode 100644 src/DevHive.Web/Models/Post/CreatePostWebModel.cs delete mode 100644 src/DevHive.Web/Models/Post/Rating/RatePostWebModel.cs delete mode 100644 src/DevHive.Web/Models/Post/Rating/ReadPostRatingWebModel.cs delete mode 100644 src/DevHive.Web/Models/Post/ReadPostWebModel.cs delete mode 100644 src/DevHive.Web/Models/Post/UpdatePostWebModel.cs delete mode 100644 src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs delete mode 100644 src/DevHive.Web/Models/Technology/ReadTechnologyWebModel.cs delete mode 100644 src/DevHive.Web/Models/Technology/TechnologyWebModel.cs delete mode 100644 src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs delete mode 100644 src/DevHive.Web/Program.cs delete mode 100644 src/DevHive.Web/Properties/launchSettings.json delete mode 100644 src/DevHive.Web/Startup.cs delete mode 100644 src/DevHive.Web/appsettings.json create mode 100644 src/Services/DevHive.Services.Models/Comment/CreateCommentServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Comment/ReadCommentServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Comment/UpdateCommentServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/DevHive.Services.Models.csproj create mode 100644 src/Services/DevHive.Services.Models/Feed/GetPageServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Feed/ReadPageServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Identity/Role/CreateRoleServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Identity/Role/RoleServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Identity/Role/UpdateRoleServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Identity/User/BaseUserServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Identity/User/FriendServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Identity/User/LoginServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Identity/User/ProfilePictureServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Identity/User/RegisterServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Identity/User/UpdateFriendServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Identity/User/UpdateProfilePictureServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Identity/User/UpdateUserServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Identity/User/UserServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Language/CreateLanguageServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Language/LanguageServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Language/ReadLanguageServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Language/UpdateLanguageServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Post/CreatePostServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Post/Rating/RatePostServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Post/Rating/ReadPostRatingServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Post/ReadPostServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Post/UpdatePostServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Technology/CreateTechnologyServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Technology/ReadTechnologyServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Technology/TechnologyServiceModel.cs create mode 100644 src/Services/DevHive.Services.Models/Technology/UpdateTechnologyServiceModel.cs create mode 100644 src/Services/DevHive.Services.Tests/CommentService.Tests.cs create mode 100644 src/Services/DevHive.Services.Tests/DevHive.Services.Tests.csproj create mode 100644 src/Services/DevHive.Services.Tests/FeedService.Tests.cs create mode 100644 src/Services/DevHive.Services.Tests/LanguageService.Tests.cs create mode 100644 src/Services/DevHive.Services.Tests/PostService.Tests.cs create mode 100644 src/Services/DevHive.Services.Tests/RoleService.Tests.cs create mode 100644 src/Services/DevHive.Services.Tests/TechnologyServices.Tests.cs create mode 100644 src/Services/DevHive.Services.Tests/UserService.Tests.cs create mode 100644 src/Services/DevHive.Services/Configurations/Mapping/CommentMappings.cs create mode 100644 src/Services/DevHive.Services/Configurations/Mapping/FeedMappings.cs create mode 100644 src/Services/DevHive.Services/Configurations/Mapping/LanguageMappings.cs create mode 100644 src/Services/DevHive.Services/Configurations/Mapping/PostMappings.cs create mode 100644 src/Services/DevHive.Services/Configurations/Mapping/RatingMappings.cs create mode 100644 src/Services/DevHive.Services/Configurations/Mapping/RoleMapings.cs create mode 100644 src/Services/DevHive.Services/Configurations/Mapping/TechnologyMappings.cs create mode 100644 src/Services/DevHive.Services/Configurations/Mapping/UserMappings.cs create mode 100644 src/Services/DevHive.Services/DevHive.Services.csproj create mode 100644 src/Services/DevHive.Services/Interfaces/ICloudService.cs create mode 100644 src/Services/DevHive.Services/Interfaces/ICommentService.cs create mode 100644 src/Services/DevHive.Services/Interfaces/IFeedService.cs create mode 100644 src/Services/DevHive.Services/Interfaces/ILanguageService.cs create mode 100644 src/Services/DevHive.Services/Interfaces/IPostService.cs create mode 100644 src/Services/DevHive.Services/Interfaces/IRateService.cs create mode 100644 src/Services/DevHive.Services/Interfaces/IRoleService.cs create mode 100644 src/Services/DevHive.Services/Interfaces/ITechnologyService.cs create mode 100644 src/Services/DevHive.Services/Interfaces/IUserService.cs create mode 100644 src/Services/DevHive.Services/Options/JWTOptions.cs create mode 100644 src/Services/DevHive.Services/Services/CloudinaryService.cs create mode 100644 src/Services/DevHive.Services/Services/CommentService.cs create mode 100644 src/Services/DevHive.Services/Services/FeedService.cs create mode 100644 src/Services/DevHive.Services/Services/LanguageService.cs create mode 100644 src/Services/DevHive.Services/Services/PostService.cs create mode 100644 src/Services/DevHive.Services/Services/RateService.cs create mode 100644 src/Services/DevHive.Services/Services/RoleService.cs create mode 100644 src/Services/DevHive.Services/Services/TechnologyService.cs create mode 100644 src/Services/DevHive.Services/Services/UserService.cs create mode 100644 src/Web/DevHive.Web.Models/Comment/CreateCommentWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Comment/ReadCommentWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Comment/UpdateCommentWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/DevHive.Web.Models.csproj create mode 100644 src/Web/DevHive.Web.Models/Feed/GetPageWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Feed/ReadPageWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Identity/Role/CreateRoleWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Identity/Role/RoleWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Identity/Role/UpdateRoleWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Identity/User/BaseUserWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Identity/User/LoginWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Identity/User/ProfilePictureWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Identity/User/RegisterWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Identity/User/TokenWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Identity/User/UpdateProfilePictureWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Identity/User/UpdateUserWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Identity/User/UserWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Identity/User/UsernameWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Language/CreateLanguageWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Language/LanguageWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Language/ReadLanguageWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Language/UpdateLanguageWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Post/CreatePostWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Post/Rating/RatePostWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Post/Rating/ReadPostRatingWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Post/ReadPostWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Post/UpdatePostWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Technology/CreateTechnologyWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Technology/ReadTechnologyWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Technology/TechnologyWebModel.cs create mode 100644 src/Web/DevHive.Web.Models/Technology/UpdateTechnologyWebModel.cs create mode 100644 src/Web/DevHive.Web.Tests/CommentController.Tests.cs create mode 100644 src/Web/DevHive.Web.Tests/DevHive.Web.Tests.csproj create mode 100644 src/Web/DevHive.Web.Tests/FeedController.Tests.cs create mode 100644 src/Web/DevHive.Web.Tests/LanguageController.Tests.cs create mode 100644 src/Web/DevHive.Web.Tests/PostController.Tests.cs create mode 100644 src/Web/DevHive.Web.Tests/RoleController.Tests.cs create mode 100644 src/Web/DevHive.Web.Tests/TechnologyController.Tests.cs create mode 100644 src/Web/DevHive.Web.Tests/UserController.Tests.cs create mode 100644 src/Web/DevHive.Web/Attributes/GoodPasswordModelValidation.cs create mode 100644 src/Web/DevHive.Web/Attributes/OnlyLettersModelValidation.cs create mode 100644 src/Web/DevHive.Web/Configurations/Extensions/ConfigureAutoMapper.cs create mode 100644 src/Web/DevHive.Web/Configurations/Extensions/ConfigureDatabase.cs create mode 100644 src/Web/DevHive.Web/Configurations/Extensions/ConfigureDependencyInjection.cs create mode 100644 src/Web/DevHive.Web/Configurations/Extensions/ConfigureExceptionHandlerMiddleware.cs create mode 100644 src/Web/DevHive.Web/Configurations/Extensions/ConfigureJWT.cs create mode 100644 src/Web/DevHive.Web/Configurations/Extensions/ConfigureSwagger.cs create mode 100644 src/Web/DevHive.Web/Configurations/Mapping/CommentMappings.cs create mode 100644 src/Web/DevHive.Web/Configurations/Mapping/FeedMappings.cs create mode 100644 src/Web/DevHive.Web/Configurations/Mapping/LanguageMappings.cs create mode 100644 src/Web/DevHive.Web/Configurations/Mapping/PostMappings.cs create mode 100644 src/Web/DevHive.Web/Configurations/Mapping/RatingMappings.cs create mode 100644 src/Web/DevHive.Web/Configurations/Mapping/RoleMappings.cs create mode 100644 src/Web/DevHive.Web/Configurations/Mapping/TechnologyMappings.cs create mode 100644 src/Web/DevHive.Web/Configurations/Mapping/UserMappings.cs create mode 100644 src/Web/DevHive.Web/Controllers/CommentController.cs create mode 100644 src/Web/DevHive.Web/Controllers/FeedController.cs create mode 100644 src/Web/DevHive.Web/Controllers/LanguageController.cs create mode 100644 src/Web/DevHive.Web/Controllers/PostController.cs create mode 100644 src/Web/DevHive.Web/Controllers/RateController.cs create mode 100644 src/Web/DevHive.Web/Controllers/RoleController.cs create mode 100644 src/Web/DevHive.Web/Controllers/TechnologyController.cs create mode 100644 src/Web/DevHive.Web/Controllers/UserController.cs create mode 100644 src/Web/DevHive.Web/DevHive.Web.csproj create mode 100644 src/Web/DevHive.Web/Middleware/ExceptionMiddleware.cs create mode 100644 src/Web/DevHive.Web/Program.cs create mode 100644 src/Web/DevHive.Web/Properties/launchSettings.json create mode 100644 src/Web/DevHive.Web/Startup.cs create mode 100644 src/Web/DevHive.Web/appsettings.json diff --git a/src/Common/DevHive.Common.Models/DevHive.Common.csproj b/src/Common/DevHive.Common.Models/DevHive.Common.csproj new file mode 100644 index 0000000..ace4997 --- /dev/null +++ b/src/Common/DevHive.Common.Models/DevHive.Common.csproj @@ -0,0 +1,15 @@ + + + + net5.0 + + + + + + + + true + latest + + diff --git a/src/Common/DevHive.Common.Models/Identity/TokenModel.cs b/src/Common/DevHive.Common.Models/Identity/TokenModel.cs new file mode 100644 index 0000000..0fb6c82 --- /dev/null +++ b/src/Common/DevHive.Common.Models/Identity/TokenModel.cs @@ -0,0 +1,12 @@ +namespace DevHive.Common.Models.Identity +{ + public class TokenModel + { + public TokenModel(string token) + { + this.Token = token; + } + + public string Token { get; set; } + } +} \ No newline at end of file diff --git a/src/Common/DevHive.Common.Models/Misc/IdModel.cs b/src/Common/DevHive.Common.Models/Misc/IdModel.cs new file mode 100644 index 0000000..a5c7b65 --- /dev/null +++ b/src/Common/DevHive.Common.Models/Misc/IdModel.cs @@ -0,0 +1,9 @@ +using System; + +namespace DevHive.Common.Models.Misc +{ + public class IdModel + { + public Guid Id { get; set; } + } +} \ No newline at end of file diff --git a/src/Common/DevHive.Common.Models/Misc/PasswordModifications.cs b/src/Common/DevHive.Common.Models/Misc/PasswordModifications.cs new file mode 100644 index 0000000..f10a334 --- /dev/null +++ b/src/Common/DevHive.Common.Models/Misc/PasswordModifications.cs @@ -0,0 +1,13 @@ +using System.Security.Cryptography; +using System.Text; + +namespace DevHive.Common.Models.Misc +{ + public static class PasswordModifications + { + public static string GeneratePasswordHash(string password) + { + return string.Join(string.Empty, SHA512.HashData(Encoding.ASCII.GetBytes(password))); + } + } +} diff --git a/src/Common/DevHive.Common.Models/Misc/Patch.cs b/src/Common/DevHive.Common.Models/Misc/Patch.cs new file mode 100644 index 0000000..ea5a4f1 --- /dev/null +++ b/src/Common/DevHive.Common.Models/Misc/Patch.cs @@ -0,0 +1,9 @@ +namespace DevHive.Common.Models.Misc +{ + public class Patch + { + public string Name { get; set; } + public object Value { get; set; } + public string Action { get; set; } + } +} diff --git a/src/Data/DevHive.Data.Models/Comment.cs b/src/Data/DevHive.Data.Models/Comment.cs new file mode 100644 index 0000000..e2bb21d --- /dev/null +++ b/src/Data/DevHive.Data.Models/Comment.cs @@ -0,0 +1,20 @@ +using System; +using DevHive.Data.Interfaces.Models; + +namespace DevHive.Data.Models +{ + public class Comment : IComment + { + public Guid Id { get; set; } + + // public Guid PostId { get; set; } + public Post Post { get; set; } + + // public Guid CreatorId { get; set; } + public User Creator { get; set; } + + public string Message { get; set; } + + public DateTime TimeCreated { get; set; } + } +} diff --git a/src/Data/DevHive.Data.Models/DevHive.Data.Models.csproj b/src/Data/DevHive.Data.Models/DevHive.Data.Models.csproj new file mode 100644 index 0000000..ebf5f9c --- /dev/null +++ b/src/Data/DevHive.Data.Models/DevHive.Data.Models.csproj @@ -0,0 +1,11 @@ + + + + net5.0 + + + + + + + diff --git a/src/Data/DevHive.Data.Models/Language.cs b/src/Data/DevHive.Data.Models/Language.cs new file mode 100644 index 0000000..7ad8ff2 --- /dev/null +++ b/src/Data/DevHive.Data.Models/Language.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using DevHive.Data.Interfaces.Models; + +namespace DevHive.Data.Models +{ + public class Language : ILanguage + { + public Guid Id { get; set; } + + public string Name { get; set; } + + public HashSet Users { get; set; } = new(); + } +} diff --git a/src/Data/DevHive.Data.Models/Post.cs b/src/Data/DevHive.Data.Models/Post.cs new file mode 100644 index 0000000..3f3d8c9 --- /dev/null +++ b/src/Data/DevHive.Data.Models/Post.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using DevHive.Data.Interfaces.Models; +using DevHive.Data.RelationModels; + +namespace DevHive.Data.Models +{ + [Table("Posts")] + public class Post : IPost + { + public Guid Id { get; set; } + + public User Creator { get; set; } + + public string Message { get; set; } + + public DateTime TimeCreated { get; set; } + + public List Comments { get; set; } = new(); + + public Rating Rating { get; set; } = new(); + + public List Attachments { get; set; } = new(); + } +} diff --git a/src/Data/DevHive.Data.Models/ProfilePicture.cs b/src/Data/DevHive.Data.Models/ProfilePicture.cs new file mode 100644 index 0000000..d5cc397 --- /dev/null +++ b/src/Data/DevHive.Data.Models/ProfilePicture.cs @@ -0,0 +1,15 @@ +using System; +using DevHive.Data.Interfaces.Models; + +namespace DevHive.Data.Models +{ + public class ProfilePicture: IProfilePicture + { + public Guid Id { get; set; } + + public Guid UserId { get; set; } + public User User { get; set; } + + public string PictureURL { get; set; } + } +} diff --git a/src/Data/DevHive.Data.Models/Rating.cs b/src/Data/DevHive.Data.Models/Rating.cs new file mode 100644 index 0000000..e1bedd2 --- /dev/null +++ b/src/Data/DevHive.Data.Models/Rating.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using DevHive.Data.Interfaces.Models; + +namespace DevHive.Data.Models +{ + public class Rating : IRating + { + public Guid Id { get; set; } + + public Guid PostId { get; set; } + + public Post Post { get; set; } + + public int Rate { get; set; } + } +} diff --git a/src/Data/DevHive.Data.Models/Role.cs b/src/Data/DevHive.Data.Models/Role.cs new file mode 100644 index 0000000..259d867 --- /dev/null +++ b/src/Data/DevHive.Data.Models/Role.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations.Schema; +using System.Collections.Generic; +using DevHive.Data.Interfaces.Models; +using Microsoft.AspNetCore.Identity; +using System; + +namespace DevHive.Data.Models +{ + [Table("Roles")] + public class Role : IdentityRole, IRole + { + public const string DefaultRole = "User"; + public const string AdminRole = "Admin"; + + public HashSet Users { get; set; } = new(); + } +} diff --git a/src/Data/DevHive.Data.Models/Technology.cs b/src/Data/DevHive.Data.Models/Technology.cs new file mode 100644 index 0000000..6f98f0b --- /dev/null +++ b/src/Data/DevHive.Data.Models/Technology.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using DevHive.Data.Interfaces.Models; + +namespace DevHive.Data.Models +{ + public class Technology : ITechnology + { + public Guid Id { get; set; } + + public string Name { get; set; } + + public HashSet Users { get; set; } = new(); + } +} diff --git a/src/Data/DevHive.Data.Models/User.cs b/src/Data/DevHive.Data.Models/User.cs new file mode 100644 index 0000000..983d073 --- /dev/null +++ b/src/Data/DevHive.Data.Models/User.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using DevHive.Data.Interfaces.Models; +using DevHive.Data.RelationModels; +using Microsoft.AspNetCore.Identity; + +namespace DevHive.Data.Models +{ + [Table("Users")] + public class User : IdentityUser, IUser + { + public string FirstName { get; set; } + + public string LastName { get; set; } + + public ProfilePicture ProfilePicture { get; set; } + + public HashSet Languages { get; set; } = new(); + + public HashSet Technologies { get; set; } = new(); + + public HashSet Roles { get; set; } = new(); + + public HashSet Posts { get; set; } = new(); + + public HashSet Friends { get; set; } = new(); + + public HashSet Comments { get; set; } = new(); + + public HashSet RatedPosts { get; set; } = new(); + } +} diff --git a/src/Data/DevHive.Data.Tests/CommentRepository.Tests.cs b/src/Data/DevHive.Data.Tests/CommentRepository.Tests.cs new file mode 100644 index 0000000..9cbb43b --- /dev/null +++ b/src/Data/DevHive.Data.Tests/CommentRepository.Tests.cs @@ -0,0 +1,99 @@ +using System; +using System.Threading.Tasks; +using DevHive.Data.Models; +using DevHive.Data.Repositories; +using Microsoft.EntityFrameworkCore; +using NUnit.Framework; + +namespace DevHive.Data.Tests +{ + [TestFixture] + public class CommentRepositoryTests + { + private const string COMMENT_MESSAGE = "Comment message"; + + protected DevHiveContext Context { get; set; } + + protected CommentRepository CommentRepository { get; set; } + + #region Setups + [SetUp] + public void Setup() + { + var optionsBuilder = new DbContextOptionsBuilder() + .UseInMemoryDatabase(databaseName: "DevHive_Test_Database"); + + this.Context = new DevHiveContext(optionsBuilder.Options); + + CommentRepository = new CommentRepository(Context); + } + + [TearDown] + public void TearDown() + { + this.Context.Database.EnsureDeleted(); + } + #endregion + + #region GetCommentByIssuerAndTimeCreatedAsync + [Test] + public async Task GetCommentByCreatorAndTimeCreatedAsync_ReturnsTheCorrectComment_IfItExists() + { + Comment comment = await this.AddEntity(); + + Comment resultComment = await this.CommentRepository.GetCommentByIssuerAndTimeCreatedAsync(comment.Creator.Id, comment.TimeCreated); + + Assert.AreEqual(comment.Id, resultComment.Id, "GetCommentByIssuerAndTimeCreatedAsync does not return the corect comment when it exists"); + } + + [Test] + public async Task GetPostByCreatorAndTimeCreatedAsync_ReturnsNull_IfThePostDoesNotExist() + { + Comment comment = await this.AddEntity(); + + Comment resultComment = await this.CommentRepository.GetCommentByIssuerAndTimeCreatedAsync(Guid.Empty, DateTime.Now); + + Assert.IsNull(resultComment, "GetCommentByIssuerAndTimeCreatedAsync does not return null when the comment does not exist"); + } + #endregion + + #region DoesCommentExist + [Test] + public async Task DoesCommentExist_ReturnsTrue_WhenTheCommentExists() + { + Comment comment = await this.AddEntity(); + + bool result = await this.CommentRepository.DoesCommentExist(comment.Id); + + Assert.IsTrue(result, "DoesCommentExist does not return true whenm the Comment exists"); + } + + [Test] + public async Task DoesCommentExist_ReturnsFalse_WhenTheCommentDoesNotExist() + { + bool result = await this.CommentRepository.DoesCommentExist(Guid.Empty); + + Assert.IsFalse(result, "DoesCommentExist does not return false whenm the Comment" + + " does not exist"); + } + #endregion + + #region HelperMethods + private async Task AddEntity(string name = COMMENT_MESSAGE) + { + User creator = new User { Id = Guid.NewGuid() }; + Comment comment = new Comment + { + Message = COMMENT_MESSAGE, + Creator = creator, + TimeCreated = DateTime.Now + }; + + this.Context.Comments.Add(comment); + await this.Context.SaveChangesAsync(); + + return comment; + } + #endregion + } +} diff --git a/src/Data/DevHive.Data.Tests/DevHive.Data.Tests.csproj b/src/Data/DevHive.Data.Tests/DevHive.Data.Tests.csproj new file mode 100644 index 0000000..42a3273 --- /dev/null +++ b/src/Data/DevHive.Data.Tests/DevHive.Data.Tests.csproj @@ -0,0 +1,29 @@ + + + + net5.0 + + false + + + + + + + + + + + + + + + + + + + + true + latest + + diff --git a/src/Data/DevHive.Data.Tests/FeedRepository.Tests.cs b/src/Data/DevHive.Data.Tests/FeedRepository.Tests.cs new file mode 100644 index 0000000..f134bf3 --- /dev/null +++ b/src/Data/DevHive.Data.Tests/FeedRepository.Tests.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using DevHive.Data.Models; +using DevHive.Data.Repositories; +using Microsoft.EntityFrameworkCore; +using NUnit.Framework; + +namespace DevHive.Data.Tests +{ + [TestFixture] + public class FeedRepositoryTests + { + protected DevHiveContext Context { get; set; } + + protected FeedRepository FeedRepository { get; set; } + + #region Setups + [SetUp] + public void Setup() + { + var optionsBuilder = new DbContextOptionsBuilder() + .UseInMemoryDatabase(databaseName: "DevHive_Test_Database"); + + this.Context = new DevHiveContext(optionsBuilder.Options); + + FeedRepository = new FeedRepository(Context); + } + + [TearDown] + public void TearDown() + { + this.Context.Database.EnsureDeleted(); + } + #endregion + + #region GetFriendsPosts + [Test] + public async Task GetFriendsPosts_ReturnsListOfPosts_WhenTheyExist() + { + User dummyUser = this.CreateDummyUser(); + List friendsList = new List(); + friendsList.Add(dummyUser); + + DateTime dateTime = new DateTime(3000, 05, 09, 9, 15, 0); + Console.WriteLine(dateTime.ToFileTime()); + + Post dummyPost = this.CreateDummyPost(dummyUser); + Post anotherDummnyPost = this.CreateDummyPost(dummyUser); + + const int PAGE_NUMBER = 1; + const int PAGE_SIZE = 10; + + List resultList = await this.FeedRepository.GetFriendsPosts(friendsList, dateTime, PAGE_NUMBER, PAGE_SIZE); + + Assert.GreaterOrEqual(2, resultList.Count, "GetFriendsPosts does not return all correct posts"); + } + + [Test] + public async Task GetFriendsPosts_ReturnsNull_WhenNoSuitablePostsExist() + { + User dummyUser = this.CreateDummyUser(); + List friendsList = new List(); + friendsList.Add(dummyUser); + + DateTime dateTime = new DateTime(3000, 05, 09, 9, 15, 0); + + const int PAGE_NUMBER = 1; + const int PAGE_SIZE = 10; + + List resultList = await this.FeedRepository.GetFriendsPosts(friendsList, dateTime, PAGE_NUMBER, PAGE_SIZE); + + Assert.LessOrEqual(0, resultList.Count, "GetFriendsPosts does not return all correct posts"); + } + #endregion + + #region HelperMethods + private User CreateDummyUser() + { + HashSet roles = new() + { + new Role() + { + Id = Guid.NewGuid(), + Name = Role.DefaultRole + }, + }; + + return new() + { + Id = Guid.NewGuid(), + UserName = "pioneer10", + FirstName = "Spas", + LastName = "Spasov", + Email = "abv@abv.bg", + Roles = roles + }; + } + + private Post CreateDummyPost(User poster) + { + const string POST_MESSAGE = "random message"; + Guid id = Guid.NewGuid(); + Post post = new Post + { + Id = id, + Message = POST_MESSAGE, + Creator = poster, + TimeCreated = new DateTime(2000, 05, 09, 9, 15, 0) + }; + + this.Context.Posts.Add(post); + this.Context.SaveChanges(); + + return post; + } + #endregion + } +} diff --git a/src/Data/DevHive.Data.Tests/LenguageRepository.Tests.cs b/src/Data/DevHive.Data.Tests/LenguageRepository.Tests.cs new file mode 100644 index 0000000..f02a1e4 --- /dev/null +++ b/src/Data/DevHive.Data.Tests/LenguageRepository.Tests.cs @@ -0,0 +1,116 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using DevHive.Data.Models; +using DevHive.Data.Repositories; +using Microsoft.EntityFrameworkCore; +using NUnit.Framework; + +namespace DevHive.Data.Tests +{ + [TestFixture] + public class LenguageRepositoryTests + { + private const string LANGUAGE_NAME = "Language test name"; + protected DevHiveContext Context { get; set; } + protected LanguageRepository LanguageRepository { get; set; } + + #region Setups + [SetUp] + public void Setup() + { + var optionsBuilder = new DbContextOptionsBuilder() + .UseInMemoryDatabase(databaseName: "DevHive_Test_Database"); + + this.Context = new DevHiveContext(optionsBuilder.Options); + + LanguageRepository = new LanguageRepository(Context); + } + + [TearDown] + public void TearDown() + { + this.Context.Database.EnsureDeleted(); + } + #endregion + + #region GetByNameAsync + [Test] + public async Task GetByNameAsync_ReturnsTheCorrectLanguage_IfItExists() + { + await AddEntity(); + + Language language = this.Context.Languages.Where(x => x.Name == LANGUAGE_NAME).ToList().FirstOrDefault(); + + Language languageResult = await this.LanguageRepository.GetByNameAsync(LANGUAGE_NAME); + + Assert.AreEqual(language.Id, languageResult.Id); + } + + [Test] + public async Task GetByNameAsync_ReturnsNull_IfTechnologyDoesNotExists() + { + Language languageResult = await this.LanguageRepository.GetByNameAsync(LANGUAGE_NAME); + + Assert.IsNull(languageResult); + } + #endregion + + #region DoesLanguageExistAsync + [Test] + public async Task DoesLanguageExist_ReturnsTrue_IfIdExists() + { + await AddEntity(); + Language language = this.Context.Languages.Where(x => x.Name == LANGUAGE_NAME).ToList().FirstOrDefault(); + + Guid id = language.Id; + + bool result = await this.LanguageRepository.DoesLanguageExistAsync(id); + + Assert.IsTrue(result, "DoesLanguageExistAsync returns flase when language exists"); + } + + [Test] + public async Task DoesLanguageExist_ReturnsFalse_IfIdDoesNotExists() + { + Guid id = Guid.NewGuid(); + + bool result = await this.LanguageRepository.DoesLanguageExistAsync(id); + + Assert.IsFalse(result, "DoesLanguageExistAsync returns true when language does not exist"); + } + #endregion + + #region DoesTechnologyNameExistAsync + [Test] + public async Task DoesLanguageNameExist_ReturnsTrue_IfLanguageExists() + { + await AddEntity(); + + bool result = await this.LanguageRepository.DoesLanguageNameExistAsync(LANGUAGE_NAME); + + Assert.IsTrue(result, "DoesLanguageNameExists returns true when language name does not exist"); + } + + [Test] + public async Task DoesLanguageNameExist_ReturnsFalse_IfLanguageDoesNotExists() + { + bool result = await this.LanguageRepository.DoesLanguageNameExistAsync(LANGUAGE_NAME); + + Assert.False(result, "DoesTechnologyNameExistAsync returns true when language name does not exist"); + } + #endregion + + #region HelperMethods + private async Task AddEntity(string name = LANGUAGE_NAME) + { + Language language = new Language + { + Name = name + }; + + await this.LanguageRepository.AddAsync(language); + } + #endregion + } +} diff --git a/src/Data/DevHive.Data.Tests/PostRepository.Tests.cs b/src/Data/DevHive.Data.Tests/PostRepository.Tests.cs new file mode 100644 index 0000000..6dacf0b --- /dev/null +++ b/src/Data/DevHive.Data.Tests/PostRepository.Tests.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using DevHive.Data.RelationModels; +using DevHive.Data.Repositories; +using Microsoft.EntityFrameworkCore; +using Moq; +using NUnit.Framework; + +namespace DevHive.Data.Tests +{ + [TestFixture] + public class PostRepositoryTests + { + private const string POST_MESSAGE = "Post test message"; + + private DevHiveContext Context { get; set; } + + private Mock UserRepository { get; set; } + + private PostRepository PostRepository { get; set; } + + #region Setups + [SetUp] + public void Setup() + { + var optionsBuilder = new DbContextOptionsBuilder() + .UseInMemoryDatabase(databaseName: "DevHive_Test_Database"); + + this.Context = new DevHiveContext(optionsBuilder.Options); + + this.UserRepository = new Mock(); + + PostRepository = new PostRepository(Context, this.UserRepository.Object); + } + + [TearDown] + public void TearDown() + { + this.Context.Database.EnsureDeleted(); + } + #endregion + + #region AddNewPostToCreator + // [Test] + // public async Task AddNewPostToCreator_ReturnsTrue_WhenNewPostIsAddedToCreator() + // { + // Post post = await this.AddEntity(); + // User user = new User { Id = Guid.NewGuid() }; + // + // this.UserRepository.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); + // + // bool result = await this.PostRepository.AddNewPostToCreator(user.Id, post); + // + // Assert.IsTrue(result, "AddNewPostToCreator does not return true when Post Is Added To Creator successfully"); + // } + #endregion + + #region GetByIdAsync + [Test] + public async Task GetByNameAsync_ReturnsTheCorrectPost_IfItExists() + { + Post post = await AddEntity(); + + Post resultTechnology = await this.PostRepository.GetByIdAsync(post.Id); + + Assert.AreEqual(post.Id, resultTechnology.Id, "GetByIdAsync does not return the correct post"); + } + + [Test] + public async Task GetByIdAsync_ReturnsNull_IfTechnologyDoesNotExists() + { + Post resultPost = await this.PostRepository.GetByIdAsync(Guid.NewGuid()); + + Assert.IsNull(resultPost); + } + #endregion + + #region GetPostByCreatorAndTimeCreatedAsync + [Test] + public async Task GetPostByCreatorAndTimeCreatedAsync_ReturnsTheCorrectPost_IfItExists() + { + Post post = await this.AddEntity(); + + Post resultPost = await this.PostRepository.GetPostByCreatorAndTimeCreatedAsync(post.Creator.Id, post.TimeCreated); + + Assert.AreEqual(post.Id, resultPost.Id, "GetPostByCreatorAndTimeCreatedAsync does not return the corect post when it exists"); + } + + [Test] + public async Task GetPostByCreatorAndTimeCreatedAsync_ReturnsNull_IfThePostDoesNotExist() + { + Post post = await this.AddEntity(); + + Post resutPost = await this.PostRepository.GetPostByCreatorAndTimeCreatedAsync(Guid.Empty, DateTime.Now); + + Assert.IsNull(resutPost, "GetPostByCreatorAndTimeCreatedAsync does not return null when the post does not exist"); + } + #endregion + + #region DoesPostExist + [Test] + public async Task DoesPostExist_ReturnsTrue_WhenThePostExists() + { + Post post = await this.AddEntity(); + + bool result = await this.PostRepository.DoesPostExist(post.Id); + + Assert.IsTrue(result, "DoesPostExist does not return true whenm the Post exists"); + } + + [Test] + public async Task DoesPostExist_ReturnsFalse_WhenThePostDoesNotExist() + { + bool result = await this.PostRepository.DoesPostExist(Guid.Empty); + + Assert.IsFalse(result, "DoesPostExist does not return false whenm the Post does not exist"); + } + #endregion + + #region HelperMethods + private async Task AddEntity(string name = POST_MESSAGE) + { + User creator = new User { Id = Guid.NewGuid() }; + await this.Context.Users.AddAsync(creator); + Post post = new Post + { + Message = POST_MESSAGE, + Id = Guid.NewGuid(), + Creator = creator, + TimeCreated = DateTime.Now, + Attachments = new List { new PostAttachments { FileUrl = "kur" }, new PostAttachments { FileUrl = "za" }, new PostAttachments { FileUrl = "tva" } }, + Comments = new List() + }; + + await this.Context.Posts.AddAsync(post); + await this.Context.SaveChangesAsync(); + + return post; + } + #endregion + } +} diff --git a/src/Data/DevHive.Data.Tests/RoleRepository.Tests.cs b/src/Data/DevHive.Data.Tests/RoleRepository.Tests.cs new file mode 100644 index 0000000..7f62c24 --- /dev/null +++ b/src/Data/DevHive.Data.Tests/RoleRepository.Tests.cs @@ -0,0 +1,119 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using DevHive.Data.Models; +using DevHive.Data.Repositories; +using Microsoft.EntityFrameworkCore; +using NUnit.Framework; + +namespace DevHive.Data.Tests +{ + [TestFixture] + public class RoleRepositoryTests + { + private const string ROLE_NAME = "Role test name"; + + protected DevHiveContext Context { get; set; } + + protected RoleRepository RoleRepository { get; set; } + + #region Setups + [SetUp] + public void Setup() + { + var optionsBuilder = new DbContextOptionsBuilder() + .UseInMemoryDatabase(databaseName: "DevHive_Test_Database"); + + this.Context = new DevHiveContext(optionsBuilder.Options); + + RoleRepository = new RoleRepository(Context); + } + + [TearDown] + public void TearDown() + { + this.Context.Database.EnsureDeleted(); + } + #endregion + + #region GetByNameAsync + [Test] + public async Task GetByNameAsync_ReturnsTheRole_WhenItExists() + { + Role role = await this.AddEntity(); + + Role resultRole = await this.RoleRepository.GetByNameAsync(role.Name); + + Assert.AreEqual(role.Id, resultRole.Id, "GetByNameAsync does not return the correct role"); + } + + [Test] + public async Task GetByNameAsync_ReturnsNull_WhenTheRoleDoesNotExist() + { + Role resultRole = await this.RoleRepository.GetByNameAsync(ROLE_NAME); + + Assert.IsNull(resultRole, "GetByNameAsync does not return when the role does not exist"); + } + #endregion + + #region DoesNameExist + [Test] + public async Task DoesNameExist_ReturnsTrue_WhenTheNameExists() + { + Role role = await this.AddEntity(); + + bool result = await this.RoleRepository.DoesNameExist(role.Name); + + Assert.IsTrue(result, "DoesNameExist returns false when the role name exist"); + } + + [Test] + public async Task DoesNameExist_ReturnsFalse_WhenTheNameDoesNotExist() + { + bool result = await this.RoleRepository.DoesNameExist(ROLE_NAME); + + Assert.IsFalse(result, "DoesNameExist returns false when the role name exist"); + } + #endregion + + #region DoesRoleExist + [Test] + public async Task DoesRoleExist_ReturnsTrue_IfIdExists() + { + await AddEntity(); + Role role = this.Context.Roles.Where(x => x.Name == ROLE_NAME).ToList().FirstOrDefault(); + Guid id = role.Id; + + bool result = await this.RoleRepository.DoesRoleExist(id); + + Assert.IsTrue(result, "DoesRoleExistAsync returns flase when role exists"); + } + + [Test] + public async Task DoesRoleExist_ReturnsFalse_IfIdDoesNotExists() + { + Guid id = Guid.NewGuid(); + + bool result = await this.RoleRepository.DoesRoleExist(id); + + Assert.IsFalse(result, "DoesRoleExist returns true when role does not exist"); + } + #endregion + + #region HelperMethods + private async Task AddEntity(string name = ROLE_NAME) + { + Role role = new Role + { + Id = Guid.NewGuid(), + Name = name + }; + + this.Context.Roles.Add(role); + await this.Context.SaveChangesAsync(); + + return role; + } + #endregion + } +} diff --git a/src/Data/DevHive.Data.Tests/TechnologyRepository.Tests.cs b/src/Data/DevHive.Data.Tests/TechnologyRepository.Tests.cs new file mode 100644 index 0000000..d25fd3b --- /dev/null +++ b/src/Data/DevHive.Data.Tests/TechnologyRepository.Tests.cs @@ -0,0 +1,118 @@ +using DevHive.Data.Models; +using DevHive.Data.Repositories; +using Microsoft.EntityFrameworkCore; +using NUnit.Framework; +using System; +using System.Linq; +using System.Threading.Tasks; + +namespace DevHive.Data.Tests +{ + [TestFixture] + public class TechnologyRepositoryTests + { + private const string TECHNOLOGY_NAME = "Technology test name"; + + protected DevHiveContext Context { get; set; } + + protected TechnologyRepository TechnologyRepository { get; set; } + + #region Setups + [SetUp] + public void Setup() + { + var optionsBuilder = new DbContextOptionsBuilder() + .UseInMemoryDatabase(databaseName: "DevHive_Test_Database"); + + this.Context = new DevHiveContext(optionsBuilder.Options); + + TechnologyRepository = new TechnologyRepository(Context); + } + + [TearDown] + public void TearDown() + { + this.Context.Database.EnsureDeleted(); + } + #endregion + + #region GetByNameAsync + [Test] + public async Task GetByNameAsync_ReturnsTheCorrectTechnology_IfItExists() + { + await AddEntity(); + + Technology technology = this.Context.Technologies.Where(x => x.Name == TECHNOLOGY_NAME).ToList().FirstOrDefault(); + + Technology resultTechnology = await this.TechnologyRepository.GetByNameAsync(TECHNOLOGY_NAME); + + Assert.AreEqual(technology.Id, resultTechnology.Id); + } + + [Test] + public async Task GetByNameAsync_ReturnsNull_IfTechnologyDoesNotExists() + { + Technology resultTechnology = await this.TechnologyRepository.GetByNameAsync(TECHNOLOGY_NAME); + + Assert.IsNull(resultTechnology); + } + #endregion + + #region DoesTechnologyExistAsync + [Test] + public async Task DoesTechnologyExist_ReturnsTrue_IfIdExists() + { + await AddEntity(); + Technology technology = this.Context.Technologies.Where(x => x.Name == TECHNOLOGY_NAME).ToList().FirstOrDefault(); + Guid id = technology.Id; + + bool result = await this.TechnologyRepository.DoesTechnologyExistAsync(id); + + Assert.IsTrue(result, "DoesTechnologyExistAsync returns flase hwen technology exists"); + } + + [Test] + public async Task DoesTechnologyExist_ReturnsFalse_IfIdDoesNotExists() + { + Guid id = Guid.NewGuid(); + + bool result = await this.TechnologyRepository.DoesTechnologyExistAsync(id); + + Assert.IsFalse(result, "DoesTechnologyExistAsync returns true when technology does not exist"); + } + #endregion + + #region DoesTechnologyNameExistAsync + [Test] + public async Task DoesTechnologyNameExist_ReturnsTrue_IfTechnologyExists() + { + await AddEntity(); + + bool result = await this.TechnologyRepository.DoesTechnologyNameExistAsync(TECHNOLOGY_NAME); + + Assert.IsTrue(result, "DoesTechnologyNameExists returns true when technology name does not exist"); + } + + [Test] + public async Task DoesTechnologyNameExist_ReturnsFalse_IfTechnologyDoesNotExists() + { + bool result = await this.TechnologyRepository.DoesTechnologyNameExistAsync(TECHNOLOGY_NAME); + + Assert.False(result, "DoesTechnologyNameExistAsync returns true when technology name does not exist"); + } + #endregion + + #region HelperMethods + private async Task AddEntity(string name = TECHNOLOGY_NAME) + { + Technology technology = new Technology + { + Name = name + }; + + this.Context.Technologies.Add(technology); + await this.Context.SaveChangesAsync(); + } + #endregion + } +} diff --git a/src/Data/DevHive.Data.Tests/UserRepositoryTests.cs b/src/Data/DevHive.Data.Tests/UserRepositoryTests.cs new file mode 100644 index 0000000..43e9a36 --- /dev/null +++ b/src/Data/DevHive.Data.Tests/UserRepositoryTests.cs @@ -0,0 +1,350 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using DevHive.Data.Models; +using DevHive.Data.Repositories; +using Microsoft.EntityFrameworkCore; +using NUnit.Framework; + +namespace DevHive.Data.Tests +{ + [TestFixture] + public class UserRepositoryTests + { + private DevHiveContext _context; + private UserRepository _userRepository; + + #region Setups + [SetUp] + public void Setup() + { + var options = new DbContextOptionsBuilder() + .UseInMemoryDatabase("DevHive_UserRepository_Database"); + + this._context = new DevHiveContext(options.Options); + this._userRepository = new UserRepository(_context); + } + + [TearDown] + public async Task Teardown() + { + await this._context.Database.EnsureDeletedAsync(); + } + #endregion + + #region QueryAll + // [Test] + // public async Task QueryAll_ShouldReturnAllUsersFromDatabase_WhenTheyExist() + // { + // //Arrange + // User dummyUserOne = CreateDummyUser(); + // User dummyUserTwo = CreateAnotherDummyUser(); + // + // await this._userRepository.AddAsync(dummyUserOne); + // await this._userRepository.AddAsync(dummyUserTwo); + // + // //Act + // IEnumerable users = this._userRepository.QueryAll(); + // + // //Assert + // Assert.AreEqual(2, users.Count(), "Method doesn't return all instances of user"); + // } + + // [Test] + // public void QueryAll_ReturnsNull_WhenNoUsersExist() + // { + // IEnumerable users = this._userRepository.QueryAll(); + // + // Assert.AreEqual(0, users.Count(), "Method returns Users when there are non"); + // } + #endregion + + #region EditAsync + [Test] + public async Task EditAsync_ReturnsTrue_WhenUserIsUpdatedSuccessfully() + { + User oldUser = this.CreateDummyUser(); + this._context.Users.Add(oldUser); + await this._context.SaveChangesAsync(); + + oldUser.UserName = "SuperSecretUserName"; + bool result = await this._userRepository.EditAsync(oldUser.Id, oldUser); + + Assert.IsTrue(result, "EditAsync does not return true when User is updated successfully"); + } + #endregion + + #region GetByIdAsync + [Test] + public async Task GetByIdAsync_ReturnsTheUse_WhenItExists() + { + User dummyUserOne = CreateDummyUser(); + await this._userRepository.AddAsync(dummyUserOne); + + User resultUser = await this._userRepository.GetByIdAsync(dummyUserOne.Id); + + Assert.AreEqual(dummyUserOne.UserName, resultUser.UserName); + } + + [Test] + public async Task GetByIdAsync_ReturnsNull_WhenUserDoesNotExist() + { + Guid id = Guid.NewGuid(); + + User resultUser = await this._userRepository.GetByIdAsync(id); + + Assert.IsNull(resultUser); + } + #endregion + + #region GetByUsernameAsync + [Test] + public async Task GetByUsernameAsync_ReturnsUserFromDatabase_WhenItExists() + { + //Arrange + User dummyUser = CreateDummyUser(); + await this._userRepository.AddAsync(dummyUser); + string username = dummyUser.UserName; + + //Act + User user = await this._userRepository.GetByUsernameAsync(username); + + //Assert + Assert.AreEqual(dummyUser.Id, user.Id, "Method doesn't get the proper user from database"); + } + + [Test] + public async Task GetByUsernameAsync_ReturnsNull_WhenUserDoesNotExist() + { + //Act + User user = await this._userRepository.GetByUsernameAsync(null); + + //Assert + Assert.IsNull(user, "Method returns user when it does not exist"); + } + #endregion + + #region DoesUserExistAsync + [Test] + public async Task DoesUserExistAsync_ReturnsTrue_WhenUserExists() + { + User dummyUser = this.CreateDummyUser(); + this._context.Users.Add(dummyUser); + await this._context.SaveChangesAsync(); + + bool result = await this._userRepository.DoesUserExistAsync(dummyUser.Id); + + Assert.IsTrue(result, "DoesUserExistAsync does not return true when user exists"); + } + + [Test] + public async Task DoesUserExistAsync_ReturnsFalse_WhenUserDoesNotExist() + { + Guid id = Guid.NewGuid(); + + bool result = await this._userRepository.DoesUserExistAsync(id); + + Assert.IsFalse(result, "DoesUserExistAsync does not return false when user does not exist"); + } + #endregion + + #region DoesUserNameExistAsync + [Test] + public async Task DoesUsernameExistAsync_ReturnsTrue_WhenUserWithTheNameExists() + { + User dummyUser = this.CreateDummyUser(); + this._context.Users.Add(dummyUser); + await this._context.SaveChangesAsync(); + + bool result = await this._userRepository.DoesUsernameExistAsync(dummyUser.UserName); + + Assert.IsTrue(result, "DoesUserNameExistAsync does not return true when username exists"); + } + + [Test] + public async Task DoesUsernameExistAsync_ReturnsFalse_WhenUserWithTheNameDoesNotExist() + { + string userName = "Fake name"; + + bool result = await this._userRepository.DoesUsernameExistAsync(userName); + + Assert.IsFalse(result, "DoesUserNameExistAsync does not return false when username does not exist"); + } + #endregion + + #region DoesEmailExistAsync + [Test] + public async Task DoesEmailExistAsync_ReturnsTrue_WhenUserWithTheEmailExists() + { + User dummyUser = this.CreateDummyUser(); + this._context.Users.Add(dummyUser); + await this._context.SaveChangesAsync(); + + bool result = await this._userRepository.DoesEmailExistAsync(dummyUser.Email); + + Assert.IsTrue(result, "DoesUserNameExistAsync does not return true when email exists"); + } + + [Test] + public async Task DoesEmailExistAsync_ReturnsFalse_WhenUserWithTheEmailDoesNotExist() + { + string email = "Fake email"; + + bool result = await this._userRepository.DoesUsernameExistAsync(email); + + Assert.IsFalse(result, "DoesUserNameExistAsync does not return false when email does not exist"); + } + #endregion + + #region DoesUserHaveThisFriendAsync + //[Test] + //public async Task DoesUserHaveThisFriendAsync_ReturnsTrue_WhenUserHasTheGivenFriend() + //{ + // User dummyUser = this.CreateDummyUser(); + // User anotherDummyUser = this.CreateAnotherDummyUser(); + // HashSet friends = new HashSet + // { + // anotherDummyUser + // }; + // dummyUser.Friends = friends; + + // this._context.Users.Add(dummyUser); + // this._context.Users.Add(anotherDummyUser); + // await this._context.SaveChangesAsync(); + + // bool result = await this._userRepository.DoesUserHaveThisFriendAsync(dummyUser.Id, anotherDummyUser.Id); + + // Assert.IsTrue(result, "DoesUserHaveThisFriendAsync does not return true when user has the given friend"); + //} + + // [Test] + // public async Task DoesUserHaveThisFriendAsync_ReturnsFalse_WhenUserDoesNotHaveTheGivenFriend() + // { + // User dummyUser = this.CreateDummyUser(); + // User anotherDummyUser = this.CreateAnotherDummyUser(); + // + // this._context.Users.Add(dummyUser); + // this._context.Users.Add(anotherDummyUser); + // await this._context.SaveChangesAsync(); + // + // bool result = await this._userRepository.DoesUserHaveThisFriendAsync(dummyUser.Id, anotherDummyUser.Id); + // + // Assert.IsFalse(result, "DoesUserHaveThisFriendAsync does not return false when user des not have the given friend"); + // } + #endregion + + #region DoesUserHaveThisUsername + [Test] + public async Task DoesUserHaveThisUsername_ReturnsTrue_WhenUserHasTheGivenUsername() + { + User dummyUser = this.CreateDummyUser(); + this._context.Users.Add(dummyUser); + await this._context.SaveChangesAsync(); + + bool result = this._userRepository.DoesUserHaveThisUsername(dummyUser.Id, dummyUser.UserName); + + Assert.IsTrue(result, "DoesUserHaveThisUsername does not return true when the user has the given name"); + } + + [Test] + public async Task DoesUserHaveThisUsername_ReturnsFalse_WhenUserDoesntHaveTheGivenUsername() + { + string username = "Fake username"; + User dummyUser = this.CreateDummyUser(); + this._context.Users.Add(dummyUser); + await this._context.SaveChangesAsync(); + + bool result = this._userRepository.DoesUserHaveThisUsername(dummyUser.Id, username); + + Assert.IsFalse(result, "DoesUserNameExistAsync does not return false when user doesnt have the given name"); + } + #endregion + + #region HelperMethods + private User CreateDummyUser() + { + HashSet languages = new() + { + new Language() + { + Id = Guid.NewGuid(), + Name = "csharp" + }, + }; + + HashSet technologies = new() + { + new Technology() + { + Id = Guid.NewGuid(), + Name = "ASP.NET Core" + }, + }; + + HashSet roles = new() + { + new Role() + { + Id = Guid.NewGuid(), + Name = Role.DefaultRole + }, + }; + + return new() + { + Id = Guid.NewGuid(), + UserName = "dummyUser", + FirstName = "Spas", + LastName = "Spasov", + Email = "abv@abv.bg", + Languages = languages, + Technologies = technologies, + Roles = roles + }; + } + + private User CreateAnotherDummyUser() + { + HashSet languages = new() + { + new Language() + { + Id = Guid.NewGuid(), + Name = "typescript" + }, + }; + + HashSet technologies = new() + { + new Technology() + { + Id = Guid.NewGuid(), + Name = "Angular" + }, + }; + + HashSet roles = new() + { + new Role() + { + Id = Guid.NewGuid(), + Name = Role.DefaultRole + }, + }; + + return new() + { + Id = Guid.NewGuid(), + UserName = "anotherDummyUser", + FirstName = "Alex", + LastName = "Spiridonov", + Email = "a_spiridonov@abv.bg", + Languages = languages, + Technologies = technologies, + Roles = roles + }; + } + #endregion + } +} diff --git a/src/Data/DevHive.Data/ConnectionString.json b/src/Data/DevHive.Data/ConnectionString.json new file mode 100644 index 0000000..c8300b2 --- /dev/null +++ b/src/Data/DevHive.Data/ConnectionString.json @@ -0,0 +1,5 @@ +{ + "ConnectionStrings": { + "DEV": "Server=localhost;Port=5432;Database=API;User Id=postgres;Password=password;" + } +} \ No newline at end of file diff --git a/src/Data/DevHive.Data/DevHive.Data.csproj b/src/Data/DevHive.Data/DevHive.Data.csproj new file mode 100644 index 0000000..62b61dc --- /dev/null +++ b/src/Data/DevHive.Data/DevHive.Data.csproj @@ -0,0 +1,34 @@ + + + + net5.0 + + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + + + + + true + latest + + + diff --git a/src/Data/DevHive.Data/DevHiveContext.cs b/src/Data/DevHive.Data/DevHiveContext.cs new file mode 100644 index 0000000..9de33c3 --- /dev/null +++ b/src/Data/DevHive.Data/DevHiveContext.cs @@ -0,0 +1,115 @@ +using System; +using DevHive.Data.Models; +using DevHive.Data.RelationModels; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; + +namespace DevHive.Data +{ + public class DevHiveContext : IdentityDbContext + { + public DevHiveContext(DbContextOptions options) + : base(options) { } + + public DbSet Technologies { get; set; } + public DbSet Languages { get; set; } + public DbSet Posts { get; set; } + public DbSet PostAttachments { get; set; } + public DbSet Comments { get; set; } + public DbSet Rating { get; set; } + public DbSet RatedPost { get; set; } + public DbSet UserRate { get; set; } + + protected override void OnModelCreating(ModelBuilder builder) + { + /* User */ + builder.Entity() + .HasIndex(x => x.UserName) + .IsUnique(); + + builder.Entity() + .HasOne(x => x.ProfilePicture) + .WithOne(x => x.User) + .HasForeignKey(x => x.UserId); + + /* Roles */ + builder.Entity() + .HasMany(x => x.Roles) + .WithMany(x => x.Users); + + /* Languages */ + builder.Entity() + .HasMany(x => x.Languages) + .WithMany(x => x.Users) + .UsingEntity(x => x.ToTable("LanguageUser")); + + builder.Entity() + .HasMany(x => x.Users) + .WithMany(x => x.Languages) + .UsingEntity(x => x.ToTable("LanguageUser")); + + /* Technologies */ + builder.Entity() + .HasMany(x => x.Technologies) + .WithMany(x => x.Users) + .UsingEntity(x => x.ToTable("TechnologyUser")); + + builder.Entity() + .HasMany(x => x.Users) + .WithMany(x => x.Technologies) + .UsingEntity(x => x.ToTable("TechnologyUser")); + + /* Post */ + builder.Entity() + .HasOne(x => x.Creator) + .WithMany(x => x.Posts); + + builder.Entity() + .HasMany(x => x.Comments) + .WithOne(x => x.Post); + + /* Post attachments */ + builder.Entity() + .HasOne(x => x.Post) + .WithMany(x => x.Attachments); + + /* Comment */ + builder.Entity() + .HasOne(x => x.Post) + .WithMany(x => x.Comments); + + builder.Entity() + .HasOne(x => x.Creator) + .WithMany(x => x.Comments); + + /* Rating */ + builder.Entity() + .HasKey(x => x.Id); + + builder.Entity() + .HasOne(x => x.Post) + .WithOne(x => x.Rating) + .HasForeignKey(x => x.PostId); + + builder.Entity() + .HasOne(x => x.Rating) + .WithOne(x => x.Post); + + /* User Rated Posts */ + builder.Entity() + .HasKey(x => new { x.UserId, x.PostId }); + + builder.Entity() + .HasOne(x => x.User) + .WithMany(x => x.RatedPosts); + + builder.Entity() + .HasOne(x => x.Post); + + builder.Entity() + .HasMany(x => x.RatedPosts); + + base.OnModelCreating(builder); + } + } +} diff --git a/src/Data/DevHive.Data/DevHiveContextFactory.cs b/src/Data/DevHive.Data/DevHiveContextFactory.cs new file mode 100644 index 0000000..f4849d7 --- /dev/null +++ b/src/Data/DevHive.Data/DevHiveContextFactory.cs @@ -0,0 +1,23 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Configuration; +using System.IO; + +namespace DevHive.Data +{ + public class DevHiveContextFactory : IDesignTimeDbContextFactory + { + public DevHiveContext CreateDbContext(string[] args) + { + var configuration = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("ConnectionString.json") + .Build(); + + var optionsBuilder = new DbContextOptionsBuilder() + .UseNpgsql(configuration.GetConnectionString("DEV")); + + return new DevHiveContext(optionsBuilder.Options); + } + } +} \ No newline at end of file diff --git a/src/Data/DevHive.Data/Interfaces/Models/IComment.cs b/src/Data/DevHive.Data/Interfaces/Models/IComment.cs new file mode 100644 index 0000000..97c1578 --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Models/IComment.cs @@ -0,0 +1,16 @@ +using System; +using DevHive.Data.Models; + +namespace DevHive.Data.Interfaces.Models +{ + public interface IComment : IModel + { + Post Post { get; set; } + + User Creator { get; set; } + + string Message { get; set; } + + DateTime TimeCreated { get; set; } + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Models/ILanguage.cs b/src/Data/DevHive.Data/Interfaces/Models/ILanguage.cs new file mode 100644 index 0000000..9eed09d --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Models/ILanguage.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using DevHive.Data.Models; + +namespace DevHive.Data.Interfaces.Models +{ + public interface ILanguage : IModel + { + string Name { get; set; } + HashSet Users { get; set; } + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Models/IModel.cs b/src/Data/DevHive.Data/Interfaces/Models/IModel.cs new file mode 100644 index 0000000..f903af3 --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Models/IModel.cs @@ -0,0 +1,9 @@ +using System; + +namespace DevHive.Data.Interfaces.Models +{ + public interface IModel + { + Guid Id { get; set; } + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Models/IPost.cs b/src/Data/DevHive.Data/Interfaces/Models/IPost.cs new file mode 100644 index 0000000..712d955 --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Models/IPost.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using DevHive.Data.Models; +using DevHive.Data.RelationModels; + +namespace DevHive.Data.Interfaces.Models +{ + public interface IPost : IModel + { + User Creator { get; set; } + + string Message { get; set; } + + DateTime TimeCreated { get; set; } + + List Comments { get; set; } + + // Rating Rating { get; set; } + + List Attachments { get; set; } + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Models/IProfilePicture.cs b/src/Data/DevHive.Data/Interfaces/Models/IProfilePicture.cs new file mode 100644 index 0000000..c3fcbea --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Models/IProfilePicture.cs @@ -0,0 +1,13 @@ +using System; +using DevHive.Data.Models; + +namespace DevHive.Data.Interfaces.Models +{ + public interface IProfilePicture : IModel + { + Guid UserId { get; set; } + User User { get; set; } + + string PictureURL { get; set; } + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Models/IRating.cs b/src/Data/DevHive.Data/Interfaces/Models/IRating.cs new file mode 100644 index 0000000..d1b968f --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Models/IRating.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using DevHive.Data.Models; + +namespace DevHive.Data.Interfaces.Models +{ + public interface IRating : IModel + { + // Post Post { get; set; } + + int Rate { get; set; } + + // HashSet UsersThatRated { get; set; } + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Models/IRole.cs b/src/Data/DevHive.Data/Interfaces/Models/IRole.cs new file mode 100644 index 0000000..c8b7068 --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Models/IRole.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using DevHive.Data.Models; + +namespace DevHive.Data.Interfaces.Models +{ + public interface IRole + { + HashSet Users { get; set; } + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Models/ITechnology.cs b/src/Data/DevHive.Data/Interfaces/Models/ITechnology.cs new file mode 100644 index 0000000..153f75f --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Models/ITechnology.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using DevHive.Data.Models; + +namespace DevHive.Data.Interfaces.Models +{ + public interface ITechnology : IModel + { + string Name { get; set; } + HashSet Users { get; set; } + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Models/IUser.cs b/src/Data/DevHive.Data/Interfaces/Models/IUser.cs new file mode 100644 index 0000000..fcd741c --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Models/IUser.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using DevHive.Data.Models; +using DevHive.Data.RelationModels; + +namespace DevHive.Data.Interfaces.Models +{ + public interface IUser : IModel + { + string FirstName { get; set; } + + string LastName { get; set; } + + ProfilePicture ProfilePicture { get; set; } + + HashSet Languages { get; set; } + + HashSet Technologies { get; set; } + + HashSet Roles { get; set; } + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Repositories/ICommentRepository.cs b/src/Data/DevHive.Data/Interfaces/Repositories/ICommentRepository.cs new file mode 100644 index 0000000..267f251 --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Repositories/ICommentRepository.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using DevHive.Data.Models; +using DevHive.Data.Repositories.Interfaces; + +namespace DevHive.Data.Interfaces.Repositories +{ + public interface ICommentRepository : IRepository + { + Task> GetPostComments(Guid postId); + + Task DoesCommentExist(Guid id); + Task GetCommentByIssuerAndTimeCreatedAsync(Guid issuerId, DateTime timeCreated); + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Repositories/IFeedRepository.cs b/src/Data/DevHive.Data/Interfaces/Repositories/IFeedRepository.cs new file mode 100644 index 0000000..7262510 --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Repositories/IFeedRepository.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using DevHive.Data.Models; + +namespace DevHive.Data.Interfaces.Repositories +{ + public interface IFeedRepository + { + Task> GetFriendsPosts(List friendsList, DateTime firstRequestIssued, int pageNumber, int pageSize); + Task> GetUsersPosts(User user, DateTime firstRequestIssued, int pageNumber, int pageSize); + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Repositories/ILanguageRepository.cs b/src/Data/DevHive.Data/Interfaces/Repositories/ILanguageRepository.cs new file mode 100644 index 0000000..db2949a --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Repositories/ILanguageRepository.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using DevHive.Data.Models; +using DevHive.Data.Repositories.Interfaces; + +namespace DevHive.Data.Interfaces.Repositories +{ + public interface ILanguageRepository : IRepository + { + HashSet GetLanguages(); + Task GetByNameAsync(string name); + + Task DoesLanguageExistAsync(Guid id); + Task DoesLanguageNameExistAsync(string languageName); + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Repositories/IPostRepository.cs b/src/Data/DevHive.Data/Interfaces/Repositories/IPostRepository.cs new file mode 100644 index 0000000..9f7cf85 --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Repositories/IPostRepository.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using DevHive.Data.Models; +using DevHive.Data.Repositories.Interfaces; + +namespace DevHive.Data.Interfaces.Repositories +{ + public interface IPostRepository : IRepository + { + Task AddNewPostToCreator(Guid userId, Post post); + + Task GetPostByCreatorAndTimeCreatedAsync(Guid issuerId, DateTime timeCreated); + Task> GetFileUrls(Guid postId); + + Task DoesPostExist(Guid postId); + Task DoesPostHaveFiles(Guid postId); + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Repositories/IRatingRepository.cs b/src/Data/DevHive.Data/Interfaces/Repositories/IRatingRepository.cs new file mode 100644 index 0000000..f77f301 --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Repositories/IRatingRepository.cs @@ -0,0 +1,13 @@ +using System; +using System.Threading.Tasks; +using DevHive.Data.Models; +using DevHive.Data.Repositories.Interfaces; + +namespace DevHive.Data.Interfaces.Repositories +{ + public interface IRatingRepository : IRepository + { + Task GetRatingByPostId(Guid postId); + Task UserRatedPost(Guid userId, Guid postId); + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Repositories/IRepository.cs b/src/Data/DevHive.Data/Interfaces/Repositories/IRepository.cs new file mode 100644 index 0000000..0d11cd3 --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Repositories/IRepository.cs @@ -0,0 +1,21 @@ +using System; +using System.Threading.Tasks; + +namespace DevHive.Data.Repositories.Interfaces +{ + public interface IRepository + where TEntity : class + { + //Add Entity to database + Task AddAsync(TEntity entity); + + //Find entity by id + Task GetByIdAsync(Guid id); + + //Modify Entity from database + Task EditAsync(Guid id, TEntity newEntity); + + //Delete Entity from database + Task DeleteAsync(TEntity entity); + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Repositories/IRoleRepository.cs b/src/Data/DevHive.Data/Interfaces/Repositories/IRoleRepository.cs new file mode 100644 index 0000000..e834369 --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Repositories/IRoleRepository.cs @@ -0,0 +1,15 @@ +using System; +using System.Threading.Tasks; +using DevHive.Data.Models; +using DevHive.Data.Repositories.Interfaces; + +namespace DevHive.Data.Interfaces.Repositories +{ + public interface IRoleRepository : IRepository + { + Task GetByNameAsync(string name); + + Task DoesNameExist(string name); + Task DoesRoleExist(Guid id); + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Repositories/ITechnologyRepository.cs b/src/Data/DevHive.Data/Interfaces/Repositories/ITechnologyRepository.cs new file mode 100644 index 0000000..9126bfc --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Repositories/ITechnologyRepository.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using DevHive.Data.Models; +using DevHive.Data.Repositories.Interfaces; + +namespace DevHive.Data.Interfaces.Repositories +{ + public interface ITechnologyRepository : IRepository + { + Task GetByNameAsync(string name); + HashSet GetTechnologies(); + + Task DoesTechnologyExistAsync(Guid id); + Task DoesTechnologyNameExistAsync(string technologyName); + } +} diff --git a/src/Data/DevHive.Data/Interfaces/Repositories/IUserRepository.cs b/src/Data/DevHive.Data/Interfaces/Repositories/IUserRepository.cs new file mode 100644 index 0000000..5ebe3d3 --- /dev/null +++ b/src/Data/DevHive.Data/Interfaces/Repositories/IUserRepository.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using DevHive.Data.Models; +using DevHive.Data.Repositories.Interfaces; + +namespace DevHive.Data.Interfaces.Repositories +{ + public interface IUserRepository : IRepository + { + //Read + Task GetByUsernameAsync(string username); + Task UpdateProfilePicture(Guid userId, string pictureUrl); + + //Validations + Task ValidateFriendsCollectionAsync(List usernames); + Task DoesEmailExistAsync(string email); + Task DoesUserExistAsync(Guid id); + Task DoesUsernameExistAsync(string username); + bool DoesUserHaveThisUsername(Guid id, string username); + } +} diff --git a/src/Data/DevHive.Data/Migrations/20210205140955_rating.Designer.cs b/src/Data/DevHive.Data/Migrations/20210205140955_rating.Designer.cs new file mode 100644 index 0000000..8d2adc4 --- /dev/null +++ b/src/Data/DevHive.Data/Migrations/20210205140955_rating.Designer.cs @@ -0,0 +1,665 @@ +// +using System; +using System.Collections.Generic; +using DevHive.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace DevHive.Data.Migrations +{ + [DbContext(typeof(DevHiveContext))] + [Migration("20210205140955_rating")] + partial class rating + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseIdentityByDefaultColumns() + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.1"); + + modelBuilder.Entity("DevHive.Data.Models.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatorId") + .HasColumnType("uuid"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.Property("TimeCreated") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.HasIndex("PostId"); + + b.ToTable("Comments"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Language", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Languages"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Post", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatorId") + .HasColumnType("uuid"); + + b.Property>("FileUrls") + .HasColumnType("text[]"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("TimeCreated") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.ToTable("Posts"); + }); + + modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("PictureURL") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("ProfilePicture"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Rating", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.Property("Rate") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PostId") + .IsUnique(); + + b.ToTable("Rating"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Technology", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Technologies"); + }); + + modelBuilder.Entity("DevHive.Data.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("FirstName") + .HasColumnType("text"); + + b.Property("LastName") + .HasColumnType("text"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("UserName") + .IsUnique(); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "PostId"); + + b.HasIndex("PostId"); + + b.ToTable("RatedPosts"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserFriend", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("FriendId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "FriendId"); + + b.HasIndex("FriendId"); + + b.ToTable("UserFriends"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Liked") + .HasColumnType("boolean"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("PostId"); + + b.HasIndex("UserId"); + + b.ToTable("UserRates"); + }); + + modelBuilder.Entity("LanguageUser", b => + { + b.Property("LanguagesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("LanguagesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("LanguageUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.Property("RolesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("RolesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("RoleUser"); + }); + + modelBuilder.Entity("TechnologyUser", b => + { + b.Property("TechnologiesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("TechnologiesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("TechnologyUser"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Comment", b => + { + b.HasOne("DevHive.Data.Models.User", "Creator") + .WithMany("Comments") + .HasForeignKey("CreatorId"); + + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithMany("Comments") + .HasForeignKey("PostId"); + + b.Navigation("Creator"); + + b.Navigation("Post"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Post", b => + { + b.HasOne("DevHive.Data.Models.User", "Creator") + .WithMany("Posts") + .HasForeignKey("CreatorId"); + + b.Navigation("Creator"); + }); + + modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => + { + b.HasOne("DevHive.Data.Models.User", "User") + .WithOne("ProfilePicture") + .HasForeignKey("DevHive.Data.Models.ProfilePicture", "UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Rating", b => + { + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithOne("Rating") + .HasForeignKey("DevHive.Data.Models.Rating", "PostId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Post"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => + { + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithMany() + .HasForeignKey("PostId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", "User") + .WithMany("RatedPosts") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Post"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserFriend", b => + { + b.HasOne("DevHive.Data.Models.User", "Friend") + .WithMany("FriendsOf") + .HasForeignKey("FriendId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", "User") + .WithMany("MyFriends") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Friend"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => + { + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithMany() + .HasForeignKey("PostId"); + + b.HasOne("DevHive.Data.Models.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("Post"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LanguageUser", b => + { + b.HasOne("DevHive.Data.Models.Language", null) + .WithMany() + .HasForeignKey("LanguagesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("DevHive.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("DevHive.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.HasOne("DevHive.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RolesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("TechnologyUser", b => + { + b.HasOne("DevHive.Data.Models.Technology", null) + .WithMany() + .HasForeignKey("TechnologiesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DevHive.Data.Models.Post", b => + { + b.Navigation("Comments"); + + b.Navigation("Rating"); + }); + + modelBuilder.Entity("DevHive.Data.Models.User", b => + { + b.Navigation("Comments"); + + b.Navigation("FriendsOf"); + + b.Navigation("MyFriends"); + + b.Navigation("Posts"); + + b.Navigation("ProfilePicture"); + + b.Navigation("RatedPosts"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Data/DevHive.Data/Migrations/20210205140955_rating.cs b/src/Data/DevHive.Data/Migrations/20210205140955_rating.cs new file mode 100644 index 0000000..d507dae --- /dev/null +++ b/src/Data/DevHive.Data/Migrations/20210205140955_rating.cs @@ -0,0 +1,581 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace DevHive.Data.Migrations +{ + public partial class rating : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AspNetRoles", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + NormalizedName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + ConcurrencyStamp = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetRoles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AspNetUsers", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + FirstName = table.Column(type: "text", nullable: true), + LastName = table.Column(type: "text", nullable: true), + UserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + NormalizedUserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + Email = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + NormalizedEmail = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + EmailConfirmed = table.Column(type: "boolean", nullable: false), + PasswordHash = table.Column(type: "text", nullable: true), + SecurityStamp = table.Column(type: "text", nullable: true), + ConcurrencyStamp = table.Column(type: "text", nullable: true), + PhoneNumber = table.Column(type: "text", nullable: true), + PhoneNumberConfirmed = table.Column(type: "boolean", nullable: false), + TwoFactorEnabled = table.Column(type: "boolean", nullable: false), + LockoutEnd = table.Column(type: "timestamp with time zone", nullable: true), + LockoutEnabled = table.Column(type: "boolean", nullable: false), + AccessFailedCount = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Languages", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Languages", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Technologies", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Technologies", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AspNetRoleClaims", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + RoleId = table.Column(type: "uuid", nullable: false), + ClaimType = table.Column(type: "text", nullable: true), + ClaimValue = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); + table.ForeignKey( + name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", + column: x => x.RoleId, + principalTable: "AspNetRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserClaims", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + UserId = table.Column(type: "uuid", nullable: false), + ClaimType = table.Column(type: "text", nullable: true), + ClaimValue = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); + table.ForeignKey( + name: "FK_AspNetUserClaims_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserLogins", + columns: table => new + { + LoginProvider = table.Column(type: "text", nullable: false), + ProviderKey = table.Column(type: "text", nullable: false), + ProviderDisplayName = table.Column(type: "text", nullable: true), + UserId = table.Column(type: "uuid", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); + table.ForeignKey( + name: "FK_AspNetUserLogins_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserRoles", + columns: table => new + { + UserId = table.Column(type: "uuid", nullable: false), + RoleId = table.Column(type: "uuid", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); + table.ForeignKey( + name: "FK_AspNetUserRoles_AspNetRoles_RoleId", + column: x => x.RoleId, + principalTable: "AspNetRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AspNetUserRoles_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserTokens", + columns: table => new + { + UserId = table.Column(type: "uuid", nullable: false), + LoginProvider = table.Column(type: "text", nullable: false), + Name = table.Column(type: "text", nullable: false), + Value = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); + table.ForeignKey( + name: "FK_AspNetUserTokens_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Posts", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true), + Message = table.Column(type: "text", nullable: true), + TimeCreated = table.Column(type: "timestamp without time zone", nullable: false), + FileUrls = table.Column>(type: "text[]", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Posts", x => x.Id); + table.ForeignKey( + name: "FK_Posts_AspNetUsers_CreatorId", + column: x => x.CreatorId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "ProfilePicture", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + UserId = table.Column(type: "uuid", nullable: false), + PictureURL = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ProfilePicture", x => x.Id); + table.ForeignKey( + name: "FK_ProfilePicture_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "RoleUser", + columns: table => new + { + RolesId = table.Column(type: "uuid", nullable: false), + UsersId = table.Column(type: "uuid", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_RoleUser", x => new { x.RolesId, x.UsersId }); + table.ForeignKey( + name: "FK_RoleUser_AspNetRoles_RolesId", + column: x => x.RolesId, + principalTable: "AspNetRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_RoleUser_AspNetUsers_UsersId", + column: x => x.UsersId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "UserFriends", + columns: table => new + { + UserId = table.Column(type: "uuid", nullable: false), + FriendId = table.Column(type: "uuid", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_UserFriends", x => new { x.UserId, x.FriendId }); + table.ForeignKey( + name: "FK_UserFriends_AspNetUsers_FriendId", + column: x => x.FriendId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_UserFriends_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "LanguageUser", + columns: table => new + { + LanguagesId = table.Column(type: "uuid", nullable: false), + UsersId = table.Column(type: "uuid", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_LanguageUser", x => new { x.LanguagesId, x.UsersId }); + table.ForeignKey( + name: "FK_LanguageUser_AspNetUsers_UsersId", + column: x => x.UsersId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_LanguageUser_Languages_LanguagesId", + column: x => x.LanguagesId, + principalTable: "Languages", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "TechnologyUser", + columns: table => new + { + TechnologiesId = table.Column(type: "uuid", nullable: false), + UsersId = table.Column(type: "uuid", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_TechnologyUser", x => new { x.TechnologiesId, x.UsersId }); + table.ForeignKey( + name: "FK_TechnologyUser_AspNetUsers_UsersId", + column: x => x.UsersId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_TechnologyUser_Technologies_TechnologiesId", + column: x => x.TechnologiesId, + principalTable: "Technologies", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Comments", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + PostId = table.Column(type: "uuid", nullable: true), + CreatorId = table.Column(type: "uuid", nullable: true), + Message = table.Column(type: "text", nullable: true), + TimeCreated = table.Column(type: "timestamp without time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Comments", x => x.Id); + table.ForeignKey( + name: "FK_Comments_AspNetUsers_CreatorId", + column: x => x.CreatorId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_Comments_Posts_PostId", + column: x => x.PostId, + principalTable: "Posts", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "RatedPosts", + columns: table => new + { + UserId = table.Column(type: "uuid", nullable: false), + PostId = table.Column(type: "uuid", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_RatedPosts", x => new { x.UserId, x.PostId }); + table.ForeignKey( + name: "FK_RatedPosts_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_RatedPosts_Posts_PostId", + column: x => x.PostId, + principalTable: "Posts", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Rating", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + PostId = table.Column(type: "uuid", nullable: false), + Rate = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Rating", x => x.Id); + table.ForeignKey( + name: "FK_Rating_Posts_PostId", + column: x => x.PostId, + principalTable: "Posts", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "UserRates", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + UserId = table.Column(type: "uuid", nullable: true), + Liked = table.Column(type: "boolean", nullable: false), + PostId = table.Column(type: "uuid", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_UserRates", x => x.Id); + table.ForeignKey( + name: "FK_UserRates_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_UserRates_Posts_PostId", + column: x => x.PostId, + principalTable: "Posts", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_AspNetRoleClaims_RoleId", + table: "AspNetRoleClaims", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "RoleNameIndex", + table: "AspNetRoles", + column: "NormalizedName", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserClaims_UserId", + table: "AspNetUserClaims", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserLogins_UserId", + table: "AspNetUserLogins", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserRoles_RoleId", + table: "AspNetUserRoles", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "EmailIndex", + table: "AspNetUsers", + column: "NormalizedEmail"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUsers_UserName", + table: "AspNetUsers", + column: "UserName", + unique: true); + + migrationBuilder.CreateIndex( + name: "UserNameIndex", + table: "AspNetUsers", + column: "NormalizedUserName", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Comments_CreatorId", + table: "Comments", + column: "CreatorId"); + + migrationBuilder.CreateIndex( + name: "IX_Comments_PostId", + table: "Comments", + column: "PostId"); + + migrationBuilder.CreateIndex( + name: "IX_LanguageUser_UsersId", + table: "LanguageUser", + column: "UsersId"); + + migrationBuilder.CreateIndex( + name: "IX_Posts_CreatorId", + table: "Posts", + column: "CreatorId"); + + migrationBuilder.CreateIndex( + name: "IX_ProfilePicture_UserId", + table: "ProfilePicture", + column: "UserId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_RatedPosts_PostId", + table: "RatedPosts", + column: "PostId"); + + migrationBuilder.CreateIndex( + name: "IX_Rating_PostId", + table: "Rating", + column: "PostId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_RoleUser_UsersId", + table: "RoleUser", + column: "UsersId"); + + migrationBuilder.CreateIndex( + name: "IX_TechnologyUser_UsersId", + table: "TechnologyUser", + column: "UsersId"); + + migrationBuilder.CreateIndex( + name: "IX_UserFriends_FriendId", + table: "UserFriends", + column: "FriendId"); + + migrationBuilder.CreateIndex( + name: "IX_UserRates_PostId", + table: "UserRates", + column: "PostId"); + + migrationBuilder.CreateIndex( + name: "IX_UserRates_UserId", + table: "UserRates", + column: "UserId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AspNetRoleClaims"); + + migrationBuilder.DropTable( + name: "AspNetUserClaims"); + + migrationBuilder.DropTable( + name: "AspNetUserLogins"); + + migrationBuilder.DropTable( + name: "AspNetUserRoles"); + + migrationBuilder.DropTable( + name: "AspNetUserTokens"); + + migrationBuilder.DropTable( + name: "Comments"); + + migrationBuilder.DropTable( + name: "LanguageUser"); + + migrationBuilder.DropTable( + name: "ProfilePicture"); + + migrationBuilder.DropTable( + name: "RatedPosts"); + + migrationBuilder.DropTable( + name: "Rating"); + + migrationBuilder.DropTable( + name: "RoleUser"); + + migrationBuilder.DropTable( + name: "TechnologyUser"); + + migrationBuilder.DropTable( + name: "UserFriends"); + + migrationBuilder.DropTable( + name: "UserRates"); + + migrationBuilder.DropTable( + name: "Languages"); + + migrationBuilder.DropTable( + name: "AspNetRoles"); + + migrationBuilder.DropTable( + name: "Technologies"); + + migrationBuilder.DropTable( + name: "Posts"); + + migrationBuilder.DropTable( + name: "AspNetUsers"); + } + } +} diff --git a/src/Data/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.Designer.cs b/src/Data/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.Designer.cs new file mode 100644 index 0000000..c11374a --- /dev/null +++ b/src/Data/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.Designer.cs @@ -0,0 +1,643 @@ +// +using System; +using System.Collections.Generic; +using DevHive.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace DevHive.Data.Migrations +{ + [DbContext(typeof(DevHiveContext))] + [Migration("20210205150447_Friends_Init_Config")] + partial class Friends_Init_Config + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseIdentityByDefaultColumns() + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.1"); + + modelBuilder.Entity("DevHive.Data.Models.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatorId") + .HasColumnType("uuid"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.Property("TimeCreated") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.HasIndex("PostId"); + + b.ToTable("Comments"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Language", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Languages"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Post", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatorId") + .HasColumnType("uuid"); + + b.Property>("FileUrls") + .HasColumnType("text[]"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("TimeCreated") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.ToTable("Posts"); + }); + + modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("PictureURL") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("ProfilePicture"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Rating", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Rate") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Rating"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Technology", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Technologies"); + }); + + modelBuilder.Entity("DevHive.Data.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("FirstName") + .HasColumnType("text"); + + b.Property("LastName") + .HasColumnType("text"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("UserId"); + + b.HasIndex("UserName") + .IsUnique(); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "PostId"); + + b.HasIndex("PostId"); + + b.ToTable("RatedPosts"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserFriend", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("FriendId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "FriendId"); + + b.HasIndex("FriendId"); + + b.ToTable("UserFriends"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Rate") + .HasColumnType("boolean"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserRates"); + }); + + modelBuilder.Entity("LanguageUser", b => + { + b.Property("LanguagesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("LanguagesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("LanguageUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.Property("RolesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("RolesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("RoleUser"); + }); + + modelBuilder.Entity("TechnologyUser", b => + { + b.Property("TechnologiesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("TechnologiesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("TechnologyUser"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Comment", b => + { + b.HasOne("DevHive.Data.Models.User", "Creator") + .WithMany("Comments") + .HasForeignKey("CreatorId"); + + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithMany("Comments") + .HasForeignKey("PostId"); + + b.Navigation("Creator"); + + b.Navigation("Post"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Post", b => + { + b.HasOne("DevHive.Data.Models.User", "Creator") + .WithMany("Posts") + .HasForeignKey("CreatorId"); + + b.Navigation("Creator"); + }); + + modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => + { + b.HasOne("DevHive.Data.Models.User", "User") + .WithOne("ProfilePicture") + .HasForeignKey("DevHive.Data.Models.ProfilePicture", "UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("DevHive.Data.Models.User", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany("Friends") + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => + { + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithMany() + .HasForeignKey("PostId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Post"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserFriend", b => + { + b.HasOne("DevHive.Data.Models.User", "Friend") + .WithMany() + .HasForeignKey("FriendId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Friend"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => + { + b.HasOne("DevHive.Data.Models.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LanguageUser", b => + { + b.HasOne("DevHive.Data.Models.Language", null) + .WithMany() + .HasForeignKey("LanguagesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("DevHive.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("DevHive.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.HasOne("DevHive.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RolesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("TechnologyUser", b => + { + b.HasOne("DevHive.Data.Models.Technology", null) + .WithMany() + .HasForeignKey("TechnologiesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DevHive.Data.Models.Post", b => + { + b.Navigation("Comments"); + }); + + modelBuilder.Entity("DevHive.Data.Models.User", b => + { + b.Navigation("Comments"); + + b.Navigation("Friends"); + + b.Navigation("Posts"); + + b.Navigation("ProfilePicture"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Data/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.cs b/src/Data/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.cs new file mode 100644 index 0000000..1fc970d --- /dev/null +++ b/src/Data/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.cs @@ -0,0 +1,45 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace DevHive.Data.Migrations +{ + public partial class Friends_Init_Config : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "UserId", + table: "AspNetUsers", + type: "uuid", + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUsers_UserId", + table: "AspNetUsers", + column: "UserId"); + + migrationBuilder.AddForeignKey( + name: "FK_AspNetUsers_AspNetUsers_UserId", + table: "AspNetUsers", + column: "UserId", + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_AspNetUsers_AspNetUsers_UserId", + table: "AspNetUsers"); + + migrationBuilder.DropIndex( + name: "IX_AspNetUsers_UserId", + table: "AspNetUsers"); + + migrationBuilder.DropColumn( + name: "UserId", + table: "AspNetUsers"); + } + } +} diff --git a/src/Data/DevHive.Data/Migrations/20210205154810_PostFileAttachments.Designer.cs b/src/Data/DevHive.Data/Migrations/20210205154810_PostFileAttachments.Designer.cs new file mode 100644 index 0000000..5d8e13a --- /dev/null +++ b/src/Data/DevHive.Data/Migrations/20210205154810_PostFileAttachments.Designer.cs @@ -0,0 +1,691 @@ +// +using System; +using DevHive.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace DevHive.Data.Migrations +{ + [DbContext(typeof(DevHiveContext))] + [Migration("20210205154810_PostFileAttachments")] + partial class PostFileAttachments + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseIdentityByDefaultColumns() + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.1"); + + modelBuilder.Entity("DevHive.Data.Models.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatorId") + .HasColumnType("uuid"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.Property("TimeCreated") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.HasIndex("PostId"); + + b.ToTable("Comments"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Language", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Languages"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Post", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatorId") + .HasColumnType("uuid"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("TimeCreated") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.ToTable("Posts"); + }); + + modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("PictureURL") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("ProfilePicture"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Rating", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.Property("Rate") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PostId") + .IsUnique(); + + b.ToTable("Rating"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Technology", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Technologies"); + }); + + modelBuilder.Entity("DevHive.Data.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("FirstName") + .HasColumnType("text"); + + b.Property("LastName") + .HasColumnType("text"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("UserName") + .IsUnique(); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.PostAttachments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("FileUrl") + .HasColumnType("text"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("PostId"); + + b.ToTable("PostAttachments"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "PostId"); + + b.HasIndex("PostId"); + + b.ToTable("RatedPosts"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserFriend", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("FriendId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "FriendId"); + + b.HasIndex("FriendId"); + + b.ToTable("UserFriends"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Liked") + .HasColumnType("boolean"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("PostId"); + + b.HasIndex("UserId"); + + b.ToTable("UserRates"); + }); + + modelBuilder.Entity("LanguageUser", b => + { + b.Property("LanguagesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("LanguagesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("LanguageUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.Property("RolesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("RolesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("RoleUser"); + }); + + modelBuilder.Entity("TechnologyUser", b => + { + b.Property("TechnologiesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("TechnologiesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("TechnologyUser"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Comment", b => + { + b.HasOne("DevHive.Data.Models.User", "Creator") + .WithMany("Comments") + .HasForeignKey("CreatorId"); + + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithMany("Comments") + .HasForeignKey("PostId"); + + b.Navigation("Creator"); + + b.Navigation("Post"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Post", b => + { + b.HasOne("DevHive.Data.Models.User", "Creator") + .WithMany("Posts") + .HasForeignKey("CreatorId"); + + b.Navigation("Creator"); + }); + + modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => + { + b.HasOne("DevHive.Data.Models.User", "User") + .WithOne("ProfilePicture") + .HasForeignKey("DevHive.Data.Models.ProfilePicture", "UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Rating", b => + { + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithOne("Rating") + .HasForeignKey("DevHive.Data.Models.Rating", "PostId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Post"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.PostAttachments", b => + { + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithMany("Attachments") + .HasForeignKey("PostId"); + + b.Navigation("Post"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => + { + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithMany() + .HasForeignKey("PostId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", "User") + .WithMany("RatedPosts") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Post"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserFriend", b => + { + b.HasOne("DevHive.Data.Models.User", "Friend") + .WithMany("FriendsOf") + .HasForeignKey("FriendId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", "User") + .WithMany("MyFriends") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Friend"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => + { + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithMany() + .HasForeignKey("PostId"); + + b.HasOne("DevHive.Data.Models.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("Post"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LanguageUser", b => + { + b.HasOne("DevHive.Data.Models.Language", null) + .WithMany() + .HasForeignKey("LanguagesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("DevHive.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("DevHive.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.HasOne("DevHive.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RolesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("TechnologyUser", b => + { + b.HasOne("DevHive.Data.Models.Technology", null) + .WithMany() + .HasForeignKey("TechnologiesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DevHive.Data.Models.Post", b => + { + b.Navigation("Attachments"); + + b.Navigation("Comments"); + + b.Navigation("Rating"); + }); + + modelBuilder.Entity("DevHive.Data.Models.User", b => + { + b.Navigation("Comments"); + + b.Navigation("FriendsOf"); + + b.Navigation("MyFriends"); + + b.Navigation("Posts"); + + b.Navigation("ProfilePicture"); + + b.Navigation("RatedPosts"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Data/DevHive.Data/Migrations/20210205154810_PostFileAttachments.cs b/src/Data/DevHive.Data/Migrations/20210205154810_PostFileAttachments.cs new file mode 100644 index 0000000..7b7b933 --- /dev/null +++ b/src/Data/DevHive.Data/Migrations/20210205154810_PostFileAttachments.cs @@ -0,0 +1,51 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace DevHive.Data.Migrations +{ + public partial class PostFileAttachments : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "FileUrls", + table: "Posts"); + + migrationBuilder.CreateTable( + name: "PostAttachments", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + PostId = table.Column(type: "uuid", nullable: true), + FileUrl = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_PostAttachments", x => x.Id); + table.ForeignKey( + name: "FK_PostAttachments_Posts_PostId", + column: x => x.PostId, + principalTable: "Posts", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_PostAttachments_PostId", + table: "PostAttachments", + column: "PostId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "PostAttachments"); + + migrationBuilder.AddColumn( + name: "FileUrls", + table: "Posts", + type: "text[]", + nullable: true); + } + } +} diff --git a/src/Data/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.Designer.cs b/src/Data/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.Designer.cs new file mode 100644 index 0000000..3ad3ec8 --- /dev/null +++ b/src/Data/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.Designer.cs @@ -0,0 +1,609 @@ +// +using System; +using System.Collections.Generic; +using DevHive.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace DevHive.Data.Migrations +{ + [DbContext(typeof(DevHiveContext))] + [Migration("20210205160520_Friends_First_Tweek")] + partial class Friends_First_Tweek + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseIdentityByDefaultColumns() + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.1"); + + modelBuilder.Entity("DevHive.Data.Models.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatorId") + .HasColumnType("uuid"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.Property("TimeCreated") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.HasIndex("PostId"); + + b.ToTable("Comments"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Language", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Languages"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Post", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatorId") + .HasColumnType("uuid"); + + b.Property>("FileUrls") + .HasColumnType("text[]"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("TimeCreated") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.ToTable("Posts"); + }); + + modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("PictureURL") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("ProfilePicture"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Rating", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Rate") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Rating"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Technology", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Technologies"); + }); + + modelBuilder.Entity("DevHive.Data.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("FirstName") + .HasColumnType("text"); + + b.Property("LastName") + .HasColumnType("text"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("UserId"); + + b.HasIndex("UserName") + .IsUnique(); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "PostId"); + + b.HasIndex("PostId"); + + b.ToTable("RatedPosts"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Rate") + .HasColumnType("boolean"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserRates"); + }); + + modelBuilder.Entity("LanguageUser", b => + { + b.Property("LanguagesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("LanguagesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("LanguageUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.Property("RolesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("RolesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("RoleUser"); + }); + + modelBuilder.Entity("TechnologyUser", b => + { + b.Property("TechnologiesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("TechnologiesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("TechnologyUser"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Comment", b => + { + b.HasOne("DevHive.Data.Models.User", "Creator") + .WithMany("Comments") + .HasForeignKey("CreatorId"); + + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithMany("Comments") + .HasForeignKey("PostId"); + + b.Navigation("Creator"); + + b.Navigation("Post"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Post", b => + { + b.HasOne("DevHive.Data.Models.User", "Creator") + .WithMany("Posts") + .HasForeignKey("CreatorId"); + + b.Navigation("Creator"); + }); + + modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => + { + b.HasOne("DevHive.Data.Models.User", "User") + .WithOne("ProfilePicture") + .HasForeignKey("DevHive.Data.Models.ProfilePicture", "UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("DevHive.Data.Models.User", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany("Friends") + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => + { + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithMany() + .HasForeignKey("PostId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Post"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => + { + b.HasOne("DevHive.Data.Models.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LanguageUser", b => + { + b.HasOne("DevHive.Data.Models.Language", null) + .WithMany() + .HasForeignKey("LanguagesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("DevHive.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("DevHive.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.HasOne("DevHive.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RolesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("TechnologyUser", b => + { + b.HasOne("DevHive.Data.Models.Technology", null) + .WithMany() + .HasForeignKey("TechnologiesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DevHive.Data.Models.Post", b => + { + b.Navigation("Comments"); + }); + + modelBuilder.Entity("DevHive.Data.Models.User", b => + { + b.Navigation("Comments"); + + b.Navigation("Friends"); + + b.Navigation("Posts"); + + b.Navigation("ProfilePicture"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Data/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.cs b/src/Data/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.cs new file mode 100644 index 0000000..565f863 --- /dev/null +++ b/src/Data/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.cs @@ -0,0 +1,46 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace DevHive.Data.Migrations +{ + public partial class Friends_First_Tweek : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "UserFriends"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "UserFriends", + columns: table => new + { + UserId = table.Column(type: "uuid", nullable: false), + FriendId = table.Column(type: "uuid", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_UserFriends", x => new { x.UserId, x.FriendId }); + table.ForeignKey( + name: "FK_UserFriends_AspNetUsers_FriendId", + column: x => x.FriendId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_UserFriends_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_UserFriends_FriendId", + table: "UserFriends", + column: "FriendId"); + } + } +} diff --git a/src/Data/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs b/src/Data/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs new file mode 100644 index 0000000..dc5739c --- /dev/null +++ b/src/Data/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs @@ -0,0 +1,658 @@ +// +using System; +using DevHive.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace DevHive.Data.Migrations +{ + [DbContext(typeof(DevHiveContext))] + partial class DevHiveContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseIdentityByDefaultColumns() + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.1"); + + modelBuilder.Entity("DevHive.Data.Models.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatorId") + .HasColumnType("uuid"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.Property("TimeCreated") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.HasIndex("PostId"); + + b.ToTable("Comments"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Language", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Languages"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Post", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatorId") + .HasColumnType("uuid"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("TimeCreated") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.ToTable("Posts"); + }); + + modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("PictureURL") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("ProfilePicture"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Rating", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.Property("Rate") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PostId") + .IsUnique(); + + b.ToTable("Rating"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Technology", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Technologies"); + }); + + modelBuilder.Entity("DevHive.Data.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("FirstName") + .HasColumnType("text"); + + b.Property("LastName") + .HasColumnType("text"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("UserId"); + + b.HasIndex("UserName") + .IsUnique(); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.PostAttachments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("FileUrl") + .HasColumnType("text"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("PostId"); + + b.ToTable("PostAttachments"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "PostId"); + + b.HasIndex("PostId"); + + b.ToTable("RatedPosts"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Liked") + .HasColumnType("boolean"); + + b.Property("PostId") + .HasColumnType("uuid"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("PostId"); + + b.HasIndex("UserId"); + + b.ToTable("UserRates"); + }); + + modelBuilder.Entity("LanguageUser", b => + { + b.Property("LanguagesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("LanguagesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("LanguageUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.Property("RolesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("RolesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("RoleUser"); + }); + + modelBuilder.Entity("TechnologyUser", b => + { + b.Property("TechnologiesId") + .HasColumnType("uuid"); + + b.Property("UsersId") + .HasColumnType("uuid"); + + b.HasKey("TechnologiesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("TechnologyUser"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Comment", b => + { + b.HasOne("DevHive.Data.Models.User", "Creator") + .WithMany("Comments") + .HasForeignKey("CreatorId"); + + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithMany("Comments") + .HasForeignKey("PostId"); + + b.Navigation("Creator"); + + b.Navigation("Post"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Post", b => + { + b.HasOne("DevHive.Data.Models.User", "Creator") + .WithMany("Posts") + .HasForeignKey("CreatorId"); + + b.Navigation("Creator"); + }); + + modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => + { + b.HasOne("DevHive.Data.Models.User", "User") + .WithOne("ProfilePicture") + .HasForeignKey("DevHive.Data.Models.ProfilePicture", "UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("DevHive.Data.Models.Rating", b => + { + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithOne("Rating") + .HasForeignKey("DevHive.Data.Models.Rating", "PostId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Post"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.PostAttachments", b => + { + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithMany("Attachments") + .HasForeignKey("PostId"); + + b.Navigation("Post"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => + { + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithMany() + .HasForeignKey("PostId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", "User") + .WithMany("RatedPosts") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Post"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => + { + b.HasOne("DevHive.Data.Models.Post", "Post") + .WithMany() + .HasForeignKey("PostId"); + + b.HasOne("DevHive.Data.Models.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("Post"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LanguageUser", b => + { + b.HasOne("DevHive.Data.Models.Language", null) + .WithMany() + .HasForeignKey("LanguagesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("DevHive.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("DevHive.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.HasOne("DevHive.Data.Models.Role", null) + .WithMany() + .HasForeignKey("RolesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("TechnologyUser", b => + { + b.HasOne("DevHive.Data.Models.Technology", null) + .WithMany() + .HasForeignKey("TechnologiesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DevHive.Data.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DevHive.Data.Models.Post", b => + { + b.Navigation("Attachments"); + + b.Navigation("Comments"); + + b.Navigation("Rating"); + }); + + modelBuilder.Entity("DevHive.Data.Models.User", b => + { + b.Navigation("Comments"); + + b.Navigation("Friends"); + + b.Navigation("Posts"); + + b.Navigation("ProfilePicture"); + + b.Navigation("RatedPosts"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Data/DevHive.Data/RelationModels/PostAttachments.cs b/src/Data/DevHive.Data/RelationModels/PostAttachments.cs new file mode 100644 index 0000000..48aa8ff --- /dev/null +++ b/src/Data/DevHive.Data/RelationModels/PostAttachments.cs @@ -0,0 +1,16 @@ +using System; +using System.ComponentModel.DataAnnotations.Schema; +using DevHive.Data.Models; + +namespace DevHive.Data.RelationModels +{ + [Table("PostAttachments")] + public class PostAttachments + { + public Guid Id { get; set; } + + public Post Post { get; set; } + + public string FileUrl { get; set; } + } +} diff --git a/src/Data/DevHive.Data/RelationModels/RatedPost.cs b/src/Data/DevHive.Data/RelationModels/RatedPost.cs new file mode 100644 index 0000000..7001d92 --- /dev/null +++ b/src/Data/DevHive.Data/RelationModels/RatedPost.cs @@ -0,0 +1,18 @@ +using System; +using System.ComponentModel.DataAnnotations.Schema; +using System.Reflection.Metadata.Ecma335; +using DevHive.Data.Models; +using Microsoft.EntityFrameworkCore; + +namespace DevHive.Data.RelationModels +{ + [Table("RatedPosts")] + public class RatedPost + { + public Guid UserId { get; set; } + public User User { get; set; } + + public Guid PostId { get; set; } + public Post Post { get; set; } + } +} diff --git a/src/Data/DevHive.Data/RelationModels/UserRate.cs b/src/Data/DevHive.Data/RelationModels/UserRate.cs new file mode 100644 index 0000000..696e6f3 --- /dev/null +++ b/src/Data/DevHive.Data/RelationModels/UserRate.cs @@ -0,0 +1,18 @@ +using System; +using System.ComponentModel.DataAnnotations.Schema; +using DevHive.Data.Models; + +namespace DevHive.Data.RelationModels +{ + [Table("UserRates")] + public class UserRate + { + public Guid Id { get; set; } + + public User User { get; set; } + + public bool Liked { get; set; } + + public Post Post { get; set; } + } +} diff --git a/src/Data/DevHive.Data/Repositories/BaseRepository.cs b/src/Data/DevHive.Data/Repositories/BaseRepository.cs new file mode 100644 index 0000000..ece372e --- /dev/null +++ b/src/Data/DevHive.Data/Repositories/BaseRepository.cs @@ -0,0 +1,59 @@ +using System; +using System.Threading.Tasks; +using DevHive.Data.Repositories.Interfaces; +using Microsoft.EntityFrameworkCore; + +namespace DevHive.Data.Repositories +{ + public class BaseRepository : IRepository + where TEntity : class + { + private readonly DbContext _context; + + public BaseRepository(DbContext context) + { + this._context = context; + } + + public virtual async Task AddAsync(TEntity entity) + { + await this._context + .Set() + .AddAsync(entity); + + return await this.SaveChangesAsync(); + } + + public virtual async Task GetByIdAsync(Guid id) + { + return await this._context + .Set() + .FindAsync(id); + } + + public virtual async Task EditAsync(Guid id, TEntity newEntity) + { + var entry = this._context.Entry(newEntity); + if (entry.State == EntityState.Detached) + this._context.Attach(newEntity); + + entry.State = EntityState.Modified; + + return await this.SaveChangesAsync(); + } + + public virtual async Task DeleteAsync(TEntity entity) + { + this._context.Remove(entity); + + return await this.SaveChangesAsync(); + } + + public virtual async Task SaveChangesAsync() + { + int result = await _context.SaveChangesAsync(); + + return result >= 1; + } + } +} diff --git a/src/Data/DevHive.Data/Repositories/CommentRepository.cs b/src/Data/DevHive.Data/Repositories/CommentRepository.cs new file mode 100644 index 0000000..bee7624 --- /dev/null +++ b/src/Data/DevHive.Data/Repositories/CommentRepository.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Threading.Tasks; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using Microsoft.EntityFrameworkCore; + +namespace DevHive.Data.Repositories +{ + public class CommentRepository : BaseRepository, ICommentRepository + { + private readonly DevHiveContext _context; + + public CommentRepository(DevHiveContext context) + : base(context) + { + this._context = context; + } + + #region Read + public override async Task GetByIdAsync(Guid id) + { + return await this._context.Comments + .Include(x => x.Creator) + .Include(x => x.Post) + .FirstOrDefaultAsync(x => x.Id == id); + } + + /// + /// This method returns the comment that is made at exactly the given time and by the given creator + /// + public async Task GetCommentByIssuerAndTimeCreatedAsync(Guid issuerId, DateTime timeCreated) + { + return await this._context.Comments + .FirstOrDefaultAsync(p => p.Creator.Id == issuerId && + p.TimeCreated == timeCreated); + } + + public async Task> GetPostComments(Guid postId) + { + return await this._context.Posts + .SelectMany(x => x.Comments) + .Where(x => x.Post.Id == postId) + .ToListAsync(); + } + #endregion + + #region Update + public override async Task EditAsync(Guid id, Comment newEntity) + { + Comment comment = await this.GetByIdAsync(id); + + this._context + .Entry(comment) + .CurrentValues + .SetValues(newEntity); + + return await this.SaveChangesAsync(); + } + #endregion + + + #region Validations + public async Task DoesCommentExist(Guid id) + { + return await this._context.Comments + .AsNoTracking() + .AnyAsync(r => r.Id == id); + } + #endregion + } +} diff --git a/src/Data/DevHive.Data/Repositories/FeedRepository.cs b/src/Data/DevHive.Data/Repositories/FeedRepository.cs new file mode 100644 index 0000000..8d3e5e1 --- /dev/null +++ b/src/Data/DevHive.Data/Repositories/FeedRepository.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using AutoMapper.Internal; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using Microsoft.EntityFrameworkCore; + +namespace DevHive.Data.Repositories +{ + public class FeedRepository : IFeedRepository + { + private readonly DevHiveContext _context; + + public FeedRepository(DevHiveContext context) + { + this._context = context; + } + + /// + /// This returns a given amount of posts of all given friends, created before "firstRequestIssued", + /// ordered from latest to oldest (time created). + /// PageSize specifies how many posts to get, and pageNumber specifices how many posts to skip (pageNumber * pageSize). + /// + /// This method is used in the feed page. + /// Posts from friends are meant to be gotten in chunks, meaning you get X posts, and then get another amount of posts, + /// that are after the first X posts. + /// + public async Task> GetFriendsPosts(List friendsList, DateTime firstRequestIssued, int pageNumber, int pageSize) + { + List friendsIds = friendsList.Select(f => f.Id).ToList(); + + List posts = await this._context.Posts + .Where(post => post.TimeCreated < firstRequestIssued) + .Where(p => friendsIds.Contains(p.Creator.Id)) + .ToListAsync(); + + // Ordering by descending can't happen in query, because it doesn't order it + // completely correctly (example: in query these two times are ordered + // like this: 2021-01-30T11:49:45, 2021-01-28T21:37:40.701244) + posts = posts + .OrderByDescending(x => x.TimeCreated.ToFileTime()) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ToList(); + + return posts; + } + + /// + /// This returns a given amount of posts, that a user has made, created before "firstRequestIssued", + /// ordered from latest to oldest (time created). + /// PageSize specifies how many posts to get, and pageNumber specifices how many posts to skip (pageNumber * pageSize). + /// + /// This method is used in the profile page. + /// Posts from friends are meant to be gotten in chunks, meaning you get X posts, and then get another amount of posts, + /// that are after the first X posts. + /// + public async Task> GetUsersPosts(User user, DateTime firstRequestIssued, int pageNumber, int pageSize) + { + List posts = await this._context.Posts + .Where(post => post.TimeCreated < firstRequestIssued) + .Where(p => p.Creator.Id == user.Id) + .ToListAsync(); + + // Look at GetFriendsPosts on why this is done like this + posts = posts + .OrderByDescending(x => x.TimeCreated.ToFileTime()) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ToList(); + + return posts; + } + } +} diff --git a/src/Data/DevHive.Data/Repositories/LanguageRepository.cs b/src/Data/DevHive.Data/Repositories/LanguageRepository.cs new file mode 100644 index 0000000..31d0b86 --- /dev/null +++ b/src/Data/DevHive.Data/Repositories/LanguageRepository.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using Microsoft.EntityFrameworkCore; + +namespace DevHive.Data.Repositories +{ + public class LanguageRepository : BaseRepository, ILanguageRepository + { + private readonly DevHiveContext _context; + + public LanguageRepository(DevHiveContext context) + : base(context) + { + this._context = context; + } + + #region Read + public async Task GetByNameAsync(string languageName) + { + return await this._context.Languages + .FirstOrDefaultAsync(x => x.Name == languageName); + } + + /// + /// Returns all technologies that exist in the database + /// + public HashSet GetLanguages() + { + return this._context.Languages.ToHashSet(); + } + #endregion + + #region Validations + public async Task DoesLanguageNameExistAsync(string languageName) + { + return await this._context.Languages + .AsNoTracking() + .AnyAsync(r => r.Name == languageName); + } + + public async Task DoesLanguageExistAsync(Guid id) + { + return await this._context.Languages + .AsNoTracking() + .AnyAsync(r => r.Id == id); + } + #endregion + } +} diff --git a/src/Data/DevHive.Data/Repositories/PostRepository.cs b/src/Data/DevHive.Data/Repositories/PostRepository.cs new file mode 100644 index 0000000..52c5b4e --- /dev/null +++ b/src/Data/DevHive.Data/Repositories/PostRepository.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using DevHive.Data.RelationModels; +using Microsoft.EntityFrameworkCore; + +namespace DevHive.Data.Repositories +{ + public class PostRepository : BaseRepository, IPostRepository + { + private readonly DevHiveContext _context; + private readonly IUserRepository _userRepository; + + public PostRepository(DevHiveContext context, IUserRepository userRepository) + : base(context) + { + this._context = context; + this._userRepository = userRepository; + } + + public async Task AddNewPostToCreator(Guid userId, Post post) + { + User user = await this._userRepository.GetByIdAsync(userId); + user.Posts.Add(post); + + return await this.SaveChangesAsync(); + } + + #region Read + public override async Task GetByIdAsync(Guid id) + { + return await this._context.Posts + .Include(x => x.Comments) + .Include(x => x.Creator) + .Include(x => x.Attachments) + // .Include(x => x.Rating) + .FirstOrDefaultAsync(x => x.Id == id); + } + + /// + /// This method returns the post that is made at exactly the given time and by the given creator + /// + public async Task GetPostByCreatorAndTimeCreatedAsync(Guid creatorId, DateTime timeCreated) + { + return await this._context.Posts + .FirstOrDefaultAsync(p => p.Creator.Id == creatorId && + p.TimeCreated == timeCreated); + } + + public async Task> GetFileUrls(Guid postId) + { + return (await this.GetByIdAsync(postId)).Attachments.Select(x => x.FileUrl).ToList(); + } + #endregion + + #region Update + public override async Task EditAsync(Guid id, Post newEntity) + { + Post post = await this.GetByIdAsync(id); + // var ratingId = post.Rating.Id; + + this._context + .Entry(post) + .CurrentValues + .SetValues(newEntity); + + List postAttachments = new(); + foreach(var attachment in newEntity.Attachments) + postAttachments.Add(attachment); + post.Attachments = postAttachments; + + post.Comments.Clear(); + foreach(var comment in newEntity.Comments) + post.Comments.Add(comment); + + // post.Rating.Id = ratingId; + + this._context.Entry(post).State = EntityState.Modified; + + return await this.SaveChangesAsync(); + } + #endregion + + #region Validations + public async Task DoesPostExist(Guid postId) + { + return await this._context.Posts + .AsNoTracking() + .AnyAsync(r => r.Id == postId); + } + + public async Task DoesPostHaveFiles(Guid postId) + { + return await this._context.Posts + .AsNoTracking() + .Where(x => x.Id == postId) + .Select(x => x.Attachments) + .AnyAsync(); + } + #endregion + } +} diff --git a/src/Data/DevHive.Data/Repositories/RatingRepository.cs b/src/Data/DevHive.Data/Repositories/RatingRepository.cs new file mode 100644 index 0000000..1be8fe8 --- /dev/null +++ b/src/Data/DevHive.Data/Repositories/RatingRepository.cs @@ -0,0 +1,35 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using Microsoft.EntityFrameworkCore; + +namespace DevHive.Data.Repositories +{ + public class RatingRepository : BaseRepository, IRatingRepository + { + private readonly DevHiveContext _context; + private readonly IPostRepository _postRepository; + + public RatingRepository(DevHiveContext context, IPostRepository postRepository) + : base(context) + { + this._context = context; + this._postRepository = postRepository; + } + + public async Task GetRatingByPostId(Guid postId) + { + return await this._context.Rating + .FirstOrDefaultAsync(x => x.Post.Id == postId); + } + + public async Task UserRatedPost(Guid userId, Guid postId) + { + return await this._context.UserRate + .Where(x => x.Post.Id == postId) + .AnyAsync(x => x.User.Id == userId); + } + } +} diff --git a/src/Data/DevHive.Data/Repositories/RoleRepository.cs b/src/Data/DevHive.Data/Repositories/RoleRepository.cs new file mode 100644 index 0000000..441efef --- /dev/null +++ b/src/Data/DevHive.Data/Repositories/RoleRepository.cs @@ -0,0 +1,55 @@ +using System; +using System.Threading.Tasks; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using Microsoft.EntityFrameworkCore; + +namespace DevHive.Data.Repositories +{ + public class RoleRepository : BaseRepository, IRoleRepository + { + private readonly DevHiveContext _context; + + public RoleRepository(DevHiveContext context) + : base(context) + { + this._context = context; + } + + #region Read + public async Task GetByNameAsync(string name) + { + return await this._context.Roles + .FirstOrDefaultAsync(x => x.Name == name); + } + #endregion + + public override async Task EditAsync(Guid id, Role newEntity) + { + Role role = await this.GetByIdAsync(id); + + this._context + .Entry(role) + .CurrentValues + .SetValues(newEntity); + + return await this.SaveChangesAsync(); + } + + #region Validations + public async Task DoesNameExist(string name) + { + return await this._context.Roles + .AsNoTracking() + .AnyAsync(r => r.Name == name); + } + + public async Task DoesRoleExist(Guid id) + { + return await this._context.Roles + .AsNoTracking() + .AnyAsync(r => r.Id == id); + } + #endregion + } +} diff --git a/src/Data/DevHive.Data/Repositories/TechnologyRepository.cs b/src/Data/DevHive.Data/Repositories/TechnologyRepository.cs new file mode 100644 index 0000000..6f0d10f --- /dev/null +++ b/src/Data/DevHive.Data/Repositories/TechnologyRepository.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using Microsoft.EntityFrameworkCore; + +namespace DevHive.Data.Repositories +{ + public class TechnologyRepository : BaseRepository, ITechnologyRepository + { + private readonly DevHiveContext _context; + + public TechnologyRepository(DevHiveContext context) + : base(context) + { + this._context = context; + } + + #region Read + public async Task GetByNameAsync(string technologyName) + { + return await this._context.Technologies + .FirstOrDefaultAsync(x => x.Name == technologyName); + } + + /// + /// Returns all technologies that exist in the database + /// + public HashSet GetTechnologies() + { + return this._context.Technologies.ToHashSet(); + } + #endregion + + #region Validations + public async Task DoesTechnologyNameExistAsync(string technologyName) + { + return await this._context.Technologies + .AsNoTracking() + .AnyAsync(r => r.Name == technologyName); + } + + public async Task DoesTechnologyExistAsync(Guid id) + { + return await this._context.Technologies + .AsNoTracking() + .AnyAsync(x => x.Id == id); + } + #endregion + } +} diff --git a/src/Data/DevHive.Data/Repositories/UserRepository.cs b/src/Data/DevHive.Data/Repositories/UserRepository.cs new file mode 100644 index 0000000..6e97e60 --- /dev/null +++ b/src/Data/DevHive.Data/Repositories/UserRepository.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Threading.Tasks; +using AutoMapper.Mappers; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using DevHive.Data.RelationModels; +using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; + +namespace DevHive.Data.Repositories +{ + public class UserRepository : BaseRepository, IUserRepository + { + private readonly DevHiveContext _context; + + public UserRepository(DevHiveContext context) + : base(context) + { + this._context = context; + } + + #region Read + public override async Task GetByIdAsync(Guid id) + { + return await this._context.Users + .Include(x => x.Roles) + .Include(x => x.Languages) + .Include(x => x.Technologies) + .Include(x => x.Posts) + .Include(x => x.Friends) + .Include(x => x.ProfilePicture) + .FirstOrDefaultAsync(x => x.Id == id); + } + + public async Task GetByUsernameAsync(string username) + { + return await this._context.Users + .Include(x => x.Roles) + .Include(x => x.Languages) + .Include(x => x.Technologies) + .Include(x => x.Posts) + .Include(x => x.Friends) + .Include(x => x.ProfilePicture) + .FirstOrDefaultAsync(x => x.UserName == username); + } + #endregion + + #region Update + public async Task UpdateProfilePicture(Guid userId, string pictureUrl) + { + User user = await this.GetByIdAsync(userId); + + user.ProfilePicture.PictureURL = pictureUrl; + + return await this.SaveChangesAsync(); + } + #endregion + + #region Validations + public async Task DoesUserExistAsync(Guid id) + { + return await this._context.Users + .AsNoTracking() + .AnyAsync(x => x.Id == id); + } + + public async Task DoesUsernameExistAsync(string username) + { + return await this._context.Users + .AsNoTracking() + .AnyAsync(u => u.UserName == username); + } + + public async Task DoesEmailExistAsync(string email) + { + return await this._context.Users + .AsNoTracking() + .AnyAsync(u => u.Email == email); + } + + public async Task ValidateFriendsCollectionAsync(List usernames) + { + bool valid = true; + + foreach (var username in usernames) + { + if (!await this._context.Users.AnyAsync(x => x.UserName == username)) + { + valid = false; + break; + } + } + return valid; + } + + public bool DoesUserHaveThisUsername(Guid id, string username) + { + return this._context.Users + .AsNoTracking() + .Any(x => x.Id == id && + x.UserName == username); + } + #endregion + } +} diff --git a/src/DevHive.Common/DevHive.Common.csproj b/src/DevHive.Common/DevHive.Common.csproj deleted file mode 100644 index ace4997..0000000 --- a/src/DevHive.Common/DevHive.Common.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - net5.0 - - - - - - - - true - latest - - diff --git a/src/DevHive.Common/Models/Identity/TokenModel.cs b/src/DevHive.Common/Models/Identity/TokenModel.cs deleted file mode 100644 index 0fb6c82..0000000 --- a/src/DevHive.Common/Models/Identity/TokenModel.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace DevHive.Common.Models.Identity -{ - public class TokenModel - { - public TokenModel(string token) - { - this.Token = token; - } - - public string Token { get; set; } - } -} \ No newline at end of file diff --git a/src/DevHive.Common/Models/Misc/IdModel.cs b/src/DevHive.Common/Models/Misc/IdModel.cs deleted file mode 100644 index a5c7b65..0000000 --- a/src/DevHive.Common/Models/Misc/IdModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace DevHive.Common.Models.Misc -{ - public class IdModel - { - public Guid Id { get; set; } - } -} \ No newline at end of file diff --git a/src/DevHive.Common/Models/Misc/PasswordModifications.cs b/src/DevHive.Common/Models/Misc/PasswordModifications.cs deleted file mode 100644 index f10a334..0000000 --- a/src/DevHive.Common/Models/Misc/PasswordModifications.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Security.Cryptography; -using System.Text; - -namespace DevHive.Common.Models.Misc -{ - public static class PasswordModifications - { - public static string GeneratePasswordHash(string password) - { - return string.Join(string.Empty, SHA512.HashData(Encoding.ASCII.GetBytes(password))); - } - } -} diff --git a/src/DevHive.Common/Models/Misc/Patch.cs b/src/DevHive.Common/Models/Misc/Patch.cs deleted file mode 100644 index ea5a4f1..0000000 --- a/src/DevHive.Common/Models/Misc/Patch.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace DevHive.Common.Models.Misc -{ - public class Patch - { - public string Name { get; set; } - public object Value { get; set; } - public string Action { get; set; } - } -} diff --git a/src/DevHive.Data/ConnectionString.json b/src/DevHive.Data/ConnectionString.json deleted file mode 100644 index c8300b2..0000000 --- a/src/DevHive.Data/ConnectionString.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ConnectionStrings": { - "DEV": "Server=localhost;Port=5432;Database=API;User Id=postgres;Password=password;" - } -} \ No newline at end of file diff --git a/src/DevHive.Data/DevHive.Data.csproj b/src/DevHive.Data/DevHive.Data.csproj deleted file mode 100644 index d91728d..0000000 --- a/src/DevHive.Data/DevHive.Data.csproj +++ /dev/null @@ -1,30 +0,0 @@ - - - - net5.0 - - - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - - - - true - latest - - - diff --git a/src/DevHive.Data/DevHiveContext.cs b/src/DevHive.Data/DevHiveContext.cs deleted file mode 100644 index 9de33c3..0000000 --- a/src/DevHive.Data/DevHiveContext.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using DevHive.Data.Models; -using DevHive.Data.RelationModels; -using Microsoft.AspNetCore.Identity.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; - -namespace DevHive.Data -{ - public class DevHiveContext : IdentityDbContext - { - public DevHiveContext(DbContextOptions options) - : base(options) { } - - public DbSet Technologies { get; set; } - public DbSet Languages { get; set; } - public DbSet Posts { get; set; } - public DbSet PostAttachments { get; set; } - public DbSet Comments { get; set; } - public DbSet Rating { get; set; } - public DbSet RatedPost { get; set; } - public DbSet UserRate { get; set; } - - protected override void OnModelCreating(ModelBuilder builder) - { - /* User */ - builder.Entity() - .HasIndex(x => x.UserName) - .IsUnique(); - - builder.Entity() - .HasOne(x => x.ProfilePicture) - .WithOne(x => x.User) - .HasForeignKey(x => x.UserId); - - /* Roles */ - builder.Entity() - .HasMany(x => x.Roles) - .WithMany(x => x.Users); - - /* Languages */ - builder.Entity() - .HasMany(x => x.Languages) - .WithMany(x => x.Users) - .UsingEntity(x => x.ToTable("LanguageUser")); - - builder.Entity() - .HasMany(x => x.Users) - .WithMany(x => x.Languages) - .UsingEntity(x => x.ToTable("LanguageUser")); - - /* Technologies */ - builder.Entity() - .HasMany(x => x.Technologies) - .WithMany(x => x.Users) - .UsingEntity(x => x.ToTable("TechnologyUser")); - - builder.Entity() - .HasMany(x => x.Users) - .WithMany(x => x.Technologies) - .UsingEntity(x => x.ToTable("TechnologyUser")); - - /* Post */ - builder.Entity() - .HasOne(x => x.Creator) - .WithMany(x => x.Posts); - - builder.Entity() - .HasMany(x => x.Comments) - .WithOne(x => x.Post); - - /* Post attachments */ - builder.Entity() - .HasOne(x => x.Post) - .WithMany(x => x.Attachments); - - /* Comment */ - builder.Entity() - .HasOne(x => x.Post) - .WithMany(x => x.Comments); - - builder.Entity() - .HasOne(x => x.Creator) - .WithMany(x => x.Comments); - - /* Rating */ - builder.Entity() - .HasKey(x => x.Id); - - builder.Entity() - .HasOne(x => x.Post) - .WithOne(x => x.Rating) - .HasForeignKey(x => x.PostId); - - builder.Entity() - .HasOne(x => x.Rating) - .WithOne(x => x.Post); - - /* User Rated Posts */ - builder.Entity() - .HasKey(x => new { x.UserId, x.PostId }); - - builder.Entity() - .HasOne(x => x.User) - .WithMany(x => x.RatedPosts); - - builder.Entity() - .HasOne(x => x.Post); - - builder.Entity() - .HasMany(x => x.RatedPosts); - - base.OnModelCreating(builder); - } - } -} diff --git a/src/DevHive.Data/DevHiveContextFactory.cs b/src/DevHive.Data/DevHiveContextFactory.cs deleted file mode 100644 index f4849d7..0000000 --- a/src/DevHive.Data/DevHiveContextFactory.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Design; -using Microsoft.Extensions.Configuration; -using System.IO; - -namespace DevHive.Data -{ - public class DevHiveContextFactory : IDesignTimeDbContextFactory - { - public DevHiveContext CreateDbContext(string[] args) - { - var configuration = new ConfigurationBuilder() - .SetBasePath(Directory.GetCurrentDirectory()) - .AddJsonFile("ConnectionString.json") - .Build(); - - var optionsBuilder = new DbContextOptionsBuilder() - .UseNpgsql(configuration.GetConnectionString("DEV")); - - return new DevHiveContext(optionsBuilder.Options); - } - } -} \ No newline at end of file diff --git a/src/DevHive.Data/Interfaces/Models/IComment.cs b/src/DevHive.Data/Interfaces/Models/IComment.cs deleted file mode 100644 index 97c1578..0000000 --- a/src/DevHive.Data/Interfaces/Models/IComment.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using DevHive.Data.Models; - -namespace DevHive.Data.Interfaces.Models -{ - public interface IComment : IModel - { - Post Post { get; set; } - - User Creator { get; set; } - - string Message { get; set; } - - DateTime TimeCreated { get; set; } - } -} diff --git a/src/DevHive.Data/Interfaces/Models/ILanguage.cs b/src/DevHive.Data/Interfaces/Models/ILanguage.cs deleted file mode 100644 index 9eed09d..0000000 --- a/src/DevHive.Data/Interfaces/Models/ILanguage.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; -using DevHive.Data.Models; - -namespace DevHive.Data.Interfaces.Models -{ - public interface ILanguage : IModel - { - string Name { get; set; } - HashSet Users { get; set; } - } -} diff --git a/src/DevHive.Data/Interfaces/Models/IModel.cs b/src/DevHive.Data/Interfaces/Models/IModel.cs deleted file mode 100644 index f903af3..0000000 --- a/src/DevHive.Data/Interfaces/Models/IModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace DevHive.Data.Interfaces.Models -{ - public interface IModel - { - Guid Id { get; set; } - } -} diff --git a/src/DevHive.Data/Interfaces/Models/IPost.cs b/src/DevHive.Data/Interfaces/Models/IPost.cs deleted file mode 100644 index 712d955..0000000 --- a/src/DevHive.Data/Interfaces/Models/IPost.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using DevHive.Data.Models; -using DevHive.Data.RelationModels; - -namespace DevHive.Data.Interfaces.Models -{ - public interface IPost : IModel - { - User Creator { get; set; } - - string Message { get; set; } - - DateTime TimeCreated { get; set; } - - List Comments { get; set; } - - // Rating Rating { get; set; } - - List Attachments { get; set; } - } -} diff --git a/src/DevHive.Data/Interfaces/Models/IProfilePicture.cs b/src/DevHive.Data/Interfaces/Models/IProfilePicture.cs deleted file mode 100644 index c3fcbea..0000000 --- a/src/DevHive.Data/Interfaces/Models/IProfilePicture.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using DevHive.Data.Models; - -namespace DevHive.Data.Interfaces.Models -{ - public interface IProfilePicture : IModel - { - Guid UserId { get; set; } - User User { get; set; } - - string PictureURL { get; set; } - } -} diff --git a/src/DevHive.Data/Interfaces/Models/IRating.cs b/src/DevHive.Data/Interfaces/Models/IRating.cs deleted file mode 100644 index d1b968f..0000000 --- a/src/DevHive.Data/Interfaces/Models/IRating.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using DevHive.Data.Models; - -namespace DevHive.Data.Interfaces.Models -{ - public interface IRating : IModel - { - // Post Post { get; set; } - - int Rate { get; set; } - - // HashSet UsersThatRated { get; set; } - } -} diff --git a/src/DevHive.Data/Interfaces/Models/IRole.cs b/src/DevHive.Data/Interfaces/Models/IRole.cs deleted file mode 100644 index c8b7068..0000000 --- a/src/DevHive.Data/Interfaces/Models/IRole.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; -using DevHive.Data.Models; - -namespace DevHive.Data.Interfaces.Models -{ - public interface IRole - { - HashSet Users { get; set; } - } -} diff --git a/src/DevHive.Data/Interfaces/Models/ITechnology.cs b/src/DevHive.Data/Interfaces/Models/ITechnology.cs deleted file mode 100644 index 153f75f..0000000 --- a/src/DevHive.Data/Interfaces/Models/ITechnology.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; -using DevHive.Data.Models; - -namespace DevHive.Data.Interfaces.Models -{ - public interface ITechnology : IModel - { - string Name { get; set; } - HashSet Users { get; set; } - } -} diff --git a/src/DevHive.Data/Interfaces/Models/IUser.cs b/src/DevHive.Data/Interfaces/Models/IUser.cs deleted file mode 100644 index fcd741c..0000000 --- a/src/DevHive.Data/Interfaces/Models/IUser.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Generic; -using DevHive.Data.Models; -using DevHive.Data.RelationModels; - -namespace DevHive.Data.Interfaces.Models -{ - public interface IUser : IModel - { - string FirstName { get; set; } - - string LastName { get; set; } - - ProfilePicture ProfilePicture { get; set; } - - HashSet Languages { get; set; } - - HashSet Technologies { get; set; } - - HashSet Roles { get; set; } - } -} diff --git a/src/DevHive.Data/Interfaces/Repositories/ICommentRepository.cs b/src/DevHive.Data/Interfaces/Repositories/ICommentRepository.cs deleted file mode 100644 index 267f251..0000000 --- a/src/DevHive.Data/Interfaces/Repositories/ICommentRepository.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using DevHive.Data.Models; -using DevHive.Data.Repositories.Interfaces; - -namespace DevHive.Data.Interfaces.Repositories -{ - public interface ICommentRepository : IRepository - { - Task> GetPostComments(Guid postId); - - Task DoesCommentExist(Guid id); - Task GetCommentByIssuerAndTimeCreatedAsync(Guid issuerId, DateTime timeCreated); - } -} diff --git a/src/DevHive.Data/Interfaces/Repositories/IFeedRepository.cs b/src/DevHive.Data/Interfaces/Repositories/IFeedRepository.cs deleted file mode 100644 index 7262510..0000000 --- a/src/DevHive.Data/Interfaces/Repositories/IFeedRepository.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using DevHive.Data.Models; - -namespace DevHive.Data.Interfaces.Repositories -{ - public interface IFeedRepository - { - Task> GetFriendsPosts(List friendsList, DateTime firstRequestIssued, int pageNumber, int pageSize); - Task> GetUsersPosts(User user, DateTime firstRequestIssued, int pageNumber, int pageSize); - } -} diff --git a/src/DevHive.Data/Interfaces/Repositories/ILanguageRepository.cs b/src/DevHive.Data/Interfaces/Repositories/ILanguageRepository.cs deleted file mode 100644 index db2949a..0000000 --- a/src/DevHive.Data/Interfaces/Repositories/ILanguageRepository.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using DevHive.Data.Models; -using DevHive.Data.Repositories.Interfaces; - -namespace DevHive.Data.Interfaces.Repositories -{ - public interface ILanguageRepository : IRepository - { - HashSet GetLanguages(); - Task GetByNameAsync(string name); - - Task DoesLanguageExistAsync(Guid id); - Task DoesLanguageNameExistAsync(string languageName); - } -} diff --git a/src/DevHive.Data/Interfaces/Repositories/IPostRepository.cs b/src/DevHive.Data/Interfaces/Repositories/IPostRepository.cs deleted file mode 100644 index 9f7cf85..0000000 --- a/src/DevHive.Data/Interfaces/Repositories/IPostRepository.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using DevHive.Data.Models; -using DevHive.Data.Repositories.Interfaces; - -namespace DevHive.Data.Interfaces.Repositories -{ - public interface IPostRepository : IRepository - { - Task AddNewPostToCreator(Guid userId, Post post); - - Task GetPostByCreatorAndTimeCreatedAsync(Guid issuerId, DateTime timeCreated); - Task> GetFileUrls(Guid postId); - - Task DoesPostExist(Guid postId); - Task DoesPostHaveFiles(Guid postId); - } -} diff --git a/src/DevHive.Data/Interfaces/Repositories/IRatingRepository.cs b/src/DevHive.Data/Interfaces/Repositories/IRatingRepository.cs deleted file mode 100644 index f77f301..0000000 --- a/src/DevHive.Data/Interfaces/Repositories/IRatingRepository.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Threading.Tasks; -using DevHive.Data.Models; -using DevHive.Data.Repositories.Interfaces; - -namespace DevHive.Data.Interfaces.Repositories -{ - public interface IRatingRepository : IRepository - { - Task GetRatingByPostId(Guid postId); - Task UserRatedPost(Guid userId, Guid postId); - } -} diff --git a/src/DevHive.Data/Interfaces/Repositories/IRepository.cs b/src/DevHive.Data/Interfaces/Repositories/IRepository.cs deleted file mode 100644 index 0d11cd3..0000000 --- a/src/DevHive.Data/Interfaces/Repositories/IRepository.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Threading.Tasks; - -namespace DevHive.Data.Repositories.Interfaces -{ - public interface IRepository - where TEntity : class - { - //Add Entity to database - Task AddAsync(TEntity entity); - - //Find entity by id - Task GetByIdAsync(Guid id); - - //Modify Entity from database - Task EditAsync(Guid id, TEntity newEntity); - - //Delete Entity from database - Task DeleteAsync(TEntity entity); - } -} diff --git a/src/DevHive.Data/Interfaces/Repositories/IRoleRepository.cs b/src/DevHive.Data/Interfaces/Repositories/IRoleRepository.cs deleted file mode 100644 index e834369..0000000 --- a/src/DevHive.Data/Interfaces/Repositories/IRoleRepository.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Threading.Tasks; -using DevHive.Data.Models; -using DevHive.Data.Repositories.Interfaces; - -namespace DevHive.Data.Interfaces.Repositories -{ - public interface IRoleRepository : IRepository - { - Task GetByNameAsync(string name); - - Task DoesNameExist(string name); - Task DoesRoleExist(Guid id); - } -} diff --git a/src/DevHive.Data/Interfaces/Repositories/ITechnologyRepository.cs b/src/DevHive.Data/Interfaces/Repositories/ITechnologyRepository.cs deleted file mode 100644 index 9126bfc..0000000 --- a/src/DevHive.Data/Interfaces/Repositories/ITechnologyRepository.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using DevHive.Data.Models; -using DevHive.Data.Repositories.Interfaces; - -namespace DevHive.Data.Interfaces.Repositories -{ - public interface ITechnologyRepository : IRepository - { - Task GetByNameAsync(string name); - HashSet GetTechnologies(); - - Task DoesTechnologyExistAsync(Guid id); - Task DoesTechnologyNameExistAsync(string technologyName); - } -} diff --git a/src/DevHive.Data/Interfaces/Repositories/IUserRepository.cs b/src/DevHive.Data/Interfaces/Repositories/IUserRepository.cs deleted file mode 100644 index 5ebe3d3..0000000 --- a/src/DevHive.Data/Interfaces/Repositories/IUserRepository.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using DevHive.Data.Models; -using DevHive.Data.Repositories.Interfaces; - -namespace DevHive.Data.Interfaces.Repositories -{ - public interface IUserRepository : IRepository - { - //Read - Task GetByUsernameAsync(string username); - Task UpdateProfilePicture(Guid userId, string pictureUrl); - - //Validations - Task ValidateFriendsCollectionAsync(List usernames); - Task DoesEmailExistAsync(string email); - Task DoesUserExistAsync(Guid id); - Task DoesUsernameExistAsync(string username); - bool DoesUserHaveThisUsername(Guid id, string username); - } -} diff --git a/src/DevHive.Data/Migrations/20210205140955_rating.Designer.cs b/src/DevHive.Data/Migrations/20210205140955_rating.Designer.cs deleted file mode 100644 index 8d2adc4..0000000 --- a/src/DevHive.Data/Migrations/20210205140955_rating.Designer.cs +++ /dev/null @@ -1,665 +0,0 @@ -// -using System; -using System.Collections.Generic; -using DevHive.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -namespace DevHive.Data.Migrations -{ - [DbContext(typeof(DevHiveContext))] - [Migration("20210205140955_rating")] - partial class rating - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .UseIdentityByDefaultColumns() - .HasAnnotation("Relational:MaxIdentifierLength", 63) - .HasAnnotation("ProductVersion", "5.0.1"); - - modelBuilder.Entity("DevHive.Data.Models.Comment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreatorId") - .HasColumnType("uuid"); - - b.Property("Message") - .HasColumnType("text"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.Property("TimeCreated") - .HasColumnType("timestamp without time zone"); - - b.HasKey("Id"); - - b.HasIndex("CreatorId"); - - b.HasIndex("PostId"); - - b.ToTable("Comments"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Language", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("Languages"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Post", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreatorId") - .HasColumnType("uuid"); - - b.Property>("FileUrls") - .HasColumnType("text[]"); - - b.Property("Message") - .HasColumnType("text"); - - b.Property("TimeCreated") - .HasColumnType("timestamp without time zone"); - - b.HasKey("Id"); - - b.HasIndex("CreatorId"); - - b.ToTable("Posts"); - }); - - modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("PictureURL") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId") - .IsUnique(); - - b.ToTable("ProfilePicture"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Rating", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.Property("Rate") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("PostId") - .IsUnique(); - - b.ToTable("Rating"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Role", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("AspNetRoles"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Technology", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("Technologies"); - }); - - modelBuilder.Entity("DevHive.Data.Models.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccessFailedCount") - .HasColumnType("integer"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("boolean"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("LockoutEnabled") - .HasColumnType("boolean"); - - b.Property("LockoutEnd") - .HasColumnType("timestamp with time zone"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("PasswordHash") - .HasColumnType("text"); - - b.Property("PhoneNumber") - .HasColumnType("text"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("boolean"); - - b.Property("SecurityStamp") - .HasColumnType("text"); - - b.Property("TwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.HasIndex("UserName") - .IsUnique(); - - b.ToTable("AspNetUsers"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.HasKey("UserId", "PostId"); - - b.HasIndex("PostId"); - - b.ToTable("RatedPosts"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserFriend", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("FriendId") - .HasColumnType("uuid"); - - b.HasKey("UserId", "FriendId"); - - b.HasIndex("FriendId"); - - b.ToTable("UserFriends"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Liked") - .HasColumnType("boolean"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("PostId"); - - b.HasIndex("UserId"); - - b.ToTable("UserRates"); - }); - - modelBuilder.Entity("LanguageUser", b => - { - b.Property("LanguagesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("LanguagesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("LanguageUser"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .UseIdentityByDefaultColumn(); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("RoleId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .UseIdentityByDefaultColumn(); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("ProviderKey") - .HasColumnType("text"); - - b.Property("ProviderDisplayName") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("RoleId") - .HasColumnType("uuid"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Value") - .HasColumnType("text"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.Property("RolesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("RolesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("RoleUser"); - }); - - modelBuilder.Entity("TechnologyUser", b => - { - b.Property("TechnologiesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("TechnologiesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("TechnologyUser"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Comment", b => - { - b.HasOne("DevHive.Data.Models.User", "Creator") - .WithMany("Comments") - .HasForeignKey("CreatorId"); - - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithMany("Comments") - .HasForeignKey("PostId"); - - b.Navigation("Creator"); - - b.Navigation("Post"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Post", b => - { - b.HasOne("DevHive.Data.Models.User", "Creator") - .WithMany("Posts") - .HasForeignKey("CreatorId"); - - b.Navigation("Creator"); - }); - - modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => - { - b.HasOne("DevHive.Data.Models.User", "User") - .WithOne("ProfilePicture") - .HasForeignKey("DevHive.Data.Models.ProfilePicture", "UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Rating", b => - { - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithOne("Rating") - .HasForeignKey("DevHive.Data.Models.Rating", "PostId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Post"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => - { - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithMany() - .HasForeignKey("PostId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", "User") - .WithMany("RatedPosts") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Post"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserFriend", b => - { - b.HasOne("DevHive.Data.Models.User", "Friend") - .WithMany("FriendsOf") - .HasForeignKey("FriendId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", "User") - .WithMany("MyFriends") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Friend"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => - { - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithMany() - .HasForeignKey("PostId"); - - b.HasOne("DevHive.Data.Models.User", "User") - .WithMany() - .HasForeignKey("UserId"); - - b.Navigation("Post"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("LanguageUser", b => - { - b.HasOne("DevHive.Data.Models.Language", null) - .WithMany() - .HasForeignKey("LanguagesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("DevHive.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("DevHive.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.HasOne("DevHive.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RolesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("TechnologyUser", b => - { - b.HasOne("DevHive.Data.Models.Technology", null) - .WithMany() - .HasForeignKey("TechnologiesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("DevHive.Data.Models.Post", b => - { - b.Navigation("Comments"); - - b.Navigation("Rating"); - }); - - modelBuilder.Entity("DevHive.Data.Models.User", b => - { - b.Navigation("Comments"); - - b.Navigation("FriendsOf"); - - b.Navigation("MyFriends"); - - b.Navigation("Posts"); - - b.Navigation("ProfilePicture"); - - b.Navigation("RatedPosts"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/DevHive.Data/Migrations/20210205140955_rating.cs b/src/DevHive.Data/Migrations/20210205140955_rating.cs deleted file mode 100644 index d507dae..0000000 --- a/src/DevHive.Data/Migrations/20210205140955_rating.cs +++ /dev/null @@ -1,581 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.EntityFrameworkCore.Migrations; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -namespace DevHive.Data.Migrations -{ - public partial class rating : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "AspNetRoles", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - NormalizedName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - ConcurrencyStamp = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetUsers", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - FirstName = table.Column(type: "text", nullable: true), - LastName = table.Column(type: "text", nullable: true), - UserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - NormalizedUserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - Email = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - NormalizedEmail = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - EmailConfirmed = table.Column(type: "boolean", nullable: false), - PasswordHash = table.Column(type: "text", nullable: true), - SecurityStamp = table.Column(type: "text", nullable: true), - ConcurrencyStamp = table.Column(type: "text", nullable: true), - PhoneNumber = table.Column(type: "text", nullable: true), - PhoneNumberConfirmed = table.Column(type: "boolean", nullable: false), - TwoFactorEnabled = table.Column(type: "boolean", nullable: false), - LockoutEnd = table.Column(type: "timestamp with time zone", nullable: true), - LockoutEnabled = table.Column(type: "boolean", nullable: false), - AccessFailedCount = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Languages", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Languages", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Technologies", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Technologies", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetRoleClaims", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - RoleId = table.Column(type: "uuid", nullable: false), - ClaimType = table.Column(type: "text", nullable: true), - ClaimValue = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserClaims", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - UserId = table.Column(type: "uuid", nullable: false), - ClaimType = table.Column(type: "text", nullable: true), - ClaimValue = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetUserClaims_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserLogins", - columns: table => new - { - LoginProvider = table.Column(type: "text", nullable: false), - ProviderKey = table.Column(type: "text", nullable: false), - ProviderDisplayName = table.Column(type: "text", nullable: true), - UserId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); - table.ForeignKey( - name: "FK_AspNetUserLogins_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserRoles", - columns: table => new - { - UserId = table.Column(type: "uuid", nullable: false), - RoleId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserTokens", - columns: table => new - { - UserId = table.Column(type: "uuid", nullable: false), - LoginProvider = table.Column(type: "text", nullable: false), - Name = table.Column(type: "text", nullable: false), - Value = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AspNetUserTokens_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Posts", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - CreatorId = table.Column(type: "uuid", nullable: true), - Message = table.Column(type: "text", nullable: true), - TimeCreated = table.Column(type: "timestamp without time zone", nullable: false), - FileUrls = table.Column>(type: "text[]", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Posts", x => x.Id); - table.ForeignKey( - name: "FK_Posts_AspNetUsers_CreatorId", - column: x => x.CreatorId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - }); - - migrationBuilder.CreateTable( - name: "ProfilePicture", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - UserId = table.Column(type: "uuid", nullable: false), - PictureURL = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_ProfilePicture", x => x.Id); - table.ForeignKey( - name: "FK_ProfilePicture_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "RoleUser", - columns: table => new - { - RolesId = table.Column(type: "uuid", nullable: false), - UsersId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_RoleUser", x => new { x.RolesId, x.UsersId }); - table.ForeignKey( - name: "FK_RoleUser_AspNetRoles_RolesId", - column: x => x.RolesId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_RoleUser_AspNetUsers_UsersId", - column: x => x.UsersId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserFriends", - columns: table => new - { - UserId = table.Column(type: "uuid", nullable: false), - FriendId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_UserFriends", x => new { x.UserId, x.FriendId }); - table.ForeignKey( - name: "FK_UserFriends_AspNetUsers_FriendId", - column: x => x.FriendId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_UserFriends_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "LanguageUser", - columns: table => new - { - LanguagesId = table.Column(type: "uuid", nullable: false), - UsersId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_LanguageUser", x => new { x.LanguagesId, x.UsersId }); - table.ForeignKey( - name: "FK_LanguageUser_AspNetUsers_UsersId", - column: x => x.UsersId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_LanguageUser_Languages_LanguagesId", - column: x => x.LanguagesId, - principalTable: "Languages", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "TechnologyUser", - columns: table => new - { - TechnologiesId = table.Column(type: "uuid", nullable: false), - UsersId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_TechnologyUser", x => new { x.TechnologiesId, x.UsersId }); - table.ForeignKey( - name: "FK_TechnologyUser_AspNetUsers_UsersId", - column: x => x.UsersId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_TechnologyUser_Technologies_TechnologiesId", - column: x => x.TechnologiesId, - principalTable: "Technologies", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Comments", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - PostId = table.Column(type: "uuid", nullable: true), - CreatorId = table.Column(type: "uuid", nullable: true), - Message = table.Column(type: "text", nullable: true), - TimeCreated = table.Column(type: "timestamp without time zone", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Comments", x => x.Id); - table.ForeignKey( - name: "FK_Comments_AspNetUsers_CreatorId", - column: x => x.CreatorId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - table.ForeignKey( - name: "FK_Comments_Posts_PostId", - column: x => x.PostId, - principalTable: "Posts", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - }); - - migrationBuilder.CreateTable( - name: "RatedPosts", - columns: table => new - { - UserId = table.Column(type: "uuid", nullable: false), - PostId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_RatedPosts", x => new { x.UserId, x.PostId }); - table.ForeignKey( - name: "FK_RatedPosts_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_RatedPosts_Posts_PostId", - column: x => x.PostId, - principalTable: "Posts", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Rating", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - PostId = table.Column(type: "uuid", nullable: false), - Rate = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Rating", x => x.Id); - table.ForeignKey( - name: "FK_Rating_Posts_PostId", - column: x => x.PostId, - principalTable: "Posts", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserRates", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - UserId = table.Column(type: "uuid", nullable: true), - Liked = table.Column(type: "boolean", nullable: false), - PostId = table.Column(type: "uuid", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_UserRates", x => x.Id); - table.ForeignKey( - name: "FK_UserRates_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - table.ForeignKey( - name: "FK_UserRates_Posts_PostId", - column: x => x.PostId, - principalTable: "Posts", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - }); - - migrationBuilder.CreateIndex( - name: "IX_AspNetRoleClaims_RoleId", - table: "AspNetRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "RoleNameIndex", - table: "AspNetRoles", - column: "NormalizedName", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserClaims_UserId", - table: "AspNetUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserLogins_UserId", - table: "AspNetUserLogins", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserRoles_RoleId", - table: "AspNetUserRoles", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "EmailIndex", - table: "AspNetUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUsers_UserName", - table: "AspNetUsers", - column: "UserName", - unique: true); - - migrationBuilder.CreateIndex( - name: "UserNameIndex", - table: "AspNetUsers", - column: "NormalizedUserName", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Comments_CreatorId", - table: "Comments", - column: "CreatorId"); - - migrationBuilder.CreateIndex( - name: "IX_Comments_PostId", - table: "Comments", - column: "PostId"); - - migrationBuilder.CreateIndex( - name: "IX_LanguageUser_UsersId", - table: "LanguageUser", - column: "UsersId"); - - migrationBuilder.CreateIndex( - name: "IX_Posts_CreatorId", - table: "Posts", - column: "CreatorId"); - - migrationBuilder.CreateIndex( - name: "IX_ProfilePicture_UserId", - table: "ProfilePicture", - column: "UserId", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_RatedPosts_PostId", - table: "RatedPosts", - column: "PostId"); - - migrationBuilder.CreateIndex( - name: "IX_Rating_PostId", - table: "Rating", - column: "PostId", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_RoleUser_UsersId", - table: "RoleUser", - column: "UsersId"); - - migrationBuilder.CreateIndex( - name: "IX_TechnologyUser_UsersId", - table: "TechnologyUser", - column: "UsersId"); - - migrationBuilder.CreateIndex( - name: "IX_UserFriends_FriendId", - table: "UserFriends", - column: "FriendId"); - - migrationBuilder.CreateIndex( - name: "IX_UserRates_PostId", - table: "UserRates", - column: "PostId"); - - migrationBuilder.CreateIndex( - name: "IX_UserRates_UserId", - table: "UserRates", - column: "UserId"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AspNetRoleClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserLogins"); - - migrationBuilder.DropTable( - name: "AspNetUserRoles"); - - migrationBuilder.DropTable( - name: "AspNetUserTokens"); - - migrationBuilder.DropTable( - name: "Comments"); - - migrationBuilder.DropTable( - name: "LanguageUser"); - - migrationBuilder.DropTable( - name: "ProfilePicture"); - - migrationBuilder.DropTable( - name: "RatedPosts"); - - migrationBuilder.DropTable( - name: "Rating"); - - migrationBuilder.DropTable( - name: "RoleUser"); - - migrationBuilder.DropTable( - name: "TechnologyUser"); - - migrationBuilder.DropTable( - name: "UserFriends"); - - migrationBuilder.DropTable( - name: "UserRates"); - - migrationBuilder.DropTable( - name: "Languages"); - - migrationBuilder.DropTable( - name: "AspNetRoles"); - - migrationBuilder.DropTable( - name: "Technologies"); - - migrationBuilder.DropTable( - name: "Posts"); - - migrationBuilder.DropTable( - name: "AspNetUsers"); - } - } -} diff --git a/src/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.Designer.cs b/src/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.Designer.cs deleted file mode 100644 index c11374a..0000000 --- a/src/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.Designer.cs +++ /dev/null @@ -1,643 +0,0 @@ -// -using System; -using System.Collections.Generic; -using DevHive.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -namespace DevHive.Data.Migrations -{ - [DbContext(typeof(DevHiveContext))] - [Migration("20210205150447_Friends_Init_Config")] - partial class Friends_Init_Config - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .UseIdentityByDefaultColumns() - .HasAnnotation("Relational:MaxIdentifierLength", 63) - .HasAnnotation("ProductVersion", "5.0.1"); - - modelBuilder.Entity("DevHive.Data.Models.Comment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreatorId") - .HasColumnType("uuid"); - - b.Property("Message") - .HasColumnType("text"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.Property("TimeCreated") - .HasColumnType("timestamp without time zone"); - - b.HasKey("Id"); - - b.HasIndex("CreatorId"); - - b.HasIndex("PostId"); - - b.ToTable("Comments"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Language", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("Languages"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Post", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreatorId") - .HasColumnType("uuid"); - - b.Property>("FileUrls") - .HasColumnType("text[]"); - - b.Property("Message") - .HasColumnType("text"); - - b.Property("TimeCreated") - .HasColumnType("timestamp without time zone"); - - b.HasKey("Id"); - - b.HasIndex("CreatorId"); - - b.ToTable("Posts"); - }); - - modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("PictureURL") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId") - .IsUnique(); - - b.ToTable("ProfilePicture"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Rating", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Rate") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.ToTable("Rating"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Role", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("AspNetRoles"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Technology", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("Technologies"); - }); - - modelBuilder.Entity("DevHive.Data.Models.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccessFailedCount") - .HasColumnType("integer"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("boolean"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("LockoutEnabled") - .HasColumnType("boolean"); - - b.Property("LockoutEnd") - .HasColumnType("timestamp with time zone"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("PasswordHash") - .HasColumnType("text"); - - b.Property("PhoneNumber") - .HasColumnType("text"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("boolean"); - - b.Property("SecurityStamp") - .HasColumnType("text"); - - b.Property("TwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.HasIndex("UserId"); - - b.HasIndex("UserName") - .IsUnique(); - - b.ToTable("AspNetUsers"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.HasKey("UserId", "PostId"); - - b.HasIndex("PostId"); - - b.ToTable("RatedPosts"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserFriend", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("FriendId") - .HasColumnType("uuid"); - - b.HasKey("UserId", "FriendId"); - - b.HasIndex("FriendId"); - - b.ToTable("UserFriends"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Rate") - .HasColumnType("boolean"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserRates"); - }); - - modelBuilder.Entity("LanguageUser", b => - { - b.Property("LanguagesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("LanguagesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("LanguageUser"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .UseIdentityByDefaultColumn(); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("RoleId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .UseIdentityByDefaultColumn(); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("ProviderKey") - .HasColumnType("text"); - - b.Property("ProviderDisplayName") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("RoleId") - .HasColumnType("uuid"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Value") - .HasColumnType("text"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.Property("RolesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("RolesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("RoleUser"); - }); - - modelBuilder.Entity("TechnologyUser", b => - { - b.Property("TechnologiesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("TechnologiesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("TechnologyUser"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Comment", b => - { - b.HasOne("DevHive.Data.Models.User", "Creator") - .WithMany("Comments") - .HasForeignKey("CreatorId"); - - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithMany("Comments") - .HasForeignKey("PostId"); - - b.Navigation("Creator"); - - b.Navigation("Post"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Post", b => - { - b.HasOne("DevHive.Data.Models.User", "Creator") - .WithMany("Posts") - .HasForeignKey("CreatorId"); - - b.Navigation("Creator"); - }); - - modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => - { - b.HasOne("DevHive.Data.Models.User", "User") - .WithOne("ProfilePicture") - .HasForeignKey("DevHive.Data.Models.ProfilePicture", "UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("DevHive.Data.Models.User", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany("Friends") - .HasForeignKey("UserId"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => - { - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithMany() - .HasForeignKey("PostId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Post"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserFriend", b => - { - b.HasOne("DevHive.Data.Models.User", "Friend") - .WithMany() - .HasForeignKey("FriendId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Friend"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => - { - b.HasOne("DevHive.Data.Models.User", "User") - .WithMany() - .HasForeignKey("UserId"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("LanguageUser", b => - { - b.HasOne("DevHive.Data.Models.Language", null) - .WithMany() - .HasForeignKey("LanguagesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("DevHive.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("DevHive.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.HasOne("DevHive.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RolesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("TechnologyUser", b => - { - b.HasOne("DevHive.Data.Models.Technology", null) - .WithMany() - .HasForeignKey("TechnologiesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("DevHive.Data.Models.Post", b => - { - b.Navigation("Comments"); - }); - - modelBuilder.Entity("DevHive.Data.Models.User", b => - { - b.Navigation("Comments"); - - b.Navigation("Friends"); - - b.Navigation("Posts"); - - b.Navigation("ProfilePicture"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.cs b/src/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.cs deleted file mode 100644 index 1fc970d..0000000 --- a/src/DevHive.Data/Migrations/20210205150447_Friends_Init_Config.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -namespace DevHive.Data.Migrations -{ - public partial class Friends_Init_Config : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "UserId", - table: "AspNetUsers", - type: "uuid", - nullable: true); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUsers_UserId", - table: "AspNetUsers", - column: "UserId"); - - migrationBuilder.AddForeignKey( - name: "FK_AspNetUsers_AspNetUsers_UserId", - table: "AspNetUsers", - column: "UserId", - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_AspNetUsers_AspNetUsers_UserId", - table: "AspNetUsers"); - - migrationBuilder.DropIndex( - name: "IX_AspNetUsers_UserId", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "UserId", - table: "AspNetUsers"); - } - } -} diff --git a/src/DevHive.Data/Migrations/20210205154810_PostFileAttachments.Designer.cs b/src/DevHive.Data/Migrations/20210205154810_PostFileAttachments.Designer.cs deleted file mode 100644 index 5d8e13a..0000000 --- a/src/DevHive.Data/Migrations/20210205154810_PostFileAttachments.Designer.cs +++ /dev/null @@ -1,691 +0,0 @@ -// -using System; -using DevHive.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -namespace DevHive.Data.Migrations -{ - [DbContext(typeof(DevHiveContext))] - [Migration("20210205154810_PostFileAttachments")] - partial class PostFileAttachments - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .UseIdentityByDefaultColumns() - .HasAnnotation("Relational:MaxIdentifierLength", 63) - .HasAnnotation("ProductVersion", "5.0.1"); - - modelBuilder.Entity("DevHive.Data.Models.Comment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreatorId") - .HasColumnType("uuid"); - - b.Property("Message") - .HasColumnType("text"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.Property("TimeCreated") - .HasColumnType("timestamp without time zone"); - - b.HasKey("Id"); - - b.HasIndex("CreatorId"); - - b.HasIndex("PostId"); - - b.ToTable("Comments"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Language", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("Languages"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Post", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreatorId") - .HasColumnType("uuid"); - - b.Property("Message") - .HasColumnType("text"); - - b.Property("TimeCreated") - .HasColumnType("timestamp without time zone"); - - b.HasKey("Id"); - - b.HasIndex("CreatorId"); - - b.ToTable("Posts"); - }); - - modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("PictureURL") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId") - .IsUnique(); - - b.ToTable("ProfilePicture"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Rating", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.Property("Rate") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("PostId") - .IsUnique(); - - b.ToTable("Rating"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Role", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("AspNetRoles"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Technology", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("Technologies"); - }); - - modelBuilder.Entity("DevHive.Data.Models.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccessFailedCount") - .HasColumnType("integer"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("boolean"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("LockoutEnabled") - .HasColumnType("boolean"); - - b.Property("LockoutEnd") - .HasColumnType("timestamp with time zone"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("PasswordHash") - .HasColumnType("text"); - - b.Property("PhoneNumber") - .HasColumnType("text"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("boolean"); - - b.Property("SecurityStamp") - .HasColumnType("text"); - - b.Property("TwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.HasIndex("UserName") - .IsUnique(); - - b.ToTable("AspNetUsers"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.PostAttachments", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("FileUrl") - .HasColumnType("text"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("PostId"); - - b.ToTable("PostAttachments"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.HasKey("UserId", "PostId"); - - b.HasIndex("PostId"); - - b.ToTable("RatedPosts"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserFriend", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("FriendId") - .HasColumnType("uuid"); - - b.HasKey("UserId", "FriendId"); - - b.HasIndex("FriendId"); - - b.ToTable("UserFriends"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Liked") - .HasColumnType("boolean"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("PostId"); - - b.HasIndex("UserId"); - - b.ToTable("UserRates"); - }); - - modelBuilder.Entity("LanguageUser", b => - { - b.Property("LanguagesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("LanguagesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("LanguageUser"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .UseIdentityByDefaultColumn(); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("RoleId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .UseIdentityByDefaultColumn(); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("ProviderKey") - .HasColumnType("text"); - - b.Property("ProviderDisplayName") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("RoleId") - .HasColumnType("uuid"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Value") - .HasColumnType("text"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.Property("RolesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("RolesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("RoleUser"); - }); - - modelBuilder.Entity("TechnologyUser", b => - { - b.Property("TechnologiesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("TechnologiesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("TechnologyUser"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Comment", b => - { - b.HasOne("DevHive.Data.Models.User", "Creator") - .WithMany("Comments") - .HasForeignKey("CreatorId"); - - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithMany("Comments") - .HasForeignKey("PostId"); - - b.Navigation("Creator"); - - b.Navigation("Post"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Post", b => - { - b.HasOne("DevHive.Data.Models.User", "Creator") - .WithMany("Posts") - .HasForeignKey("CreatorId"); - - b.Navigation("Creator"); - }); - - modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => - { - b.HasOne("DevHive.Data.Models.User", "User") - .WithOne("ProfilePicture") - .HasForeignKey("DevHive.Data.Models.ProfilePicture", "UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Rating", b => - { - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithOne("Rating") - .HasForeignKey("DevHive.Data.Models.Rating", "PostId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Post"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.PostAttachments", b => - { - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithMany("Attachments") - .HasForeignKey("PostId"); - - b.Navigation("Post"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => - { - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithMany() - .HasForeignKey("PostId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", "User") - .WithMany("RatedPosts") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Post"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserFriend", b => - { - b.HasOne("DevHive.Data.Models.User", "Friend") - .WithMany("FriendsOf") - .HasForeignKey("FriendId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", "User") - .WithMany("MyFriends") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Friend"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => - { - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithMany() - .HasForeignKey("PostId"); - - b.HasOne("DevHive.Data.Models.User", "User") - .WithMany() - .HasForeignKey("UserId"); - - b.Navigation("Post"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("LanguageUser", b => - { - b.HasOne("DevHive.Data.Models.Language", null) - .WithMany() - .HasForeignKey("LanguagesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("DevHive.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("DevHive.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.HasOne("DevHive.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RolesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("TechnologyUser", b => - { - b.HasOne("DevHive.Data.Models.Technology", null) - .WithMany() - .HasForeignKey("TechnologiesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("DevHive.Data.Models.Post", b => - { - b.Navigation("Attachments"); - - b.Navigation("Comments"); - - b.Navigation("Rating"); - }); - - modelBuilder.Entity("DevHive.Data.Models.User", b => - { - b.Navigation("Comments"); - - b.Navigation("FriendsOf"); - - b.Navigation("MyFriends"); - - b.Navigation("Posts"); - - b.Navigation("ProfilePicture"); - - b.Navigation("RatedPosts"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/DevHive.Data/Migrations/20210205154810_PostFileAttachments.cs b/src/DevHive.Data/Migrations/20210205154810_PostFileAttachments.cs deleted file mode 100644 index 7b7b933..0000000 --- a/src/DevHive.Data/Migrations/20210205154810_PostFileAttachments.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -namespace DevHive.Data.Migrations -{ - public partial class PostFileAttachments : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "FileUrls", - table: "Posts"); - - migrationBuilder.CreateTable( - name: "PostAttachments", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - PostId = table.Column(type: "uuid", nullable: true), - FileUrl = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_PostAttachments", x => x.Id); - table.ForeignKey( - name: "FK_PostAttachments_Posts_PostId", - column: x => x.PostId, - principalTable: "Posts", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - }); - - migrationBuilder.CreateIndex( - name: "IX_PostAttachments_PostId", - table: "PostAttachments", - column: "PostId"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "PostAttachments"); - - migrationBuilder.AddColumn( - name: "FileUrls", - table: "Posts", - type: "text[]", - nullable: true); - } - } -} diff --git a/src/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.Designer.cs b/src/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.Designer.cs deleted file mode 100644 index 3ad3ec8..0000000 --- a/src/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.Designer.cs +++ /dev/null @@ -1,609 +0,0 @@ -// -using System; -using System.Collections.Generic; -using DevHive.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -namespace DevHive.Data.Migrations -{ - [DbContext(typeof(DevHiveContext))] - [Migration("20210205160520_Friends_First_Tweek")] - partial class Friends_First_Tweek - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .UseIdentityByDefaultColumns() - .HasAnnotation("Relational:MaxIdentifierLength", 63) - .HasAnnotation("ProductVersion", "5.0.1"); - - modelBuilder.Entity("DevHive.Data.Models.Comment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreatorId") - .HasColumnType("uuid"); - - b.Property("Message") - .HasColumnType("text"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.Property("TimeCreated") - .HasColumnType("timestamp without time zone"); - - b.HasKey("Id"); - - b.HasIndex("CreatorId"); - - b.HasIndex("PostId"); - - b.ToTable("Comments"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Language", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("Languages"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Post", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreatorId") - .HasColumnType("uuid"); - - b.Property>("FileUrls") - .HasColumnType("text[]"); - - b.Property("Message") - .HasColumnType("text"); - - b.Property("TimeCreated") - .HasColumnType("timestamp without time zone"); - - b.HasKey("Id"); - - b.HasIndex("CreatorId"); - - b.ToTable("Posts"); - }); - - modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("PictureURL") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId") - .IsUnique(); - - b.ToTable("ProfilePicture"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Rating", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Rate") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.ToTable("Rating"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Role", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("AspNetRoles"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Technology", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("Technologies"); - }); - - modelBuilder.Entity("DevHive.Data.Models.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccessFailedCount") - .HasColumnType("integer"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("boolean"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("LockoutEnabled") - .HasColumnType("boolean"); - - b.Property("LockoutEnd") - .HasColumnType("timestamp with time zone"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("PasswordHash") - .HasColumnType("text"); - - b.Property("PhoneNumber") - .HasColumnType("text"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("boolean"); - - b.Property("SecurityStamp") - .HasColumnType("text"); - - b.Property("TwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.HasIndex("UserId"); - - b.HasIndex("UserName") - .IsUnique(); - - b.ToTable("AspNetUsers"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.HasKey("UserId", "PostId"); - - b.HasIndex("PostId"); - - b.ToTable("RatedPosts"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Rate") - .HasColumnType("boolean"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserRates"); - }); - - modelBuilder.Entity("LanguageUser", b => - { - b.Property("LanguagesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("LanguagesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("LanguageUser"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .UseIdentityByDefaultColumn(); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("RoleId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .UseIdentityByDefaultColumn(); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("ProviderKey") - .HasColumnType("text"); - - b.Property("ProviderDisplayName") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("RoleId") - .HasColumnType("uuid"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Value") - .HasColumnType("text"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.Property("RolesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("RolesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("RoleUser"); - }); - - modelBuilder.Entity("TechnologyUser", b => - { - b.Property("TechnologiesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("TechnologiesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("TechnologyUser"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Comment", b => - { - b.HasOne("DevHive.Data.Models.User", "Creator") - .WithMany("Comments") - .HasForeignKey("CreatorId"); - - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithMany("Comments") - .HasForeignKey("PostId"); - - b.Navigation("Creator"); - - b.Navigation("Post"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Post", b => - { - b.HasOne("DevHive.Data.Models.User", "Creator") - .WithMany("Posts") - .HasForeignKey("CreatorId"); - - b.Navigation("Creator"); - }); - - modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => - { - b.HasOne("DevHive.Data.Models.User", "User") - .WithOne("ProfilePicture") - .HasForeignKey("DevHive.Data.Models.ProfilePicture", "UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("DevHive.Data.Models.User", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany("Friends") - .HasForeignKey("UserId"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => - { - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithMany() - .HasForeignKey("PostId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Post"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => - { - b.HasOne("DevHive.Data.Models.User", "User") - .WithMany() - .HasForeignKey("UserId"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("LanguageUser", b => - { - b.HasOne("DevHive.Data.Models.Language", null) - .WithMany() - .HasForeignKey("LanguagesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("DevHive.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("DevHive.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.HasOne("DevHive.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RolesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("TechnologyUser", b => - { - b.HasOne("DevHive.Data.Models.Technology", null) - .WithMany() - .HasForeignKey("TechnologiesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("DevHive.Data.Models.Post", b => - { - b.Navigation("Comments"); - }); - - modelBuilder.Entity("DevHive.Data.Models.User", b => - { - b.Navigation("Comments"); - - b.Navigation("Friends"); - - b.Navigation("Posts"); - - b.Navigation("ProfilePicture"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.cs b/src/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.cs deleted file mode 100644 index 565f863..0000000 --- a/src/DevHive.Data/Migrations/20210205160520_Friends_First_Tweek.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -namespace DevHive.Data.Migrations -{ - public partial class Friends_First_Tweek : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "UserFriends"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "UserFriends", - columns: table => new - { - UserId = table.Column(type: "uuid", nullable: false), - FriendId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_UserFriends", x => new { x.UserId, x.FriendId }); - table.ForeignKey( - name: "FK_UserFriends_AspNetUsers_FriendId", - column: x => x.FriendId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_UserFriends_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_UserFriends_FriendId", - table: "UserFriends", - column: "FriendId"); - } - } -} diff --git a/src/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs b/src/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs deleted file mode 100644 index dc5739c..0000000 --- a/src/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs +++ /dev/null @@ -1,658 +0,0 @@ -// -using System; -using DevHive.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -namespace DevHive.Data.Migrations -{ - [DbContext(typeof(DevHiveContext))] - partial class DevHiveContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .UseIdentityByDefaultColumns() - .HasAnnotation("Relational:MaxIdentifierLength", 63) - .HasAnnotation("ProductVersion", "5.0.1"); - - modelBuilder.Entity("DevHive.Data.Models.Comment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreatorId") - .HasColumnType("uuid"); - - b.Property("Message") - .HasColumnType("text"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.Property("TimeCreated") - .HasColumnType("timestamp without time zone"); - - b.HasKey("Id"); - - b.HasIndex("CreatorId"); - - b.HasIndex("PostId"); - - b.ToTable("Comments"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Language", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("Languages"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Post", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreatorId") - .HasColumnType("uuid"); - - b.Property("Message") - .HasColumnType("text"); - - b.Property("TimeCreated") - .HasColumnType("timestamp without time zone"); - - b.HasKey("Id"); - - b.HasIndex("CreatorId"); - - b.ToTable("Posts"); - }); - - modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("PictureURL") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId") - .IsUnique(); - - b.ToTable("ProfilePicture"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Rating", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.Property("Rate") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("PostId") - .IsUnique(); - - b.ToTable("Rating"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Role", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("AspNetRoles"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Technology", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Name") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("Technologies"); - }); - - modelBuilder.Entity("DevHive.Data.Models.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AccessFailedCount") - .HasColumnType("integer"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("boolean"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("LockoutEnabled") - .HasColumnType("boolean"); - - b.Property("LockoutEnd") - .HasColumnType("timestamp with time zone"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("PasswordHash") - .HasColumnType("text"); - - b.Property("PhoneNumber") - .HasColumnType("text"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("boolean"); - - b.Property("SecurityStamp") - .HasColumnType("text"); - - b.Property("TwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.HasIndex("UserId"); - - b.HasIndex("UserName") - .IsUnique(); - - b.ToTable("AspNetUsers"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.PostAttachments", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("FileUrl") - .HasColumnType("text"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("PostId"); - - b.ToTable("PostAttachments"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.HasKey("UserId", "PostId"); - - b.HasIndex("PostId"); - - b.ToTable("RatedPosts"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Liked") - .HasColumnType("boolean"); - - b.Property("PostId") - .HasColumnType("uuid"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("PostId"); - - b.HasIndex("UserId"); - - b.ToTable("UserRates"); - }); - - modelBuilder.Entity("LanguageUser", b => - { - b.Property("LanguagesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("LanguagesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("LanguageUser"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .UseIdentityByDefaultColumn(); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("RoleId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .UseIdentityByDefaultColumn(); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("ProviderKey") - .HasColumnType("text"); - - b.Property("ProviderDisplayName") - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("RoleId") - .HasColumnType("uuid"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("uuid"); - - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Value") - .HasColumnType("text"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.Property("RolesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("RolesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("RoleUser"); - }); - - modelBuilder.Entity("TechnologyUser", b => - { - b.Property("TechnologiesId") - .HasColumnType("uuid"); - - b.Property("UsersId") - .HasColumnType("uuid"); - - b.HasKey("TechnologiesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("TechnologyUser"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Comment", b => - { - b.HasOne("DevHive.Data.Models.User", "Creator") - .WithMany("Comments") - .HasForeignKey("CreatorId"); - - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithMany("Comments") - .HasForeignKey("PostId"); - - b.Navigation("Creator"); - - b.Navigation("Post"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Post", b => - { - b.HasOne("DevHive.Data.Models.User", "Creator") - .WithMany("Posts") - .HasForeignKey("CreatorId"); - - b.Navigation("Creator"); - }); - - modelBuilder.Entity("DevHive.Data.Models.ProfilePicture", b => - { - b.HasOne("DevHive.Data.Models.User", "User") - .WithOne("ProfilePicture") - .HasForeignKey("DevHive.Data.Models.ProfilePicture", "UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("DevHive.Data.Models.Rating", b => - { - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithOne("Rating") - .HasForeignKey("DevHive.Data.Models.Rating", "PostId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Post"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.PostAttachments", b => - { - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithMany("Attachments") - .HasForeignKey("PostId"); - - b.Navigation("Post"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.RatedPost", b => - { - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithMany() - .HasForeignKey("PostId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", "User") - .WithMany("RatedPosts") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Post"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("DevHive.Data.RelationModels.UserRate", b => - { - b.HasOne("DevHive.Data.Models.Post", "Post") - .WithMany() - .HasForeignKey("PostId"); - - b.HasOne("DevHive.Data.Models.User", "User") - .WithMany() - .HasForeignKey("UserId"); - - b.Navigation("Post"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("LanguageUser", b => - { - b.HasOne("DevHive.Data.Models.Language", null) - .WithMany() - .HasForeignKey("LanguagesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("DevHive.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("DevHive.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.HasOne("DevHive.Data.Models.Role", null) - .WithMany() - .HasForeignKey("RolesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("TechnologyUser", b => - { - b.HasOne("DevHive.Data.Models.Technology", null) - .WithMany() - .HasForeignKey("TechnologiesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DevHive.Data.Models.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("DevHive.Data.Models.Post", b => - { - b.Navigation("Attachments"); - - b.Navigation("Comments"); - - b.Navigation("Rating"); - }); - - modelBuilder.Entity("DevHive.Data.Models.User", b => - { - b.Navigation("Comments"); - - b.Navigation("Friends"); - - b.Navigation("Posts"); - - b.Navigation("ProfilePicture"); - - b.Navigation("RatedPosts"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/DevHive.Data/Models/Comment.cs b/src/DevHive.Data/Models/Comment.cs deleted file mode 100644 index e2bb21d..0000000 --- a/src/DevHive.Data/Models/Comment.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using DevHive.Data.Interfaces.Models; - -namespace DevHive.Data.Models -{ - public class Comment : IComment - { - public Guid Id { get; set; } - - // public Guid PostId { get; set; } - public Post Post { get; set; } - - // public Guid CreatorId { get; set; } - public User Creator { get; set; } - - public string Message { get; set; } - - public DateTime TimeCreated { get; set; } - } -} diff --git a/src/DevHive.Data/Models/Language.cs b/src/DevHive.Data/Models/Language.cs deleted file mode 100644 index 7ad8ff2..0000000 --- a/src/DevHive.Data/Models/Language.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using DevHive.Data.Interfaces.Models; - -namespace DevHive.Data.Models -{ - public class Language : ILanguage - { - public Guid Id { get; set; } - - public string Name { get; set; } - - public HashSet Users { get; set; } = new(); - } -} diff --git a/src/DevHive.Data/Models/Post.cs b/src/DevHive.Data/Models/Post.cs deleted file mode 100644 index 3f3d8c9..0000000 --- a/src/DevHive.Data/Models/Post.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations.Schema; -using DevHive.Data.Interfaces.Models; -using DevHive.Data.RelationModels; - -namespace DevHive.Data.Models -{ - [Table("Posts")] - public class Post : IPost - { - public Guid Id { get; set; } - - public User Creator { get; set; } - - public string Message { get; set; } - - public DateTime TimeCreated { get; set; } - - public List Comments { get; set; } = new(); - - public Rating Rating { get; set; } = new(); - - public List Attachments { get; set; } = new(); - } -} diff --git a/src/DevHive.Data/Models/ProfilePicture.cs b/src/DevHive.Data/Models/ProfilePicture.cs deleted file mode 100644 index d5cc397..0000000 --- a/src/DevHive.Data/Models/ProfilePicture.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using DevHive.Data.Interfaces.Models; - -namespace DevHive.Data.Models -{ - public class ProfilePicture: IProfilePicture - { - public Guid Id { get; set; } - - public Guid UserId { get; set; } - public User User { get; set; } - - public string PictureURL { get; set; } - } -} diff --git a/src/DevHive.Data/Models/Rating.cs b/src/DevHive.Data/Models/Rating.cs deleted file mode 100644 index e1bedd2..0000000 --- a/src/DevHive.Data/Models/Rating.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using DevHive.Data.Interfaces.Models; - -namespace DevHive.Data.Models -{ - public class Rating : IRating - { - public Guid Id { get; set; } - - public Guid PostId { get; set; } - - public Post Post { get; set; } - - public int Rate { get; set; } - } -} diff --git a/src/DevHive.Data/Models/Role.cs b/src/DevHive.Data/Models/Role.cs deleted file mode 100644 index 259d867..0000000 --- a/src/DevHive.Data/Models/Role.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.ComponentModel.DataAnnotations.Schema; -using System.Collections.Generic; -using DevHive.Data.Interfaces.Models; -using Microsoft.AspNetCore.Identity; -using System; - -namespace DevHive.Data.Models -{ - [Table("Roles")] - public class Role : IdentityRole, IRole - { - public const string DefaultRole = "User"; - public const string AdminRole = "Admin"; - - public HashSet Users { get; set; } = new(); - } -} diff --git a/src/DevHive.Data/Models/Technology.cs b/src/DevHive.Data/Models/Technology.cs deleted file mode 100644 index 6f98f0b..0000000 --- a/src/DevHive.Data/Models/Technology.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using DevHive.Data.Interfaces.Models; - -namespace DevHive.Data.Models -{ - public class Technology : ITechnology - { - public Guid Id { get; set; } - - public string Name { get; set; } - - public HashSet Users { get; set; } = new(); - } -} diff --git a/src/DevHive.Data/Models/User.cs b/src/DevHive.Data/Models/User.cs deleted file mode 100644 index 983d073..0000000 --- a/src/DevHive.Data/Models/User.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations.Schema; -using DevHive.Data.Interfaces.Models; -using DevHive.Data.RelationModels; -using Microsoft.AspNetCore.Identity; - -namespace DevHive.Data.Models -{ - [Table("Users")] - public class User : IdentityUser, IUser - { - public string FirstName { get; set; } - - public string LastName { get; set; } - - public ProfilePicture ProfilePicture { get; set; } - - public HashSet Languages { get; set; } = new(); - - public HashSet Technologies { get; set; } = new(); - - public HashSet Roles { get; set; } = new(); - - public HashSet Posts { get; set; } = new(); - - public HashSet Friends { get; set; } = new(); - - public HashSet Comments { get; set; } = new(); - - public HashSet RatedPosts { get; set; } = new(); - } -} diff --git a/src/DevHive.Data/RelationModels/PostAttachments.cs b/src/DevHive.Data/RelationModels/PostAttachments.cs deleted file mode 100644 index 48aa8ff..0000000 --- a/src/DevHive.Data/RelationModels/PostAttachments.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations.Schema; -using DevHive.Data.Models; - -namespace DevHive.Data.RelationModels -{ - [Table("PostAttachments")] - public class PostAttachments - { - public Guid Id { get; set; } - - public Post Post { get; set; } - - public string FileUrl { get; set; } - } -} diff --git a/src/DevHive.Data/RelationModels/RatedPost.cs b/src/DevHive.Data/RelationModels/RatedPost.cs deleted file mode 100644 index 7001d92..0000000 --- a/src/DevHive.Data/RelationModels/RatedPost.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations.Schema; -using System.Reflection.Metadata.Ecma335; -using DevHive.Data.Models; -using Microsoft.EntityFrameworkCore; - -namespace DevHive.Data.RelationModels -{ - [Table("RatedPosts")] - public class RatedPost - { - public Guid UserId { get; set; } - public User User { get; set; } - - public Guid PostId { get; set; } - public Post Post { get; set; } - } -} diff --git a/src/DevHive.Data/RelationModels/UserRate.cs b/src/DevHive.Data/RelationModels/UserRate.cs deleted file mode 100644 index 696e6f3..0000000 --- a/src/DevHive.Data/RelationModels/UserRate.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations.Schema; -using DevHive.Data.Models; - -namespace DevHive.Data.RelationModels -{ - [Table("UserRates")] - public class UserRate - { - public Guid Id { get; set; } - - public User User { get; set; } - - public bool Liked { get; set; } - - public Post Post { get; set; } - } -} diff --git a/src/DevHive.Data/Repositories/BaseRepository.cs b/src/DevHive.Data/Repositories/BaseRepository.cs deleted file mode 100644 index ece372e..0000000 --- a/src/DevHive.Data/Repositories/BaseRepository.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Threading.Tasks; -using DevHive.Data.Repositories.Interfaces; -using Microsoft.EntityFrameworkCore; - -namespace DevHive.Data.Repositories -{ - public class BaseRepository : IRepository - where TEntity : class - { - private readonly DbContext _context; - - public BaseRepository(DbContext context) - { - this._context = context; - } - - public virtual async Task AddAsync(TEntity entity) - { - await this._context - .Set() - .AddAsync(entity); - - return await this.SaveChangesAsync(); - } - - public virtual async Task GetByIdAsync(Guid id) - { - return await this._context - .Set() - .FindAsync(id); - } - - public virtual async Task EditAsync(Guid id, TEntity newEntity) - { - var entry = this._context.Entry(newEntity); - if (entry.State == EntityState.Detached) - this._context.Attach(newEntity); - - entry.State = EntityState.Modified; - - return await this.SaveChangesAsync(); - } - - public virtual async Task DeleteAsync(TEntity entity) - { - this._context.Remove(entity); - - return await this.SaveChangesAsync(); - } - - public virtual async Task SaveChangesAsync() - { - int result = await _context.SaveChangesAsync(); - - return result >= 1; - } - } -} diff --git a/src/DevHive.Data/Repositories/CommentRepository.cs b/src/DevHive.Data/Repositories/CommentRepository.cs deleted file mode 100644 index bee7624..0000000 --- a/src/DevHive.Data/Repositories/CommentRepository.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Threading.Tasks; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using Microsoft.EntityFrameworkCore; - -namespace DevHive.Data.Repositories -{ - public class CommentRepository : BaseRepository, ICommentRepository - { - private readonly DevHiveContext _context; - - public CommentRepository(DevHiveContext context) - : base(context) - { - this._context = context; - } - - #region Read - public override async Task GetByIdAsync(Guid id) - { - return await this._context.Comments - .Include(x => x.Creator) - .Include(x => x.Post) - .FirstOrDefaultAsync(x => x.Id == id); - } - - /// - /// This method returns the comment that is made at exactly the given time and by the given creator - /// - public async Task GetCommentByIssuerAndTimeCreatedAsync(Guid issuerId, DateTime timeCreated) - { - return await this._context.Comments - .FirstOrDefaultAsync(p => p.Creator.Id == issuerId && - p.TimeCreated == timeCreated); - } - - public async Task> GetPostComments(Guid postId) - { - return await this._context.Posts - .SelectMany(x => x.Comments) - .Where(x => x.Post.Id == postId) - .ToListAsync(); - } - #endregion - - #region Update - public override async Task EditAsync(Guid id, Comment newEntity) - { - Comment comment = await this.GetByIdAsync(id); - - this._context - .Entry(comment) - .CurrentValues - .SetValues(newEntity); - - return await this.SaveChangesAsync(); - } - #endregion - - - #region Validations - public async Task DoesCommentExist(Guid id) - { - return await this._context.Comments - .AsNoTracking() - .AnyAsync(r => r.Id == id); - } - #endregion - } -} diff --git a/src/DevHive.Data/Repositories/FeedRepository.cs b/src/DevHive.Data/Repositories/FeedRepository.cs deleted file mode 100644 index 8d3e5e1..0000000 --- a/src/DevHive.Data/Repositories/FeedRepository.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using AutoMapper.Internal; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using Microsoft.EntityFrameworkCore; - -namespace DevHive.Data.Repositories -{ - public class FeedRepository : IFeedRepository - { - private readonly DevHiveContext _context; - - public FeedRepository(DevHiveContext context) - { - this._context = context; - } - - /// - /// This returns a given amount of posts of all given friends, created before "firstRequestIssued", - /// ordered from latest to oldest (time created). - /// PageSize specifies how many posts to get, and pageNumber specifices how many posts to skip (pageNumber * pageSize). - /// - /// This method is used in the feed page. - /// Posts from friends are meant to be gotten in chunks, meaning you get X posts, and then get another amount of posts, - /// that are after the first X posts. - /// - public async Task> GetFriendsPosts(List friendsList, DateTime firstRequestIssued, int pageNumber, int pageSize) - { - List friendsIds = friendsList.Select(f => f.Id).ToList(); - - List posts = await this._context.Posts - .Where(post => post.TimeCreated < firstRequestIssued) - .Where(p => friendsIds.Contains(p.Creator.Id)) - .ToListAsync(); - - // Ordering by descending can't happen in query, because it doesn't order it - // completely correctly (example: in query these two times are ordered - // like this: 2021-01-30T11:49:45, 2021-01-28T21:37:40.701244) - posts = posts - .OrderByDescending(x => x.TimeCreated.ToFileTime()) - .Skip((pageNumber - 1) * pageSize) - .Take(pageSize) - .ToList(); - - return posts; - } - - /// - /// This returns a given amount of posts, that a user has made, created before "firstRequestIssued", - /// ordered from latest to oldest (time created). - /// PageSize specifies how many posts to get, and pageNumber specifices how many posts to skip (pageNumber * pageSize). - /// - /// This method is used in the profile page. - /// Posts from friends are meant to be gotten in chunks, meaning you get X posts, and then get another amount of posts, - /// that are after the first X posts. - /// - public async Task> GetUsersPosts(User user, DateTime firstRequestIssued, int pageNumber, int pageSize) - { - List posts = await this._context.Posts - .Where(post => post.TimeCreated < firstRequestIssued) - .Where(p => p.Creator.Id == user.Id) - .ToListAsync(); - - // Look at GetFriendsPosts on why this is done like this - posts = posts - .OrderByDescending(x => x.TimeCreated.ToFileTime()) - .Skip((pageNumber - 1) * pageSize) - .Take(pageSize) - .ToList(); - - return posts; - } - } -} diff --git a/src/DevHive.Data/Repositories/LanguageRepository.cs b/src/DevHive.Data/Repositories/LanguageRepository.cs deleted file mode 100644 index 31d0b86..0000000 --- a/src/DevHive.Data/Repositories/LanguageRepository.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using Microsoft.EntityFrameworkCore; - -namespace DevHive.Data.Repositories -{ - public class LanguageRepository : BaseRepository, ILanguageRepository - { - private readonly DevHiveContext _context; - - public LanguageRepository(DevHiveContext context) - : base(context) - { - this._context = context; - } - - #region Read - public async Task GetByNameAsync(string languageName) - { - return await this._context.Languages - .FirstOrDefaultAsync(x => x.Name == languageName); - } - - /// - /// Returns all technologies that exist in the database - /// - public HashSet GetLanguages() - { - return this._context.Languages.ToHashSet(); - } - #endregion - - #region Validations - public async Task DoesLanguageNameExistAsync(string languageName) - { - return await this._context.Languages - .AsNoTracking() - .AnyAsync(r => r.Name == languageName); - } - - public async Task DoesLanguageExistAsync(Guid id) - { - return await this._context.Languages - .AsNoTracking() - .AnyAsync(r => r.Id == id); - } - #endregion - } -} diff --git a/src/DevHive.Data/Repositories/PostRepository.cs b/src/DevHive.Data/Repositories/PostRepository.cs deleted file mode 100644 index 52c5b4e..0000000 --- a/src/DevHive.Data/Repositories/PostRepository.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using DevHive.Data.RelationModels; -using Microsoft.EntityFrameworkCore; - -namespace DevHive.Data.Repositories -{ - public class PostRepository : BaseRepository, IPostRepository - { - private readonly DevHiveContext _context; - private readonly IUserRepository _userRepository; - - public PostRepository(DevHiveContext context, IUserRepository userRepository) - : base(context) - { - this._context = context; - this._userRepository = userRepository; - } - - public async Task AddNewPostToCreator(Guid userId, Post post) - { - User user = await this._userRepository.GetByIdAsync(userId); - user.Posts.Add(post); - - return await this.SaveChangesAsync(); - } - - #region Read - public override async Task GetByIdAsync(Guid id) - { - return await this._context.Posts - .Include(x => x.Comments) - .Include(x => x.Creator) - .Include(x => x.Attachments) - // .Include(x => x.Rating) - .FirstOrDefaultAsync(x => x.Id == id); - } - - /// - /// This method returns the post that is made at exactly the given time and by the given creator - /// - public async Task GetPostByCreatorAndTimeCreatedAsync(Guid creatorId, DateTime timeCreated) - { - return await this._context.Posts - .FirstOrDefaultAsync(p => p.Creator.Id == creatorId && - p.TimeCreated == timeCreated); - } - - public async Task> GetFileUrls(Guid postId) - { - return (await this.GetByIdAsync(postId)).Attachments.Select(x => x.FileUrl).ToList(); - } - #endregion - - #region Update - public override async Task EditAsync(Guid id, Post newEntity) - { - Post post = await this.GetByIdAsync(id); - // var ratingId = post.Rating.Id; - - this._context - .Entry(post) - .CurrentValues - .SetValues(newEntity); - - List postAttachments = new(); - foreach(var attachment in newEntity.Attachments) - postAttachments.Add(attachment); - post.Attachments = postAttachments; - - post.Comments.Clear(); - foreach(var comment in newEntity.Comments) - post.Comments.Add(comment); - - // post.Rating.Id = ratingId; - - this._context.Entry(post).State = EntityState.Modified; - - return await this.SaveChangesAsync(); - } - #endregion - - #region Validations - public async Task DoesPostExist(Guid postId) - { - return await this._context.Posts - .AsNoTracking() - .AnyAsync(r => r.Id == postId); - } - - public async Task DoesPostHaveFiles(Guid postId) - { - return await this._context.Posts - .AsNoTracking() - .Where(x => x.Id == postId) - .Select(x => x.Attachments) - .AnyAsync(); - } - #endregion - } -} diff --git a/src/DevHive.Data/Repositories/RatingRepository.cs b/src/DevHive.Data/Repositories/RatingRepository.cs deleted file mode 100644 index 1be8fe8..0000000 --- a/src/DevHive.Data/Repositories/RatingRepository.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using Microsoft.EntityFrameworkCore; - -namespace DevHive.Data.Repositories -{ - public class RatingRepository : BaseRepository, IRatingRepository - { - private readonly DevHiveContext _context; - private readonly IPostRepository _postRepository; - - public RatingRepository(DevHiveContext context, IPostRepository postRepository) - : base(context) - { - this._context = context; - this._postRepository = postRepository; - } - - public async Task GetRatingByPostId(Guid postId) - { - return await this._context.Rating - .FirstOrDefaultAsync(x => x.Post.Id == postId); - } - - public async Task UserRatedPost(Guid userId, Guid postId) - { - return await this._context.UserRate - .Where(x => x.Post.Id == postId) - .AnyAsync(x => x.User.Id == userId); - } - } -} diff --git a/src/DevHive.Data/Repositories/RoleRepository.cs b/src/DevHive.Data/Repositories/RoleRepository.cs deleted file mode 100644 index 441efef..0000000 --- a/src/DevHive.Data/Repositories/RoleRepository.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Threading.Tasks; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using Microsoft.EntityFrameworkCore; - -namespace DevHive.Data.Repositories -{ - public class RoleRepository : BaseRepository, IRoleRepository - { - private readonly DevHiveContext _context; - - public RoleRepository(DevHiveContext context) - : base(context) - { - this._context = context; - } - - #region Read - public async Task GetByNameAsync(string name) - { - return await this._context.Roles - .FirstOrDefaultAsync(x => x.Name == name); - } - #endregion - - public override async Task EditAsync(Guid id, Role newEntity) - { - Role role = await this.GetByIdAsync(id); - - this._context - .Entry(role) - .CurrentValues - .SetValues(newEntity); - - return await this.SaveChangesAsync(); - } - - #region Validations - public async Task DoesNameExist(string name) - { - return await this._context.Roles - .AsNoTracking() - .AnyAsync(r => r.Name == name); - } - - public async Task DoesRoleExist(Guid id) - { - return await this._context.Roles - .AsNoTracking() - .AnyAsync(r => r.Id == id); - } - #endregion - } -} diff --git a/src/DevHive.Data/Repositories/TechnologyRepository.cs b/src/DevHive.Data/Repositories/TechnologyRepository.cs deleted file mode 100644 index 6f0d10f..0000000 --- a/src/DevHive.Data/Repositories/TechnologyRepository.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using Microsoft.EntityFrameworkCore; - -namespace DevHive.Data.Repositories -{ - public class TechnologyRepository : BaseRepository, ITechnologyRepository - { - private readonly DevHiveContext _context; - - public TechnologyRepository(DevHiveContext context) - : base(context) - { - this._context = context; - } - - #region Read - public async Task GetByNameAsync(string technologyName) - { - return await this._context.Technologies - .FirstOrDefaultAsync(x => x.Name == technologyName); - } - - /// - /// Returns all technologies that exist in the database - /// - public HashSet GetTechnologies() - { - return this._context.Technologies.ToHashSet(); - } - #endregion - - #region Validations - public async Task DoesTechnologyNameExistAsync(string technologyName) - { - return await this._context.Technologies - .AsNoTracking() - .AnyAsync(r => r.Name == technologyName); - } - - public async Task DoesTechnologyExistAsync(Guid id) - { - return await this._context.Technologies - .AsNoTracking() - .AnyAsync(x => x.Id == id); - } - #endregion - } -} diff --git a/src/DevHive.Data/Repositories/UserRepository.cs b/src/DevHive.Data/Repositories/UserRepository.cs deleted file mode 100644 index 6e97e60..0000000 --- a/src/DevHive.Data/Repositories/UserRepository.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Threading.Tasks; -using AutoMapper.Mappers; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using DevHive.Data.RelationModels; -using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore; - -namespace DevHive.Data.Repositories -{ - public class UserRepository : BaseRepository, IUserRepository - { - private readonly DevHiveContext _context; - - public UserRepository(DevHiveContext context) - : base(context) - { - this._context = context; - } - - #region Read - public override async Task GetByIdAsync(Guid id) - { - return await this._context.Users - .Include(x => x.Roles) - .Include(x => x.Languages) - .Include(x => x.Technologies) - .Include(x => x.Posts) - .Include(x => x.Friends) - .Include(x => x.ProfilePicture) - .FirstOrDefaultAsync(x => x.Id == id); - } - - public async Task GetByUsernameAsync(string username) - { - return await this._context.Users - .Include(x => x.Roles) - .Include(x => x.Languages) - .Include(x => x.Technologies) - .Include(x => x.Posts) - .Include(x => x.Friends) - .Include(x => x.ProfilePicture) - .FirstOrDefaultAsync(x => x.UserName == username); - } - #endregion - - #region Update - public async Task UpdateProfilePicture(Guid userId, string pictureUrl) - { - User user = await this.GetByIdAsync(userId); - - user.ProfilePicture.PictureURL = pictureUrl; - - return await this.SaveChangesAsync(); - } - #endregion - - #region Validations - public async Task DoesUserExistAsync(Guid id) - { - return await this._context.Users - .AsNoTracking() - .AnyAsync(x => x.Id == id); - } - - public async Task DoesUsernameExistAsync(string username) - { - return await this._context.Users - .AsNoTracking() - .AnyAsync(u => u.UserName == username); - } - - public async Task DoesEmailExistAsync(string email) - { - return await this._context.Users - .AsNoTracking() - .AnyAsync(u => u.Email == email); - } - - public async Task ValidateFriendsCollectionAsync(List usernames) - { - bool valid = true; - - foreach (var username in usernames) - { - if (!await this._context.Users.AnyAsync(x => x.UserName == username)) - { - valid = false; - break; - } - } - return valid; - } - - public bool DoesUserHaveThisUsername(Guid id, string username) - { - return this._context.Users - .AsNoTracking() - .Any(x => x.Id == id && - x.UserName == username); - } - #endregion - } -} diff --git a/src/DevHive.Services/Configurations/Mapping/CommentMappings.cs b/src/DevHive.Services/Configurations/Mapping/CommentMappings.cs deleted file mode 100644 index 5ca2a9e..0000000 --- a/src/DevHive.Services/Configurations/Mapping/CommentMappings.cs +++ /dev/null @@ -1,27 +0,0 @@ -using DevHive.Data.Models; -using AutoMapper; -using DevHive.Services.Models.Comment; -using DevHive.Common.Models.Misc; - -namespace DevHive.Services.Configurations.Mapping -{ - public class CommentMappings : Profile - { - public CommentMappings() - { - CreateMap(); - CreateMap() - .ForMember(dest => dest.Id, src => src.MapFrom(p => p.CommentId)) - .ForMember(dest => dest.Message, src => src.MapFrom(p => p.NewMessage)); - - CreateMap() - .ForMember(dest => dest.CommentId, src => src.MapFrom(p => p.Id)) - .ForMember(dest => dest.IssuerFirstName, src => src.MapFrom(p => p.Creator.FirstName)) - .ForMember(dest => dest.IssuerLastName, src => src.MapFrom(p => p.Creator.LastName)) - .ForMember(dest => dest.IssuerUsername, src => src.MapFrom(p => p.Creator.UserName)); - - CreateMap() - .ForMember(dest => dest.Id, src => src.MapFrom(p => p.Id)); - } - } -} diff --git a/src/DevHive.Services/Configurations/Mapping/FeedMappings.cs b/src/DevHive.Services/Configurations/Mapping/FeedMappings.cs deleted file mode 100644 index 952e480..0000000 --- a/src/DevHive.Services/Configurations/Mapping/FeedMappings.cs +++ /dev/null @@ -1,11 +0,0 @@ -using AutoMapper; - -namespace DevHive.Services.Configurations.Mapping -{ - public class FeedMappings : Profile - { - public FeedMappings() - { - } - } -} diff --git a/src/DevHive.Services/Configurations/Mapping/LanguageMappings.cs b/src/DevHive.Services/Configurations/Mapping/LanguageMappings.cs deleted file mode 100644 index 9c572df..0000000 --- a/src/DevHive.Services/Configurations/Mapping/LanguageMappings.cs +++ /dev/null @@ -1,22 +0,0 @@ -using DevHive.Data.Models; -using AutoMapper; -using DevHive.Services.Models.Language; - -namespace DevHive.Services.Configurations.Mapping -{ - public class LanguageMappings : Profile - { - public LanguageMappings() - { - CreateMap(); - CreateMap(); - CreateMap(); - CreateMap(); - - CreateMap(); - CreateMap(); - CreateMap(); - CreateMap(); - } - } -} diff --git a/src/DevHive.Services/Configurations/Mapping/PostMappings.cs b/src/DevHive.Services/Configurations/Mapping/PostMappings.cs deleted file mode 100644 index 9362f90..0000000 --- a/src/DevHive.Services/Configurations/Mapping/PostMappings.cs +++ /dev/null @@ -1,33 +0,0 @@ -using DevHive.Data.Models; -using AutoMapper; -using DevHive.Services.Models.Post; -using DevHive.Common.Models.Misc; -using System.Collections.Generic; -using DevHive.Services.Models; - -namespace DevHive.Services.Configurations.Mapping -{ - public class PostMappings : Profile - { - public PostMappings() - { - CreateMap(); - // .ForMember(dest => dest.Files, src => src.Ignore()); - CreateMap() - .ForMember(dest => dest.Id, src => src.MapFrom(p => p.PostId)) - // .ForMember(dest => dest.Files, src => src.Ignore()) - .ForMember(dest => dest.Message, src => src.MapFrom(p => p.NewMessage)); - - CreateMap() - .ForMember(dest => dest.PostId, src => src.MapFrom(p => p.Id)) - .ForMember(dest => dest.CreatorFirstName, src => src.MapFrom(p => p.Creator.FirstName)) - .ForMember(dest => dest.CreatorLastName, src => src.MapFrom(p => p.Creator.LastName)) - .ForMember(dest => dest.CreatorUsername, src => src.MapFrom(p => p.Creator.UserName)); - - CreateMap() - .ForMember(dest => dest.Id, src => src.MapFrom(x => x.Id)); - - CreateMap, ReadPageServiceModel>(); - } - } -} diff --git a/src/DevHive.Services/Configurations/Mapping/RatingMappings.cs b/src/DevHive.Services/Configurations/Mapping/RatingMappings.cs deleted file mode 100644 index 1dbb7b4..0000000 --- a/src/DevHive.Services/Configurations/Mapping/RatingMappings.cs +++ /dev/null @@ -1,15 +0,0 @@ -using AutoMapper; -using DevHive.Data.Models; -using DevHive.Services.Models.Post.Rating; - -namespace DevHive.Services.Configurations.Mapping -{ - public class RatingMappings : Profile - { - public RatingMappings() - { - // CreateMap() - // .ForMember(dest => dest.PostId, src => src.MapFrom(p => p.Post.Id)); - } - } -} diff --git a/src/DevHive.Services/Configurations/Mapping/RoleMapings.cs b/src/DevHive.Services/Configurations/Mapping/RoleMapings.cs deleted file mode 100644 index e61a107..0000000 --- a/src/DevHive.Services/Configurations/Mapping/RoleMapings.cs +++ /dev/null @@ -1,19 +0,0 @@ -using DevHive.Data.Models; -using AutoMapper; -using DevHive.Services.Models.Identity.Role; - -namespace DevHive.Services.Configurations.Mapping -{ - public class RoleMappings : Profile - { - public RoleMappings() - { - CreateMap(); - CreateMap(); - CreateMap(); - - CreateMap(); - CreateMap(); - } - } -} diff --git a/src/DevHive.Services/Configurations/Mapping/TechnologyMappings.cs b/src/DevHive.Services/Configurations/Mapping/TechnologyMappings.cs deleted file mode 100644 index 85b57f1..0000000 --- a/src/DevHive.Services/Configurations/Mapping/TechnologyMappings.cs +++ /dev/null @@ -1,21 +0,0 @@ -using DevHive.Data.Models; -using AutoMapper; -using DevHive.Services.Models.Technology; - -namespace DevHive.Services.Configurations.Mapping -{ - public class TechnologyMappings : Profile - { - public TechnologyMappings() - { - CreateMap(); - CreateMap(); - CreateMap(); - - CreateMap(); - CreateMap(); - CreateMap(); - CreateMap(); - } - } -} diff --git a/src/DevHive.Services/Configurations/Mapping/UserMappings.cs b/src/DevHive.Services/Configurations/Mapping/UserMappings.cs deleted file mode 100644 index 2b0f4ed..0000000 --- a/src/DevHive.Services/Configurations/Mapping/UserMappings.cs +++ /dev/null @@ -1,31 +0,0 @@ -using DevHive.Data.Models; -using AutoMapper; -using DevHive.Services.Models.Identity.User; -using DevHive.Common.Models.Misc; -using DevHive.Data.RelationModels; - -namespace DevHive.Services.Configurations.Mapping -{ - public class UserMappings : Profile - { - public UserMappings() - { - CreateMap(); - CreateMap(); - CreateMap() - .ForMember(dest => dest.Friends, src => src.Ignore()); - CreateMap() - .ForMember(dest => dest.Friends, src => src.Ignore()) - .AfterMap((src, dest) => dest.PasswordHash = PasswordModifications.GeneratePasswordHash(src.Password)); - CreateMap(); - - CreateMap() - .ForMember(dest => dest.ProfilePictureURL, src => src.MapFrom(p => p.ProfilePicture.PictureURL)) - .ForMember(dest => dest.Friends, src => src.MapFrom(p => p.Friends)); - CreateMap() - .ForMember(x => x.Password, opt => opt.Ignore()) - .ForMember(dest => dest.ProfilePictureURL, src => src.MapFrom(p => p.ProfilePicture.PictureURL)); - CreateMap(); - } - } -} diff --git a/src/DevHive.Services/DevHive.Services.csproj b/src/DevHive.Services/DevHive.Services.csproj deleted file mode 100644 index 66df209..0000000 --- a/src/DevHive.Services/DevHive.Services.csproj +++ /dev/null @@ -1,29 +0,0 @@ - - - net5.0 - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - - - - - - - - - true - latest - - diff --git a/src/DevHive.Services/Interfaces/ICloudService.cs b/src/DevHive.Services/Interfaces/ICloudService.cs deleted file mode 100644 index 3ae7a24..0000000 --- a/src/DevHive.Services/Interfaces/ICloudService.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; - -namespace DevHive.Services.Interfaces -{ - public interface ICloudService - { - Task> UploadFilesToCloud(List formFiles); - - // Task> GetFilesFromCloud(List fileUrls); - - Task RemoveFilesFromCloud(List fileUrls); - } -} diff --git a/src/DevHive.Services/Interfaces/ICommentService.cs b/src/DevHive.Services/Interfaces/ICommentService.cs deleted file mode 100644 index e7409a8..0000000 --- a/src/DevHive.Services/Interfaces/ICommentService.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Threading.Tasks; -using DevHive.Services.Models.Comment; - -namespace DevHive.Services.Interfaces -{ - public interface ICommentService - { - Task AddComment(CreateCommentServiceModel createPostServiceModel); - - Task GetCommentById(Guid id); - - Task UpdateComment(UpdateCommentServiceModel updateCommentServiceModel); - - Task DeleteComment(Guid id); - - Task ValidateJwtForCreating(Guid userId, string rawTokenData); - Task ValidateJwtForComment(Guid commentId, string rawTokenData); - } -} diff --git a/src/DevHive.Services/Interfaces/IFeedService.cs b/src/DevHive.Services/Interfaces/IFeedService.cs deleted file mode 100644 index b507b3b..0000000 --- a/src/DevHive.Services/Interfaces/IFeedService.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Threading.Tasks; -using DevHive.Services.Models; - -namespace DevHive.Services.Interfaces -{ - public interface IFeedService - { - Task GetPage(GetPageServiceModel getPageServiceModel); - Task GetUserPage(GetPageServiceModel model); - } -} diff --git a/src/DevHive.Services/Interfaces/ILanguageService.cs b/src/DevHive.Services/Interfaces/ILanguageService.cs deleted file mode 100644 index fabbec2..0000000 --- a/src/DevHive.Services/Interfaces/ILanguageService.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using DevHive.Services.Models.Language; - -namespace DevHive.Services.Interfaces -{ - public interface ILanguageService - { - Task CreateLanguage(CreateLanguageServiceModel createLanguageServiceModel); - - Task GetLanguageById(Guid id); - HashSet GetLanguages(); - - Task UpdateLanguage(UpdateLanguageServiceModel languageServiceModel); - - Task DeleteLanguage(Guid id); - } -} diff --git a/src/DevHive.Services/Interfaces/IPostService.cs b/src/DevHive.Services/Interfaces/IPostService.cs deleted file mode 100644 index d35acfd..0000000 --- a/src/DevHive.Services/Interfaces/IPostService.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Threading.Tasks; -using DevHive.Services.Models.Post; - -namespace DevHive.Services.Interfaces -{ - public interface IPostService - { - Task CreatePost(CreatePostServiceModel createPostServiceModel); - - Task GetPostById(Guid id); - - Task UpdatePost(UpdatePostServiceModel updatePostServiceModel); - - Task DeletePost(Guid id); - - Task ValidateJwtForCreating(Guid userId, string rawTokenData); - Task ValidateJwtForPost(Guid postId, string rawTokenData); - } -} diff --git a/src/DevHive.Services/Interfaces/IRateService.cs b/src/DevHive.Services/Interfaces/IRateService.cs deleted file mode 100644 index 359ef55..0000000 --- a/src/DevHive.Services/Interfaces/IRateService.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Threading.Tasks; -using DevHive.Data.Models; -using DevHive.Services.Models.Post.Rating; - -namespace DevHive.Services.Interfaces -{ - public interface IRateService - { - Task RatePost(RatePostServiceModel ratePostServiceModel); - - bool HasUserRatedThisPost(User user, Post post); - } -} diff --git a/src/DevHive.Services/Interfaces/IRoleService.cs b/src/DevHive.Services/Interfaces/IRoleService.cs deleted file mode 100644 index d47728c..0000000 --- a/src/DevHive.Services/Interfaces/IRoleService.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Threading.Tasks; -using DevHive.Services.Models.Identity.Role; - -namespace DevHive.Services.Interfaces -{ - public interface IRoleService - { - Task CreateRole(CreateRoleServiceModel roleServiceModel); - - Task GetRoleById(Guid id); - - Task UpdateRole(UpdateRoleServiceModel roleServiceModel); - - Task DeleteRole(Guid id); - } -} diff --git a/src/DevHive.Services/Interfaces/ITechnologyService.cs b/src/DevHive.Services/Interfaces/ITechnologyService.cs deleted file mode 100644 index 8f9510c..0000000 --- a/src/DevHive.Services/Interfaces/ITechnologyService.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using DevHive.Services.Models.Technology; - -namespace DevHive.Services.Interfaces -{ - public interface ITechnologyService - { - Task CreateTechnology(CreateTechnologyServiceModel technologyServiceModel); - - Task GetTechnologyById(Guid id); - HashSet GetTechnologies(); - - Task UpdateTechnology(UpdateTechnologyServiceModel updateTechnologyServiceModel); - - Task DeleteTechnology(Guid id); - } -} diff --git a/src/DevHive.Services/Interfaces/IUserService.cs b/src/DevHive.Services/Interfaces/IUserService.cs deleted file mode 100644 index 9e2b4e3..0000000 --- a/src/DevHive.Services/Interfaces/IUserService.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Threading.Tasks; -using DevHive.Common.Models.Identity; -using DevHive.Services.Models.Identity.User; - -namespace DevHive.Services.Interfaces -{ - public interface IUserService - { - Task LoginUser(LoginServiceModel loginModel); - Task RegisterUser(RegisterServiceModel registerModel); - - Task GetUserByUsername(string username); - Task GetUserById(Guid id); - - Task UpdateUser(UpdateUserServiceModel updateModel); - Task UpdateProfilePicture(UpdateProfilePictureServiceModel updateProfilePictureServiceModel); - - Task DeleteUser(Guid id); - - Task ValidJWT(Guid id, string rawTokenData); - - Task SuperSecretPromotionToAdmin(Guid userId); - } -} diff --git a/src/DevHive.Services/Models/Comment/CreateCommentServiceModel.cs b/src/DevHive.Services/Models/Comment/CreateCommentServiceModel.cs deleted file mode 100644 index 30e919b..0000000 --- a/src/DevHive.Services/Models/Comment/CreateCommentServiceModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Comment -{ - public class CreateCommentServiceModel - { - public Guid PostId { get; set; } - - public Guid CreatorId { get; set; } - - public string Message { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Comment/ReadCommentServiceModel.cs b/src/DevHive.Services/Models/Comment/ReadCommentServiceModel.cs deleted file mode 100644 index 3196233..0000000 --- a/src/DevHive.Services/Models/Comment/ReadCommentServiceModel.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Comment -{ - public class ReadCommentServiceModel - { - public Guid CommentId { get; set; } - - public string IssuerFirstName { get; set; } - - public string IssuerLastName { get; set; } - - public string IssuerUsername { get; set; } - - public Guid PostId { get; set; } - - public string Message { get; set; } - - public DateTime TimeCreated { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Comment/UpdateCommentServiceModel.cs b/src/DevHive.Services/Models/Comment/UpdateCommentServiceModel.cs deleted file mode 100644 index 3b78200..0000000 --- a/src/DevHive.Services/Models/Comment/UpdateCommentServiceModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Comment -{ - public class UpdateCommentServiceModel - { - public Guid CreatorId { get; set; } - - public Guid CommentId { get; set; } - - public Guid PostId { get; set; } - - public string NewMessage { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Feed/GetPageServiceModel.cs b/src/DevHive.Services/Models/Feed/GetPageServiceModel.cs deleted file mode 100644 index 1f02486..0000000 --- a/src/DevHive.Services/Models/Feed/GetPageServiceModel.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -namespace DevHive.Services.Models -{ - public class GetPageServiceModel - { - public Guid UserId { get; set; } - - public string Username { get; set; } - - public int PageNumber { get; set; } - - public DateTime FirstRequestIssued { get; set; } - - public int PageSize { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Feed/ReadPageServiceModel.cs b/src/DevHive.Services/Models/Feed/ReadPageServiceModel.cs deleted file mode 100644 index 95f6845..0000000 --- a/src/DevHive.Services/Models/Feed/ReadPageServiceModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; -using DevHive.Services.Models.Post; - -namespace DevHive.Services.Models -{ - public class ReadPageServiceModel - { - public List Posts { get; set; } = new(); - } -} diff --git a/src/DevHive.Services/Models/Identity/Role/CreateRoleServiceModel.cs b/src/DevHive.Services/Models/Identity/Role/CreateRoleServiceModel.cs deleted file mode 100644 index 3bed3fd..0000000 --- a/src/DevHive.Services/Models/Identity/Role/CreateRoleServiceModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; - -namespace DevHive.Services.Models.Identity.Role -{ - public class CreateRoleServiceModel - { - public string Name { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Identity/Role/RoleServiceModel.cs b/src/DevHive.Services/Models/Identity/Role/RoleServiceModel.cs deleted file mode 100644 index 07249fe..0000000 --- a/src/DevHive.Services/Models/Identity/Role/RoleServiceModel.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace DevHive.Services.Models.Identity.Role -{ - public class RoleServiceModel - { - public string Name { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Identity/Role/UpdateRoleServiceModel.cs b/src/DevHive.Services/Models/Identity/Role/UpdateRoleServiceModel.cs deleted file mode 100644 index e21e6b4..0000000 --- a/src/DevHive.Services/Models/Identity/Role/UpdateRoleServiceModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Identity.Role -{ - public class UpdateRoleServiceModel - { - public Guid Id { get; set; } - public string Name { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Identity/User/BaseUserServiceModel.cs b/src/DevHive.Services/Models/Identity/User/BaseUserServiceModel.cs deleted file mode 100644 index 514f82a..0000000 --- a/src/DevHive.Services/Models/Identity/User/BaseUserServiceModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace DevHive.Services.Models.Identity.User -{ - public class BaseUserServiceModel - { - public string UserName { get; set; } - public string Email { get; set; } - public string FirstName { get; set; } - public string LastName { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Identity/User/FriendServiceModel.cs b/src/DevHive.Services/Models/Identity/User/FriendServiceModel.cs deleted file mode 100644 index a784f5c..0000000 --- a/src/DevHive.Services/Models/Identity/User/FriendServiceModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Identity.User -{ - public class FriendServiceModel - { - public Guid Id { get; set; } - public string UserName { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Identity/User/LoginServiceModel.cs b/src/DevHive.Services/Models/Identity/User/LoginServiceModel.cs deleted file mode 100644 index 4d53283..0000000 --- a/src/DevHive.Services/Models/Identity/User/LoginServiceModel.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace DevHive.Services.Models.Identity.User -{ - public class LoginServiceModel - { - public string UserName { get; set; } - public string Password { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Identity/User/ProfilePictureServiceModel.cs b/src/DevHive.Services/Models/Identity/User/ProfilePictureServiceModel.cs deleted file mode 100644 index ad81057..0000000 --- a/src/DevHive.Services/Models/Identity/User/ProfilePictureServiceModel.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace DevHive.Services.Models.Identity.User -{ - public class ProfilePictureServiceModel - { - public string ProfilePictureURL { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Identity/User/RegisterServiceModel.cs b/src/DevHive.Services/Models/Identity/User/RegisterServiceModel.cs deleted file mode 100644 index adc4119..0000000 --- a/src/DevHive.Services/Models/Identity/User/RegisterServiceModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Collections.Generic; -using DevHive.Services.Models.Language; -using DevHive.Services.Models.Technology; - -namespace DevHive.Services.Models.Identity.User -{ - public class RegisterServiceModel : BaseUserServiceModel - { - public string Password { get; set; } - - public HashSet Languages { get; set; } - - public HashSet Technologies { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Identity/User/UpdateFriendServiceModel.cs b/src/DevHive.Services/Models/Identity/User/UpdateFriendServiceModel.cs deleted file mode 100644 index b0efe10..0000000 --- a/src/DevHive.Services/Models/Identity/User/UpdateFriendServiceModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Identity.User -{ - public class UpdateFriendServiceModel - { - public Guid Id { get; set; } - public string UserName { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Identity/User/UpdateProfilePictureServiceModel.cs b/src/DevHive.Services/Models/Identity/User/UpdateProfilePictureServiceModel.cs deleted file mode 100644 index 8563953..0000000 --- a/src/DevHive.Services/Models/Identity/User/UpdateProfilePictureServiceModel.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using Microsoft.AspNetCore.Http; - -namespace DevHive.Services.Models.Identity.User -{ - public class UpdateProfilePictureServiceModel - { - public Guid UserId { get; set; } - - public IFormFile Picture { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Identity/User/UpdateUserServiceModel.cs b/src/DevHive.Services/Models/Identity/User/UpdateUserServiceModel.cs deleted file mode 100644 index b4e4400..0000000 --- a/src/DevHive.Services/Models/Identity/User/UpdateUserServiceModel.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using DevHive.Services.Models.Identity.Role; -using DevHive.Services.Models.Language; -using DevHive.Services.Models.Technology; - -namespace DevHive.Services.Models.Identity.User -{ - public class UpdateUserServiceModel : BaseUserServiceModel - { - public Guid Id { get; set; } - - public string Password { get; set; } - - public string ProfilePictureURL { get; set; } - - public HashSet Roles { get; set; } = new HashSet(); - - public HashSet Friends { get; set; } = new HashSet(); - - public HashSet Languages { get; set; } = new HashSet(); - - public HashSet Technologies { get; set; } = new HashSet(); - - } -} diff --git a/src/DevHive.Services/Models/Identity/User/UserServiceModel.cs b/src/DevHive.Services/Models/Identity/User/UserServiceModel.cs deleted file mode 100644 index ac7bba2..0000000 --- a/src/DevHive.Services/Models/Identity/User/UserServiceModel.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using DevHive.Common.Models.Misc; -using DevHive.Services.Models.Identity.Role; -using DevHive.Services.Models.Language; -using DevHive.Services.Models.Technology; - -namespace DevHive.Services.Models.Identity.User -{ - public class UserServiceModel : BaseUserServiceModel - { - public string ProfilePictureURL { get; set; } - - public HashSet Roles { get; set; } = new(); - - public HashSet Friends { get; set; } = new(); - - public HashSet Languages { get; set; } = new(); - - public HashSet Technologies { get; set; } = new(); - - public List Posts { get; set; } = new(); - } -} diff --git a/src/DevHive.Services/Models/Language/CreateLanguageServiceModel.cs b/src/DevHive.Services/Models/Language/CreateLanguageServiceModel.cs deleted file mode 100644 index 9d66d3e..0000000 --- a/src/DevHive.Services/Models/Language/CreateLanguageServiceModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Language -{ - public class CreateLanguageServiceModel - { - public string Name { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Language/LanguageServiceModel.cs b/src/DevHive.Services/Models/Language/LanguageServiceModel.cs deleted file mode 100644 index a07aa16..0000000 --- a/src/DevHive.Services/Models/Language/LanguageServiceModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Language -{ - public class LanguageServiceModel - { - public Guid Id { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Language/ReadLanguageServiceModel.cs b/src/DevHive.Services/Models/Language/ReadLanguageServiceModel.cs deleted file mode 100644 index 651dc6d..0000000 --- a/src/DevHive.Services/Models/Language/ReadLanguageServiceModel.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Language -{ - public class ReadLanguageServiceModel - { - public Guid Id { get; set; } - - public string Name { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Language/UpdateLanguageServiceModel.cs b/src/DevHive.Services/Models/Language/UpdateLanguageServiceModel.cs deleted file mode 100644 index 84b7f27..0000000 --- a/src/DevHive.Services/Models/Language/UpdateLanguageServiceModel.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Language -{ - public class UpdateLanguageServiceModel - { - public Guid Id { get; set; } - - public string Name { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Post/CreatePostServiceModel.cs b/src/DevHive.Services/Models/Post/CreatePostServiceModel.cs deleted file mode 100644 index 304eb90..0000000 --- a/src/DevHive.Services/Models/Post/CreatePostServiceModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.AspNetCore.Http; - -namespace DevHive.Services.Models.Post -{ - public class CreatePostServiceModel - { - public Guid CreatorId { get; set; } - - public string Message { get; set; } - - public List Files { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Post/Rating/RatePostServiceModel.cs b/src/DevHive.Services/Models/Post/Rating/RatePostServiceModel.cs deleted file mode 100644 index d4eb7bd..0000000 --- a/src/DevHive.Services/Models/Post/Rating/RatePostServiceModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Post.Rating -{ - public class RatePostServiceModel - { - public Guid UserId { get; set; } - - public Guid PostId { get; set; } - - public bool Liked { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Post/Rating/ReadPostRatingServiceModel.cs b/src/DevHive.Services/Models/Post/Rating/ReadPostRatingServiceModel.cs deleted file mode 100644 index 8c73aaf..0000000 --- a/src/DevHive.Services/Models/Post/Rating/ReadPostRatingServiceModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Post.Rating -{ - public class ReadPostRatingServiceModel - { - public Guid Id { get; set; } - - public Guid PostId { get; set; } - - public int Likes { get; set; } - - public int Dislikes { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Post/ReadPostServiceModel.cs b/src/DevHive.Services/Models/Post/ReadPostServiceModel.cs deleted file mode 100644 index a7aa882..0000000 --- a/src/DevHive.Services/Models/Post/ReadPostServiceModel.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using DevHive.Common.Models.Misc; - -namespace DevHive.Services.Models.Post -{ - public class ReadPostServiceModel - { - public Guid PostId { get; set; } - - public string CreatorFirstName { get; set; } - - public string CreatorLastName { get; set; } - - public string CreatorUsername { get; set; } - - public string Message { get; set; } - - public DateTime TimeCreated { get; set; } - - public List Comments { get; set; } = new(); - - public List FileUrls { get; set; } - // public List Files { get; set; } = new(); - } -} diff --git a/src/DevHive.Services/Models/Post/UpdatePostServiceModel.cs b/src/DevHive.Services/Models/Post/UpdatePostServiceModel.cs deleted file mode 100644 index 51b16bc..0000000 --- a/src/DevHive.Services/Models/Post/UpdatePostServiceModel.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.AspNetCore.Http; - -namespace DevHive.Services.Models.Post -{ - public class UpdatePostServiceModel - { - public Guid PostId { get; set; } - - public Guid CreatorId { get; set; } - - public string NewMessage { get; set; } - - public List Files { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Technology/CreateTechnologyServiceModel.cs b/src/DevHive.Services/Models/Technology/CreateTechnologyServiceModel.cs deleted file mode 100644 index a31d160..0000000 --- a/src/DevHive.Services/Models/Technology/CreateTechnologyServiceModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Technology -{ - public class CreateTechnologyServiceModel - { - public string Name { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Technology/ReadTechnologyServiceModel.cs b/src/DevHive.Services/Models/Technology/ReadTechnologyServiceModel.cs deleted file mode 100644 index 99f4750..0000000 --- a/src/DevHive.Services/Models/Technology/ReadTechnologyServiceModel.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Technology -{ - public class ReadTechnologyServiceModel - { - public Guid Id { get; set; } - - public string Name { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Technology/TechnologyServiceModel.cs b/src/DevHive.Services/Models/Technology/TechnologyServiceModel.cs deleted file mode 100644 index cb5c881..0000000 --- a/src/DevHive.Services/Models/Technology/TechnologyServiceModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Technology -{ - public class TechnologyServiceModel - { - public Guid Id { get; set; } - } -} diff --git a/src/DevHive.Services/Models/Technology/UpdateTechnologyServiceModel.cs b/src/DevHive.Services/Models/Technology/UpdateTechnologyServiceModel.cs deleted file mode 100644 index f4c7921..0000000 --- a/src/DevHive.Services/Models/Technology/UpdateTechnologyServiceModel.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace DevHive.Services.Models.Technology -{ - public class UpdateTechnologyServiceModel - { - public Guid Id { get; set; } - - public string Name { get; set; } - } -} diff --git a/src/DevHive.Services/Options/JWTOptions.cs b/src/DevHive.Services/Options/JWTOptions.cs deleted file mode 100644 index 95458f5..0000000 --- a/src/DevHive.Services/Options/JWTOptions.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Microsoft.Extensions.Options; - -namespace DevHive.Services.Options -{ - public class JWTOptions - { - public JWTOptions(string secret) - { - this.Secret = secret; - } - - public string Secret { get; init; } - } -} diff --git a/src/DevHive.Services/Services/CloudinaryService.cs b/src/DevHive.Services/Services/CloudinaryService.cs deleted file mode 100644 index 57955a2..0000000 --- a/src/DevHive.Services/Services/CloudinaryService.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Threading.Tasks; -using CloudinaryDotNet; -using CloudinaryDotNet.Actions; -using DevHive.Services.Interfaces; -using Microsoft.AspNetCore.Http; - -namespace DevHive.Services.Services -{ - public class CloudinaryService : ICloudService - { - private readonly Cloudinary _cloudinary; - - public CloudinaryService(string cloudName, string apiKey, string apiSecret) - { - this._cloudinary = new Cloudinary(new Account(cloudName, apiKey, apiSecret)); - } - - public async Task> UploadFilesToCloud(List formFiles) - { - List fileUrls = new(); - foreach (var formFile in formFiles) - { - string formFileId = Guid.NewGuid().ToString(); - - using (var ms = new MemoryStream()) - { - formFile.CopyTo(ms); - byte[] formBytes = ms.ToArray(); - - RawUploadParams rawUploadParams = new() - { - File = new FileDescription(formFileId, new MemoryStream(formBytes)), - PublicId = formFileId, - UseFilename = true - }; - - RawUploadResult rawUploadResult = await this._cloudinary.UploadAsync(rawUploadParams); - fileUrls.Add(rawUploadResult.Url.AbsoluteUri); - } - } - - return fileUrls; - } - - public async Task RemoveFilesFromCloud(List fileUrls) - { - return true; - } - } -} diff --git a/src/DevHive.Services/Services/CommentService.cs b/src/DevHive.Services/Services/CommentService.cs deleted file mode 100644 index e2b54c4..0000000 --- a/src/DevHive.Services/Services/CommentService.cs +++ /dev/null @@ -1,169 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Data.Models; -using DevHive.Services.Models.Comment; -using System.IdentityModel.Tokens.Jwt; -using System.Security.Claims; -using DevHive.Services.Interfaces; -using DevHive.Data.Interfaces.Repositories; -using System.Linq; - -namespace DevHive.Services.Services -{ - public class CommentService : ICommentService - { - private readonly IUserRepository _userRepository; - private readonly IPostRepository _postRepository; - private readonly ICommentRepository _commentRepository; - private readonly IMapper _postMapper; - - public CommentService(IUserRepository userRepository, IPostRepository postRepository, ICommentRepository commentRepository, IMapper postMapper) - { - this._userRepository = userRepository; - this._postRepository = postRepository; - this._commentRepository = commentRepository; - this._postMapper = postMapper; - } - - #region Create - public async Task AddComment(CreateCommentServiceModel createCommentServiceModel) - { - if (!await this._postRepository.DoesPostExist(createCommentServiceModel.PostId)) - throw new ArgumentException("Post does not exist!"); - - Comment comment = this._postMapper.Map(createCommentServiceModel); - comment.TimeCreated = DateTime.Now; - - comment.Creator = await this._userRepository.GetByIdAsync(createCommentServiceModel.CreatorId); - comment.Post = await this._postRepository.GetByIdAsync(createCommentServiceModel.PostId); - - bool success = await this._commentRepository.AddAsync(comment); - if (success) - { - Comment newComment = await this._commentRepository - .GetCommentByIssuerAndTimeCreatedAsync(comment.Creator.Id, comment.TimeCreated); - - return newComment.Id; - } - else - return Guid.Empty; - } - #endregion - - #region Read - public async Task GetCommentById(Guid id) - { - Comment comment = await this._commentRepository.GetByIdAsync(id) ?? - throw new ArgumentException("The comment does not exist"); - - User user = await this._userRepository.GetByIdAsync(comment.Creator.Id) ?? - throw new ArgumentException("The user does not exist"); - - ReadCommentServiceModel readCommentServiceModel = this._postMapper.Map(comment); - readCommentServiceModel.IssuerFirstName = user.FirstName; - readCommentServiceModel.IssuerLastName = user.LastName; - readCommentServiceModel.IssuerUsername = user.UserName; - - return readCommentServiceModel; - } - #endregion - - #region Update - public async Task UpdateComment(UpdateCommentServiceModel updateCommentServiceModel) - { - if (!await this._commentRepository.DoesCommentExist(updateCommentServiceModel.CommentId)) - throw new ArgumentException("Comment does not exist!"); - - Comment comment = this._postMapper.Map(updateCommentServiceModel); - comment.TimeCreated = DateTime.Now; - - comment.Creator = await this._userRepository.GetByIdAsync(updateCommentServiceModel.CreatorId); - comment.Post = await this._postRepository.GetByIdAsync(updateCommentServiceModel.PostId); - - bool result = await this._commentRepository.EditAsync(updateCommentServiceModel.CommentId, comment); - - if (result) - return (await this._commentRepository.GetByIdAsync(updateCommentServiceModel.CommentId)).Id; - else - return Guid.Empty; - } - #endregion - - #region Delete - public async Task DeleteComment(Guid id) - { - if (!await this._commentRepository.DoesCommentExist(id)) - throw new ArgumentException("Comment does not exist!"); - - Comment comment = await this._commentRepository.GetByIdAsync(id); - return await this._commentRepository.DeleteAsync(comment); - } - #endregion - - #region Validations - /// - /// Checks whether the user Id in the token and the given user Id match - /// - public async Task ValidateJwtForCreating(Guid userId, string rawTokenData) - { - User user = await this.GetUserForValidation(rawTokenData); - - return user.Id == userId; - } - - /// - /// Checks whether the comment, gotten with the commentId, - /// is made by the user in the token - /// or if the user in the token is an admin - /// - public async Task ValidateJwtForComment(Guid commentId, string rawTokenData) - { - Comment comment = await this._commentRepository.GetByIdAsync(commentId) ?? - throw new ArgumentException("Comment does not exist!"); - User user = await this.GetUserForValidation(rawTokenData); - - //If user made the comment - if (comment.Creator.Id == user.Id) - return true; - //If user is admin - else if (user.Roles.Any(x => x.Name == Role.AdminRole)) - return true; - else - return false; - } - - /// - /// Returns the user, via their Id in the token - /// - private async Task GetUserForValidation(string rawTokenData) - { - JwtSecurityToken jwt = new JwtSecurityTokenHandler().ReadJwtToken(rawTokenData.Remove(0, 7)); - - Guid jwtUserId = Guid.Parse(this.GetClaimTypeValues("ID", jwt.Claims).First()); - //HashSet jwtRoleNames = this.GetClaimTypeValues("role", jwt.Claims); - - User user = await this._userRepository.GetByIdAsync(jwtUserId) ?? - throw new ArgumentException("User does not exist!"); - - return user; - } - - /// - /// Returns all values from a given claim type - /// - private List GetClaimTypeValues(string type, IEnumerable claims) - { - List toReturn = new(); - - foreach (var claim in claims) - if (claim.Type == type) - toReturn.Add(claim.Value); - - return toReturn; - } - #endregion - } -} - diff --git a/src/DevHive.Services/Services/FeedService.cs b/src/DevHive.Services/Services/FeedService.cs deleted file mode 100644 index f2f4a3a..0000000 --- a/src/DevHive.Services/Services/FeedService.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using DevHive.Services.Interfaces; -using DevHive.Services.Models; -using DevHive.Services.Models.Post; - -namespace DevHive.Services.Services -{ - public class FeedService : IFeedService - { - private readonly IMapper _mapper; - private readonly IFeedRepository _feedRepository; - private readonly IUserRepository _userRepository; - - public FeedService(IFeedRepository feedRepository, IUserRepository userRepository, IMapper mapper) - { - this._feedRepository = feedRepository; - this._userRepository = userRepository; - this._mapper = mapper; - } - - /// - /// This method is used in the feed page. - /// See the FeedRepository "GetFriendsPosts" menthod for more information on how it works. - /// - public async Task GetPage(GetPageServiceModel model) - { - User user = null; - - if (model.UserId != Guid.Empty) - user = await this._userRepository.GetByIdAsync(model.UserId); - else if (!string.IsNullOrEmpty(model.Username)) - user = await this._userRepository.GetByUsernameAsync(model.Username); - else - throw new ArgumentException("Invalid given data!"); - - if (user == null) - throw new ArgumentException("User doesn't exist!"); - - if (user.Friends.Count == 0) - throw new ArgumentException("User has no friends to get feed from!"); - - List posts = await this._feedRepository - .GetFriendsPosts(user.Friends.ToList(), model.FirstRequestIssued, model.PageNumber, model.PageSize); - - ReadPageServiceModel readPageServiceModel = new(); - foreach (Post post in posts) - readPageServiceModel.Posts.Add(this._mapper.Map(post)); - - return readPageServiceModel; - } - - /// - /// This method is used in the profile pages. - /// See the FeedRepository "GetUsersPosts" menthod for more information on how it works. - /// - public async Task GetUserPage(GetPageServiceModel model) - { - User user = null; - - if (!string.IsNullOrEmpty(model.Username)) - user = await this._userRepository.GetByUsernameAsync(model.Username); - else - throw new ArgumentException("Invalid given data!"); - - if (user == null) - throw new ArgumentException("User doesn't exist!"); - - List posts = await this._feedRepository - .GetUsersPosts(user, model.FirstRequestIssued, model.PageNumber, model.PageSize); - - ReadPageServiceModel readPageServiceModel = new(); - foreach (Post post in posts) - readPageServiceModel.Posts.Add(this._mapper.Map(post)); - - return readPageServiceModel; - } - } -} diff --git a/src/DevHive.Services/Services/LanguageService.cs b/src/DevHive.Services/Services/LanguageService.cs deleted file mode 100644 index a6364d8..0000000 --- a/src/DevHive.Services/Services/LanguageService.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Language; - -namespace DevHive.Services.Services -{ - public class LanguageService : ILanguageService - { - private readonly ILanguageRepository _languageRepository; - private readonly IMapper _languageMapper; - - public LanguageService(ILanguageRepository languageRepository, IMapper mapper) - { - this._languageRepository = languageRepository; - this._languageMapper = mapper; - } - - #region Create - public async Task CreateLanguage(CreateLanguageServiceModel createLanguageServiceModel) - { - if (await this._languageRepository.DoesLanguageNameExistAsync(createLanguageServiceModel.Name)) - throw new ArgumentException("Language already exists!"); - - Language language = this._languageMapper.Map(createLanguageServiceModel); - bool success = await this._languageRepository.AddAsync(language); - - if (success) - { - Language newLanguage = await this._languageRepository.GetByNameAsync(createLanguageServiceModel.Name); - return newLanguage.Id; - } - else - return Guid.Empty; - } - #endregion - - #region Read - public async Task GetLanguageById(Guid id) - { - Language language = await this._languageRepository.GetByIdAsync(id); - - if (language == null) - throw new ArgumentException("The language does not exist"); - - return this._languageMapper.Map(language); - } - - public HashSet GetLanguages() - { - HashSet languages = this._languageRepository.GetLanguages(); - - return this._languageMapper.Map>(languages); - } - #endregion - - #region Update - public async Task UpdateLanguage(UpdateLanguageServiceModel languageServiceModel) - { - bool langExists = await this._languageRepository.DoesLanguageExistAsync(languageServiceModel.Id); - bool newLangNameExists = await this._languageRepository.DoesLanguageNameExistAsync(languageServiceModel.Name); - - if (!langExists) - throw new ArgumentException("Language does not exist!"); - - if (newLangNameExists) - throw new ArgumentException("Language name already exists in our data base!"); - - Language lang = this._languageMapper.Map(languageServiceModel); - return await this._languageRepository.EditAsync(languageServiceModel.Id, lang); - } - #endregion - - #region Delete - public async Task DeleteLanguage(Guid id) - { - if (!await this._languageRepository.DoesLanguageExistAsync(id)) - throw new ArgumentException("Language does not exist!"); - - Language language = await this._languageRepository.GetByIdAsync(id); - return await this._languageRepository.DeleteAsync(language); - } - #endregion - } -} diff --git a/src/DevHive.Services/Services/PostService.cs b/src/DevHive.Services/Services/PostService.cs deleted file mode 100644 index fe91f23..0000000 --- a/src/DevHive.Services/Services/PostService.cs +++ /dev/null @@ -1,239 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Data.Models; -using DevHive.Services.Models.Post; -using System.IdentityModel.Tokens.Jwt; -using System.Security.Claims; -using DevHive.Services.Interfaces; -using DevHive.Data.Interfaces.Repositories; -using System.Linq; -using DevHive.Data.RelationModels; - -namespace DevHive.Services.Services -{ - public class PostService : IPostService - { - private readonly ICloudService _cloudService; - private readonly IUserRepository _userRepository; - private readonly IPostRepository _postRepository; - private readonly ICommentRepository _commentRepository; - private readonly IMapper _postMapper; - - public PostService(ICloudService cloudService, IUserRepository userRepository, IPostRepository postRepository, ICommentRepository commentRepository, IMapper postMapper) - { - this._cloudService = cloudService; - this._userRepository = userRepository; - this._postRepository = postRepository; - this._commentRepository = commentRepository; - this._postMapper = postMapper; - } - - #region Create - public async Task CreatePost(CreatePostServiceModel createPostServiceModel) - { - if (!await this._userRepository.DoesUserExistAsync(createPostServiceModel.CreatorId)) - throw new ArgumentException("User does not exist!"); - - Post post = this._postMapper.Map(createPostServiceModel); - - if (createPostServiceModel.Files.Count != 0) - { - List fileUrls = await _cloudService.UploadFilesToCloud(createPostServiceModel.Files); - post.Attachments = this.GetPostAttachmentsFromUrls(post, fileUrls); - } - - post.Creator = await this._userRepository.GetByIdAsync(createPostServiceModel.CreatorId); - post.TimeCreated = DateTime.Now; - - bool success = await this._postRepository.AddAsync(post); - if (success) - { - Post newPost = await this._postRepository - .GetPostByCreatorAndTimeCreatedAsync(post.Creator.Id, post.TimeCreated); - - await this._postRepository.AddNewPostToCreator(createPostServiceModel.CreatorId, newPost); - - return newPost.Id; - } - else - return Guid.Empty; - } - #endregion - - #region Read - public async Task GetPostById(Guid id) - { - Post post = await this._postRepository.GetByIdAsync(id) ?? - throw new ArgumentException("The post does not exist!"); - - // This can't happen in repo, because of how time is usually compared - post.Comments = post.Comments - .OrderByDescending(x => x.TimeCreated.ToFileTimeUtc()) - .ToList(); - - User user = await this._userRepository.GetByIdAsync(post.Creator.Id) ?? - throw new ArgumentException("The user does not exist!"); - - ReadPostServiceModel readPostServiceModel = this._postMapper.Map(post); - readPostServiceModel.CreatorFirstName = user.FirstName; - readPostServiceModel.CreatorLastName = user.LastName; - readPostServiceModel.CreatorUsername = user.UserName; - readPostServiceModel.FileUrls = post.Attachments.Select(x => x.FileUrl).ToList(); - - return readPostServiceModel; - } - #endregion - - #region Update - public async Task UpdatePost(UpdatePostServiceModel updatePostServiceModel) - { - if (!await this._postRepository.DoesPostExist(updatePostServiceModel.PostId)) - throw new ArgumentException("Post does not exist!"); - - Post post = this._postMapper.Map(updatePostServiceModel); - - if (updatePostServiceModel.Files.Count != 0) - { - if (await this._postRepository.DoesPostHaveFiles(updatePostServiceModel.PostId)) - { - List fileUrlsToRemove = await this._postRepository.GetFileUrls(updatePostServiceModel.PostId); - bool success = await _cloudService.RemoveFilesFromCloud(fileUrlsToRemove); - if (!success) - throw new InvalidCastException("Could not delete files from the post!"); - } - - List fileUrls = await _cloudService.UploadFilesToCloud(updatePostServiceModel.Files) ?? - throw new ArgumentNullException("Unable to upload images to cloud"); - post.Attachments = this.GetPostAttachmentsFromUrls(post, fileUrls); - } - - post.Creator = await this._userRepository.GetByIdAsync(updatePostServiceModel.CreatorId); - post.Comments = await this._commentRepository.GetPostComments(updatePostServiceModel.PostId); - post.TimeCreated = DateTime.Now; - - bool result = await this._postRepository.EditAsync(updatePostServiceModel.PostId, post); - - if (result) - return (await this._postRepository.GetByIdAsync(updatePostServiceModel.PostId)).Id; - else - return Guid.Empty; - } - #endregion - - #region Delete - public async Task DeletePost(Guid id) - { - if (!await this._postRepository.DoesPostExist(id)) - throw new ArgumentException("Post does not exist!"); - - Post post = await this._postRepository.GetByIdAsync(id); - - if (await this._postRepository.DoesPostHaveFiles(id)) - { - List fileUrls = await this._postRepository.GetFileUrls(id); - bool success = await _cloudService.RemoveFilesFromCloud(fileUrls); - if (!success) - throw new InvalidCastException("Could not delete files from the post. Please try again"); - } - - return await this._postRepository.DeleteAsync(post); - } - #endregion - - #region Validations - /// - /// Checks whether the user Id in the token and the given user Id match - /// - public async Task ValidateJwtForCreating(Guid userId, string rawTokenData) - { - User user = await this.GetUserForValidation(rawTokenData); - - return user.Id == userId; - } - - /// - /// Checks whether the post, gotten with the postId, - /// is made by the user in the token - /// or if the user in the token is an admin - /// - public async Task ValidateJwtForPost(Guid postId, string rawTokenData) - { - Post post = await this._postRepository.GetByIdAsync(postId) ?? - throw new ArgumentException("Post does not exist!"); - User user = await this.GetUserForValidation(rawTokenData); - - //If user made the post - if (post.Creator.Id == user.Id) - return true; - //If user is admin - else if (user.Roles.Any(x => x.Name == Role.AdminRole)) - return true; - else - return false; - } - - /// - /// Checks whether the comment, gotten with the commentId, - /// is made by the user in the token - /// or if the user in the token is an admin - /// - public async Task ValidateJwtForComment(Guid commentId, string rawTokenData) - { - Comment comment = await this._commentRepository.GetByIdAsync(commentId) ?? - throw new ArgumentException("Comment does not exist!"); - User user = await this.GetUserForValidation(rawTokenData); - - //If user made the comment - if (comment.Creator.Id == user.Id) - return true; - //If user is admin - else if (user.Roles.Any(x => x.Name == Role.AdminRole)) - return true; - else - return false; - } - - /// - /// Returns the user, via their Id in the token - /// - private async Task GetUserForValidation(string rawTokenData) - { - JwtSecurityToken jwt = new JwtSecurityTokenHandler().ReadJwtToken(rawTokenData.Remove(0, 7)); - - Guid jwtUserId = Guid.Parse(this.GetClaimTypeValues("ID", jwt.Claims).First()); - //HashSet jwtRoleNames = this.GetClaimTypeValues("role", jwt.Claims); - - User user = await this._userRepository.GetByIdAsync(jwtUserId) ?? - throw new ArgumentException("User does not exist!"); - - return user; - } - - /// - /// Returns all values from a given claim type - /// - private List GetClaimTypeValues(string type, IEnumerable claims) - { - List toReturn = new(); - - foreach (var claim in claims) - if (claim.Type == type) - toReturn.Add(claim.Value); - - return toReturn; - } - #endregion - - #region Misc - private List GetPostAttachmentsFromUrls(Post post, List fileUrls) - { - List postAttachments = new List(); - foreach (string url in fileUrls) - postAttachments.Add(new PostAttachments { Post = post, FileUrl = url }); - return postAttachments; - } - #endregion - } -} diff --git a/src/DevHive.Services/Services/RateService.cs b/src/DevHive.Services/Services/RateService.cs deleted file mode 100644 index 204c550..0000000 --- a/src/DevHive.Services/Services/RateService.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Post.Rating; - -namespace DevHive.Services.Services -{ - public class RateService : IRateService - { - private readonly IPostRepository _postRepository; - private readonly IUserRepository _userRepository; - private readonly IRatingRepository _ratingRepository; - private readonly IMapper _mapper; - - public RateService(IPostRepository postRepository, IRatingRepository ratingRepository, IUserRepository userRepository, IMapper mapper) - { - this._postRepository = postRepository; - this._ratingRepository = ratingRepository; - this._userRepository = userRepository; - this._mapper = mapper; - } - - public async Task RatePost(RatePostServiceModel ratePostServiceModel) - { - throw new NotImplementedException(); - // if (!await this._postRepository.DoesPostExist(ratePostServiceModel.PostId)) - // throw new ArgumentException("Post does not exist!"); - - // if (!await this._userRepository.DoesUserExistAsync(ratePostServiceModel.UserId)) - // throw new ArgumentException("User does not exist!"); - - // Post post = await this._postRepository.GetByIdAsync(ratePostServiceModel.PostId); - // User user = await this._userRepository.GetByIdAsync(ratePostServiceModel.UserId); - - // if (this.HasUserRatedThisPost(user, post)) - // throw new ArgumentException("You can't rate the same post more then one(duh, amigo)"); - - // this.Rate(user, post, ratePostServiceModel.Liked); - - // bool success = await this._ratingRepository.EditAsync(post.Rating.Id, post.Rating); - // if (!success) - // throw new InvalidOperationException("Unable to rate the post!"); - - // Rating newRating = await this._ratingRepository.GetByIdAsync(post.Rating.Id); - // return this._mapper.Map(newRating); - } - - public async Task RemoveUserRateFromPost(Guid userId, Guid postId) - { - throw new NotImplementedException(); - // Post post = await this._postRepository.GetByIdAsync(postId); - // User user = await this._userRepository.GetByIdAsync(userId); - - // if (!this.HasUserRatedThisPost(user, post)) - // throw new ArgumentException("You haven't rated this post, lmao!"); - } - - public bool HasUserRatedThisPost(User user, Post post) - { - throw new NotImplementedException(); - // return post.Rating.UsersThatRated - // .Any(x => x.Id == user.Id); - } - - private void Rate(User user, Post post, bool liked) - { - throw new NotImplementedException(); - // if (liked) - // post.Rating.Rate++; - // else - // post.Rating.Rate--; - - // post.Rating.UsersThatRated.Add(user); - } - } -} diff --git a/src/DevHive.Services/Services/RoleService.cs b/src/DevHive.Services/Services/RoleService.cs deleted file mode 100644 index a8b8e17..0000000 --- a/src/DevHive.Services/Services/RoleService.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Identity.Role; -using DevHive.Services.Models.Language; - -namespace DevHive.Services.Services -{ - public class RoleService : IRoleService - { - private readonly IRoleRepository _roleRepository; - private readonly IMapper _roleMapper; - - public RoleService(IRoleRepository roleRepository, IMapper mapper) - { - this._roleRepository = roleRepository; - this._roleMapper = mapper; - } - - public async Task CreateRole(CreateRoleServiceModel roleServiceModel) - { - if (await this._roleRepository.DoesNameExist(roleServiceModel.Name)) - throw new ArgumentException("Role already exists!"); - - Role role = this._roleMapper.Map(roleServiceModel); - bool success = await this._roleRepository.AddAsync(role); - - if (success) - { - Role newRole = await this._roleRepository.GetByNameAsync(roleServiceModel.Name); - return newRole.Id; - } - else - return Guid.Empty; - - } - - public async Task GetRoleById(Guid id) - { - Role role = await this._roleRepository.GetByIdAsync(id) - ?? throw new ArgumentException("Role does not exist!"); - - return this._roleMapper.Map(role); - } - - public async Task UpdateRole(UpdateRoleServiceModel updateRoleServiceModel) - { - if (!await this._roleRepository.DoesRoleExist(updateRoleServiceModel.Id)) - throw new ArgumentException("Role does not exist!"); - - if (await this._roleRepository.DoesNameExist(updateRoleServiceModel.Name)) - throw new ArgumentException("Role name already exists!"); - - Role role = this._roleMapper.Map(updateRoleServiceModel); - return await this._roleRepository.EditAsync(updateRoleServiceModel.Id, role); - } - - public async Task DeleteRole(Guid id) - { - if (!await this._roleRepository.DoesRoleExist(id)) - throw new ArgumentException("Role does not exist!"); - - Role role = await this._roleRepository.GetByIdAsync(id); - return await this._roleRepository.DeleteAsync(role); - } - } -} diff --git a/src/DevHive.Services/Services/TechnologyService.cs b/src/DevHive.Services/Services/TechnologyService.cs deleted file mode 100644 index 6dd6286..0000000 --- a/src/DevHive.Services/Services/TechnologyService.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Technology; - -namespace DevHive.Services.Services -{ - public class TechnologyService : ITechnologyService - { - private readonly ITechnologyRepository _technologyRepository; - private readonly IMapper _technologyMapper; - - public TechnologyService(ITechnologyRepository technologyRepository, IMapper technologyMapper) - { - this._technologyRepository = technologyRepository; - this._technologyMapper = technologyMapper; - } - - #region Create - public async Task CreateTechnology(CreateTechnologyServiceModel technologyServiceModel) - { - if (await this._technologyRepository.DoesTechnologyNameExistAsync(technologyServiceModel.Name)) - throw new ArgumentException("Technology already exists!"); - - Technology technology = this._technologyMapper.Map(technologyServiceModel); - bool success = await this._technologyRepository.AddAsync(technology); - - if (success) - { - Technology newTechnology = await this._technologyRepository.GetByNameAsync(technologyServiceModel.Name); - return newTechnology.Id; - } - else - return Guid.Empty; - } - #endregion - - #region Read - public async Task GetTechnologyById(Guid id) - { - Technology technology = await this._technologyRepository.GetByIdAsync(id); - - if (technology == null) - throw new ArgumentException("The technology does not exist"); - - return this._technologyMapper.Map(technology); - } - - public HashSet GetTechnologies() - { - HashSet technologies = this._technologyRepository.GetTechnologies(); - - return this._technologyMapper.Map>(technologies); - } - #endregion - - #region Update - public async Task UpdateTechnology(UpdateTechnologyServiceModel updateTechnologyServiceModel) - { - if (!await this._technologyRepository.DoesTechnologyExistAsync(updateTechnologyServiceModel.Id)) - throw new ArgumentException("Technology does not exist!"); - - if (await this._technologyRepository.DoesTechnologyNameExistAsync(updateTechnologyServiceModel.Name)) - throw new ArgumentException("Technology name already exists!"); - - Technology technology = this._technologyMapper.Map(updateTechnologyServiceModel); - bool result = await this._technologyRepository.EditAsync(updateTechnologyServiceModel.Id, technology); - - return result; - } - #endregion - - #region Delete - public async Task DeleteTechnology(Guid id) - { - if (!await this._technologyRepository.DoesTechnologyExistAsync(id)) - throw new ArgumentException("Technology does not exist!"); - - Technology technology = await this._technologyRepository.GetByIdAsync(id); - bool result = await this._technologyRepository.DeleteAsync(technology); - - return result; - } - #endregion - } -} diff --git a/src/DevHive.Services/Services/UserService.cs b/src/DevHive.Services/Services/UserService.cs deleted file mode 100644 index 22d5052..0000000 --- a/src/DevHive.Services/Services/UserService.cs +++ /dev/null @@ -1,382 +0,0 @@ -using AutoMapper; -using DevHive.Services.Options; -using DevHive.Services.Models.Identity.User; -using System.Threading.Tasks; -using DevHive.Data.Models; -using System; -using System.IdentityModel.Tokens.Jwt; -using System.Security.Claims; -using Microsoft.IdentityModel.Tokens; -using System.Text; -using System.Collections.Generic; -using DevHive.Common.Models.Identity; -using DevHive.Services.Interfaces; -using DevHive.Data.Interfaces.Repositories; -using System.Linq; -using DevHive.Common.Models.Misc; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Identity; - -namespace DevHive.Services.Services -{ - public class UserService : IUserService - { - private readonly IUserRepository _userRepository; - private readonly IRoleRepository _roleRepository; - private readonly ILanguageRepository _languageRepository; - private readonly ITechnologyRepository _technologyRepository; - private readonly UserManager _userManager; - private readonly RoleManager _roleManager; - private readonly IMapper _userMapper; - private readonly JWTOptions _jwtOptions; - private readonly ICloudService _cloudService; - - public UserService(IUserRepository userRepository, - ILanguageRepository languageRepository, - IRoleRepository roleRepository, - ITechnologyRepository technologyRepository, - UserManager userManager, - RoleManager roleManager, - IMapper mapper, - JWTOptions jwtOptions, - ICloudService cloudService) - { - this._userRepository = userRepository; - this._roleRepository = roleRepository; - this._userMapper = mapper; - this._jwtOptions = jwtOptions; - this._languageRepository = languageRepository; - this._technologyRepository = technologyRepository; - this._userManager = userManager; - this._roleManager = roleManager; - this._cloudService = cloudService; - } - - #region Authentication - /// - /// Adds a new user to the database with the values from the given model. - /// Returns a JSON Web Token (that can be used for authorization) - /// - public async Task LoginUser(LoginServiceModel loginModel) - { - if (!await this._userRepository.DoesUsernameExistAsync(loginModel.UserName)) - throw new ArgumentException("Invalid username!"); - - User user = await this._userRepository.GetByUsernameAsync(loginModel.UserName); - - if (user.PasswordHash != PasswordModifications.GeneratePasswordHash(loginModel.Password)) - throw new ArgumentException("Incorrect password!"); - - return new TokenModel(WriteJWTSecurityToken(user.Id, user.UserName, user.Roles)); - } - - /// - /// Returns a new JSON Web Token (that can be used for authorization) for the given user - /// - public async Task RegisterUser(RegisterServiceModel registerModel) - { - if (await this._userRepository.DoesUsernameExistAsync(registerModel.UserName)) - throw new ArgumentException("Username already exists!"); - - if (await this._userRepository.DoesEmailExistAsync(registerModel.Email)) - throw new ArgumentException("Email already exists!"); - - User user = this._userMapper.Map(registerModel); - user.PasswordHash = PasswordModifications.GeneratePasswordHash(registerModel.Password); - user.ProfilePicture = new ProfilePicture() { PictureURL = "/assets/images/feed/profile-pic.png" }; - - // Make sure the default role exists - //TODO: Move when project starts - if (!await this._roleRepository.DoesNameExist(Role.DefaultRole)) - await this._roleRepository.AddAsync(new Role { Name = Role.DefaultRole }); - - user.Roles.Add(await this._roleRepository.GetByNameAsync(Role.DefaultRole)); - - IdentityResult userResult = await this._userManager.CreateAsync(user); - User createdUser = await this._userRepository.GetByUsernameAsync(registerModel.UserName); - - if (!userResult.Succeeded) - throw new ArgumentException("Unable to create a user"); - - return new TokenModel(WriteJWTSecurityToken(createdUser.Id, createdUser.UserName, createdUser.Roles)); - } - #endregion - - #region Read - public async Task GetUserById(Guid id) - { - User user = await this._userRepository.GetByIdAsync(id) ?? - throw new ArgumentException("User does not exist!"); - - return this._userMapper.Map(user); - } - - public async Task GetUserByUsername(string username) - { - User user = await this._userRepository.GetByUsernameAsync(username) ?? - throw new ArgumentException("User does not exist!"); - - return this._userMapper.Map(user); - } - #endregion - - #region Update - public async Task UpdateUser(UpdateUserServiceModel updateUserServiceModel) - { - await this.ValidateUserOnUpdate(updateUserServiceModel); - - User currentUser = await this._userRepository.GetByIdAsync(updateUserServiceModel.Id); - await this.PopulateUserModel(currentUser, updateUserServiceModel); - - if (updateUserServiceModel.Friends.Count() > 0) - await this.CreateRelationToFriends(currentUser, updateUserServiceModel.Friends.ToList()); - else - currentUser.Friends.Clear(); - - IdentityResult result = await this._userManager.UpdateAsync(currentUser); - - if (!result.Succeeded) - throw new InvalidOperationException("Unable to edit user!"); - - User newUser = await this._userRepository.GetByIdAsync(currentUser.Id); - return this._userMapper.Map(newUser); - } - - /// - /// Uploads the given picture and assigns it's link to the user in the database - /// - public async Task UpdateProfilePicture(UpdateProfilePictureServiceModel updateProfilePictureServiceModel) - { - User user = await this._userRepository.GetByIdAsync(updateProfilePictureServiceModel.UserId); - - if (!string.IsNullOrEmpty(user.ProfilePicture.PictureURL)) - { - bool success = await _cloudService.RemoveFilesFromCloud(new List { user.ProfilePicture.PictureURL }); - if (!success) - throw new InvalidCastException("Could not delete old profile picture!"); - } - - string fileUrl = (await this._cloudService.UploadFilesToCloud(new List { updateProfilePictureServiceModel.Picture }))[0] ?? - throw new ArgumentNullException("Unable to upload profile picture to cloud"); - - bool successful = await this._userRepository.UpdateProfilePicture(updateProfilePictureServiceModel.UserId, fileUrl); - - if (!successful) - throw new InvalidOperationException("Unable to change profile picture!"); - - return new ProfilePictureServiceModel() { ProfilePictureURL = fileUrl }; - } - #endregion - - #region Delete - public async Task DeleteUser(Guid id) - { - if (!await this._userRepository.DoesUserExistAsync(id)) - throw new ArgumentException("User does not exist!"); - - User user = await this._userRepository.GetByIdAsync(id); - IdentityResult result = await this._userManager.DeleteAsync(user); - - return result.Succeeded; - } - #endregion - - #region Validations - /// - /// Checks whether the given user, gotten by the "id" property, - /// is the same user as the one in the token (uness the user in the token has the admin role) - /// and the roles in the token are the same as those in the user, gotten by the id in the token - /// - public async Task ValidJWT(Guid id, string rawTokenData) - { - // There is authorization name in the beginning, i.e. "Bearer eyJh..." - var jwt = new JwtSecurityTokenHandler().ReadJwtToken(rawTokenData.Remove(0, 7)); - - Guid jwtUserID = new Guid(this.GetClaimTypeValues("ID", jwt.Claims).First()); - List jwtRoleNames = this.GetClaimTypeValues("role", jwt.Claims); - - User user = await this._userRepository.GetByIdAsync(jwtUserID) - ?? throw new ArgumentException("User does not exist!"); - - /* Check if user is trying to do something to himself, unless he's an admin */ - - /* Check roles */ - if (!jwtRoleNames.Contains(Role.AdminRole)) - if (user.Id != id) - return false; - - // Check if jwt contains all user roles (if it doesn't, jwt is either old or tampered with) - foreach (var role in user.Roles) - { - if (!jwtRoleNames.Contains(role.Name)) - return false; - } - - // Check if jwt contains only roles of user - if (jwtRoleNames.Count != user.Roles.Count) - return false; - - return true; - } - - /// - /// Returns all values from a given claim type - /// - private List GetClaimTypeValues(string type, IEnumerable claims) - { - List toReturn = new(); - - foreach (var claim in claims) - if (claim.Type == type) - toReturn.Add(claim.Value); - - return toReturn; - } - - /// - /// Checks whether the user in the model exists - /// and whether the username in the model is already taken. - /// If the check fails (is false), it throws an exception, otherwise nothing happens - /// - private async Task ValidateUserOnUpdate(UpdateUserServiceModel updateUserServiceModel) - { - if (!await this._userRepository.DoesUserExistAsync(updateUserServiceModel.Id)) - throw new ArgumentException("User does not exist!"); - - if (updateUserServiceModel.Friends.Any(x => x.UserName == updateUserServiceModel.UserName)) - throw new ArgumentException("You cant add yourself as a friend(sry, bro)!"); - - if (!this._userRepository.DoesUserHaveThisUsername(updateUserServiceModel.Id, updateUserServiceModel.UserName) - && await this._userRepository.DoesUsernameExistAsync(updateUserServiceModel.UserName)) - throw new ArgumentException("Username already exists!"); - - List usernames = new(); - foreach (var friend in updateUserServiceModel.Friends) - usernames.Add(friend.UserName); - - if (!await this._userRepository.ValidateFriendsCollectionAsync(usernames)) - throw new ArgumentException("One or more friends do not exist!"); - } - - /// - /// Return a new JSON Web Token, containing the user id, username and roles. - /// Tokens have an expiration time of 7 days. - /// - private string WriteJWTSecurityToken(Guid userId, string username, HashSet roles) - { - byte[] signingKey = Encoding.ASCII.GetBytes(_jwtOptions.Secret); - HashSet claims = new() - { - new Claim("ID", $"{userId}"), - new Claim("Username", username) - }; - - foreach (var role in roles) - { - claims.Add(new Claim(ClaimTypes.Role, role.Name)); - } - - SecurityTokenDescriptor tokenDescriptor = new() - { - Subject = new ClaimsIdentity(claims), - Expires = DateTime.Today.AddDays(7), - SigningCredentials = new SigningCredentials( - new SymmetricSecurityKey(signingKey), - SecurityAlgorithms.HmacSha512Signature) - }; - - JwtSecurityTokenHandler tokenHandler = new(); - SecurityToken token = tokenHandler.CreateToken(tokenDescriptor); - return tokenHandler.WriteToken(token); - } - #endregion - - #region Misc - public async Task SuperSecretPromotionToAdmin(Guid userId) - { - User user = await this._userRepository.GetByIdAsync(userId) ?? - throw new ArgumentException("User does not exist! Can't promote shit in this country..."); - - if (!await this._roleRepository.DoesNameExist(Role.AdminRole)) - { - Role adminRole = new() - { - Name = Role.AdminRole - }; - adminRole.Users.Add(user); - - await this._roleRepository.AddAsync(adminRole); - } - - Role admin = await this._roleManager.FindByNameAsync(Role.AdminRole); - - user.Roles.Add(admin); - await this._userManager.UpdateAsync(user); - - User newUser = await this._userRepository.GetByIdAsync(userId); - - return new TokenModel(WriteJWTSecurityToken(newUser.Id, newUser.UserName, newUser.Roles)); - } - - private async Task PopulateUserModel(User user, UpdateUserServiceModel updateUserServiceModel) - { - user.UserName = updateUserServiceModel.UserName; - user.FirstName = updateUserServiceModel.FirstName; - user.LastName = updateUserServiceModel.LastName; - user.Email = updateUserServiceModel.Email; - - //Do NOT allow a user to change his roles, unless he is an Admin - bool isAdmin = await this._userManager.IsInRoleAsync(user, Role.AdminRole); - - if (isAdmin) - { - HashSet roles = new(); - foreach (var role in updateUserServiceModel.Roles) - { - Role returnedRole = await this._roleRepository.GetByNameAsync(role.Name) ?? - throw new ArgumentException($"Role {role.Name} does not exist!"); - - roles.Add(returnedRole); - } - user.Roles = roles; - } - - HashSet languages = new(); - int languagesCount = updateUserServiceModel.Languages.Count; - for (int i = 0; i < languagesCount; i++) - { - Language language = await this._languageRepository.GetByNameAsync(updateUserServiceModel.Languages.ElementAt(i).Name) ?? - throw new ArgumentException("Invalid language name!"); - - languages.Add(language); - } - user.Languages = languages; - - /* Fetch Technologies and replace model's*/ - HashSet technologies = new(); - int technologiesCount = updateUserServiceModel.Technologies.Count; - for (int i = 0; i < technologiesCount; i++) - { - Technology technology = await this._technologyRepository.GetByNameAsync(updateUserServiceModel.Technologies.ElementAt(i).Name) ?? - throw new ArgumentException("Invalid technology name!"); - - technologies.Add(technology); - } - user.Technologies = technologies; - } - - private async Task CreateRelationToFriends(User user, List friends) - { - foreach (var friend in friends) - { - User amigo = await this._userRepository.GetByUsernameAsync(friend.UserName); - - user.Friends.Add(amigo); - amigo.Friends.Add(user); - - await this._userManager.UpdateAsync(amigo); - } - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Data.Tests/CommentRepository.Tests.cs b/src/DevHive.Tests/DevHive.Data.Tests/CommentRepository.Tests.cs deleted file mode 100644 index 9cbb43b..0000000 --- a/src/DevHive.Tests/DevHive.Data.Tests/CommentRepository.Tests.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using System.Threading.Tasks; -using DevHive.Data.Models; -using DevHive.Data.Repositories; -using Microsoft.EntityFrameworkCore; -using NUnit.Framework; - -namespace DevHive.Data.Tests -{ - [TestFixture] - public class CommentRepositoryTests - { - private const string COMMENT_MESSAGE = "Comment message"; - - protected DevHiveContext Context { get; set; } - - protected CommentRepository CommentRepository { get; set; } - - #region Setups - [SetUp] - public void Setup() - { - var optionsBuilder = new DbContextOptionsBuilder() - .UseInMemoryDatabase(databaseName: "DevHive_Test_Database"); - - this.Context = new DevHiveContext(optionsBuilder.Options); - - CommentRepository = new CommentRepository(Context); - } - - [TearDown] - public void TearDown() - { - this.Context.Database.EnsureDeleted(); - } - #endregion - - #region GetCommentByIssuerAndTimeCreatedAsync - [Test] - public async Task GetCommentByCreatorAndTimeCreatedAsync_ReturnsTheCorrectComment_IfItExists() - { - Comment comment = await this.AddEntity(); - - Comment resultComment = await this.CommentRepository.GetCommentByIssuerAndTimeCreatedAsync(comment.Creator.Id, comment.TimeCreated); - - Assert.AreEqual(comment.Id, resultComment.Id, "GetCommentByIssuerAndTimeCreatedAsync does not return the corect comment when it exists"); - } - - [Test] - public async Task GetPostByCreatorAndTimeCreatedAsync_ReturnsNull_IfThePostDoesNotExist() - { - Comment comment = await this.AddEntity(); - - Comment resultComment = await this.CommentRepository.GetCommentByIssuerAndTimeCreatedAsync(Guid.Empty, DateTime.Now); - - Assert.IsNull(resultComment, "GetCommentByIssuerAndTimeCreatedAsync does not return null when the comment does not exist"); - } - #endregion - - #region DoesCommentExist - [Test] - public async Task DoesCommentExist_ReturnsTrue_WhenTheCommentExists() - { - Comment comment = await this.AddEntity(); - - bool result = await this.CommentRepository.DoesCommentExist(comment.Id); - - Assert.IsTrue(result, "DoesCommentExist does not return true whenm the Comment exists"); - } - - [Test] - public async Task DoesCommentExist_ReturnsFalse_WhenTheCommentDoesNotExist() - { - bool result = await this.CommentRepository.DoesCommentExist(Guid.Empty); - - Assert.IsFalse(result, "DoesCommentExist does not return false whenm the Comment" + - " does not exist"); - } - #endregion - - #region HelperMethods - private async Task AddEntity(string name = COMMENT_MESSAGE) - { - User creator = new User { Id = Guid.NewGuid() }; - Comment comment = new Comment - { - Message = COMMENT_MESSAGE, - Creator = creator, - TimeCreated = DateTime.Now - }; - - this.Context.Comments.Add(comment); - await this.Context.SaveChangesAsync(); - - return comment; - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Data.Tests/DevHive.Data.Tests.csproj b/src/DevHive.Tests/DevHive.Data.Tests/DevHive.Data.Tests.csproj deleted file mode 100644 index d320450..0000000 --- a/src/DevHive.Tests/DevHive.Data.Tests/DevHive.Data.Tests.csproj +++ /dev/null @@ -1,25 +0,0 @@ - - - - net5.0 - - false - - - - - - - - - - - - - - - - true - latest - - diff --git a/src/DevHive.Tests/DevHive.Data.Tests/FeedRepository.Tests.cs b/src/DevHive.Tests/DevHive.Data.Tests/FeedRepository.Tests.cs deleted file mode 100644 index f134bf3..0000000 --- a/src/DevHive.Tests/DevHive.Data.Tests/FeedRepository.Tests.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using DevHive.Data.Models; -using DevHive.Data.Repositories; -using Microsoft.EntityFrameworkCore; -using NUnit.Framework; - -namespace DevHive.Data.Tests -{ - [TestFixture] - public class FeedRepositoryTests - { - protected DevHiveContext Context { get; set; } - - protected FeedRepository FeedRepository { get; set; } - - #region Setups - [SetUp] - public void Setup() - { - var optionsBuilder = new DbContextOptionsBuilder() - .UseInMemoryDatabase(databaseName: "DevHive_Test_Database"); - - this.Context = new DevHiveContext(optionsBuilder.Options); - - FeedRepository = new FeedRepository(Context); - } - - [TearDown] - public void TearDown() - { - this.Context.Database.EnsureDeleted(); - } - #endregion - - #region GetFriendsPosts - [Test] - public async Task GetFriendsPosts_ReturnsListOfPosts_WhenTheyExist() - { - User dummyUser = this.CreateDummyUser(); - List friendsList = new List(); - friendsList.Add(dummyUser); - - DateTime dateTime = new DateTime(3000, 05, 09, 9, 15, 0); - Console.WriteLine(dateTime.ToFileTime()); - - Post dummyPost = this.CreateDummyPost(dummyUser); - Post anotherDummnyPost = this.CreateDummyPost(dummyUser); - - const int PAGE_NUMBER = 1; - const int PAGE_SIZE = 10; - - List resultList = await this.FeedRepository.GetFriendsPosts(friendsList, dateTime, PAGE_NUMBER, PAGE_SIZE); - - Assert.GreaterOrEqual(2, resultList.Count, "GetFriendsPosts does not return all correct posts"); - } - - [Test] - public async Task GetFriendsPosts_ReturnsNull_WhenNoSuitablePostsExist() - { - User dummyUser = this.CreateDummyUser(); - List friendsList = new List(); - friendsList.Add(dummyUser); - - DateTime dateTime = new DateTime(3000, 05, 09, 9, 15, 0); - - const int PAGE_NUMBER = 1; - const int PAGE_SIZE = 10; - - List resultList = await this.FeedRepository.GetFriendsPosts(friendsList, dateTime, PAGE_NUMBER, PAGE_SIZE); - - Assert.LessOrEqual(0, resultList.Count, "GetFriendsPosts does not return all correct posts"); - } - #endregion - - #region HelperMethods - private User CreateDummyUser() - { - HashSet roles = new() - { - new Role() - { - Id = Guid.NewGuid(), - Name = Role.DefaultRole - }, - }; - - return new() - { - Id = Guid.NewGuid(), - UserName = "pioneer10", - FirstName = "Spas", - LastName = "Spasov", - Email = "abv@abv.bg", - Roles = roles - }; - } - - private Post CreateDummyPost(User poster) - { - const string POST_MESSAGE = "random message"; - Guid id = Guid.NewGuid(); - Post post = new Post - { - Id = id, - Message = POST_MESSAGE, - Creator = poster, - TimeCreated = new DateTime(2000, 05, 09, 9, 15, 0) - }; - - this.Context.Posts.Add(post); - this.Context.SaveChanges(); - - return post; - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Data.Tests/LenguageRepository.Tests.cs b/src/DevHive.Tests/DevHive.Data.Tests/LenguageRepository.Tests.cs deleted file mode 100644 index f02a1e4..0000000 --- a/src/DevHive.Tests/DevHive.Data.Tests/LenguageRepository.Tests.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using DevHive.Data.Models; -using DevHive.Data.Repositories; -using Microsoft.EntityFrameworkCore; -using NUnit.Framework; - -namespace DevHive.Data.Tests -{ - [TestFixture] - public class LenguageRepositoryTests - { - private const string LANGUAGE_NAME = "Language test name"; - protected DevHiveContext Context { get; set; } - protected LanguageRepository LanguageRepository { get; set; } - - #region Setups - [SetUp] - public void Setup() - { - var optionsBuilder = new DbContextOptionsBuilder() - .UseInMemoryDatabase(databaseName: "DevHive_Test_Database"); - - this.Context = new DevHiveContext(optionsBuilder.Options); - - LanguageRepository = new LanguageRepository(Context); - } - - [TearDown] - public void TearDown() - { - this.Context.Database.EnsureDeleted(); - } - #endregion - - #region GetByNameAsync - [Test] - public async Task GetByNameAsync_ReturnsTheCorrectLanguage_IfItExists() - { - await AddEntity(); - - Language language = this.Context.Languages.Where(x => x.Name == LANGUAGE_NAME).ToList().FirstOrDefault(); - - Language languageResult = await this.LanguageRepository.GetByNameAsync(LANGUAGE_NAME); - - Assert.AreEqual(language.Id, languageResult.Id); - } - - [Test] - public async Task GetByNameAsync_ReturnsNull_IfTechnologyDoesNotExists() - { - Language languageResult = await this.LanguageRepository.GetByNameAsync(LANGUAGE_NAME); - - Assert.IsNull(languageResult); - } - #endregion - - #region DoesLanguageExistAsync - [Test] - public async Task DoesLanguageExist_ReturnsTrue_IfIdExists() - { - await AddEntity(); - Language language = this.Context.Languages.Where(x => x.Name == LANGUAGE_NAME).ToList().FirstOrDefault(); - - Guid id = language.Id; - - bool result = await this.LanguageRepository.DoesLanguageExistAsync(id); - - Assert.IsTrue(result, "DoesLanguageExistAsync returns flase when language exists"); - } - - [Test] - public async Task DoesLanguageExist_ReturnsFalse_IfIdDoesNotExists() - { - Guid id = Guid.NewGuid(); - - bool result = await this.LanguageRepository.DoesLanguageExistAsync(id); - - Assert.IsFalse(result, "DoesLanguageExistAsync returns true when language does not exist"); - } - #endregion - - #region DoesTechnologyNameExistAsync - [Test] - public async Task DoesLanguageNameExist_ReturnsTrue_IfLanguageExists() - { - await AddEntity(); - - bool result = await this.LanguageRepository.DoesLanguageNameExistAsync(LANGUAGE_NAME); - - Assert.IsTrue(result, "DoesLanguageNameExists returns true when language name does not exist"); - } - - [Test] - public async Task DoesLanguageNameExist_ReturnsFalse_IfLanguageDoesNotExists() - { - bool result = await this.LanguageRepository.DoesLanguageNameExistAsync(LANGUAGE_NAME); - - Assert.False(result, "DoesTechnologyNameExistAsync returns true when language name does not exist"); - } - #endregion - - #region HelperMethods - private async Task AddEntity(string name = LANGUAGE_NAME) - { - Language language = new Language - { - Name = name - }; - - await this.LanguageRepository.AddAsync(language); - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Data.Tests/PostRepository.Tests.cs b/src/DevHive.Tests/DevHive.Data.Tests/PostRepository.Tests.cs deleted file mode 100644 index 6dacf0b..0000000 --- a/src/DevHive.Tests/DevHive.Data.Tests/PostRepository.Tests.cs +++ /dev/null @@ -1,145 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using DevHive.Data.RelationModels; -using DevHive.Data.Repositories; -using Microsoft.EntityFrameworkCore; -using Moq; -using NUnit.Framework; - -namespace DevHive.Data.Tests -{ - [TestFixture] - public class PostRepositoryTests - { - private const string POST_MESSAGE = "Post test message"; - - private DevHiveContext Context { get; set; } - - private Mock UserRepository { get; set; } - - private PostRepository PostRepository { get; set; } - - #region Setups - [SetUp] - public void Setup() - { - var optionsBuilder = new DbContextOptionsBuilder() - .UseInMemoryDatabase(databaseName: "DevHive_Test_Database"); - - this.Context = new DevHiveContext(optionsBuilder.Options); - - this.UserRepository = new Mock(); - - PostRepository = new PostRepository(Context, this.UserRepository.Object); - } - - [TearDown] - public void TearDown() - { - this.Context.Database.EnsureDeleted(); - } - #endregion - - #region AddNewPostToCreator - // [Test] - // public async Task AddNewPostToCreator_ReturnsTrue_WhenNewPostIsAddedToCreator() - // { - // Post post = await this.AddEntity(); - // User user = new User { Id = Guid.NewGuid() }; - // - // this.UserRepository.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); - // - // bool result = await this.PostRepository.AddNewPostToCreator(user.Id, post); - // - // Assert.IsTrue(result, "AddNewPostToCreator does not return true when Post Is Added To Creator successfully"); - // } - #endregion - - #region GetByIdAsync - [Test] - public async Task GetByNameAsync_ReturnsTheCorrectPost_IfItExists() - { - Post post = await AddEntity(); - - Post resultTechnology = await this.PostRepository.GetByIdAsync(post.Id); - - Assert.AreEqual(post.Id, resultTechnology.Id, "GetByIdAsync does not return the correct post"); - } - - [Test] - public async Task GetByIdAsync_ReturnsNull_IfTechnologyDoesNotExists() - { - Post resultPost = await this.PostRepository.GetByIdAsync(Guid.NewGuid()); - - Assert.IsNull(resultPost); - } - #endregion - - #region GetPostByCreatorAndTimeCreatedAsync - [Test] - public async Task GetPostByCreatorAndTimeCreatedAsync_ReturnsTheCorrectPost_IfItExists() - { - Post post = await this.AddEntity(); - - Post resultPost = await this.PostRepository.GetPostByCreatorAndTimeCreatedAsync(post.Creator.Id, post.TimeCreated); - - Assert.AreEqual(post.Id, resultPost.Id, "GetPostByCreatorAndTimeCreatedAsync does not return the corect post when it exists"); - } - - [Test] - public async Task GetPostByCreatorAndTimeCreatedAsync_ReturnsNull_IfThePostDoesNotExist() - { - Post post = await this.AddEntity(); - - Post resutPost = await this.PostRepository.GetPostByCreatorAndTimeCreatedAsync(Guid.Empty, DateTime.Now); - - Assert.IsNull(resutPost, "GetPostByCreatorAndTimeCreatedAsync does not return null when the post does not exist"); - } - #endregion - - #region DoesPostExist - [Test] - public async Task DoesPostExist_ReturnsTrue_WhenThePostExists() - { - Post post = await this.AddEntity(); - - bool result = await this.PostRepository.DoesPostExist(post.Id); - - Assert.IsTrue(result, "DoesPostExist does not return true whenm the Post exists"); - } - - [Test] - public async Task DoesPostExist_ReturnsFalse_WhenThePostDoesNotExist() - { - bool result = await this.PostRepository.DoesPostExist(Guid.Empty); - - Assert.IsFalse(result, "DoesPostExist does not return false whenm the Post does not exist"); - } - #endregion - - #region HelperMethods - private async Task AddEntity(string name = POST_MESSAGE) - { - User creator = new User { Id = Guid.NewGuid() }; - await this.Context.Users.AddAsync(creator); - Post post = new Post - { - Message = POST_MESSAGE, - Id = Guid.NewGuid(), - Creator = creator, - TimeCreated = DateTime.Now, - Attachments = new List { new PostAttachments { FileUrl = "kur" }, new PostAttachments { FileUrl = "za" }, new PostAttachments { FileUrl = "tva" } }, - Comments = new List() - }; - - await this.Context.Posts.AddAsync(post); - await this.Context.SaveChangesAsync(); - - return post; - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Data.Tests/RoleRepository.Tests.cs b/src/DevHive.Tests/DevHive.Data.Tests/RoleRepository.Tests.cs deleted file mode 100644 index 7f62c24..0000000 --- a/src/DevHive.Tests/DevHive.Data.Tests/RoleRepository.Tests.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using DevHive.Data.Models; -using DevHive.Data.Repositories; -using Microsoft.EntityFrameworkCore; -using NUnit.Framework; - -namespace DevHive.Data.Tests -{ - [TestFixture] - public class RoleRepositoryTests - { - private const string ROLE_NAME = "Role test name"; - - protected DevHiveContext Context { get; set; } - - protected RoleRepository RoleRepository { get; set; } - - #region Setups - [SetUp] - public void Setup() - { - var optionsBuilder = new DbContextOptionsBuilder() - .UseInMemoryDatabase(databaseName: "DevHive_Test_Database"); - - this.Context = new DevHiveContext(optionsBuilder.Options); - - RoleRepository = new RoleRepository(Context); - } - - [TearDown] - public void TearDown() - { - this.Context.Database.EnsureDeleted(); - } - #endregion - - #region GetByNameAsync - [Test] - public async Task GetByNameAsync_ReturnsTheRole_WhenItExists() - { - Role role = await this.AddEntity(); - - Role resultRole = await this.RoleRepository.GetByNameAsync(role.Name); - - Assert.AreEqual(role.Id, resultRole.Id, "GetByNameAsync does not return the correct role"); - } - - [Test] - public async Task GetByNameAsync_ReturnsNull_WhenTheRoleDoesNotExist() - { - Role resultRole = await this.RoleRepository.GetByNameAsync(ROLE_NAME); - - Assert.IsNull(resultRole, "GetByNameAsync does not return when the role does not exist"); - } - #endregion - - #region DoesNameExist - [Test] - public async Task DoesNameExist_ReturnsTrue_WhenTheNameExists() - { - Role role = await this.AddEntity(); - - bool result = await this.RoleRepository.DoesNameExist(role.Name); - - Assert.IsTrue(result, "DoesNameExist returns false when the role name exist"); - } - - [Test] - public async Task DoesNameExist_ReturnsFalse_WhenTheNameDoesNotExist() - { - bool result = await this.RoleRepository.DoesNameExist(ROLE_NAME); - - Assert.IsFalse(result, "DoesNameExist returns false when the role name exist"); - } - #endregion - - #region DoesRoleExist - [Test] - public async Task DoesRoleExist_ReturnsTrue_IfIdExists() - { - await AddEntity(); - Role role = this.Context.Roles.Where(x => x.Name == ROLE_NAME).ToList().FirstOrDefault(); - Guid id = role.Id; - - bool result = await this.RoleRepository.DoesRoleExist(id); - - Assert.IsTrue(result, "DoesRoleExistAsync returns flase when role exists"); - } - - [Test] - public async Task DoesRoleExist_ReturnsFalse_IfIdDoesNotExists() - { - Guid id = Guid.NewGuid(); - - bool result = await this.RoleRepository.DoesRoleExist(id); - - Assert.IsFalse(result, "DoesRoleExist returns true when role does not exist"); - } - #endregion - - #region HelperMethods - private async Task AddEntity(string name = ROLE_NAME) - { - Role role = new Role - { - Id = Guid.NewGuid(), - Name = name - }; - - this.Context.Roles.Add(role); - await this.Context.SaveChangesAsync(); - - return role; - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs b/src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs deleted file mode 100644 index d25fd3b..0000000 --- a/src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs +++ /dev/null @@ -1,118 +0,0 @@ -using DevHive.Data.Models; -using DevHive.Data.Repositories; -using Microsoft.EntityFrameworkCore; -using NUnit.Framework; -using System; -using System.Linq; -using System.Threading.Tasks; - -namespace DevHive.Data.Tests -{ - [TestFixture] - public class TechnologyRepositoryTests - { - private const string TECHNOLOGY_NAME = "Technology test name"; - - protected DevHiveContext Context { get; set; } - - protected TechnologyRepository TechnologyRepository { get; set; } - - #region Setups - [SetUp] - public void Setup() - { - var optionsBuilder = new DbContextOptionsBuilder() - .UseInMemoryDatabase(databaseName: "DevHive_Test_Database"); - - this.Context = new DevHiveContext(optionsBuilder.Options); - - TechnologyRepository = new TechnologyRepository(Context); - } - - [TearDown] - public void TearDown() - { - this.Context.Database.EnsureDeleted(); - } - #endregion - - #region GetByNameAsync - [Test] - public async Task GetByNameAsync_ReturnsTheCorrectTechnology_IfItExists() - { - await AddEntity(); - - Technology technology = this.Context.Technologies.Where(x => x.Name == TECHNOLOGY_NAME).ToList().FirstOrDefault(); - - Technology resultTechnology = await this.TechnologyRepository.GetByNameAsync(TECHNOLOGY_NAME); - - Assert.AreEqual(technology.Id, resultTechnology.Id); - } - - [Test] - public async Task GetByNameAsync_ReturnsNull_IfTechnologyDoesNotExists() - { - Technology resultTechnology = await this.TechnologyRepository.GetByNameAsync(TECHNOLOGY_NAME); - - Assert.IsNull(resultTechnology); - } - #endregion - - #region DoesTechnologyExistAsync - [Test] - public async Task DoesTechnologyExist_ReturnsTrue_IfIdExists() - { - await AddEntity(); - Technology technology = this.Context.Technologies.Where(x => x.Name == TECHNOLOGY_NAME).ToList().FirstOrDefault(); - Guid id = technology.Id; - - bool result = await this.TechnologyRepository.DoesTechnologyExistAsync(id); - - Assert.IsTrue(result, "DoesTechnologyExistAsync returns flase hwen technology exists"); - } - - [Test] - public async Task DoesTechnologyExist_ReturnsFalse_IfIdDoesNotExists() - { - Guid id = Guid.NewGuid(); - - bool result = await this.TechnologyRepository.DoesTechnologyExistAsync(id); - - Assert.IsFalse(result, "DoesTechnologyExistAsync returns true when technology does not exist"); - } - #endregion - - #region DoesTechnologyNameExistAsync - [Test] - public async Task DoesTechnologyNameExist_ReturnsTrue_IfTechnologyExists() - { - await AddEntity(); - - bool result = await this.TechnologyRepository.DoesTechnologyNameExistAsync(TECHNOLOGY_NAME); - - Assert.IsTrue(result, "DoesTechnologyNameExists returns true when technology name does not exist"); - } - - [Test] - public async Task DoesTechnologyNameExist_ReturnsFalse_IfTechnologyDoesNotExists() - { - bool result = await this.TechnologyRepository.DoesTechnologyNameExistAsync(TECHNOLOGY_NAME); - - Assert.False(result, "DoesTechnologyNameExistAsync returns true when technology name does not exist"); - } - #endregion - - #region HelperMethods - private async Task AddEntity(string name = TECHNOLOGY_NAME) - { - Technology technology = new Technology - { - Name = name - }; - - this.Context.Technologies.Add(technology); - await this.Context.SaveChangesAsync(); - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Data.Tests/UserRepositoryTests.cs b/src/DevHive.Tests/DevHive.Data.Tests/UserRepositoryTests.cs deleted file mode 100644 index 43e9a36..0000000 --- a/src/DevHive.Tests/DevHive.Data.Tests/UserRepositoryTests.cs +++ /dev/null @@ -1,350 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using DevHive.Data.Models; -using DevHive.Data.Repositories; -using Microsoft.EntityFrameworkCore; -using NUnit.Framework; - -namespace DevHive.Data.Tests -{ - [TestFixture] - public class UserRepositoryTests - { - private DevHiveContext _context; - private UserRepository _userRepository; - - #region Setups - [SetUp] - public void Setup() - { - var options = new DbContextOptionsBuilder() - .UseInMemoryDatabase("DevHive_UserRepository_Database"); - - this._context = new DevHiveContext(options.Options); - this._userRepository = new UserRepository(_context); - } - - [TearDown] - public async Task Teardown() - { - await this._context.Database.EnsureDeletedAsync(); - } - #endregion - - #region QueryAll - // [Test] - // public async Task QueryAll_ShouldReturnAllUsersFromDatabase_WhenTheyExist() - // { - // //Arrange - // User dummyUserOne = CreateDummyUser(); - // User dummyUserTwo = CreateAnotherDummyUser(); - // - // await this._userRepository.AddAsync(dummyUserOne); - // await this._userRepository.AddAsync(dummyUserTwo); - // - // //Act - // IEnumerable users = this._userRepository.QueryAll(); - // - // //Assert - // Assert.AreEqual(2, users.Count(), "Method doesn't return all instances of user"); - // } - - // [Test] - // public void QueryAll_ReturnsNull_WhenNoUsersExist() - // { - // IEnumerable users = this._userRepository.QueryAll(); - // - // Assert.AreEqual(0, users.Count(), "Method returns Users when there are non"); - // } - #endregion - - #region EditAsync - [Test] - public async Task EditAsync_ReturnsTrue_WhenUserIsUpdatedSuccessfully() - { - User oldUser = this.CreateDummyUser(); - this._context.Users.Add(oldUser); - await this._context.SaveChangesAsync(); - - oldUser.UserName = "SuperSecretUserName"; - bool result = await this._userRepository.EditAsync(oldUser.Id, oldUser); - - Assert.IsTrue(result, "EditAsync does not return true when User is updated successfully"); - } - #endregion - - #region GetByIdAsync - [Test] - public async Task GetByIdAsync_ReturnsTheUse_WhenItExists() - { - User dummyUserOne = CreateDummyUser(); - await this._userRepository.AddAsync(dummyUserOne); - - User resultUser = await this._userRepository.GetByIdAsync(dummyUserOne.Id); - - Assert.AreEqual(dummyUserOne.UserName, resultUser.UserName); - } - - [Test] - public async Task GetByIdAsync_ReturnsNull_WhenUserDoesNotExist() - { - Guid id = Guid.NewGuid(); - - User resultUser = await this._userRepository.GetByIdAsync(id); - - Assert.IsNull(resultUser); - } - #endregion - - #region GetByUsernameAsync - [Test] - public async Task GetByUsernameAsync_ReturnsUserFromDatabase_WhenItExists() - { - //Arrange - User dummyUser = CreateDummyUser(); - await this._userRepository.AddAsync(dummyUser); - string username = dummyUser.UserName; - - //Act - User user = await this._userRepository.GetByUsernameAsync(username); - - //Assert - Assert.AreEqual(dummyUser.Id, user.Id, "Method doesn't get the proper user from database"); - } - - [Test] - public async Task GetByUsernameAsync_ReturnsNull_WhenUserDoesNotExist() - { - //Act - User user = await this._userRepository.GetByUsernameAsync(null); - - //Assert - Assert.IsNull(user, "Method returns user when it does not exist"); - } - #endregion - - #region DoesUserExistAsync - [Test] - public async Task DoesUserExistAsync_ReturnsTrue_WhenUserExists() - { - User dummyUser = this.CreateDummyUser(); - this._context.Users.Add(dummyUser); - await this._context.SaveChangesAsync(); - - bool result = await this._userRepository.DoesUserExistAsync(dummyUser.Id); - - Assert.IsTrue(result, "DoesUserExistAsync does not return true when user exists"); - } - - [Test] - public async Task DoesUserExistAsync_ReturnsFalse_WhenUserDoesNotExist() - { - Guid id = Guid.NewGuid(); - - bool result = await this._userRepository.DoesUserExistAsync(id); - - Assert.IsFalse(result, "DoesUserExistAsync does not return false when user does not exist"); - } - #endregion - - #region DoesUserNameExistAsync - [Test] - public async Task DoesUsernameExistAsync_ReturnsTrue_WhenUserWithTheNameExists() - { - User dummyUser = this.CreateDummyUser(); - this._context.Users.Add(dummyUser); - await this._context.SaveChangesAsync(); - - bool result = await this._userRepository.DoesUsernameExistAsync(dummyUser.UserName); - - Assert.IsTrue(result, "DoesUserNameExistAsync does not return true when username exists"); - } - - [Test] - public async Task DoesUsernameExistAsync_ReturnsFalse_WhenUserWithTheNameDoesNotExist() - { - string userName = "Fake name"; - - bool result = await this._userRepository.DoesUsernameExistAsync(userName); - - Assert.IsFalse(result, "DoesUserNameExistAsync does not return false when username does not exist"); - } - #endregion - - #region DoesEmailExistAsync - [Test] - public async Task DoesEmailExistAsync_ReturnsTrue_WhenUserWithTheEmailExists() - { - User dummyUser = this.CreateDummyUser(); - this._context.Users.Add(dummyUser); - await this._context.SaveChangesAsync(); - - bool result = await this._userRepository.DoesEmailExistAsync(dummyUser.Email); - - Assert.IsTrue(result, "DoesUserNameExistAsync does not return true when email exists"); - } - - [Test] - public async Task DoesEmailExistAsync_ReturnsFalse_WhenUserWithTheEmailDoesNotExist() - { - string email = "Fake email"; - - bool result = await this._userRepository.DoesUsernameExistAsync(email); - - Assert.IsFalse(result, "DoesUserNameExistAsync does not return false when email does not exist"); - } - #endregion - - #region DoesUserHaveThisFriendAsync - //[Test] - //public async Task DoesUserHaveThisFriendAsync_ReturnsTrue_WhenUserHasTheGivenFriend() - //{ - // User dummyUser = this.CreateDummyUser(); - // User anotherDummyUser = this.CreateAnotherDummyUser(); - // HashSet friends = new HashSet - // { - // anotherDummyUser - // }; - // dummyUser.Friends = friends; - - // this._context.Users.Add(dummyUser); - // this._context.Users.Add(anotherDummyUser); - // await this._context.SaveChangesAsync(); - - // bool result = await this._userRepository.DoesUserHaveThisFriendAsync(dummyUser.Id, anotherDummyUser.Id); - - // Assert.IsTrue(result, "DoesUserHaveThisFriendAsync does not return true when user has the given friend"); - //} - - // [Test] - // public async Task DoesUserHaveThisFriendAsync_ReturnsFalse_WhenUserDoesNotHaveTheGivenFriend() - // { - // User dummyUser = this.CreateDummyUser(); - // User anotherDummyUser = this.CreateAnotherDummyUser(); - // - // this._context.Users.Add(dummyUser); - // this._context.Users.Add(anotherDummyUser); - // await this._context.SaveChangesAsync(); - // - // bool result = await this._userRepository.DoesUserHaveThisFriendAsync(dummyUser.Id, anotherDummyUser.Id); - // - // Assert.IsFalse(result, "DoesUserHaveThisFriendAsync does not return false when user des not have the given friend"); - // } - #endregion - - #region DoesUserHaveThisUsername - [Test] - public async Task DoesUserHaveThisUsername_ReturnsTrue_WhenUserHasTheGivenUsername() - { - User dummyUser = this.CreateDummyUser(); - this._context.Users.Add(dummyUser); - await this._context.SaveChangesAsync(); - - bool result = this._userRepository.DoesUserHaveThisUsername(dummyUser.Id, dummyUser.UserName); - - Assert.IsTrue(result, "DoesUserHaveThisUsername does not return true when the user has the given name"); - } - - [Test] - public async Task DoesUserHaveThisUsername_ReturnsFalse_WhenUserDoesntHaveTheGivenUsername() - { - string username = "Fake username"; - User dummyUser = this.CreateDummyUser(); - this._context.Users.Add(dummyUser); - await this._context.SaveChangesAsync(); - - bool result = this._userRepository.DoesUserHaveThisUsername(dummyUser.Id, username); - - Assert.IsFalse(result, "DoesUserNameExistAsync does not return false when user doesnt have the given name"); - } - #endregion - - #region HelperMethods - private User CreateDummyUser() - { - HashSet languages = new() - { - new Language() - { - Id = Guid.NewGuid(), - Name = "csharp" - }, - }; - - HashSet technologies = new() - { - new Technology() - { - Id = Guid.NewGuid(), - Name = "ASP.NET Core" - }, - }; - - HashSet roles = new() - { - new Role() - { - Id = Guid.NewGuid(), - Name = Role.DefaultRole - }, - }; - - return new() - { - Id = Guid.NewGuid(), - UserName = "dummyUser", - FirstName = "Spas", - LastName = "Spasov", - Email = "abv@abv.bg", - Languages = languages, - Technologies = technologies, - Roles = roles - }; - } - - private User CreateAnotherDummyUser() - { - HashSet languages = new() - { - new Language() - { - Id = Guid.NewGuid(), - Name = "typescript" - }, - }; - - HashSet technologies = new() - { - new Technology() - { - Id = Guid.NewGuid(), - Name = "Angular" - }, - }; - - HashSet roles = new() - { - new Role() - { - Id = Guid.NewGuid(), - Name = Role.DefaultRole - }, - }; - - return new() - { - Id = Guid.NewGuid(), - UserName = "anotherDummyUser", - FirstName = "Alex", - LastName = "Spiridonov", - Email = "a_spiridonov@abv.bg", - Languages = languages, - Technologies = technologies, - Roles = roles - }; - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Services.Tests/CommentService.Tests.cs b/src/DevHive.Tests/DevHive.Services.Tests/CommentService.Tests.cs deleted file mode 100644 index ac022ea..0000000 --- a/src/DevHive.Tests/DevHive.Services.Tests/CommentService.Tests.cs +++ /dev/null @@ -1,262 +0,0 @@ -using System; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using DevHive.Services.Models.Comment; -using DevHive.Services.Services; -using Moq; -using NUnit.Framework; - -namespace DevHive.Services.Tests -{ - [TestFixture] - public class CommentServiceTests - { - private const string MESSAGE = "Gosho Trapov"; - private Mock UserRepositoryMock { get; set; } - private Mock PostRepositoryMock { get; set; } - private Mock CommentRepositoryMock { get; set; } - private Mock MapperMock { get; set; } - private CommentService CommentService { get; set; } - - #region Setup - [SetUp] - public void Setup() - { - this.UserRepositoryMock = new Mock(); - this.PostRepositoryMock = new Mock(); - this.CommentRepositoryMock = new Mock(); - this.MapperMock = new Mock(); - this.CommentService = new CommentService(this.UserRepositoryMock.Object, this.PostRepositoryMock.Object, this.CommentRepositoryMock.Object, this.MapperMock.Object); - } - #endregion - - #region AddComment - [Test] - public async Task AddComment_ReturnsNonEmptyGuid_WhenEntityIsAddedSuccessfully() - { - Guid id = Guid.NewGuid(); - User creator = new User { Id = Guid.NewGuid() }; - CreateCommentServiceModel createCommentServiceModel = new CreateCommentServiceModel - { - Message = MESSAGE - }; - Comment comment = new Comment - { - Message = MESSAGE, - Id = id, - }; - - this.CommentRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.CommentRepositoryMock.Setup(p => p.GetCommentByIssuerAndTimeCreatedAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(comment)); - this.PostRepositoryMock.Setup(p => p.DoesPostExist(It.IsAny())).Returns(Task.FromResult(true)); - this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(creator)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(comment); - - Guid result = await this.CommentService.AddComment(createCommentServiceModel); - - Assert.AreEqual(id, result); - } - - [Test] - public async Task AddComment_ReturnsEmptyGuid_WhenEntityIsNotAddedSuccessfully() - { - CreateCommentServiceModel createCommentServiceModel = new CreateCommentServiceModel - { - Message = MESSAGE - }; - Comment comment = new Comment - { - Message = MESSAGE, - }; - - this.CommentRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(false)); - this.PostRepositoryMock.Setup(p => p.DoesPostExist(It.IsAny())).Returns(Task.FromResult(true)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(comment); - - Guid result = await this.CommentService.AddComment(createCommentServiceModel); - - Assert.IsTrue(result == Guid.Empty); - } - - [Test] - public void AddComment_ThrowsException_WhenPostDoesNotExist() - { - const string EXCEPTION_MESSAGE = "Post does not exist!"; - - CreateCommentServiceModel createCommentServiceModel = new CreateCommentServiceModel - { - Message = MESSAGE - }; - - Exception ex = Assert.ThrowsAsync(() => this.CommentService.AddComment(createCommentServiceModel), "AddComment does not throw excpeion when the post does not exist"); - - Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorecct exception message"); - } - #endregion - - #region GetCommentById - [Test] - public async Task GetCommentById_ReturnsTheComment_WhenItExists() - { - Guid creatorId = new Guid(); - User creator = new User { Id = creatorId }; - Comment comment = new Comment - { - Message = MESSAGE, - Creator = creator - }; - ReadCommentServiceModel commentServiceModel = new ReadCommentServiceModel - { - Message = MESSAGE - }; - User user = new User - { - Id = creatorId, - }; - - this.CommentRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(comment)); - this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(commentServiceModel); - - ReadCommentServiceModel result = await this.CommentService.GetCommentById(new Guid()); - - Assert.AreEqual(MESSAGE, result.Message); - } - - [Test] - public void GetCommentById_ThorwsException_WhenTheUserDoesNotExist() - { - const string EXCEPTION_MESSAGE = "The user does not exist"; - Guid creatorId = new Guid(); - User creator = new User { Id = creatorId }; - Comment comment = new Comment - { - Message = MESSAGE, - Creator = creator - }; - - this.CommentRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(comment)); - - Exception ex = Assert.ThrowsAsync(() => this.CommentService.GetCommentById(new Guid()), "GetCommentById does not throw exception when the user does not exist"); - - Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message); - } - - [Test] - public void GetCommentById_ThrowsException_WhenCommentDoesNotExist() - { - string exceptionMessage = "The comment does not exist"; - Guid creatorId = new Guid(); - User user = new User - { - Id = creatorId, - }; - - this.CommentRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); - this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); - - Exception ex = Assert.ThrowsAsync(() => this.CommentService.GetCommentById(new Guid())); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - - #region UpdateComment - [Test] - public async Task UpdateComment_ReturnsTheIdOfTheComment_WhenUpdatedSuccessfully() - { - Guid id = Guid.NewGuid(); - Comment comment = new Comment - { - Id = id, - Message = MESSAGE - }; - UpdateCommentServiceModel updateCommentServiceModel = new UpdateCommentServiceModel - { - CommentId = id, - NewMessage = MESSAGE - }; - - this.CommentRepositoryMock.Setup(p => p.DoesCommentExist(It.IsAny())).Returns(Task.FromResult(true)); - this.CommentRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - this.CommentRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(comment)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(comment); - - Guid result = await this.CommentService.UpdateComment(updateCommentServiceModel); - - Assert.AreEqual(updateCommentServiceModel.CommentId, result); - } - - [Test] - public async Task UpdateComment_ReturnsEmptyId_WhenTheCommentIsNotUpdatedSuccessfully() - { - Comment comment = new Comment - { - Message = MESSAGE - }; - UpdateCommentServiceModel updateCommentServiceModel = new UpdateCommentServiceModel - { - CommentId = Guid.NewGuid(), - NewMessage = MESSAGE - }; - - this.CommentRepositoryMock.Setup(p => p.DoesCommentExist(It.IsAny())).Returns(Task.FromResult(true)); - this.CommentRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(comment); - - Guid result = await this.CommentService.UpdateComment(updateCommentServiceModel); - - Assert.AreEqual(Guid.Empty, result); - } - - [Test] - public void UpdateComment_ThrowsArgumentException_WhenCommentDoesNotExist() - { - string exceptionMessage = "Comment does not exist!"; - UpdateCommentServiceModel updateCommentServiceModel = new UpdateCommentServiceModel - { - }; - - this.CommentRepositoryMock.Setup(p => p.DoesCommentExist(It.IsAny())).Returns(Task.FromResult(false)); - - Exception ex = Assert.ThrowsAsync(() => this.CommentService.UpdateComment(updateCommentServiceModel)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - - #region DeleteComment - [Test] - [TestCase(true)] - [TestCase(false)] - public async Task DeleteComment_ShouldReturnIfDeletionIsSuccessfull_WhenCommentExists(bool shouldPass) - { - Guid id = new Guid(); - Comment comment = new Comment(); - - this.CommentRepositoryMock.Setup(p => p.DoesCommentExist(It.IsAny())).Returns(Task.FromResult(true)); - this.CommentRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(comment)); - this.CommentRepositoryMock.Setup(p => p.DeleteAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); - - bool result = await this.CommentService.DeleteComment(id); - - Assert.AreEqual(shouldPass, result); - } - - [Test] - public void DeleteComment_ThrowsException_WhenCommentDoesNotExist() - { - string exceptionMessage = "Comment does not exist!"; - Guid id = new Guid(); - - this.CommentRepositoryMock.Setup(p => p.DoesCommentExist(It.IsAny())).Returns(Task.FromResult(false)); - - Exception ex = Assert.ThrowsAsync(() => this.CommentService.DeleteComment(id)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Services.Tests/DevHive.Services.Tests.csproj b/src/DevHive.Tests/DevHive.Services.Tests/DevHive.Services.Tests.csproj deleted file mode 100644 index ce5cb62..0000000 --- a/src/DevHive.Tests/DevHive.Services.Tests/DevHive.Services.Tests.csproj +++ /dev/null @@ -1,25 +0,0 @@ - - - - net5.0 - - false - - - - - - - - - - - - - - - - true - latest - - diff --git a/src/DevHive.Tests/DevHive.Services.Tests/FeedService.Tests.cs b/src/DevHive.Tests/DevHive.Services.Tests/FeedService.Tests.cs deleted file mode 100644 index e4020c5..0000000 --- a/src/DevHive.Tests/DevHive.Services.Tests/FeedService.Tests.cs +++ /dev/null @@ -1,155 +0,0 @@ -//using System; -//using System.Collections.Generic; -//using System.Threading.Tasks; -//using AutoMapper; -//using DevHive.Data.Interfaces.Repositories; -//using DevHive.Data.Models; -//using DevHive.Services.Models; -//using DevHive.Services.Models.Post; -//using DevHive.Services.Services; -//using Moq; -//using NUnit.Framework; - -//namespace DevHive.Services.Tests -//{ -// [TestFixture] -// public class FeedServiceTests -// { -// private Mock FeedRepositoryMock { get; set; } -// private Mock UserRepositoryMock { get; set; } -// private Mock MapperMock { get; set; } -// private FeedService FeedService { get; set; } - -// #region SetUps -// [SetUp] -// public void Setup() -// { -// this.FeedRepositoryMock = new Mock(); -// this.UserRepositoryMock = new Mock(); -// this.MapperMock = new Mock(); -// this.FeedService = new FeedService(this.FeedRepositoryMock.Object, this.UserRepositoryMock.Object, this.MapperMock.Object); -// } -// #endregion - -// #region GetPage -// [Test] -// public async Task GetPage_ReturnsReadPageServiceModel_WhenSuitablePostsExist() -// { -// GetPageServiceModel getPageServiceModel = new GetPageServiceModel -// { -// UserId = Guid.NewGuid() -// }; - -// User dummyUser = CreateDummyUser(); -// User anotherDummyUser = CreateAnotherDummyUser(); -// HashSet friends = new HashSet(); -// friends.Add(anotherDummyUser); -// dummyUser.Friends = friends; - -// List posts = new List -// { -// new Post{ Message = "Message"} -// }; - -// ReadPostServiceModel readPostServiceModel = new ReadPostServiceModel -// { -// PostId = Guid.NewGuid(), -// Message = "Message" -// }; -// List readPostServiceModels = new List(); -// readPostServiceModels.Add(readPostServiceModel); -// ReadPageServiceModel readPageServiceModel = new ReadPageServiceModel -// { -// Posts = readPostServiceModels -// }; - -// this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(dummyUser)); -// this.FeedRepositoryMock.Setup(p => p.GetFriendsPosts(It.IsAny>(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(Task.FromResult(posts)); -// this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readPostServiceModel); - -// ReadPageServiceModel result = await this.FeedService.GetPage(getPageServiceModel); - -// Assert.GreaterOrEqual(1, result.Posts.Count, "GetPage does not correctly return the posts"); -// } - -// [Test] -// public void GetPage_ThrowsException_WhenNoSuitablePostsExist() -// { -// const string EXCEPTION_MESSAGE = "No friends of user have posted anything yet!"; -// GetPageServiceModel getPageServiceModel = new GetPageServiceModel -// { -// UserId = Guid.NewGuid() -// }; - -// User dummyUser = CreateDummyUser(); -// User anotherDummyUser = CreateAnotherDummyUser(); -// HashSet friends = new HashSet(); -// friends.Add(anotherDummyUser); -// dummyUser.Friends = friends; - -// ReadPostServiceModel readPostServiceModel = new ReadPostServiceModel -// { -// PostId = Guid.NewGuid(), -// Message = "Message" -// }; -// List readPostServiceModels = new List(); -// readPostServiceModels.Add(readPostServiceModel); -// ReadPageServiceModel readPageServiceModel = new ReadPageServiceModel -// { -// Posts = readPostServiceModels -// }; - -// this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(dummyUser)); -// this.FeedRepositoryMock.Setup(p => p.GetFriendsPosts(It.IsAny>(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(Task.FromResult(new List())); - -// Exception ex = Assert.ThrowsAsync(() => this.FeedService.GetPage(getPageServiceModel)); - -// Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Wrong exception message"); -// } - -// [Test] -// public void GetPage_ThrowsException_WhenUserHasNoFriendsToGetPostsFrom() -// { -// const string EXCEPTION_MESSAGE = "User has no friends to get feed from!"; -// GetPageServiceModel getPageServiceModel = new GetPageServiceModel -// { -// UserId = Guid.NewGuid() -// }; - -// User dummyUser = CreateDummyUser(); - -// this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(dummyUser)); - -// Exception ex = Assert.ThrowsAsync(() => this.FeedService.GetPage(getPageServiceModel)); - -// Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Wrong exception message"); -// } -// #endregion - -// #region HelperMethods -// private User CreateDummyUser() -// { -// return new() -// { -// Id = Guid.NewGuid(), -// UserName = "dummyUser", -// FirstName = "Spas", -// LastName = "Spasov", -// Email = "abv@abv.bg", -// }; -// } - -// private User CreateAnotherDummyUser() -// { -// return new() -// { -// Id = Guid.NewGuid(), -// UserName = "anotherDummyUser", -// FirstName = "Alex", -// LastName = "Spiridonov", -// Email = "a_spiridonov@abv.bg", -// }; -// } -// #endregion -// } -//} diff --git a/src/DevHive.Tests/DevHive.Services.Tests/LanguageService.Tests.cs b/src/DevHive.Tests/DevHive.Services.Tests/LanguageService.Tests.cs deleted file mode 100644 index 1b59f91..0000000 --- a/src/DevHive.Tests/DevHive.Services.Tests/LanguageService.Tests.cs +++ /dev/null @@ -1,262 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using DevHive.Services.Models.Language; -using DevHive.Services.Services; -using Moq; -using NUnit.Framework; - -namespace DevHive.Services.Tests -{ - [TestFixture] - public class LanguageServiceTests - { - private Mock LanguageRepositoryMock { get; set; } - private Mock MapperMock { get; set; } - private LanguageService LanguageService { get; set; } - - #region SetUps - [SetUp] - public void SetUp() - { - this.LanguageRepositoryMock = new Mock(); - this.MapperMock = new Mock(); - this.LanguageService = new LanguageService(this.LanguageRepositoryMock.Object, this.MapperMock.Object); - } - #endregion - - #region CreateLanguage - [Test] - public async Task CreateLanguage_ReturnsNonEmptyGuid_WhenEntityIsAddedSuccessfully() - { - string technologyName = "Gosho Trapov"; - Guid id = Guid.NewGuid(); - CreateLanguageServiceModel createLanguageServiceModel = new CreateLanguageServiceModel - { - Name = technologyName - }; - Language language = new Language - { - Name = technologyName, - Id = id - }; - - this.LanguageRepositoryMock.Setup(p => p.DoesLanguageNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - this.LanguageRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.LanguageRepositoryMock.Setup(p => p.GetByNameAsync(It.IsAny())).Returns(Task.FromResult(language)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(language); - - Guid result = await this.LanguageService.CreateLanguage(createLanguageServiceModel); - - Assert.AreEqual(id, result); - } - - [Test] - public async Task CreateLanguage_ReturnsEmptyGuid_WhenEntityIsNotAddedSuccessfully() - { - string languageName = "Gosho Trapov"; - - CreateLanguageServiceModel createLanguageServiceModel = new CreateLanguageServiceModel - { - Name = languageName - }; - Language language = new Language - { - Name = languageName - }; - - this.LanguageRepositoryMock.Setup(p => p.DoesLanguageNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - this.LanguageRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(false)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(language); - - Guid result = await this.LanguageService.CreateLanguage(createLanguageServiceModel); - - Assert.IsTrue(result == Guid.Empty); - - } - - [Test] - public void CreateLanguage_ThrowsArgumentException_WhenEntityAlreadyExists() - { - string exceptionMessage = "Language already exists!"; - string languageName = "Gosho Trapov"; - - CreateLanguageServiceModel createLanguageServiceModel = new CreateLanguageServiceModel - { - Name = languageName - }; - Language language = new Language - { - Name = languageName - }; - - this.LanguageRepositoryMock.Setup(p => p.DoesLanguageNameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - - Exception ex = Assert.ThrowsAsync(() => this.LanguageService.CreateLanguage(createLanguageServiceModel)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - - #region GetLanguageById - [Test] - public async Task GetLanguageById_ReturnsTheLanguage_WhenItExists() - { - Guid id = new Guid(); - string name = "Gosho Trapov"; - Language language = new Language - { - Name = name - }; - ReadLanguageServiceModel readLanguageServiceModel = new ReadLanguageServiceModel - { - Name = name - }; - - this.LanguageRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(language)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readLanguageServiceModel); - - ReadLanguageServiceModel result = await this.LanguageService.GetLanguageById(id); - - Assert.AreEqual(name, result.Name); - } - - [Test] - public void GetLanguageById_ThrowsException_WhenLanguageDoesNotExist() - { - string exceptionMessage = "The language does not exist"; - Guid id = new Guid(); - this.LanguageRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); - - Exception ex = Assert.ThrowsAsync(() => this.LanguageService.GetLanguageById(id)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - - #region GetLanguages - [Test] - public void GetLanguages_ReturnsAllLanguages_IfAnyExist() - { - ReadLanguageServiceModel firstLanguage = new ReadLanguageServiceModel(); - ReadLanguageServiceModel secondLanguage = new ReadLanguageServiceModel(); - HashSet languges = new HashSet(); - languges.Add(firstLanguage); - languges.Add(secondLanguage); - - this.LanguageRepositoryMock.Setup(p => p.GetLanguages()).Returns(new HashSet()); - this.MapperMock.Setup(p => p.Map>(It.IsAny>())).Returns(languges); - - HashSet result = this.LanguageService.GetLanguages(); - - Assert.GreaterOrEqual(2, result.Count, "GetLanguages does not return all languages"); - } - - [Test] - public void GetLanguages_ReturnsEmptyHashSet_IfNoLanguagesExist() - { - this.LanguageRepositoryMock.Setup(p => p.GetLanguages()).Returns(new HashSet()); - this.MapperMock.Setup(p => p.Map>(It.IsAny>())).Returns(new HashSet()); - - HashSet result = this.LanguageService.GetLanguages(); - - Assert.IsEmpty(result, "GetLanguages does not return empty string when no languages exist"); - } - #endregion - - #region UpdateLanguage - [Test] - [TestCase(true)] - [TestCase(false)] - public async Task UpdateLanguage_ReturnsIfUpdateIsSuccessfull_WhenLanguageExistsy(bool shouldPass) - { - string name = "Gosho Trapov"; - Guid id = Guid.NewGuid(); - Language language = new Language - { - Name = name, - Id = id - }; - UpdateLanguageServiceModel updateLanguageServiceModel = new UpdateLanguageServiceModel - { - Name = name, - }; - - this.LanguageRepositoryMock.Setup(p => p.DoesLanguageExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.LanguageRepositoryMock.Setup(p => p.DoesLanguageNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - this.LanguageRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(shouldPass)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(language); - - bool result = await this.LanguageService.UpdateLanguage(updateLanguageServiceModel); - - Assert.AreEqual(shouldPass, result); - } - - [Test] - public void UpdateLanguage_ThrowsArgumentException_WhenLanguageDoesNotExist() - { - string exceptionMessage = "Language does not exist!"; - UpdateLanguageServiceModel updateTechnologyServiceModel = new UpdateLanguageServiceModel - { - }; - - this.LanguageRepositoryMock.Setup(p => p.DoesLanguageExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - - Exception ex = Assert.ThrowsAsync(() => this.LanguageService.UpdateLanguage(updateTechnologyServiceModel)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - - [Test] - public void UpdateLanguage_ThrowsException_WhenLanguageNameAlreadyExists() - { - string exceptionMessage = "Language name already exists in our data base!"; - UpdateLanguageServiceModel updateTechnologyServiceModel = new UpdateLanguageServiceModel - { - }; - - this.LanguageRepositoryMock.Setup(p => p.DoesLanguageExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.LanguageRepositoryMock.Setup(p => p.DoesLanguageNameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - - Exception ex = Assert.ThrowsAsync(() => this.LanguageService.UpdateLanguage(updateTechnologyServiceModel)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - - #region DeleteLanguage - [Test] - [TestCase(true)] - [TestCase(false)] - public async Task DeleteLanguage_ShouldReturnIfDeletionIsSuccessfull_WhenLanguageExists(bool shouldPass) - { - Guid id = new Guid(); - Language language = new Language(); - - this.LanguageRepositoryMock.Setup(p => p.DoesLanguageExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.LanguageRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(language)); - this.LanguageRepositoryMock.Setup(p => p.DeleteAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); - - bool result = await this.LanguageService.DeleteLanguage(id); - - Assert.AreEqual(shouldPass, result); - } - - [Test] - public void DeleteLanguage_ThrowsException_WhenLanguageDoesNotExist() - { - string exceptionMessage = "Language does not exist!"; - Guid id = new Guid(); - - this.LanguageRepositoryMock.Setup(p => p.DoesLanguageExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - - Exception ex = Assert.ThrowsAsync(() => this.LanguageService.DeleteLanguage(id)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Services.Tests/PostService.Tests.cs b/src/DevHive.Tests/DevHive.Services.Tests/PostService.Tests.cs deleted file mode 100644 index 900608c..0000000 --- a/src/DevHive.Tests/DevHive.Services.Tests/PostService.Tests.cs +++ /dev/null @@ -1,271 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Post; -using DevHive.Services.Services; -using Microsoft.AspNetCore.Http; -using Moq; -using NUnit.Framework; - -namespace DevHive.Services.Tests -{ - [TestFixture] - public class PostServiceTests - { - private const string MESSAGE = "Gosho Trapov"; - private Mock CloudServiceMock { get; set; } - private Mock PostRepositoryMock { get; set; } - private Mock CommentRepositoryMock { get; set; } - private Mock UserRepositoryMock { get; set; } - private Mock MapperMock { get; set; } - private PostService PostService { get; set; } - - #region SetUps - [SetUp] - public void Setup() - { - this.PostRepositoryMock = new Mock(); - this.CloudServiceMock = new Mock(); - this.UserRepositoryMock = new Mock(); - this.CommentRepositoryMock = new Mock(); - this.MapperMock = new Mock(); - this.PostService = new PostService(this.CloudServiceMock.Object, this.UserRepositoryMock.Object, this.PostRepositoryMock.Object, this.CommentRepositoryMock.Object, this.MapperMock.Object); - } - #endregion - - #region CreatePost - [Test] - public async Task CreatePost_ReturnsIdOfThePost_WhenItIsSuccessfullyCreated() - { - Guid postId = Guid.NewGuid(); - User creator = new User { Id = Guid.NewGuid() }; - CreatePostServiceModel createPostServiceModel = new CreatePostServiceModel - { - Files = new List() - }; - Post post = new Post - { - Message = MESSAGE, - Id = postId, - }; - - this.PostRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.PostRepositoryMock.Setup(p => p.GetPostByCreatorAndTimeCreatedAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(post)); - this.UserRepositoryMock.Setup(p => p.DoesUserExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(creator)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(post); - - Guid result = await this.PostService.CreatePost(createPostServiceModel); - - Assert.AreEqual(postId, result, "CreatePost does not return the correct id"); - } - - [Test] - public async Task CreatePost_ReturnsEmptyGuid_WhenItIsNotSuccessfullyCreated() - { - CreatePostServiceModel createPostServiceModel = new CreatePostServiceModel - { - Files = new List() - }; - Post post = new Post - { - Message = MESSAGE, - }; - - this.PostRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(false)); - this.UserRepositoryMock.Setup(p => p.DoesUserExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(post); - - Guid result = await this.PostService.CreatePost(createPostServiceModel); - - Assert.AreEqual(Guid.Empty, result, "CreatePost does not return empty id"); - } - - [Test] - public void CreatePost_ThrowsException_WhenUserDoesNotExist() - { - const string EXCEPTION_MESSAGE = "User does not exist!"; - CreatePostServiceModel createPostServiceModel = new CreatePostServiceModel - { - }; - Post post = new Post - { - Message = MESSAGE, - }; - - Exception ex = Assert.ThrowsAsync(() => this.PostService.CreatePost(createPostServiceModel), "CreatePost does not throw excpeion when the user does not exist"); - - Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Excapetion message is not correct"); - } - #endregion - - #region GetPostById - [Test] - public async Task GetPostById_ReturnsThePost_WhenItExists() - { - Guid creatorId = new Guid(); - User creator = new User { Id = creatorId }; - Post post = new Post - { - Message = MESSAGE, - Creator = creator - }; - ReadPostServiceModel readPostServiceModel = new ReadPostServiceModel - { - Message = MESSAGE - }; - User user = new User - { - Id = creatorId, - }; - - this.PostRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(post)); - this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readPostServiceModel); - - ReadPostServiceModel result = await this.PostService.GetPostById(new Guid()); - - Assert.AreEqual(MESSAGE, result.Message); - } - - [Test] - public void GetPostById_ThorwsException_WhenTheUserDoesNotExist() - { - const string EXCEPTION_MESSAGE = "The user does not exist!"; - Guid creatorId = new Guid(); - User creator = new User { Id = creatorId }; - Post post = new Post - { - Message = MESSAGE, - Creator = creator - }; - - this.PostRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(post)); - - Exception ex = Assert.ThrowsAsync(() => this.PostService.GetPostById(new Guid()), "GetPostById does not throw exception when the user does not exist"); - - Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message); - } - - [Test] - public void GetPostById_ThrowsException_WhenCommentDoesNotExist() - { - string exceptionMessage = "The post does not exist!"; - Guid creatorId = new Guid(); - User user = new User - { - Id = creatorId, - }; - - this.PostRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); - this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); - - Exception ex = Assert.ThrowsAsync(() => this.PostService.GetPostById(new Guid())); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - - #region UpdatePost - [Test] - public async Task UpdatePost_ReturnsTheIdOfThePost_WhenUpdatedSuccessfully() - { - Guid id = Guid.NewGuid(); - Post post = new Post - { - Id = id, - Message = MESSAGE - }; - UpdatePostServiceModel updatePostServiceModel = new UpdatePostServiceModel - { - PostId = id, - NewMessage = MESSAGE, - Files = new List() - }; - - this.PostRepositoryMock.Setup(p => p.DoesPostExist(It.IsAny())).Returns(Task.FromResult(true)); - this.PostRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - this.PostRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(post)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(post); - - Guid result = await this.PostService.UpdatePost(updatePostServiceModel); - - Assert.AreEqual(updatePostServiceModel.PostId, result); - } - - [Test] - public async Task UpdatePost_ReturnsEmptyId_WhenThePostIsNotUpdatedSuccessfully() - { - Post post = new Post - { - Message = MESSAGE - }; - UpdatePostServiceModel updatePostServiceModel = new UpdatePostServiceModel - { - PostId = Guid.NewGuid(), - NewMessage = MESSAGE, - Files = new List() - }; - - this.PostRepositoryMock.Setup(p => p.DoesPostExist(It.IsAny())).Returns(Task.FromResult(true)); - this.PostRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(post); - - Guid result = await this.PostService.UpdatePost(updatePostServiceModel); - - Assert.AreEqual(Guid.Empty, result); - } - - [Test] - public void UpdatePost_ThrowsArgumentException_WhenCommentDoesNotExist() - { - string exceptionMessage = "Post does not exist!"; - UpdatePostServiceModel updatePostServiceModel = new UpdatePostServiceModel - { - }; - - this.PostRepositoryMock.Setup(p => p.DoesPostExist(It.IsAny())).Returns(Task.FromResult(false)); - - Exception ex = Assert.ThrowsAsync(() => this.PostService.UpdatePost(updatePostServiceModel)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - - #region DeletePost - [Test] - [TestCase(true)] - [TestCase(false)] - public async Task Deletepost_ShouldReturnIfDeletionIsSuccessfull_WhenPostExists(bool shouldPass) - { - Guid id = new Guid(); - Post post = new Post(); - - this.PostRepositoryMock.Setup(p => p.DoesPostExist(It.IsAny())).Returns(Task.FromResult(true)); - this.PostRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(post)); - this.PostRepositoryMock.Setup(p => p.DeleteAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); - - bool result = await this.PostService.DeletePost(id); - - Assert.AreEqual(shouldPass, result); - } - - [Test] - public void DeletePost_ThrowsException_WhenPostDoesNotExist() - { - string exceptionMessage = "Post does not exist!"; - Guid id = new Guid(); - - this.PostRepositoryMock.Setup(p => p.DoesPostExist(It.IsAny())).Returns(Task.FromResult(false)); - - Exception ex = Assert.ThrowsAsync(() => this.PostService.DeletePost(id)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Services.Tests/RoleService.Tests.cs b/src/DevHive.Tests/DevHive.Services.Tests/RoleService.Tests.cs deleted file mode 100644 index e500dd1..0000000 --- a/src/DevHive.Tests/DevHive.Services.Tests/RoleService.Tests.cs +++ /dev/null @@ -1,230 +0,0 @@ -using System; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using DevHive.Services.Models.Identity.Role; -using DevHive.Services.Services; -using Moq; -using NUnit.Framework; - -namespace DevHive.Services.Tests -{ - [TestFixture] - public class RoleServiceTests - { - private Mock RoleRepositoryMock { get; set; } - private Mock MapperMock { get; set; } - private RoleService RoleService { get; set; } - - #region SetUps - [SetUp] - public void Setup() - { - this.RoleRepositoryMock = new Mock(); - this.MapperMock = new Mock(); - this.RoleService = new RoleService(this.RoleRepositoryMock.Object, this.MapperMock.Object); - } - #endregion - - #region CreateRole - [Test] - public async Task CreateRole_ReturnsNonEmptyGuid_WhenEntityIsAddedSuccessfully() - { - string roleName = "Gosho Trapov"; - Guid id = Guid.NewGuid(); - CreateRoleServiceModel createRoleServiceModel = new CreateRoleServiceModel - { - Name = roleName - }; - Role role = new() - { - Name = roleName, - Id = id - }; - - this.RoleRepositoryMock.Setup(p => p.DoesNameExist(It.IsAny())).Returns(Task.FromResult(false)); - this.RoleRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.RoleRepositoryMock.Setup(p => p.GetByNameAsync(It.IsAny())).Returns(Task.FromResult(role)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(role); - - Guid result = await this.RoleService.CreateRole(createRoleServiceModel); - - Assert.AreEqual(id, result); - } - - [Test] - public async Task CreateRoley_ReturnsEmptyGuid_WhenEntityIsNotAddedSuccessfully() - { - string roleName = "Gosho Trapov"; - - CreateRoleServiceModel createRoleServiceModel = new CreateRoleServiceModel - { - Name = roleName - }; - Role role = new Role - { - Name = roleName - }; - - this.RoleRepositoryMock.Setup(p => p.DoesNameExist(It.IsAny())).Returns(Task.FromResult(false)); - this.RoleRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(false)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(role); - - Guid result = await this.RoleService.CreateRole(createRoleServiceModel); - - Assert.IsTrue(result == Guid.Empty); - } - - [Test] - public void CreateTechnology_ThrowsArgumentException_WhenEntityAlreadyExists() - { - string exceptionMessage = "Role already exists!"; - string roleName = "Gosho Trapov"; - - CreateRoleServiceModel createRoleServiceModel = new CreateRoleServiceModel - { - Name = roleName - }; - Role role = new Role - { - Name = roleName - }; - - this.RoleRepositoryMock.Setup(p => p.DoesNameExist(It.IsAny())).Returns(Task.FromResult(true)); - - Exception ex = Assert.ThrowsAsync(() => this.RoleService.CreateRole(createRoleServiceModel)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - - #region GetRoleById - [Test] - public async Task GetRoleById_ReturnsTheRole_WhenItExists() - { - Guid id = new Guid(); - string name = "Gosho Trapov"; - Role role = new Role - { - Name = name - }; - RoleServiceModel roleServiceModel = new RoleServiceModel - { - Name = name - }; - - this.RoleRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(role)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(roleServiceModel); - - RoleServiceModel result = await this.RoleService.GetRoleById(id); - - Assert.AreEqual(name, result.Name); - } - - [Test] - public void GetRoleById_ThrowsException_WhenRoleDoesNotExist() - { - string exceptionMessage = "Role does not exist!"; - Guid id = new Guid(); - this.RoleRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); - - Exception ex = Assert.ThrowsAsync(() => this.RoleService.GetRoleById(id)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - - #region UpdateRole - [Test] - [TestCase(true)] - [TestCase(false)] - public async Task UpdateRole_ReturnsIfUpdateIsSuccessfull_WhenRoleExistsy(bool shouldPass) - { - string name = "Gosho Trapov"; - Guid id = Guid.NewGuid(); - Role role = new Role - { - Name = name, - Id = id - }; - UpdateRoleServiceModel updateRoleServiceModel = new UpdateRoleServiceModel - { - Name = name, - }; - - this.RoleRepositoryMock.Setup(p => p.DoesRoleExist(It.IsAny())).Returns(Task.FromResult(true)); - this.RoleRepositoryMock.Setup(p => p.DoesNameExist(It.IsAny())).Returns(Task.FromResult(false)); - this.RoleRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(shouldPass)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(role); - - bool result = await this.RoleService.UpdateRole(updateRoleServiceModel); - - Assert.AreEqual(shouldPass, result); - } - - [Test] - public void UpdateRole_ThrowsException_WhenRoleDoesNotExist() - { - string exceptionMessage = "Role does not exist!"; - UpdateRoleServiceModel updateRoleServiceModel = new UpdateRoleServiceModel - { - }; - - this.RoleRepositoryMock.Setup(p => p.DoesRoleExist(It.IsAny())).Returns(Task.FromResult(false)); - - Exception ex = Assert.ThrowsAsync(() => this.RoleService.UpdateRole(updateRoleServiceModel)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - - [Test] - public void UpdateRole_ThrowsException_WhenRoleNameAlreadyExists() - { - string exceptionMessage = "Role name already exists!"; - UpdateRoleServiceModel updateRoleServiceModel = new UpdateRoleServiceModel - { - }; - - this.RoleRepositoryMock.Setup(p => p.DoesRoleExist(It.IsAny())).Returns(Task.FromResult(true)); - this.RoleRepositoryMock.Setup(p => p.DoesNameExist(It.IsAny())).Returns(Task.FromResult(true)); - - Exception ex = Assert.ThrowsAsync(() => this.RoleService.UpdateRole(updateRoleServiceModel)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - - #region DeleteRole - [Test] - [TestCase(true)] - [TestCase(false)] - public async Task DeleteRole_ShouldReturnIfDeletionIsSuccessfull_WhenRoleExists(bool shouldPass) - { - Guid id = new Guid(); - Role role = new Role(); - - this.RoleRepositoryMock.Setup(p => p.DoesRoleExist(It.IsAny())).Returns(Task.FromResult(true)); - this.RoleRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(role)); - this.RoleRepositoryMock.Setup(p => p.DeleteAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); - - bool result = await this.RoleService.DeleteRole(id); - - Assert.AreEqual(shouldPass, result); - } - - [Test] - public void DeleteRole_ThrowsException_WhenRoleDoesNotExist() - { - string exceptionMessage = "Role does not exist!"; - Guid id = new Guid(); - - this.RoleRepositoryMock.Setup(p => p.DoesRoleExist(It.IsAny())).Returns(Task.FromResult(false)); - - Exception ex = Assert.ThrowsAsync(() => this.RoleService.DeleteRole(id)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Services.Tests/TechnologyServices.Tests.cs b/src/DevHive.Tests/DevHive.Services.Tests/TechnologyServices.Tests.cs deleted file mode 100644 index e671adb..0000000 --- a/src/DevHive.Tests/DevHive.Services.Tests/TechnologyServices.Tests.cs +++ /dev/null @@ -1,262 +0,0 @@ -using AutoMapper; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using DevHive.Services.Models.Technology; -using DevHive.Services.Services; -using Moq; -using NUnit.Framework; -using System; -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace DevHive.Services.Tests -{ - [TestFixture] - public class TechnologyServicesTests - { - private Mock TechnologyRepositoryMock { get; set; } - private Mock MapperMock { get; set; } - private TechnologyService TechnologyService { get; set; } - - #region SetUps - [SetUp] - public void Setup() - { - this.TechnologyRepositoryMock = new Mock(); - this.MapperMock = new Mock(); - this.TechnologyService = new TechnologyService(this.TechnologyRepositoryMock.Object, this.MapperMock.Object); - } - #endregion - - #region CreateTechnology - [Test] - public async Task CreateTechnology_ReturnsNonEmptyGuid_WhenEntityIsAddedSuccessfully() - { - string technologyName = "Gosho Trapov"; - Guid id = Guid.NewGuid(); - CreateTechnologyServiceModel createTechnologyServiceModel = new() - { - Name = technologyName - }; - Technology technology = new() - { - Name = technologyName, - Id = id - }; - - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - this.TechnologyRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.TechnologyRepositoryMock.Setup(p => p.GetByNameAsync(It.IsAny())).Returns(Task.FromResult(technology)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(technology); - - Guid result = await this.TechnologyService.CreateTechnology(createTechnologyServiceModel); - - Assert.AreEqual(id, result); - } - - [Test] - public async Task CreateTechnology_ReturnsEmptyGuid_WhenEntityIsNotAddedSuccessfully() - { - string technologyName = "Gosho Trapov"; - - CreateTechnologyServiceModel createTechnologyServiceModel = new() - { - Name = technologyName - }; - Technology technology = new() - { - Name = technologyName - }; - - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - this.TechnologyRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(false)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(technology); - - Guid result = await this.TechnologyService.CreateTechnology(createTechnologyServiceModel); - - Assert.IsTrue(result == Guid.Empty); - } - - [Test] - public void CreateTechnology_ThrowsArgumentException_WhenEntityAlreadyExists() - { - string exceptionMessage = "Technology already exists!"; - string technologyName = "Gosho Trapov"; - - CreateTechnologyServiceModel createTechnologyServiceModel = new() - { - Name = technologyName - }; - Technology technology = new() - { - Name = technologyName - }; - - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - - Exception ex = Assert.ThrowsAsync(() => this.TechnologyService.CreateTechnology(createTechnologyServiceModel)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - - #region GetTechnologyById - [Test] - public async Task GetTechnologyById_ReturnsTheTechnology_WhenItExists() - { - Guid id = new Guid(); - string name = "Gosho Trapov"; - Technology technology = new() - { - Name = name - }; - ReadTechnologyServiceModel readTechnologyServiceModel = new() - { - Name = name - }; - - this.TechnologyRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(technology)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readTechnologyServiceModel); - - ReadTechnologyServiceModel result = await this.TechnologyService.GetTechnologyById(id); - - Assert.AreEqual(name, result.Name); - } - - [Test] - public void GetTechnologyById_ThrowsException_WhenTechnologyDoesNotExist() - { - string exceptionMessage = "The technology does not exist"; - Guid id = new Guid(); - this.TechnologyRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); - - Exception ex = Assert.ThrowsAsync(() => this.TechnologyService.GetTechnologyById(id)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - - #region GetTechnologies - [Test] - public void GetTechnologies_ReturnsAllLanguages_IfAnyExist() - { - ReadTechnologyServiceModel firstTechnology = new ReadTechnologyServiceModel(); - ReadTechnologyServiceModel secondTechnology = new ReadTechnologyServiceModel(); - HashSet technologies = new HashSet(); - technologies.Add(firstTechnology); - technologies.Add(secondTechnology); - - this.TechnologyRepositoryMock.Setup(p => p.GetTechnologies()).Returns(new HashSet()); - this.MapperMock.Setup(p => p.Map>(It.IsAny>())).Returns(technologies); - - HashSet result = this.TechnologyService.GetTechnologies(); - - Assert.GreaterOrEqual(2, result.Count, "GetTechnologies does not return all technologies"); - } - - [Test] - public void GetLanguages_ReturnsEmptyHashSet_IfNoLanguagesExist() - { - this.TechnologyRepositoryMock.Setup(p => p.GetTechnologies()).Returns(new HashSet()); - this.MapperMock.Setup(p => p.Map>(It.IsAny>())).Returns(new HashSet()); - - HashSet result = this.TechnologyService.GetTechnologies(); - - Assert.IsEmpty(result, "GetTechnologies does not return empty string when no technologies exist"); - } - #endregion - - #region UpdateTechnology - [Test] - [TestCase(true)] - [TestCase(false)] - public async Task UpdateTechnology_ReturnsIfUpdateIsSuccessfull_WhenTechnologyExistsy(bool shouldPass) - { - string name = "Gosho Trapov"; - Guid id = Guid.NewGuid(); - Technology technology = new Technology - { - Name = name, - Id = id - }; - UpdateTechnologyServiceModel updatetechnologyServiceModel = new UpdateTechnologyServiceModel - { - Name = name, - }; - - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - this.TechnologyRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(shouldPass)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(technology); - - bool result = await this.TechnologyService.UpdateTechnology(updatetechnologyServiceModel); - - Assert.AreEqual(shouldPass, result); - } - - [Test] - public void UpdateTechnology_ThrowsException_WhenTechnologyDoesNotExist() - { - string exceptionMessage = "Technology does not exist!"; - UpdateTechnologyServiceModel updateTechnologyServiceModel = new UpdateTechnologyServiceModel - { - }; - - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - - Exception ex = Assert.ThrowsAsync(() => this.TechnologyService.UpdateTechnology(updateTechnologyServiceModel)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - - [Test] - public void UpdateTechnology_ThrowsException_WhenTechnologyNameAlreadyExists() - { - string exceptionMessage = "Technology name already exists!"; - UpdateTechnologyServiceModel updateTechnologyServiceModel = new UpdateTechnologyServiceModel - { - }; - - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - - Exception ex = Assert.ThrowsAsync(() => this.TechnologyService.UpdateTechnology(updateTechnologyServiceModel)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - - #region DeleteTechnology - - [Test] - [TestCase(true)] - [TestCase(false)] - public async Task DeleteTechnology_ShouldReturnIfDeletionIsSuccessfull_WhenTechnologyExists(bool shouldPass) - { - Guid id = new Guid(); - Technology technology = new Technology(); - - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.TechnologyRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(technology)); - this.TechnologyRepositoryMock.Setup(p => p.DeleteAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); - - bool result = await this.TechnologyService.DeleteTechnology(id); - - Assert.AreEqual(shouldPass, result); - } - - [Test] - public void DeleteTechnology_ThrowsException_WhenTechnologyDoesNotExist() - { - string exceptionMessage = "Technology does not exist!"; - Guid id = new Guid(); - - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - - Exception ex = Assert.ThrowsAsync(() => this.TechnologyService.DeleteTechnology(id)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Services.Tests/UserService.Tests.cs b/src/DevHive.Tests/DevHive.Services.Tests/UserService.Tests.cs deleted file mode 100644 index 21d4862..0000000 --- a/src/DevHive.Tests/DevHive.Services.Tests/UserService.Tests.cs +++ /dev/null @@ -1,394 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IdentityModel.Tokens.Jwt; -using System.Security.Claims; -using System.Text; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Common.Models.Identity; -using DevHive.Common.Models.Misc; -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Models; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Identity.User; -using DevHive.Services.Options; -using DevHive.Services.Services; -using Microsoft.AspNetCore.Identity; -using Microsoft.IdentityModel.Tokens; -using Moq; -using NUnit.Framework; - -namespace DevHive.Services.Tests -{ - [TestFixture] - public class UserServiceTests - { - private Mock CloudServiceMock { get; set; } - private Mock UserRepositoryMock { get; set; } - private Mock RoleRepositoryMock { get; set; } - private Mock LanguageRepositoryMock { get; set; } - private Mock TechnologyRepositoryMock { get; set; } - private Mock MapperMock { get; set; } - private JWTOptions JWTOptions { get; set; } - private UserService UserService { get; set; } - - #region SetUps - [SetUp] - public void Setup() - { - this.UserRepositoryMock = new Mock(); - this.RoleRepositoryMock = new Mock(); - this.CloudServiceMock = new Mock(); - this.LanguageRepositoryMock = new Mock(); - this.TechnologyRepositoryMock = new Mock(); - this.JWTOptions = new JWTOptions("gXfQlU6qpDleFWyimscjYcT3tgFsQg3yoFjcvSLxG56n1Vu2yptdIUq254wlJWjm"); - this.MapperMock = new Mock(); - // TODO: give actual UserManager and RoleManager to UserService - this.UserService = new UserService(this.UserRepositoryMock.Object, this.LanguageRepositoryMock.Object, this.RoleRepositoryMock.Object, this.TechnologyRepositoryMock.Object, null, null, this.MapperMock.Object, this.JWTOptions, this.CloudServiceMock.Object); - } - #endregion - - #region LoginUser - [Test] - public async Task LoginUser_ReturnsTokenModel_WhenLoggingUserIn() - { - string somePassword = "GoshoTrapovImaGolemChep"; - const string name = "GoshoTrapov"; - string hashedPassword = PasswordModifications.GeneratePasswordHash(somePassword); - LoginServiceModel loginServiceModel = new LoginServiceModel - { - Password = somePassword - }; - User user = new User - { - Id = Guid.NewGuid(), - PasswordHash = hashedPassword, - UserName = name - }; - - this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.UserRepositoryMock.Setup(p => p.GetByUsernameAsync(It.IsAny())).Returns(Task.FromResult(user)); - - string JWTSecurityToken = this.WriteJWTSecurityToken(user.Id, user.UserName, user.Roles); - - TokenModel tokenModel = await this.UserService.LoginUser(loginServiceModel); - - Assert.AreEqual(JWTSecurityToken, tokenModel.Token, "LoginUser does not return the correct token"); - } - - [Test] - public void LoginUser_ThrowsException_WhenUserNameDoesNotExist() - { - const string EXCEPTION_MESSAGE = "Invalid username!"; - LoginServiceModel loginServiceModel = new LoginServiceModel - { - }; - - this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - - Exception ex = Assert.ThrowsAsync(() => this.UserService.LoginUser(loginServiceModel)); - - Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorect Exception message"); - } - - [Test] - public void LoginUser_ThroiwsException_WhenPasswordIsIncorect() - { - const string EXCEPTION_MESSAGE = "Incorrect password!"; - string somePassword = "GoshoTrapovImaGolemChep"; - LoginServiceModel loginServiceModel = new LoginServiceModel - { - Password = somePassword - }; - User user = new User - { - Id = Guid.NewGuid(), - PasswordHash = "InvalidPasswordHas" - }; - - this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.UserRepositoryMock.Setup(p => p.GetByUsernameAsync(It.IsAny())).Returns(Task.FromResult(user)); - - Exception ex = Assert.ThrowsAsync(() => this.UserService.LoginUser(loginServiceModel)); - - Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorect Exception message"); - } - #endregion - - #region RegisterUser - // [Test] - // public async Task RegisterUser_ReturnsTokenModel_WhenUserIsSuccessfull() - // { - // string somePassword = "GoshoTrapovImaGolemChep"; - // const string name = "GoshoTrapov"; - // RegisterServiceModel registerServiceModel = new RegisterServiceModel - // { - // Password = somePassword - // }; - // User user = new User - // { - // Id = Guid.NewGuid(), - // UserName = name - // }; - // Role role = new Role { Name = Role.DefaultRole }; - // HashSet roles = new HashSet { role }; - // - // this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - // this.UserRepositoryMock.Setup(p => p.DoesEmailExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - // this.RoleRepositoryMock.Setup(p => p.DoesNameExist(It.IsAny())).Returns(Task.FromResult(true)); - // this.RoleRepositoryMock.Setup(p => p.GetByNameAsync(It.IsAny())).Returns(Task.FromResult(role)); - // this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(user); - // this.UserRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Verifiable(); - // - // string JWTSecurityToken = this.WriteJWTSecurityToken(user.Id, user.UserName, roles); - // - // TokenModel tokenModel = await this.UserService.RegisterUser(registerServiceModel); - // - // Mock.Verify(); - // Assert.AreEqual(JWTSecurityToken, tokenModel.Token, "RegisterUser does not return the correct token"); - // } - - [Test] - public void RegisterUser_ThrowsException_WhenUsernameAlreadyExists() - { - const string EXCEPTION_MESSAGE = "Username already exists!"; - RegisterServiceModel registerServiceModel = new RegisterServiceModel - { - }; - - this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - - Exception ex = Assert.ThrowsAsync(() => this.UserService.RegisterUser(registerServiceModel)); - - Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorect Exception message"); - } - - [Test] - public void RegisterUser_ThrowsException_WhenEmailAlreadyExists() - { - const string EXCEPTION_MESSAGE = "Email already exists!"; - - RegisterServiceModel registerServiceModel = new RegisterServiceModel - { - }; - - this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - this.UserRepositoryMock.Setup(p => p.DoesEmailExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - - Exception ex = Assert.ThrowsAsync(() => this.UserService.RegisterUser(registerServiceModel)); - - Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorect Exception message"); - } - #endregion - - #region GetUserById - [Test] - public async Task GetUserById_ReturnsTheUser_WhenItExists() - { - Guid id = new Guid(); - string name = "Gosho Trapov"; - User user = new() - { - }; - UserServiceModel userServiceModel = new UserServiceModel - { - UserName = name - }; - - this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(userServiceModel); - - UserServiceModel result = await this.UserService.GetUserById(id); - - Assert.AreEqual(name, result.UserName); - } - - [Test] - public void GetTechnologyById_ThrowsException_WhenTechnologyDoesNotExist() - { - const string EXCEPTION_MESSEGE = "User does not exist!"; - Guid id = new Guid(); - this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); - - Exception ex = Assert.ThrowsAsync(() => this.UserService.GetUserById(id)); - - Assert.AreEqual(EXCEPTION_MESSEGE, ex.Message, "Incorecct exception message"); - } - #endregion - - #region GetUserByUsername - [Test] - public async Task GetUserByUsername_ReturnsTheCorrectUser_IfItExists() - { - string username = "Gosho Trapov"; - User user = new User(); - UserServiceModel userServiceModel = new UserServiceModel - { - UserName = username - }; - - this.UserRepositoryMock.Setup(p => p.GetByUsernameAsync(It.IsAny())).Returns(Task.FromResult(user)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(userServiceModel); - - UserServiceModel result = await this.UserService.GetUserByUsername(username); - - Assert.AreEqual(username, result.UserName, "GetUserByUsername does not return the correct user"); - } - - [Test] - public async Task GetUserByUsername_ThrowsException_IfUserDoesNotExist() - { - string username = "Gosho Trapov"; - const string EXCEPTION_MESSEGE = "User does not exist!"; - - this.UserRepositoryMock.Setup(p => p.GetByUsernameAsync(It.IsAny())).Returns(Task.FromResult(null)); - - Exception ex = Assert.ThrowsAsync(() => this.UserService.GetUserByUsername(username)); - - Assert.AreEqual(EXCEPTION_MESSEGE, ex.Message, "Incorecct exception message"); - } - #endregion - - #region UpdateUser - // [Test] - // [TestCase(true)] - // [TestCase(false)] - // public async Task UpdateUser_ReturnsIfUpdateIsSuccessfull_WhenUserExistsy(bool shouldPass) - // { - // string name = "Gosho Trapov"; - // Guid id = Guid.NewGuid(); - // User user = new User - // { - // UserName = name, - // Id = id, - // }; - // UpdateUserServiceModel updateUserServiceModel = new UpdateUserServiceModel - // { - // UserName = name, - // }; - // UserServiceModel userServiceModel = new UserServiceModel - // { - // UserName = name, - // }; - // Role role = new Role { }; - // - // this.UserRepositoryMock.Setup(p => p.DoesUserExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - // this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - // this.UserRepositoryMock.Setup(p => p.DoesUserHaveThisUsername(It.IsAny(), It.IsAny())).Returns(true); - // this.UserRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(shouldPass)); - // this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); - // this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(user); - // this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(userServiceModel); - // - // if (shouldPass) - // { - // UserServiceModel result = await this.UserService.UpdateUser(updateUserServiceModel); - // - // Assert.AreEqual(updateUserServiceModel.UserName, result.UserName); - // } - // else - // { - // const string EXCEPTION_MESSAGE = "Unable to edit user!"; - // - // Exception ex = Assert.ThrowsAsync(() => this.UserService.UpdateUser(updateUserServiceModel)); - // - // Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorecct exception message"); - // } - // } - - [Test] - public void UpdateUser_ThrowsException_WhenUserDoesNotExist() - { - const string EXCEPTION_MESSAGE = "User does not exist!"; - UpdateUserServiceModel updateUserServiceModel = new UpdateUserServiceModel - { - }; - - this.UserRepositoryMock.Setup(p => p.DoesUserExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - - Exception ex = Assert.ThrowsAsync(() => this.UserService.UpdateUser(updateUserServiceModel)); - - Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorecct exception message"); - } - - [Test] - public void UpdateUser_ThrowsException_WhenUserNameAlreadyExists() - { - const string EXCEPTION_MESSAGE = "Username already exists!"; - UpdateUserServiceModel updateUserServiceModel = new UpdateUserServiceModel - { - }; - - this.UserRepositoryMock.Setup(p => p.DoesUserExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - - Exception ex = Assert.ThrowsAsync(() => this.UserService.UpdateUser(updateUserServiceModel)); - - Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorecct exception message"); - } - #endregion - - #region DeleteUser - //TO DO: compleate once Viko has looked into the return type of UserService.DeleteUser - // [Test] - // [TestCase(true)] - // [TestCase(false)] - // public async Task DeleteUser_ShouldReturnIfDeletionIsSuccessfull_WhenUserExists(bool shouldPass) - // { - // Guid id = new Guid(); - // User user = new User(); - // - // this.UserRepositoryMock.Setup(p => p.DoesUserExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - // this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); - // this.UserRepositoryMock.Setup(p => p.DeleteAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); - // - // bool result = await this.UserService.DeleteUser(id); - // - // Assert.AreEqual(shouldPass, result); - // } - // - [Test] - public void DeleteUser_ThrowsException_WhenUserDoesNotExist() - { - string exceptionMessage = "User does not exist!"; - Guid id = new Guid(); - - this.UserRepositoryMock.Setup(p => p.DoesUserExistAsync(It.IsAny())).Returns(Task.FromResult(false)); - - Exception ex = Assert.ThrowsAsync(() => this.UserService.DeleteUser(id)); - - Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); - } - #endregion - - #region HelperMethods - private string WriteJWTSecurityToken(Guid userId, string username, HashSet roles) - { - byte[] signingKey = Encoding.ASCII.GetBytes(this.JWTOptions.Secret); - HashSet claims = new() - { - new Claim("ID", $"{userId}"), - new Claim("Username", username), - }; - - foreach (var role in roles) - { - claims.Add(new Claim(ClaimTypes.Role, role.Name)); - } - - SecurityTokenDescriptor tokenDescriptor = new() - { - Subject = new ClaimsIdentity(claims), - Expires = DateTime.Today.AddDays(7), - SigningCredentials = new SigningCredentials( - new SymmetricSecurityKey(signingKey), - SecurityAlgorithms.HmacSha512Signature) - }; - - JwtSecurityTokenHandler tokenHandler = new(); - SecurityToken token = tokenHandler.CreateToken(tokenDescriptor); - return tokenHandler.WriteToken(token); - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Web.Tests/CommentController.Tests.cs b/src/DevHive.Tests/DevHive.Web.Tests/CommentController.Tests.cs deleted file mode 100644 index 3a03f1a..0000000 --- a/src/DevHive.Tests/DevHive.Web.Tests/CommentController.Tests.cs +++ /dev/null @@ -1,256 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Comment; -using DevHive.Web.Controllers; -using DevHive.Web.Models.Comment; -using Microsoft.AspNetCore.Mvc; -using Moq; -using NUnit.Framework; - -namespace DevHive.Web.Tests -{ - [TestFixture] - public class CommentControllerTests - { - const string MESSAGE = "Gosho Trapov"; - private Mock CommentServiceMock { get; set; } - private Mock MapperMock { get; set; } - private CommentController CommentController { get; set; } - - #region Setup - [SetUp] - public void SetUp() - { - this.CommentServiceMock = new Mock(); - this.MapperMock = new Mock(); - this.CommentController = new CommentController(this.CommentServiceMock.Object, this.MapperMock.Object); - } - #endregion - - #region Add - [Test] - public void AddComment_ReturnsOkObjectResult_WhenCommentIsSuccessfullyCreated() - { - Guid id = Guid.NewGuid(); - CreateCommentWebModel createCommentWebModel = new CreateCommentWebModel - { - Message = MESSAGE - }; - CreateCommentServiceModel createCommentServiceModel = new CreateCommentServiceModel - { - Message = MESSAGE - }; - - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createCommentServiceModel); - this.CommentServiceMock.Setup(p => p.AddComment(It.IsAny())).Returns(Task.FromResult(id)); - this.CommentServiceMock.Setup(p => p.ValidateJwtForCreating(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - - IActionResult result = this.CommentController.AddComment(Guid.NewGuid(), createCommentWebModel, null).Result; - - Assert.IsInstanceOf(result); - - var splitted = (result as OkObjectResult).Value - .ToString() - .Split('{', '}', '=', ' ') - .Where(x => !string.IsNullOrEmpty(x)) - .ToArray(); - - Guid resultId = Guid.Parse(splitted[1]); - - Assert.AreEqual(id, resultId); - } - - [Test] - public void AddComment_ReturnsBadRequestObjectResult_WhenCommentIsNotCreatedSuccessfully() - { - Guid id = Guid.NewGuid(); - CreateCommentWebModel createCommentWebModel = new CreateCommentWebModel - { - Message = MESSAGE - }; - CreateCommentServiceModel createCommentServiceModel = new CreateCommentServiceModel - { - Message = MESSAGE - }; - string errorMessage = $"Could not create comment!"; - - - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createCommentServiceModel); - this.CommentServiceMock.Setup(p => p.AddComment(It.IsAny())).Returns(Task.FromResult(Guid.Empty)); - this.CommentServiceMock.Setup(p => p.ValidateJwtForCreating(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - - IActionResult result = this.CommentController.AddComment(Guid.NewGuid(), createCommentWebModel, null).Result; - - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequsetObjectResult = result as BadRequestObjectResult; - string resultMessage = badRequsetObjectResult.Value.ToString(); - - Assert.AreEqual(errorMessage, resultMessage); - } - - [Test] - public void AddComment_ReturnsUnauthorizedResult_WhenUserIsNotAuthorized() - { - Guid id = Guid.NewGuid(); - CreateCommentWebModel createCommentWebModel = new CreateCommentWebModel - { - Message = MESSAGE - }; - - this.CommentServiceMock.Setup(p => p.ValidateJwtForCreating(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); - - IActionResult result = this.CommentController.AddComment(Guid.NewGuid(), createCommentWebModel, null).Result; - - Assert.IsInstanceOf(result); - } - #endregion - - #region Read - [Test] - public void GetById_ReturnsTheComment_WhenItExists() - { - Guid id = Guid.NewGuid(); - - ReadCommentServiceModel readCommentServiceModel = new ReadCommentServiceModel - { - Message = MESSAGE - }; - ReadCommentWebModel readCommentWebModel = new ReadCommentWebModel - { - Message = MESSAGE - }; - - this.CommentServiceMock.Setup(p => p.GetCommentById(It.IsAny())).Returns(Task.FromResult(readCommentServiceModel)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readCommentWebModel); - - IActionResult result = this.CommentController.GetCommentById(id).Result; - - Assert.IsInstanceOf(result); - - OkObjectResult okObjectResult = result as OkObjectResult; - ReadCommentWebModel resultModel = okObjectResult.Value as Models.Comment.ReadCommentWebModel; - - Assert.AreEqual(MESSAGE, resultModel.Message); - } - #endregion - - #region Update - [Test] - public void Update_ShouldReturnOkResult_WhenCommentIsUpdatedSuccessfully() - { - Guid id = Guid.NewGuid(); - UpdateCommentWebModel updateCommentWebModel = new UpdateCommentWebModel - { - NewMessage = MESSAGE - }; - UpdateCommentServiceModel updateCommentServiceModel = new UpdateCommentServiceModel - { - NewMessage = MESSAGE - }; - - this.CommentServiceMock.Setup(p => p.UpdateComment(It.IsAny())).Returns(Task.FromResult(id)); - this.CommentServiceMock.Setup(p => p.ValidateJwtForComment(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateCommentServiceModel); - - IActionResult result = this.CommentController.UpdateComment(Guid.Empty, updateCommentWebModel, null).Result; - - Assert.IsInstanceOf(result); - - OkObjectResult okObjectResult = result as OkObjectResult; - object resultModel = okObjectResult.Value; - string[] resultAsString = resultModel.ToString().Split(' ').ToArray(); - - Assert.AreEqual(id.ToString(), resultAsString[3]); - } - - [Test] - public void Update_ShouldReturnBadObjectResult_WhenCommentIsNotUpdatedSuccessfully() - { - string message = "Unable to update comment!"; - UpdateCommentWebModel updateCommentWebModel = new UpdateCommentWebModel - { - NewMessage = MESSAGE - }; - UpdateCommentServiceModel updateCommentServiceModel = new UpdateCommentServiceModel - { - NewMessage = MESSAGE - }; - - this.CommentServiceMock.Setup(p => p.UpdateComment(It.IsAny())).Returns(Task.FromResult(Guid.Empty)); - this.CommentServiceMock.Setup(p => p.ValidateJwtForComment(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateCommentServiceModel); - - IActionResult result = this.CommentController.UpdateComment(Guid.Empty, updateCommentWebModel, null).Result; - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; - string resultModel = badRequestObjectResult.Value.ToString(); - - Assert.AreEqual(message, resultModel); - } - - [Test] - public void Update_ShouldReturnUnauthorizedResult_WhenUserIsNotAuthorized() - { - UpdateCommentWebModel updateCommentWebModel = new UpdateCommentWebModel - { - NewMessage = MESSAGE - }; - - this.CommentServiceMock.Setup(p => p.ValidateJwtForComment(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); - - IActionResult result = this.CommentController.UpdateComment(Guid.Empty, updateCommentWebModel, null).Result; - - Assert.IsInstanceOf(result); - } - #endregion - - #region Delete - [Test] - public void Delete_ReturnsOkResult_WhenCommentIsDeletedSuccessfully() - { - Guid id = Guid.NewGuid(); - - this.CommentServiceMock.Setup(p => p.DeleteComment(It.IsAny())).Returns(Task.FromResult(true)); - this.CommentServiceMock.Setup(p => p.ValidateJwtForComment(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - - IActionResult result = this.CommentController.DeleteComment(id, null).Result; - - Assert.IsInstanceOf(result); - } - - [Test] - public void DeletComment_ReturnsBadRequestObjectResult_WhenCommentIsNotDeletedSuccessfully() - { - string message = "Could not delete Comment"; - Guid id = Guid.NewGuid(); - - this.CommentServiceMock.Setup(p => p.DeleteComment(It.IsAny())).Returns(Task.FromResult(false)); - this.CommentServiceMock.Setup(p => p.ValidateJwtForComment(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - - IActionResult result = this.CommentController.DeleteComment(id, null).Result; - - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; - string resultModel = badRequestObjectResult.Value.ToString(); - - Assert.AreEqual(message, resultModel); - } - - [Test] - public void DeletComment_ReturnsUnauthorizedResult_WhenUserIsNotAuthorized() - { - this.CommentServiceMock.Setup(p => p.ValidateJwtForComment(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); - - IActionResult result = this.CommentController.DeleteComment(Guid.Empty, null).Result; - - Assert.IsInstanceOf(result); - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Web.Tests/DevHive.Web.Tests.csproj b/src/DevHive.Tests/DevHive.Web.Tests/DevHive.Web.Tests.csproj deleted file mode 100644 index a171e0b..0000000 --- a/src/DevHive.Tests/DevHive.Web.Tests/DevHive.Web.Tests.csproj +++ /dev/null @@ -1,24 +0,0 @@ - - - - net5.0 - - false - - - - - - - - - - - - - - - true - latest - - diff --git a/src/DevHive.Tests/DevHive.Web.Tests/FeedController.Tests.cs b/src/DevHive.Tests/DevHive.Web.Tests/FeedController.Tests.cs deleted file mode 100644 index 01f67e5..0000000 --- a/src/DevHive.Tests/DevHive.Web.Tests/FeedController.Tests.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Services.Interfaces; -using DevHive.Services.Models; -using DevHive.Web.Controllers; -using DevHive.Web.Models.Comment; -using DevHive.Web.Models.Feed; -using DevHive.Web.Models.Post; -using Microsoft.AspNetCore.Mvc; -using Moq; -using NUnit.Framework; - -namespace DevHive.Web.Tests -{ - [TestFixture] - public class FeedControllerTests - { - private Mock FeedServiceMock { get; set; } - private Mock MapperMock { get; set; } - private FeedController FeedController { get; set; } - - #region SetUp - [SetUp] - public void SetUp() - { - this.FeedServiceMock = new Mock(); - this.MapperMock = new Mock(); - this.FeedController = new FeedController(this.FeedServiceMock.Object, this.MapperMock.Object); - } - #endregion - - #region GetPosts - [Test] - public async Task GetPosts_ReturnsOkObjectResultWithCorrectReadPageWebModel_WhenPostsExist() - { - GetPageWebModel getPageWebModel = new GetPageWebModel { }; - GetPageServiceModel getPageServiceModel = new GetPageServiceModel { }; - ReadPageServiceModel readPageServiceModel = new ReadPageServiceModel { }; - ReadPageWebModel readPageWebModel = new ReadPageWebModel - { - Posts = new List - { - new ReadPostWebModel(), - new ReadPostWebModel(), - new ReadPostWebModel() - } - }; - - this.FeedServiceMock.Setup(p => p.GetPage(It.IsAny())).Returns(Task.FromResult(readPageServiceModel)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(getPageServiceModel); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readPageWebModel); - - IActionResult result = await this.FeedController.GetPosts(Guid.Empty, getPageWebModel); - - Assert.IsInstanceOf(result); - - OkObjectResult okObjectResult = result as OkObjectResult; - ReadPageWebModel resultModel = okObjectResult.Value as Models.Comment.ReadPageWebModel; - - Assert.AreEqual(3, resultModel.Posts.Count); - } - #endregion - - #region GetUserPosts - [Test] - public async Task GetUserPosts_GetsPostsOfUser_WhenTheyExist() - { - GetPageWebModel getPageWebModel = new GetPageWebModel { }; - GetPageServiceModel getPageServiceModel = new GetPageServiceModel { }; - ReadPageServiceModel readPageServiceModel = new ReadPageServiceModel { }; - ReadPageWebModel readPageWebModel = new ReadPageWebModel - { - Posts = new List - { - new ReadPostWebModel(), - new ReadPostWebModel(), - new ReadPostWebModel() - } - }; - - this.FeedServiceMock.Setup(p => p.GetUserPage(It.IsAny())).Returns(Task.FromResult(readPageServiceModel)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(getPageServiceModel); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readPageWebModel); - - IActionResult result = await this.FeedController.GetUserPosts(null, getPageWebModel); - - Assert.IsInstanceOf(result); - - OkObjectResult okObjectResult = result as OkObjectResult; - ReadPageWebModel resultModel = okObjectResult.Value as Models.Comment.ReadPageWebModel; - - Assert.AreEqual(3, resultModel.Posts.Count); - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Web.Tests/LanguageController.Tests.cs b/src/DevHive.Tests/DevHive.Web.Tests/LanguageController.Tests.cs deleted file mode 100644 index 7c8d64e..0000000 --- a/src/DevHive.Tests/DevHive.Web.Tests/LanguageController.Tests.cs +++ /dev/null @@ -1,201 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Language; -using DevHive.Web.Controllers; -using DevHive.Web.Models.Language; -using Microsoft.AspNetCore.Mvc; -using Moq; -using NUnit.Framework; - -namespace DevHive.Web.Tests -{ - [TestFixture] - public class LanguageControllerTests - { - const string NAME = "Gosho Trapov"; - private Mock LanguageServiceMock { get; set; } - private Mock MapperMock { get; set; } - private LanguageController LanguageController { get; set; } - - [SetUp] - public void SetUp() - { - this.LanguageServiceMock = new Mock(); - this.MapperMock = new Mock(); - this.LanguageController = new LanguageController(this.LanguageServiceMock.Object, this.MapperMock.Object); - } - - #region Create - [Test] - public void CreateLanguage_ReturnsOkObjectResult_WhenLanguageIsSuccessfullyCreated() - { - CreateLanguageWebModel createLanguageWebModel = new CreateLanguageWebModel - { - Name = NAME - }; - CreateLanguageServiceModel createLanguageServiceModel = new CreateLanguageServiceModel - { - Name = NAME - }; - Guid id = Guid.NewGuid(); - - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createLanguageServiceModel); - this.LanguageServiceMock.Setup(p => p.CreateLanguage(It.IsAny())).Returns(Task.FromResult(id)); - - IActionResult result = this.LanguageController.Create(createLanguageWebModel).Result; - - Assert.IsInstanceOf(result); - - var splitted = (result as OkObjectResult).Value - .ToString() - .Split('{', '}', '=', ' ') - .Where(x => !string.IsNullOrEmpty(x)) - .ToArray(); - - Guid resultId = Guid.Parse(splitted[1]); - - Assert.AreEqual(id, resultId); - } - - [Test] - public void CreateLanguage_ReturnsBadRequestObjectResult_WhenLanguageIsNotCreatedSuccessfully() - { - CreateLanguageWebModel createTechnologyWebModel = new CreateLanguageWebModel - { - Name = NAME - }; - CreateLanguageServiceModel createTechnologyServiceModel = new CreateLanguageServiceModel - { - Name = NAME - }; - Guid id = Guid.Empty; - string errorMessage = $"Could not create language {NAME}"; - - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createTechnologyServiceModel); - this.LanguageServiceMock.Setup(p => p.CreateLanguage(It.IsAny())).Returns(Task.FromResult(id)); - - IActionResult result = this.LanguageController.Create(createTechnologyWebModel).Result; - - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequsetObjectResult = result as BadRequestObjectResult; - string resultMessage = badRequsetObjectResult.Value.ToString(); - - Assert.AreEqual(errorMessage, resultMessage); - } - #endregion - - #region Read - [Test] - public void GetById_ReturnsTheLanguage_WhenItExists() - { - Guid id = Guid.NewGuid(); - - ReadLanguageServiceModel readLanguageServiceModel = new ReadLanguageServiceModel - { - Name = NAME - }; - ReadLanguageWebModel readLanguageWebModel = new ReadLanguageWebModel - { - Name = NAME - }; - - this.LanguageServiceMock.Setup(p => p.GetLanguageById(It.IsAny())).Returns(Task.FromResult(readLanguageServiceModel)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readLanguageWebModel); - - IActionResult result = this.LanguageController.GetById(id).Result; - - Assert.IsInstanceOf(result); - - OkObjectResult okObjectResult = result as OkObjectResult; - ReadLanguageWebModel resultModel = okObjectResult.Value as Models.Language.ReadLanguageWebModel; - - Assert.AreEqual(NAME, resultModel.Name); - } - #endregion - - #region Update - [Test] - public void Update_ShouldReturnOkResult_WhenLanguageIsUpdatedSuccessfully() - { - Guid id = Guid.NewGuid(); - UpdateLanguageWebModel updateLanguageWebModel = new UpdateLanguageWebModel - { - Name = NAME - }; - UpdateLanguageServiceModel updateLanguageServiceModel = new UpdateLanguageServiceModel - { - Name = NAME - }; - - this.LanguageServiceMock.Setup(p => p.UpdateLanguage(It.IsAny())).Returns(Task.FromResult(true)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateLanguageServiceModel); - - IActionResult result = this.LanguageController.Update(id, updateLanguageWebModel).Result; - - Assert.IsInstanceOf(result); - } - - [Test] - public void Update_ShouldReturnBadObjectResult_WhenLanguageIsNotUpdatedSuccessfully() - { - Guid id = Guid.NewGuid(); - string message = "Could not update Language"; - UpdateLanguageWebModel updateLanguageWebModel = new UpdateLanguageWebModel - { - Name = NAME - }; - UpdateLanguageServiceModel updateLanguageServiceModel = new UpdateLanguageServiceModel - { - Name = NAME - }; - - this.LanguageServiceMock.Setup(p => p.UpdateLanguage(It.IsAny())).Returns(Task.FromResult(false)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateLanguageServiceModel); - - IActionResult result = this.LanguageController.Update(id, updateLanguageWebModel).Result; - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; - string resultModel = badRequestObjectResult.Value.ToString(); - - Assert.AreEqual(message, resultModel); - } - #endregion - - #region Delete - [Test] - public void Delete_ReturnsOkResult_WhenLanguageIsDeletedSuccessfully() - { - Guid id = Guid.NewGuid(); - - this.LanguageServiceMock.Setup(p => p.DeleteLanguage(It.IsAny())).Returns(Task.FromResult(true)); - - IActionResult result = this.LanguageController.Delete(id).Result; - - Assert.IsInstanceOf(result); - } - - [Test] - public void Delet_ReturnsBadRequestObjectResult_WhenLanguageIsNotDeletedSuccessfully() - { - string message = "Could not delete Language"; - Guid id = Guid.NewGuid(); - - this.LanguageServiceMock.Setup(p => p.DeleteLanguage(It.IsAny())).Returns(Task.FromResult(false)); - - IActionResult result = this.LanguageController.Delete(id).Result; - - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; - string resultModel = badRequestObjectResult.Value.ToString(); - - Assert.AreEqual(message, resultModel); - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Web.Tests/PostController.Tests.cs b/src/DevHive.Tests/DevHive.Web.Tests/PostController.Tests.cs deleted file mode 100644 index 3a4e45e..0000000 --- a/src/DevHive.Tests/DevHive.Web.Tests/PostController.Tests.cs +++ /dev/null @@ -1,248 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Post; -using DevHive.Web.Controllers; -using DevHive.Web.Models.Post; -using Microsoft.AspNetCore.Mvc; -using Moq; -using NUnit.Framework; - -namespace DevHive.Web.Tests -{ - [TestFixture] - public class PostControllerTests - { - const string MESSAGE = "Gosho Trapov"; - private Mock PostServiceMock { get; set; } - private Mock MapperMock { get; set; } - private PostController PostController { get; set; } - - [SetUp] - public void SetUp() - { - this.PostServiceMock = new Mock(); - this.MapperMock = new Mock(); - this.PostController = new PostController(this.PostServiceMock.Object, this.MapperMock.Object); - } - - #region Create - [Test] - public void CreatePost_ReturnsOkObjectResult_WhenPostIsSuccessfullyCreated() - { - CreatePostWebModel createPostWebModel = new CreatePostWebModel - { - Message = MESSAGE - }; - CreatePostServiceModel createPostServiceModel = new CreatePostServiceModel - { - Message = MESSAGE - }; - Guid id = Guid.NewGuid(); - - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createPostServiceModel); - this.PostServiceMock.Setup(p => p.CreatePost(It.IsAny())).Returns(Task.FromResult(id)); - this.PostServiceMock.Setup(p => p.ValidateJwtForCreating(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - - IActionResult result = this.PostController.Create(Guid.Empty, createPostWebModel, null).Result; - - Assert.IsInstanceOf(result); - - var splitted = (result as OkObjectResult).Value - .ToString() - .Split('{', '}', '=', ' ') - .Where(x => !string.IsNullOrEmpty(x)) - .ToArray(); - - Guid resultId = Guid.Parse(splitted[1]); - - Assert.AreEqual(id, resultId); - } - - [Test] - public void CreatePost_ReturnsBadRequestObjectResult_WhenPostIsNotCreatedSuccessfully() - { - CreatePostWebModel createTechnologyWebModel = new CreatePostWebModel - { - Message = MESSAGE - }; - CreatePostServiceModel createTechnologyServiceModel = new CreatePostServiceModel - { - Message = MESSAGE - }; - Guid id = Guid.Empty; - string errorMessage = $"Could not create post!"; - - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createTechnologyServiceModel); - this.PostServiceMock.Setup(p => p.CreatePost(It.IsAny())).Returns(Task.FromResult(id)); - this.PostServiceMock.Setup(p => p.ValidateJwtForCreating(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - - IActionResult result = this.PostController.Create(Guid.Empty, createTechnologyWebModel, null).Result; - - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequsetObjectResult = result as BadRequestObjectResult; - string resultMessage = badRequsetObjectResult.Value.ToString(); - - Assert.AreEqual(errorMessage, resultMessage); - } - - [Test] - public void CreatePost_ReturnsUnauthorizedResult_WhenUserIsNotAuthorized() - { - Guid id = Guid.NewGuid(); - CreatePostWebModel createPostWebModel = new CreatePostWebModel - { - Message = MESSAGE - }; - - this.PostServiceMock.Setup(p => p.ValidateJwtForCreating(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); - - IActionResult result = this.PostController.Create(Guid.NewGuid(), createPostWebModel, null).Result; - - Assert.IsInstanceOf(result); - } - #endregion - - #region Read - [Test] - public void GetById_ReturnsThePost_WhenItExists() - { - Guid id = Guid.NewGuid(); - - ReadPostServiceModel readPostServiceModel = new ReadPostServiceModel - { - Message = MESSAGE - }; - ReadPostWebModel readPostWebModel = new ReadPostWebModel - { - Message = MESSAGE - }; - - this.PostServiceMock.Setup(p => p.GetPostById(It.IsAny())).Returns(Task.FromResult(readPostServiceModel)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readPostWebModel); - - IActionResult result = this.PostController.GetById(id).Result; - - Assert.IsInstanceOf(result); - - OkObjectResult okObjectResult = result as OkObjectResult; - ReadPostWebModel resultModel = okObjectResult.Value as Models.Post.ReadPostWebModel; - - Assert.AreEqual(MESSAGE, resultModel.Message); - } - #endregion - - #region Update - [Test] - public void Update_ShouldReturnOkResult_WhenPostIsUpdatedSuccessfully() - { - Guid id = Guid.NewGuid(); - UpdatePostWebModel updatePostWebModel = new UpdatePostWebModel - { - NewMessage = MESSAGE - }; - UpdatePostServiceModel updatePostServiceModel = new UpdatePostServiceModel - { - NewMessage = MESSAGE - }; - - this.PostServiceMock.Setup(p => p.UpdatePost(It.IsAny())).Returns(Task.FromResult(id)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updatePostServiceModel); - this.PostServiceMock.Setup(p => p.ValidateJwtForPost(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - - IActionResult result = this.PostController.Update(id, updatePostWebModel, null).Result; - - Assert.IsInstanceOf(result); - } - - [Test] - public void Update_ShouldReturnBadObjectResult_WhenPostIsNotUpdatedSuccessfully() - { - Guid id = Guid.NewGuid(); - string message = "Could not update post!"; - UpdatePostWebModel updatePostWebModel = new UpdatePostWebModel - { - NewMessage = MESSAGE - }; - UpdatePostServiceModel updatePostServiceModel = new UpdatePostServiceModel - { - NewMessage = MESSAGE - }; - - this.PostServiceMock.Setup(p => p.UpdatePost(It.IsAny())).Returns(Task.FromResult(Guid.Empty)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updatePostServiceModel); - this.PostServiceMock.Setup(p => p.ValidateJwtForPost(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - - IActionResult result = this.PostController.Update(id, updatePostWebModel, null).Result; - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; - string resultModel = badRequestObjectResult.Value.ToString(); - - Assert.AreEqual(message, resultModel); - } - - [Test] - public void Update_ShouldReturnUnauthorizedResult_WhenUserIsNotAuthorized() - { - UpdatePostWebModel updatePostWebModel = new UpdatePostWebModel - { - NewMessage = MESSAGE - }; - - this.PostServiceMock.Setup(p => p.ValidateJwtForPost(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); - - IActionResult result = this.PostController.Update(Guid.Empty, updatePostWebModel, null).Result; - - Assert.IsInstanceOf(result); - } - #endregion - - #region Delete - [Test] - public void Delete_ReturnsOkResult_WhenPostIsDeletedSuccessfully() - { - Guid id = Guid.NewGuid(); - - this.PostServiceMock.Setup(p => p.DeletePost(It.IsAny())).Returns(Task.FromResult(true)); - this.PostServiceMock.Setup(p => p.ValidateJwtForPost(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - - IActionResult result = this.PostController.Delete(id, null).Result; - - Assert.IsInstanceOf(result); - } - - [Test] - public void Delete_ReturnsBadRequestObjectResult_WhenPostIsNotDeletedSuccessfully() - { - string message = "Could not delete Post"; - Guid id = Guid.NewGuid(); - - this.PostServiceMock.Setup(p => p.DeletePost(It.IsAny())).Returns(Task.FromResult(false)); - this.PostServiceMock.Setup(p => p.ValidateJwtForPost(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - - IActionResult result = this.PostController.Delete(id, null).Result; - - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; - string resultModel = badRequestObjectResult.Value.ToString(); - - Assert.AreEqual(message, resultModel); - } - - [Test] - public void DeletePost_ReturnsUnauthorizedResult_WhenUserIsNotAuthorized() - { - this.PostServiceMock.Setup(p => p.ValidateJwtForPost(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); - - IActionResult result = this.PostController.Delete(Guid.Empty, null).Result; - - Assert.IsInstanceOf(result); - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Web.Tests/RoleController.Tests.cs b/src/DevHive.Tests/DevHive.Web.Tests/RoleController.Tests.cs deleted file mode 100644 index 067b4e4..0000000 --- a/src/DevHive.Tests/DevHive.Web.Tests/RoleController.Tests.cs +++ /dev/null @@ -1,201 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Identity.Role; -using DevHive.Web.Controllers; -using DevHive.Web.Models.Identity.Role; -using Microsoft.AspNetCore.Mvc; -using Moq; -using NUnit.Framework; - -namespace DevHive.Web.Tests -{ - [TestFixture] - public class RoleControllerTests - { - const string NAME = "Gosho Trapov"; - private Mock RoleServiceMock { get; set; } - private Mock MapperMock { get; set; } - private RoleController RoleController { get; set; } - - [SetUp] - public void SetUp() - { - this.RoleServiceMock = new Mock(); - this.MapperMock = new Mock(); - this.RoleController = new RoleController(this.RoleServiceMock.Object, this.MapperMock.Object); - } - - #region Create - [Test] - public void CreateRole_ReturnsOkObjectResult_WhenRoleIsSuccessfullyCreated() - { - CreateRoleWebModel createRoleWebModel = new CreateRoleWebModel - { - Name = NAME - }; - CreateRoleServiceModel createRoleServiceModel = new CreateRoleServiceModel - { - Name = NAME - }; - Guid id = Guid.NewGuid(); - - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createRoleServiceModel); - this.RoleServiceMock.Setup(p => p.CreateRole(It.IsAny())).Returns(Task.FromResult(id)); - - IActionResult result = this.RoleController.Create(createRoleWebModel).Result; - - Assert.IsInstanceOf(result); - - var splitted = (result as OkObjectResult).Value - .ToString() - .Split('{', '}', '=', ' ') - .Where(x => !string.IsNullOrEmpty(x)) - .ToArray(); - - Guid resultId = Guid.Parse(splitted[1]); - - Assert.AreEqual(id, resultId); - } - - [Test] - public void CreateRole_ReturnsBadRequestObjectResult_WhenRoleIsNotCreatedSuccessfully() - { - CreateRoleWebModel createTechnologyWebModel = new CreateRoleWebModel - { - Name = NAME - }; - CreateRoleServiceModel createTechnologyServiceModel = new CreateRoleServiceModel - { - Name = NAME - }; - Guid id = Guid.Empty; - string errorMessage = $"Could not create role {NAME}"; - - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createTechnologyServiceModel); - this.RoleServiceMock.Setup(p => p.CreateRole(It.IsAny())).Returns(Task.FromResult(id)); - - IActionResult result = this.RoleController.Create(createTechnologyWebModel).Result; - - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequsetObjectResult = result as BadRequestObjectResult; - string resultMessage = badRequsetObjectResult.Value.ToString(); - - Assert.AreEqual(errorMessage, resultMessage); - } - #endregion - - #region Read - [Test] - public void GetById_ReturnsTheRole_WhenItExists() - { - Guid id = Guid.NewGuid(); - - RoleServiceModel roleServiceModel = new RoleServiceModel - { - Name = NAME - }; - RoleWebModel roleWebModel = new RoleWebModel - { - Name = NAME - }; - - this.RoleServiceMock.Setup(p => p.GetRoleById(It.IsAny())).Returns(Task.FromResult(roleServiceModel)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(roleWebModel); - - IActionResult result = this.RoleController.GetById(id).Result; - - Assert.IsInstanceOf(result); - - OkObjectResult okObjectResult = result as OkObjectResult; - RoleWebModel resultModel = okObjectResult.Value as Models.Identity.Role.RoleWebModel; - - Assert.AreEqual(NAME, resultModel.Name); - } - #endregion - - #region Update - [Test] - public void Update_ShouldReturnOkResult_WhenRoleIsUpdatedSuccessfully() - { - Guid id = Guid.NewGuid(); - UpdateRoleWebModel updateRoleWebModel = new UpdateRoleWebModel - { - Name = NAME - }; - UpdateRoleServiceModel updateRoleServiceModel = new UpdateRoleServiceModel - { - Name = NAME - }; - - this.RoleServiceMock.Setup(p => p.UpdateRole(It.IsAny())).Returns(Task.FromResult(true)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateRoleServiceModel); - - IActionResult result = this.RoleController.Update(id, updateRoleWebModel).Result; - - Assert.IsInstanceOf(result); - } - - [Test] - public void Update_ShouldReturnBadObjectResult_WhenRoleIsNotUpdatedSuccessfully() - { - Guid id = Guid.NewGuid(); - string message = "Could not update role!"; - UpdateRoleWebModel updateRoleWebModel = new UpdateRoleWebModel - { - Name = NAME - }; - UpdateRoleServiceModel updateRoleServiceModel = new UpdateRoleServiceModel - { - Name = NAME - }; - - this.RoleServiceMock.Setup(p => p.UpdateRole(It.IsAny())).Returns(Task.FromResult(false)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateRoleServiceModel); - - IActionResult result = this.RoleController.Update(id, updateRoleWebModel).Result; - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; - string resultModel = badRequestObjectResult.Value.ToString(); - - Assert.AreEqual(message, resultModel); - } - #endregion - - #region Delete - [Test] - public void Delete_ReturnsOkResult_WhenRoleIsDeletedSuccessfully() - { - Guid id = Guid.NewGuid(); - - this.RoleServiceMock.Setup(p => p.DeleteRole(It.IsAny())).Returns(Task.FromResult(true)); - - IActionResult result = this.RoleController.Delete(id).Result; - - Assert.IsInstanceOf(result); - } - - [Test] - public void Delet_ReturnsBadRequestObjectResult_WhenRoleIsNotDeletedSuccessfully() - { - string message = "Could not delete role!"; - Guid id = Guid.NewGuid(); - - this.RoleServiceMock.Setup(p => p.DeleteRole(It.IsAny())).Returns(Task.FromResult(false)); - - IActionResult result = this.RoleController.Delete(id).Result; - - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; - string resultModel = badRequestObjectResult.Value.ToString(); - - Assert.AreEqual(message, resultModel); - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Web.Tests/TechnologyController.Tests.cs b/src/DevHive.Tests/DevHive.Web.Tests/TechnologyController.Tests.cs deleted file mode 100644 index 164bcbf..0000000 --- a/src/DevHive.Tests/DevHive.Web.Tests/TechnologyController.Tests.cs +++ /dev/null @@ -1,204 +0,0 @@ -using AutoMapper; -using DevHive.Common.Models.Misc; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Technology; -using DevHive.Web.Controllers; -using DevHive.Web.Models.Technology; -using Microsoft.AspNetCore.Mvc; -using Moq; -using NUnit.Framework; -using System; -using System.Linq; -using System.Threading.Tasks; - -namespace DevHive.Web.Tests -{ - [TestFixture] - public class TechnologyControllerTests - { - const string NAME = "Gosho Trapov"; - private Mock TechnologyServiceMock { get; set; } - private Mock MapperMock { get; set; } - private TechnologyController TechnologyController { get; set; } - - #region SetUp - [SetUp] - public void SetUp() - { - this.TechnologyServiceMock = new Mock(); - this.MapperMock = new Mock(); - this.TechnologyController = new TechnologyController(this.TechnologyServiceMock.Object, this.MapperMock.Object); - } - #endregion - - #region Create - [Test] - public void Create_ReturnsOkObjectResult_WhenTechnologyIsSuccessfullyCreated() - { - CreateTechnologyWebModel createTechnologyWebModel = new CreateTechnologyWebModel - { - Name = NAME - }; - CreateTechnologyServiceModel createTechnologyServiceModel = new CreateTechnologyServiceModel - { - Name = NAME - }; - Guid id = Guid.NewGuid(); - - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createTechnologyServiceModel); - this.TechnologyServiceMock.Setup(p => p.CreateTechnology(It.IsAny())).Returns(Task.FromResult(id)); - - IActionResult result = this.TechnologyController.Create(createTechnologyWebModel).Result; - - Assert.IsInstanceOf(result); - - var splitted = (result as OkObjectResult).Value - .ToString() - .Split('{', '}', '=', ' ') - .Where(x => !string.IsNullOrEmpty(x)) - .ToArray(); - - Guid resultId = Guid.Parse(splitted[1]); - - Assert.AreEqual(id, resultId); - } - - [Test] - public void Create_ReturnsBadRequestObjectResult_WhenTechnologyIsNotCreatedSuccessfully() - { - CreateTechnologyWebModel createTechnologyWebModel = new CreateTechnologyWebModel - { - Name = NAME - }; - CreateTechnologyServiceModel createTechnologyServiceModel = new CreateTechnologyServiceModel - { - Name = NAME - }; - Guid id = Guid.Empty; - string errorMessage = $"Could not create technology {NAME}"; - - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createTechnologyServiceModel); - this.TechnologyServiceMock.Setup(p => p.CreateTechnology(It.IsAny())).Returns(Task.FromResult(id)); - - IActionResult result = this.TechnologyController.Create(createTechnologyWebModel).Result; - - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequsetObjectResult = result as BadRequestObjectResult; - string resultMessage = badRequsetObjectResult.Value.ToString(); - - Assert.AreEqual(errorMessage, resultMessage); - } - #endregion - - #region Read - [Test] - public void GetById_ReturnsTheThecnology_WhenItExists() - { - Guid id = Guid.NewGuid(); - - ReadTechnologyWebModel readTechnologyWebModel = new ReadTechnologyWebModel - { - Name = NAME - }; - ReadTechnologyServiceModel readTechnologyServiceModel = new ReadTechnologyServiceModel - { - Name = NAME - }; - - this.TechnologyServiceMock.Setup(p => p.GetTechnologyById(It.IsAny())).Returns(Task.FromResult(readTechnologyServiceModel)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readTechnologyWebModel); - - IActionResult result = this.TechnologyController.GetById(id).Result; - - Assert.IsInstanceOf(result); - - OkObjectResult okObjectResult = result as OkObjectResult; - ReadTechnologyWebModel resultModel = okObjectResult.Value as Models.Technology.ReadTechnologyWebModel; - - Assert.AreEqual(NAME, resultModel.Name); - } - #endregion - - #region Update - [Test] - public void Update_ShouldReturnOkResult_WhenTechnologyIsUpdatedSuccessfully() - { - Guid id = Guid.NewGuid(); - UpdateTechnologyWebModel updateTechnologyWebModel = new UpdateTechnologyWebModel - { - Name = NAME - }; - UpdateTechnologyServiceModel updateTechnologyServiceModel = new UpdateTechnologyServiceModel - { - Name = NAME - }; - - this.TechnologyServiceMock.Setup(p => p.UpdateTechnology(It.IsAny())).Returns(Task.FromResult(true)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateTechnologyServiceModel); - - IActionResult result = this.TechnologyController.Update(id, updateTechnologyWebModel).Result; - - Assert.IsInstanceOf(result); - } - - [Test] - public void Update_ShouldReturnBadObjectResult_WhenTechnologyIsNotUpdatedSuccessfully() - { - Guid id = Guid.NewGuid(); - string message = "Could not update Technology"; - UpdateTechnologyWebModel updateTechnologyWebModel = new UpdateTechnologyWebModel - { - Name = NAME - }; - UpdateTechnologyServiceModel updateTechnologyServiceModel = new UpdateTechnologyServiceModel - { - Name = NAME - }; - - this.TechnologyServiceMock.Setup(p => p.UpdateTechnology(It.IsAny())).Returns(Task.FromResult(false)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateTechnologyServiceModel); - - IActionResult result = this.TechnologyController.Update(id, updateTechnologyWebModel).Result; - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; - string resultModel = badRequestObjectResult.Value.ToString(); - - Assert.AreEqual(message, resultModel); - } - #endregion - - #region Delete - [Test] - public void Delete_ReturnsOkResult_WhenTechnologyIsDeletedSuccessfully() - { - Guid id = Guid.NewGuid(); - - this.TechnologyServiceMock.Setup(p => p.DeleteTechnology(It.IsAny())).Returns(Task.FromResult(true)); - - IActionResult result = this.TechnologyController.Delete(id).Result; - - Assert.IsInstanceOf(result); - } - - [Test] - public void Delet_ReturnsBadRequestObjectResult_WhenTechnologyIsNotDeletedSuccessfully() - { - string message = "Could not delete Technology"; - Guid id = Guid.NewGuid(); - - this.TechnologyServiceMock.Setup(p => p.DeleteTechnology(It.IsAny())).Returns(Task.FromResult(false)); - - IActionResult result = this.TechnologyController.Delete(id).Result; - - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; - string resultModel = badRequestObjectResult.Value.ToString(); - - Assert.AreEqual(message, resultModel); - } - #endregion - } -} diff --git a/src/DevHive.Tests/DevHive.Web.Tests/UserController.Tests.cs b/src/DevHive.Tests/DevHive.Web.Tests/UserController.Tests.cs deleted file mode 100644 index c1431c8..0000000 --- a/src/DevHive.Tests/DevHive.Web.Tests/UserController.Tests.cs +++ /dev/null @@ -1,257 +0,0 @@ -using System; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Common.Models.Identity; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Identity.User; -using DevHive.Web.Controllers; -using DevHive.Web.Models.Identity.User; -using Microsoft.AspNetCore.Mvc; -using Moq; -using NUnit.Framework; - -namespace DevHive.Web.Tests -{ - [TestFixture] - public class UserControllerTests - { - const string USERNAME = "Gosho Trapov"; - private Mock UserServiceMock { get; set; } - private Mock MapperMock { get; set; } - private UserController UserController { get; set; } - - [SetUp] - public void SetUp() - { - this.UserServiceMock = new Mock(); - this.MapperMock = new Mock(); - this.UserController = new UserController(this.UserServiceMock.Object, this.MapperMock.Object); - } - - #region Create - [Test] - public void LoginUser_ReturnsOkObjectResult_WhenUserIsSuccessfullyLoggedIn() - { - Guid id = Guid.NewGuid(); - LoginWebModel loginWebModel = new LoginWebModel - { - UserName = USERNAME - }; - LoginServiceModel loginServiceModel = new LoginServiceModel - { - UserName = USERNAME - }; - string token = "goshotrapov"; - TokenModel tokenModel = new TokenModel(token); - TokenWebModel tokenWebModel = new TokenWebModel(token); - - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(loginServiceModel); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(tokenWebModel); - this.UserServiceMock.Setup(p => p.LoginUser(It.IsAny())).Returns(Task.FromResult(tokenModel)); - - IActionResult result = this.UserController.Login(loginWebModel).Result; - - Assert.IsInstanceOf(result); - - var resultToken = ((result as OkObjectResult).Value as TokenWebModel).Token; - - Assert.AreEqual(token, resultToken); - } - - [Test] - public void RegisterUser_ReturnsOkObjectResult_WhenUserIsSuccessfullyRegistered() - { - Guid id = Guid.NewGuid(); - RegisterWebModel registerWebModel = new RegisterWebModel - { - UserName = USERNAME - }; - RegisterServiceModel registerServiceModel = new RegisterServiceModel - { - UserName = USERNAME - }; - string token = "goshotrapov"; - TokenModel tokenModel = new TokenModel(token); - TokenWebModel tokenWebModel = new TokenWebModel(token); - - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(registerServiceModel); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(tokenWebModel); - this.UserServiceMock.Setup(p => p.RegisterUser(It.IsAny())).Returns(Task.FromResult(tokenModel)); - - IActionResult result = this.UserController.Register(registerWebModel).Result; - - Assert.IsInstanceOf(result); - - CreatedResult createdResult = result as CreatedResult; - TokenWebModel resultModel = (createdResult.Value as TokenWebModel); - - Assert.AreEqual(token, resultModel.Token); - } - #endregion - - #region Read - [Test] - public void GetById_ReturnsTheUser_WhenItExists() - { - Guid id = Guid.NewGuid(); - - UserServiceModel userServiceModel = new UserServiceModel - { - UserName = USERNAME - }; - UserWebModel userWebModel = new UserWebModel - { - UserName = USERNAME - }; - - this.UserServiceMock.Setup(p => p.GetUserById(It.IsAny())).Returns(Task.FromResult(userServiceModel)); - this.UserServiceMock.Setup(p => p.ValidJWT(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(userWebModel); - - IActionResult result = this.UserController.GetById(id, null).Result; - - Assert.IsInstanceOf(result); - - OkObjectResult okObjectResult = result as OkObjectResult; - UserWebModel resultModel = okObjectResult.Value as Models.Identity.User.UserWebModel; - - Assert.AreEqual(USERNAME, resultModel.UserName); - } - - [Test] - public void GetById_ReturnsUnauthorizedResult_WhenUserIsNotAuthorized() - { - Guid id = Guid.NewGuid(); - UserWebModel userWebModel = new UserWebModel - { - UserName = USERNAME - }; - - this.UserServiceMock.Setup(p => p.ValidJWT(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); - - IActionResult result = this.UserController.GetById(Guid.NewGuid(), null).Result; - - Assert.IsInstanceOf(result); - } - - [Test] - public void GetUser_ReturnsTheUser_WhenItExists() - { - Guid id = Guid.NewGuid(); - UserWebModel userWebModel = new UserWebModel - { - UserName = USERNAME - }; - UserServiceModel userServiceModel = new UserServiceModel - { - UserName = USERNAME - }; - - this.UserServiceMock.Setup(p => p.GetUserByUsername(It.IsAny())).Returns(Task.FromResult(userServiceModel)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(userWebModel); - - IActionResult result = this.UserController.GetUser(null).Result; - - Assert.IsInstanceOf(result); - - OkObjectResult okObjectResult = result as OkObjectResult; - UserWebModel resultModel = okObjectResult.Value as Models.Identity.User.UserWebModel; - - Assert.AreEqual(USERNAME, resultModel.UserName); - } - #endregion - - #region Update - [Test] - public void Update_ShouldReturnOkResult_WhenUserIsUpdatedSuccessfully() - { - Guid id = Guid.NewGuid(); - UpdateUserWebModel updateUserWebModel = new UpdateUserWebModel - { - UserName = USERNAME - }; - UpdateUserServiceModel updateUserServiceModel = new UpdateUserServiceModel - { - UserName = USERNAME - }; - UserServiceModel userServiceModel = new UserServiceModel - { - UserName = USERNAME - }; - - this.UserServiceMock.Setup(p => p.UpdateUser(It.IsAny())).Returns(Task.FromResult(userServiceModel)); - this.UserServiceMock.Setup(p => p.ValidJWT(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateUserServiceModel); - - IActionResult result = this.UserController.Update(id, updateUserWebModel, null).Result; - - Assert.IsInstanceOf(result); - } - - [Test] - public void UpdateProfilePicture_ShouldReturnOkObjectResult_WhenProfilePictureIsUpdatedSuccessfully() - { - string profilePictureURL = "goshotrapov"; - UpdateProfilePictureWebModel updateProfilePictureWebModel = new UpdateProfilePictureWebModel(); - UpdateProfilePictureServiceModel updateProfilePictureServiceModel = new UpdateProfilePictureServiceModel(); - ProfilePictureServiceModel profilePictureServiceModel = new ProfilePictureServiceModel - { - ProfilePictureURL = profilePictureURL - }; - ProfilePictureWebModel profilePictureWebModel = new ProfilePictureWebModel - { - ProfilePictureURL = profilePictureURL - }; - - this.UserServiceMock.Setup(p => p.ValidJWT(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateProfilePictureServiceModel); - this.UserServiceMock.Setup(p => p.UpdateProfilePicture(It.IsAny())).Returns(Task.FromResult(profilePictureServiceModel)); - this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(profilePictureWebModel); - - - IActionResult result = this.UserController.UpdateProfilePicture(Guid.Empty, updateProfilePictureWebModel, null).Result; - - Assert.IsInstanceOf(result); - - AcceptedResult acceptedResult = result as AcceptedResult; - ProfilePictureWebModel resultModel = acceptedResult.Value as Models.Identity.User.ProfilePictureWebModel; - - Assert.AreEqual(profilePictureURL, resultModel.ProfilePictureURL); - } - #endregion - - #region Delete - [Test] - public void Delete_ReturnsOkResult_WhenUserIsDeletedSuccessfully() - { - Guid id = Guid.NewGuid(); - - this.UserServiceMock.Setup(p => p.ValidJWT(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - this.UserServiceMock.Setup(p => p.DeleteUser(It.IsAny())).Returns(Task.FromResult(true)); - - IActionResult result = this.UserController.Delete(id, null).Result; - - Assert.IsInstanceOf(result); - } - - [Test] - public void Delete_ReturnsBadRequestObjectResult_WhenUserIsNotDeletedSuccessfully() - { - string message = "Could not delete User"; - Guid id = Guid.NewGuid(); - - this.UserServiceMock.Setup(p => p.ValidJWT(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); - this.UserServiceMock.Setup(p => p.DeleteUser(It.IsAny())).Returns(Task.FromResult(false)); - - IActionResult result = this.UserController.Delete(id, null).Result; - - Assert.IsInstanceOf(result); - - BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; - string resultModel = badRequestObjectResult.Value.ToString(); - - Assert.AreEqual(message, resultModel); - } - #endregion - } -} diff --git a/src/DevHive.Web/Attributes/GoodPasswordModelValidation.cs b/src/DevHive.Web/Attributes/GoodPasswordModelValidation.cs deleted file mode 100644 index 7d6a1ea..0000000 --- a/src/DevHive.Web/Attributes/GoodPasswordModelValidation.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; - -namespace DevHive.Web.Attributes -{ - public class GoodPassword : ValidationAttribute - { - public override bool IsValid(object value) - { - var stringValue = (string)value; - - for (int i = 0; i < stringValue.Length; i++) - { - if (Char.IsDigit(stringValue[i])) - { - base.ErrorMessage = "Password must be atleast 5 characters long!"; - return stringValue.Length >= 5; - } - } - base.ErrorMessage = "Password must contain atleast 1 digit!"; - return false; - } - } -} diff --git a/src/DevHive.Web/Attributes/OnlyLettersModelValidation.cs b/src/DevHive.Web/Attributes/OnlyLettersModelValidation.cs deleted file mode 100644 index 07afee9..0000000 --- a/src/DevHive.Web/Attributes/OnlyLettersModelValidation.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; - -namespace DevHive.Web.Attributes -{ - public class OnlyLetters : ValidationAttribute - { - public override bool IsValid(object value) - { - var stringValue = (string)value; - - foreach (char ch in stringValue) - { - if (!Char.IsLetter(ch)) - return false; - } - return true; - } - } -} diff --git a/src/DevHive.Web/Configurations/Extensions/ConfigureAutoMapper.cs b/src/DevHive.Web/Configurations/Extensions/ConfigureAutoMapper.cs deleted file mode 100644 index 8b7d657..0000000 --- a/src/DevHive.Web/Configurations/Extensions/ConfigureAutoMapper.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using AutoMapper; -//using AutoMapper.Configuration; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace DevHive.Web.Configurations.Extensions -{ - public static class ConfigureAutoMapper - { - public static void AutoMapperConfiguration(this IServiceCollection services) - { - services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); - } - - public static void UseAutoMapperConfiguration(this IApplicationBuilder app) - { - var config = new MapperConfiguration(cfg => - { - cfg.AllowNullCollections = true; - }); - } - } -} \ No newline at end of file diff --git a/src/DevHive.Web/Configurations/Extensions/ConfigureDatabase.cs b/src/DevHive.Web/Configurations/Extensions/ConfigureDatabase.cs deleted file mode 100644 index 9f02dd7..0000000 --- a/src/DevHive.Web/Configurations/Extensions/ConfigureDatabase.cs +++ /dev/null @@ -1,70 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using DevHive.Data.Models; -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Builder; -using System; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using DevHive.Data; - -namespace DevHive.Web.Configurations.Extensions -{ - public static class DatabaseExtensions - { - public static void DatabaseConfiguration(this IServiceCollection services, IConfiguration configuration) - { - services.AddDbContext(options => - { - options.EnableSensitiveDataLogging(true); - options.UseNpgsql(configuration.GetConnectionString("DEV")); - }); - - services.AddIdentity() - .AddRoles() - .AddEntityFrameworkStores(); - - services.Configure(options => - { - options.User.RequireUniqueEmail = true; - - options.Password.RequireDigit = true; - options.Password.RequiredLength = 5; - options.Password.RequiredUniqueChars = 0; - options.Password.RequireLowercase = false; - options.Password.RequireNonAlphanumeric = false; - options.Password.RequireUppercase = false; - - options.Lockout.AllowedForNewUsers = true; - options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5); - options.Lockout.MaxFailedAccessAttempts = 5; - }); - - services.AddAuthorization(options => - { - options.AddPolicy("User", options => - { - options.RequireAuthenticatedUser(); - options.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme); - options.RequireRole("User"); - }); - - options.AddPolicy("Administrator", options => - { - options.RequireAuthenticatedUser(); - options.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme); - options.RequireRole("Admin"); - }); - }); - } - - public static void UseDatabaseConfiguration(this IApplicationBuilder app) - { - app.UseHttpsRedirection(); - app.UseRouting(); - - app.UseAuthentication(); - app.UseAuthorization(); - } - } -} diff --git a/src/DevHive.Web/Configurations/Extensions/ConfigureDependencyInjection.cs b/src/DevHive.Web/Configurations/Extensions/ConfigureDependencyInjection.cs deleted file mode 100644 index 88f21d4..0000000 --- a/src/DevHive.Web/Configurations/Extensions/ConfigureDependencyInjection.cs +++ /dev/null @@ -1,38 +0,0 @@ -using DevHive.Data.Interfaces.Repositories; -using DevHive.Data.Repositories; -using DevHive.Services.Interfaces; -using DevHive.Services.Services; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; - -namespace DevHive.Web.Configurations.Extensions -{ - public static class ConfigureDependencyInjection - { - public static void DependencyInjectionConfiguration(this IServiceCollection services, IConfiguration configuration) - { - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(options => - new CloudinaryService( - cloudName: configuration.GetSection("Cloud").GetSection("cloudName").Value, - apiKey: configuration.GetSection("Cloud").GetSection("apiKey").Value, - apiSecret: configuration.GetSection("Cloud").GetSection("apiSecret").Value)); - services.AddTransient(); - } - } -} diff --git a/src/DevHive.Web/Configurations/Extensions/ConfigureExceptionHandlerMiddleware.cs b/src/DevHive.Web/Configurations/Extensions/ConfigureExceptionHandlerMiddleware.cs deleted file mode 100644 index 286727f..0000000 --- a/src/DevHive.Web/Configurations/Extensions/ConfigureExceptionHandlerMiddleware.cs +++ /dev/null @@ -1,16 +0,0 @@ -using DevHive.Web.Middleware; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace DevHive.Web.Configurations.Extensions -{ - public static class ConfigureExceptionHandlerMiddleware - { - public static void ExceptionHandlerMiddlewareConfiguration(this IServiceCollection services) { } - - public static void UseExceptionHandlerMiddlewareConfiguration(this IApplicationBuilder app) - { - app.UseMiddleware(); - } - } -} diff --git a/src/DevHive.Web/Configurations/Extensions/ConfigureJWT.cs b/src/DevHive.Web/Configurations/Extensions/ConfigureJWT.cs deleted file mode 100644 index d422bc8..0000000 --- a/src/DevHive.Web/Configurations/Extensions/ConfigureJWT.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System.Text; -using System.Threading.Tasks; -using DevHive.Services.Options; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.IdentityModel.Tokens; - -namespace DevHive.Web.Configurations.Extensions -{ - public static class JWTExtensions - { - public static void JWTConfiguration(this IServiceCollection services, IConfiguration configuration) - { - services.AddSingleton(new JWTOptions(configuration - .GetSection("AppSettings") - .GetSection("Secret") - .Value)); - - // Get key from appsettings.json - var key = Encoding.ASCII.GetBytes(configuration - .GetSection("AppSettings") - .GetSection("Secret") - .Value); - - // Setup Jwt Authentication - services.AddAuthentication(x => - { - x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - }) - .AddJwtBearer(x => - { - x.Events = new JwtBearerEvents - { - OnTokenValidated = context => - { - // TODO: add more authentication - return Task.CompletedTask; - } - }; - x.RequireHttpsMetadata = false; - x.SaveToken = true; - x.TokenValidationParameters = new TokenValidationParameters - { - //ValidateIssuerSigningKey = false, - IssuerSigningKey = new SymmetricSecurityKey(key), - ValidateIssuer = false, - ValidateAudience = false - }; - }); - } - } -} \ No newline at end of file diff --git a/src/DevHive.Web/Configurations/Extensions/ConfigureSwagger.cs b/src/DevHive.Web/Configurations/Extensions/ConfigureSwagger.cs deleted file mode 100644 index a0641ab..0000000 --- a/src/DevHive.Web/Configurations/Extensions/ConfigureSwagger.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.OpenApi.Models; - -namespace DevHive.Web.Configurations.Extensions -{ - public static class SwaggerExtensions - { - public static void SwaggerConfiguration(this IServiceCollection services) - { - services.AddSwaggerGen(c => - { - c.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version = "v1" }); - }); - } - - public static void UseSwaggerConfiguration(this IApplicationBuilder app) - { - app.UseSwagger(); - app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "API v1")); - } - } -} \ No newline at end of file diff --git a/src/DevHive.Web/Configurations/Mapping/CommentMappings.cs b/src/DevHive.Web/Configurations/Mapping/CommentMappings.cs deleted file mode 100644 index b8d6829..0000000 --- a/src/DevHive.Web/Configurations/Mapping/CommentMappings.cs +++ /dev/null @@ -1,17 +0,0 @@ -using AutoMapper; -using DevHive.Services.Models.Comment; -using DevHive.Web.Models.Comment; - -namespace DevHive.Web.Configurations.Mapping -{ - public class CommentMappings : Profile - { - public CommentMappings() - { - CreateMap(); - CreateMap(); - - CreateMap(); - } - } -} diff --git a/src/DevHive.Web/Configurations/Mapping/FeedMappings.cs b/src/DevHive.Web/Configurations/Mapping/FeedMappings.cs deleted file mode 100644 index 0909f6d..0000000 --- a/src/DevHive.Web/Configurations/Mapping/FeedMappings.cs +++ /dev/null @@ -1,18 +0,0 @@ -using AutoMapper; -using DevHive.Services.Models; -using DevHive.Web.Models.Comment; -using DevHive.Web.Models.Feed; - -namespace DevHive.Web.Configurations.Mapping -{ - public class FeedMappings : Profile - { - public FeedMappings() - { - CreateMap() - .ForMember(dest => dest.FirstRequestIssued, src => src.MapFrom(p => p.FirstPageTimeIssued)); - - CreateMap(); - } - } -} diff --git a/src/DevHive.Web/Configurations/Mapping/LanguageMappings.cs b/src/DevHive.Web/Configurations/Mapping/LanguageMappings.cs deleted file mode 100644 index eca0d1a..0000000 --- a/src/DevHive.Web/Configurations/Mapping/LanguageMappings.cs +++ /dev/null @@ -1,23 +0,0 @@ -using AutoMapper; -using DevHive.Web.Models.Language; -using DevHive.Services.Models.Language; - -namespace DevHive.Web.Configurations.Mapping -{ - public class LanguageMappings : Profile - { - public LanguageMappings() - { - CreateMap(); - CreateMap(); - CreateMap() - .ForMember(src => src.Id, dest => dest.Ignore()); - CreateMap(); - - CreateMap(); - CreateMap(); - CreateMap(); - CreateMap(); - } - } -} diff --git a/src/DevHive.Web/Configurations/Mapping/PostMappings.cs b/src/DevHive.Web/Configurations/Mapping/PostMappings.cs deleted file mode 100644 index a5b46ee..0000000 --- a/src/DevHive.Web/Configurations/Mapping/PostMappings.cs +++ /dev/null @@ -1,17 +0,0 @@ -using AutoMapper; -using DevHive.Services.Models.Post; -using DevHive.Web.Models.Post; - -namespace DevHive.Web.Configurations.Mapping -{ - public class PostMappings : Profile - { - public PostMappings() - { - CreateMap(); - CreateMap(); - - CreateMap(); - } - } -} diff --git a/src/DevHive.Web/Configurations/Mapping/RatingMappings.cs b/src/DevHive.Web/Configurations/Mapping/RatingMappings.cs deleted file mode 100644 index 4e071de..0000000 --- a/src/DevHive.Web/Configurations/Mapping/RatingMappings.cs +++ /dev/null @@ -1,16 +0,0 @@ -using AutoMapper; -using DevHive.Services.Models.Post.Rating; -using DevHive.Web.Models.Post.Rating; - -namespace DevHive.Web.Configurations.Mapping -{ - public class RatingMappings : Profile - { - public RatingMappings() - { - CreateMap(); - - CreateMap(); - } - } -} diff --git a/src/DevHive.Web/Configurations/Mapping/RoleMappings.cs b/src/DevHive.Web/Configurations/Mapping/RoleMappings.cs deleted file mode 100644 index 2ea2742..0000000 --- a/src/DevHive.Web/Configurations/Mapping/RoleMappings.cs +++ /dev/null @@ -1,21 +0,0 @@ -using AutoMapper; -using DevHive.Web.Models.Identity.Role; -using DevHive.Services.Models.Identity.Role; - -namespace DevHive.Web.Configurations.Mapping -{ - public class RoleMappings : Profile - { - public RoleMappings() - { - CreateMap(); - CreateMap() - .ForMember(src => src.Id, dest => dest.Ignore()); - CreateMap(); - - CreateMap(); - CreateMap(); - CreateMap(); - } - } -} diff --git a/src/DevHive.Web/Configurations/Mapping/TechnologyMappings.cs b/src/DevHive.Web/Configurations/Mapping/TechnologyMappings.cs deleted file mode 100644 index 708b6ac..0000000 --- a/src/DevHive.Web/Configurations/Mapping/TechnologyMappings.cs +++ /dev/null @@ -1,23 +0,0 @@ -using AutoMapper; -using DevHive.Web.Models.Technology; -using DevHive.Services.Models.Technology; - -namespace DevHive.Web.Configurations.Mapping -{ - public class TechnologyMappings : Profile - { - public TechnologyMappings() - { - CreateMap(); - CreateMap(); - CreateMap() - .ForMember(src => src.Id, dest => dest.Ignore()); - CreateMap(); - - CreateMap(); - CreateMap(); - CreateMap(); - CreateMap(); - } - } -} diff --git a/src/DevHive.Web/Configurations/Mapping/UserMappings.cs b/src/DevHive.Web/Configurations/Mapping/UserMappings.cs deleted file mode 100644 index f58e7ca..0000000 --- a/src/DevHive.Web/Configurations/Mapping/UserMappings.cs +++ /dev/null @@ -1,33 +0,0 @@ -using AutoMapper; -using DevHive.Services.Models.Identity.User; -using DevHive.Web.Models.Identity.User; -using DevHive.Common.Models.Identity; - -namespace DevHive.Web.Configurations.Mapping -{ - public class UserMappings : Profile - { - public UserMappings() - { - CreateMap(); - CreateMap(); - CreateMap(); - CreateMap(); - - CreateMap(); - - CreateMap(); - - //Update - CreateMap(); - CreateMap(); - CreateMap(); - - CreateMap(); - CreateMap(); - - CreateMap(); - CreateMap(); - } - } -} diff --git a/src/DevHive.Web/Controllers/CommentController.cs b/src/DevHive.Web/Controllers/CommentController.cs deleted file mode 100644 index c38e300..0000000 --- a/src/DevHive.Web/Controllers/CommentController.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using AutoMapper; -using System; -using DevHive.Web.Models.Comment; -using DevHive.Services.Models.Comment; -using Microsoft.AspNetCore.Authorization; -using DevHive.Services.Interfaces; - -namespace DevHive.Web.Controllers -{ - [ApiController] - [Route("/api/[controller]")] - [Authorize(Roles = "User,Admin")] - public class CommentController - { - private readonly ICommentService _commentService; - private readonly IMapper _commentMapper; - - public CommentController(ICommentService commentService, IMapper commentMapper) - { - this._commentService = commentService; - this._commentMapper = commentMapper; - } - - [HttpPost] - public async Task AddComment(Guid userId, [FromBody] CreateCommentWebModel createCommentWebModel, [FromHeader] string authorization) - { - if (!await this._commentService.ValidateJwtForCreating(userId, authorization)) - return new UnauthorizedResult(); - - CreateCommentServiceModel createCommentServiceModel = - this._commentMapper.Map(createCommentWebModel); - createCommentServiceModel.CreatorId = userId; - - Guid id = await this._commentService.AddComment(createCommentServiceModel); - - return id == Guid.Empty ? - new BadRequestObjectResult("Could not create comment!") : - new OkObjectResult(new { Id = id }); - } - - [HttpGet] - [AllowAnonymous] - public async Task GetCommentById(Guid id) - { - ReadCommentServiceModel readCommentServiceModel = await this._commentService.GetCommentById(id); - ReadCommentWebModel readCommentWebModel = this._commentMapper.Map(readCommentServiceModel); - - return new OkObjectResult(readCommentWebModel); - } - - [HttpPut] - public async Task UpdateComment(Guid userId, [FromBody] UpdateCommentWebModel updateCommentWebModel, [FromHeader] string authorization) - { - if (!await this._commentService.ValidateJwtForComment(updateCommentWebModel.CommentId, authorization)) - return new UnauthorizedResult(); - - UpdateCommentServiceModel updateCommentServiceModel = - this._commentMapper.Map(updateCommentWebModel); - updateCommentServiceModel.CreatorId = userId; - - Guid id = await this._commentService.UpdateComment(updateCommentServiceModel); - - return id == Guid.Empty ? - new BadRequestObjectResult("Unable to update comment!") : - new OkObjectResult(new { Id = id }); - } - - [HttpDelete] - public async Task DeleteComment(Guid id, [FromHeader] string authorization) - { - if (!await this._commentService.ValidateJwtForComment(id, authorization)) - return new UnauthorizedResult(); - - return await this._commentService.DeleteComment(id) ? - new OkResult() : - new BadRequestObjectResult("Could not delete Comment"); - } - - } -} - diff --git a/src/DevHive.Web/Controllers/FeedController.cs b/src/DevHive.Web/Controllers/FeedController.cs deleted file mode 100644 index abca3e4..0000000 --- a/src/DevHive.Web/Controllers/FeedController.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Services.Interfaces; -using DevHive.Services.Models; -using DevHive.Web.Models.Comment; -using DevHive.Web.Models.Feed; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace DevHive.Web.Controllers -{ - [ApiController] - [Route("/api/[controller]")] - [Authorize(Roles = "User,Admin")] - public class FeedController - { - private readonly IFeedService _feedService; - private readonly IMapper _mapper; - - public FeedController(IFeedService feedService, IMapper mapper) - { - this._feedService = feedService; - this._mapper = mapper; - } - - [HttpPost] - [Route("GetPosts")] - public async Task GetPosts(Guid userId, [FromBody] GetPageWebModel getPageWebModel) - { - GetPageServiceModel getPageServiceModel = this._mapper.Map(getPageWebModel); - getPageServiceModel.UserId = userId; - - ReadPageServiceModel readPageServiceModel = await this._feedService.GetPage(getPageServiceModel); - ReadPageWebModel readPageWebModel = this._mapper.Map(readPageServiceModel); - - return new OkObjectResult(readPageWebModel); - } - - [HttpPost] - [Route("GetUserPosts")] - [AllowAnonymous] - public async Task GetUserPosts(string username, [FromBody] GetPageWebModel getPageWebModel) - { - GetPageServiceModel getPageServiceModel = this._mapper.Map(getPageWebModel); - getPageServiceModel.Username = username; - - ReadPageServiceModel readPageServiceModel = await this._feedService.GetUserPage(getPageServiceModel); - ReadPageWebModel readPageWebModel = this._mapper.Map(readPageServiceModel); - - return new OkObjectResult(readPageWebModel); - } - } -} diff --git a/src/DevHive.Web/Controllers/LanguageController.cs b/src/DevHive.Web/Controllers/LanguageController.cs deleted file mode 100644 index 5b0d5de..0000000 --- a/src/DevHive.Web/Controllers/LanguageController.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Language; -using DevHive.Web.Models.Language; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace DevHive.Web.Controllers -{ - [ApiController] - [Route("/api/[controller]")] - public class LanguageController - { - private readonly ILanguageService _languageService; - private readonly IMapper _languageMapper; - - public LanguageController(ILanguageService languageService, IMapper mapper) - { - this._languageService = languageService; - this._languageMapper = mapper; - } - - [HttpPost] - [Authorize(Roles = "Admin")] - public async Task Create([FromBody] CreateLanguageWebModel createLanguageWebModel) - { - CreateLanguageServiceModel languageServiceModel = this._languageMapper.Map(createLanguageWebModel); - - Guid id = await this._languageService.CreateLanguage(languageServiceModel); - - return id == Guid.Empty ? - new BadRequestObjectResult($"Could not create language {createLanguageWebModel.Name}") : - new OkObjectResult(new { Id = id }); - } - - [HttpGet] - [AllowAnonymous] - public async Task GetById(Guid id) - { - ReadLanguageServiceModel languageServiceModel = await this._languageService.GetLanguageById(id); - ReadLanguageWebModel languageWebModel = this._languageMapper.Map(languageServiceModel); - - return new OkObjectResult(languageWebModel); - } - - [HttpGet] - [Route("GetLanguages")] - [Authorize(Roles = "User,Admin")] - public IActionResult GetAllExistingLanguages() - { - HashSet languageServiceModels = this._languageService.GetLanguages(); - HashSet languageWebModels = this._languageMapper.Map>(languageServiceModels); - - return new OkObjectResult(languageWebModels); - } - - [HttpPut] - [Authorize(Roles = "Admin")] - public async Task Update(Guid id, [FromBody] UpdateLanguageWebModel updateModel) - { - UpdateLanguageServiceModel updatelanguageServiceModel = this._languageMapper.Map(updateModel); - updatelanguageServiceModel.Id = id; - - bool result = await this._languageService.UpdateLanguage(updatelanguageServiceModel); - - if (!result) - return new BadRequestObjectResult("Could not update Language"); - - return new OkResult(); - } - - [HttpDelete] - [Authorize(Roles = "Admin")] - public async Task Delete(Guid id) - { - bool result = await this._languageService.DeleteLanguage(id); - - if (!result) - return new BadRequestObjectResult("Could not delete Language"); - - return new OkResult(); - } - } -} diff --git a/src/DevHive.Web/Controllers/PostController.cs b/src/DevHive.Web/Controllers/PostController.cs deleted file mode 100644 index d3fdbf6..0000000 --- a/src/DevHive.Web/Controllers/PostController.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using AutoMapper; -using System; -using DevHive.Web.Models.Post; -using DevHive.Services.Models.Post; -using Microsoft.AspNetCore.Authorization; -using DevHive.Services.Interfaces; - -namespace DevHive.Web.Controllers -{ - [ApiController] - [Route("/api/[controller]")] - [Authorize(Roles = "User,Admin")] - public class PostController - { - private readonly IPostService _postService; - private readonly IMapper _postMapper; - - public PostController(IPostService postService, IMapper postMapper) - { - this._postService = postService; - this._postMapper = postMapper; - } - - #region Create - [HttpPost] - public async Task Create(Guid userId, [FromForm] CreatePostWebModel createPostWebModel, [FromHeader] string authorization) - { - if (!await this._postService.ValidateJwtForCreating(userId, authorization)) - return new UnauthorizedResult(); - - CreatePostServiceModel createPostServiceModel = - this._postMapper.Map(createPostWebModel); - createPostServiceModel.CreatorId = userId; - - Guid id = await this._postService.CreatePost(createPostServiceModel); - - return id == Guid.Empty ? - new BadRequestObjectResult("Could not create post!") : - new OkObjectResult(new { Id = id }); - } - #endregion - - #region Read - [HttpGet] - [AllowAnonymous] - public async Task GetById(Guid id) - { - ReadPostServiceModel postServiceModel = await this._postService.GetPostById(id); - ReadPostWebModel postWebModel = this._postMapper.Map(postServiceModel); - - return new OkObjectResult(postWebModel); - } - #endregion - - #region Update - [HttpPut] - public async Task Update(Guid userId, [FromForm] UpdatePostWebModel updatePostWebModel, [FromHeader] string authorization) - { - if (!await this._postService.ValidateJwtForPost(updatePostWebModel.PostId, authorization)) - return new UnauthorizedResult(); - - UpdatePostServiceModel updatePostServiceModel = - this._postMapper.Map(updatePostWebModel); - updatePostServiceModel.CreatorId = userId; - - Guid id = await this._postService.UpdatePost(updatePostServiceModel); - - return id == Guid.Empty ? - new BadRequestObjectResult("Could not update post!") : - new OkObjectResult(new { Id = id }); - } - #endregion - - #region Delete - [HttpDelete] - public async Task Delete(Guid id, [FromHeader] string authorization) - { - if (!await this._postService.ValidateJwtForPost(id, authorization)) - return new UnauthorizedResult(); - - return await this._postService.DeletePost(id) ? - new OkResult() : - new BadRequestObjectResult("Could not delete Post"); - } - #endregion - } -} diff --git a/src/DevHive.Web/Controllers/RateController.cs b/src/DevHive.Web/Controllers/RateController.cs deleted file mode 100644 index 68b859b..0000000 --- a/src/DevHive.Web/Controllers/RateController.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Post.Rating; -using DevHive.Web.Models.Post.Rating; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace DevHive.Web.Controllers -{ - [ApiController] - [Route("api/[controller]")] - public class RateController - { - private readonly IRateService _rateService; - private readonly IUserService _userService; - private readonly IMapper _mapper; - - public RateController(IRateService rateService, IUserService userService, IMapper mapper) - { - this._rateService = rateService; - this._userService = userService; - this._mapper = mapper; - } - - [HttpPost] - [Authorize(Roles = "Admin,User")] - public async Task RatePost(Guid userId, [FromBody] RatePostWebModel ratePostWebModel, [FromHeader] string authorization) - { - RatePostServiceModel ratePostServiceModel = this._mapper.Map(ratePostWebModel); - ratePostServiceModel.UserId = userId; - - ReadPostRatingServiceModel readPostRatingServiceModel = await this._rateService.RatePost(ratePostServiceModel); - ReadPostRatingWebModel readPostRatingWebModel = this._mapper.Map(readPostRatingServiceModel); - - return new OkObjectResult(readPostRatingWebModel); - } - } -} diff --git a/src/DevHive.Web/Controllers/RoleController.cs b/src/DevHive.Web/Controllers/RoleController.cs deleted file mode 100644 index 0d2a2eb..0000000 --- a/src/DevHive.Web/Controllers/RoleController.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using DevHive.Web.Models.Identity.Role; -using AutoMapper; -using System; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Identity.Role; -using Microsoft.AspNetCore.Authorization; - -namespace DevHive.Web.Controllers -{ - [ApiController] - [Route("/api/[controller]")] - public class RoleController - { - private readonly IRoleService _roleService; - private readonly IMapper _roleMapper; - - public RoleController(IRoleService roleService, IMapper mapper) - { - this._roleService = roleService; - this._roleMapper = mapper; - } - - [HttpPost] - [Authorize(Roles = "Admin")] - public async Task Create([FromBody] CreateRoleWebModel createRoleWebModel) - { - CreateRoleServiceModel roleServiceModel = - this._roleMapper.Map(createRoleWebModel); - - Guid id = await this._roleService.CreateRole(roleServiceModel); - - return id == Guid.Empty ? - new BadRequestObjectResult($"Could not create role {createRoleWebModel.Name}") : - new OkObjectResult(new { Id = id }); - } - - [HttpGet] - [Authorize(Roles = "User,Admin")] - public async Task GetById(Guid id) - { - RoleServiceModel roleServiceModel = await this._roleService.GetRoleById(id); - RoleWebModel roleWebModel = this._roleMapper.Map(roleServiceModel); - - return new OkObjectResult(roleWebModel); - } - - [HttpPut] - [Authorize(Roles = "Admin")] - public async Task Update(Guid id, [FromBody] UpdateRoleWebModel updateRoleWebModel) - { - UpdateRoleServiceModel updateRoleServiceModel = - this._roleMapper.Map(updateRoleWebModel); - updateRoleServiceModel.Id = id; - - bool result = await this._roleService.UpdateRole(updateRoleServiceModel); - - if (!result) - return new BadRequestObjectResult("Could not update role!"); - - return new OkResult(); - } - - [HttpDelete] - [Authorize(Roles = "Admin")] - public async Task Delete(Guid id) - { - bool result = await this._roleService.DeleteRole(id); - - if (!result) - return new BadRequestObjectResult("Could not delete role!"); - - return new OkResult(); - } - } -} diff --git a/src/DevHive.Web/Controllers/TechnologyController.cs b/src/DevHive.Web/Controllers/TechnologyController.cs deleted file mode 100644 index e507899..0000000 --- a/src/DevHive.Web/Controllers/TechnologyController.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Services.Interfaces; -using DevHive.Services.Models.Technology; -using DevHive.Web.Models.Technology; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace DevHive.Web.Controllers -{ - [ApiController] - [Route("/api/[controller]")] - public class TechnologyController - { - private readonly ITechnologyService _technologyService; - private readonly IMapper _technologyMapper; - - public TechnologyController(ITechnologyService technologyService, IMapper technologyMapper) - { - this._technologyService = technologyService; - this._technologyMapper = technologyMapper; - } - - [HttpPost] - [Authorize(Roles = "Admin")] - public async Task Create([FromBody] CreateTechnologyWebModel createTechnologyWebModel) - { - CreateTechnologyServiceModel technologyServiceModel = this._technologyMapper.Map(createTechnologyWebModel); - - Guid id = await this._technologyService.CreateTechnology(technologyServiceModel); - - return id == Guid.Empty ? - new BadRequestObjectResult($"Could not create technology {createTechnologyWebModel.Name}") : - new OkObjectResult(new { Id = id }); - } - - [HttpGet] - [AllowAnonymous] - public async Task GetById(Guid id) - { - ReadTechnologyServiceModel readTechnologyServiceModel = await this._technologyService.GetTechnologyById(id); - ReadTechnologyWebModel readTechnologyWebModel = this._technologyMapper.Map(readTechnologyServiceModel); - - return new OkObjectResult(readTechnologyWebModel); - } - - [HttpGet] - [Route("GetTechnologies")] - [Authorize(Roles = "User,Admin")] - public IActionResult GetAllExistingTechnologies() - { - HashSet technologyServiceModels = this._technologyService.GetTechnologies(); - HashSet languageWebModels = this._technologyMapper.Map>(technologyServiceModels); - - return new OkObjectResult(languageWebModels); - } - - [HttpPut] - [Authorize(Roles = "Admin")] - public async Task Update(Guid id, [FromBody] UpdateTechnologyWebModel updateModel) - { - UpdateTechnologyServiceModel updateTechnologyServiceModel = this._technologyMapper.Map(updateModel); - updateTechnologyServiceModel.Id = id; - - bool result = await this._technologyService.UpdateTechnology(updateTechnologyServiceModel); - - if (!result) - return new BadRequestObjectResult("Could not update Technology"); - - return new OkResult(); - } - - [HttpDelete] - [Authorize(Roles = "Admin")] - public async Task Delete(Guid id) - { - bool result = await this._technologyService.DeleteTechnology(id); - - if (!result) - return new BadRequestObjectResult("Could not delete Technology"); - - return new OkResult(); - } - } -} diff --git a/src/DevHive.Web/Controllers/UserController.cs b/src/DevHive.Web/Controllers/UserController.cs deleted file mode 100644 index 109bbaa..0000000 --- a/src/DevHive.Web/Controllers/UserController.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System; -using System.Threading.Tasks; -using AutoMapper; -using DevHive.Services.Models.Identity.User; -using DevHive.Web.Models.Identity.User; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using DevHive.Common.Models.Identity; -using DevHive.Services.Interfaces; -using Microsoft.Extensions.Hosting; - -namespace DevHive.Web.Controllers -{ - [ApiController] - [Route("/api/[controller]")] - public class UserController : ControllerBase - { - private readonly IUserService _userService; - private readonly IMapper _userMapper; - - public UserController(IUserService userService, IMapper mapper) - { - this._userService = userService; - this._userMapper = mapper; - } - - #region Authentication - [HttpPost] - [Route("Login")] - [AllowAnonymous] - public async Task Login([FromBody] LoginWebModel loginModel) - { - LoginServiceModel loginServiceModel = this._userMapper.Map(loginModel); - - TokenModel TokenModel = await this._userService.LoginUser(loginServiceModel); - TokenWebModel tokenWebModel = this._userMapper.Map(TokenModel); - - return new OkObjectResult(tokenWebModel); - } - - [HttpPost] - [Route("Register")] - [AllowAnonymous] - public async Task Register([FromBody] RegisterWebModel registerModel) - { - RegisterServiceModel registerServiceModel = this._userMapper.Map(registerModel); - - TokenModel TokenModel = await this._userService.RegisterUser(registerServiceModel); - TokenWebModel tokenWebModel = this._userMapper.Map(TokenModel); - - return new CreatedResult("Register", tokenWebModel); - } - #endregion - - #region Read - [HttpGet] - [Authorize(Roles = "User,Admin")] - public async Task GetById(Guid id, [FromHeader] string authorization) - { - if (!await this._userService.ValidJWT(id, authorization)) - return new UnauthorizedResult(); - - UserServiceModel userServiceModel = await this._userService.GetUserById(id); - UserWebModel userWebModel = this._userMapper.Map(userServiceModel); - - return new OkObjectResult(userWebModel); - } - - [HttpGet] - [Route("GetUser")] - [AllowAnonymous] - public async Task GetUser(string username) - { - UserServiceModel friendServiceModel = await this._userService.GetUserByUsername(username); - UserWebModel friend = this._userMapper.Map(friendServiceModel); - - return new OkObjectResult(friend); - } - #endregion - - #region Update - [HttpPut] - [Authorize(Roles = "User,Admin")] - public async Task Update(Guid id, [FromBody] UpdateUserWebModel updateUserWebModel, [FromHeader] string authorization) - { - if (!await this._userService.ValidJWT(id, authorization)) - return new UnauthorizedResult(); - - UpdateUserServiceModel updateUserServiceModel = this._userMapper.Map(updateUserWebModel); - updateUserServiceModel.Id = id; - - UserServiceModel userServiceModel = await this._userService.UpdateUser(updateUserServiceModel); - UserWebModel userWebModel = this._userMapper.Map(userServiceModel); - - return new AcceptedResult("UpdateUser", userWebModel); - } - - [HttpPut] - [Route("ProfilePicture")] - [Authorize(Roles = "User,Admin")] - public async Task UpdateProfilePicture(Guid userId, [FromForm] UpdateProfilePictureWebModel updateProfilePictureWebModel, [FromHeader] string authorization) - { - if (!await this._userService.ValidJWT(userId, authorization)) - return new UnauthorizedResult(); - - UpdateProfilePictureServiceModel updateProfilePictureServiceModel = this._userMapper.Map(updateProfilePictureWebModel); - updateProfilePictureServiceModel.UserId = userId; - - ProfilePictureServiceModel profilePictureServiceModel = await this._userService.UpdateProfilePicture(updateProfilePictureServiceModel); - ProfilePictureWebModel profilePictureWebModel = this._userMapper.Map(profilePictureServiceModel); - - return new AcceptedResult("UpdateProfilePicture", profilePictureWebModel); - } - #endregion - - #region Delete - [HttpDelete] - [Authorize(Roles = "User,Admin")] - public async Task Delete(Guid id, [FromHeader] string authorization) - { - if (!await this._userService.ValidJWT(id, authorization)) - return new UnauthorizedResult(); - - bool result = await this._userService.DeleteUser(id); - if (!result) - return new BadRequestObjectResult("Could not delete User"); - - return new OkResult(); - } - #endregion - - [HttpPost] - [Authorize(Roles = "User,Admin")] - [Route("SuperSecretPromotionToAdmin")] - public async Task SuperSecretPromotionToAdmin(Guid userId) - { - return new OkObjectResult(await this._userService.SuperSecretPromotionToAdmin(userId)); - } - } -} diff --git a/src/DevHive.Web/DevHive.Web.csproj b/src/DevHive.Web/DevHive.Web.csproj deleted file mode 100644 index 0aa2831..0000000 --- a/src/DevHive.Web/DevHive.Web.csproj +++ /dev/null @@ -1,27 +0,0 @@ - - - net5.0 - - - true - latest - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - - - - - - diff --git a/src/DevHive.Web/Middleware/ExceptionMiddleware.cs b/src/DevHive.Web/Middleware/ExceptionMiddleware.cs deleted file mode 100644 index cb6d4ca..0000000 --- a/src/DevHive.Web/Middleware/ExceptionMiddleware.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Net; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Logging; - -namespace DevHive.Web.Middleware -{ - public class ExceptionMiddleware - { - private readonly RequestDelegate _next; - // private readonly ILogger _logger; - - public ExceptionMiddleware(RequestDelegate next) - { - this._next = next; - // this._logger = logger; - } - // public ExceptionMiddleware(RequestDelegate next, ILogger logger) - // { - // this._logger = logger; - // this._next = next; - // } - - public async Task InvokeAsync(HttpContext httpContext) - { - try - { - await this._next(httpContext); - } - catch (Exception ex) - { - // this._logger.LogError($"Something went wrong: {ex}"); - await HandleExceptionAsync(httpContext, ex); - } - } - - private Task HandleExceptionAsync(HttpContext context, Exception exception) - { - context.Response.ContentType = "application/json"; - context.Response.StatusCode = (int)HttpStatusCode.BadRequest; - - return context.Response.WriteAsync(new - { - StatusCode = context.Response.StatusCode, - Message = exception.Message - }.ToString()); - } - } -} diff --git a/src/DevHive.Web/Models/Comment/CreateCommentWebModel.cs b/src/DevHive.Web/Models/Comment/CreateCommentWebModel.cs deleted file mode 100644 index 8b2bf8d..0000000 --- a/src/DevHive.Web/Models/Comment/CreateCommentWebModel.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; - -namespace DevHive.Web.Models.Comment -{ - public class CreateCommentWebModel - { - [NotNull] - [Required] - public Guid PostId { get; set; } - - [NotNull] - [Required] - public string Message { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Comment/ReadCommentWebModel.cs b/src/DevHive.Web/Models/Comment/ReadCommentWebModel.cs deleted file mode 100644 index 4d3aff7..0000000 --- a/src/DevHive.Web/Models/Comment/ReadCommentWebModel.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; - -namespace DevHive.Web.Models.Comment -{ - public class ReadCommentWebModel - { - public Guid CommentId { get; set; } - - public Guid PostId { get; set; } - - public string IssuerFirstName { get; set; } - - public string IssuerLastName { get; set; } - - public string IssuerUsername { get; set; } - - public string Message { get; set; } - - public DateTime TimeCreated { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Comment/UpdateCommentWebModel.cs b/src/DevHive.Web/Models/Comment/UpdateCommentWebModel.cs deleted file mode 100644 index b5d7970..0000000 --- a/src/DevHive.Web/Models/Comment/UpdateCommentWebModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace DevHive.Web.Models.Comment -{ - public class UpdateCommentWebModel - { - public Guid CommentId { get; set; } - - public Guid PostId { get; set; } - - public string NewMessage { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Feed/GetPageWebModel.cs b/src/DevHive.Web/Models/Feed/GetPageWebModel.cs deleted file mode 100644 index 4ea44cc..0000000 --- a/src/DevHive.Web/Models/Feed/GetPageWebModel.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.ComponentModel; -using System.ComponentModel.DataAnnotations; - -namespace DevHive.Web.Models.Feed -{ - public class GetPageWebModel - { - [Range(1, int.MaxValue)] - public int PageNumber { get; set; } - - [Required] - public DateTime FirstPageTimeIssued { get; set; } - - [DefaultValue(5)] - [Range(1, int.MaxValue)] - public int PageSize { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Feed/ReadPageWebModel.cs b/src/DevHive.Web/Models/Feed/ReadPageWebModel.cs deleted file mode 100644 index f429313..0000000 --- a/src/DevHive.Web/Models/Feed/ReadPageWebModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; -using DevHive.Web.Models.Post; - -namespace DevHive.Web.Models.Comment -{ - public class ReadPageWebModel - { - public List Posts { get; set; } = new(); - } -} diff --git a/src/DevHive.Web/Models/Identity/Role/CreateRoleWebModel.cs b/src/DevHive.Web/Models/Identity/Role/CreateRoleWebModel.cs deleted file mode 100644 index 859cdd9..0000000 --- a/src/DevHive.Web/Models/Identity/Role/CreateRoleWebModel.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; - -namespace DevHive.Web.Models.Identity.Role -{ - public class CreateRoleWebModel - { - [NotNull] - [Required] - [MinLength(3)] - [MaxLength(50)] - public string Name { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Identity/Role/RoleWebModel.cs b/src/DevHive.Web/Models/Identity/Role/RoleWebModel.cs deleted file mode 100644 index 99b0f50..0000000 --- a/src/DevHive.Web/Models/Identity/Role/RoleWebModel.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; - -namespace DevHive.Web.Models.Identity.Role -{ - public class RoleWebModel - { - [NotNull] - [Required] - [MinLength(3)] - [MaxLength(50)] - public string Name { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Identity/Role/UpdateRoleWebModel.cs b/src/DevHive.Web/Models/Identity/Role/UpdateRoleWebModel.cs deleted file mode 100644 index 3870481..0000000 --- a/src/DevHive.Web/Models/Identity/Role/UpdateRoleWebModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; - -namespace DevHive.Web.Models.Identity.Role -{ - public class UpdateRoleWebModel - { - [NotNull] - [Required] - [MinLength(3)] - [MaxLength(50)] - public string Name { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Identity/User/BaseUserWebModel.cs b/src/DevHive.Web/Models/Identity/User/BaseUserWebModel.cs deleted file mode 100644 index 297e1a5..0000000 --- a/src/DevHive.Web/Models/Identity/User/BaseUserWebModel.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; -using DevHive.Web.Attributes; - -namespace DevHive.Web.Models.Identity.User -{ - public class BaseUserWebModel - { - [NotNull] - [Required] - [MinLength(3)] - [MaxLength(50)] - public string UserName { get; set; } - - [NotNull] - [Required] - [EmailAddress] - public string Email { get; set; } - - [NotNull] - [Required] - [MinLength(3)] - [MaxLength(30)] - [OnlyLetters(ErrorMessage = "First name can only contain letters!")] - public string FirstName { get; set; } - - [NotNull] - [Required] - [MinLength(3)] - [MaxLength(30)] - [OnlyLetters(ErrorMessage = "Last name can only contain letters!")] - public string LastName { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Identity/User/LoginWebModel.cs b/src/DevHive.Web/Models/Identity/User/LoginWebModel.cs deleted file mode 100644 index ccd806f..0000000 --- a/src/DevHive.Web/Models/Identity/User/LoginWebModel.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; -using DevHive.Web.Attributes; - -namespace DevHive.Web.Models.Identity.User -{ - public class LoginWebModel - { - [NotNull] - [Required] - [MinLength(3)] - [MaxLength(50)] - public string UserName { get; set; } - - [NotNull] - [Required] - [GoodPassword] - public string Password { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Identity/User/ProfilePictureWebModel.cs b/src/DevHive.Web/Models/Identity/User/ProfilePictureWebModel.cs deleted file mode 100644 index 9fb1516..0000000 --- a/src/DevHive.Web/Models/Identity/User/ProfilePictureWebModel.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace DevHive.Web.Models.Identity.User -{ - public class ProfilePictureWebModel - { - public string ProfilePictureURL { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Identity/User/RegisterWebModel.cs b/src/DevHive.Web/Models/Identity/User/RegisterWebModel.cs deleted file mode 100644 index 0fc7ec6..0000000 --- a/src/DevHive.Web/Models/Identity/User/RegisterWebModel.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; -using DevHive.Web.Attributes; - -namespace DevHive.Web.Models.Identity.User -{ - public class RegisterWebModel : BaseUserWebModel - { - [NotNull] - [Required] - [GoodPassword] - public string Password { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Identity/User/TokenWebModel.cs b/src/DevHive.Web/Models/Identity/User/TokenWebModel.cs deleted file mode 100644 index 154b64b..0000000 --- a/src/DevHive.Web/Models/Identity/User/TokenWebModel.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace DevHive.Web.Models.Identity.User -{ - public class TokenWebModel - { - public TokenWebModel(string token) - { - this.Token = token; - } - - public string Token { get; set; } - } -} \ No newline at end of file diff --git a/src/DevHive.Web/Models/Identity/User/UpdateProfilePictureWebModel.cs b/src/DevHive.Web/Models/Identity/User/UpdateProfilePictureWebModel.cs deleted file mode 100644 index 6efe968..0000000 --- a/src/DevHive.Web/Models/Identity/User/UpdateProfilePictureWebModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Microsoft.AspNetCore.Http; - -namespace DevHive.Web.Models.Identity.User -{ - public class UpdateProfilePictureWebModel - { - public IFormFile Picture { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Identity/User/UpdateUserWebModel.cs b/src/DevHive.Web/Models/Identity/User/UpdateUserWebModel.cs deleted file mode 100644 index 62901f6..0000000 --- a/src/DevHive.Web/Models/Identity/User/UpdateUserWebModel.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; -using DevHive.Web.Attributes; -using DevHive.Web.Models.Identity.Role; -using DevHive.Web.Models.Language; -using DevHive.Web.Models.Technology; - -namespace DevHive.Web.Models.Identity.User -{ - public class UpdateUserWebModel : BaseUserWebModel - { - [NotNull] - [Required] - [GoodPassword] - public string Password { get; set; } - - [NotNull] - [Required] - public HashSet Friends { get; set; } - - [NotNull] - [Required] - public HashSet Roles { get; set; } - - [NotNull] - [Required] - public HashSet Languages { get; set; } - - [NotNull] - [Required] - public HashSet Technologies { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Identity/User/UserWebModel.cs b/src/DevHive.Web/Models/Identity/User/UserWebModel.cs deleted file mode 100644 index 7ab8cca..0000000 --- a/src/DevHive.Web/Models/Identity/User/UserWebModel.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; -using DevHive.Common.Models.Misc; -using DevHive.Web.Models.Identity.Role; -using DevHive.Web.Models.Language; -using DevHive.Web.Models.Technology; - -namespace DevHive.Web.Models.Identity.User -{ - public class UserWebModel : BaseUserWebModel - { - public string ProfilePictureURL { get; set; } - - [NotNull] - [Required] - public HashSet Roles { get; set; } = new(); - - [NotNull] - [Required] - public HashSet Friends { get; set; } = new(); - - [NotNull] - [Required] - public HashSet Languages { get; set; } = new(); - - [NotNull] - [Required] - public HashSet Technologies { get; set; } = new(); - - public List Posts { get; set; } = new(); - } -} diff --git a/src/DevHive.Web/Models/Identity/User/UsernameWebModel.cs b/src/DevHive.Web/Models/Identity/User/UsernameWebModel.cs deleted file mode 100644 index c533bba..0000000 --- a/src/DevHive.Web/Models/Identity/User/UsernameWebModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; -using DevHive.Web.Attributes; - -namespace DevHive.Web.Models.Identity.User -{ - public class UsernameWebModel - { - [NotNull] - [Required] - [MinLength(3)] - [MaxLength(50)] - public string UserName { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Language/CreateLanguageWebModel.cs b/src/DevHive.Web/Models/Language/CreateLanguageWebModel.cs deleted file mode 100644 index a739e7f..0000000 --- a/src/DevHive.Web/Models/Language/CreateLanguageWebModel.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; - -namespace DevHive.Web.Models.Language -{ - public class CreateLanguageWebModel - { - [NotNull] - [Required] - [MinLength(3)] - [MaxLength(50)] - public string Name { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Language/LanguageWebModel.cs b/src/DevHive.Web/Models/Language/LanguageWebModel.cs deleted file mode 100644 index 7515e70..0000000 --- a/src/DevHive.Web/Models/Language/LanguageWebModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; - -namespace DevHive.Web.Models.Language -{ - public class LanguageWebModel - { - [NotNull] - [Required] - public Guid Id { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Language/ReadLanguageWebModel.cs b/src/DevHive.Web/Models/Language/ReadLanguageWebModel.cs deleted file mode 100644 index 3d9d5b6..0000000 --- a/src/DevHive.Web/Models/Language/ReadLanguageWebModel.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace DevHive.Web.Models.Language -{ - public class ReadLanguageWebModel - { - public Guid Id { get; set; } - - public string Name { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs b/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs deleted file mode 100644 index 128d534..0000000 --- a/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; - -namespace DevHive.Web.Models.Language -{ - public class UpdateLanguageWebModel - { - [NotNull] - [Required] - [MinLength(3)] - [MaxLength(50)] - public string Name { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Post/CreatePostWebModel.cs b/src/DevHive.Web/Models/Post/CreatePostWebModel.cs deleted file mode 100644 index 237259d..0000000 --- a/src/DevHive.Web/Models/Post/CreatePostWebModel.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; -using Microsoft.AspNetCore.Http; - -namespace DevHive.Web.Models.Post -{ - public class CreatePostWebModel - { - [NotNull] - [Required] - public string Message { get; set; } - - public List Files { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Post/Rating/RatePostWebModel.cs b/src/DevHive.Web/Models/Post/Rating/RatePostWebModel.cs deleted file mode 100644 index 5f0e58f..0000000 --- a/src/DevHive.Web/Models/Post/Rating/RatePostWebModel.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace DevHive.Web.Models.Post.Rating -{ - public class RatePostWebModel - { - public Guid PostId { get; set; } - - public bool Liked { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Post/Rating/ReadPostRatingWebModel.cs b/src/DevHive.Web/Models/Post/Rating/ReadPostRatingWebModel.cs deleted file mode 100644 index a551fb8..0000000 --- a/src/DevHive.Web/Models/Post/Rating/ReadPostRatingWebModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace DevHive.Web.Models.Post.Rating -{ - public class ReadPostRatingWebModel - { - public Guid Id { get; set; } - - public Guid PostId { get; set; } - - public int Likes { get; set; } - - public int Dislikes { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Post/ReadPostWebModel.cs b/src/DevHive.Web/Models/Post/ReadPostWebModel.cs deleted file mode 100644 index 8238f47..0000000 --- a/src/DevHive.Web/Models/Post/ReadPostWebModel.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using DevHive.Common.Models.Misc; - -namespace DevHive.Web.Models.Post -{ - public class ReadPostWebModel - { - public Guid PostId { get; set; } - - public string CreatorFirstName { get; set; } - - public string CreatorLastName { get; set; } - - public string CreatorUsername { get; set; } - - public string Message { get; set; } - - public DateTime TimeCreated { get; set; } - - public List Comments { get; set; } - - public List FileUrls { get; set; } - // public List Files { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Post/UpdatePostWebModel.cs b/src/DevHive.Web/Models/Post/UpdatePostWebModel.cs deleted file mode 100644 index a0c9b61..0000000 --- a/src/DevHive.Web/Models/Post/UpdatePostWebModel.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; -using Microsoft.AspNetCore.Http; - -namespace DevHive.Web.Models.Post -{ - public class UpdatePostWebModel - { - [Required] - [NotNull] - public Guid PostId { get; set; } - - [NotNull] - [Required] - public string NewMessage { get; set; } - - public List Files { get; set; } = new(); - } -} diff --git a/src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs b/src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs deleted file mode 100644 index ec9ec15..0000000 --- a/src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; - -namespace DevHive.Web.Models.Technology -{ - public class CreateTechnologyWebModel - { - [NotNull] - [Required] - [MinLength(3)] - [MaxLength(50)] - public string Name { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Technology/ReadTechnologyWebModel.cs b/src/DevHive.Web/Models/Technology/ReadTechnologyWebModel.cs deleted file mode 100644 index 94542d7..0000000 --- a/src/DevHive.Web/Models/Technology/ReadTechnologyWebModel.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace DevHive.Web.Models.Technology -{ - public class ReadTechnologyWebModel - { - public Guid Id { get; set; } - - public string Name { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Technology/TechnologyWebModel.cs b/src/DevHive.Web/Models/Technology/TechnologyWebModel.cs deleted file mode 100644 index 6e8273b..0000000 --- a/src/DevHive.Web/Models/Technology/TechnologyWebModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; - -namespace DevHive.Web.Models.Technology -{ - public class TechnologyWebModel - { - [NotNull] - [Required] - public Guid Id { get; set; } - } -} diff --git a/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs b/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs deleted file mode 100644 index 3e9fe2a..0000000 --- a/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; - -namespace DevHive.Web.Models.Technology -{ - public class UpdateTechnologyWebModel - { - [NotNull] - [Required] - [MinLength(3)] - [MaxLength(50)] - public string Name { get; set; } - } -} diff --git a/src/DevHive.Web/Program.cs b/src/DevHive.Web/Program.cs deleted file mode 100644 index 6982da9..0000000 --- a/src/DevHive.Web/Program.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; - -namespace DevHive.Web -{ - public class Program - { - private const int HTTP_PORT = 5000; - - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.ConfigureKestrel(opt => opt.ListenLocalhost(HTTP_PORT)); - webBuilder.UseStartup(); - }); - } -} diff --git a/src/DevHive.Web/Properties/launchSettings.json b/src/DevHive.Web/Properties/launchSettings.json deleted file mode 100644 index 2b65d0b..0000000 --- a/src/DevHive.Web/Properties/launchSettings.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:1955", - "sslPort": 44326 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": false, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "DevHive.Web": { - "commandName": "Project", - "dotnetRunMessages": "true", - "launchBrowser": false, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "DevHive.Web Production": { - "commandName": "Project", - "dotnetRunMessages": "true", - "launchBrowser": false, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Production" - } - } - } -} diff --git a/src/DevHive.Web/Startup.cs b/src/DevHive.Web/Startup.cs deleted file mode 100644 index 46521cf..0000000 --- a/src/DevHive.Web/Startup.cs +++ /dev/null @@ -1,70 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using DevHive.Web.Configurations.Extensions; -using Newtonsoft.Json; - -namespace DevHive.Web -{ - public class Startup - { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - // This method gets called by the runtime. Use this method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - services.AddCors(); - - services.AddControllers() - .AddNewtonsoftJson(x => - { - x.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; - }); - - services.DatabaseConfiguration(Configuration); - services.SwaggerConfiguration(); - services.JWTConfiguration(Configuration); - services.AutoMapperConfiguration(); - services.DependencyInjectionConfiguration(this.Configuration); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - app.UseCors(x => x - .AllowAnyMethod() - .AllowAnyHeader() - .SetIsOriginAllowed(origin => true) // allow any origin - .AllowCredentials()); // allow credentials - - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - app.UseSwaggerConfiguration(); - } - else - { - app.UseHsts(); - app.UseExceptionHandlerMiddlewareConfiguration(); - } - - app.UseDatabaseConfiguration(); - app.UseAutoMapperConfiguration(); - - app.UseEndpoints(endpoints => - { - endpoints.MapControllerRoute( - name: "default", - pattern: "api/{controller}/{action}" - ); - }); - } - } -} diff --git a/src/DevHive.Web/appsettings.json b/src/DevHive.Web/appsettings.json deleted file mode 100644 index bcdcae7..0000000 --- a/src/DevHive.Web/appsettings.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "AppSettings": { - "Secret": "gXfQlU6qpDleFWyimscjYcT3tgFsQg3yoFjcvSLxG56n1Vu2yptdIUq254wlJWjm" - }, - "ConnectionStrings": { - "DEV": "Server=localhost;Port=5432;Database=API;User Id=postgres;Password=;" - }, - "Cloud": { - "cloudName": "devhive", - "apiKey": "488664116365813", - "apiSecret": "" - }, - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/src/DevHive.code-workspace b/src/DevHive.code-workspace index 086ada2..b355108 100644 --- a/src/DevHive.code-workspace +++ b/src/DevHive.code-workspace @@ -1,25 +1,21 @@ { "folders": [ { - "name": "DevHive.Web", - "path": "./DevHive.Web" + "name": "Web", + "path": "./Web" }, { - "name": "DevHive.Services", - "path": "./DevHive.Services" + "name": "Services", + "path": "./Services" }, { - "name": "DevHive.Data", - "path": "./DevHive.Data" + "name": "Data", + "path": "./Data" }, { - "name": "DevHive.Common", - "path": "./DevHive.Common" + "name": "Common", + "path": "./Common" }, - { - "name": "DevHive.Tests", - "path": "./DevHive.Tests" - } ], "settings": { "files.exclude": { @@ -43,7 +39,7 @@ "type": "coreclr", "request": "launch", "preLaunchTask": "workspace-build", - "program": "${workspaceFolder:DevHive.Web}/bin/Debug/net5.0/DevHive.Web.dll", + "program": "${workspaceFolder:Web}DevHive.Web/bin/Debug/net5.0/DevHive.Web.dll", "args": [], "cwd": "${workspaceFolder:DevHive.Web}", "stopAtEntry": false, @@ -51,17 +47,17 @@ "ASPNETCORE_ENVIRONMENT": "Development" }, }, - { - "name": "Launch Data Tests", - "type": "coreclr", - "request": "launch", - "preLaunchTask": "workspace-build", - "program": "${workspaceFolder:DevHive.Tests}/DevHive.Data.Tests/bin/Debug/net5.0/DevHive.Data.Tests.dll", - "args": [], - "cwd": "${workspaceFolder:DevHive.Tests}/DevHive.Data.Tests", - "console": "internalConsole", - "stopAtEntry": false - }, + // { + // "name": "Launch Data Tests", + // "type": "coreclr", + // "request": "launch", + // "preLaunchTask": "workspace-build", + // "program": "${workspaceFolder:DevHive.Tests}/DevHive.Data.Tests/bin/Debug/net5.0/DevHive.Data.Tests.dll", + // "args": [], + // "cwd": "${workspaceFolder:DevHive.Tests}/DevHive.Data.Tests", + // "console": "internalConsole", + // "stopAtEntry": false + // }, ], "compounds": [] }, diff --git a/src/DevHive.sln b/src/DevHive.sln index aa58d9c..73c5b85 100644 --- a/src/DevHive.sln +++ b/src/DevHive.sln @@ -3,26 +3,38 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30717.126 MinimumVisualStudioVersion = 15.0.26124.0 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevHive.Data", "DevHive.Data\DevHive.Data.csproj", "{A175F293-9209-46BF-803E-72E39590246F}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{2E5E3F99-7936-4F3B-974E-A98000D1564B}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevHive.Services", "DevHive.Services\DevHive.Services.csproj", "{4D4EAC98-A72F-4265-9876-3E87453F80AC}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Web", "Web", "{2ED11F7C-A247-48F6-99ED-CD0AA89C6A28}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevHive.Web", "DevHive.Web\DevHive.Web.csproj", "{FF82DC4E-B4C8-4B49-AC73-43A26CFC73DA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DevHive.Web", "Web\DevHive.Web\DevHive.Web.csproj", "{BD295280-3F69-4BDD-8715-526E9852930E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevHive.Common", "DevHive.Common\DevHive.Common.csproj", "{843BF55D-20AC-41E7-922E-209648625D98}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{C94823A0-150D-49E0-9913-628FB5D67370}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DevHive.Tests", "DevHive.Tests", "{8ED705F9-7038-472C-B53F-5B1480A74A37}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DevHive.Services", "Services\DevHive.Services\DevHive.Services.csproj", "{897281A2-C315-42DA-92CB-267DF91D8A4B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevHive.Data.Tests", "DevHive.Tests\DevHive.Data.Tests\DevHive.Data.Tests.csproj", "{346876CE-2C9B-4538-BE82-EA2017F7D405}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Data", "Data", "{9A0158E8-834E-4B8C-B62B-2BF6FF0E3518}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevHive.Services.Tests", "DevHive.Tests\DevHive.Services.Tests\DevHive.Services.Tests.csproj", "{9BBB8A48-C5AF-4F35-925F-3404A74E47F4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DevHive.Data", "Data\DevHive.Data\DevHive.Data.csproj", "{A28CAD8A-CDA9-42AD-8701-2DAE5D55EC9C}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevHive.Web.Tests", "DevHive.Tests\DevHive.Web.Tests\DevHive.Web.Tests.csproj", "{2574CDBE-CC99-4BF8-BF7F-34C131788036}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DevHive.Web.Tests", "Web\DevHive.Web.Tests\DevHive.Web.Tests.csproj", "{251A09C6-28CA-4E9E-B482-0B10ABE293FF}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{2E5E3F99-7936-4F3B-974E-A98000D1564B}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - EndProjectSection +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DevHive.Services.Tests", "Services\DevHive.Services.Tests\DevHive.Services.Tests.csproj", "{3E86ACCF-9F49-4D51-B152-4ACD6801211D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DevHive.Data.Tests", "Data\DevHive.Data.Tests\DevHive.Data.Tests.csproj", "{E6E401DC-43A0-4562-8584-4FA81FE0206C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DevHive.Web.Models", "Web\DevHive.Web.Models\DevHive.Web.Models.csproj", "{746A1043-A016-4CA6-953A-CECD02020E28}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DevHive.Services.Models", "Services\DevHive.Services.Models\DevHive.Services.Models.csproj", "{2B1E8E07-9E8C-4FE5-ADA7-F67BCBDD1D17}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DevHive.Data.Models", "Data\DevHive.Data.Models\DevHive.Data.Models.csproj", "{7FFECB5A-E23F-44E0-A978-416DBF075406}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{2C2D8ED7-CBBF-4E79-AC21-C932C6FA651B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DevHive.Common", "Common\DevHive.Common.Models\DevHive.Common.csproj", "{34E78E35-2476-4925-864A-467C2BC5042B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -34,98 +46,141 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A175F293-9209-46BF-803E-72E39590246F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A175F293-9209-46BF-803E-72E39590246F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A175F293-9209-46BF-803E-72E39590246F}.Debug|x64.ActiveCfg = Debug|Any CPU - {A175F293-9209-46BF-803E-72E39590246F}.Debug|x64.Build.0 = Debug|Any CPU - {A175F293-9209-46BF-803E-72E39590246F}.Debug|x86.ActiveCfg = Debug|Any CPU - {A175F293-9209-46BF-803E-72E39590246F}.Debug|x86.Build.0 = Debug|Any CPU - {A175F293-9209-46BF-803E-72E39590246F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A175F293-9209-46BF-803E-72E39590246F}.Release|Any CPU.Build.0 = Release|Any CPU - {A175F293-9209-46BF-803E-72E39590246F}.Release|x64.ActiveCfg = Release|Any CPU - {A175F293-9209-46BF-803E-72E39590246F}.Release|x64.Build.0 = Release|Any CPU - {A175F293-9209-46BF-803E-72E39590246F}.Release|x86.ActiveCfg = Release|Any CPU - {A175F293-9209-46BF-803E-72E39590246F}.Release|x86.Build.0 = Release|Any CPU - {4D4EAC98-A72F-4265-9876-3E87453F80AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4D4EAC98-A72F-4265-9876-3E87453F80AC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4D4EAC98-A72F-4265-9876-3E87453F80AC}.Debug|x64.ActiveCfg = Debug|Any CPU - {4D4EAC98-A72F-4265-9876-3E87453F80AC}.Debug|x64.Build.0 = Debug|Any CPU - {4D4EAC98-A72F-4265-9876-3E87453F80AC}.Debug|x86.ActiveCfg = Debug|Any CPU - {4D4EAC98-A72F-4265-9876-3E87453F80AC}.Debug|x86.Build.0 = Debug|Any CPU - {4D4EAC98-A72F-4265-9876-3E87453F80AC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4D4EAC98-A72F-4265-9876-3E87453F80AC}.Release|Any CPU.Build.0 = Release|Any CPU - {4D4EAC98-A72F-4265-9876-3E87453F80AC}.Release|x64.ActiveCfg = Release|Any CPU - {4D4EAC98-A72F-4265-9876-3E87453F80AC}.Release|x64.Build.0 = Release|Any CPU - {4D4EAC98-A72F-4265-9876-3E87453F80AC}.Release|x86.ActiveCfg = Release|Any CPU - {4D4EAC98-A72F-4265-9876-3E87453F80AC}.Release|x86.Build.0 = Release|Any CPU - {FF82DC4E-B4C8-4B49-AC73-43A26CFC73DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FF82DC4E-B4C8-4B49-AC73-43A26CFC73DA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FF82DC4E-B4C8-4B49-AC73-43A26CFC73DA}.Debug|x64.ActiveCfg = Debug|Any CPU - {FF82DC4E-B4C8-4B49-AC73-43A26CFC73DA}.Debug|x64.Build.0 = Debug|Any CPU - {FF82DC4E-B4C8-4B49-AC73-43A26CFC73DA}.Debug|x86.ActiveCfg = Debug|Any CPU - {FF82DC4E-B4C8-4B49-AC73-43A26CFC73DA}.Debug|x86.Build.0 = Debug|Any CPU - {FF82DC4E-B4C8-4B49-AC73-43A26CFC73DA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FF82DC4E-B4C8-4B49-AC73-43A26CFC73DA}.Release|Any CPU.Build.0 = Release|Any CPU - {FF82DC4E-B4C8-4B49-AC73-43A26CFC73DA}.Release|x64.ActiveCfg = Release|Any CPU - {FF82DC4E-B4C8-4B49-AC73-43A26CFC73DA}.Release|x64.Build.0 = Release|Any CPU - {FF82DC4E-B4C8-4B49-AC73-43A26CFC73DA}.Release|x86.ActiveCfg = Release|Any CPU - {FF82DC4E-B4C8-4B49-AC73-43A26CFC73DA}.Release|x86.Build.0 = Release|Any CPU - {843BF55D-20AC-41E7-922E-209648625D98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {843BF55D-20AC-41E7-922E-209648625D98}.Debug|Any CPU.Build.0 = Debug|Any CPU - {843BF55D-20AC-41E7-922E-209648625D98}.Debug|x64.ActiveCfg = Debug|Any CPU - {843BF55D-20AC-41E7-922E-209648625D98}.Debug|x64.Build.0 = Debug|Any CPU - {843BF55D-20AC-41E7-922E-209648625D98}.Debug|x86.ActiveCfg = Debug|Any CPU - {843BF55D-20AC-41E7-922E-209648625D98}.Debug|x86.Build.0 = Debug|Any CPU - {843BF55D-20AC-41E7-922E-209648625D98}.Release|Any CPU.ActiveCfg = Release|Any CPU - {843BF55D-20AC-41E7-922E-209648625D98}.Release|Any CPU.Build.0 = Release|Any CPU - {843BF55D-20AC-41E7-922E-209648625D98}.Release|x64.ActiveCfg = Release|Any CPU - {843BF55D-20AC-41E7-922E-209648625D98}.Release|x64.Build.0 = Release|Any CPU - {843BF55D-20AC-41E7-922E-209648625D98}.Release|x86.ActiveCfg = Release|Any CPU - {843BF55D-20AC-41E7-922E-209648625D98}.Release|x86.Build.0 = Release|Any CPU - {346876CE-2C9B-4538-BE82-EA2017F7D405}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {346876CE-2C9B-4538-BE82-EA2017F7D405}.Debug|Any CPU.Build.0 = Debug|Any CPU - {346876CE-2C9B-4538-BE82-EA2017F7D405}.Debug|x64.ActiveCfg = Debug|Any CPU - {346876CE-2C9B-4538-BE82-EA2017F7D405}.Debug|x64.Build.0 = Debug|Any CPU - {346876CE-2C9B-4538-BE82-EA2017F7D405}.Debug|x86.ActiveCfg = Debug|Any CPU - {346876CE-2C9B-4538-BE82-EA2017F7D405}.Debug|x86.Build.0 = Debug|Any CPU - {346876CE-2C9B-4538-BE82-EA2017F7D405}.Release|Any CPU.ActiveCfg = Release|Any CPU - {346876CE-2C9B-4538-BE82-EA2017F7D405}.Release|Any CPU.Build.0 = Release|Any CPU - {346876CE-2C9B-4538-BE82-EA2017F7D405}.Release|x64.ActiveCfg = Release|Any CPU - {346876CE-2C9B-4538-BE82-EA2017F7D405}.Release|x64.Build.0 = Release|Any CPU - {346876CE-2C9B-4538-BE82-EA2017F7D405}.Release|x86.ActiveCfg = Release|Any CPU - {346876CE-2C9B-4538-BE82-EA2017F7D405}.Release|x86.Build.0 = Release|Any CPU - {9BBB8A48-C5AF-4F35-925F-3404A74E47F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9BBB8A48-C5AF-4F35-925F-3404A74E47F4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9BBB8A48-C5AF-4F35-925F-3404A74E47F4}.Debug|x64.ActiveCfg = Debug|Any CPU - {9BBB8A48-C5AF-4F35-925F-3404A74E47F4}.Debug|x64.Build.0 = Debug|Any CPU - {9BBB8A48-C5AF-4F35-925F-3404A74E47F4}.Debug|x86.ActiveCfg = Debug|Any CPU - {9BBB8A48-C5AF-4F35-925F-3404A74E47F4}.Debug|x86.Build.0 = Debug|Any CPU - {9BBB8A48-C5AF-4F35-925F-3404A74E47F4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9BBB8A48-C5AF-4F35-925F-3404A74E47F4}.Release|Any CPU.Build.0 = Release|Any CPU - {9BBB8A48-C5AF-4F35-925F-3404A74E47F4}.Release|x64.ActiveCfg = Release|Any CPU - {9BBB8A48-C5AF-4F35-925F-3404A74E47F4}.Release|x64.Build.0 = Release|Any CPU - {9BBB8A48-C5AF-4F35-925F-3404A74E47F4}.Release|x86.ActiveCfg = Release|Any CPU - {9BBB8A48-C5AF-4F35-925F-3404A74E47F4}.Release|x86.Build.0 = Release|Any CPU - {2574CDBE-CC99-4BF8-BF7F-34C131788036}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2574CDBE-CC99-4BF8-BF7F-34C131788036}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2574CDBE-CC99-4BF8-BF7F-34C131788036}.Debug|x64.ActiveCfg = Debug|Any CPU - {2574CDBE-CC99-4BF8-BF7F-34C131788036}.Debug|x64.Build.0 = Debug|Any CPU - {2574CDBE-CC99-4BF8-BF7F-34C131788036}.Debug|x86.ActiveCfg = Debug|Any CPU - {2574CDBE-CC99-4BF8-BF7F-34C131788036}.Debug|x86.Build.0 = Debug|Any CPU - {2574CDBE-CC99-4BF8-BF7F-34C131788036}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2574CDBE-CC99-4BF8-BF7F-34C131788036}.Release|Any CPU.Build.0 = Release|Any CPU - {2574CDBE-CC99-4BF8-BF7F-34C131788036}.Release|x64.ActiveCfg = Release|Any CPU - {2574CDBE-CC99-4BF8-BF7F-34C131788036}.Release|x64.Build.0 = Release|Any CPU - {2574CDBE-CC99-4BF8-BF7F-34C131788036}.Release|x86.ActiveCfg = Release|Any CPU - {2574CDBE-CC99-4BF8-BF7F-34C131788036}.Release|x86.Build.0 = Release|Any CPU + {BD295280-3F69-4BDD-8715-526E9852930E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD295280-3F69-4BDD-8715-526E9852930E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD295280-3F69-4BDD-8715-526E9852930E}.Debug|x64.ActiveCfg = Debug|Any CPU + {BD295280-3F69-4BDD-8715-526E9852930E}.Debug|x64.Build.0 = Debug|Any CPU + {BD295280-3F69-4BDD-8715-526E9852930E}.Debug|x86.ActiveCfg = Debug|Any CPU + {BD295280-3F69-4BDD-8715-526E9852930E}.Debug|x86.Build.0 = Debug|Any CPU + {BD295280-3F69-4BDD-8715-526E9852930E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD295280-3F69-4BDD-8715-526E9852930E}.Release|Any CPU.Build.0 = Release|Any CPU + {BD295280-3F69-4BDD-8715-526E9852930E}.Release|x64.ActiveCfg = Release|Any CPU + {BD295280-3F69-4BDD-8715-526E9852930E}.Release|x64.Build.0 = Release|Any CPU + {BD295280-3F69-4BDD-8715-526E9852930E}.Release|x86.ActiveCfg = Release|Any CPU + {BD295280-3F69-4BDD-8715-526E9852930E}.Release|x86.Build.0 = Release|Any CPU + {897281A2-C315-42DA-92CB-267DF91D8A4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {897281A2-C315-42DA-92CB-267DF91D8A4B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {897281A2-C315-42DA-92CB-267DF91D8A4B}.Debug|x64.ActiveCfg = Debug|Any CPU + {897281A2-C315-42DA-92CB-267DF91D8A4B}.Debug|x64.Build.0 = Debug|Any CPU + {897281A2-C315-42DA-92CB-267DF91D8A4B}.Debug|x86.ActiveCfg = Debug|Any CPU + {897281A2-C315-42DA-92CB-267DF91D8A4B}.Debug|x86.Build.0 = Debug|Any CPU + {897281A2-C315-42DA-92CB-267DF91D8A4B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {897281A2-C315-42DA-92CB-267DF91D8A4B}.Release|Any CPU.Build.0 = Release|Any CPU + {897281A2-C315-42DA-92CB-267DF91D8A4B}.Release|x64.ActiveCfg = Release|Any CPU + {897281A2-C315-42DA-92CB-267DF91D8A4B}.Release|x64.Build.0 = Release|Any CPU + {897281A2-C315-42DA-92CB-267DF91D8A4B}.Release|x86.ActiveCfg = Release|Any CPU + {897281A2-C315-42DA-92CB-267DF91D8A4B}.Release|x86.Build.0 = Release|Any CPU + {A28CAD8A-CDA9-42AD-8701-2DAE5D55EC9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A28CAD8A-CDA9-42AD-8701-2DAE5D55EC9C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A28CAD8A-CDA9-42AD-8701-2DAE5D55EC9C}.Debug|x64.ActiveCfg = Debug|Any CPU + {A28CAD8A-CDA9-42AD-8701-2DAE5D55EC9C}.Debug|x64.Build.0 = Debug|Any CPU + {A28CAD8A-CDA9-42AD-8701-2DAE5D55EC9C}.Debug|x86.ActiveCfg = Debug|Any CPU + {A28CAD8A-CDA9-42AD-8701-2DAE5D55EC9C}.Debug|x86.Build.0 = Debug|Any CPU + {A28CAD8A-CDA9-42AD-8701-2DAE5D55EC9C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A28CAD8A-CDA9-42AD-8701-2DAE5D55EC9C}.Release|Any CPU.Build.0 = Release|Any CPU + {A28CAD8A-CDA9-42AD-8701-2DAE5D55EC9C}.Release|x64.ActiveCfg = Release|Any CPU + {A28CAD8A-CDA9-42AD-8701-2DAE5D55EC9C}.Release|x64.Build.0 = Release|Any CPU + {A28CAD8A-CDA9-42AD-8701-2DAE5D55EC9C}.Release|x86.ActiveCfg = Release|Any CPU + {A28CAD8A-CDA9-42AD-8701-2DAE5D55EC9C}.Release|x86.Build.0 = Release|Any CPU + {251A09C6-28CA-4E9E-B482-0B10ABE293FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {251A09C6-28CA-4E9E-B482-0B10ABE293FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {251A09C6-28CA-4E9E-B482-0B10ABE293FF}.Debug|x64.ActiveCfg = Debug|Any CPU + {251A09C6-28CA-4E9E-B482-0B10ABE293FF}.Debug|x64.Build.0 = Debug|Any CPU + {251A09C6-28CA-4E9E-B482-0B10ABE293FF}.Debug|x86.ActiveCfg = Debug|Any CPU + {251A09C6-28CA-4E9E-B482-0B10ABE293FF}.Debug|x86.Build.0 = Debug|Any CPU + {251A09C6-28CA-4E9E-B482-0B10ABE293FF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {251A09C6-28CA-4E9E-B482-0B10ABE293FF}.Release|Any CPU.Build.0 = Release|Any CPU + {251A09C6-28CA-4E9E-B482-0B10ABE293FF}.Release|x64.ActiveCfg = Release|Any CPU + {251A09C6-28CA-4E9E-B482-0B10ABE293FF}.Release|x64.Build.0 = Release|Any CPU + {251A09C6-28CA-4E9E-B482-0B10ABE293FF}.Release|x86.ActiveCfg = Release|Any CPU + {251A09C6-28CA-4E9E-B482-0B10ABE293FF}.Release|x86.Build.0 = Release|Any CPU + {3E86ACCF-9F49-4D51-B152-4ACD6801211D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E86ACCF-9F49-4D51-B152-4ACD6801211D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E86ACCF-9F49-4D51-B152-4ACD6801211D}.Debug|x64.ActiveCfg = Debug|Any CPU + {3E86ACCF-9F49-4D51-B152-4ACD6801211D}.Debug|x64.Build.0 = Debug|Any CPU + {3E86ACCF-9F49-4D51-B152-4ACD6801211D}.Debug|x86.ActiveCfg = Debug|Any CPU + {3E86ACCF-9F49-4D51-B152-4ACD6801211D}.Debug|x86.Build.0 = Debug|Any CPU + {3E86ACCF-9F49-4D51-B152-4ACD6801211D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E86ACCF-9F49-4D51-B152-4ACD6801211D}.Release|Any CPU.Build.0 = Release|Any CPU + {3E86ACCF-9F49-4D51-B152-4ACD6801211D}.Release|x64.ActiveCfg = Release|Any CPU + {3E86ACCF-9F49-4D51-B152-4ACD6801211D}.Release|x64.Build.0 = Release|Any CPU + {3E86ACCF-9F49-4D51-B152-4ACD6801211D}.Release|x86.ActiveCfg = Release|Any CPU + {3E86ACCF-9F49-4D51-B152-4ACD6801211D}.Release|x86.Build.0 = Release|Any CPU + {E6E401DC-43A0-4562-8584-4FA81FE0206C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6E401DC-43A0-4562-8584-4FA81FE0206C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6E401DC-43A0-4562-8584-4FA81FE0206C}.Debug|x64.ActiveCfg = Debug|Any CPU + {E6E401DC-43A0-4562-8584-4FA81FE0206C}.Debug|x64.Build.0 = Debug|Any CPU + {E6E401DC-43A0-4562-8584-4FA81FE0206C}.Debug|x86.ActiveCfg = Debug|Any CPU + {E6E401DC-43A0-4562-8584-4FA81FE0206C}.Debug|x86.Build.0 = Debug|Any CPU + {E6E401DC-43A0-4562-8584-4FA81FE0206C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6E401DC-43A0-4562-8584-4FA81FE0206C}.Release|Any CPU.Build.0 = Release|Any CPU + {E6E401DC-43A0-4562-8584-4FA81FE0206C}.Release|x64.ActiveCfg = Release|Any CPU + {E6E401DC-43A0-4562-8584-4FA81FE0206C}.Release|x64.Build.0 = Release|Any CPU + {E6E401DC-43A0-4562-8584-4FA81FE0206C}.Release|x86.ActiveCfg = Release|Any CPU + {E6E401DC-43A0-4562-8584-4FA81FE0206C}.Release|x86.Build.0 = Release|Any CPU + {746A1043-A016-4CA6-953A-CECD02020E28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {746A1043-A016-4CA6-953A-CECD02020E28}.Debug|Any CPU.Build.0 = Debug|Any CPU + {746A1043-A016-4CA6-953A-CECD02020E28}.Debug|x64.ActiveCfg = Debug|Any CPU + {746A1043-A016-4CA6-953A-CECD02020E28}.Debug|x64.Build.0 = Debug|Any CPU + {746A1043-A016-4CA6-953A-CECD02020E28}.Debug|x86.ActiveCfg = Debug|Any CPU + {746A1043-A016-4CA6-953A-CECD02020E28}.Debug|x86.Build.0 = Debug|Any CPU + {746A1043-A016-4CA6-953A-CECD02020E28}.Release|Any CPU.ActiveCfg = Release|Any CPU + {746A1043-A016-4CA6-953A-CECD02020E28}.Release|Any CPU.Build.0 = Release|Any CPU + {746A1043-A016-4CA6-953A-CECD02020E28}.Release|x64.ActiveCfg = Release|Any CPU + {746A1043-A016-4CA6-953A-CECD02020E28}.Release|x64.Build.0 = Release|Any CPU + {746A1043-A016-4CA6-953A-CECD02020E28}.Release|x86.ActiveCfg = Release|Any CPU + {746A1043-A016-4CA6-953A-CECD02020E28}.Release|x86.Build.0 = Release|Any CPU + {2B1E8E07-9E8C-4FE5-ADA7-F67BCBDD1D17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2B1E8E07-9E8C-4FE5-ADA7-F67BCBDD1D17}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B1E8E07-9E8C-4FE5-ADA7-F67BCBDD1D17}.Debug|x64.ActiveCfg = Debug|Any CPU + {2B1E8E07-9E8C-4FE5-ADA7-F67BCBDD1D17}.Debug|x64.Build.0 = Debug|Any CPU + {2B1E8E07-9E8C-4FE5-ADA7-F67BCBDD1D17}.Debug|x86.ActiveCfg = Debug|Any CPU + {2B1E8E07-9E8C-4FE5-ADA7-F67BCBDD1D17}.Debug|x86.Build.0 = Debug|Any CPU + {2B1E8E07-9E8C-4FE5-ADA7-F67BCBDD1D17}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2B1E8E07-9E8C-4FE5-ADA7-F67BCBDD1D17}.Release|Any CPU.Build.0 = Release|Any CPU + {2B1E8E07-9E8C-4FE5-ADA7-F67BCBDD1D17}.Release|x64.ActiveCfg = Release|Any CPU + {2B1E8E07-9E8C-4FE5-ADA7-F67BCBDD1D17}.Release|x64.Build.0 = Release|Any CPU + {2B1E8E07-9E8C-4FE5-ADA7-F67BCBDD1D17}.Release|x86.ActiveCfg = Release|Any CPU + {2B1E8E07-9E8C-4FE5-ADA7-F67BCBDD1D17}.Release|x86.Build.0 = Release|Any CPU + {7FFECB5A-E23F-44E0-A978-416DBF075406}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7FFECB5A-E23F-44E0-A978-416DBF075406}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7FFECB5A-E23F-44E0-A978-416DBF075406}.Debug|x64.ActiveCfg = Debug|Any CPU + {7FFECB5A-E23F-44E0-A978-416DBF075406}.Debug|x64.Build.0 = Debug|Any CPU + {7FFECB5A-E23F-44E0-A978-416DBF075406}.Debug|x86.ActiveCfg = Debug|Any CPU + {7FFECB5A-E23F-44E0-A978-416DBF075406}.Debug|x86.Build.0 = Debug|Any CPU + {7FFECB5A-E23F-44E0-A978-416DBF075406}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7FFECB5A-E23F-44E0-A978-416DBF075406}.Release|Any CPU.Build.0 = Release|Any CPU + {7FFECB5A-E23F-44E0-A978-416DBF075406}.Release|x64.ActiveCfg = Release|Any CPU + {7FFECB5A-E23F-44E0-A978-416DBF075406}.Release|x64.Build.0 = Release|Any CPU + {7FFECB5A-E23F-44E0-A978-416DBF075406}.Release|x86.ActiveCfg = Release|Any CPU + {7FFECB5A-E23F-44E0-A978-416DBF075406}.Release|x86.Build.0 = Release|Any CPU + {34E78E35-2476-4925-864A-467C2BC5042B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34E78E35-2476-4925-864A-467C2BC5042B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34E78E35-2476-4925-864A-467C2BC5042B}.Debug|x64.ActiveCfg = Debug|Any CPU + {34E78E35-2476-4925-864A-467C2BC5042B}.Debug|x64.Build.0 = Debug|Any CPU + {34E78E35-2476-4925-864A-467C2BC5042B}.Debug|x86.ActiveCfg = Debug|Any CPU + {34E78E35-2476-4925-864A-467C2BC5042B}.Debug|x86.Build.0 = Debug|Any CPU + {34E78E35-2476-4925-864A-467C2BC5042B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34E78E35-2476-4925-864A-467C2BC5042B}.Release|Any CPU.Build.0 = Release|Any CPU + {34E78E35-2476-4925-864A-467C2BC5042B}.Release|x64.ActiveCfg = Release|Any CPU + {34E78E35-2476-4925-864A-467C2BC5042B}.Release|x64.Build.0 = Release|Any CPU + {34E78E35-2476-4925-864A-467C2BC5042B}.Release|x86.ActiveCfg = Release|Any CPU + {34E78E35-2476-4925-864A-467C2BC5042B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {346876CE-2C9B-4538-BE82-EA2017F7D405} = {8ED705F9-7038-472C-B53F-5B1480A74A37} - {9BBB8A48-C5AF-4F35-925F-3404A74E47F4} = {8ED705F9-7038-472C-B53F-5B1480A74A37} - {2574CDBE-CC99-4BF8-BF7F-34C131788036} = {8ED705F9-7038-472C-B53F-5B1480A74A37} + {BD295280-3F69-4BDD-8715-526E9852930E} = {2ED11F7C-A247-48F6-99ED-CD0AA89C6A28} + {897281A2-C315-42DA-92CB-267DF91D8A4B} = {C94823A0-150D-49E0-9913-628FB5D67370} + {A28CAD8A-CDA9-42AD-8701-2DAE5D55EC9C} = {9A0158E8-834E-4B8C-B62B-2BF6FF0E3518} + {251A09C6-28CA-4E9E-B482-0B10ABE293FF} = {2ED11F7C-A247-48F6-99ED-CD0AA89C6A28} + {3E86ACCF-9F49-4D51-B152-4ACD6801211D} = {C94823A0-150D-49E0-9913-628FB5D67370} + {E6E401DC-43A0-4562-8584-4FA81FE0206C} = {9A0158E8-834E-4B8C-B62B-2BF6FF0E3518} + {746A1043-A016-4CA6-953A-CECD02020E28} = {2ED11F7C-A247-48F6-99ED-CD0AA89C6A28} + {2B1E8E07-9E8C-4FE5-ADA7-F67BCBDD1D17} = {C94823A0-150D-49E0-9913-628FB5D67370} + {7FFECB5A-E23F-44E0-A978-416DBF075406} = {9A0158E8-834E-4B8C-B62B-2BF6FF0E3518} + {34E78E35-2476-4925-864A-467C2BC5042B} = {2C2D8ED7-CBBF-4E79-AC21-C932C6FA651B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0F5395E8-26FB-40FD-83A1-EE7766C5E398} diff --git a/src/Services/DevHive.Services.Models/Comment/CreateCommentServiceModel.cs b/src/Services/DevHive.Services.Models/Comment/CreateCommentServiceModel.cs new file mode 100644 index 0000000..30e919b --- /dev/null +++ b/src/Services/DevHive.Services.Models/Comment/CreateCommentServiceModel.cs @@ -0,0 +1,13 @@ +using System; + +namespace DevHive.Services.Models.Comment +{ + public class CreateCommentServiceModel + { + public Guid PostId { get; set; } + + public Guid CreatorId { get; set; } + + public string Message { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Comment/ReadCommentServiceModel.cs b/src/Services/DevHive.Services.Models/Comment/ReadCommentServiceModel.cs new file mode 100644 index 0000000..3196233 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Comment/ReadCommentServiceModel.cs @@ -0,0 +1,21 @@ +using System; + +namespace DevHive.Services.Models.Comment +{ + public class ReadCommentServiceModel + { + public Guid CommentId { get; set; } + + public string IssuerFirstName { get; set; } + + public string IssuerLastName { get; set; } + + public string IssuerUsername { get; set; } + + public Guid PostId { get; set; } + + public string Message { get; set; } + + public DateTime TimeCreated { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Comment/UpdateCommentServiceModel.cs b/src/Services/DevHive.Services.Models/Comment/UpdateCommentServiceModel.cs new file mode 100644 index 0000000..3b78200 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Comment/UpdateCommentServiceModel.cs @@ -0,0 +1,15 @@ +using System; + +namespace DevHive.Services.Models.Comment +{ + public class UpdateCommentServiceModel + { + public Guid CreatorId { get; set; } + + public Guid CommentId { get; set; } + + public Guid PostId { get; set; } + + public string NewMessage { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/DevHive.Services.Models.csproj b/src/Services/DevHive.Services.Models/DevHive.Services.Models.csproj new file mode 100644 index 0000000..ebf5f9c --- /dev/null +++ b/src/Services/DevHive.Services.Models/DevHive.Services.Models.csproj @@ -0,0 +1,11 @@ + + + + net5.0 + + + + + + + diff --git a/src/Services/DevHive.Services.Models/Feed/GetPageServiceModel.cs b/src/Services/DevHive.Services.Models/Feed/GetPageServiceModel.cs new file mode 100644 index 0000000..1f02486 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Feed/GetPageServiceModel.cs @@ -0,0 +1,17 @@ +using System; + +namespace DevHive.Services.Models +{ + public class GetPageServiceModel + { + public Guid UserId { get; set; } + + public string Username { get; set; } + + public int PageNumber { get; set; } + + public DateTime FirstRequestIssued { get; set; } + + public int PageSize { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Feed/ReadPageServiceModel.cs b/src/Services/DevHive.Services.Models/Feed/ReadPageServiceModel.cs new file mode 100644 index 0000000..95f6845 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Feed/ReadPageServiceModel.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using DevHive.Services.Models.Post; + +namespace DevHive.Services.Models +{ + public class ReadPageServiceModel + { + public List Posts { get; set; } = new(); + } +} diff --git a/src/Services/DevHive.Services.Models/Identity/Role/CreateRoleServiceModel.cs b/src/Services/DevHive.Services.Models/Identity/Role/CreateRoleServiceModel.cs new file mode 100644 index 0000000..3bed3fd --- /dev/null +++ b/src/Services/DevHive.Services.Models/Identity/Role/CreateRoleServiceModel.cs @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + +namespace DevHive.Services.Models.Identity.Role +{ + public class CreateRoleServiceModel + { + public string Name { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Identity/Role/RoleServiceModel.cs b/src/Services/DevHive.Services.Models/Identity/Role/RoleServiceModel.cs new file mode 100644 index 0000000..07249fe --- /dev/null +++ b/src/Services/DevHive.Services.Models/Identity/Role/RoleServiceModel.cs @@ -0,0 +1,7 @@ +namespace DevHive.Services.Models.Identity.Role +{ + public class RoleServiceModel + { + public string Name { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Identity/Role/UpdateRoleServiceModel.cs b/src/Services/DevHive.Services.Models/Identity/Role/UpdateRoleServiceModel.cs new file mode 100644 index 0000000..e21e6b4 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Identity/Role/UpdateRoleServiceModel.cs @@ -0,0 +1,10 @@ +using System; + +namespace DevHive.Services.Models.Identity.Role +{ + public class UpdateRoleServiceModel + { + public Guid Id { get; set; } + public string Name { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Identity/User/BaseUserServiceModel.cs b/src/Services/DevHive.Services.Models/Identity/User/BaseUserServiceModel.cs new file mode 100644 index 0000000..514f82a --- /dev/null +++ b/src/Services/DevHive.Services.Models/Identity/User/BaseUserServiceModel.cs @@ -0,0 +1,10 @@ +namespace DevHive.Services.Models.Identity.User +{ + public class BaseUserServiceModel + { + public string UserName { get; set; } + public string Email { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Identity/User/FriendServiceModel.cs b/src/Services/DevHive.Services.Models/Identity/User/FriendServiceModel.cs new file mode 100644 index 0000000..a784f5c --- /dev/null +++ b/src/Services/DevHive.Services.Models/Identity/User/FriendServiceModel.cs @@ -0,0 +1,10 @@ +using System; + +namespace DevHive.Services.Models.Identity.User +{ + public class FriendServiceModel + { + public Guid Id { get; set; } + public string UserName { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Identity/User/LoginServiceModel.cs b/src/Services/DevHive.Services.Models/Identity/User/LoginServiceModel.cs new file mode 100644 index 0000000..4d53283 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Identity/User/LoginServiceModel.cs @@ -0,0 +1,8 @@ +namespace DevHive.Services.Models.Identity.User +{ + public class LoginServiceModel + { + public string UserName { get; set; } + public string Password { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Identity/User/ProfilePictureServiceModel.cs b/src/Services/DevHive.Services.Models/Identity/User/ProfilePictureServiceModel.cs new file mode 100644 index 0000000..ad81057 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Identity/User/ProfilePictureServiceModel.cs @@ -0,0 +1,7 @@ +namespace DevHive.Services.Models.Identity.User +{ + public class ProfilePictureServiceModel + { + public string ProfilePictureURL { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Identity/User/RegisterServiceModel.cs b/src/Services/DevHive.Services.Models/Identity/User/RegisterServiceModel.cs new file mode 100644 index 0000000..adc4119 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Identity/User/RegisterServiceModel.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using DevHive.Services.Models.Language; +using DevHive.Services.Models.Technology; + +namespace DevHive.Services.Models.Identity.User +{ + public class RegisterServiceModel : BaseUserServiceModel + { + public string Password { get; set; } + + public HashSet Languages { get; set; } + + public HashSet Technologies { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Identity/User/UpdateFriendServiceModel.cs b/src/Services/DevHive.Services.Models/Identity/User/UpdateFriendServiceModel.cs new file mode 100644 index 0000000..b0efe10 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Identity/User/UpdateFriendServiceModel.cs @@ -0,0 +1,10 @@ +using System; + +namespace DevHive.Services.Models.Identity.User +{ + public class UpdateFriendServiceModel + { + public Guid Id { get; set; } + public string UserName { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Identity/User/UpdateProfilePictureServiceModel.cs b/src/Services/DevHive.Services.Models/Identity/User/UpdateProfilePictureServiceModel.cs new file mode 100644 index 0000000..8563953 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Identity/User/UpdateProfilePictureServiceModel.cs @@ -0,0 +1,12 @@ +using System; +using Microsoft.AspNetCore.Http; + +namespace DevHive.Services.Models.Identity.User +{ + public class UpdateProfilePictureServiceModel + { + public Guid UserId { get; set; } + + public IFormFile Picture { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Identity/User/UpdateUserServiceModel.cs b/src/Services/DevHive.Services.Models/Identity/User/UpdateUserServiceModel.cs new file mode 100644 index 0000000..b4e4400 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Identity/User/UpdateUserServiceModel.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using DevHive.Services.Models.Identity.Role; +using DevHive.Services.Models.Language; +using DevHive.Services.Models.Technology; + +namespace DevHive.Services.Models.Identity.User +{ + public class UpdateUserServiceModel : BaseUserServiceModel + { + public Guid Id { get; set; } + + public string Password { get; set; } + + public string ProfilePictureURL { get; set; } + + public HashSet Roles { get; set; } = new HashSet(); + + public HashSet Friends { get; set; } = new HashSet(); + + public HashSet Languages { get; set; } = new HashSet(); + + public HashSet Technologies { get; set; } = new HashSet(); + + } +} diff --git a/src/Services/DevHive.Services.Models/Identity/User/UserServiceModel.cs b/src/Services/DevHive.Services.Models/Identity/User/UserServiceModel.cs new file mode 100644 index 0000000..ac7bba2 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Identity/User/UserServiceModel.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using DevHive.Common.Models.Misc; +using DevHive.Services.Models.Identity.Role; +using DevHive.Services.Models.Language; +using DevHive.Services.Models.Technology; + +namespace DevHive.Services.Models.Identity.User +{ + public class UserServiceModel : BaseUserServiceModel + { + public string ProfilePictureURL { get; set; } + + public HashSet Roles { get; set; } = new(); + + public HashSet Friends { get; set; } = new(); + + public HashSet Languages { get; set; } = new(); + + public HashSet Technologies { get; set; } = new(); + + public List Posts { get; set; } = new(); + } +} diff --git a/src/Services/DevHive.Services.Models/Language/CreateLanguageServiceModel.cs b/src/Services/DevHive.Services.Models/Language/CreateLanguageServiceModel.cs new file mode 100644 index 0000000..9d66d3e --- /dev/null +++ b/src/Services/DevHive.Services.Models/Language/CreateLanguageServiceModel.cs @@ -0,0 +1,9 @@ +using System; + +namespace DevHive.Services.Models.Language +{ + public class CreateLanguageServiceModel + { + public string Name { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Language/LanguageServiceModel.cs b/src/Services/DevHive.Services.Models/Language/LanguageServiceModel.cs new file mode 100644 index 0000000..a07aa16 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Language/LanguageServiceModel.cs @@ -0,0 +1,9 @@ +using System; + +namespace DevHive.Services.Models.Language +{ + public class LanguageServiceModel + { + public Guid Id { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Language/ReadLanguageServiceModel.cs b/src/Services/DevHive.Services.Models/Language/ReadLanguageServiceModel.cs new file mode 100644 index 0000000..651dc6d --- /dev/null +++ b/src/Services/DevHive.Services.Models/Language/ReadLanguageServiceModel.cs @@ -0,0 +1,11 @@ +using System; + +namespace DevHive.Services.Models.Language +{ + public class ReadLanguageServiceModel + { + public Guid Id { get; set; } + + public string Name { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Language/UpdateLanguageServiceModel.cs b/src/Services/DevHive.Services.Models/Language/UpdateLanguageServiceModel.cs new file mode 100644 index 0000000..84b7f27 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Language/UpdateLanguageServiceModel.cs @@ -0,0 +1,11 @@ +using System; + +namespace DevHive.Services.Models.Language +{ + public class UpdateLanguageServiceModel + { + public Guid Id { get; set; } + + public string Name { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Post/CreatePostServiceModel.cs b/src/Services/DevHive.Services.Models/Post/CreatePostServiceModel.cs new file mode 100644 index 0000000..304eb90 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Post/CreatePostServiceModel.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using Microsoft.AspNetCore.Http; + +namespace DevHive.Services.Models.Post +{ + public class CreatePostServiceModel + { + public Guid CreatorId { get; set; } + + public string Message { get; set; } + + public List Files { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Post/Rating/RatePostServiceModel.cs b/src/Services/DevHive.Services.Models/Post/Rating/RatePostServiceModel.cs new file mode 100644 index 0000000..d4eb7bd --- /dev/null +++ b/src/Services/DevHive.Services.Models/Post/Rating/RatePostServiceModel.cs @@ -0,0 +1,13 @@ +using System; + +namespace DevHive.Services.Models.Post.Rating +{ + public class RatePostServiceModel + { + public Guid UserId { get; set; } + + public Guid PostId { get; set; } + + public bool Liked { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Post/Rating/ReadPostRatingServiceModel.cs b/src/Services/DevHive.Services.Models/Post/Rating/ReadPostRatingServiceModel.cs new file mode 100644 index 0000000..8c73aaf --- /dev/null +++ b/src/Services/DevHive.Services.Models/Post/Rating/ReadPostRatingServiceModel.cs @@ -0,0 +1,15 @@ +using System; + +namespace DevHive.Services.Models.Post.Rating +{ + public class ReadPostRatingServiceModel + { + public Guid Id { get; set; } + + public Guid PostId { get; set; } + + public int Likes { get; set; } + + public int Dislikes { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Post/ReadPostServiceModel.cs b/src/Services/DevHive.Services.Models/Post/ReadPostServiceModel.cs new file mode 100644 index 0000000..a7aa882 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Post/ReadPostServiceModel.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using DevHive.Common.Models.Misc; + +namespace DevHive.Services.Models.Post +{ + public class ReadPostServiceModel + { + public Guid PostId { get; set; } + + public string CreatorFirstName { get; set; } + + public string CreatorLastName { get; set; } + + public string CreatorUsername { get; set; } + + public string Message { get; set; } + + public DateTime TimeCreated { get; set; } + + public List Comments { get; set; } = new(); + + public List FileUrls { get; set; } + // public List Files { get; set; } = new(); + } +} diff --git a/src/Services/DevHive.Services.Models/Post/UpdatePostServiceModel.cs b/src/Services/DevHive.Services.Models/Post/UpdatePostServiceModel.cs new file mode 100644 index 0000000..51b16bc --- /dev/null +++ b/src/Services/DevHive.Services.Models/Post/UpdatePostServiceModel.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using Microsoft.AspNetCore.Http; + +namespace DevHive.Services.Models.Post +{ + public class UpdatePostServiceModel + { + public Guid PostId { get; set; } + + public Guid CreatorId { get; set; } + + public string NewMessage { get; set; } + + public List Files { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Technology/CreateTechnologyServiceModel.cs b/src/Services/DevHive.Services.Models/Technology/CreateTechnologyServiceModel.cs new file mode 100644 index 0000000..a31d160 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Technology/CreateTechnologyServiceModel.cs @@ -0,0 +1,9 @@ +using System; + +namespace DevHive.Services.Models.Technology +{ + public class CreateTechnologyServiceModel + { + public string Name { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Technology/ReadTechnologyServiceModel.cs b/src/Services/DevHive.Services.Models/Technology/ReadTechnologyServiceModel.cs new file mode 100644 index 0000000..99f4750 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Technology/ReadTechnologyServiceModel.cs @@ -0,0 +1,11 @@ +using System; + +namespace DevHive.Services.Models.Technology +{ + public class ReadTechnologyServiceModel + { + public Guid Id { get; set; } + + public string Name { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Technology/TechnologyServiceModel.cs b/src/Services/DevHive.Services.Models/Technology/TechnologyServiceModel.cs new file mode 100644 index 0000000..cb5c881 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Technology/TechnologyServiceModel.cs @@ -0,0 +1,9 @@ +using System; + +namespace DevHive.Services.Models.Technology +{ + public class TechnologyServiceModel + { + public Guid Id { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Models/Technology/UpdateTechnologyServiceModel.cs b/src/Services/DevHive.Services.Models/Technology/UpdateTechnologyServiceModel.cs new file mode 100644 index 0000000..f4c7921 --- /dev/null +++ b/src/Services/DevHive.Services.Models/Technology/UpdateTechnologyServiceModel.cs @@ -0,0 +1,11 @@ +using System; + +namespace DevHive.Services.Models.Technology +{ + public class UpdateTechnologyServiceModel + { + public Guid Id { get; set; } + + public string Name { get; set; } + } +} diff --git a/src/Services/DevHive.Services.Tests/CommentService.Tests.cs b/src/Services/DevHive.Services.Tests/CommentService.Tests.cs new file mode 100644 index 0000000..ac022ea --- /dev/null +++ b/src/Services/DevHive.Services.Tests/CommentService.Tests.cs @@ -0,0 +1,262 @@ +using System; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using DevHive.Services.Models.Comment; +using DevHive.Services.Services; +using Moq; +using NUnit.Framework; + +namespace DevHive.Services.Tests +{ + [TestFixture] + public class CommentServiceTests + { + private const string MESSAGE = "Gosho Trapov"; + private Mock UserRepositoryMock { get; set; } + private Mock PostRepositoryMock { get; set; } + private Mock CommentRepositoryMock { get; set; } + private Mock MapperMock { get; set; } + private CommentService CommentService { get; set; } + + #region Setup + [SetUp] + public void Setup() + { + this.UserRepositoryMock = new Mock(); + this.PostRepositoryMock = new Mock(); + this.CommentRepositoryMock = new Mock(); + this.MapperMock = new Mock(); + this.CommentService = new CommentService(this.UserRepositoryMock.Object, this.PostRepositoryMock.Object, this.CommentRepositoryMock.Object, this.MapperMock.Object); + } + #endregion + + #region AddComment + [Test] + public async Task AddComment_ReturnsNonEmptyGuid_WhenEntityIsAddedSuccessfully() + { + Guid id = Guid.NewGuid(); + User creator = new User { Id = Guid.NewGuid() }; + CreateCommentServiceModel createCommentServiceModel = new CreateCommentServiceModel + { + Message = MESSAGE + }; + Comment comment = new Comment + { + Message = MESSAGE, + Id = id, + }; + + this.CommentRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.CommentRepositoryMock.Setup(p => p.GetCommentByIssuerAndTimeCreatedAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(comment)); + this.PostRepositoryMock.Setup(p => p.DoesPostExist(It.IsAny())).Returns(Task.FromResult(true)); + this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(creator)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(comment); + + Guid result = await this.CommentService.AddComment(createCommentServiceModel); + + Assert.AreEqual(id, result); + } + + [Test] + public async Task AddComment_ReturnsEmptyGuid_WhenEntityIsNotAddedSuccessfully() + { + CreateCommentServiceModel createCommentServiceModel = new CreateCommentServiceModel + { + Message = MESSAGE + }; + Comment comment = new Comment + { + Message = MESSAGE, + }; + + this.CommentRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(false)); + this.PostRepositoryMock.Setup(p => p.DoesPostExist(It.IsAny())).Returns(Task.FromResult(true)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(comment); + + Guid result = await this.CommentService.AddComment(createCommentServiceModel); + + Assert.IsTrue(result == Guid.Empty); + } + + [Test] + public void AddComment_ThrowsException_WhenPostDoesNotExist() + { + const string EXCEPTION_MESSAGE = "Post does not exist!"; + + CreateCommentServiceModel createCommentServiceModel = new CreateCommentServiceModel + { + Message = MESSAGE + }; + + Exception ex = Assert.ThrowsAsync(() => this.CommentService.AddComment(createCommentServiceModel), "AddComment does not throw excpeion when the post does not exist"); + + Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorecct exception message"); + } + #endregion + + #region GetCommentById + [Test] + public async Task GetCommentById_ReturnsTheComment_WhenItExists() + { + Guid creatorId = new Guid(); + User creator = new User { Id = creatorId }; + Comment comment = new Comment + { + Message = MESSAGE, + Creator = creator + }; + ReadCommentServiceModel commentServiceModel = new ReadCommentServiceModel + { + Message = MESSAGE + }; + User user = new User + { + Id = creatorId, + }; + + this.CommentRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(comment)); + this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(commentServiceModel); + + ReadCommentServiceModel result = await this.CommentService.GetCommentById(new Guid()); + + Assert.AreEqual(MESSAGE, result.Message); + } + + [Test] + public void GetCommentById_ThorwsException_WhenTheUserDoesNotExist() + { + const string EXCEPTION_MESSAGE = "The user does not exist"; + Guid creatorId = new Guid(); + User creator = new User { Id = creatorId }; + Comment comment = new Comment + { + Message = MESSAGE, + Creator = creator + }; + + this.CommentRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(comment)); + + Exception ex = Assert.ThrowsAsync(() => this.CommentService.GetCommentById(new Guid()), "GetCommentById does not throw exception when the user does not exist"); + + Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message); + } + + [Test] + public void GetCommentById_ThrowsException_WhenCommentDoesNotExist() + { + string exceptionMessage = "The comment does not exist"; + Guid creatorId = new Guid(); + User user = new User + { + Id = creatorId, + }; + + this.CommentRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); + this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); + + Exception ex = Assert.ThrowsAsync(() => this.CommentService.GetCommentById(new Guid())); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + + #region UpdateComment + [Test] + public async Task UpdateComment_ReturnsTheIdOfTheComment_WhenUpdatedSuccessfully() + { + Guid id = Guid.NewGuid(); + Comment comment = new Comment + { + Id = id, + Message = MESSAGE + }; + UpdateCommentServiceModel updateCommentServiceModel = new UpdateCommentServiceModel + { + CommentId = id, + NewMessage = MESSAGE + }; + + this.CommentRepositoryMock.Setup(p => p.DoesCommentExist(It.IsAny())).Returns(Task.FromResult(true)); + this.CommentRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + this.CommentRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(comment)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(comment); + + Guid result = await this.CommentService.UpdateComment(updateCommentServiceModel); + + Assert.AreEqual(updateCommentServiceModel.CommentId, result); + } + + [Test] + public async Task UpdateComment_ReturnsEmptyId_WhenTheCommentIsNotUpdatedSuccessfully() + { + Comment comment = new Comment + { + Message = MESSAGE + }; + UpdateCommentServiceModel updateCommentServiceModel = new UpdateCommentServiceModel + { + CommentId = Guid.NewGuid(), + NewMessage = MESSAGE + }; + + this.CommentRepositoryMock.Setup(p => p.DoesCommentExist(It.IsAny())).Returns(Task.FromResult(true)); + this.CommentRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(comment); + + Guid result = await this.CommentService.UpdateComment(updateCommentServiceModel); + + Assert.AreEqual(Guid.Empty, result); + } + + [Test] + public void UpdateComment_ThrowsArgumentException_WhenCommentDoesNotExist() + { + string exceptionMessage = "Comment does not exist!"; + UpdateCommentServiceModel updateCommentServiceModel = new UpdateCommentServiceModel + { + }; + + this.CommentRepositoryMock.Setup(p => p.DoesCommentExist(It.IsAny())).Returns(Task.FromResult(false)); + + Exception ex = Assert.ThrowsAsync(() => this.CommentService.UpdateComment(updateCommentServiceModel)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + + #region DeleteComment + [Test] + [TestCase(true)] + [TestCase(false)] + public async Task DeleteComment_ShouldReturnIfDeletionIsSuccessfull_WhenCommentExists(bool shouldPass) + { + Guid id = new Guid(); + Comment comment = new Comment(); + + this.CommentRepositoryMock.Setup(p => p.DoesCommentExist(It.IsAny())).Returns(Task.FromResult(true)); + this.CommentRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(comment)); + this.CommentRepositoryMock.Setup(p => p.DeleteAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); + + bool result = await this.CommentService.DeleteComment(id); + + Assert.AreEqual(shouldPass, result); + } + + [Test] + public void DeleteComment_ThrowsException_WhenCommentDoesNotExist() + { + string exceptionMessage = "Comment does not exist!"; + Guid id = new Guid(); + + this.CommentRepositoryMock.Setup(p => p.DoesCommentExist(It.IsAny())).Returns(Task.FromResult(false)); + + Exception ex = Assert.ThrowsAsync(() => this.CommentService.DeleteComment(id)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + } +} diff --git a/src/Services/DevHive.Services.Tests/DevHive.Services.Tests.csproj b/src/Services/DevHive.Services.Tests/DevHive.Services.Tests.csproj new file mode 100644 index 0000000..af419df --- /dev/null +++ b/src/Services/DevHive.Services.Tests/DevHive.Services.Tests.csproj @@ -0,0 +1,29 @@ + + + + net5.0 + + false + + + + + + + + + + + + + + + + + + + + true + latest + + diff --git a/src/Services/DevHive.Services.Tests/FeedService.Tests.cs b/src/Services/DevHive.Services.Tests/FeedService.Tests.cs new file mode 100644 index 0000000..e4020c5 --- /dev/null +++ b/src/Services/DevHive.Services.Tests/FeedService.Tests.cs @@ -0,0 +1,155 @@ +//using System; +//using System.Collections.Generic; +//using System.Threading.Tasks; +//using AutoMapper; +//using DevHive.Data.Interfaces.Repositories; +//using DevHive.Data.Models; +//using DevHive.Services.Models; +//using DevHive.Services.Models.Post; +//using DevHive.Services.Services; +//using Moq; +//using NUnit.Framework; + +//namespace DevHive.Services.Tests +//{ +// [TestFixture] +// public class FeedServiceTests +// { +// private Mock FeedRepositoryMock { get; set; } +// private Mock UserRepositoryMock { get; set; } +// private Mock MapperMock { get; set; } +// private FeedService FeedService { get; set; } + +// #region SetUps +// [SetUp] +// public void Setup() +// { +// this.FeedRepositoryMock = new Mock(); +// this.UserRepositoryMock = new Mock(); +// this.MapperMock = new Mock(); +// this.FeedService = new FeedService(this.FeedRepositoryMock.Object, this.UserRepositoryMock.Object, this.MapperMock.Object); +// } +// #endregion + +// #region GetPage +// [Test] +// public async Task GetPage_ReturnsReadPageServiceModel_WhenSuitablePostsExist() +// { +// GetPageServiceModel getPageServiceModel = new GetPageServiceModel +// { +// UserId = Guid.NewGuid() +// }; + +// User dummyUser = CreateDummyUser(); +// User anotherDummyUser = CreateAnotherDummyUser(); +// HashSet friends = new HashSet(); +// friends.Add(anotherDummyUser); +// dummyUser.Friends = friends; + +// List posts = new List +// { +// new Post{ Message = "Message"} +// }; + +// ReadPostServiceModel readPostServiceModel = new ReadPostServiceModel +// { +// PostId = Guid.NewGuid(), +// Message = "Message" +// }; +// List readPostServiceModels = new List(); +// readPostServiceModels.Add(readPostServiceModel); +// ReadPageServiceModel readPageServiceModel = new ReadPageServiceModel +// { +// Posts = readPostServiceModels +// }; + +// this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(dummyUser)); +// this.FeedRepositoryMock.Setup(p => p.GetFriendsPosts(It.IsAny>(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(Task.FromResult(posts)); +// this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readPostServiceModel); + +// ReadPageServiceModel result = await this.FeedService.GetPage(getPageServiceModel); + +// Assert.GreaterOrEqual(1, result.Posts.Count, "GetPage does not correctly return the posts"); +// } + +// [Test] +// public void GetPage_ThrowsException_WhenNoSuitablePostsExist() +// { +// const string EXCEPTION_MESSAGE = "No friends of user have posted anything yet!"; +// GetPageServiceModel getPageServiceModel = new GetPageServiceModel +// { +// UserId = Guid.NewGuid() +// }; + +// User dummyUser = CreateDummyUser(); +// User anotherDummyUser = CreateAnotherDummyUser(); +// HashSet friends = new HashSet(); +// friends.Add(anotherDummyUser); +// dummyUser.Friends = friends; + +// ReadPostServiceModel readPostServiceModel = new ReadPostServiceModel +// { +// PostId = Guid.NewGuid(), +// Message = "Message" +// }; +// List readPostServiceModels = new List(); +// readPostServiceModels.Add(readPostServiceModel); +// ReadPageServiceModel readPageServiceModel = new ReadPageServiceModel +// { +// Posts = readPostServiceModels +// }; + +// this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(dummyUser)); +// this.FeedRepositoryMock.Setup(p => p.GetFriendsPosts(It.IsAny>(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(Task.FromResult(new List())); + +// Exception ex = Assert.ThrowsAsync(() => this.FeedService.GetPage(getPageServiceModel)); + +// Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Wrong exception message"); +// } + +// [Test] +// public void GetPage_ThrowsException_WhenUserHasNoFriendsToGetPostsFrom() +// { +// const string EXCEPTION_MESSAGE = "User has no friends to get feed from!"; +// GetPageServiceModel getPageServiceModel = new GetPageServiceModel +// { +// UserId = Guid.NewGuid() +// }; + +// User dummyUser = CreateDummyUser(); + +// this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(dummyUser)); + +// Exception ex = Assert.ThrowsAsync(() => this.FeedService.GetPage(getPageServiceModel)); + +// Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Wrong exception message"); +// } +// #endregion + +// #region HelperMethods +// private User CreateDummyUser() +// { +// return new() +// { +// Id = Guid.NewGuid(), +// UserName = "dummyUser", +// FirstName = "Spas", +// LastName = "Spasov", +// Email = "abv@abv.bg", +// }; +// } + +// private User CreateAnotherDummyUser() +// { +// return new() +// { +// Id = Guid.NewGuid(), +// UserName = "anotherDummyUser", +// FirstName = "Alex", +// LastName = "Spiridonov", +// Email = "a_spiridonov@abv.bg", +// }; +// } +// #endregion +// } +//} diff --git a/src/Services/DevHive.Services.Tests/LanguageService.Tests.cs b/src/Services/DevHive.Services.Tests/LanguageService.Tests.cs new file mode 100644 index 0000000..1b59f91 --- /dev/null +++ b/src/Services/DevHive.Services.Tests/LanguageService.Tests.cs @@ -0,0 +1,262 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using DevHive.Services.Models.Language; +using DevHive.Services.Services; +using Moq; +using NUnit.Framework; + +namespace DevHive.Services.Tests +{ + [TestFixture] + public class LanguageServiceTests + { + private Mock LanguageRepositoryMock { get; set; } + private Mock MapperMock { get; set; } + private LanguageService LanguageService { get; set; } + + #region SetUps + [SetUp] + public void SetUp() + { + this.LanguageRepositoryMock = new Mock(); + this.MapperMock = new Mock(); + this.LanguageService = new LanguageService(this.LanguageRepositoryMock.Object, this.MapperMock.Object); + } + #endregion + + #region CreateLanguage + [Test] + public async Task CreateLanguage_ReturnsNonEmptyGuid_WhenEntityIsAddedSuccessfully() + { + string technologyName = "Gosho Trapov"; + Guid id = Guid.NewGuid(); + CreateLanguageServiceModel createLanguageServiceModel = new CreateLanguageServiceModel + { + Name = technologyName + }; + Language language = new Language + { + Name = technologyName, + Id = id + }; + + this.LanguageRepositoryMock.Setup(p => p.DoesLanguageNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + this.LanguageRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.LanguageRepositoryMock.Setup(p => p.GetByNameAsync(It.IsAny())).Returns(Task.FromResult(language)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(language); + + Guid result = await this.LanguageService.CreateLanguage(createLanguageServiceModel); + + Assert.AreEqual(id, result); + } + + [Test] + public async Task CreateLanguage_ReturnsEmptyGuid_WhenEntityIsNotAddedSuccessfully() + { + string languageName = "Gosho Trapov"; + + CreateLanguageServiceModel createLanguageServiceModel = new CreateLanguageServiceModel + { + Name = languageName + }; + Language language = new Language + { + Name = languageName + }; + + this.LanguageRepositoryMock.Setup(p => p.DoesLanguageNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + this.LanguageRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(false)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(language); + + Guid result = await this.LanguageService.CreateLanguage(createLanguageServiceModel); + + Assert.IsTrue(result == Guid.Empty); + + } + + [Test] + public void CreateLanguage_ThrowsArgumentException_WhenEntityAlreadyExists() + { + string exceptionMessage = "Language already exists!"; + string languageName = "Gosho Trapov"; + + CreateLanguageServiceModel createLanguageServiceModel = new CreateLanguageServiceModel + { + Name = languageName + }; + Language language = new Language + { + Name = languageName + }; + + this.LanguageRepositoryMock.Setup(p => p.DoesLanguageNameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + + Exception ex = Assert.ThrowsAsync(() => this.LanguageService.CreateLanguage(createLanguageServiceModel)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + + #region GetLanguageById + [Test] + public async Task GetLanguageById_ReturnsTheLanguage_WhenItExists() + { + Guid id = new Guid(); + string name = "Gosho Trapov"; + Language language = new Language + { + Name = name + }; + ReadLanguageServiceModel readLanguageServiceModel = new ReadLanguageServiceModel + { + Name = name + }; + + this.LanguageRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(language)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readLanguageServiceModel); + + ReadLanguageServiceModel result = await this.LanguageService.GetLanguageById(id); + + Assert.AreEqual(name, result.Name); + } + + [Test] + public void GetLanguageById_ThrowsException_WhenLanguageDoesNotExist() + { + string exceptionMessage = "The language does not exist"; + Guid id = new Guid(); + this.LanguageRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); + + Exception ex = Assert.ThrowsAsync(() => this.LanguageService.GetLanguageById(id)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + + #region GetLanguages + [Test] + public void GetLanguages_ReturnsAllLanguages_IfAnyExist() + { + ReadLanguageServiceModel firstLanguage = new ReadLanguageServiceModel(); + ReadLanguageServiceModel secondLanguage = new ReadLanguageServiceModel(); + HashSet languges = new HashSet(); + languges.Add(firstLanguage); + languges.Add(secondLanguage); + + this.LanguageRepositoryMock.Setup(p => p.GetLanguages()).Returns(new HashSet()); + this.MapperMock.Setup(p => p.Map>(It.IsAny>())).Returns(languges); + + HashSet result = this.LanguageService.GetLanguages(); + + Assert.GreaterOrEqual(2, result.Count, "GetLanguages does not return all languages"); + } + + [Test] + public void GetLanguages_ReturnsEmptyHashSet_IfNoLanguagesExist() + { + this.LanguageRepositoryMock.Setup(p => p.GetLanguages()).Returns(new HashSet()); + this.MapperMock.Setup(p => p.Map>(It.IsAny>())).Returns(new HashSet()); + + HashSet result = this.LanguageService.GetLanguages(); + + Assert.IsEmpty(result, "GetLanguages does not return empty string when no languages exist"); + } + #endregion + + #region UpdateLanguage + [Test] + [TestCase(true)] + [TestCase(false)] + public async Task UpdateLanguage_ReturnsIfUpdateIsSuccessfull_WhenLanguageExistsy(bool shouldPass) + { + string name = "Gosho Trapov"; + Guid id = Guid.NewGuid(); + Language language = new Language + { + Name = name, + Id = id + }; + UpdateLanguageServiceModel updateLanguageServiceModel = new UpdateLanguageServiceModel + { + Name = name, + }; + + this.LanguageRepositoryMock.Setup(p => p.DoesLanguageExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.LanguageRepositoryMock.Setup(p => p.DoesLanguageNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + this.LanguageRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(shouldPass)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(language); + + bool result = await this.LanguageService.UpdateLanguage(updateLanguageServiceModel); + + Assert.AreEqual(shouldPass, result); + } + + [Test] + public void UpdateLanguage_ThrowsArgumentException_WhenLanguageDoesNotExist() + { + string exceptionMessage = "Language does not exist!"; + UpdateLanguageServiceModel updateTechnologyServiceModel = new UpdateLanguageServiceModel + { + }; + + this.LanguageRepositoryMock.Setup(p => p.DoesLanguageExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + + Exception ex = Assert.ThrowsAsync(() => this.LanguageService.UpdateLanguage(updateTechnologyServiceModel)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + + [Test] + public void UpdateLanguage_ThrowsException_WhenLanguageNameAlreadyExists() + { + string exceptionMessage = "Language name already exists in our data base!"; + UpdateLanguageServiceModel updateTechnologyServiceModel = new UpdateLanguageServiceModel + { + }; + + this.LanguageRepositoryMock.Setup(p => p.DoesLanguageExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.LanguageRepositoryMock.Setup(p => p.DoesLanguageNameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + + Exception ex = Assert.ThrowsAsync(() => this.LanguageService.UpdateLanguage(updateTechnologyServiceModel)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + + #region DeleteLanguage + [Test] + [TestCase(true)] + [TestCase(false)] + public async Task DeleteLanguage_ShouldReturnIfDeletionIsSuccessfull_WhenLanguageExists(bool shouldPass) + { + Guid id = new Guid(); + Language language = new Language(); + + this.LanguageRepositoryMock.Setup(p => p.DoesLanguageExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.LanguageRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(language)); + this.LanguageRepositoryMock.Setup(p => p.DeleteAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); + + bool result = await this.LanguageService.DeleteLanguage(id); + + Assert.AreEqual(shouldPass, result); + } + + [Test] + public void DeleteLanguage_ThrowsException_WhenLanguageDoesNotExist() + { + string exceptionMessage = "Language does not exist!"; + Guid id = new Guid(); + + this.LanguageRepositoryMock.Setup(p => p.DoesLanguageExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + + Exception ex = Assert.ThrowsAsync(() => this.LanguageService.DeleteLanguage(id)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + } +} diff --git a/src/Services/DevHive.Services.Tests/PostService.Tests.cs b/src/Services/DevHive.Services.Tests/PostService.Tests.cs new file mode 100644 index 0000000..900608c --- /dev/null +++ b/src/Services/DevHive.Services.Tests/PostService.Tests.cs @@ -0,0 +1,271 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Post; +using DevHive.Services.Services; +using Microsoft.AspNetCore.Http; +using Moq; +using NUnit.Framework; + +namespace DevHive.Services.Tests +{ + [TestFixture] + public class PostServiceTests + { + private const string MESSAGE = "Gosho Trapov"; + private Mock CloudServiceMock { get; set; } + private Mock PostRepositoryMock { get; set; } + private Mock CommentRepositoryMock { get; set; } + private Mock UserRepositoryMock { get; set; } + private Mock MapperMock { get; set; } + private PostService PostService { get; set; } + + #region SetUps + [SetUp] + public void Setup() + { + this.PostRepositoryMock = new Mock(); + this.CloudServiceMock = new Mock(); + this.UserRepositoryMock = new Mock(); + this.CommentRepositoryMock = new Mock(); + this.MapperMock = new Mock(); + this.PostService = new PostService(this.CloudServiceMock.Object, this.UserRepositoryMock.Object, this.PostRepositoryMock.Object, this.CommentRepositoryMock.Object, this.MapperMock.Object); + } + #endregion + + #region CreatePost + [Test] + public async Task CreatePost_ReturnsIdOfThePost_WhenItIsSuccessfullyCreated() + { + Guid postId = Guid.NewGuid(); + User creator = new User { Id = Guid.NewGuid() }; + CreatePostServiceModel createPostServiceModel = new CreatePostServiceModel + { + Files = new List() + }; + Post post = new Post + { + Message = MESSAGE, + Id = postId, + }; + + this.PostRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.PostRepositoryMock.Setup(p => p.GetPostByCreatorAndTimeCreatedAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(post)); + this.UserRepositoryMock.Setup(p => p.DoesUserExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(creator)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(post); + + Guid result = await this.PostService.CreatePost(createPostServiceModel); + + Assert.AreEqual(postId, result, "CreatePost does not return the correct id"); + } + + [Test] + public async Task CreatePost_ReturnsEmptyGuid_WhenItIsNotSuccessfullyCreated() + { + CreatePostServiceModel createPostServiceModel = new CreatePostServiceModel + { + Files = new List() + }; + Post post = new Post + { + Message = MESSAGE, + }; + + this.PostRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(false)); + this.UserRepositoryMock.Setup(p => p.DoesUserExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(post); + + Guid result = await this.PostService.CreatePost(createPostServiceModel); + + Assert.AreEqual(Guid.Empty, result, "CreatePost does not return empty id"); + } + + [Test] + public void CreatePost_ThrowsException_WhenUserDoesNotExist() + { + const string EXCEPTION_MESSAGE = "User does not exist!"; + CreatePostServiceModel createPostServiceModel = new CreatePostServiceModel + { + }; + Post post = new Post + { + Message = MESSAGE, + }; + + Exception ex = Assert.ThrowsAsync(() => this.PostService.CreatePost(createPostServiceModel), "CreatePost does not throw excpeion when the user does not exist"); + + Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Excapetion message is not correct"); + } + #endregion + + #region GetPostById + [Test] + public async Task GetPostById_ReturnsThePost_WhenItExists() + { + Guid creatorId = new Guid(); + User creator = new User { Id = creatorId }; + Post post = new Post + { + Message = MESSAGE, + Creator = creator + }; + ReadPostServiceModel readPostServiceModel = new ReadPostServiceModel + { + Message = MESSAGE + }; + User user = new User + { + Id = creatorId, + }; + + this.PostRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(post)); + this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readPostServiceModel); + + ReadPostServiceModel result = await this.PostService.GetPostById(new Guid()); + + Assert.AreEqual(MESSAGE, result.Message); + } + + [Test] + public void GetPostById_ThorwsException_WhenTheUserDoesNotExist() + { + const string EXCEPTION_MESSAGE = "The user does not exist!"; + Guid creatorId = new Guid(); + User creator = new User { Id = creatorId }; + Post post = new Post + { + Message = MESSAGE, + Creator = creator + }; + + this.PostRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(post)); + + Exception ex = Assert.ThrowsAsync(() => this.PostService.GetPostById(new Guid()), "GetPostById does not throw exception when the user does not exist"); + + Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message); + } + + [Test] + public void GetPostById_ThrowsException_WhenCommentDoesNotExist() + { + string exceptionMessage = "The post does not exist!"; + Guid creatorId = new Guid(); + User user = new User + { + Id = creatorId, + }; + + this.PostRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); + this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); + + Exception ex = Assert.ThrowsAsync(() => this.PostService.GetPostById(new Guid())); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + + #region UpdatePost + [Test] + public async Task UpdatePost_ReturnsTheIdOfThePost_WhenUpdatedSuccessfully() + { + Guid id = Guid.NewGuid(); + Post post = new Post + { + Id = id, + Message = MESSAGE + }; + UpdatePostServiceModel updatePostServiceModel = new UpdatePostServiceModel + { + PostId = id, + NewMessage = MESSAGE, + Files = new List() + }; + + this.PostRepositoryMock.Setup(p => p.DoesPostExist(It.IsAny())).Returns(Task.FromResult(true)); + this.PostRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + this.PostRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(post)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(post); + + Guid result = await this.PostService.UpdatePost(updatePostServiceModel); + + Assert.AreEqual(updatePostServiceModel.PostId, result); + } + + [Test] + public async Task UpdatePost_ReturnsEmptyId_WhenThePostIsNotUpdatedSuccessfully() + { + Post post = new Post + { + Message = MESSAGE + }; + UpdatePostServiceModel updatePostServiceModel = new UpdatePostServiceModel + { + PostId = Guid.NewGuid(), + NewMessage = MESSAGE, + Files = new List() + }; + + this.PostRepositoryMock.Setup(p => p.DoesPostExist(It.IsAny())).Returns(Task.FromResult(true)); + this.PostRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(post); + + Guid result = await this.PostService.UpdatePost(updatePostServiceModel); + + Assert.AreEqual(Guid.Empty, result); + } + + [Test] + public void UpdatePost_ThrowsArgumentException_WhenCommentDoesNotExist() + { + string exceptionMessage = "Post does not exist!"; + UpdatePostServiceModel updatePostServiceModel = new UpdatePostServiceModel + { + }; + + this.PostRepositoryMock.Setup(p => p.DoesPostExist(It.IsAny())).Returns(Task.FromResult(false)); + + Exception ex = Assert.ThrowsAsync(() => this.PostService.UpdatePost(updatePostServiceModel)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + + #region DeletePost + [Test] + [TestCase(true)] + [TestCase(false)] + public async Task Deletepost_ShouldReturnIfDeletionIsSuccessfull_WhenPostExists(bool shouldPass) + { + Guid id = new Guid(); + Post post = new Post(); + + this.PostRepositoryMock.Setup(p => p.DoesPostExist(It.IsAny())).Returns(Task.FromResult(true)); + this.PostRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(post)); + this.PostRepositoryMock.Setup(p => p.DeleteAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); + + bool result = await this.PostService.DeletePost(id); + + Assert.AreEqual(shouldPass, result); + } + + [Test] + public void DeletePost_ThrowsException_WhenPostDoesNotExist() + { + string exceptionMessage = "Post does not exist!"; + Guid id = new Guid(); + + this.PostRepositoryMock.Setup(p => p.DoesPostExist(It.IsAny())).Returns(Task.FromResult(false)); + + Exception ex = Assert.ThrowsAsync(() => this.PostService.DeletePost(id)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + } +} diff --git a/src/Services/DevHive.Services.Tests/RoleService.Tests.cs b/src/Services/DevHive.Services.Tests/RoleService.Tests.cs new file mode 100644 index 0000000..e500dd1 --- /dev/null +++ b/src/Services/DevHive.Services.Tests/RoleService.Tests.cs @@ -0,0 +1,230 @@ +using System; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using DevHive.Services.Models.Identity.Role; +using DevHive.Services.Services; +using Moq; +using NUnit.Framework; + +namespace DevHive.Services.Tests +{ + [TestFixture] + public class RoleServiceTests + { + private Mock RoleRepositoryMock { get; set; } + private Mock MapperMock { get; set; } + private RoleService RoleService { get; set; } + + #region SetUps + [SetUp] + public void Setup() + { + this.RoleRepositoryMock = new Mock(); + this.MapperMock = new Mock(); + this.RoleService = new RoleService(this.RoleRepositoryMock.Object, this.MapperMock.Object); + } + #endregion + + #region CreateRole + [Test] + public async Task CreateRole_ReturnsNonEmptyGuid_WhenEntityIsAddedSuccessfully() + { + string roleName = "Gosho Trapov"; + Guid id = Guid.NewGuid(); + CreateRoleServiceModel createRoleServiceModel = new CreateRoleServiceModel + { + Name = roleName + }; + Role role = new() + { + Name = roleName, + Id = id + }; + + this.RoleRepositoryMock.Setup(p => p.DoesNameExist(It.IsAny())).Returns(Task.FromResult(false)); + this.RoleRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.RoleRepositoryMock.Setup(p => p.GetByNameAsync(It.IsAny())).Returns(Task.FromResult(role)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(role); + + Guid result = await this.RoleService.CreateRole(createRoleServiceModel); + + Assert.AreEqual(id, result); + } + + [Test] + public async Task CreateRoley_ReturnsEmptyGuid_WhenEntityIsNotAddedSuccessfully() + { + string roleName = "Gosho Trapov"; + + CreateRoleServiceModel createRoleServiceModel = new CreateRoleServiceModel + { + Name = roleName + }; + Role role = new Role + { + Name = roleName + }; + + this.RoleRepositoryMock.Setup(p => p.DoesNameExist(It.IsAny())).Returns(Task.FromResult(false)); + this.RoleRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(false)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(role); + + Guid result = await this.RoleService.CreateRole(createRoleServiceModel); + + Assert.IsTrue(result == Guid.Empty); + } + + [Test] + public void CreateTechnology_ThrowsArgumentException_WhenEntityAlreadyExists() + { + string exceptionMessage = "Role already exists!"; + string roleName = "Gosho Trapov"; + + CreateRoleServiceModel createRoleServiceModel = new CreateRoleServiceModel + { + Name = roleName + }; + Role role = new Role + { + Name = roleName + }; + + this.RoleRepositoryMock.Setup(p => p.DoesNameExist(It.IsAny())).Returns(Task.FromResult(true)); + + Exception ex = Assert.ThrowsAsync(() => this.RoleService.CreateRole(createRoleServiceModel)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + + #region GetRoleById + [Test] + public async Task GetRoleById_ReturnsTheRole_WhenItExists() + { + Guid id = new Guid(); + string name = "Gosho Trapov"; + Role role = new Role + { + Name = name + }; + RoleServiceModel roleServiceModel = new RoleServiceModel + { + Name = name + }; + + this.RoleRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(role)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(roleServiceModel); + + RoleServiceModel result = await this.RoleService.GetRoleById(id); + + Assert.AreEqual(name, result.Name); + } + + [Test] + public void GetRoleById_ThrowsException_WhenRoleDoesNotExist() + { + string exceptionMessage = "Role does not exist!"; + Guid id = new Guid(); + this.RoleRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); + + Exception ex = Assert.ThrowsAsync(() => this.RoleService.GetRoleById(id)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + + #region UpdateRole + [Test] + [TestCase(true)] + [TestCase(false)] + public async Task UpdateRole_ReturnsIfUpdateIsSuccessfull_WhenRoleExistsy(bool shouldPass) + { + string name = "Gosho Trapov"; + Guid id = Guid.NewGuid(); + Role role = new Role + { + Name = name, + Id = id + }; + UpdateRoleServiceModel updateRoleServiceModel = new UpdateRoleServiceModel + { + Name = name, + }; + + this.RoleRepositoryMock.Setup(p => p.DoesRoleExist(It.IsAny())).Returns(Task.FromResult(true)); + this.RoleRepositoryMock.Setup(p => p.DoesNameExist(It.IsAny())).Returns(Task.FromResult(false)); + this.RoleRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(shouldPass)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(role); + + bool result = await this.RoleService.UpdateRole(updateRoleServiceModel); + + Assert.AreEqual(shouldPass, result); + } + + [Test] + public void UpdateRole_ThrowsException_WhenRoleDoesNotExist() + { + string exceptionMessage = "Role does not exist!"; + UpdateRoleServiceModel updateRoleServiceModel = new UpdateRoleServiceModel + { + }; + + this.RoleRepositoryMock.Setup(p => p.DoesRoleExist(It.IsAny())).Returns(Task.FromResult(false)); + + Exception ex = Assert.ThrowsAsync(() => this.RoleService.UpdateRole(updateRoleServiceModel)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + + [Test] + public void UpdateRole_ThrowsException_WhenRoleNameAlreadyExists() + { + string exceptionMessage = "Role name already exists!"; + UpdateRoleServiceModel updateRoleServiceModel = new UpdateRoleServiceModel + { + }; + + this.RoleRepositoryMock.Setup(p => p.DoesRoleExist(It.IsAny())).Returns(Task.FromResult(true)); + this.RoleRepositoryMock.Setup(p => p.DoesNameExist(It.IsAny())).Returns(Task.FromResult(true)); + + Exception ex = Assert.ThrowsAsync(() => this.RoleService.UpdateRole(updateRoleServiceModel)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + + #region DeleteRole + [Test] + [TestCase(true)] + [TestCase(false)] + public async Task DeleteRole_ShouldReturnIfDeletionIsSuccessfull_WhenRoleExists(bool shouldPass) + { + Guid id = new Guid(); + Role role = new Role(); + + this.RoleRepositoryMock.Setup(p => p.DoesRoleExist(It.IsAny())).Returns(Task.FromResult(true)); + this.RoleRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(role)); + this.RoleRepositoryMock.Setup(p => p.DeleteAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); + + bool result = await this.RoleService.DeleteRole(id); + + Assert.AreEqual(shouldPass, result); + } + + [Test] + public void DeleteRole_ThrowsException_WhenRoleDoesNotExist() + { + string exceptionMessage = "Role does not exist!"; + Guid id = new Guid(); + + this.RoleRepositoryMock.Setup(p => p.DoesRoleExist(It.IsAny())).Returns(Task.FromResult(false)); + + Exception ex = Assert.ThrowsAsync(() => this.RoleService.DeleteRole(id)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + } +} diff --git a/src/Services/DevHive.Services.Tests/TechnologyServices.Tests.cs b/src/Services/DevHive.Services.Tests/TechnologyServices.Tests.cs new file mode 100644 index 0000000..e671adb --- /dev/null +++ b/src/Services/DevHive.Services.Tests/TechnologyServices.Tests.cs @@ -0,0 +1,262 @@ +using AutoMapper; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using DevHive.Services.Models.Technology; +using DevHive.Services.Services; +using Moq; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace DevHive.Services.Tests +{ + [TestFixture] + public class TechnologyServicesTests + { + private Mock TechnologyRepositoryMock { get; set; } + private Mock MapperMock { get; set; } + private TechnologyService TechnologyService { get; set; } + + #region SetUps + [SetUp] + public void Setup() + { + this.TechnologyRepositoryMock = new Mock(); + this.MapperMock = new Mock(); + this.TechnologyService = new TechnologyService(this.TechnologyRepositoryMock.Object, this.MapperMock.Object); + } + #endregion + + #region CreateTechnology + [Test] + public async Task CreateTechnology_ReturnsNonEmptyGuid_WhenEntityIsAddedSuccessfully() + { + string technologyName = "Gosho Trapov"; + Guid id = Guid.NewGuid(); + CreateTechnologyServiceModel createTechnologyServiceModel = new() + { + Name = technologyName + }; + Technology technology = new() + { + Name = technologyName, + Id = id + }; + + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + this.TechnologyRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.TechnologyRepositoryMock.Setup(p => p.GetByNameAsync(It.IsAny())).Returns(Task.FromResult(technology)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(technology); + + Guid result = await this.TechnologyService.CreateTechnology(createTechnologyServiceModel); + + Assert.AreEqual(id, result); + } + + [Test] + public async Task CreateTechnology_ReturnsEmptyGuid_WhenEntityIsNotAddedSuccessfully() + { + string technologyName = "Gosho Trapov"; + + CreateTechnologyServiceModel createTechnologyServiceModel = new() + { + Name = technologyName + }; + Technology technology = new() + { + Name = technologyName + }; + + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + this.TechnologyRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(false)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(technology); + + Guid result = await this.TechnologyService.CreateTechnology(createTechnologyServiceModel); + + Assert.IsTrue(result == Guid.Empty); + } + + [Test] + public void CreateTechnology_ThrowsArgumentException_WhenEntityAlreadyExists() + { + string exceptionMessage = "Technology already exists!"; + string technologyName = "Gosho Trapov"; + + CreateTechnologyServiceModel createTechnologyServiceModel = new() + { + Name = technologyName + }; + Technology technology = new() + { + Name = technologyName + }; + + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + + Exception ex = Assert.ThrowsAsync(() => this.TechnologyService.CreateTechnology(createTechnologyServiceModel)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + + #region GetTechnologyById + [Test] + public async Task GetTechnologyById_ReturnsTheTechnology_WhenItExists() + { + Guid id = new Guid(); + string name = "Gosho Trapov"; + Technology technology = new() + { + Name = name + }; + ReadTechnologyServiceModel readTechnologyServiceModel = new() + { + Name = name + }; + + this.TechnologyRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(technology)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readTechnologyServiceModel); + + ReadTechnologyServiceModel result = await this.TechnologyService.GetTechnologyById(id); + + Assert.AreEqual(name, result.Name); + } + + [Test] + public void GetTechnologyById_ThrowsException_WhenTechnologyDoesNotExist() + { + string exceptionMessage = "The technology does not exist"; + Guid id = new Guid(); + this.TechnologyRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); + + Exception ex = Assert.ThrowsAsync(() => this.TechnologyService.GetTechnologyById(id)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + + #region GetTechnologies + [Test] + public void GetTechnologies_ReturnsAllLanguages_IfAnyExist() + { + ReadTechnologyServiceModel firstTechnology = new ReadTechnologyServiceModel(); + ReadTechnologyServiceModel secondTechnology = new ReadTechnologyServiceModel(); + HashSet technologies = new HashSet(); + technologies.Add(firstTechnology); + technologies.Add(secondTechnology); + + this.TechnologyRepositoryMock.Setup(p => p.GetTechnologies()).Returns(new HashSet()); + this.MapperMock.Setup(p => p.Map>(It.IsAny>())).Returns(technologies); + + HashSet result = this.TechnologyService.GetTechnologies(); + + Assert.GreaterOrEqual(2, result.Count, "GetTechnologies does not return all technologies"); + } + + [Test] + public void GetLanguages_ReturnsEmptyHashSet_IfNoLanguagesExist() + { + this.TechnologyRepositoryMock.Setup(p => p.GetTechnologies()).Returns(new HashSet()); + this.MapperMock.Setup(p => p.Map>(It.IsAny>())).Returns(new HashSet()); + + HashSet result = this.TechnologyService.GetTechnologies(); + + Assert.IsEmpty(result, "GetTechnologies does not return empty string when no technologies exist"); + } + #endregion + + #region UpdateTechnology + [Test] + [TestCase(true)] + [TestCase(false)] + public async Task UpdateTechnology_ReturnsIfUpdateIsSuccessfull_WhenTechnologyExistsy(bool shouldPass) + { + string name = "Gosho Trapov"; + Guid id = Guid.NewGuid(); + Technology technology = new Technology + { + Name = name, + Id = id + }; + UpdateTechnologyServiceModel updatetechnologyServiceModel = new UpdateTechnologyServiceModel + { + Name = name, + }; + + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + this.TechnologyRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(shouldPass)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(technology); + + bool result = await this.TechnologyService.UpdateTechnology(updatetechnologyServiceModel); + + Assert.AreEqual(shouldPass, result); + } + + [Test] + public void UpdateTechnology_ThrowsException_WhenTechnologyDoesNotExist() + { + string exceptionMessage = "Technology does not exist!"; + UpdateTechnologyServiceModel updateTechnologyServiceModel = new UpdateTechnologyServiceModel + { + }; + + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + + Exception ex = Assert.ThrowsAsync(() => this.TechnologyService.UpdateTechnology(updateTechnologyServiceModel)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + + [Test] + public void UpdateTechnology_ThrowsException_WhenTechnologyNameAlreadyExists() + { + string exceptionMessage = "Technology name already exists!"; + UpdateTechnologyServiceModel updateTechnologyServiceModel = new UpdateTechnologyServiceModel + { + }; + + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + + Exception ex = Assert.ThrowsAsync(() => this.TechnologyService.UpdateTechnology(updateTechnologyServiceModel)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + + #region DeleteTechnology + + [Test] + [TestCase(true)] + [TestCase(false)] + public async Task DeleteTechnology_ShouldReturnIfDeletionIsSuccessfull_WhenTechnologyExists(bool shouldPass) + { + Guid id = new Guid(); + Technology technology = new Technology(); + + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.TechnologyRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(technology)); + this.TechnologyRepositoryMock.Setup(p => p.DeleteAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); + + bool result = await this.TechnologyService.DeleteTechnology(id); + + Assert.AreEqual(shouldPass, result); + } + + [Test] + public void DeleteTechnology_ThrowsException_WhenTechnologyDoesNotExist() + { + string exceptionMessage = "Technology does not exist!"; + Guid id = new Guid(); + + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + + Exception ex = Assert.ThrowsAsync(() => this.TechnologyService.DeleteTechnology(id)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + } +} diff --git a/src/Services/DevHive.Services.Tests/UserService.Tests.cs b/src/Services/DevHive.Services.Tests/UserService.Tests.cs new file mode 100644 index 0000000..21d4862 --- /dev/null +++ b/src/Services/DevHive.Services.Tests/UserService.Tests.cs @@ -0,0 +1,394 @@ +using System; +using System.Collections.Generic; +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Text; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Common.Models.Identity; +using DevHive.Common.Models.Misc; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Identity.User; +using DevHive.Services.Options; +using DevHive.Services.Services; +using Microsoft.AspNetCore.Identity; +using Microsoft.IdentityModel.Tokens; +using Moq; +using NUnit.Framework; + +namespace DevHive.Services.Tests +{ + [TestFixture] + public class UserServiceTests + { + private Mock CloudServiceMock { get; set; } + private Mock UserRepositoryMock { get; set; } + private Mock RoleRepositoryMock { get; set; } + private Mock LanguageRepositoryMock { get; set; } + private Mock TechnologyRepositoryMock { get; set; } + private Mock MapperMock { get; set; } + private JWTOptions JWTOptions { get; set; } + private UserService UserService { get; set; } + + #region SetUps + [SetUp] + public void Setup() + { + this.UserRepositoryMock = new Mock(); + this.RoleRepositoryMock = new Mock(); + this.CloudServiceMock = new Mock(); + this.LanguageRepositoryMock = new Mock(); + this.TechnologyRepositoryMock = new Mock(); + this.JWTOptions = new JWTOptions("gXfQlU6qpDleFWyimscjYcT3tgFsQg3yoFjcvSLxG56n1Vu2yptdIUq254wlJWjm"); + this.MapperMock = new Mock(); + // TODO: give actual UserManager and RoleManager to UserService + this.UserService = new UserService(this.UserRepositoryMock.Object, this.LanguageRepositoryMock.Object, this.RoleRepositoryMock.Object, this.TechnologyRepositoryMock.Object, null, null, this.MapperMock.Object, this.JWTOptions, this.CloudServiceMock.Object); + } + #endregion + + #region LoginUser + [Test] + public async Task LoginUser_ReturnsTokenModel_WhenLoggingUserIn() + { + string somePassword = "GoshoTrapovImaGolemChep"; + const string name = "GoshoTrapov"; + string hashedPassword = PasswordModifications.GeneratePasswordHash(somePassword); + LoginServiceModel loginServiceModel = new LoginServiceModel + { + Password = somePassword + }; + User user = new User + { + Id = Guid.NewGuid(), + PasswordHash = hashedPassword, + UserName = name + }; + + this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.UserRepositoryMock.Setup(p => p.GetByUsernameAsync(It.IsAny())).Returns(Task.FromResult(user)); + + string JWTSecurityToken = this.WriteJWTSecurityToken(user.Id, user.UserName, user.Roles); + + TokenModel tokenModel = await this.UserService.LoginUser(loginServiceModel); + + Assert.AreEqual(JWTSecurityToken, tokenModel.Token, "LoginUser does not return the correct token"); + } + + [Test] + public void LoginUser_ThrowsException_WhenUserNameDoesNotExist() + { + const string EXCEPTION_MESSAGE = "Invalid username!"; + LoginServiceModel loginServiceModel = new LoginServiceModel + { + }; + + this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + + Exception ex = Assert.ThrowsAsync(() => this.UserService.LoginUser(loginServiceModel)); + + Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorect Exception message"); + } + + [Test] + public void LoginUser_ThroiwsException_WhenPasswordIsIncorect() + { + const string EXCEPTION_MESSAGE = "Incorrect password!"; + string somePassword = "GoshoTrapovImaGolemChep"; + LoginServiceModel loginServiceModel = new LoginServiceModel + { + Password = somePassword + }; + User user = new User + { + Id = Guid.NewGuid(), + PasswordHash = "InvalidPasswordHas" + }; + + this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.UserRepositoryMock.Setup(p => p.GetByUsernameAsync(It.IsAny())).Returns(Task.FromResult(user)); + + Exception ex = Assert.ThrowsAsync(() => this.UserService.LoginUser(loginServiceModel)); + + Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorect Exception message"); + } + #endregion + + #region RegisterUser + // [Test] + // public async Task RegisterUser_ReturnsTokenModel_WhenUserIsSuccessfull() + // { + // string somePassword = "GoshoTrapovImaGolemChep"; + // const string name = "GoshoTrapov"; + // RegisterServiceModel registerServiceModel = new RegisterServiceModel + // { + // Password = somePassword + // }; + // User user = new User + // { + // Id = Guid.NewGuid(), + // UserName = name + // }; + // Role role = new Role { Name = Role.DefaultRole }; + // HashSet roles = new HashSet { role }; + // + // this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + // this.UserRepositoryMock.Setup(p => p.DoesEmailExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + // this.RoleRepositoryMock.Setup(p => p.DoesNameExist(It.IsAny())).Returns(Task.FromResult(true)); + // this.RoleRepositoryMock.Setup(p => p.GetByNameAsync(It.IsAny())).Returns(Task.FromResult(role)); + // this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(user); + // this.UserRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Verifiable(); + // + // string JWTSecurityToken = this.WriteJWTSecurityToken(user.Id, user.UserName, roles); + // + // TokenModel tokenModel = await this.UserService.RegisterUser(registerServiceModel); + // + // Mock.Verify(); + // Assert.AreEqual(JWTSecurityToken, tokenModel.Token, "RegisterUser does not return the correct token"); + // } + + [Test] + public void RegisterUser_ThrowsException_WhenUsernameAlreadyExists() + { + const string EXCEPTION_MESSAGE = "Username already exists!"; + RegisterServiceModel registerServiceModel = new RegisterServiceModel + { + }; + + this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + + Exception ex = Assert.ThrowsAsync(() => this.UserService.RegisterUser(registerServiceModel)); + + Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorect Exception message"); + } + + [Test] + public void RegisterUser_ThrowsException_WhenEmailAlreadyExists() + { + const string EXCEPTION_MESSAGE = "Email already exists!"; + + RegisterServiceModel registerServiceModel = new RegisterServiceModel + { + }; + + this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + this.UserRepositoryMock.Setup(p => p.DoesEmailExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + + Exception ex = Assert.ThrowsAsync(() => this.UserService.RegisterUser(registerServiceModel)); + + Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorect Exception message"); + } + #endregion + + #region GetUserById + [Test] + public async Task GetUserById_ReturnsTheUser_WhenItExists() + { + Guid id = new Guid(); + string name = "Gosho Trapov"; + User user = new() + { + }; + UserServiceModel userServiceModel = new UserServiceModel + { + UserName = name + }; + + this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(userServiceModel); + + UserServiceModel result = await this.UserService.GetUserById(id); + + Assert.AreEqual(name, result.UserName); + } + + [Test] + public void GetTechnologyById_ThrowsException_WhenTechnologyDoesNotExist() + { + const string EXCEPTION_MESSEGE = "User does not exist!"; + Guid id = new Guid(); + this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); + + Exception ex = Assert.ThrowsAsync(() => this.UserService.GetUserById(id)); + + Assert.AreEqual(EXCEPTION_MESSEGE, ex.Message, "Incorecct exception message"); + } + #endregion + + #region GetUserByUsername + [Test] + public async Task GetUserByUsername_ReturnsTheCorrectUser_IfItExists() + { + string username = "Gosho Trapov"; + User user = new User(); + UserServiceModel userServiceModel = new UserServiceModel + { + UserName = username + }; + + this.UserRepositoryMock.Setup(p => p.GetByUsernameAsync(It.IsAny())).Returns(Task.FromResult(user)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(userServiceModel); + + UserServiceModel result = await this.UserService.GetUserByUsername(username); + + Assert.AreEqual(username, result.UserName, "GetUserByUsername does not return the correct user"); + } + + [Test] + public async Task GetUserByUsername_ThrowsException_IfUserDoesNotExist() + { + string username = "Gosho Trapov"; + const string EXCEPTION_MESSEGE = "User does not exist!"; + + this.UserRepositoryMock.Setup(p => p.GetByUsernameAsync(It.IsAny())).Returns(Task.FromResult(null)); + + Exception ex = Assert.ThrowsAsync(() => this.UserService.GetUserByUsername(username)); + + Assert.AreEqual(EXCEPTION_MESSEGE, ex.Message, "Incorecct exception message"); + } + #endregion + + #region UpdateUser + // [Test] + // [TestCase(true)] + // [TestCase(false)] + // public async Task UpdateUser_ReturnsIfUpdateIsSuccessfull_WhenUserExistsy(bool shouldPass) + // { + // string name = "Gosho Trapov"; + // Guid id = Guid.NewGuid(); + // User user = new User + // { + // UserName = name, + // Id = id, + // }; + // UpdateUserServiceModel updateUserServiceModel = new UpdateUserServiceModel + // { + // UserName = name, + // }; + // UserServiceModel userServiceModel = new UserServiceModel + // { + // UserName = name, + // }; + // Role role = new Role { }; + // + // this.UserRepositoryMock.Setup(p => p.DoesUserExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + // this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + // this.UserRepositoryMock.Setup(p => p.DoesUserHaveThisUsername(It.IsAny(), It.IsAny())).Returns(true); + // this.UserRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(shouldPass)); + // this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); + // this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(user); + // this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(userServiceModel); + // + // if (shouldPass) + // { + // UserServiceModel result = await this.UserService.UpdateUser(updateUserServiceModel); + // + // Assert.AreEqual(updateUserServiceModel.UserName, result.UserName); + // } + // else + // { + // const string EXCEPTION_MESSAGE = "Unable to edit user!"; + // + // Exception ex = Assert.ThrowsAsync(() => this.UserService.UpdateUser(updateUserServiceModel)); + // + // Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorecct exception message"); + // } + // } + + [Test] + public void UpdateUser_ThrowsException_WhenUserDoesNotExist() + { + const string EXCEPTION_MESSAGE = "User does not exist!"; + UpdateUserServiceModel updateUserServiceModel = new UpdateUserServiceModel + { + }; + + this.UserRepositoryMock.Setup(p => p.DoesUserExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + + Exception ex = Assert.ThrowsAsync(() => this.UserService.UpdateUser(updateUserServiceModel)); + + Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorecct exception message"); + } + + [Test] + public void UpdateUser_ThrowsException_WhenUserNameAlreadyExists() + { + const string EXCEPTION_MESSAGE = "Username already exists!"; + UpdateUserServiceModel updateUserServiceModel = new UpdateUserServiceModel + { + }; + + this.UserRepositoryMock.Setup(p => p.DoesUserExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + this.UserRepositoryMock.Setup(p => p.DoesUsernameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + + Exception ex = Assert.ThrowsAsync(() => this.UserService.UpdateUser(updateUserServiceModel)); + + Assert.AreEqual(EXCEPTION_MESSAGE, ex.Message, "Incorecct exception message"); + } + #endregion + + #region DeleteUser + //TO DO: compleate once Viko has looked into the return type of UserService.DeleteUser + // [Test] + // [TestCase(true)] + // [TestCase(false)] + // public async Task DeleteUser_ShouldReturnIfDeletionIsSuccessfull_WhenUserExists(bool shouldPass) + // { + // Guid id = new Guid(); + // User user = new User(); + // + // this.UserRepositoryMock.Setup(p => p.DoesUserExistAsync(It.IsAny())).Returns(Task.FromResult(true)); + // this.UserRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(user)); + // this.UserRepositoryMock.Setup(p => p.DeleteAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); + // + // bool result = await this.UserService.DeleteUser(id); + // + // Assert.AreEqual(shouldPass, result); + // } + // + [Test] + public void DeleteUser_ThrowsException_WhenUserDoesNotExist() + { + string exceptionMessage = "User does not exist!"; + Guid id = new Guid(); + + this.UserRepositoryMock.Setup(p => p.DoesUserExistAsync(It.IsAny())).Returns(Task.FromResult(false)); + + Exception ex = Assert.ThrowsAsync(() => this.UserService.DeleteUser(id)); + + Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); + } + #endregion + + #region HelperMethods + private string WriteJWTSecurityToken(Guid userId, string username, HashSet roles) + { + byte[] signingKey = Encoding.ASCII.GetBytes(this.JWTOptions.Secret); + HashSet claims = new() + { + new Claim("ID", $"{userId}"), + new Claim("Username", username), + }; + + foreach (var role in roles) + { + claims.Add(new Claim(ClaimTypes.Role, role.Name)); + } + + SecurityTokenDescriptor tokenDescriptor = new() + { + Subject = new ClaimsIdentity(claims), + Expires = DateTime.Today.AddDays(7), + SigningCredentials = new SigningCredentials( + new SymmetricSecurityKey(signingKey), + SecurityAlgorithms.HmacSha512Signature) + }; + + JwtSecurityTokenHandler tokenHandler = new(); + SecurityToken token = tokenHandler.CreateToken(tokenDescriptor); + return tokenHandler.WriteToken(token); + } + #endregion + } +} diff --git a/src/Services/DevHive.Services/Configurations/Mapping/CommentMappings.cs b/src/Services/DevHive.Services/Configurations/Mapping/CommentMappings.cs new file mode 100644 index 0000000..5ca2a9e --- /dev/null +++ b/src/Services/DevHive.Services/Configurations/Mapping/CommentMappings.cs @@ -0,0 +1,27 @@ +using DevHive.Data.Models; +using AutoMapper; +using DevHive.Services.Models.Comment; +using DevHive.Common.Models.Misc; + +namespace DevHive.Services.Configurations.Mapping +{ + public class CommentMappings : Profile + { + public CommentMappings() + { + CreateMap(); + CreateMap() + .ForMember(dest => dest.Id, src => src.MapFrom(p => p.CommentId)) + .ForMember(dest => dest.Message, src => src.MapFrom(p => p.NewMessage)); + + CreateMap() + .ForMember(dest => dest.CommentId, src => src.MapFrom(p => p.Id)) + .ForMember(dest => dest.IssuerFirstName, src => src.MapFrom(p => p.Creator.FirstName)) + .ForMember(dest => dest.IssuerLastName, src => src.MapFrom(p => p.Creator.LastName)) + .ForMember(dest => dest.IssuerUsername, src => src.MapFrom(p => p.Creator.UserName)); + + CreateMap() + .ForMember(dest => dest.Id, src => src.MapFrom(p => p.Id)); + } + } +} diff --git a/src/Services/DevHive.Services/Configurations/Mapping/FeedMappings.cs b/src/Services/DevHive.Services/Configurations/Mapping/FeedMappings.cs new file mode 100644 index 0000000..952e480 --- /dev/null +++ b/src/Services/DevHive.Services/Configurations/Mapping/FeedMappings.cs @@ -0,0 +1,11 @@ +using AutoMapper; + +namespace DevHive.Services.Configurations.Mapping +{ + public class FeedMappings : Profile + { + public FeedMappings() + { + } + } +} diff --git a/src/Services/DevHive.Services/Configurations/Mapping/LanguageMappings.cs b/src/Services/DevHive.Services/Configurations/Mapping/LanguageMappings.cs new file mode 100644 index 0000000..9c572df --- /dev/null +++ b/src/Services/DevHive.Services/Configurations/Mapping/LanguageMappings.cs @@ -0,0 +1,22 @@ +using DevHive.Data.Models; +using AutoMapper; +using DevHive.Services.Models.Language; + +namespace DevHive.Services.Configurations.Mapping +{ + public class LanguageMappings : Profile + { + public LanguageMappings() + { + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + } + } +} diff --git a/src/Services/DevHive.Services/Configurations/Mapping/PostMappings.cs b/src/Services/DevHive.Services/Configurations/Mapping/PostMappings.cs new file mode 100644 index 0000000..9362f90 --- /dev/null +++ b/src/Services/DevHive.Services/Configurations/Mapping/PostMappings.cs @@ -0,0 +1,33 @@ +using DevHive.Data.Models; +using AutoMapper; +using DevHive.Services.Models.Post; +using DevHive.Common.Models.Misc; +using System.Collections.Generic; +using DevHive.Services.Models; + +namespace DevHive.Services.Configurations.Mapping +{ + public class PostMappings : Profile + { + public PostMappings() + { + CreateMap(); + // .ForMember(dest => dest.Files, src => src.Ignore()); + CreateMap() + .ForMember(dest => dest.Id, src => src.MapFrom(p => p.PostId)) + // .ForMember(dest => dest.Files, src => src.Ignore()) + .ForMember(dest => dest.Message, src => src.MapFrom(p => p.NewMessage)); + + CreateMap() + .ForMember(dest => dest.PostId, src => src.MapFrom(p => p.Id)) + .ForMember(dest => dest.CreatorFirstName, src => src.MapFrom(p => p.Creator.FirstName)) + .ForMember(dest => dest.CreatorLastName, src => src.MapFrom(p => p.Creator.LastName)) + .ForMember(dest => dest.CreatorUsername, src => src.MapFrom(p => p.Creator.UserName)); + + CreateMap() + .ForMember(dest => dest.Id, src => src.MapFrom(x => x.Id)); + + CreateMap, ReadPageServiceModel>(); + } + } +} diff --git a/src/Services/DevHive.Services/Configurations/Mapping/RatingMappings.cs b/src/Services/DevHive.Services/Configurations/Mapping/RatingMappings.cs new file mode 100644 index 0000000..1dbb7b4 --- /dev/null +++ b/src/Services/DevHive.Services/Configurations/Mapping/RatingMappings.cs @@ -0,0 +1,15 @@ +using AutoMapper; +using DevHive.Data.Models; +using DevHive.Services.Models.Post.Rating; + +namespace DevHive.Services.Configurations.Mapping +{ + public class RatingMappings : Profile + { + public RatingMappings() + { + // CreateMap() + // .ForMember(dest => dest.PostId, src => src.MapFrom(p => p.Post.Id)); + } + } +} diff --git a/src/Services/DevHive.Services/Configurations/Mapping/RoleMapings.cs b/src/Services/DevHive.Services/Configurations/Mapping/RoleMapings.cs new file mode 100644 index 0000000..e61a107 --- /dev/null +++ b/src/Services/DevHive.Services/Configurations/Mapping/RoleMapings.cs @@ -0,0 +1,19 @@ +using DevHive.Data.Models; +using AutoMapper; +using DevHive.Services.Models.Identity.Role; + +namespace DevHive.Services.Configurations.Mapping +{ + public class RoleMappings : Profile + { + public RoleMappings() + { + CreateMap(); + CreateMap(); + CreateMap(); + + CreateMap(); + CreateMap(); + } + } +} diff --git a/src/Services/DevHive.Services/Configurations/Mapping/TechnologyMappings.cs b/src/Services/DevHive.Services/Configurations/Mapping/TechnologyMappings.cs new file mode 100644 index 0000000..85b57f1 --- /dev/null +++ b/src/Services/DevHive.Services/Configurations/Mapping/TechnologyMappings.cs @@ -0,0 +1,21 @@ +using DevHive.Data.Models; +using AutoMapper; +using DevHive.Services.Models.Technology; + +namespace DevHive.Services.Configurations.Mapping +{ + public class TechnologyMappings : Profile + { + public TechnologyMappings() + { + CreateMap(); + CreateMap(); + CreateMap(); + + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + } + } +} diff --git a/src/Services/DevHive.Services/Configurations/Mapping/UserMappings.cs b/src/Services/DevHive.Services/Configurations/Mapping/UserMappings.cs new file mode 100644 index 0000000..2b0f4ed --- /dev/null +++ b/src/Services/DevHive.Services/Configurations/Mapping/UserMappings.cs @@ -0,0 +1,31 @@ +using DevHive.Data.Models; +using AutoMapper; +using DevHive.Services.Models.Identity.User; +using DevHive.Common.Models.Misc; +using DevHive.Data.RelationModels; + +namespace DevHive.Services.Configurations.Mapping +{ + public class UserMappings : Profile + { + public UserMappings() + { + CreateMap(); + CreateMap(); + CreateMap() + .ForMember(dest => dest.Friends, src => src.Ignore()); + CreateMap() + .ForMember(dest => dest.Friends, src => src.Ignore()) + .AfterMap((src, dest) => dest.PasswordHash = PasswordModifications.GeneratePasswordHash(src.Password)); + CreateMap(); + + CreateMap() + .ForMember(dest => dest.ProfilePictureURL, src => src.MapFrom(p => p.ProfilePicture.PictureURL)) + .ForMember(dest => dest.Friends, src => src.MapFrom(p => p.Friends)); + CreateMap() + .ForMember(x => x.Password, opt => opt.Ignore()) + .ForMember(dest => dest.ProfilePictureURL, src => src.MapFrom(p => p.ProfilePicture.PictureURL)); + CreateMap(); + } + } +} diff --git a/src/Services/DevHive.Services/DevHive.Services.csproj b/src/Services/DevHive.Services/DevHive.Services.csproj new file mode 100644 index 0000000..7a33166 --- /dev/null +++ b/src/Services/DevHive.Services/DevHive.Services.csproj @@ -0,0 +1,31 @@ + + + net5.0 + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + + + + + + + + true + latest + + diff --git a/src/Services/DevHive.Services/Interfaces/ICloudService.cs b/src/Services/DevHive.Services/Interfaces/ICloudService.cs new file mode 100644 index 0000000..3ae7a24 --- /dev/null +++ b/src/Services/DevHive.Services/Interfaces/ICloudService.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace DevHive.Services.Interfaces +{ + public interface ICloudService + { + Task> UploadFilesToCloud(List formFiles); + + // Task> GetFilesFromCloud(List fileUrls); + + Task RemoveFilesFromCloud(List fileUrls); + } +} diff --git a/src/Services/DevHive.Services/Interfaces/ICommentService.cs b/src/Services/DevHive.Services/Interfaces/ICommentService.cs new file mode 100644 index 0000000..e7409a8 --- /dev/null +++ b/src/Services/DevHive.Services/Interfaces/ICommentService.cs @@ -0,0 +1,20 @@ +using System; +using System.Threading.Tasks; +using DevHive.Services.Models.Comment; + +namespace DevHive.Services.Interfaces +{ + public interface ICommentService + { + Task AddComment(CreateCommentServiceModel createPostServiceModel); + + Task GetCommentById(Guid id); + + Task UpdateComment(UpdateCommentServiceModel updateCommentServiceModel); + + Task DeleteComment(Guid id); + + Task ValidateJwtForCreating(Guid userId, string rawTokenData); + Task ValidateJwtForComment(Guid commentId, string rawTokenData); + } +} diff --git a/src/Services/DevHive.Services/Interfaces/IFeedService.cs b/src/Services/DevHive.Services/Interfaces/IFeedService.cs new file mode 100644 index 0000000..b507b3b --- /dev/null +++ b/src/Services/DevHive.Services/Interfaces/IFeedService.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; +using DevHive.Services.Models; + +namespace DevHive.Services.Interfaces +{ + public interface IFeedService + { + Task GetPage(GetPageServiceModel getPageServiceModel); + Task GetUserPage(GetPageServiceModel model); + } +} diff --git a/src/Services/DevHive.Services/Interfaces/ILanguageService.cs b/src/Services/DevHive.Services/Interfaces/ILanguageService.cs new file mode 100644 index 0000000..fabbec2 --- /dev/null +++ b/src/Services/DevHive.Services/Interfaces/ILanguageService.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using DevHive.Services.Models.Language; + +namespace DevHive.Services.Interfaces +{ + public interface ILanguageService + { + Task CreateLanguage(CreateLanguageServiceModel createLanguageServiceModel); + + Task GetLanguageById(Guid id); + HashSet GetLanguages(); + + Task UpdateLanguage(UpdateLanguageServiceModel languageServiceModel); + + Task DeleteLanguage(Guid id); + } +} diff --git a/src/Services/DevHive.Services/Interfaces/IPostService.cs b/src/Services/DevHive.Services/Interfaces/IPostService.cs new file mode 100644 index 0000000..d35acfd --- /dev/null +++ b/src/Services/DevHive.Services/Interfaces/IPostService.cs @@ -0,0 +1,20 @@ +using System; +using System.Threading.Tasks; +using DevHive.Services.Models.Post; + +namespace DevHive.Services.Interfaces +{ + public interface IPostService + { + Task CreatePost(CreatePostServiceModel createPostServiceModel); + + Task GetPostById(Guid id); + + Task UpdatePost(UpdatePostServiceModel updatePostServiceModel); + + Task DeletePost(Guid id); + + Task ValidateJwtForCreating(Guid userId, string rawTokenData); + Task ValidateJwtForPost(Guid postId, string rawTokenData); + } +} diff --git a/src/Services/DevHive.Services/Interfaces/IRateService.cs b/src/Services/DevHive.Services/Interfaces/IRateService.cs new file mode 100644 index 0000000..359ef55 --- /dev/null +++ b/src/Services/DevHive.Services/Interfaces/IRateService.cs @@ -0,0 +1,14 @@ +using System; +using System.Threading.Tasks; +using DevHive.Data.Models; +using DevHive.Services.Models.Post.Rating; + +namespace DevHive.Services.Interfaces +{ + public interface IRateService + { + Task RatePost(RatePostServiceModel ratePostServiceModel); + + bool HasUserRatedThisPost(User user, Post post); + } +} diff --git a/src/Services/DevHive.Services/Interfaces/IRoleService.cs b/src/Services/DevHive.Services/Interfaces/IRoleService.cs new file mode 100644 index 0000000..d47728c --- /dev/null +++ b/src/Services/DevHive.Services/Interfaces/IRoleService.cs @@ -0,0 +1,17 @@ +using System; +using System.Threading.Tasks; +using DevHive.Services.Models.Identity.Role; + +namespace DevHive.Services.Interfaces +{ + public interface IRoleService + { + Task CreateRole(CreateRoleServiceModel roleServiceModel); + + Task GetRoleById(Guid id); + + Task UpdateRole(UpdateRoleServiceModel roleServiceModel); + + Task DeleteRole(Guid id); + } +} diff --git a/src/Services/DevHive.Services/Interfaces/ITechnologyService.cs b/src/Services/DevHive.Services/Interfaces/ITechnologyService.cs new file mode 100644 index 0000000..8f9510c --- /dev/null +++ b/src/Services/DevHive.Services/Interfaces/ITechnologyService.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using DevHive.Services.Models.Technology; + +namespace DevHive.Services.Interfaces +{ + public interface ITechnologyService + { + Task CreateTechnology(CreateTechnologyServiceModel technologyServiceModel); + + Task GetTechnologyById(Guid id); + HashSet GetTechnologies(); + + Task UpdateTechnology(UpdateTechnologyServiceModel updateTechnologyServiceModel); + + Task DeleteTechnology(Guid id); + } +} diff --git a/src/Services/DevHive.Services/Interfaces/IUserService.cs b/src/Services/DevHive.Services/Interfaces/IUserService.cs new file mode 100644 index 0000000..9e2b4e3 --- /dev/null +++ b/src/Services/DevHive.Services/Interfaces/IUserService.cs @@ -0,0 +1,25 @@ +using System; +using System.Threading.Tasks; +using DevHive.Common.Models.Identity; +using DevHive.Services.Models.Identity.User; + +namespace DevHive.Services.Interfaces +{ + public interface IUserService + { + Task LoginUser(LoginServiceModel loginModel); + Task RegisterUser(RegisterServiceModel registerModel); + + Task GetUserByUsername(string username); + Task GetUserById(Guid id); + + Task UpdateUser(UpdateUserServiceModel updateModel); + Task UpdateProfilePicture(UpdateProfilePictureServiceModel updateProfilePictureServiceModel); + + Task DeleteUser(Guid id); + + Task ValidJWT(Guid id, string rawTokenData); + + Task SuperSecretPromotionToAdmin(Guid userId); + } +} diff --git a/src/Services/DevHive.Services/Options/JWTOptions.cs b/src/Services/DevHive.Services/Options/JWTOptions.cs new file mode 100644 index 0000000..95458f5 --- /dev/null +++ b/src/Services/DevHive.Services/Options/JWTOptions.cs @@ -0,0 +1,14 @@ +using Microsoft.Extensions.Options; + +namespace DevHive.Services.Options +{ + public class JWTOptions + { + public JWTOptions(string secret) + { + this.Secret = secret; + } + + public string Secret { get; init; } + } +} diff --git a/src/Services/DevHive.Services/Services/CloudinaryService.cs b/src/Services/DevHive.Services/Services/CloudinaryService.cs new file mode 100644 index 0000000..57955a2 --- /dev/null +++ b/src/Services/DevHive.Services/Services/CloudinaryService.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; +using CloudinaryDotNet; +using CloudinaryDotNet.Actions; +using DevHive.Services.Interfaces; +using Microsoft.AspNetCore.Http; + +namespace DevHive.Services.Services +{ + public class CloudinaryService : ICloudService + { + private readonly Cloudinary _cloudinary; + + public CloudinaryService(string cloudName, string apiKey, string apiSecret) + { + this._cloudinary = new Cloudinary(new Account(cloudName, apiKey, apiSecret)); + } + + public async Task> UploadFilesToCloud(List formFiles) + { + List fileUrls = new(); + foreach (var formFile in formFiles) + { + string formFileId = Guid.NewGuid().ToString(); + + using (var ms = new MemoryStream()) + { + formFile.CopyTo(ms); + byte[] formBytes = ms.ToArray(); + + RawUploadParams rawUploadParams = new() + { + File = new FileDescription(formFileId, new MemoryStream(formBytes)), + PublicId = formFileId, + UseFilename = true + }; + + RawUploadResult rawUploadResult = await this._cloudinary.UploadAsync(rawUploadParams); + fileUrls.Add(rawUploadResult.Url.AbsoluteUri); + } + } + + return fileUrls; + } + + public async Task RemoveFilesFromCloud(List fileUrls) + { + return true; + } + } +} diff --git a/src/Services/DevHive.Services/Services/CommentService.cs b/src/Services/DevHive.Services/Services/CommentService.cs new file mode 100644 index 0000000..e2b54c4 --- /dev/null +++ b/src/Services/DevHive.Services/Services/CommentService.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Data.Models; +using DevHive.Services.Models.Comment; +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using DevHive.Services.Interfaces; +using DevHive.Data.Interfaces.Repositories; +using System.Linq; + +namespace DevHive.Services.Services +{ + public class CommentService : ICommentService + { + private readonly IUserRepository _userRepository; + private readonly IPostRepository _postRepository; + private readonly ICommentRepository _commentRepository; + private readonly IMapper _postMapper; + + public CommentService(IUserRepository userRepository, IPostRepository postRepository, ICommentRepository commentRepository, IMapper postMapper) + { + this._userRepository = userRepository; + this._postRepository = postRepository; + this._commentRepository = commentRepository; + this._postMapper = postMapper; + } + + #region Create + public async Task AddComment(CreateCommentServiceModel createCommentServiceModel) + { + if (!await this._postRepository.DoesPostExist(createCommentServiceModel.PostId)) + throw new ArgumentException("Post does not exist!"); + + Comment comment = this._postMapper.Map(createCommentServiceModel); + comment.TimeCreated = DateTime.Now; + + comment.Creator = await this._userRepository.GetByIdAsync(createCommentServiceModel.CreatorId); + comment.Post = await this._postRepository.GetByIdAsync(createCommentServiceModel.PostId); + + bool success = await this._commentRepository.AddAsync(comment); + if (success) + { + Comment newComment = await this._commentRepository + .GetCommentByIssuerAndTimeCreatedAsync(comment.Creator.Id, comment.TimeCreated); + + return newComment.Id; + } + else + return Guid.Empty; + } + #endregion + + #region Read + public async Task GetCommentById(Guid id) + { + Comment comment = await this._commentRepository.GetByIdAsync(id) ?? + throw new ArgumentException("The comment does not exist"); + + User user = await this._userRepository.GetByIdAsync(comment.Creator.Id) ?? + throw new ArgumentException("The user does not exist"); + + ReadCommentServiceModel readCommentServiceModel = this._postMapper.Map(comment); + readCommentServiceModel.IssuerFirstName = user.FirstName; + readCommentServiceModel.IssuerLastName = user.LastName; + readCommentServiceModel.IssuerUsername = user.UserName; + + return readCommentServiceModel; + } + #endregion + + #region Update + public async Task UpdateComment(UpdateCommentServiceModel updateCommentServiceModel) + { + if (!await this._commentRepository.DoesCommentExist(updateCommentServiceModel.CommentId)) + throw new ArgumentException("Comment does not exist!"); + + Comment comment = this._postMapper.Map(updateCommentServiceModel); + comment.TimeCreated = DateTime.Now; + + comment.Creator = await this._userRepository.GetByIdAsync(updateCommentServiceModel.CreatorId); + comment.Post = await this._postRepository.GetByIdAsync(updateCommentServiceModel.PostId); + + bool result = await this._commentRepository.EditAsync(updateCommentServiceModel.CommentId, comment); + + if (result) + return (await this._commentRepository.GetByIdAsync(updateCommentServiceModel.CommentId)).Id; + else + return Guid.Empty; + } + #endregion + + #region Delete + public async Task DeleteComment(Guid id) + { + if (!await this._commentRepository.DoesCommentExist(id)) + throw new ArgumentException("Comment does not exist!"); + + Comment comment = await this._commentRepository.GetByIdAsync(id); + return await this._commentRepository.DeleteAsync(comment); + } + #endregion + + #region Validations + /// + /// Checks whether the user Id in the token and the given user Id match + /// + public async Task ValidateJwtForCreating(Guid userId, string rawTokenData) + { + User user = await this.GetUserForValidation(rawTokenData); + + return user.Id == userId; + } + + /// + /// Checks whether the comment, gotten with the commentId, + /// is made by the user in the token + /// or if the user in the token is an admin + /// + public async Task ValidateJwtForComment(Guid commentId, string rawTokenData) + { + Comment comment = await this._commentRepository.GetByIdAsync(commentId) ?? + throw new ArgumentException("Comment does not exist!"); + User user = await this.GetUserForValidation(rawTokenData); + + //If user made the comment + if (comment.Creator.Id == user.Id) + return true; + //If user is admin + else if (user.Roles.Any(x => x.Name == Role.AdminRole)) + return true; + else + return false; + } + + /// + /// Returns the user, via their Id in the token + /// + private async Task GetUserForValidation(string rawTokenData) + { + JwtSecurityToken jwt = new JwtSecurityTokenHandler().ReadJwtToken(rawTokenData.Remove(0, 7)); + + Guid jwtUserId = Guid.Parse(this.GetClaimTypeValues("ID", jwt.Claims).First()); + //HashSet jwtRoleNames = this.GetClaimTypeValues("role", jwt.Claims); + + User user = await this._userRepository.GetByIdAsync(jwtUserId) ?? + throw new ArgumentException("User does not exist!"); + + return user; + } + + /// + /// Returns all values from a given claim type + /// + private List GetClaimTypeValues(string type, IEnumerable claims) + { + List toReturn = new(); + + foreach (var claim in claims) + if (claim.Type == type) + toReturn.Add(claim.Value); + + return toReturn; + } + #endregion + } +} + diff --git a/src/Services/DevHive.Services/Services/FeedService.cs b/src/Services/DevHive.Services/Services/FeedService.cs new file mode 100644 index 0000000..f2f4a3a --- /dev/null +++ b/src/Services/DevHive.Services/Services/FeedService.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using DevHive.Services.Interfaces; +using DevHive.Services.Models; +using DevHive.Services.Models.Post; + +namespace DevHive.Services.Services +{ + public class FeedService : IFeedService + { + private readonly IMapper _mapper; + private readonly IFeedRepository _feedRepository; + private readonly IUserRepository _userRepository; + + public FeedService(IFeedRepository feedRepository, IUserRepository userRepository, IMapper mapper) + { + this._feedRepository = feedRepository; + this._userRepository = userRepository; + this._mapper = mapper; + } + + /// + /// This method is used in the feed page. + /// See the FeedRepository "GetFriendsPosts" menthod for more information on how it works. + /// + public async Task GetPage(GetPageServiceModel model) + { + User user = null; + + if (model.UserId != Guid.Empty) + user = await this._userRepository.GetByIdAsync(model.UserId); + else if (!string.IsNullOrEmpty(model.Username)) + user = await this._userRepository.GetByUsernameAsync(model.Username); + else + throw new ArgumentException("Invalid given data!"); + + if (user == null) + throw new ArgumentException("User doesn't exist!"); + + if (user.Friends.Count == 0) + throw new ArgumentException("User has no friends to get feed from!"); + + List posts = await this._feedRepository + .GetFriendsPosts(user.Friends.ToList(), model.FirstRequestIssued, model.PageNumber, model.PageSize); + + ReadPageServiceModel readPageServiceModel = new(); + foreach (Post post in posts) + readPageServiceModel.Posts.Add(this._mapper.Map(post)); + + return readPageServiceModel; + } + + /// + /// This method is used in the profile pages. + /// See the FeedRepository "GetUsersPosts" menthod for more information on how it works. + /// + public async Task GetUserPage(GetPageServiceModel model) + { + User user = null; + + if (!string.IsNullOrEmpty(model.Username)) + user = await this._userRepository.GetByUsernameAsync(model.Username); + else + throw new ArgumentException("Invalid given data!"); + + if (user == null) + throw new ArgumentException("User doesn't exist!"); + + List posts = await this._feedRepository + .GetUsersPosts(user, model.FirstRequestIssued, model.PageNumber, model.PageSize); + + ReadPageServiceModel readPageServiceModel = new(); + foreach (Post post in posts) + readPageServiceModel.Posts.Add(this._mapper.Map(post)); + + return readPageServiceModel; + } + } +} diff --git a/src/Services/DevHive.Services/Services/LanguageService.cs b/src/Services/DevHive.Services/Services/LanguageService.cs new file mode 100644 index 0000000..a6364d8 --- /dev/null +++ b/src/Services/DevHive.Services/Services/LanguageService.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Language; + +namespace DevHive.Services.Services +{ + public class LanguageService : ILanguageService + { + private readonly ILanguageRepository _languageRepository; + private readonly IMapper _languageMapper; + + public LanguageService(ILanguageRepository languageRepository, IMapper mapper) + { + this._languageRepository = languageRepository; + this._languageMapper = mapper; + } + + #region Create + public async Task CreateLanguage(CreateLanguageServiceModel createLanguageServiceModel) + { + if (await this._languageRepository.DoesLanguageNameExistAsync(createLanguageServiceModel.Name)) + throw new ArgumentException("Language already exists!"); + + Language language = this._languageMapper.Map(createLanguageServiceModel); + bool success = await this._languageRepository.AddAsync(language); + + if (success) + { + Language newLanguage = await this._languageRepository.GetByNameAsync(createLanguageServiceModel.Name); + return newLanguage.Id; + } + else + return Guid.Empty; + } + #endregion + + #region Read + public async Task GetLanguageById(Guid id) + { + Language language = await this._languageRepository.GetByIdAsync(id); + + if (language == null) + throw new ArgumentException("The language does not exist"); + + return this._languageMapper.Map(language); + } + + public HashSet GetLanguages() + { + HashSet languages = this._languageRepository.GetLanguages(); + + return this._languageMapper.Map>(languages); + } + #endregion + + #region Update + public async Task UpdateLanguage(UpdateLanguageServiceModel languageServiceModel) + { + bool langExists = await this._languageRepository.DoesLanguageExistAsync(languageServiceModel.Id); + bool newLangNameExists = await this._languageRepository.DoesLanguageNameExistAsync(languageServiceModel.Name); + + if (!langExists) + throw new ArgumentException("Language does not exist!"); + + if (newLangNameExists) + throw new ArgumentException("Language name already exists in our data base!"); + + Language lang = this._languageMapper.Map(languageServiceModel); + return await this._languageRepository.EditAsync(languageServiceModel.Id, lang); + } + #endregion + + #region Delete + public async Task DeleteLanguage(Guid id) + { + if (!await this._languageRepository.DoesLanguageExistAsync(id)) + throw new ArgumentException("Language does not exist!"); + + Language language = await this._languageRepository.GetByIdAsync(id); + return await this._languageRepository.DeleteAsync(language); + } + #endregion + } +} diff --git a/src/Services/DevHive.Services/Services/PostService.cs b/src/Services/DevHive.Services/Services/PostService.cs new file mode 100644 index 0000000..fe91f23 --- /dev/null +++ b/src/Services/DevHive.Services/Services/PostService.cs @@ -0,0 +1,239 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Data.Models; +using DevHive.Services.Models.Post; +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using DevHive.Services.Interfaces; +using DevHive.Data.Interfaces.Repositories; +using System.Linq; +using DevHive.Data.RelationModels; + +namespace DevHive.Services.Services +{ + public class PostService : IPostService + { + private readonly ICloudService _cloudService; + private readonly IUserRepository _userRepository; + private readonly IPostRepository _postRepository; + private readonly ICommentRepository _commentRepository; + private readonly IMapper _postMapper; + + public PostService(ICloudService cloudService, IUserRepository userRepository, IPostRepository postRepository, ICommentRepository commentRepository, IMapper postMapper) + { + this._cloudService = cloudService; + this._userRepository = userRepository; + this._postRepository = postRepository; + this._commentRepository = commentRepository; + this._postMapper = postMapper; + } + + #region Create + public async Task CreatePost(CreatePostServiceModel createPostServiceModel) + { + if (!await this._userRepository.DoesUserExistAsync(createPostServiceModel.CreatorId)) + throw new ArgumentException("User does not exist!"); + + Post post = this._postMapper.Map(createPostServiceModel); + + if (createPostServiceModel.Files.Count != 0) + { + List fileUrls = await _cloudService.UploadFilesToCloud(createPostServiceModel.Files); + post.Attachments = this.GetPostAttachmentsFromUrls(post, fileUrls); + } + + post.Creator = await this._userRepository.GetByIdAsync(createPostServiceModel.CreatorId); + post.TimeCreated = DateTime.Now; + + bool success = await this._postRepository.AddAsync(post); + if (success) + { + Post newPost = await this._postRepository + .GetPostByCreatorAndTimeCreatedAsync(post.Creator.Id, post.TimeCreated); + + await this._postRepository.AddNewPostToCreator(createPostServiceModel.CreatorId, newPost); + + return newPost.Id; + } + else + return Guid.Empty; + } + #endregion + + #region Read + public async Task GetPostById(Guid id) + { + Post post = await this._postRepository.GetByIdAsync(id) ?? + throw new ArgumentException("The post does not exist!"); + + // This can't happen in repo, because of how time is usually compared + post.Comments = post.Comments + .OrderByDescending(x => x.TimeCreated.ToFileTimeUtc()) + .ToList(); + + User user = await this._userRepository.GetByIdAsync(post.Creator.Id) ?? + throw new ArgumentException("The user does not exist!"); + + ReadPostServiceModel readPostServiceModel = this._postMapper.Map(post); + readPostServiceModel.CreatorFirstName = user.FirstName; + readPostServiceModel.CreatorLastName = user.LastName; + readPostServiceModel.CreatorUsername = user.UserName; + readPostServiceModel.FileUrls = post.Attachments.Select(x => x.FileUrl).ToList(); + + return readPostServiceModel; + } + #endregion + + #region Update + public async Task UpdatePost(UpdatePostServiceModel updatePostServiceModel) + { + if (!await this._postRepository.DoesPostExist(updatePostServiceModel.PostId)) + throw new ArgumentException("Post does not exist!"); + + Post post = this._postMapper.Map(updatePostServiceModel); + + if (updatePostServiceModel.Files.Count != 0) + { + if (await this._postRepository.DoesPostHaveFiles(updatePostServiceModel.PostId)) + { + List fileUrlsToRemove = await this._postRepository.GetFileUrls(updatePostServiceModel.PostId); + bool success = await _cloudService.RemoveFilesFromCloud(fileUrlsToRemove); + if (!success) + throw new InvalidCastException("Could not delete files from the post!"); + } + + List fileUrls = await _cloudService.UploadFilesToCloud(updatePostServiceModel.Files) ?? + throw new ArgumentNullException("Unable to upload images to cloud"); + post.Attachments = this.GetPostAttachmentsFromUrls(post, fileUrls); + } + + post.Creator = await this._userRepository.GetByIdAsync(updatePostServiceModel.CreatorId); + post.Comments = await this._commentRepository.GetPostComments(updatePostServiceModel.PostId); + post.TimeCreated = DateTime.Now; + + bool result = await this._postRepository.EditAsync(updatePostServiceModel.PostId, post); + + if (result) + return (await this._postRepository.GetByIdAsync(updatePostServiceModel.PostId)).Id; + else + return Guid.Empty; + } + #endregion + + #region Delete + public async Task DeletePost(Guid id) + { + if (!await this._postRepository.DoesPostExist(id)) + throw new ArgumentException("Post does not exist!"); + + Post post = await this._postRepository.GetByIdAsync(id); + + if (await this._postRepository.DoesPostHaveFiles(id)) + { + List fileUrls = await this._postRepository.GetFileUrls(id); + bool success = await _cloudService.RemoveFilesFromCloud(fileUrls); + if (!success) + throw new InvalidCastException("Could not delete files from the post. Please try again"); + } + + return await this._postRepository.DeleteAsync(post); + } + #endregion + + #region Validations + /// + /// Checks whether the user Id in the token and the given user Id match + /// + public async Task ValidateJwtForCreating(Guid userId, string rawTokenData) + { + User user = await this.GetUserForValidation(rawTokenData); + + return user.Id == userId; + } + + /// + /// Checks whether the post, gotten with the postId, + /// is made by the user in the token + /// or if the user in the token is an admin + /// + public async Task ValidateJwtForPost(Guid postId, string rawTokenData) + { + Post post = await this._postRepository.GetByIdAsync(postId) ?? + throw new ArgumentException("Post does not exist!"); + User user = await this.GetUserForValidation(rawTokenData); + + //If user made the post + if (post.Creator.Id == user.Id) + return true; + //If user is admin + else if (user.Roles.Any(x => x.Name == Role.AdminRole)) + return true; + else + return false; + } + + /// + /// Checks whether the comment, gotten with the commentId, + /// is made by the user in the token + /// or if the user in the token is an admin + /// + public async Task ValidateJwtForComment(Guid commentId, string rawTokenData) + { + Comment comment = await this._commentRepository.GetByIdAsync(commentId) ?? + throw new ArgumentException("Comment does not exist!"); + User user = await this.GetUserForValidation(rawTokenData); + + //If user made the comment + if (comment.Creator.Id == user.Id) + return true; + //If user is admin + else if (user.Roles.Any(x => x.Name == Role.AdminRole)) + return true; + else + return false; + } + + /// + /// Returns the user, via their Id in the token + /// + private async Task GetUserForValidation(string rawTokenData) + { + JwtSecurityToken jwt = new JwtSecurityTokenHandler().ReadJwtToken(rawTokenData.Remove(0, 7)); + + Guid jwtUserId = Guid.Parse(this.GetClaimTypeValues("ID", jwt.Claims).First()); + //HashSet jwtRoleNames = this.GetClaimTypeValues("role", jwt.Claims); + + User user = await this._userRepository.GetByIdAsync(jwtUserId) ?? + throw new ArgumentException("User does not exist!"); + + return user; + } + + /// + /// Returns all values from a given claim type + /// + private List GetClaimTypeValues(string type, IEnumerable claims) + { + List toReturn = new(); + + foreach (var claim in claims) + if (claim.Type == type) + toReturn.Add(claim.Value); + + return toReturn; + } + #endregion + + #region Misc + private List GetPostAttachmentsFromUrls(Post post, List fileUrls) + { + List postAttachments = new List(); + foreach (string url in fileUrls) + postAttachments.Add(new PostAttachments { Post = post, FileUrl = url }); + return postAttachments; + } + #endregion + } +} diff --git a/src/Services/DevHive.Services/Services/RateService.cs b/src/Services/DevHive.Services/Services/RateService.cs new file mode 100644 index 0000000..204c550 --- /dev/null +++ b/src/Services/DevHive.Services/Services/RateService.cs @@ -0,0 +1,80 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Post.Rating; + +namespace DevHive.Services.Services +{ + public class RateService : IRateService + { + private readonly IPostRepository _postRepository; + private readonly IUserRepository _userRepository; + private readonly IRatingRepository _ratingRepository; + private readonly IMapper _mapper; + + public RateService(IPostRepository postRepository, IRatingRepository ratingRepository, IUserRepository userRepository, IMapper mapper) + { + this._postRepository = postRepository; + this._ratingRepository = ratingRepository; + this._userRepository = userRepository; + this._mapper = mapper; + } + + public async Task RatePost(RatePostServiceModel ratePostServiceModel) + { + throw new NotImplementedException(); + // if (!await this._postRepository.DoesPostExist(ratePostServiceModel.PostId)) + // throw new ArgumentException("Post does not exist!"); + + // if (!await this._userRepository.DoesUserExistAsync(ratePostServiceModel.UserId)) + // throw new ArgumentException("User does not exist!"); + + // Post post = await this._postRepository.GetByIdAsync(ratePostServiceModel.PostId); + // User user = await this._userRepository.GetByIdAsync(ratePostServiceModel.UserId); + + // if (this.HasUserRatedThisPost(user, post)) + // throw new ArgumentException("You can't rate the same post more then one(duh, amigo)"); + + // this.Rate(user, post, ratePostServiceModel.Liked); + + // bool success = await this._ratingRepository.EditAsync(post.Rating.Id, post.Rating); + // if (!success) + // throw new InvalidOperationException("Unable to rate the post!"); + + // Rating newRating = await this._ratingRepository.GetByIdAsync(post.Rating.Id); + // return this._mapper.Map(newRating); + } + + public async Task RemoveUserRateFromPost(Guid userId, Guid postId) + { + throw new NotImplementedException(); + // Post post = await this._postRepository.GetByIdAsync(postId); + // User user = await this._userRepository.GetByIdAsync(userId); + + // if (!this.HasUserRatedThisPost(user, post)) + // throw new ArgumentException("You haven't rated this post, lmao!"); + } + + public bool HasUserRatedThisPost(User user, Post post) + { + throw new NotImplementedException(); + // return post.Rating.UsersThatRated + // .Any(x => x.Id == user.Id); + } + + private void Rate(User user, Post post, bool liked) + { + throw new NotImplementedException(); + // if (liked) + // post.Rating.Rate++; + // else + // post.Rating.Rate--; + + // post.Rating.UsersThatRated.Add(user); + } + } +} diff --git a/src/Services/DevHive.Services/Services/RoleService.cs b/src/Services/DevHive.Services/Services/RoleService.cs new file mode 100644 index 0000000..a8b8e17 --- /dev/null +++ b/src/Services/DevHive.Services/Services/RoleService.cs @@ -0,0 +1,70 @@ +using System; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Identity.Role; +using DevHive.Services.Models.Language; + +namespace DevHive.Services.Services +{ + public class RoleService : IRoleService + { + private readonly IRoleRepository _roleRepository; + private readonly IMapper _roleMapper; + + public RoleService(IRoleRepository roleRepository, IMapper mapper) + { + this._roleRepository = roleRepository; + this._roleMapper = mapper; + } + + public async Task CreateRole(CreateRoleServiceModel roleServiceModel) + { + if (await this._roleRepository.DoesNameExist(roleServiceModel.Name)) + throw new ArgumentException("Role already exists!"); + + Role role = this._roleMapper.Map(roleServiceModel); + bool success = await this._roleRepository.AddAsync(role); + + if (success) + { + Role newRole = await this._roleRepository.GetByNameAsync(roleServiceModel.Name); + return newRole.Id; + } + else + return Guid.Empty; + + } + + public async Task GetRoleById(Guid id) + { + Role role = await this._roleRepository.GetByIdAsync(id) + ?? throw new ArgumentException("Role does not exist!"); + + return this._roleMapper.Map(role); + } + + public async Task UpdateRole(UpdateRoleServiceModel updateRoleServiceModel) + { + if (!await this._roleRepository.DoesRoleExist(updateRoleServiceModel.Id)) + throw new ArgumentException("Role does not exist!"); + + if (await this._roleRepository.DoesNameExist(updateRoleServiceModel.Name)) + throw new ArgumentException("Role name already exists!"); + + Role role = this._roleMapper.Map(updateRoleServiceModel); + return await this._roleRepository.EditAsync(updateRoleServiceModel.Id, role); + } + + public async Task DeleteRole(Guid id) + { + if (!await this._roleRepository.DoesRoleExist(id)) + throw new ArgumentException("Role does not exist!"); + + Role role = await this._roleRepository.GetByIdAsync(id); + return await this._roleRepository.DeleteAsync(role); + } + } +} diff --git a/src/Services/DevHive.Services/Services/TechnologyService.cs b/src/Services/DevHive.Services/Services/TechnologyService.cs new file mode 100644 index 0000000..6dd6286 --- /dev/null +++ b/src/Services/DevHive.Services/Services/TechnologyService.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Models; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Technology; + +namespace DevHive.Services.Services +{ + public class TechnologyService : ITechnologyService + { + private readonly ITechnologyRepository _technologyRepository; + private readonly IMapper _technologyMapper; + + public TechnologyService(ITechnologyRepository technologyRepository, IMapper technologyMapper) + { + this._technologyRepository = technologyRepository; + this._technologyMapper = technologyMapper; + } + + #region Create + public async Task CreateTechnology(CreateTechnologyServiceModel technologyServiceModel) + { + if (await this._technologyRepository.DoesTechnologyNameExistAsync(technologyServiceModel.Name)) + throw new ArgumentException("Technology already exists!"); + + Technology technology = this._technologyMapper.Map(technologyServiceModel); + bool success = await this._technologyRepository.AddAsync(technology); + + if (success) + { + Technology newTechnology = await this._technologyRepository.GetByNameAsync(technologyServiceModel.Name); + return newTechnology.Id; + } + else + return Guid.Empty; + } + #endregion + + #region Read + public async Task GetTechnologyById(Guid id) + { + Technology technology = await this._technologyRepository.GetByIdAsync(id); + + if (technology == null) + throw new ArgumentException("The technology does not exist"); + + return this._technologyMapper.Map(technology); + } + + public HashSet GetTechnologies() + { + HashSet technologies = this._technologyRepository.GetTechnologies(); + + return this._technologyMapper.Map>(technologies); + } + #endregion + + #region Update + public async Task UpdateTechnology(UpdateTechnologyServiceModel updateTechnologyServiceModel) + { + if (!await this._technologyRepository.DoesTechnologyExistAsync(updateTechnologyServiceModel.Id)) + throw new ArgumentException("Technology does not exist!"); + + if (await this._technologyRepository.DoesTechnologyNameExistAsync(updateTechnologyServiceModel.Name)) + throw new ArgumentException("Technology name already exists!"); + + Technology technology = this._technologyMapper.Map(updateTechnologyServiceModel); + bool result = await this._technologyRepository.EditAsync(updateTechnologyServiceModel.Id, technology); + + return result; + } + #endregion + + #region Delete + public async Task DeleteTechnology(Guid id) + { + if (!await this._technologyRepository.DoesTechnologyExistAsync(id)) + throw new ArgumentException("Technology does not exist!"); + + Technology technology = await this._technologyRepository.GetByIdAsync(id); + bool result = await this._technologyRepository.DeleteAsync(technology); + + return result; + } + #endregion + } +} diff --git a/src/Services/DevHive.Services/Services/UserService.cs b/src/Services/DevHive.Services/Services/UserService.cs new file mode 100644 index 0000000..22d5052 --- /dev/null +++ b/src/Services/DevHive.Services/Services/UserService.cs @@ -0,0 +1,382 @@ +using AutoMapper; +using DevHive.Services.Options; +using DevHive.Services.Models.Identity.User; +using System.Threading.Tasks; +using DevHive.Data.Models; +using System; +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using Microsoft.IdentityModel.Tokens; +using System.Text; +using System.Collections.Generic; +using DevHive.Common.Models.Identity; +using DevHive.Services.Interfaces; +using DevHive.Data.Interfaces.Repositories; +using System.Linq; +using DevHive.Common.Models.Misc; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Identity; + +namespace DevHive.Services.Services +{ + public class UserService : IUserService + { + private readonly IUserRepository _userRepository; + private readonly IRoleRepository _roleRepository; + private readonly ILanguageRepository _languageRepository; + private readonly ITechnologyRepository _technologyRepository; + private readonly UserManager _userManager; + private readonly RoleManager _roleManager; + private readonly IMapper _userMapper; + private readonly JWTOptions _jwtOptions; + private readonly ICloudService _cloudService; + + public UserService(IUserRepository userRepository, + ILanguageRepository languageRepository, + IRoleRepository roleRepository, + ITechnologyRepository technologyRepository, + UserManager userManager, + RoleManager roleManager, + IMapper mapper, + JWTOptions jwtOptions, + ICloudService cloudService) + { + this._userRepository = userRepository; + this._roleRepository = roleRepository; + this._userMapper = mapper; + this._jwtOptions = jwtOptions; + this._languageRepository = languageRepository; + this._technologyRepository = technologyRepository; + this._userManager = userManager; + this._roleManager = roleManager; + this._cloudService = cloudService; + } + + #region Authentication + /// + /// Adds a new user to the database with the values from the given model. + /// Returns a JSON Web Token (that can be used for authorization) + /// + public async Task LoginUser(LoginServiceModel loginModel) + { + if (!await this._userRepository.DoesUsernameExistAsync(loginModel.UserName)) + throw new ArgumentException("Invalid username!"); + + User user = await this._userRepository.GetByUsernameAsync(loginModel.UserName); + + if (user.PasswordHash != PasswordModifications.GeneratePasswordHash(loginModel.Password)) + throw new ArgumentException("Incorrect password!"); + + return new TokenModel(WriteJWTSecurityToken(user.Id, user.UserName, user.Roles)); + } + + /// + /// Returns a new JSON Web Token (that can be used for authorization) for the given user + /// + public async Task RegisterUser(RegisterServiceModel registerModel) + { + if (await this._userRepository.DoesUsernameExistAsync(registerModel.UserName)) + throw new ArgumentException("Username already exists!"); + + if (await this._userRepository.DoesEmailExistAsync(registerModel.Email)) + throw new ArgumentException("Email already exists!"); + + User user = this._userMapper.Map(registerModel); + user.PasswordHash = PasswordModifications.GeneratePasswordHash(registerModel.Password); + user.ProfilePicture = new ProfilePicture() { PictureURL = "/assets/images/feed/profile-pic.png" }; + + // Make sure the default role exists + //TODO: Move when project starts + if (!await this._roleRepository.DoesNameExist(Role.DefaultRole)) + await this._roleRepository.AddAsync(new Role { Name = Role.DefaultRole }); + + user.Roles.Add(await this._roleRepository.GetByNameAsync(Role.DefaultRole)); + + IdentityResult userResult = await this._userManager.CreateAsync(user); + User createdUser = await this._userRepository.GetByUsernameAsync(registerModel.UserName); + + if (!userResult.Succeeded) + throw new ArgumentException("Unable to create a user"); + + return new TokenModel(WriteJWTSecurityToken(createdUser.Id, createdUser.UserName, createdUser.Roles)); + } + #endregion + + #region Read + public async Task GetUserById(Guid id) + { + User user = await this._userRepository.GetByIdAsync(id) ?? + throw new ArgumentException("User does not exist!"); + + return this._userMapper.Map(user); + } + + public async Task GetUserByUsername(string username) + { + User user = await this._userRepository.GetByUsernameAsync(username) ?? + throw new ArgumentException("User does not exist!"); + + return this._userMapper.Map(user); + } + #endregion + + #region Update + public async Task UpdateUser(UpdateUserServiceModel updateUserServiceModel) + { + await this.ValidateUserOnUpdate(updateUserServiceModel); + + User currentUser = await this._userRepository.GetByIdAsync(updateUserServiceModel.Id); + await this.PopulateUserModel(currentUser, updateUserServiceModel); + + if (updateUserServiceModel.Friends.Count() > 0) + await this.CreateRelationToFriends(currentUser, updateUserServiceModel.Friends.ToList()); + else + currentUser.Friends.Clear(); + + IdentityResult result = await this._userManager.UpdateAsync(currentUser); + + if (!result.Succeeded) + throw new InvalidOperationException("Unable to edit user!"); + + User newUser = await this._userRepository.GetByIdAsync(currentUser.Id); + return this._userMapper.Map(newUser); + } + + /// + /// Uploads the given picture and assigns it's link to the user in the database + /// + public async Task UpdateProfilePicture(UpdateProfilePictureServiceModel updateProfilePictureServiceModel) + { + User user = await this._userRepository.GetByIdAsync(updateProfilePictureServiceModel.UserId); + + if (!string.IsNullOrEmpty(user.ProfilePicture.PictureURL)) + { + bool success = await _cloudService.RemoveFilesFromCloud(new List { user.ProfilePicture.PictureURL }); + if (!success) + throw new InvalidCastException("Could not delete old profile picture!"); + } + + string fileUrl = (await this._cloudService.UploadFilesToCloud(new List { updateProfilePictureServiceModel.Picture }))[0] ?? + throw new ArgumentNullException("Unable to upload profile picture to cloud"); + + bool successful = await this._userRepository.UpdateProfilePicture(updateProfilePictureServiceModel.UserId, fileUrl); + + if (!successful) + throw new InvalidOperationException("Unable to change profile picture!"); + + return new ProfilePictureServiceModel() { ProfilePictureURL = fileUrl }; + } + #endregion + + #region Delete + public async Task DeleteUser(Guid id) + { + if (!await this._userRepository.DoesUserExistAsync(id)) + throw new ArgumentException("User does not exist!"); + + User user = await this._userRepository.GetByIdAsync(id); + IdentityResult result = await this._userManager.DeleteAsync(user); + + return result.Succeeded; + } + #endregion + + #region Validations + /// + /// Checks whether the given user, gotten by the "id" property, + /// is the same user as the one in the token (uness the user in the token has the admin role) + /// and the roles in the token are the same as those in the user, gotten by the id in the token + /// + public async Task ValidJWT(Guid id, string rawTokenData) + { + // There is authorization name in the beginning, i.e. "Bearer eyJh..." + var jwt = new JwtSecurityTokenHandler().ReadJwtToken(rawTokenData.Remove(0, 7)); + + Guid jwtUserID = new Guid(this.GetClaimTypeValues("ID", jwt.Claims).First()); + List jwtRoleNames = this.GetClaimTypeValues("role", jwt.Claims); + + User user = await this._userRepository.GetByIdAsync(jwtUserID) + ?? throw new ArgumentException("User does not exist!"); + + /* Check if user is trying to do something to himself, unless he's an admin */ + + /* Check roles */ + if (!jwtRoleNames.Contains(Role.AdminRole)) + if (user.Id != id) + return false; + + // Check if jwt contains all user roles (if it doesn't, jwt is either old or tampered with) + foreach (var role in user.Roles) + { + if (!jwtRoleNames.Contains(role.Name)) + return false; + } + + // Check if jwt contains only roles of user + if (jwtRoleNames.Count != user.Roles.Count) + return false; + + return true; + } + + /// + /// Returns all values from a given claim type + /// + private List GetClaimTypeValues(string type, IEnumerable claims) + { + List toReturn = new(); + + foreach (var claim in claims) + if (claim.Type == type) + toReturn.Add(claim.Value); + + return toReturn; + } + + /// + /// Checks whether the user in the model exists + /// and whether the username in the model is already taken. + /// If the check fails (is false), it throws an exception, otherwise nothing happens + /// + private async Task ValidateUserOnUpdate(UpdateUserServiceModel updateUserServiceModel) + { + if (!await this._userRepository.DoesUserExistAsync(updateUserServiceModel.Id)) + throw new ArgumentException("User does not exist!"); + + if (updateUserServiceModel.Friends.Any(x => x.UserName == updateUserServiceModel.UserName)) + throw new ArgumentException("You cant add yourself as a friend(sry, bro)!"); + + if (!this._userRepository.DoesUserHaveThisUsername(updateUserServiceModel.Id, updateUserServiceModel.UserName) + && await this._userRepository.DoesUsernameExistAsync(updateUserServiceModel.UserName)) + throw new ArgumentException("Username already exists!"); + + List usernames = new(); + foreach (var friend in updateUserServiceModel.Friends) + usernames.Add(friend.UserName); + + if (!await this._userRepository.ValidateFriendsCollectionAsync(usernames)) + throw new ArgumentException("One or more friends do not exist!"); + } + + /// + /// Return a new JSON Web Token, containing the user id, username and roles. + /// Tokens have an expiration time of 7 days. + /// + private string WriteJWTSecurityToken(Guid userId, string username, HashSet roles) + { + byte[] signingKey = Encoding.ASCII.GetBytes(_jwtOptions.Secret); + HashSet claims = new() + { + new Claim("ID", $"{userId}"), + new Claim("Username", username) + }; + + foreach (var role in roles) + { + claims.Add(new Claim(ClaimTypes.Role, role.Name)); + } + + SecurityTokenDescriptor tokenDescriptor = new() + { + Subject = new ClaimsIdentity(claims), + Expires = DateTime.Today.AddDays(7), + SigningCredentials = new SigningCredentials( + new SymmetricSecurityKey(signingKey), + SecurityAlgorithms.HmacSha512Signature) + }; + + JwtSecurityTokenHandler tokenHandler = new(); + SecurityToken token = tokenHandler.CreateToken(tokenDescriptor); + return tokenHandler.WriteToken(token); + } + #endregion + + #region Misc + public async Task SuperSecretPromotionToAdmin(Guid userId) + { + User user = await this._userRepository.GetByIdAsync(userId) ?? + throw new ArgumentException("User does not exist! Can't promote shit in this country..."); + + if (!await this._roleRepository.DoesNameExist(Role.AdminRole)) + { + Role adminRole = new() + { + Name = Role.AdminRole + }; + adminRole.Users.Add(user); + + await this._roleRepository.AddAsync(adminRole); + } + + Role admin = await this._roleManager.FindByNameAsync(Role.AdminRole); + + user.Roles.Add(admin); + await this._userManager.UpdateAsync(user); + + User newUser = await this._userRepository.GetByIdAsync(userId); + + return new TokenModel(WriteJWTSecurityToken(newUser.Id, newUser.UserName, newUser.Roles)); + } + + private async Task PopulateUserModel(User user, UpdateUserServiceModel updateUserServiceModel) + { + user.UserName = updateUserServiceModel.UserName; + user.FirstName = updateUserServiceModel.FirstName; + user.LastName = updateUserServiceModel.LastName; + user.Email = updateUserServiceModel.Email; + + //Do NOT allow a user to change his roles, unless he is an Admin + bool isAdmin = await this._userManager.IsInRoleAsync(user, Role.AdminRole); + + if (isAdmin) + { + HashSet roles = new(); + foreach (var role in updateUserServiceModel.Roles) + { + Role returnedRole = await this._roleRepository.GetByNameAsync(role.Name) ?? + throw new ArgumentException($"Role {role.Name} does not exist!"); + + roles.Add(returnedRole); + } + user.Roles = roles; + } + + HashSet languages = new(); + int languagesCount = updateUserServiceModel.Languages.Count; + for (int i = 0; i < languagesCount; i++) + { + Language language = await this._languageRepository.GetByNameAsync(updateUserServiceModel.Languages.ElementAt(i).Name) ?? + throw new ArgumentException("Invalid language name!"); + + languages.Add(language); + } + user.Languages = languages; + + /* Fetch Technologies and replace model's*/ + HashSet technologies = new(); + int technologiesCount = updateUserServiceModel.Technologies.Count; + for (int i = 0; i < technologiesCount; i++) + { + Technology technology = await this._technologyRepository.GetByNameAsync(updateUserServiceModel.Technologies.ElementAt(i).Name) ?? + throw new ArgumentException("Invalid technology name!"); + + technologies.Add(technology); + } + user.Technologies = technologies; + } + + private async Task CreateRelationToFriends(User user, List friends) + { + foreach (var friend in friends) + { + User amigo = await this._userRepository.GetByUsernameAsync(friend.UserName); + + user.Friends.Add(amigo); + amigo.Friends.Add(user); + + await this._userManager.UpdateAsync(amigo); + } + } + #endregion + } +} diff --git a/src/Web/DevHive.Web.Models/Comment/CreateCommentWebModel.cs b/src/Web/DevHive.Web.Models/Comment/CreateCommentWebModel.cs new file mode 100644 index 0000000..8b2bf8d --- /dev/null +++ b/src/Web/DevHive.Web.Models/Comment/CreateCommentWebModel.cs @@ -0,0 +1,17 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + +namespace DevHive.Web.Models.Comment +{ + public class CreateCommentWebModel + { + [NotNull] + [Required] + public Guid PostId { get; set; } + + [NotNull] + [Required] + public string Message { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Comment/ReadCommentWebModel.cs b/src/Web/DevHive.Web.Models/Comment/ReadCommentWebModel.cs new file mode 100644 index 0000000..4d3aff7 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Comment/ReadCommentWebModel.cs @@ -0,0 +1,21 @@ +using System; + +namespace DevHive.Web.Models.Comment +{ + public class ReadCommentWebModel + { + public Guid CommentId { get; set; } + + public Guid PostId { get; set; } + + public string IssuerFirstName { get; set; } + + public string IssuerLastName { get; set; } + + public string IssuerUsername { get; set; } + + public string Message { get; set; } + + public DateTime TimeCreated { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Comment/UpdateCommentWebModel.cs b/src/Web/DevHive.Web.Models/Comment/UpdateCommentWebModel.cs new file mode 100644 index 0000000..b5d7970 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Comment/UpdateCommentWebModel.cs @@ -0,0 +1,13 @@ +using System; + +namespace DevHive.Web.Models.Comment +{ + public class UpdateCommentWebModel + { + public Guid CommentId { get; set; } + + public Guid PostId { get; set; } + + public string NewMessage { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/DevHive.Web.Models.csproj b/src/Web/DevHive.Web.Models/DevHive.Web.Models.csproj new file mode 100644 index 0000000..0462967 --- /dev/null +++ b/src/Web/DevHive.Web.Models/DevHive.Web.Models.csproj @@ -0,0 +1,14 @@ + + + + net5.0 + + + + + + + + + + diff --git a/src/Web/DevHive.Web.Models/Feed/GetPageWebModel.cs b/src/Web/DevHive.Web.Models/Feed/GetPageWebModel.cs new file mode 100644 index 0000000..4ea44cc --- /dev/null +++ b/src/Web/DevHive.Web.Models/Feed/GetPageWebModel.cs @@ -0,0 +1,19 @@ +using System; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; + +namespace DevHive.Web.Models.Feed +{ + public class GetPageWebModel + { + [Range(1, int.MaxValue)] + public int PageNumber { get; set; } + + [Required] + public DateTime FirstPageTimeIssued { get; set; } + + [DefaultValue(5)] + [Range(1, int.MaxValue)] + public int PageSize { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Feed/ReadPageWebModel.cs b/src/Web/DevHive.Web.Models/Feed/ReadPageWebModel.cs new file mode 100644 index 0000000..f429313 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Feed/ReadPageWebModel.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using DevHive.Web.Models.Post; + +namespace DevHive.Web.Models.Comment +{ + public class ReadPageWebModel + { + public List Posts { get; set; } = new(); + } +} diff --git a/src/Web/DevHive.Web.Models/Identity/Role/CreateRoleWebModel.cs b/src/Web/DevHive.Web.Models/Identity/Role/CreateRoleWebModel.cs new file mode 100644 index 0000000..859cdd9 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Identity/Role/CreateRoleWebModel.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + +namespace DevHive.Web.Models.Identity.Role +{ + public class CreateRoleWebModel + { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] + public string Name { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Identity/Role/RoleWebModel.cs b/src/Web/DevHive.Web.Models/Identity/Role/RoleWebModel.cs new file mode 100644 index 0000000..99b0f50 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Identity/Role/RoleWebModel.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + +namespace DevHive.Web.Models.Identity.Role +{ + public class RoleWebModel + { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] + public string Name { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Identity/Role/UpdateRoleWebModel.cs b/src/Web/DevHive.Web.Models/Identity/Role/UpdateRoleWebModel.cs new file mode 100644 index 0000000..3870481 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Identity/Role/UpdateRoleWebModel.cs @@ -0,0 +1,15 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + +namespace DevHive.Web.Models.Identity.Role +{ + public class UpdateRoleWebModel + { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] + public string Name { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Identity/User/BaseUserWebModel.cs b/src/Web/DevHive.Web.Models/Identity/User/BaseUserWebModel.cs new file mode 100644 index 0000000..297e1a5 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Identity/User/BaseUserWebModel.cs @@ -0,0 +1,34 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; +using DevHive.Web.Attributes; + +namespace DevHive.Web.Models.Identity.User +{ + public class BaseUserWebModel + { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] + public string UserName { get; set; } + + [NotNull] + [Required] + [EmailAddress] + public string Email { get; set; } + + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(30)] + [OnlyLetters(ErrorMessage = "First name can only contain letters!")] + public string FirstName { get; set; } + + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(30)] + [OnlyLetters(ErrorMessage = "Last name can only contain letters!")] + public string LastName { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Identity/User/LoginWebModel.cs b/src/Web/DevHive.Web.Models/Identity/User/LoginWebModel.cs new file mode 100644 index 0000000..ccd806f --- /dev/null +++ b/src/Web/DevHive.Web.Models/Identity/User/LoginWebModel.cs @@ -0,0 +1,20 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; +using DevHive.Web.Attributes; + +namespace DevHive.Web.Models.Identity.User +{ + public class LoginWebModel + { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] + public string UserName { get; set; } + + [NotNull] + [Required] + [GoodPassword] + public string Password { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Identity/User/ProfilePictureWebModel.cs b/src/Web/DevHive.Web.Models/Identity/User/ProfilePictureWebModel.cs new file mode 100644 index 0000000..91c9487 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Identity/User/ProfilePictureWebModel.cs @@ -0,0 +1,7 @@ +namespace DevHive.Web.Models.Identity.User +{ + public class ProfilePictureWebModel + { + public string ProfilePictureURL { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Identity/User/RegisterWebModel.cs b/src/Web/DevHive.Web.Models/Identity/User/RegisterWebModel.cs new file mode 100644 index 0000000..0fc7ec6 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Identity/User/RegisterWebModel.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; +using DevHive.Web.Attributes; + +namespace DevHive.Web.Models.Identity.User +{ + public class RegisterWebModel : BaseUserWebModel + { + [NotNull] + [Required] + [GoodPassword] + public string Password { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Identity/User/TokenWebModel.cs b/src/Web/DevHive.Web.Models/Identity/User/TokenWebModel.cs new file mode 100644 index 0000000..154b64b --- /dev/null +++ b/src/Web/DevHive.Web.Models/Identity/User/TokenWebModel.cs @@ -0,0 +1,12 @@ +namespace DevHive.Web.Models.Identity.User +{ + public class TokenWebModel + { + public TokenWebModel(string token) + { + this.Token = token; + } + + public string Token { get; set; } + } +} \ No newline at end of file diff --git a/src/Web/DevHive.Web.Models/Identity/User/UpdateProfilePictureWebModel.cs b/src/Web/DevHive.Web.Models/Identity/User/UpdateProfilePictureWebModel.cs new file mode 100644 index 0000000..6efe968 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Identity/User/UpdateProfilePictureWebModel.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Http; + +namespace DevHive.Web.Models.Identity.User +{ + public class UpdateProfilePictureWebModel + { + public IFormFile Picture { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Identity/User/UpdateUserWebModel.cs b/src/Web/DevHive.Web.Models/Identity/User/UpdateUserWebModel.cs new file mode 100644 index 0000000..62901f6 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Identity/User/UpdateUserWebModel.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; +using DevHive.Web.Attributes; +using DevHive.Web.Models.Identity.Role; +using DevHive.Web.Models.Language; +using DevHive.Web.Models.Technology; + +namespace DevHive.Web.Models.Identity.User +{ + public class UpdateUserWebModel : BaseUserWebModel + { + [NotNull] + [Required] + [GoodPassword] + public string Password { get; set; } + + [NotNull] + [Required] + public HashSet Friends { get; set; } + + [NotNull] + [Required] + public HashSet Roles { get; set; } + + [NotNull] + [Required] + public HashSet Languages { get; set; } + + [NotNull] + [Required] + public HashSet Technologies { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Identity/User/UserWebModel.cs b/src/Web/DevHive.Web.Models/Identity/User/UserWebModel.cs new file mode 100644 index 0000000..7ab8cca --- /dev/null +++ b/src/Web/DevHive.Web.Models/Identity/User/UserWebModel.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; +using DevHive.Common.Models.Misc; +using DevHive.Web.Models.Identity.Role; +using DevHive.Web.Models.Language; +using DevHive.Web.Models.Technology; + +namespace DevHive.Web.Models.Identity.User +{ + public class UserWebModel : BaseUserWebModel + { + public string ProfilePictureURL { get; set; } + + [NotNull] + [Required] + public HashSet Roles { get; set; } = new(); + + [NotNull] + [Required] + public HashSet Friends { get; set; } = new(); + + [NotNull] + [Required] + public HashSet Languages { get; set; } = new(); + + [NotNull] + [Required] + public HashSet Technologies { get; set; } = new(); + + public List Posts { get; set; } = new(); + } +} diff --git a/src/Web/DevHive.Web.Models/Identity/User/UsernameWebModel.cs b/src/Web/DevHive.Web.Models/Identity/User/UsernameWebModel.cs new file mode 100644 index 0000000..c533bba --- /dev/null +++ b/src/Web/DevHive.Web.Models/Identity/User/UsernameWebModel.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; +using DevHive.Web.Attributes; + +namespace DevHive.Web.Models.Identity.User +{ + public class UsernameWebModel + { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] + public string UserName { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Language/CreateLanguageWebModel.cs b/src/Web/DevHive.Web.Models/Language/CreateLanguageWebModel.cs new file mode 100644 index 0000000..a739e7f --- /dev/null +++ b/src/Web/DevHive.Web.Models/Language/CreateLanguageWebModel.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + +namespace DevHive.Web.Models.Language +{ + public class CreateLanguageWebModel + { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] + public string Name { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Language/LanguageWebModel.cs b/src/Web/DevHive.Web.Models/Language/LanguageWebModel.cs new file mode 100644 index 0000000..7515e70 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Language/LanguageWebModel.cs @@ -0,0 +1,13 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + +namespace DevHive.Web.Models.Language +{ + public class LanguageWebModel + { + [NotNull] + [Required] + public Guid Id { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Language/ReadLanguageWebModel.cs b/src/Web/DevHive.Web.Models/Language/ReadLanguageWebModel.cs new file mode 100644 index 0000000..3d9d5b6 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Language/ReadLanguageWebModel.cs @@ -0,0 +1,11 @@ +using System; + +namespace DevHive.Web.Models.Language +{ + public class ReadLanguageWebModel + { + public Guid Id { get; set; } + + public string Name { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Language/UpdateLanguageWebModel.cs b/src/Web/DevHive.Web.Models/Language/UpdateLanguageWebModel.cs new file mode 100644 index 0000000..128d534 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Language/UpdateLanguageWebModel.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + +namespace DevHive.Web.Models.Language +{ + public class UpdateLanguageWebModel + { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] + public string Name { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Post/CreatePostWebModel.cs b/src/Web/DevHive.Web.Models/Post/CreatePostWebModel.cs new file mode 100644 index 0000000..237259d --- /dev/null +++ b/src/Web/DevHive.Web.Models/Post/CreatePostWebModel.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Http; + +namespace DevHive.Web.Models.Post +{ + public class CreatePostWebModel + { + [NotNull] + [Required] + public string Message { get; set; } + + public List Files { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Post/Rating/RatePostWebModel.cs b/src/Web/DevHive.Web.Models/Post/Rating/RatePostWebModel.cs new file mode 100644 index 0000000..5f0e58f --- /dev/null +++ b/src/Web/DevHive.Web.Models/Post/Rating/RatePostWebModel.cs @@ -0,0 +1,11 @@ +using System; + +namespace DevHive.Web.Models.Post.Rating +{ + public class RatePostWebModel + { + public Guid PostId { get; set; } + + public bool Liked { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Post/Rating/ReadPostRatingWebModel.cs b/src/Web/DevHive.Web.Models/Post/Rating/ReadPostRatingWebModel.cs new file mode 100644 index 0000000..a551fb8 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Post/Rating/ReadPostRatingWebModel.cs @@ -0,0 +1,15 @@ +using System; + +namespace DevHive.Web.Models.Post.Rating +{ + public class ReadPostRatingWebModel + { + public Guid Id { get; set; } + + public Guid PostId { get; set; } + + public int Likes { get; set; } + + public int Dislikes { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Post/ReadPostWebModel.cs b/src/Web/DevHive.Web.Models/Post/ReadPostWebModel.cs new file mode 100644 index 0000000..8238f47 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Post/ReadPostWebModel.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using DevHive.Common.Models.Misc; + +namespace DevHive.Web.Models.Post +{ + public class ReadPostWebModel + { + public Guid PostId { get; set; } + + public string CreatorFirstName { get; set; } + + public string CreatorLastName { get; set; } + + public string CreatorUsername { get; set; } + + public string Message { get; set; } + + public DateTime TimeCreated { get; set; } + + public List Comments { get; set; } + + public List FileUrls { get; set; } + // public List Files { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Post/UpdatePostWebModel.cs b/src/Web/DevHive.Web.Models/Post/UpdatePostWebModel.cs new file mode 100644 index 0000000..a0c9b61 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Post/UpdatePostWebModel.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Http; + +namespace DevHive.Web.Models.Post +{ + public class UpdatePostWebModel + { + [Required] + [NotNull] + public Guid PostId { get; set; } + + [NotNull] + [Required] + public string NewMessage { get; set; } + + public List Files { get; set; } = new(); + } +} diff --git a/src/Web/DevHive.Web.Models/Technology/CreateTechnologyWebModel.cs b/src/Web/DevHive.Web.Models/Technology/CreateTechnologyWebModel.cs new file mode 100644 index 0000000..ec9ec15 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Technology/CreateTechnologyWebModel.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + +namespace DevHive.Web.Models.Technology +{ + public class CreateTechnologyWebModel + { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] + public string Name { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Technology/ReadTechnologyWebModel.cs b/src/Web/DevHive.Web.Models/Technology/ReadTechnologyWebModel.cs new file mode 100644 index 0000000..94542d7 --- /dev/null +++ b/src/Web/DevHive.Web.Models/Technology/ReadTechnologyWebModel.cs @@ -0,0 +1,11 @@ +using System; + +namespace DevHive.Web.Models.Technology +{ + public class ReadTechnologyWebModel + { + public Guid Id { get; set; } + + public string Name { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Technology/TechnologyWebModel.cs b/src/Web/DevHive.Web.Models/Technology/TechnologyWebModel.cs new file mode 100644 index 0000000..6e8273b --- /dev/null +++ b/src/Web/DevHive.Web.Models/Technology/TechnologyWebModel.cs @@ -0,0 +1,13 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + +namespace DevHive.Web.Models.Technology +{ + public class TechnologyWebModel + { + [NotNull] + [Required] + public Guid Id { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Models/Technology/UpdateTechnologyWebModel.cs b/src/Web/DevHive.Web.Models/Technology/UpdateTechnologyWebModel.cs new file mode 100644 index 0000000..3e9fe2a --- /dev/null +++ b/src/Web/DevHive.Web.Models/Technology/UpdateTechnologyWebModel.cs @@ -0,0 +1,15 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + +namespace DevHive.Web.Models.Technology +{ + public class UpdateTechnologyWebModel + { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] + public string Name { get; set; } + } +} diff --git a/src/Web/DevHive.Web.Tests/CommentController.Tests.cs b/src/Web/DevHive.Web.Tests/CommentController.Tests.cs new file mode 100644 index 0000000..3a03f1a --- /dev/null +++ b/src/Web/DevHive.Web.Tests/CommentController.Tests.cs @@ -0,0 +1,256 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Comment; +using DevHive.Web.Controllers; +using DevHive.Web.Models.Comment; +using Microsoft.AspNetCore.Mvc; +using Moq; +using NUnit.Framework; + +namespace DevHive.Web.Tests +{ + [TestFixture] + public class CommentControllerTests + { + const string MESSAGE = "Gosho Trapov"; + private Mock CommentServiceMock { get; set; } + private Mock MapperMock { get; set; } + private CommentController CommentController { get; set; } + + #region Setup + [SetUp] + public void SetUp() + { + this.CommentServiceMock = new Mock(); + this.MapperMock = new Mock(); + this.CommentController = new CommentController(this.CommentServiceMock.Object, this.MapperMock.Object); + } + #endregion + + #region Add + [Test] + public void AddComment_ReturnsOkObjectResult_WhenCommentIsSuccessfullyCreated() + { + Guid id = Guid.NewGuid(); + CreateCommentWebModel createCommentWebModel = new CreateCommentWebModel + { + Message = MESSAGE + }; + CreateCommentServiceModel createCommentServiceModel = new CreateCommentServiceModel + { + Message = MESSAGE + }; + + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createCommentServiceModel); + this.CommentServiceMock.Setup(p => p.AddComment(It.IsAny())).Returns(Task.FromResult(id)); + this.CommentServiceMock.Setup(p => p.ValidateJwtForCreating(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + + IActionResult result = this.CommentController.AddComment(Guid.NewGuid(), createCommentWebModel, null).Result; + + Assert.IsInstanceOf(result); + + var splitted = (result as OkObjectResult).Value + .ToString() + .Split('{', '}', '=', ' ') + .Where(x => !string.IsNullOrEmpty(x)) + .ToArray(); + + Guid resultId = Guid.Parse(splitted[1]); + + Assert.AreEqual(id, resultId); + } + + [Test] + public void AddComment_ReturnsBadRequestObjectResult_WhenCommentIsNotCreatedSuccessfully() + { + Guid id = Guid.NewGuid(); + CreateCommentWebModel createCommentWebModel = new CreateCommentWebModel + { + Message = MESSAGE + }; + CreateCommentServiceModel createCommentServiceModel = new CreateCommentServiceModel + { + Message = MESSAGE + }; + string errorMessage = $"Could not create comment!"; + + + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createCommentServiceModel); + this.CommentServiceMock.Setup(p => p.AddComment(It.IsAny())).Returns(Task.FromResult(Guid.Empty)); + this.CommentServiceMock.Setup(p => p.ValidateJwtForCreating(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + + IActionResult result = this.CommentController.AddComment(Guid.NewGuid(), createCommentWebModel, null).Result; + + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequsetObjectResult = result as BadRequestObjectResult; + string resultMessage = badRequsetObjectResult.Value.ToString(); + + Assert.AreEqual(errorMessage, resultMessage); + } + + [Test] + public void AddComment_ReturnsUnauthorizedResult_WhenUserIsNotAuthorized() + { + Guid id = Guid.NewGuid(); + CreateCommentWebModel createCommentWebModel = new CreateCommentWebModel + { + Message = MESSAGE + }; + + this.CommentServiceMock.Setup(p => p.ValidateJwtForCreating(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); + + IActionResult result = this.CommentController.AddComment(Guid.NewGuid(), createCommentWebModel, null).Result; + + Assert.IsInstanceOf(result); + } + #endregion + + #region Read + [Test] + public void GetById_ReturnsTheComment_WhenItExists() + { + Guid id = Guid.NewGuid(); + + ReadCommentServiceModel readCommentServiceModel = new ReadCommentServiceModel + { + Message = MESSAGE + }; + ReadCommentWebModel readCommentWebModel = new ReadCommentWebModel + { + Message = MESSAGE + }; + + this.CommentServiceMock.Setup(p => p.GetCommentById(It.IsAny())).Returns(Task.FromResult(readCommentServiceModel)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readCommentWebModel); + + IActionResult result = this.CommentController.GetCommentById(id).Result; + + Assert.IsInstanceOf(result); + + OkObjectResult okObjectResult = result as OkObjectResult; + ReadCommentWebModel resultModel = okObjectResult.Value as Models.Comment.ReadCommentWebModel; + + Assert.AreEqual(MESSAGE, resultModel.Message); + } + #endregion + + #region Update + [Test] + public void Update_ShouldReturnOkResult_WhenCommentIsUpdatedSuccessfully() + { + Guid id = Guid.NewGuid(); + UpdateCommentWebModel updateCommentWebModel = new UpdateCommentWebModel + { + NewMessage = MESSAGE + }; + UpdateCommentServiceModel updateCommentServiceModel = new UpdateCommentServiceModel + { + NewMessage = MESSAGE + }; + + this.CommentServiceMock.Setup(p => p.UpdateComment(It.IsAny())).Returns(Task.FromResult(id)); + this.CommentServiceMock.Setup(p => p.ValidateJwtForComment(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateCommentServiceModel); + + IActionResult result = this.CommentController.UpdateComment(Guid.Empty, updateCommentWebModel, null).Result; + + Assert.IsInstanceOf(result); + + OkObjectResult okObjectResult = result as OkObjectResult; + object resultModel = okObjectResult.Value; + string[] resultAsString = resultModel.ToString().Split(' ').ToArray(); + + Assert.AreEqual(id.ToString(), resultAsString[3]); + } + + [Test] + public void Update_ShouldReturnBadObjectResult_WhenCommentIsNotUpdatedSuccessfully() + { + string message = "Unable to update comment!"; + UpdateCommentWebModel updateCommentWebModel = new UpdateCommentWebModel + { + NewMessage = MESSAGE + }; + UpdateCommentServiceModel updateCommentServiceModel = new UpdateCommentServiceModel + { + NewMessage = MESSAGE + }; + + this.CommentServiceMock.Setup(p => p.UpdateComment(It.IsAny())).Returns(Task.FromResult(Guid.Empty)); + this.CommentServiceMock.Setup(p => p.ValidateJwtForComment(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateCommentServiceModel); + + IActionResult result = this.CommentController.UpdateComment(Guid.Empty, updateCommentWebModel, null).Result; + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; + string resultModel = badRequestObjectResult.Value.ToString(); + + Assert.AreEqual(message, resultModel); + } + + [Test] + public void Update_ShouldReturnUnauthorizedResult_WhenUserIsNotAuthorized() + { + UpdateCommentWebModel updateCommentWebModel = new UpdateCommentWebModel + { + NewMessage = MESSAGE + }; + + this.CommentServiceMock.Setup(p => p.ValidateJwtForComment(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); + + IActionResult result = this.CommentController.UpdateComment(Guid.Empty, updateCommentWebModel, null).Result; + + Assert.IsInstanceOf(result); + } + #endregion + + #region Delete + [Test] + public void Delete_ReturnsOkResult_WhenCommentIsDeletedSuccessfully() + { + Guid id = Guid.NewGuid(); + + this.CommentServiceMock.Setup(p => p.DeleteComment(It.IsAny())).Returns(Task.FromResult(true)); + this.CommentServiceMock.Setup(p => p.ValidateJwtForComment(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + + IActionResult result = this.CommentController.DeleteComment(id, null).Result; + + Assert.IsInstanceOf(result); + } + + [Test] + public void DeletComment_ReturnsBadRequestObjectResult_WhenCommentIsNotDeletedSuccessfully() + { + string message = "Could not delete Comment"; + Guid id = Guid.NewGuid(); + + this.CommentServiceMock.Setup(p => p.DeleteComment(It.IsAny())).Returns(Task.FromResult(false)); + this.CommentServiceMock.Setup(p => p.ValidateJwtForComment(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + + IActionResult result = this.CommentController.DeleteComment(id, null).Result; + + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; + string resultModel = badRequestObjectResult.Value.ToString(); + + Assert.AreEqual(message, resultModel); + } + + [Test] + public void DeletComment_ReturnsUnauthorizedResult_WhenUserIsNotAuthorized() + { + this.CommentServiceMock.Setup(p => p.ValidateJwtForComment(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); + + IActionResult result = this.CommentController.DeleteComment(Guid.Empty, null).Result; + + Assert.IsInstanceOf(result); + } + #endregion + } +} diff --git a/src/Web/DevHive.Web.Tests/DevHive.Web.Tests.csproj b/src/Web/DevHive.Web.Tests/DevHive.Web.Tests.csproj new file mode 100644 index 0000000..2b30bb8 --- /dev/null +++ b/src/Web/DevHive.Web.Tests/DevHive.Web.Tests.csproj @@ -0,0 +1,27 @@ + + + + net5.0 + + false + + + + + + + + + + + + + + + + + + true + latest + + diff --git a/src/Web/DevHive.Web.Tests/FeedController.Tests.cs b/src/Web/DevHive.Web.Tests/FeedController.Tests.cs new file mode 100644 index 0000000..01f67e5 --- /dev/null +++ b/src/Web/DevHive.Web.Tests/FeedController.Tests.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Services.Interfaces; +using DevHive.Services.Models; +using DevHive.Web.Controllers; +using DevHive.Web.Models.Comment; +using DevHive.Web.Models.Feed; +using DevHive.Web.Models.Post; +using Microsoft.AspNetCore.Mvc; +using Moq; +using NUnit.Framework; + +namespace DevHive.Web.Tests +{ + [TestFixture] + public class FeedControllerTests + { + private Mock FeedServiceMock { get; set; } + private Mock MapperMock { get; set; } + private FeedController FeedController { get; set; } + + #region SetUp + [SetUp] + public void SetUp() + { + this.FeedServiceMock = new Mock(); + this.MapperMock = new Mock(); + this.FeedController = new FeedController(this.FeedServiceMock.Object, this.MapperMock.Object); + } + #endregion + + #region GetPosts + [Test] + public async Task GetPosts_ReturnsOkObjectResultWithCorrectReadPageWebModel_WhenPostsExist() + { + GetPageWebModel getPageWebModel = new GetPageWebModel { }; + GetPageServiceModel getPageServiceModel = new GetPageServiceModel { }; + ReadPageServiceModel readPageServiceModel = new ReadPageServiceModel { }; + ReadPageWebModel readPageWebModel = new ReadPageWebModel + { + Posts = new List + { + new ReadPostWebModel(), + new ReadPostWebModel(), + new ReadPostWebModel() + } + }; + + this.FeedServiceMock.Setup(p => p.GetPage(It.IsAny())).Returns(Task.FromResult(readPageServiceModel)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(getPageServiceModel); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readPageWebModel); + + IActionResult result = await this.FeedController.GetPosts(Guid.Empty, getPageWebModel); + + Assert.IsInstanceOf(result); + + OkObjectResult okObjectResult = result as OkObjectResult; + ReadPageWebModel resultModel = okObjectResult.Value as Models.Comment.ReadPageWebModel; + + Assert.AreEqual(3, resultModel.Posts.Count); + } + #endregion + + #region GetUserPosts + [Test] + public async Task GetUserPosts_GetsPostsOfUser_WhenTheyExist() + { + GetPageWebModel getPageWebModel = new GetPageWebModel { }; + GetPageServiceModel getPageServiceModel = new GetPageServiceModel { }; + ReadPageServiceModel readPageServiceModel = new ReadPageServiceModel { }; + ReadPageWebModel readPageWebModel = new ReadPageWebModel + { + Posts = new List + { + new ReadPostWebModel(), + new ReadPostWebModel(), + new ReadPostWebModel() + } + }; + + this.FeedServiceMock.Setup(p => p.GetUserPage(It.IsAny())).Returns(Task.FromResult(readPageServiceModel)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(getPageServiceModel); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readPageWebModel); + + IActionResult result = await this.FeedController.GetUserPosts(null, getPageWebModel); + + Assert.IsInstanceOf(result); + + OkObjectResult okObjectResult = result as OkObjectResult; + ReadPageWebModel resultModel = okObjectResult.Value as Models.Comment.ReadPageWebModel; + + Assert.AreEqual(3, resultModel.Posts.Count); + } + #endregion + } +} diff --git a/src/Web/DevHive.Web.Tests/LanguageController.Tests.cs b/src/Web/DevHive.Web.Tests/LanguageController.Tests.cs new file mode 100644 index 0000000..7c8d64e --- /dev/null +++ b/src/Web/DevHive.Web.Tests/LanguageController.Tests.cs @@ -0,0 +1,201 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Language; +using DevHive.Web.Controllers; +using DevHive.Web.Models.Language; +using Microsoft.AspNetCore.Mvc; +using Moq; +using NUnit.Framework; + +namespace DevHive.Web.Tests +{ + [TestFixture] + public class LanguageControllerTests + { + const string NAME = "Gosho Trapov"; + private Mock LanguageServiceMock { get; set; } + private Mock MapperMock { get; set; } + private LanguageController LanguageController { get; set; } + + [SetUp] + public void SetUp() + { + this.LanguageServiceMock = new Mock(); + this.MapperMock = new Mock(); + this.LanguageController = new LanguageController(this.LanguageServiceMock.Object, this.MapperMock.Object); + } + + #region Create + [Test] + public void CreateLanguage_ReturnsOkObjectResult_WhenLanguageIsSuccessfullyCreated() + { + CreateLanguageWebModel createLanguageWebModel = new CreateLanguageWebModel + { + Name = NAME + }; + CreateLanguageServiceModel createLanguageServiceModel = new CreateLanguageServiceModel + { + Name = NAME + }; + Guid id = Guid.NewGuid(); + + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createLanguageServiceModel); + this.LanguageServiceMock.Setup(p => p.CreateLanguage(It.IsAny())).Returns(Task.FromResult(id)); + + IActionResult result = this.LanguageController.Create(createLanguageWebModel).Result; + + Assert.IsInstanceOf(result); + + var splitted = (result as OkObjectResult).Value + .ToString() + .Split('{', '}', '=', ' ') + .Where(x => !string.IsNullOrEmpty(x)) + .ToArray(); + + Guid resultId = Guid.Parse(splitted[1]); + + Assert.AreEqual(id, resultId); + } + + [Test] + public void CreateLanguage_ReturnsBadRequestObjectResult_WhenLanguageIsNotCreatedSuccessfully() + { + CreateLanguageWebModel createTechnologyWebModel = new CreateLanguageWebModel + { + Name = NAME + }; + CreateLanguageServiceModel createTechnologyServiceModel = new CreateLanguageServiceModel + { + Name = NAME + }; + Guid id = Guid.Empty; + string errorMessage = $"Could not create language {NAME}"; + + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createTechnologyServiceModel); + this.LanguageServiceMock.Setup(p => p.CreateLanguage(It.IsAny())).Returns(Task.FromResult(id)); + + IActionResult result = this.LanguageController.Create(createTechnologyWebModel).Result; + + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequsetObjectResult = result as BadRequestObjectResult; + string resultMessage = badRequsetObjectResult.Value.ToString(); + + Assert.AreEqual(errorMessage, resultMessage); + } + #endregion + + #region Read + [Test] + public void GetById_ReturnsTheLanguage_WhenItExists() + { + Guid id = Guid.NewGuid(); + + ReadLanguageServiceModel readLanguageServiceModel = new ReadLanguageServiceModel + { + Name = NAME + }; + ReadLanguageWebModel readLanguageWebModel = new ReadLanguageWebModel + { + Name = NAME + }; + + this.LanguageServiceMock.Setup(p => p.GetLanguageById(It.IsAny())).Returns(Task.FromResult(readLanguageServiceModel)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readLanguageWebModel); + + IActionResult result = this.LanguageController.GetById(id).Result; + + Assert.IsInstanceOf(result); + + OkObjectResult okObjectResult = result as OkObjectResult; + ReadLanguageWebModel resultModel = okObjectResult.Value as Models.Language.ReadLanguageWebModel; + + Assert.AreEqual(NAME, resultModel.Name); + } + #endregion + + #region Update + [Test] + public void Update_ShouldReturnOkResult_WhenLanguageIsUpdatedSuccessfully() + { + Guid id = Guid.NewGuid(); + UpdateLanguageWebModel updateLanguageWebModel = new UpdateLanguageWebModel + { + Name = NAME + }; + UpdateLanguageServiceModel updateLanguageServiceModel = new UpdateLanguageServiceModel + { + Name = NAME + }; + + this.LanguageServiceMock.Setup(p => p.UpdateLanguage(It.IsAny())).Returns(Task.FromResult(true)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateLanguageServiceModel); + + IActionResult result = this.LanguageController.Update(id, updateLanguageWebModel).Result; + + Assert.IsInstanceOf(result); + } + + [Test] + public void Update_ShouldReturnBadObjectResult_WhenLanguageIsNotUpdatedSuccessfully() + { + Guid id = Guid.NewGuid(); + string message = "Could not update Language"; + UpdateLanguageWebModel updateLanguageWebModel = new UpdateLanguageWebModel + { + Name = NAME + }; + UpdateLanguageServiceModel updateLanguageServiceModel = new UpdateLanguageServiceModel + { + Name = NAME + }; + + this.LanguageServiceMock.Setup(p => p.UpdateLanguage(It.IsAny())).Returns(Task.FromResult(false)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateLanguageServiceModel); + + IActionResult result = this.LanguageController.Update(id, updateLanguageWebModel).Result; + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; + string resultModel = badRequestObjectResult.Value.ToString(); + + Assert.AreEqual(message, resultModel); + } + #endregion + + #region Delete + [Test] + public void Delete_ReturnsOkResult_WhenLanguageIsDeletedSuccessfully() + { + Guid id = Guid.NewGuid(); + + this.LanguageServiceMock.Setup(p => p.DeleteLanguage(It.IsAny())).Returns(Task.FromResult(true)); + + IActionResult result = this.LanguageController.Delete(id).Result; + + Assert.IsInstanceOf(result); + } + + [Test] + public void Delet_ReturnsBadRequestObjectResult_WhenLanguageIsNotDeletedSuccessfully() + { + string message = "Could not delete Language"; + Guid id = Guid.NewGuid(); + + this.LanguageServiceMock.Setup(p => p.DeleteLanguage(It.IsAny())).Returns(Task.FromResult(false)); + + IActionResult result = this.LanguageController.Delete(id).Result; + + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; + string resultModel = badRequestObjectResult.Value.ToString(); + + Assert.AreEqual(message, resultModel); + } + #endregion + } +} diff --git a/src/Web/DevHive.Web.Tests/PostController.Tests.cs b/src/Web/DevHive.Web.Tests/PostController.Tests.cs new file mode 100644 index 0000000..3a4e45e --- /dev/null +++ b/src/Web/DevHive.Web.Tests/PostController.Tests.cs @@ -0,0 +1,248 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Post; +using DevHive.Web.Controllers; +using DevHive.Web.Models.Post; +using Microsoft.AspNetCore.Mvc; +using Moq; +using NUnit.Framework; + +namespace DevHive.Web.Tests +{ + [TestFixture] + public class PostControllerTests + { + const string MESSAGE = "Gosho Trapov"; + private Mock PostServiceMock { get; set; } + private Mock MapperMock { get; set; } + private PostController PostController { get; set; } + + [SetUp] + public void SetUp() + { + this.PostServiceMock = new Mock(); + this.MapperMock = new Mock(); + this.PostController = new PostController(this.PostServiceMock.Object, this.MapperMock.Object); + } + + #region Create + [Test] + public void CreatePost_ReturnsOkObjectResult_WhenPostIsSuccessfullyCreated() + { + CreatePostWebModel createPostWebModel = new CreatePostWebModel + { + Message = MESSAGE + }; + CreatePostServiceModel createPostServiceModel = new CreatePostServiceModel + { + Message = MESSAGE + }; + Guid id = Guid.NewGuid(); + + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createPostServiceModel); + this.PostServiceMock.Setup(p => p.CreatePost(It.IsAny())).Returns(Task.FromResult(id)); + this.PostServiceMock.Setup(p => p.ValidateJwtForCreating(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + + IActionResult result = this.PostController.Create(Guid.Empty, createPostWebModel, null).Result; + + Assert.IsInstanceOf(result); + + var splitted = (result as OkObjectResult).Value + .ToString() + .Split('{', '}', '=', ' ') + .Where(x => !string.IsNullOrEmpty(x)) + .ToArray(); + + Guid resultId = Guid.Parse(splitted[1]); + + Assert.AreEqual(id, resultId); + } + + [Test] + public void CreatePost_ReturnsBadRequestObjectResult_WhenPostIsNotCreatedSuccessfully() + { + CreatePostWebModel createTechnologyWebModel = new CreatePostWebModel + { + Message = MESSAGE + }; + CreatePostServiceModel createTechnologyServiceModel = new CreatePostServiceModel + { + Message = MESSAGE + }; + Guid id = Guid.Empty; + string errorMessage = $"Could not create post!"; + + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createTechnologyServiceModel); + this.PostServiceMock.Setup(p => p.CreatePost(It.IsAny())).Returns(Task.FromResult(id)); + this.PostServiceMock.Setup(p => p.ValidateJwtForCreating(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + + IActionResult result = this.PostController.Create(Guid.Empty, createTechnologyWebModel, null).Result; + + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequsetObjectResult = result as BadRequestObjectResult; + string resultMessage = badRequsetObjectResult.Value.ToString(); + + Assert.AreEqual(errorMessage, resultMessage); + } + + [Test] + public void CreatePost_ReturnsUnauthorizedResult_WhenUserIsNotAuthorized() + { + Guid id = Guid.NewGuid(); + CreatePostWebModel createPostWebModel = new CreatePostWebModel + { + Message = MESSAGE + }; + + this.PostServiceMock.Setup(p => p.ValidateJwtForCreating(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); + + IActionResult result = this.PostController.Create(Guid.NewGuid(), createPostWebModel, null).Result; + + Assert.IsInstanceOf(result); + } + #endregion + + #region Read + [Test] + public void GetById_ReturnsThePost_WhenItExists() + { + Guid id = Guid.NewGuid(); + + ReadPostServiceModel readPostServiceModel = new ReadPostServiceModel + { + Message = MESSAGE + }; + ReadPostWebModel readPostWebModel = new ReadPostWebModel + { + Message = MESSAGE + }; + + this.PostServiceMock.Setup(p => p.GetPostById(It.IsAny())).Returns(Task.FromResult(readPostServiceModel)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readPostWebModel); + + IActionResult result = this.PostController.GetById(id).Result; + + Assert.IsInstanceOf(result); + + OkObjectResult okObjectResult = result as OkObjectResult; + ReadPostWebModel resultModel = okObjectResult.Value as Models.Post.ReadPostWebModel; + + Assert.AreEqual(MESSAGE, resultModel.Message); + } + #endregion + + #region Update + [Test] + public void Update_ShouldReturnOkResult_WhenPostIsUpdatedSuccessfully() + { + Guid id = Guid.NewGuid(); + UpdatePostWebModel updatePostWebModel = new UpdatePostWebModel + { + NewMessage = MESSAGE + }; + UpdatePostServiceModel updatePostServiceModel = new UpdatePostServiceModel + { + NewMessage = MESSAGE + }; + + this.PostServiceMock.Setup(p => p.UpdatePost(It.IsAny())).Returns(Task.FromResult(id)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updatePostServiceModel); + this.PostServiceMock.Setup(p => p.ValidateJwtForPost(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + + IActionResult result = this.PostController.Update(id, updatePostWebModel, null).Result; + + Assert.IsInstanceOf(result); + } + + [Test] + public void Update_ShouldReturnBadObjectResult_WhenPostIsNotUpdatedSuccessfully() + { + Guid id = Guid.NewGuid(); + string message = "Could not update post!"; + UpdatePostWebModel updatePostWebModel = new UpdatePostWebModel + { + NewMessage = MESSAGE + }; + UpdatePostServiceModel updatePostServiceModel = new UpdatePostServiceModel + { + NewMessage = MESSAGE + }; + + this.PostServiceMock.Setup(p => p.UpdatePost(It.IsAny())).Returns(Task.FromResult(Guid.Empty)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updatePostServiceModel); + this.PostServiceMock.Setup(p => p.ValidateJwtForPost(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + + IActionResult result = this.PostController.Update(id, updatePostWebModel, null).Result; + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; + string resultModel = badRequestObjectResult.Value.ToString(); + + Assert.AreEqual(message, resultModel); + } + + [Test] + public void Update_ShouldReturnUnauthorizedResult_WhenUserIsNotAuthorized() + { + UpdatePostWebModel updatePostWebModel = new UpdatePostWebModel + { + NewMessage = MESSAGE + }; + + this.PostServiceMock.Setup(p => p.ValidateJwtForPost(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); + + IActionResult result = this.PostController.Update(Guid.Empty, updatePostWebModel, null).Result; + + Assert.IsInstanceOf(result); + } + #endregion + + #region Delete + [Test] + public void Delete_ReturnsOkResult_WhenPostIsDeletedSuccessfully() + { + Guid id = Guid.NewGuid(); + + this.PostServiceMock.Setup(p => p.DeletePost(It.IsAny())).Returns(Task.FromResult(true)); + this.PostServiceMock.Setup(p => p.ValidateJwtForPost(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + + IActionResult result = this.PostController.Delete(id, null).Result; + + Assert.IsInstanceOf(result); + } + + [Test] + public void Delete_ReturnsBadRequestObjectResult_WhenPostIsNotDeletedSuccessfully() + { + string message = "Could not delete Post"; + Guid id = Guid.NewGuid(); + + this.PostServiceMock.Setup(p => p.DeletePost(It.IsAny())).Returns(Task.FromResult(false)); + this.PostServiceMock.Setup(p => p.ValidateJwtForPost(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + + IActionResult result = this.PostController.Delete(id, null).Result; + + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; + string resultModel = badRequestObjectResult.Value.ToString(); + + Assert.AreEqual(message, resultModel); + } + + [Test] + public void DeletePost_ReturnsUnauthorizedResult_WhenUserIsNotAuthorized() + { + this.PostServiceMock.Setup(p => p.ValidateJwtForPost(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); + + IActionResult result = this.PostController.Delete(Guid.Empty, null).Result; + + Assert.IsInstanceOf(result); + } + #endregion + } +} diff --git a/src/Web/DevHive.Web.Tests/RoleController.Tests.cs b/src/Web/DevHive.Web.Tests/RoleController.Tests.cs new file mode 100644 index 0000000..067b4e4 --- /dev/null +++ b/src/Web/DevHive.Web.Tests/RoleController.Tests.cs @@ -0,0 +1,201 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Identity.Role; +using DevHive.Web.Controllers; +using DevHive.Web.Models.Identity.Role; +using Microsoft.AspNetCore.Mvc; +using Moq; +using NUnit.Framework; + +namespace DevHive.Web.Tests +{ + [TestFixture] + public class RoleControllerTests + { + const string NAME = "Gosho Trapov"; + private Mock RoleServiceMock { get; set; } + private Mock MapperMock { get; set; } + private RoleController RoleController { get; set; } + + [SetUp] + public void SetUp() + { + this.RoleServiceMock = new Mock(); + this.MapperMock = new Mock(); + this.RoleController = new RoleController(this.RoleServiceMock.Object, this.MapperMock.Object); + } + + #region Create + [Test] + public void CreateRole_ReturnsOkObjectResult_WhenRoleIsSuccessfullyCreated() + { + CreateRoleWebModel createRoleWebModel = new CreateRoleWebModel + { + Name = NAME + }; + CreateRoleServiceModel createRoleServiceModel = new CreateRoleServiceModel + { + Name = NAME + }; + Guid id = Guid.NewGuid(); + + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createRoleServiceModel); + this.RoleServiceMock.Setup(p => p.CreateRole(It.IsAny())).Returns(Task.FromResult(id)); + + IActionResult result = this.RoleController.Create(createRoleWebModel).Result; + + Assert.IsInstanceOf(result); + + var splitted = (result as OkObjectResult).Value + .ToString() + .Split('{', '}', '=', ' ') + .Where(x => !string.IsNullOrEmpty(x)) + .ToArray(); + + Guid resultId = Guid.Parse(splitted[1]); + + Assert.AreEqual(id, resultId); + } + + [Test] + public void CreateRole_ReturnsBadRequestObjectResult_WhenRoleIsNotCreatedSuccessfully() + { + CreateRoleWebModel createTechnologyWebModel = new CreateRoleWebModel + { + Name = NAME + }; + CreateRoleServiceModel createTechnologyServiceModel = new CreateRoleServiceModel + { + Name = NAME + }; + Guid id = Guid.Empty; + string errorMessage = $"Could not create role {NAME}"; + + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createTechnologyServiceModel); + this.RoleServiceMock.Setup(p => p.CreateRole(It.IsAny())).Returns(Task.FromResult(id)); + + IActionResult result = this.RoleController.Create(createTechnologyWebModel).Result; + + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequsetObjectResult = result as BadRequestObjectResult; + string resultMessage = badRequsetObjectResult.Value.ToString(); + + Assert.AreEqual(errorMessage, resultMessage); + } + #endregion + + #region Read + [Test] + public void GetById_ReturnsTheRole_WhenItExists() + { + Guid id = Guid.NewGuid(); + + RoleServiceModel roleServiceModel = new RoleServiceModel + { + Name = NAME + }; + RoleWebModel roleWebModel = new RoleWebModel + { + Name = NAME + }; + + this.RoleServiceMock.Setup(p => p.GetRoleById(It.IsAny())).Returns(Task.FromResult(roleServiceModel)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(roleWebModel); + + IActionResult result = this.RoleController.GetById(id).Result; + + Assert.IsInstanceOf(result); + + OkObjectResult okObjectResult = result as OkObjectResult; + RoleWebModel resultModel = okObjectResult.Value as Models.Identity.Role.RoleWebModel; + + Assert.AreEqual(NAME, resultModel.Name); + } + #endregion + + #region Update + [Test] + public void Update_ShouldReturnOkResult_WhenRoleIsUpdatedSuccessfully() + { + Guid id = Guid.NewGuid(); + UpdateRoleWebModel updateRoleWebModel = new UpdateRoleWebModel + { + Name = NAME + }; + UpdateRoleServiceModel updateRoleServiceModel = new UpdateRoleServiceModel + { + Name = NAME + }; + + this.RoleServiceMock.Setup(p => p.UpdateRole(It.IsAny())).Returns(Task.FromResult(true)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateRoleServiceModel); + + IActionResult result = this.RoleController.Update(id, updateRoleWebModel).Result; + + Assert.IsInstanceOf(result); + } + + [Test] + public void Update_ShouldReturnBadObjectResult_WhenRoleIsNotUpdatedSuccessfully() + { + Guid id = Guid.NewGuid(); + string message = "Could not update role!"; + UpdateRoleWebModel updateRoleWebModel = new UpdateRoleWebModel + { + Name = NAME + }; + UpdateRoleServiceModel updateRoleServiceModel = new UpdateRoleServiceModel + { + Name = NAME + }; + + this.RoleServiceMock.Setup(p => p.UpdateRole(It.IsAny())).Returns(Task.FromResult(false)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateRoleServiceModel); + + IActionResult result = this.RoleController.Update(id, updateRoleWebModel).Result; + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; + string resultModel = badRequestObjectResult.Value.ToString(); + + Assert.AreEqual(message, resultModel); + } + #endregion + + #region Delete + [Test] + public void Delete_ReturnsOkResult_WhenRoleIsDeletedSuccessfully() + { + Guid id = Guid.NewGuid(); + + this.RoleServiceMock.Setup(p => p.DeleteRole(It.IsAny())).Returns(Task.FromResult(true)); + + IActionResult result = this.RoleController.Delete(id).Result; + + Assert.IsInstanceOf(result); + } + + [Test] + public void Delet_ReturnsBadRequestObjectResult_WhenRoleIsNotDeletedSuccessfully() + { + string message = "Could not delete role!"; + Guid id = Guid.NewGuid(); + + this.RoleServiceMock.Setup(p => p.DeleteRole(It.IsAny())).Returns(Task.FromResult(false)); + + IActionResult result = this.RoleController.Delete(id).Result; + + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; + string resultModel = badRequestObjectResult.Value.ToString(); + + Assert.AreEqual(message, resultModel); + } + #endregion + } +} diff --git a/src/Web/DevHive.Web.Tests/TechnologyController.Tests.cs b/src/Web/DevHive.Web.Tests/TechnologyController.Tests.cs new file mode 100644 index 0000000..164bcbf --- /dev/null +++ b/src/Web/DevHive.Web.Tests/TechnologyController.Tests.cs @@ -0,0 +1,204 @@ +using AutoMapper; +using DevHive.Common.Models.Misc; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Technology; +using DevHive.Web.Controllers; +using DevHive.Web.Models.Technology; +using Microsoft.AspNetCore.Mvc; +using Moq; +using NUnit.Framework; +using System; +using System.Linq; +using System.Threading.Tasks; + +namespace DevHive.Web.Tests +{ + [TestFixture] + public class TechnologyControllerTests + { + const string NAME = "Gosho Trapov"; + private Mock TechnologyServiceMock { get; set; } + private Mock MapperMock { get; set; } + private TechnologyController TechnologyController { get; set; } + + #region SetUp + [SetUp] + public void SetUp() + { + this.TechnologyServiceMock = new Mock(); + this.MapperMock = new Mock(); + this.TechnologyController = new TechnologyController(this.TechnologyServiceMock.Object, this.MapperMock.Object); + } + #endregion + + #region Create + [Test] + public void Create_ReturnsOkObjectResult_WhenTechnologyIsSuccessfullyCreated() + { + CreateTechnologyWebModel createTechnologyWebModel = new CreateTechnologyWebModel + { + Name = NAME + }; + CreateTechnologyServiceModel createTechnologyServiceModel = new CreateTechnologyServiceModel + { + Name = NAME + }; + Guid id = Guid.NewGuid(); + + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createTechnologyServiceModel); + this.TechnologyServiceMock.Setup(p => p.CreateTechnology(It.IsAny())).Returns(Task.FromResult(id)); + + IActionResult result = this.TechnologyController.Create(createTechnologyWebModel).Result; + + Assert.IsInstanceOf(result); + + var splitted = (result as OkObjectResult).Value + .ToString() + .Split('{', '}', '=', ' ') + .Where(x => !string.IsNullOrEmpty(x)) + .ToArray(); + + Guid resultId = Guid.Parse(splitted[1]); + + Assert.AreEqual(id, resultId); + } + + [Test] + public void Create_ReturnsBadRequestObjectResult_WhenTechnologyIsNotCreatedSuccessfully() + { + CreateTechnologyWebModel createTechnologyWebModel = new CreateTechnologyWebModel + { + Name = NAME + }; + CreateTechnologyServiceModel createTechnologyServiceModel = new CreateTechnologyServiceModel + { + Name = NAME + }; + Guid id = Guid.Empty; + string errorMessage = $"Could not create technology {NAME}"; + + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(createTechnologyServiceModel); + this.TechnologyServiceMock.Setup(p => p.CreateTechnology(It.IsAny())).Returns(Task.FromResult(id)); + + IActionResult result = this.TechnologyController.Create(createTechnologyWebModel).Result; + + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequsetObjectResult = result as BadRequestObjectResult; + string resultMessage = badRequsetObjectResult.Value.ToString(); + + Assert.AreEqual(errorMessage, resultMessage); + } + #endregion + + #region Read + [Test] + public void GetById_ReturnsTheThecnology_WhenItExists() + { + Guid id = Guid.NewGuid(); + + ReadTechnologyWebModel readTechnologyWebModel = new ReadTechnologyWebModel + { + Name = NAME + }; + ReadTechnologyServiceModel readTechnologyServiceModel = new ReadTechnologyServiceModel + { + Name = NAME + }; + + this.TechnologyServiceMock.Setup(p => p.GetTechnologyById(It.IsAny())).Returns(Task.FromResult(readTechnologyServiceModel)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readTechnologyWebModel); + + IActionResult result = this.TechnologyController.GetById(id).Result; + + Assert.IsInstanceOf(result); + + OkObjectResult okObjectResult = result as OkObjectResult; + ReadTechnologyWebModel resultModel = okObjectResult.Value as Models.Technology.ReadTechnologyWebModel; + + Assert.AreEqual(NAME, resultModel.Name); + } + #endregion + + #region Update + [Test] + public void Update_ShouldReturnOkResult_WhenTechnologyIsUpdatedSuccessfully() + { + Guid id = Guid.NewGuid(); + UpdateTechnologyWebModel updateTechnologyWebModel = new UpdateTechnologyWebModel + { + Name = NAME + }; + UpdateTechnologyServiceModel updateTechnologyServiceModel = new UpdateTechnologyServiceModel + { + Name = NAME + }; + + this.TechnologyServiceMock.Setup(p => p.UpdateTechnology(It.IsAny())).Returns(Task.FromResult(true)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateTechnologyServiceModel); + + IActionResult result = this.TechnologyController.Update(id, updateTechnologyWebModel).Result; + + Assert.IsInstanceOf(result); + } + + [Test] + public void Update_ShouldReturnBadObjectResult_WhenTechnologyIsNotUpdatedSuccessfully() + { + Guid id = Guid.NewGuid(); + string message = "Could not update Technology"; + UpdateTechnologyWebModel updateTechnologyWebModel = new UpdateTechnologyWebModel + { + Name = NAME + }; + UpdateTechnologyServiceModel updateTechnologyServiceModel = new UpdateTechnologyServiceModel + { + Name = NAME + }; + + this.TechnologyServiceMock.Setup(p => p.UpdateTechnology(It.IsAny())).Returns(Task.FromResult(false)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateTechnologyServiceModel); + + IActionResult result = this.TechnologyController.Update(id, updateTechnologyWebModel).Result; + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; + string resultModel = badRequestObjectResult.Value.ToString(); + + Assert.AreEqual(message, resultModel); + } + #endregion + + #region Delete + [Test] + public void Delete_ReturnsOkResult_WhenTechnologyIsDeletedSuccessfully() + { + Guid id = Guid.NewGuid(); + + this.TechnologyServiceMock.Setup(p => p.DeleteTechnology(It.IsAny())).Returns(Task.FromResult(true)); + + IActionResult result = this.TechnologyController.Delete(id).Result; + + Assert.IsInstanceOf(result); + } + + [Test] + public void Delet_ReturnsBadRequestObjectResult_WhenTechnologyIsNotDeletedSuccessfully() + { + string message = "Could not delete Technology"; + Guid id = Guid.NewGuid(); + + this.TechnologyServiceMock.Setup(p => p.DeleteTechnology(It.IsAny())).Returns(Task.FromResult(false)); + + IActionResult result = this.TechnologyController.Delete(id).Result; + + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; + string resultModel = badRequestObjectResult.Value.ToString(); + + Assert.AreEqual(message, resultModel); + } + #endregion + } +} diff --git a/src/Web/DevHive.Web.Tests/UserController.Tests.cs b/src/Web/DevHive.Web.Tests/UserController.Tests.cs new file mode 100644 index 0000000..c1431c8 --- /dev/null +++ b/src/Web/DevHive.Web.Tests/UserController.Tests.cs @@ -0,0 +1,257 @@ +using System; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Common.Models.Identity; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Identity.User; +using DevHive.Web.Controllers; +using DevHive.Web.Models.Identity.User; +using Microsoft.AspNetCore.Mvc; +using Moq; +using NUnit.Framework; + +namespace DevHive.Web.Tests +{ + [TestFixture] + public class UserControllerTests + { + const string USERNAME = "Gosho Trapov"; + private Mock UserServiceMock { get; set; } + private Mock MapperMock { get; set; } + private UserController UserController { get; set; } + + [SetUp] + public void SetUp() + { + this.UserServiceMock = new Mock(); + this.MapperMock = new Mock(); + this.UserController = new UserController(this.UserServiceMock.Object, this.MapperMock.Object); + } + + #region Create + [Test] + public void LoginUser_ReturnsOkObjectResult_WhenUserIsSuccessfullyLoggedIn() + { + Guid id = Guid.NewGuid(); + LoginWebModel loginWebModel = new LoginWebModel + { + UserName = USERNAME + }; + LoginServiceModel loginServiceModel = new LoginServiceModel + { + UserName = USERNAME + }; + string token = "goshotrapov"; + TokenModel tokenModel = new TokenModel(token); + TokenWebModel tokenWebModel = new TokenWebModel(token); + + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(loginServiceModel); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(tokenWebModel); + this.UserServiceMock.Setup(p => p.LoginUser(It.IsAny())).Returns(Task.FromResult(tokenModel)); + + IActionResult result = this.UserController.Login(loginWebModel).Result; + + Assert.IsInstanceOf(result); + + var resultToken = ((result as OkObjectResult).Value as TokenWebModel).Token; + + Assert.AreEqual(token, resultToken); + } + + [Test] + public void RegisterUser_ReturnsOkObjectResult_WhenUserIsSuccessfullyRegistered() + { + Guid id = Guid.NewGuid(); + RegisterWebModel registerWebModel = new RegisterWebModel + { + UserName = USERNAME + }; + RegisterServiceModel registerServiceModel = new RegisterServiceModel + { + UserName = USERNAME + }; + string token = "goshotrapov"; + TokenModel tokenModel = new TokenModel(token); + TokenWebModel tokenWebModel = new TokenWebModel(token); + + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(registerServiceModel); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(tokenWebModel); + this.UserServiceMock.Setup(p => p.RegisterUser(It.IsAny())).Returns(Task.FromResult(tokenModel)); + + IActionResult result = this.UserController.Register(registerWebModel).Result; + + Assert.IsInstanceOf(result); + + CreatedResult createdResult = result as CreatedResult; + TokenWebModel resultModel = (createdResult.Value as TokenWebModel); + + Assert.AreEqual(token, resultModel.Token); + } + #endregion + + #region Read + [Test] + public void GetById_ReturnsTheUser_WhenItExists() + { + Guid id = Guid.NewGuid(); + + UserServiceModel userServiceModel = new UserServiceModel + { + UserName = USERNAME + }; + UserWebModel userWebModel = new UserWebModel + { + UserName = USERNAME + }; + + this.UserServiceMock.Setup(p => p.GetUserById(It.IsAny())).Returns(Task.FromResult(userServiceModel)); + this.UserServiceMock.Setup(p => p.ValidJWT(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(userWebModel); + + IActionResult result = this.UserController.GetById(id, null).Result; + + Assert.IsInstanceOf(result); + + OkObjectResult okObjectResult = result as OkObjectResult; + UserWebModel resultModel = okObjectResult.Value as Models.Identity.User.UserWebModel; + + Assert.AreEqual(USERNAME, resultModel.UserName); + } + + [Test] + public void GetById_ReturnsUnauthorizedResult_WhenUserIsNotAuthorized() + { + Guid id = Guid.NewGuid(); + UserWebModel userWebModel = new UserWebModel + { + UserName = USERNAME + }; + + this.UserServiceMock.Setup(p => p.ValidJWT(It.IsAny(), It.IsAny())).Returns(Task.FromResult(false)); + + IActionResult result = this.UserController.GetById(Guid.NewGuid(), null).Result; + + Assert.IsInstanceOf(result); + } + + [Test] + public void GetUser_ReturnsTheUser_WhenItExists() + { + Guid id = Guid.NewGuid(); + UserWebModel userWebModel = new UserWebModel + { + UserName = USERNAME + }; + UserServiceModel userServiceModel = new UserServiceModel + { + UserName = USERNAME + }; + + this.UserServiceMock.Setup(p => p.GetUserByUsername(It.IsAny())).Returns(Task.FromResult(userServiceModel)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(userWebModel); + + IActionResult result = this.UserController.GetUser(null).Result; + + Assert.IsInstanceOf(result); + + OkObjectResult okObjectResult = result as OkObjectResult; + UserWebModel resultModel = okObjectResult.Value as Models.Identity.User.UserWebModel; + + Assert.AreEqual(USERNAME, resultModel.UserName); + } + #endregion + + #region Update + [Test] + public void Update_ShouldReturnOkResult_WhenUserIsUpdatedSuccessfully() + { + Guid id = Guid.NewGuid(); + UpdateUserWebModel updateUserWebModel = new UpdateUserWebModel + { + UserName = USERNAME + }; + UpdateUserServiceModel updateUserServiceModel = new UpdateUserServiceModel + { + UserName = USERNAME + }; + UserServiceModel userServiceModel = new UserServiceModel + { + UserName = USERNAME + }; + + this.UserServiceMock.Setup(p => p.UpdateUser(It.IsAny())).Returns(Task.FromResult(userServiceModel)); + this.UserServiceMock.Setup(p => p.ValidJWT(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateUserServiceModel); + + IActionResult result = this.UserController.Update(id, updateUserWebModel, null).Result; + + Assert.IsInstanceOf(result); + } + + [Test] + public void UpdateProfilePicture_ShouldReturnOkObjectResult_WhenProfilePictureIsUpdatedSuccessfully() + { + string profilePictureURL = "goshotrapov"; + UpdateProfilePictureWebModel updateProfilePictureWebModel = new UpdateProfilePictureWebModel(); + UpdateProfilePictureServiceModel updateProfilePictureServiceModel = new UpdateProfilePictureServiceModel(); + ProfilePictureServiceModel profilePictureServiceModel = new ProfilePictureServiceModel + { + ProfilePictureURL = profilePictureURL + }; + ProfilePictureWebModel profilePictureWebModel = new ProfilePictureWebModel + { + ProfilePictureURL = profilePictureURL + }; + + this.UserServiceMock.Setup(p => p.ValidJWT(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(updateProfilePictureServiceModel); + this.UserServiceMock.Setup(p => p.UpdateProfilePicture(It.IsAny())).Returns(Task.FromResult(profilePictureServiceModel)); + this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(profilePictureWebModel); + + + IActionResult result = this.UserController.UpdateProfilePicture(Guid.Empty, updateProfilePictureWebModel, null).Result; + + Assert.IsInstanceOf(result); + + AcceptedResult acceptedResult = result as AcceptedResult; + ProfilePictureWebModel resultModel = acceptedResult.Value as Models.Identity.User.ProfilePictureWebModel; + + Assert.AreEqual(profilePictureURL, resultModel.ProfilePictureURL); + } + #endregion + + #region Delete + [Test] + public void Delete_ReturnsOkResult_WhenUserIsDeletedSuccessfully() + { + Guid id = Guid.NewGuid(); + + this.UserServiceMock.Setup(p => p.ValidJWT(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + this.UserServiceMock.Setup(p => p.DeleteUser(It.IsAny())).Returns(Task.FromResult(true)); + + IActionResult result = this.UserController.Delete(id, null).Result; + + Assert.IsInstanceOf(result); + } + + [Test] + public void Delete_ReturnsBadRequestObjectResult_WhenUserIsNotDeletedSuccessfully() + { + string message = "Could not delete User"; + Guid id = Guid.NewGuid(); + + this.UserServiceMock.Setup(p => p.ValidJWT(It.IsAny(), It.IsAny())).Returns(Task.FromResult(true)); + this.UserServiceMock.Setup(p => p.DeleteUser(It.IsAny())).Returns(Task.FromResult(false)); + + IActionResult result = this.UserController.Delete(id, null).Result; + + Assert.IsInstanceOf(result); + + BadRequestObjectResult badRequestObjectResult = result as BadRequestObjectResult; + string resultModel = badRequestObjectResult.Value.ToString(); + + Assert.AreEqual(message, resultModel); + } + #endregion + } +} diff --git a/src/Web/DevHive.Web/Attributes/GoodPasswordModelValidation.cs b/src/Web/DevHive.Web/Attributes/GoodPasswordModelValidation.cs new file mode 100644 index 0000000..7d6a1ea --- /dev/null +++ b/src/Web/DevHive.Web/Attributes/GoodPasswordModelValidation.cs @@ -0,0 +1,24 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace DevHive.Web.Attributes +{ + public class GoodPassword : ValidationAttribute + { + public override bool IsValid(object value) + { + var stringValue = (string)value; + + for (int i = 0; i < stringValue.Length; i++) + { + if (Char.IsDigit(stringValue[i])) + { + base.ErrorMessage = "Password must be atleast 5 characters long!"; + return stringValue.Length >= 5; + } + } + base.ErrorMessage = "Password must contain atleast 1 digit!"; + return false; + } + } +} diff --git a/src/Web/DevHive.Web/Attributes/OnlyLettersModelValidation.cs b/src/Web/DevHive.Web/Attributes/OnlyLettersModelValidation.cs new file mode 100644 index 0000000..07afee9 --- /dev/null +++ b/src/Web/DevHive.Web/Attributes/OnlyLettersModelValidation.cs @@ -0,0 +1,20 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace DevHive.Web.Attributes +{ + public class OnlyLetters : ValidationAttribute + { + public override bool IsValid(object value) + { + var stringValue = (string)value; + + foreach (char ch in stringValue) + { + if (!Char.IsLetter(ch)) + return false; + } + return true; + } + } +} diff --git a/src/Web/DevHive.Web/Configurations/Extensions/ConfigureAutoMapper.cs b/src/Web/DevHive.Web/Configurations/Extensions/ConfigureAutoMapper.cs new file mode 100644 index 0000000..8b7d657 --- /dev/null +++ b/src/Web/DevHive.Web/Configurations/Extensions/ConfigureAutoMapper.cs @@ -0,0 +1,24 @@ +using System; +using AutoMapper; +//using AutoMapper.Configuration; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; + +namespace DevHive.Web.Configurations.Extensions +{ + public static class ConfigureAutoMapper + { + public static void AutoMapperConfiguration(this IServiceCollection services) + { + services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); + } + + public static void UseAutoMapperConfiguration(this IApplicationBuilder app) + { + var config = new MapperConfiguration(cfg => + { + cfg.AllowNullCollections = true; + }); + } + } +} \ No newline at end of file diff --git a/src/Web/DevHive.Web/Configurations/Extensions/ConfigureDatabase.cs b/src/Web/DevHive.Web/Configurations/Extensions/ConfigureDatabase.cs new file mode 100644 index 0000000..9f02dd7 --- /dev/null +++ b/src/Web/DevHive.Web/Configurations/Extensions/ConfigureDatabase.cs @@ -0,0 +1,70 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using DevHive.Data.Models; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Builder; +using System; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using DevHive.Data; + +namespace DevHive.Web.Configurations.Extensions +{ + public static class DatabaseExtensions + { + public static void DatabaseConfiguration(this IServiceCollection services, IConfiguration configuration) + { + services.AddDbContext(options => + { + options.EnableSensitiveDataLogging(true); + options.UseNpgsql(configuration.GetConnectionString("DEV")); + }); + + services.AddIdentity() + .AddRoles() + .AddEntityFrameworkStores(); + + services.Configure(options => + { + options.User.RequireUniqueEmail = true; + + options.Password.RequireDigit = true; + options.Password.RequiredLength = 5; + options.Password.RequiredUniqueChars = 0; + options.Password.RequireLowercase = false; + options.Password.RequireNonAlphanumeric = false; + options.Password.RequireUppercase = false; + + options.Lockout.AllowedForNewUsers = true; + options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5); + options.Lockout.MaxFailedAccessAttempts = 5; + }); + + services.AddAuthorization(options => + { + options.AddPolicy("User", options => + { + options.RequireAuthenticatedUser(); + options.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme); + options.RequireRole("User"); + }); + + options.AddPolicy("Administrator", options => + { + options.RequireAuthenticatedUser(); + options.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme); + options.RequireRole("Admin"); + }); + }); + } + + public static void UseDatabaseConfiguration(this IApplicationBuilder app) + { + app.UseHttpsRedirection(); + app.UseRouting(); + + app.UseAuthentication(); + app.UseAuthorization(); + } + } +} diff --git a/src/Web/DevHive.Web/Configurations/Extensions/ConfigureDependencyInjection.cs b/src/Web/DevHive.Web/Configurations/Extensions/ConfigureDependencyInjection.cs new file mode 100644 index 0000000..88f21d4 --- /dev/null +++ b/src/Web/DevHive.Web/Configurations/Extensions/ConfigureDependencyInjection.cs @@ -0,0 +1,38 @@ +using DevHive.Data.Interfaces.Repositories; +using DevHive.Data.Repositories; +using DevHive.Services.Interfaces; +using DevHive.Services.Services; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace DevHive.Web.Configurations.Extensions +{ + public static class ConfigureDependencyInjection + { + public static void DependencyInjectionConfiguration(this IServiceCollection services, IConfiguration configuration) + { + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(options => + new CloudinaryService( + cloudName: configuration.GetSection("Cloud").GetSection("cloudName").Value, + apiKey: configuration.GetSection("Cloud").GetSection("apiKey").Value, + apiSecret: configuration.GetSection("Cloud").GetSection("apiSecret").Value)); + services.AddTransient(); + } + } +} diff --git a/src/Web/DevHive.Web/Configurations/Extensions/ConfigureExceptionHandlerMiddleware.cs b/src/Web/DevHive.Web/Configurations/Extensions/ConfigureExceptionHandlerMiddleware.cs new file mode 100644 index 0000000..286727f --- /dev/null +++ b/src/Web/DevHive.Web/Configurations/Extensions/ConfigureExceptionHandlerMiddleware.cs @@ -0,0 +1,16 @@ +using DevHive.Web.Middleware; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; + +namespace DevHive.Web.Configurations.Extensions +{ + public static class ConfigureExceptionHandlerMiddleware + { + public static void ExceptionHandlerMiddlewareConfiguration(this IServiceCollection services) { } + + public static void UseExceptionHandlerMiddlewareConfiguration(this IApplicationBuilder app) + { + app.UseMiddleware(); + } + } +} diff --git a/src/Web/DevHive.Web/Configurations/Extensions/ConfigureJWT.cs b/src/Web/DevHive.Web/Configurations/Extensions/ConfigureJWT.cs new file mode 100644 index 0000000..d422bc8 --- /dev/null +++ b/src/Web/DevHive.Web/Configurations/Extensions/ConfigureJWT.cs @@ -0,0 +1,54 @@ +using System.Text; +using System.Threading.Tasks; +using DevHive.Services.Options; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.IdentityModel.Tokens; + +namespace DevHive.Web.Configurations.Extensions +{ + public static class JWTExtensions + { + public static void JWTConfiguration(this IServiceCollection services, IConfiguration configuration) + { + services.AddSingleton(new JWTOptions(configuration + .GetSection("AppSettings") + .GetSection("Secret") + .Value)); + + // Get key from appsettings.json + var key = Encoding.ASCII.GetBytes(configuration + .GetSection("AppSettings") + .GetSection("Secret") + .Value); + + // Setup Jwt Authentication + services.AddAuthentication(x => + { + x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + }) + .AddJwtBearer(x => + { + x.Events = new JwtBearerEvents + { + OnTokenValidated = context => + { + // TODO: add more authentication + return Task.CompletedTask; + } + }; + x.RequireHttpsMetadata = false; + x.SaveToken = true; + x.TokenValidationParameters = new TokenValidationParameters + { + //ValidateIssuerSigningKey = false, + IssuerSigningKey = new SymmetricSecurityKey(key), + ValidateIssuer = false, + ValidateAudience = false + }; + }); + } + } +} \ No newline at end of file diff --git a/src/Web/DevHive.Web/Configurations/Extensions/ConfigureSwagger.cs b/src/Web/DevHive.Web/Configurations/Extensions/ConfigureSwagger.cs new file mode 100644 index 0000000..a0641ab --- /dev/null +++ b/src/Web/DevHive.Web/Configurations/Extensions/ConfigureSwagger.cs @@ -0,0 +1,23 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.OpenApi.Models; + +namespace DevHive.Web.Configurations.Extensions +{ + public static class SwaggerExtensions + { + public static void SwaggerConfiguration(this IServiceCollection services) + { + services.AddSwaggerGen(c => + { + c.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version = "v1" }); + }); + } + + public static void UseSwaggerConfiguration(this IApplicationBuilder app) + { + app.UseSwagger(); + app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "API v1")); + } + } +} \ No newline at end of file diff --git a/src/Web/DevHive.Web/Configurations/Mapping/CommentMappings.cs b/src/Web/DevHive.Web/Configurations/Mapping/CommentMappings.cs new file mode 100644 index 0000000..b8d6829 --- /dev/null +++ b/src/Web/DevHive.Web/Configurations/Mapping/CommentMappings.cs @@ -0,0 +1,17 @@ +using AutoMapper; +using DevHive.Services.Models.Comment; +using DevHive.Web.Models.Comment; + +namespace DevHive.Web.Configurations.Mapping +{ + public class CommentMappings : Profile + { + public CommentMappings() + { + CreateMap(); + CreateMap(); + + CreateMap(); + } + } +} diff --git a/src/Web/DevHive.Web/Configurations/Mapping/FeedMappings.cs b/src/Web/DevHive.Web/Configurations/Mapping/FeedMappings.cs new file mode 100644 index 0000000..0909f6d --- /dev/null +++ b/src/Web/DevHive.Web/Configurations/Mapping/FeedMappings.cs @@ -0,0 +1,18 @@ +using AutoMapper; +using DevHive.Services.Models; +using DevHive.Web.Models.Comment; +using DevHive.Web.Models.Feed; + +namespace DevHive.Web.Configurations.Mapping +{ + public class FeedMappings : Profile + { + public FeedMappings() + { + CreateMap() + .ForMember(dest => dest.FirstRequestIssued, src => src.MapFrom(p => p.FirstPageTimeIssued)); + + CreateMap(); + } + } +} diff --git a/src/Web/DevHive.Web/Configurations/Mapping/LanguageMappings.cs b/src/Web/DevHive.Web/Configurations/Mapping/LanguageMappings.cs new file mode 100644 index 0000000..eca0d1a --- /dev/null +++ b/src/Web/DevHive.Web/Configurations/Mapping/LanguageMappings.cs @@ -0,0 +1,23 @@ +using AutoMapper; +using DevHive.Web.Models.Language; +using DevHive.Services.Models.Language; + +namespace DevHive.Web.Configurations.Mapping +{ + public class LanguageMappings : Profile + { + public LanguageMappings() + { + CreateMap(); + CreateMap(); + CreateMap() + .ForMember(src => src.Id, dest => dest.Ignore()); + CreateMap(); + + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + } + } +} diff --git a/src/Web/DevHive.Web/Configurations/Mapping/PostMappings.cs b/src/Web/DevHive.Web/Configurations/Mapping/PostMappings.cs new file mode 100644 index 0000000..a5b46ee --- /dev/null +++ b/src/Web/DevHive.Web/Configurations/Mapping/PostMappings.cs @@ -0,0 +1,17 @@ +using AutoMapper; +using DevHive.Services.Models.Post; +using DevHive.Web.Models.Post; + +namespace DevHive.Web.Configurations.Mapping +{ + public class PostMappings : Profile + { + public PostMappings() + { + CreateMap(); + CreateMap(); + + CreateMap(); + } + } +} diff --git a/src/Web/DevHive.Web/Configurations/Mapping/RatingMappings.cs b/src/Web/DevHive.Web/Configurations/Mapping/RatingMappings.cs new file mode 100644 index 0000000..4e071de --- /dev/null +++ b/src/Web/DevHive.Web/Configurations/Mapping/RatingMappings.cs @@ -0,0 +1,16 @@ +using AutoMapper; +using DevHive.Services.Models.Post.Rating; +using DevHive.Web.Models.Post.Rating; + +namespace DevHive.Web.Configurations.Mapping +{ + public class RatingMappings : Profile + { + public RatingMappings() + { + CreateMap(); + + CreateMap(); + } + } +} diff --git a/src/Web/DevHive.Web/Configurations/Mapping/RoleMappings.cs b/src/Web/DevHive.Web/Configurations/Mapping/RoleMappings.cs new file mode 100644 index 0000000..2ea2742 --- /dev/null +++ b/src/Web/DevHive.Web/Configurations/Mapping/RoleMappings.cs @@ -0,0 +1,21 @@ +using AutoMapper; +using DevHive.Web.Models.Identity.Role; +using DevHive.Services.Models.Identity.Role; + +namespace DevHive.Web.Configurations.Mapping +{ + public class RoleMappings : Profile + { + public RoleMappings() + { + CreateMap(); + CreateMap() + .ForMember(src => src.Id, dest => dest.Ignore()); + CreateMap(); + + CreateMap(); + CreateMap(); + CreateMap(); + } + } +} diff --git a/src/Web/DevHive.Web/Configurations/Mapping/TechnologyMappings.cs b/src/Web/DevHive.Web/Configurations/Mapping/TechnologyMappings.cs new file mode 100644 index 0000000..708b6ac --- /dev/null +++ b/src/Web/DevHive.Web/Configurations/Mapping/TechnologyMappings.cs @@ -0,0 +1,23 @@ +using AutoMapper; +using DevHive.Web.Models.Technology; +using DevHive.Services.Models.Technology; + +namespace DevHive.Web.Configurations.Mapping +{ + public class TechnologyMappings : Profile + { + public TechnologyMappings() + { + CreateMap(); + CreateMap(); + CreateMap() + .ForMember(src => src.Id, dest => dest.Ignore()); + CreateMap(); + + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + } + } +} diff --git a/src/Web/DevHive.Web/Configurations/Mapping/UserMappings.cs b/src/Web/DevHive.Web/Configurations/Mapping/UserMappings.cs new file mode 100644 index 0000000..f58e7ca --- /dev/null +++ b/src/Web/DevHive.Web/Configurations/Mapping/UserMappings.cs @@ -0,0 +1,33 @@ +using AutoMapper; +using DevHive.Services.Models.Identity.User; +using DevHive.Web.Models.Identity.User; +using DevHive.Common.Models.Identity; + +namespace DevHive.Web.Configurations.Mapping +{ + public class UserMappings : Profile + { + public UserMappings() + { + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + + CreateMap(); + + CreateMap(); + + //Update + CreateMap(); + CreateMap(); + CreateMap(); + + CreateMap(); + CreateMap(); + + CreateMap(); + CreateMap(); + } + } +} diff --git a/src/Web/DevHive.Web/Controllers/CommentController.cs b/src/Web/DevHive.Web/Controllers/CommentController.cs new file mode 100644 index 0000000..c38e300 --- /dev/null +++ b/src/Web/DevHive.Web/Controllers/CommentController.cs @@ -0,0 +1,83 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using AutoMapper; +using System; +using DevHive.Web.Models.Comment; +using DevHive.Services.Models.Comment; +using Microsoft.AspNetCore.Authorization; +using DevHive.Services.Interfaces; + +namespace DevHive.Web.Controllers +{ + [ApiController] + [Route("/api/[controller]")] + [Authorize(Roles = "User,Admin")] + public class CommentController + { + private readonly ICommentService _commentService; + private readonly IMapper _commentMapper; + + public CommentController(ICommentService commentService, IMapper commentMapper) + { + this._commentService = commentService; + this._commentMapper = commentMapper; + } + + [HttpPost] + public async Task AddComment(Guid userId, [FromBody] CreateCommentWebModel createCommentWebModel, [FromHeader] string authorization) + { + if (!await this._commentService.ValidateJwtForCreating(userId, authorization)) + return new UnauthorizedResult(); + + CreateCommentServiceModel createCommentServiceModel = + this._commentMapper.Map(createCommentWebModel); + createCommentServiceModel.CreatorId = userId; + + Guid id = await this._commentService.AddComment(createCommentServiceModel); + + return id == Guid.Empty ? + new BadRequestObjectResult("Could not create comment!") : + new OkObjectResult(new { Id = id }); + } + + [HttpGet] + [AllowAnonymous] + public async Task GetCommentById(Guid id) + { + ReadCommentServiceModel readCommentServiceModel = await this._commentService.GetCommentById(id); + ReadCommentWebModel readCommentWebModel = this._commentMapper.Map(readCommentServiceModel); + + return new OkObjectResult(readCommentWebModel); + } + + [HttpPut] + public async Task UpdateComment(Guid userId, [FromBody] UpdateCommentWebModel updateCommentWebModel, [FromHeader] string authorization) + { + if (!await this._commentService.ValidateJwtForComment(updateCommentWebModel.CommentId, authorization)) + return new UnauthorizedResult(); + + UpdateCommentServiceModel updateCommentServiceModel = + this._commentMapper.Map(updateCommentWebModel); + updateCommentServiceModel.CreatorId = userId; + + Guid id = await this._commentService.UpdateComment(updateCommentServiceModel); + + return id == Guid.Empty ? + new BadRequestObjectResult("Unable to update comment!") : + new OkObjectResult(new { Id = id }); + } + + [HttpDelete] + public async Task DeleteComment(Guid id, [FromHeader] string authorization) + { + if (!await this._commentService.ValidateJwtForComment(id, authorization)) + return new UnauthorizedResult(); + + return await this._commentService.DeleteComment(id) ? + new OkResult() : + new BadRequestObjectResult("Could not delete Comment"); + } + + } +} + diff --git a/src/Web/DevHive.Web/Controllers/FeedController.cs b/src/Web/DevHive.Web/Controllers/FeedController.cs new file mode 100644 index 0000000..abca3e4 --- /dev/null +++ b/src/Web/DevHive.Web/Controllers/FeedController.cs @@ -0,0 +1,54 @@ +using System; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Services.Interfaces; +using DevHive.Services.Models; +using DevHive.Web.Models.Comment; +using DevHive.Web.Models.Feed; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace DevHive.Web.Controllers +{ + [ApiController] + [Route("/api/[controller]")] + [Authorize(Roles = "User,Admin")] + public class FeedController + { + private readonly IFeedService _feedService; + private readonly IMapper _mapper; + + public FeedController(IFeedService feedService, IMapper mapper) + { + this._feedService = feedService; + this._mapper = mapper; + } + + [HttpPost] + [Route("GetPosts")] + public async Task GetPosts(Guid userId, [FromBody] GetPageWebModel getPageWebModel) + { + GetPageServiceModel getPageServiceModel = this._mapper.Map(getPageWebModel); + getPageServiceModel.UserId = userId; + + ReadPageServiceModel readPageServiceModel = await this._feedService.GetPage(getPageServiceModel); + ReadPageWebModel readPageWebModel = this._mapper.Map(readPageServiceModel); + + return new OkObjectResult(readPageWebModel); + } + + [HttpPost] + [Route("GetUserPosts")] + [AllowAnonymous] + public async Task GetUserPosts(string username, [FromBody] GetPageWebModel getPageWebModel) + { + GetPageServiceModel getPageServiceModel = this._mapper.Map(getPageWebModel); + getPageServiceModel.Username = username; + + ReadPageServiceModel readPageServiceModel = await this._feedService.GetUserPage(getPageServiceModel); + ReadPageWebModel readPageWebModel = this._mapper.Map(readPageServiceModel); + + return new OkObjectResult(readPageWebModel); + } + } +} diff --git a/src/Web/DevHive.Web/Controllers/LanguageController.cs b/src/Web/DevHive.Web/Controllers/LanguageController.cs new file mode 100644 index 0000000..5b0d5de --- /dev/null +++ b/src/Web/DevHive.Web/Controllers/LanguageController.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Language; +using DevHive.Web.Models.Language; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace DevHive.Web.Controllers +{ + [ApiController] + [Route("/api/[controller]")] + public class LanguageController + { + private readonly ILanguageService _languageService; + private readonly IMapper _languageMapper; + + public LanguageController(ILanguageService languageService, IMapper mapper) + { + this._languageService = languageService; + this._languageMapper = mapper; + } + + [HttpPost] + [Authorize(Roles = "Admin")] + public async Task Create([FromBody] CreateLanguageWebModel createLanguageWebModel) + { + CreateLanguageServiceModel languageServiceModel = this._languageMapper.Map(createLanguageWebModel); + + Guid id = await this._languageService.CreateLanguage(languageServiceModel); + + return id == Guid.Empty ? + new BadRequestObjectResult($"Could not create language {createLanguageWebModel.Name}") : + new OkObjectResult(new { Id = id }); + } + + [HttpGet] + [AllowAnonymous] + public async Task GetById(Guid id) + { + ReadLanguageServiceModel languageServiceModel = await this._languageService.GetLanguageById(id); + ReadLanguageWebModel languageWebModel = this._languageMapper.Map(languageServiceModel); + + return new OkObjectResult(languageWebModel); + } + + [HttpGet] + [Route("GetLanguages")] + [Authorize(Roles = "User,Admin")] + public IActionResult GetAllExistingLanguages() + { + HashSet languageServiceModels = this._languageService.GetLanguages(); + HashSet languageWebModels = this._languageMapper.Map>(languageServiceModels); + + return new OkObjectResult(languageWebModels); + } + + [HttpPut] + [Authorize(Roles = "Admin")] + public async Task Update(Guid id, [FromBody] UpdateLanguageWebModel updateModel) + { + UpdateLanguageServiceModel updatelanguageServiceModel = this._languageMapper.Map(updateModel); + updatelanguageServiceModel.Id = id; + + bool result = await this._languageService.UpdateLanguage(updatelanguageServiceModel); + + if (!result) + return new BadRequestObjectResult("Could not update Language"); + + return new OkResult(); + } + + [HttpDelete] + [Authorize(Roles = "Admin")] + public async Task Delete(Guid id) + { + bool result = await this._languageService.DeleteLanguage(id); + + if (!result) + return new BadRequestObjectResult("Could not delete Language"); + + return new OkResult(); + } + } +} diff --git a/src/Web/DevHive.Web/Controllers/PostController.cs b/src/Web/DevHive.Web/Controllers/PostController.cs new file mode 100644 index 0000000..d3fdbf6 --- /dev/null +++ b/src/Web/DevHive.Web/Controllers/PostController.cs @@ -0,0 +1,89 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using AutoMapper; +using System; +using DevHive.Web.Models.Post; +using DevHive.Services.Models.Post; +using Microsoft.AspNetCore.Authorization; +using DevHive.Services.Interfaces; + +namespace DevHive.Web.Controllers +{ + [ApiController] + [Route("/api/[controller]")] + [Authorize(Roles = "User,Admin")] + public class PostController + { + private readonly IPostService _postService; + private readonly IMapper _postMapper; + + public PostController(IPostService postService, IMapper postMapper) + { + this._postService = postService; + this._postMapper = postMapper; + } + + #region Create + [HttpPost] + public async Task Create(Guid userId, [FromForm] CreatePostWebModel createPostWebModel, [FromHeader] string authorization) + { + if (!await this._postService.ValidateJwtForCreating(userId, authorization)) + return new UnauthorizedResult(); + + CreatePostServiceModel createPostServiceModel = + this._postMapper.Map(createPostWebModel); + createPostServiceModel.CreatorId = userId; + + Guid id = await this._postService.CreatePost(createPostServiceModel); + + return id == Guid.Empty ? + new BadRequestObjectResult("Could not create post!") : + new OkObjectResult(new { Id = id }); + } + #endregion + + #region Read + [HttpGet] + [AllowAnonymous] + public async Task GetById(Guid id) + { + ReadPostServiceModel postServiceModel = await this._postService.GetPostById(id); + ReadPostWebModel postWebModel = this._postMapper.Map(postServiceModel); + + return new OkObjectResult(postWebModel); + } + #endregion + + #region Update + [HttpPut] + public async Task Update(Guid userId, [FromForm] UpdatePostWebModel updatePostWebModel, [FromHeader] string authorization) + { + if (!await this._postService.ValidateJwtForPost(updatePostWebModel.PostId, authorization)) + return new UnauthorizedResult(); + + UpdatePostServiceModel updatePostServiceModel = + this._postMapper.Map(updatePostWebModel); + updatePostServiceModel.CreatorId = userId; + + Guid id = await this._postService.UpdatePost(updatePostServiceModel); + + return id == Guid.Empty ? + new BadRequestObjectResult("Could not update post!") : + new OkObjectResult(new { Id = id }); + } + #endregion + + #region Delete + [HttpDelete] + public async Task Delete(Guid id, [FromHeader] string authorization) + { + if (!await this._postService.ValidateJwtForPost(id, authorization)) + return new UnauthorizedResult(); + + return await this._postService.DeletePost(id) ? + new OkResult() : + new BadRequestObjectResult("Could not delete Post"); + } + #endregion + } +} diff --git a/src/Web/DevHive.Web/Controllers/RateController.cs b/src/Web/DevHive.Web/Controllers/RateController.cs new file mode 100644 index 0000000..68b859b --- /dev/null +++ b/src/Web/DevHive.Web/Controllers/RateController.cs @@ -0,0 +1,40 @@ +using System; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Post.Rating; +using DevHive.Web.Models.Post.Rating; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace DevHive.Web.Controllers +{ + [ApiController] + [Route("api/[controller]")] + public class RateController + { + private readonly IRateService _rateService; + private readonly IUserService _userService; + private readonly IMapper _mapper; + + public RateController(IRateService rateService, IUserService userService, IMapper mapper) + { + this._rateService = rateService; + this._userService = userService; + this._mapper = mapper; + } + + [HttpPost] + [Authorize(Roles = "Admin,User")] + public async Task RatePost(Guid userId, [FromBody] RatePostWebModel ratePostWebModel, [FromHeader] string authorization) + { + RatePostServiceModel ratePostServiceModel = this._mapper.Map(ratePostWebModel); + ratePostServiceModel.UserId = userId; + + ReadPostRatingServiceModel readPostRatingServiceModel = await this._rateService.RatePost(ratePostServiceModel); + ReadPostRatingWebModel readPostRatingWebModel = this._mapper.Map(readPostRatingServiceModel); + + return new OkObjectResult(readPostRatingWebModel); + } + } +} diff --git a/src/Web/DevHive.Web/Controllers/RoleController.cs b/src/Web/DevHive.Web/Controllers/RoleController.cs new file mode 100644 index 0000000..0d2a2eb --- /dev/null +++ b/src/Web/DevHive.Web/Controllers/RoleController.cs @@ -0,0 +1,77 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using DevHive.Web.Models.Identity.Role; +using AutoMapper; +using System; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Identity.Role; +using Microsoft.AspNetCore.Authorization; + +namespace DevHive.Web.Controllers +{ + [ApiController] + [Route("/api/[controller]")] + public class RoleController + { + private readonly IRoleService _roleService; + private readonly IMapper _roleMapper; + + public RoleController(IRoleService roleService, IMapper mapper) + { + this._roleService = roleService; + this._roleMapper = mapper; + } + + [HttpPost] + [Authorize(Roles = "Admin")] + public async Task Create([FromBody] CreateRoleWebModel createRoleWebModel) + { + CreateRoleServiceModel roleServiceModel = + this._roleMapper.Map(createRoleWebModel); + + Guid id = await this._roleService.CreateRole(roleServiceModel); + + return id == Guid.Empty ? + new BadRequestObjectResult($"Could not create role {createRoleWebModel.Name}") : + new OkObjectResult(new { Id = id }); + } + + [HttpGet] + [Authorize(Roles = "User,Admin")] + public async Task GetById(Guid id) + { + RoleServiceModel roleServiceModel = await this._roleService.GetRoleById(id); + RoleWebModel roleWebModel = this._roleMapper.Map(roleServiceModel); + + return new OkObjectResult(roleWebModel); + } + + [HttpPut] + [Authorize(Roles = "Admin")] + public async Task Update(Guid id, [FromBody] UpdateRoleWebModel updateRoleWebModel) + { + UpdateRoleServiceModel updateRoleServiceModel = + this._roleMapper.Map(updateRoleWebModel); + updateRoleServiceModel.Id = id; + + bool result = await this._roleService.UpdateRole(updateRoleServiceModel); + + if (!result) + return new BadRequestObjectResult("Could not update role!"); + + return new OkResult(); + } + + [HttpDelete] + [Authorize(Roles = "Admin")] + public async Task Delete(Guid id) + { + bool result = await this._roleService.DeleteRole(id); + + if (!result) + return new BadRequestObjectResult("Could not delete role!"); + + return new OkResult(); + } + } +} diff --git a/src/Web/DevHive.Web/Controllers/TechnologyController.cs b/src/Web/DevHive.Web/Controllers/TechnologyController.cs new file mode 100644 index 0000000..e507899 --- /dev/null +++ b/src/Web/DevHive.Web/Controllers/TechnologyController.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Services.Interfaces; +using DevHive.Services.Models.Technology; +using DevHive.Web.Models.Technology; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace DevHive.Web.Controllers +{ + [ApiController] + [Route("/api/[controller]")] + public class TechnologyController + { + private readonly ITechnologyService _technologyService; + private readonly IMapper _technologyMapper; + + public TechnologyController(ITechnologyService technologyService, IMapper technologyMapper) + { + this._technologyService = technologyService; + this._technologyMapper = technologyMapper; + } + + [HttpPost] + [Authorize(Roles = "Admin")] + public async Task Create([FromBody] CreateTechnologyWebModel createTechnologyWebModel) + { + CreateTechnologyServiceModel technologyServiceModel = this._technologyMapper.Map(createTechnologyWebModel); + + Guid id = await this._technologyService.CreateTechnology(technologyServiceModel); + + return id == Guid.Empty ? + new BadRequestObjectResult($"Could not create technology {createTechnologyWebModel.Name}") : + new OkObjectResult(new { Id = id }); + } + + [HttpGet] + [AllowAnonymous] + public async Task GetById(Guid id) + { + ReadTechnologyServiceModel readTechnologyServiceModel = await this._technologyService.GetTechnologyById(id); + ReadTechnologyWebModel readTechnologyWebModel = this._technologyMapper.Map(readTechnologyServiceModel); + + return new OkObjectResult(readTechnologyWebModel); + } + + [HttpGet] + [Route("GetTechnologies")] + [Authorize(Roles = "User,Admin")] + public IActionResult GetAllExistingTechnologies() + { + HashSet technologyServiceModels = this._technologyService.GetTechnologies(); + HashSet languageWebModels = this._technologyMapper.Map>(technologyServiceModels); + + return new OkObjectResult(languageWebModels); + } + + [HttpPut] + [Authorize(Roles = "Admin")] + public async Task Update(Guid id, [FromBody] UpdateTechnologyWebModel updateModel) + { + UpdateTechnologyServiceModel updateTechnologyServiceModel = this._technologyMapper.Map(updateModel); + updateTechnologyServiceModel.Id = id; + + bool result = await this._technologyService.UpdateTechnology(updateTechnologyServiceModel); + + if (!result) + return new BadRequestObjectResult("Could not update Technology"); + + return new OkResult(); + } + + [HttpDelete] + [Authorize(Roles = "Admin")] + public async Task Delete(Guid id) + { + bool result = await this._technologyService.DeleteTechnology(id); + + if (!result) + return new BadRequestObjectResult("Could not delete Technology"); + + return new OkResult(); + } + } +} diff --git a/src/Web/DevHive.Web/Controllers/UserController.cs b/src/Web/DevHive.Web/Controllers/UserController.cs new file mode 100644 index 0000000..109bbaa --- /dev/null +++ b/src/Web/DevHive.Web/Controllers/UserController.cs @@ -0,0 +1,140 @@ +using System; +using System.Threading.Tasks; +using AutoMapper; +using DevHive.Services.Models.Identity.User; +using DevHive.Web.Models.Identity.User; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using DevHive.Common.Models.Identity; +using DevHive.Services.Interfaces; +using Microsoft.Extensions.Hosting; + +namespace DevHive.Web.Controllers +{ + [ApiController] + [Route("/api/[controller]")] + public class UserController : ControllerBase + { + private readonly IUserService _userService; + private readonly IMapper _userMapper; + + public UserController(IUserService userService, IMapper mapper) + { + this._userService = userService; + this._userMapper = mapper; + } + + #region Authentication + [HttpPost] + [Route("Login")] + [AllowAnonymous] + public async Task Login([FromBody] LoginWebModel loginModel) + { + LoginServiceModel loginServiceModel = this._userMapper.Map(loginModel); + + TokenModel TokenModel = await this._userService.LoginUser(loginServiceModel); + TokenWebModel tokenWebModel = this._userMapper.Map(TokenModel); + + return new OkObjectResult(tokenWebModel); + } + + [HttpPost] + [Route("Register")] + [AllowAnonymous] + public async Task Register([FromBody] RegisterWebModel registerModel) + { + RegisterServiceModel registerServiceModel = this._userMapper.Map(registerModel); + + TokenModel TokenModel = await this._userService.RegisterUser(registerServiceModel); + TokenWebModel tokenWebModel = this._userMapper.Map(TokenModel); + + return new CreatedResult("Register", tokenWebModel); + } + #endregion + + #region Read + [HttpGet] + [Authorize(Roles = "User,Admin")] + public async Task GetById(Guid id, [FromHeader] string authorization) + { + if (!await this._userService.ValidJWT(id, authorization)) + return new UnauthorizedResult(); + + UserServiceModel userServiceModel = await this._userService.GetUserById(id); + UserWebModel userWebModel = this._userMapper.Map(userServiceModel); + + return new OkObjectResult(userWebModel); + } + + [HttpGet] + [Route("GetUser")] + [AllowAnonymous] + public async Task GetUser(string username) + { + UserServiceModel friendServiceModel = await this._userService.GetUserByUsername(username); + UserWebModel friend = this._userMapper.Map(friendServiceModel); + + return new OkObjectResult(friend); + } + #endregion + + #region Update + [HttpPut] + [Authorize(Roles = "User,Admin")] + public async Task Update(Guid id, [FromBody] UpdateUserWebModel updateUserWebModel, [FromHeader] string authorization) + { + if (!await this._userService.ValidJWT(id, authorization)) + return new UnauthorizedResult(); + + UpdateUserServiceModel updateUserServiceModel = this._userMapper.Map(updateUserWebModel); + updateUserServiceModel.Id = id; + + UserServiceModel userServiceModel = await this._userService.UpdateUser(updateUserServiceModel); + UserWebModel userWebModel = this._userMapper.Map(userServiceModel); + + return new AcceptedResult("UpdateUser", userWebModel); + } + + [HttpPut] + [Route("ProfilePicture")] + [Authorize(Roles = "User,Admin")] + public async Task UpdateProfilePicture(Guid userId, [FromForm] UpdateProfilePictureWebModel updateProfilePictureWebModel, [FromHeader] string authorization) + { + if (!await this._userService.ValidJWT(userId, authorization)) + return new UnauthorizedResult(); + + UpdateProfilePictureServiceModel updateProfilePictureServiceModel = this._userMapper.Map(updateProfilePictureWebModel); + updateProfilePictureServiceModel.UserId = userId; + + ProfilePictureServiceModel profilePictureServiceModel = await this._userService.UpdateProfilePicture(updateProfilePictureServiceModel); + ProfilePictureWebModel profilePictureWebModel = this._userMapper.Map(profilePictureServiceModel); + + return new AcceptedResult("UpdateProfilePicture", profilePictureWebModel); + } + #endregion + + #region Delete + [HttpDelete] + [Authorize(Roles = "User,Admin")] + public async Task Delete(Guid id, [FromHeader] string authorization) + { + if (!await this._userService.ValidJWT(id, authorization)) + return new UnauthorizedResult(); + + bool result = await this._userService.DeleteUser(id); + if (!result) + return new BadRequestObjectResult("Could not delete User"); + + return new OkResult(); + } + #endregion + + [HttpPost] + [Authorize(Roles = "User,Admin")] + [Route("SuperSecretPromotionToAdmin")] + public async Task SuperSecretPromotionToAdmin(Guid userId) + { + return new OkObjectResult(await this._userService.SuperSecretPromotionToAdmin(userId)); + } + } +} diff --git a/src/Web/DevHive.Web/DevHive.Web.csproj b/src/Web/DevHive.Web/DevHive.Web.csproj new file mode 100644 index 0000000..71362ce --- /dev/null +++ b/src/Web/DevHive.Web/DevHive.Web.csproj @@ -0,0 +1,30 @@ + + + net5.0 + + + true + latest + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + + + + + + diff --git a/src/Web/DevHive.Web/Middleware/ExceptionMiddleware.cs b/src/Web/DevHive.Web/Middleware/ExceptionMiddleware.cs new file mode 100644 index 0000000..cb6d4ca --- /dev/null +++ b/src/Web/DevHive.Web/Middleware/ExceptionMiddleware.cs @@ -0,0 +1,50 @@ +using System; +using System.Net; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; + +namespace DevHive.Web.Middleware +{ + public class ExceptionMiddleware + { + private readonly RequestDelegate _next; + // private readonly ILogger _logger; + + public ExceptionMiddleware(RequestDelegate next) + { + this._next = next; + // this._logger = logger; + } + // public ExceptionMiddleware(RequestDelegate next, ILogger logger) + // { + // this._logger = logger; + // this._next = next; + // } + + public async Task InvokeAsync(HttpContext httpContext) + { + try + { + await this._next(httpContext); + } + catch (Exception ex) + { + // this._logger.LogError($"Something went wrong: {ex}"); + await HandleExceptionAsync(httpContext, ex); + } + } + + private Task HandleExceptionAsync(HttpContext context, Exception exception) + { + context.Response.ContentType = "application/json"; + context.Response.StatusCode = (int)HttpStatusCode.BadRequest; + + return context.Response.WriteAsync(new + { + StatusCode = context.Response.StatusCode, + Message = exception.Message + }.ToString()); + } + } +} diff --git a/src/Web/DevHive.Web/Program.cs b/src/Web/DevHive.Web/Program.cs new file mode 100644 index 0000000..6982da9 --- /dev/null +++ b/src/Web/DevHive.Web/Program.cs @@ -0,0 +1,23 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace DevHive.Web +{ + public class Program + { + private const int HTTP_PORT = 5000; + + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.ConfigureKestrel(opt => opt.ListenLocalhost(HTTP_PORT)); + webBuilder.UseStartup(); + }); + } +} diff --git a/src/Web/DevHive.Web/Properties/launchSettings.json b/src/Web/DevHive.Web/Properties/launchSettings.json new file mode 100644 index 0000000..2b65d0b --- /dev/null +++ b/src/Web/DevHive.Web/Properties/launchSettings.json @@ -0,0 +1,36 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:1955", + "sslPort": 44326 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": false, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "DevHive.Web": { + "commandName": "Project", + "dotnetRunMessages": "true", + "launchBrowser": false, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "DevHive.Web Production": { + "commandName": "Project", + "dotnetRunMessages": "true", + "launchBrowser": false, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Production" + } + } + } +} diff --git a/src/Web/DevHive.Web/Startup.cs b/src/Web/DevHive.Web/Startup.cs new file mode 100644 index 0000000..46521cf --- /dev/null +++ b/src/Web/DevHive.Web/Startup.cs @@ -0,0 +1,70 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using DevHive.Web.Configurations.Extensions; +using Newtonsoft.Json; + +namespace DevHive.Web +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.AddCors(); + + services.AddControllers() + .AddNewtonsoftJson(x => + { + x.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; + }); + + services.DatabaseConfiguration(Configuration); + services.SwaggerConfiguration(); + services.JWTConfiguration(Configuration); + services.AutoMapperConfiguration(); + services.DependencyInjectionConfiguration(this.Configuration); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + app.UseCors(x => x + .AllowAnyMethod() + .AllowAnyHeader() + .SetIsOriginAllowed(origin => true) // allow any origin + .AllowCredentials()); // allow credentials + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + app.UseSwaggerConfiguration(); + } + else + { + app.UseHsts(); + app.UseExceptionHandlerMiddlewareConfiguration(); + } + + app.UseDatabaseConfiguration(); + app.UseAutoMapperConfiguration(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllerRoute( + name: "default", + pattern: "api/{controller}/{action}" + ); + }); + } + } +} diff --git a/src/Web/DevHive.Web/appsettings.json b/src/Web/DevHive.Web/appsettings.json new file mode 100644 index 0000000..bcdcae7 --- /dev/null +++ b/src/Web/DevHive.Web/appsettings.json @@ -0,0 +1,20 @@ +{ + "AppSettings": { + "Secret": "gXfQlU6qpDleFWyimscjYcT3tgFsQg3yoFjcvSLxG56n1Vu2yptdIUq254wlJWjm" + }, + "ConnectionStrings": { + "DEV": "Server=localhost;Port=5432;Database=API;User Id=postgres;Password=;" + }, + "Cloud": { + "cloudName": "devhive", + "apiKey": "488664116365813", + "apiSecret": "" + }, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} -- cgit v1.2.3