1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Timeline.Entities;
using Timeline.Helpers;
namespace Timeline.Services.User.RegisterCode
{
public class RegisterCodeService : IRegisterCodeService, IDisposable
{
private readonly DatabaseContext _databaseContext;
private readonly IUserService _userService;
private readonly IClock _clock;
private readonly RandomNumberGenerator _randomNumberGenerator;
public RegisterCodeService(DatabaseContext databaseContext, IUserService userService, IClock clock)
{
_databaseContext = databaseContext;
_userService = userService;
_clock = clock;
_randomNumberGenerator = RandomNumberGenerator.Create();
}
public async Task<string> CreateNewCodeAsync(long userId)
{
await _userService.CheckUserExistenceAsync(userId);
var oldEntity = await _databaseContext.RegisterCodes.Where(r => r.OwnerId == userId && r.Enabled).SingleOrDefaultAsync();
if (oldEntity is not null)
{
oldEntity.Enabled = false;
}
var newEntity = new Entities.RegisterCode()
{
Code = _randomNumberGenerator.GenerateAlphaDigitString(6),
OwnerId = userId,
Enabled = true
};
_databaseContext.RegisterCodes.Add(newEntity);
await _databaseContext.SaveChangesAsync();
return newEntity.Code;
}
public async Task<UserRegisterInfo> CreateRegisterInfoAsync(long userId, string registerCode, DateTime registerTime)
{
await _userService.CheckUserExistenceAsync(userId);
var introducerId = await GetCodeOwnerAsync(registerCode, false);
var entity = new UserRegisterInfo()
{
UserId = userId,
IntroducerId = introducerId,
RegisterCode = registerCode,
RegisterTime = registerTime
};
_databaseContext.UserRegisterInfos.Add(entity);
await _databaseContext.SaveChangesAsync();
return entity;
}
public void Dispose()
{
_randomNumberGenerator.Dispose();
}
public async Task<long?> GetCodeOwnerAsync(string code, bool onlyEnabled = true)
{
var entity = await _databaseContext.RegisterCodes.Where(r => r.Code == code).SingleOrDefaultAsync();
if (entity is null) return null;
if (onlyEnabled && !entity.Enabled) return null;
return entity.OwnerId;
}
public async Task<string?> GetCurrentCodeAsync(long userId)
{
await _userService.CheckUserExistenceAsync(userId);
var entity = await _databaseContext.RegisterCodes.Where(r => r.OwnerId == userId && r.Enabled).SingleOrDefaultAsync();
return entity?.Code;
}
public async Task<UserRegisterInfo?> GetUserRegisterInfoAsync(long userId)
{
await _userService.CheckUserExistenceAsync(userId);
return await _databaseContext.UserRegisterInfos.Where(i => i.UserId == userId).SingleOrDefaultAsync();
}
public Task<List<UserRegisterInfo>> GetUserRegisterInfoOfIntroducerAsync(long introducerId)
{
throw new NotImplementedException();
}
public async Task<UserEntity> RegisterUserWithCode(CreateUserParams userParams, string registerCode)
{
var registerCodeOwner = await GetCodeOwnerAsync(registerCode);
if (registerCodeOwner is null)
{
throw new InvalidRegisterCodeException("Register code is invalid.");
}
var user = await _userService.CreateUserAsync(userParams);
await CreateRegisterInfoAsync(user.Id, registerCode, _clock.GetCurrentTime());
return user;
}
}
}
|