Changeset c2e73b6


Ignore:
Timestamp:
10/28/25 10:49:02 (11 months ago)
Author:
GitHub <noreply@…>
Branches:
master
Children:
4708118, ff202cf
Parents:
e49c3ed (diff), c155364 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
git-author:
Boris Gjorgjievski <69085722+imbrsk@…> (10/28/25 10:49:02)
git-committer:
GitHub <noreply@…> (10/28/25 10:49:02)
Message:

Merge pull request #5 from stefansaveski/feature/refresh-token

Feature/refresh token

Location:
iknow-api
Files:
6 added
11 edited
2 moved

Legend:

Unmodified
Added
Removed
  • iknow-api/Controllers/AuthController.cs

    re49c3ed rc2e73b6  
    1212    {
    1313        private readonly IAuthService _authService;
     14        private readonly IRefreshTokenService _refreshTokenService;
    1415
    15         public AuthController(IAuthService authService)
     16        public AuthController(IAuthService authService, IRefreshTokenService refreshTokenService)
    1617        {
    1718            _authService = authService;
     19            _refreshTokenService = refreshTokenService;
    1820        }
    1921
     
    5456            return Ok(new { message = "You are authorized!" });
    5557        }
     58
     59        [HttpPost("verify-user-token")]
     60        public async Task<IActionResult> VerifyToken([FromBody] VerifyRefreshTokenDto verifyRefreshToken)
     61        {
     62            if (await _refreshTokenService.VerifyRefreshToken(verifyRefreshToken))
     63            { return Ok(await _authService.GenerateNewJWT(verifyRefreshToken)); }
     64            else
     65            { return BadRequest(new { message = "No token found!" }); }
     66        }
    5667    }
    5768}
  • iknow-api/DTOs/UserDTO.cs

    re49c3ed rc2e73b6  
    66        public string Email { get; set; } = string.Empty;
    77        public string Password { get; set; } = string.Empty;
     8        public bool GenerateRefreshToken { get; set; }
    89    }
    910
  • iknow-api/Data/AppDbContext.cs

    re49c3ed rc2e73b6  
    1010
    1111        public DbSet<User> User { get; set; }
     12        public DbSet<RefreshToken> RefreshToken { get; set; }
    1213    }
    1314}
  • iknow-api/Migrations/20251028091953_new.Designer.cs

    re49c3ed rc2e73b6  
    1313{
    1414    [DbContext(typeof(AppDbContext))]
    15     [Migration("20251022202014_InitialCreate")]
    16     partial class InitialCreate
     15    [Migration("20251028091953_new")]
     16    partial class @new
    1717    {
    1818        /// <inheritdoc />
     
    2626            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
    2727
    28             modelBuilder.Entity("iknow_api.Core.Models.User", b =>
     28            modelBuilder.Entity("iknow_api.Models.RefreshToken", b =>
     29                {
     30                    b.Property<int>("Id")
     31                        .ValueGeneratedOnAdd()
     32                        .HasColumnType("integer");
     33
     34                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
     35
     36                    b.Property<DateTime>("ExpiresAt")
     37                        .HasColumnType("timestamp with time zone");
     38
     39                    b.Property<bool>("IsValid")
     40                        .HasColumnType("boolean");
     41
     42                    b.Property<string>("Token")
     43                        .IsRequired()
     44                        .HasColumnType("text");
     45
     46                    b.Property<int>("UserId")
     47                        .HasColumnType("integer");
     48
     49                    b.HasKey("Id");
     50
     51                    b.HasIndex("UserId");
     52
     53                    b.ToTable("RefreshToken");
     54                });
     55
     56            modelBuilder.Entity("iknow_api.Models.User", b =>
    2957                {
    3058                    b.Property<int>("Id")
     
    6290                    b.ToTable("User");
    6391                });
     92
     93            modelBuilder.Entity("iknow_api.Models.RefreshToken", b =>
     94                {
     95                    b.HasOne("iknow_api.Models.User", "User")
     96                        .WithMany()
     97                        .HasForeignKey("UserId")
     98                        .OnDelete(DeleteBehavior.Cascade)
     99                        .IsRequired();
     100
     101                    b.Navigation("User");
     102                });
    64103#pragma warning restore 612, 618
    65104        }
  • iknow-api/Migrations/20251028091953_new.cs

    re49c3ed rc2e73b6  
    88{
    99    /// <inheritdoc />
    10     public partial class InitialCreate : Migration
     10    public partial class @new : Migration
    1111    {
    1212        /// <inheritdoc />
     
    3232                    table.PrimaryKey("PK_User", x => x.Id);
    3333                });
     34
     35            migrationBuilder.CreateTable(
     36                name: "RefreshToken",
     37                columns: table => new
     38                {
     39                    Id = table.Column<int>(type: "integer", nullable: false)
     40                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
     41                    UserId = table.Column<int>(type: "integer", nullable: false),
     42                    Token = table.Column<string>(type: "text", nullable: false),
     43                    ExpiresAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
     44                    IsValid = table.Column<bool>(type: "boolean", nullable: false)
     45                },
     46                constraints: table =>
     47                {
     48                    table.PrimaryKey("PK_RefreshToken", x => x.Id);
     49                    table.ForeignKey(
     50                        name: "FK_RefreshToken_User_UserId",
     51                        column: x => x.UserId,
     52                        principalTable: "User",
     53                        principalColumn: "Id",
     54                        onDelete: ReferentialAction.Cascade);
     55                });
     56
     57            migrationBuilder.CreateIndex(
     58                name: "IX_RefreshToken_UserId",
     59                table: "RefreshToken",
     60                column: "UserId");
    3461        }
    3562
     
    3865        {
    3966            migrationBuilder.DropTable(
     67                name: "RefreshToken");
     68
     69            migrationBuilder.DropTable(
    4070                name: "User");
    4171        }
  • iknow-api/Migrations/AppDbContextModelSnapshot.cs

    re49c3ed rc2e73b6  
    2323            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
    2424
    25             modelBuilder.Entity("iknow_api.Core.Models.User", b =>
     25            modelBuilder.Entity("iknow_api.Models.RefreshToken", b =>
     26                {
     27                    b.Property<int>("Id")
     28                        .ValueGeneratedOnAdd()
     29                        .HasColumnType("integer");
     30
     31                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
     32
     33                    b.Property<DateTime>("ExpiresAt")
     34                        .HasColumnType("timestamp with time zone");
     35
     36                    b.Property<bool>("IsValid")
     37                        .HasColumnType("boolean");
     38
     39                    b.Property<string>("Token")
     40                        .IsRequired()
     41                        .HasColumnType("text");
     42
     43                    b.Property<int>("UserId")
     44                        .HasColumnType("integer");
     45
     46                    b.HasKey("Id");
     47
     48                    b.HasIndex("UserId");
     49
     50                    b.ToTable("RefreshToken");
     51                });
     52
     53            modelBuilder.Entity("iknow_api.Models.User", b =>
    2654                {
    2755                    b.Property<int>("Id")
     
    5987                    b.ToTable("User");
    6088                });
     89
     90            modelBuilder.Entity("iknow_api.Models.RefreshToken", b =>
     91                {
     92                    b.HasOne("iknow_api.Models.User", "User")
     93                        .WithMany()
     94                        .HasForeignKey("UserId")
     95                        .OnDelete(DeleteBehavior.Cascade)
     96                        .IsRequired();
     97
     98                    b.Navigation("User");
     99                });
    61100#pragma warning restore 612, 618
    62101        }
  • iknow-api/Models/User.cs

    re49c3ed rc2e73b6  
    2121        public DateTime CreatedAt { get; set; }
    2222        public UserRole Role { get; set; }
     23
    2324    }
    2425}
  • iknow-api/Program.cs

    re49c3ed rc2e73b6  
    4242// Register your services
    4343builder.Services.AddScoped<IAuthService, AuthService>();
    44 builder.Services.AddScoped<IUserRepository, UserRepository>(); // You'll need to add the UserRepository implementation
     44builder.Services.AddScoped<IRefreshTokenService, RefreshTokenService>();
     45builder.Services.AddScoped<IUserRepository, UserRepository>();
     46builder.Services.AddScoped<IRefreshTokenRepository, RefreshTokenRepository>();
    4547builder.Services.AddAuthorization();
    4648var app = builder.Build();
  • iknow-api/Repository/Implementations/UserRepository.cs

    re49c3ed rc2e73b6  
    2424            return await _context.User.FirstOrDefaultAsync(u => u.Email == username);
    2525        }
    26 
     26        public async Task<User?> GetOnlyUserByIdAsync(int id)
     27        {
     28            return await _context.User.FirstOrDefaultAsync(u => u.Id == id);
     29        }
    2730        public async Task AddUserAsync(User user)
    2831        {
  • iknow-api/Repository/Interface/IUserRepository.cs

    re49c3ed rc2e73b6  
    88        Task AddUserAsync(User user);
    99        Task<int> GetUsersCountAsync();
     10        Task<User?> GetOnlyUserByIdAsync(int id);
     11
    1012    }
    1113}
  • iknow-api/Services/Implementations/AuthService.cs

    re49c3ed rc2e73b6  
    33using System.Text;
    44using BCrypt.Net;
    5 using iknow_api.Controllers;
     5using iknow_api.Services;
    66using iknow_api.Models;
    77using iknow_api.DTOs;
     
    1414    {
    1515        private readonly IUserRepository _userRepository;
     16        private readonly IRefreshTokenRepository _refreshTokenRepository;
     17        private readonly IRefreshTokenService _refreshTokenService;
    1618        private readonly IConfiguration _configuration;
    1719
    18         public AuthService(IUserRepository userRepository, IConfiguration configuration)
     20        public AuthService(IUserRepository userRepository, IConfiguration configuration
     21                            , IRefreshTokenService refreshTokenService, IRefreshTokenRepository refreshTokenRepository)
    1922        {
    2023            _userRepository = userRepository;
    2124            _configuration = configuration;
     25            _refreshTokenService = refreshTokenService;
     26            _refreshTokenRepository = refreshTokenRepository;
    2227        }
    2328
     
    4348        }
    4449
    45         public async Task<string?> LoginAsync(LoginDto loginDto)
     50        public async Task<AuthResultDto?> LoginAsync(LoginDto loginDto)
    4651        {
    4752            var user = await _userRepository.GetUserByUsernameAsync(loginDto.Email);
     
    4954                return null;
    5055
    51             return CreateToken(user);
     56             var result = new AuthResultDto
     57            {
     58                AccessToken = CreateToken(user)
     59            };
     60
     61            if (loginDto.GenerateRefreshToken)
     62            {
     63                int userid = _userRepository.GetUserByUsernameAsync(loginDto.Email).Id;
     64                result.RefreshToken = await _refreshTokenService.GenerateRefreshToken(userid);
     65            }
     66
     67            return result;
    5268        }
    5369
     
    5571        {
    5672            return await _userRepository.GetUsersCountAsync();
     73        }
     74
     75        public async Task<AuthResultDto> GenerateNewJWT(VerifyRefreshTokenDto token)
     76        {
     77            int userid = await _refreshTokenRepository.GetUserId(token.token) ?? 0;
     78            User user = await _userRepository.GetOnlyUserByIdAsync(userid);
     79
     80            var result = new AuthResultDto
     81            {
     82                AccessToken = CreateToken(user)
     83            };
     84           
     85            return result;
    5786        }
    5887
  • iknow-api/Services/Interfaces/IAuthService.cs

    re49c3ed rc2e73b6  
    11using iknow_api.DTOs;
    2 
     2using iknow_api.DTOs;
    33namespace iknow_api.Services
    44{
     
    66    {
    77        Task<bool> RegisterAsync(RegisterDto registerDto);
    8         Task<string?> LoginAsync(LoginDto loginDto);
     8        Task<AuthResultDto?> LoginAsync(LoginDto loginDto);
    99        Task<int> GetUsersCountAsync();
     10        Task<AuthResultDto> GenerateNewJWT(VerifyRefreshTokenDto token);
    1011    }
    1112}
  • iknow-api/appsettings.Development.json

    re49c3ed rc2e73b6  
    77  },
    88    "ConnectionStrings": {
    9         "DefaultConnection": "Host=localhost;Port=5432;Database=myappdb;Username=postgres;Password=newpassword"
     9        "DefaultConnection": "Host=localhost;Port=5432;Database=myappdb;Username=myuser;Password=kodrum2025"
    1010    }
    1111}
Note: See TracChangeset for help on using the changeset viewer.