Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 897851f8

Přidáno uživatelem Vojtěch Bartička před asi 2 roky(ů)

Added UserService impl., service registration

Zobrazit rozdíly:

Backend/Backend/Controllers/WeatherForecastController.cs
2 2
using Microsoft.AspNetCore.Mvc;
3 3
using Core.Entities;
4 4
using Core.Enums;
5
using Core.Services;
5 6

  
6 7
namespace Backend.Controllers
7 8
{
......
10 11
    [Route("[controller]")]
11 12
    public class WeatherForecastController : ControllerBase
12 13
    {
13
        private readonly DatabaseContext _databaseContext;
14
        private readonly IUserService _userService;
14 15

  
15 16
        private static readonly string[] Summaries = new[]
16 17
        {
......
19 20

  
20 21
        private readonly ILogger<WeatherForecastController> _logger;
21 22

  
22
        public WeatherForecastController(ILogger<WeatherForecastController> logger, DatabaseContext databaseContext)
23
        public WeatherForecastController(ILogger<WeatherForecastController> logger, IUserService userService)
23 24
        {
24 25
            _logger = logger;
25
            _databaseContext = databaseContext;
26
            _userService = userService;
26 27
        }
27 28

  
28 29
        [HttpGet(Name = "GetWeatherForecast")]
29 30
        public IEnumerable<WeatherForecast> Get()
30
        {     
31
        {
32
            /*User? u = _userService.CreateUser("username2", "name", "surname", "password", ERole.ANNOTATOR);
33
            u = _userService.UpdateUser(u, "username3");
34
            u = _userService.ChangePassword(u, "password2");*/
35
            User u = _userService.CheckUsernamePassword("asdfghjkl", "password2");
36

  
31 37
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
32 38
            {
33 39
                Date = DateTime.Now.AddDays(index),
Backend/Backend/Program.cs
1 1
using Core.Contexts;
2 2
using Core.Seeding;
3
using Core.Services;
3 4
using Serilog;
4 5

  
5 6

  
......
10 11

  
11 12
builder.Services.AddControllers();
12 13

  
14
// Register our services
15
Registration.RegisterServices(builder);
16

  
13 17
// Swagger
14 18
builder.Services.AddEndpointsApiExplorer();
15 19
builder.Services.AddSwaggerGen();
......
40 44
// Database seeding
41 45
using (var scope = app.Services.CreateScope())
42 46
{
43
    var services = scope.ServiceProvider;
44 47
    var context = scope.ServiceProvider.GetService<DatabaseContext>();
45 48

  
46 49
    // In development we seed dummy data
Backend/Core/Core.csproj
7 7
  </PropertyGroup>
8 8

  
9 9
  <ItemGroup>
10
    <PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
10 11
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.3" />
11 12
    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.3" />
12 13
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.3">
......
14 15
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
15 16
    </PackageReference>
16 17
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.3" />
17
  </ItemGroup>
18

  
19
  <ItemGroup>
20
    <Folder Include="Services\" />
18
    <PackageReference Include="Serilog" Version="2.10.0" />
19
    <PackageReference Include="Serilog.AspNetCore" Version="5.0.0" />
20
    <PackageReference Include="Serilog.Sinks.Console" Version="4.0.1" />
21 21
  </ItemGroup>
22 22

  
23 23
</Project>
Backend/Core/Services/Registration.cs
1
using Microsoft.AspNetCore.Builder;
2
using Microsoft.Extensions.DependencyInjection;
3
using System;
4
using System.Collections.Generic;
5
using System.Linq;
6
using System.Text;
7
using System.Threading.Tasks;
8

  
9
namespace Core.Services
10
{
11
    public class Registration
12
    {
13
        public static void RegisterServices(WebApplicationBuilder builder)
14
        {
15
            builder.Services.AddScoped<IUserService, UserServiceEF>();
16
        }
17
    }
18
}
Backend/Core/Services/UserService/IUserService.cs
1
using Core.Entities;
2
using Core.Enums;
3
using System;
4
using System.Collections.Generic;
5
using System.Linq;
6
using System.Text;
7
using System.Threading.Tasks;
8

  
9
namespace Core.Services
10
{
11
    public interface IUserService
12
    {
13
        public User? CreateUser(string username, string name, string surname, string password, ERole role);
14
        public User? GetUserByUsername(string username);
15
        public User? GetUserByGuid(Guid id);
16
        public User UpdateUser(User user, string? username = null, string? name = null, string? surname = null, ERole? role = null);
17
        public User ChangePassword(User user, string newPassword);
18
        public User? CheckUsernamePassword(string username, string password);
19
    }
20
}
Backend/Core/Services/UserService/UserServiceEF.cs
1
using Core.Contexts;
2
using Core.Entities;
3
using Core.Enums;
4
using System;
5
using System.Collections.Generic;
6
using System.Linq;
7
using System.Text;
8
using System.Threading.Tasks;
9
using Serilog;
10
using BCrypt.Net;
11

  
12
namespace Core.Services
13
{
14
    public class UserServiceEF : IUserService
15
    {
16
        private readonly DatabaseContext _databaseContext;
17
        private readonly ILogger _logger;
18

  
19
        public UserServiceEF(DatabaseContext context, ILogger logger)
20
        {
21
            _databaseContext = context;
22
            _logger = logger;
23
        }
24

  
25
        public User ChangePassword(User user, string newPassword)
26
        {
27
            // Check if the user is tracked by EF
28
            if (!_databaseContext.Users.Local.Any(u => u.Id == user.Id))
29
            {
30
                _logger.Information($"User {user.Username} with Guid {user.Id} is untracked by EF and password change cannot be done.");
31
                throw new InvalidOperationException("User is untracked by EF.");
32
            }
33

  
34
            user.Password = BCrypt.Net.BCrypt.HashPassword(newPassword);
35
            _databaseContext.SaveChanges();
36
            return user;
37
        }
38

  
39
        public User? CheckUsernamePassword(string username, string password)
40
        {
41
            try
42
            {
43
                // Throws exception if user does not exist
44
                User u = _databaseContext.Users.First(u => u.Username == username);
45
                if (!BCrypt.Net.BCrypt.Verify(password, u.Password))
46
                {
47
                    _logger.Information($"Password for user {username} don't match.");
48
                    return null;
49
                }
50
                return u;
51
            }
52
            catch (Exception ex)
53
            {
54
                _logger.Information($"No user with username {username} found.");
55
                return null;
56
            }
57
        }
58

  
59
        public User? CreateUser(string username, string name, string surname, string password, ERole role)
60
        {
61
            // Check if username already used
62
            if (_databaseContext.Users.Any(u => u.Username == username))
63
            {
64
                _logger.Information($"Username {username} is already used. Cannot create new user");
65
                return null;
66
            }
67

  
68
            User user = new User() { Username = username, Name = name, Surname = surname, Password = BCrypt.Net.BCrypt.HashPassword(password), Role = role };
69
            _databaseContext.Users.Add(user);
70
            _databaseContext.SaveChanges();
71
            return user;
72
        }
73

  
74
        public User? GetUserByUsername(string username)
75
        {
76
            try
77
            {
78
                // Throws exception on no user found
79
                User user = _databaseContext.Users.First(u => u.Username == username);
80
                return user;
81
            }
82
            catch (InvalidOperationException ex)
83
            {
84
                _logger.Warning($"No user with the username {username} found.");
85
                return null;
86
            }
87
        }
88

  
89
        public User? GetUserByGuid(Guid id)
90
        {
91
            try
92
            {
93
                // Throws exception on no user found
94
                User user = _databaseContext.Users.First(u => u.Id == id);
95
                return user;
96
            }
97
            catch (InvalidOperationException ex)
98
            {
99
                _logger.Warning($"No user with the GUID {id} found.");
100
                return null;
101
            }
102
        }
103

  
104
        public User UpdateUser(User user, string? username = null, string? name = null, string? surname = null, ERole? role = null)
105
        {
106
            // Check if the user is tracked by EF
107
            if (!_databaseContext.Users.Local.Any(u => u.Id == user.Id))
108
            {
109
                _logger.Information($"User {user.Username} with Guid {user.Id} is untracked by EF and update cannot be done.");
110
                throw new InvalidOperationException("User is untracked by EF.");
111
            }
112

  
113
            if (username is not null)
114
            {
115
                user.Username = username;
116
            }
117

  
118
            if (name is not null)
119
            {
120
                user.Name = name;
121
            }
122

  
123
            if (surname is not null)
124
            {
125
                user.Surname = surname;
126
            }
127

  
128
            if (role is not null)
129
            {
130
                // We know it is not null
131
                user.Role = (ERole)role;
132
            }
133

  
134
            _databaseContext.SaveChanges();
135
            return user;
136
        }
137
    }
138
}

Také k dispozici: Unified diff