Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
5597b98
Apply Soft Delete using ITrackable interface
hadeer-r Aug 10, 2025
8ce0cc1
Add Migrations of Soft Delete
hadeer-r Aug 10, 2025
bc95408
Refactor: set all relatoin to No Action due to soft deletion
hadeer-r Aug 10, 2025
279df67
Feat: Integrate with Identity user for authentication & authrization …
hadeer-r Aug 10, 2025
11aed4d
make code rabbit review in all branches and PRs
hadeer-r Aug 10, 2025
cde3ad6
Create .coderabbit.yaml
hadeer-r Aug 10, 2025
1f4b285
Merge pull request #11 from Askfm-clone/hadeer-r-patch-2
hadeer-r Aug 10, 2025
799627b
remove .coderabbit
hadeer-r Aug 10, 2025
322af9f
Add:
ziad-ashraf7 Aug 10, 2025
4e151a5
Update dotnet.yml
ziad-ashraf7 Aug 10, 2025
e85e8fd
Merge pull request #14 from Askfm-clone/ziad-ashraf7-patch-1
ziad-ashraf7 Aug 10, 2025
4cd6aeb
FIX: some null exeptions has been handeled
ziad-ashraf7 Aug 10, 2025
a9468c1
FIX: UnitOfWork lazy init has been added
ziad-ashraf7 Aug 11, 2025
2982d6d
Added: added Services , DTO folders
ziad-ashraf7 Aug 12, 2025
9216fe5
Merge pull request #13 from ziad-ashraf7/Repo-Pattern
ziad-ashraf7 Aug 12, 2025
eaea142
added Class to the DTO , Services folders
ziad-ashraf7 Aug 12, 2025
22f2e73
Merge pull request #15 from ziad-ashraf7/Repo-Pattern
ziad-ashraf7 Aug 12, 2025
0982c34
Feat: Adding More infromation to track in ITrackable Interface
hadeer-r Aug 12, 2025
5d7a911
Feat: Override Savechanges and SaveChangesAsync to write trackable da…
hadeer-r Aug 12, 2025
9854bb5
Merge branch 'Develop' into SoftDelete-userIdentity
hadeer-r Aug 12, 2025
0d498ee
Fix: Solve conflict betwenn User & ApplicationUser
hadeer-r Aug 12, 2025
89ff6fb
Merge pull request #12 from hadeer-r/SoftDelete-userIdentity
hadeer-r Aug 13, 2025
65db53c
Modified the Testing framework to xUnit
ziad-ashraf7 Aug 16, 2025
3750097
Merge pull request #18 from ziad-ashraf7/Comments
ziad-ashraf7 Aug 16, 2025
3f17e7f
architecture of user APIs & Services
Aug 17, 2025
f3094a2
Merge branch 'Develop' into Authentication
Aug 17, 2025
888cfb3
Add SignalR Package
Mahmoud-Ayman-Saleh Aug 17, 2025
ad90d92
Add Notification Hub
Mahmoud-Ayman-Saleh Aug 17, 2025
47f9e2b
Implement NotificationDto
Mahmoud-Ayman-Saleh Aug 18, 2025
fe6259a
Implement Notification Repository
Mahmoud-Ayman-Saleh Aug 18, 2025
6c8330e
fix: update notification model and repository for API compliance
Mahmoud-Ayman-Saleh Aug 18, 2025
0f1a29c
Implement Notification Services
Mahmoud-Ayman-Saleh Aug 19, 2025
e65c410
fix: NotificationDto by adding PaginationDto and implement manual map…
Mahmoud-Ayman-Saleh Aug 19, 2025
7432403
Implement Notification Controller
Mahmoud-Ayman-Saleh Aug 20, 2025
9125016
Implement notification hub
Mahmoud-Ayman-Saleh Aug 20, 2025
065fdac
Add Dependency injection
Mahmoud-Ayman-Saleh Aug 20, 2025
09d1d0c
Provide JWT configuration
Aug 22, 2025
b701906
JWT Options
Aug 22, 2025
cd2c957
idenitity options
Aug 22, 2025
b2dca6d
refactor: Remove redundant actor fields and resolve actors via Resour…
Mahmoud-Ayman-Saleh Aug 24, 2025
fda6755
Remove NotificationResponseType that's because the frontend already s…
Mahmoud-Ayman-Saleh Aug 24, 2025
bf3cefd
Refactor notifications to use UnitOfWork and Repository pattern
Mahmoud-Ayman-Saleh Aug 24, 2025
d7bd9cf
Update Naming in Notification model and apply migrations for it
Mahmoud-Ayman-Saleh Aug 24, 2025
3e53d29
Enable Swagger
Mahmoud-Ayman-Saleh Aug 24, 2025
f85c186
Feat:
Aug 25, 2025
94126ef
Merge pull request #22 from hadeer-r/Authentication
hadeer-r Aug 25, 2025
40c3c7e
Add:
ziad-ashraf7 Aug 24, 2025
d8cfb1b
FIX: Fixing a userId bug on the Delete Like endpoint
ziad-ashraf7 Aug 25, 2025
c57f1a2
FIX: handling null user exception on AddLikeAsync function
ziad-ashraf7 Aug 25, 2025
f2b42a1
FIX: Added await and remove .Result from DeletLikeAsync function
ziad-ashraf7 Aug 25, 2025
c30d997
test: Added the Async function calls tests to AddLike_WhenCommentNotF…
ziad-ashraf7 Aug 25, 2025
59b594b
test: added await & async to DeleteLike test case
ziad-ashraf7 Aug 25, 2025
1a2aa44
test: Added Task return type for all test cases
ziad-ashraf7 Aug 25, 2025
19ef650
refactor: Added converted return type Task to Task<bool> to DeleteLik…
ziad-ashraf7 Aug 25, 2025
0ef96ce
merge: merged Authintecation PR to the Comments branch
ziad-ashraf7 Aug 25, 2025
eae0ee6
Merge branch 'Askfm-clone:main' into Comments
ziad-ashraf7 Aug 25, 2025
90943a9
refactor: added dependancies injection of ICommentService and ICommen…
ziad-ashraf7 Aug 25, 2025
75057f0
Add Default Values to CreatedAt, UpdatedAt and DeletedAt
Mahmoud-Ayman-Saleh Aug 25, 2025
208976b
Add Default Values to CreatedAt, UpdatedAt and DeletedAt
Mahmoud-Ayman-Saleh Aug 25, 2025
cb39a85
Merge branch 'Develop' into mahmoud-notif-patch
Mahmoud-Ayman-Saleh Aug 25, 2025
01e21ff
refactor: edited the current user implementation on UserService and t…
ziad-ashraf7 Aug 27, 2025
a55ae4b
Merge pull request #24 from ziad-ashraf7/Develop
ziad-ashraf7 Aug 27, 2025
dcc35e8
Finish notification unit test and update notification hub
Mahmoud-Ayman-Saleh Aug 28, 2025
73b3fba
Apply Auth and update all files that depend on it
Mahmoud-Ayman-Saleh Aug 28, 2025
e814936
Add Default Values to CreatedAt, UpdatedAt and DeletedAt
Mahmoud-Ayman-Saleh Aug 25, 2025
e8d5cea
refactor: edited the current user implementation on UserService and t…
ziad-ashraf7 Aug 27, 2025
81d4655
enabled swaggerUI
ziad-ashraf7 Aug 27, 2025
de36d6f
Refactor:
ziad-ashraf7 Aug 28, 2025
fcce8fd
refactor:
ziad-ashraf7 Aug 28, 2025
462e88c
test: Fixed some fail tests
ziad-ashraf7 Aug 28, 2025
b430c4e
User Endpoints
Aug 29, 2025
b5277c3
Setting refresh token in cookies after refershToken
Aug 29, 2025
3704164
refactor: Check user is deleted or not in login
Aug 29, 2025
89a363d
Add: Added transactions on the CommentLikeService
ziad-ashraf7 Aug 30, 2025
bca8625
test: Fixed tests fails because of transactions
ziad-ashraf7 Aug 30, 2025
b6f706e
Add unit tests: Complete Update & Delete user unit tests
Aug 30, 2025
bd4ec9e
Merge pull request #21 from ziad-ashraf7/Comments
ziad-ashraf7 Sep 3, 2025
e5f8650
Implement Delete User unit tests
Sep 4, 2025
40b73b0
Fix _checkCurrentUser Issue
Sep 4, 2025
419fa12
Replace Redirect by return that data
Sep 4, 2025
cb3f3b3
refactor: created updatePassword DTO and use it instead of passing pa…
Sep 4, 2025
38a7ea6
Fix: solve the issue in _checkCurrentUser
Sep 4, 2025
7a78b43
Fix: Solve the wrong return in checking object null in follow and unf…
Sep 4, 2025
909ca8b
fix: fix unfollow
Sep 4, 2025
afc5f70
fix: calling save changes in update last seen
Sep 4, 2025
29e1eeb
Refactor: adding query filter to filter the deleted raws in users, co…
Sep 4, 2025
c04f17d
Calling GetByIdAsync instead of sync
Sep 4, 2025
c755685
Merge branch 'Develop' into User
hadeer-r Sep 4, 2025
e012b09
Merge pull request #25 from hadeer-r/User
hadeer-r Sep 4, 2025
e96d3e2
Add: Adding Docs for APIs
Sep 6, 2025
7a0c157
Redis step (locally)
Sep 9, 2025
4008027
Revert "Add: Adding Docs for APIs"
Sep 9, 2025
45fbc7a
reids service interface
Sep 9, 2025
8e022aa
reids service interface
Sep 9, 2025
9337a04
Merge pull request #27 from hadeer-r/RedisSetup
hadeer-r Sep 10, 2025
1c774c5
Feat:
Sep 11, 2025
3ab007f
Feat: reset password and configure email sender service
Sep 15, 2025
8dc8e9f
remove refresh tokens form databasse
Sep 15, 2025
7e45bdb
Merge branch 'Develop' into mahmoud-notif-patch
Mahmoud-Ayman-Saleh Sep 20, 2025
ef94e30
Apply ServiceResult in Notifications Service
Mahmoud-Ayman-Saleh Sep 20, 2025
97620e4
fix(auth): Use standard JWT NameIdentifier claim for user ID extraction
Mahmoud-Ayman-Saleh Sep 20, 2025
6be6860
Refactor: Validate in data in emailsettings dto
Sep 22, 2025
739b39a
Merge branch 'Develop' into CachingTokensWithRedis
hadeer-r Sep 22, 2025
28cc556
Merge pull request #28 from hadeer-r/CachingTokensWithRedis
hadeer-r Sep 22, 2025
050c57c
Added CreateThread endpoint
ziad-ashraf7 Sep 10, 2025
d01a36a
Feat: Added the answer thread endpoint, created the ThreadLikeController
ziad-ashraf7 Sep 27, 2025
e71d3b3
Finished the ThreadLikeService and endpoints
ziad-ashraf7 Oct 5, 2025
cb8a0ea
Refactor: resolved most of the notes
ziad-ashraf7 Oct 6, 2025
155fd0c
Finished the Threads , implemented the Saved endpoints and modified t…
ziad-ashraf7 Oct 8, 2025
bb19796
Finish the Comment Controller and service section
ziad-ashraf7 Oct 11, 2025
7673376
refactor(totalCount & totalPages):
ziad-ashraf7 Nov 29, 2025
8321ea0
Merge pull request #31 from ziad-ashraf7/Threads
hadeer-r Nov 30, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
reviews:
auto_review:
enabled: true
branches:
- "*"

dismiss_stale_reviews: true
33 changes: 33 additions & 0 deletions AskFm/AskFm.API/AskFm.API.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,53 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="DotNetEnv" Version="3.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="9.0.0" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="9.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0" />
<PackageReference Include="StackExchange.Redis" Version="2.9.11" />
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.2.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.4" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="9.0.4" />

</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\AskFm.BLL\AskFm.BLL.csproj" />
<ProjectReference Include="..\Shared\Shared.csproj" />
</ItemGroup>

<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DotNetEnv" Version="3.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="9.0.0" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="9.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0" />
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.2.0" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="9.0.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AskFm.BLL\AskFm.BLL.csproj" />
<ProjectReference Include="..\Shared\Shared.csproj" />
</ItemGroup>
</Project>
150 changes: 150 additions & 0 deletions AskFm/AskFm.API/Controllers/AuthController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
using System.ComponentModel.DataAnnotations;
using AskFm.BLL.DTO.UserDTOs;
using AskFm.BLL.Services;
using AskFm.BLL.Services.UserIdentityService;
using AskFm.DAL.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Sprache;

namespace AskFm.API.Controllers;
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private IAuthService _authService;
private IUserService _userService;

public AuthController(IAuthService authService, IUserService userService)
{
_authService = authService;
_userService = userService;
}

[HttpPost]
[Route("register")]
public async Task<IActionResult> RegisterUser(RegisterUserDTO registerUser)
{
if (registerUser == null)
{
return BadRequest(new List<String>{"Invalid data"});
}
ServiceResult<AuthResponseDTO> result = await _authService.RegisterAsync(registerUser);
if (!result.success)
{
return BadRequest(result.Errors);
}
setRefreshToken(result.Data.RefreshToken.Token,result.Data.RefreshToken.ExpireOn);
return Ok(result);
}

[HttpPost]
[Route("login")]
public async Task<IActionResult> Login(LoginDTO login)
{
if (login == null)
{
return BadRequest(new List<String>{"Invalid data"});
}
ServiceResult<AuthResponseDTO> result = await _authService.LoginAsync(login);
if (!result.success)
{
return BadRequest(result.Errors);

}

setRefreshToken(result.Data.RefreshToken.Token,result.Data.RefreshToken.ExpireOn);

return Ok(result);
}

[HttpPost]
[Route("refresh-token/{id}")]
[Authorize(AuthenticationSchemes = "Bearer")]
public async Task<IActionResult> RefreshToken(int id)
{
string refreshToken = Request.Cookies["refreshToken"];
if (string.IsNullOrEmpty(refreshToken))
{
return Unauthorized("Invalid Token");
}
ServiceResult<AuthResponseDTO> result = await _authService.RefreshTokenAsync(id,refreshToken);

if (!result.success)
{
return BadRequest(result.Errors);
}
setRefreshToken(result.Data.RefreshToken.Token,result.Data.RefreshToken.ExpireOn);
return Ok(result);
}

[HttpPost("logout/{id}")]
[Authorize(AuthenticationSchemes = "Bearer")]
public async Task<IActionResult> Logout(int id)
{
var currentUser = await _userService.GetCurrentUserAsync();
if (currentUser.Data == null || currentUser.Data.Id != id)
{
return BadRequest("Invalid data");
}
string refreshToken = Request.Cookies["refreshToken"];
if (string.IsNullOrEmpty(refreshToken))
{
return BadRequest("token Is required");
}

var result = await _authService.Logout(currentUser.Data.Id,refreshToken);

if (!result.success)
{
return BadRequest(result.Errors);
}

return Ok(result);
}

[HttpPost]
[AllowAnonymous]
[Route("forgot-password")]
public async Task<IActionResult> ForgotPassword(ForgotPasswordDto forgotPasswordDto)
{

var result = await _authService.ForgotPasswordAsync(forgotPasswordDto.Email);
if (!result.success)
{
return BadRequest(result.Errors);
}

return Ok("Check Your Email");
}

[HttpPost]
[AllowAnonymous]
[Route("reset-password")]
public async Task<IActionResult> ResetPassword(ResetPasswordDto resetPasswordDto)
{
if (resetPasswordDto == null)
{
return BadRequest("Invalid Data");
}

var result = await _authService.ResetPasswordAsync(resetPasswordDto);
if (!result.success)
{
return BadRequest(result.Errors);
}

return Ok("Password Reset Success");
}
private void setRefreshToken(string refreshToken,DateTime expires)
{
var cookieOption = new CookieOptions()
{
HttpOnly = true,
Expires = expires.ToLocalTime()
};
Response.Cookies.Append("refreshToken", refreshToken, cookieOption);
}

}
Loading