diff --git a/.gitignore b/.gitignore index ed31b08..cede3ab 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ /Dictionary.Repo/obj/ /Dictionary.Service/bin/ /Dictionary.Service/obj/ -.idea \ No newline at end of file +.idea/ \ No newline at end of file diff --git a/.idea/.idea.DATN.Web/.idea/workspace.xml b/.idea/.idea.DATN.Web/.idea/workspace.xml deleted file mode 100644 index 1950520..0000000 --- a/.idea/.idea.DATN.Web/.idea/workspace.xml +++ /dev/null @@ -1,394 +0,0 @@ - - - - DATN.Web.Api/DATN.Web.Api.csproj - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1684588731098 - - - - - - - - \ No newline at end of file diff --git a/.idea/.idea.Dictionary.App/.idea/.gitignore b/.idea/.idea.Dictionary.App/.idea/.gitignore deleted file mode 100644 index c24e2d0..0000000 --- a/.idea/.idea.Dictionary.App/.idea/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Rider ignored files -/contentModel.xml -/projectSettingsUpdater.xml -/.idea.DATN.Web.iml -/modules.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/.idea.Dictionary.App/.idea/.name b/.idea/.idea.Dictionary.App/.idea/.name deleted file mode 100644 index dcc7ff4..0000000 --- a/.idea/.idea.Dictionary.App/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -Dictionary.App \ No newline at end of file diff --git a/.idea/.idea.Dictionary.App/.idea/encodings.xml b/.idea/.idea.Dictionary.App/.idea/encodings.xml deleted file mode 100644 index df87cf9..0000000 --- a/.idea/.idea.Dictionary.App/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/.idea.Dictionary.App/.idea/git_toolbox_prj.xml b/.idea/.idea.Dictionary.App/.idea/git_toolbox_prj.xml deleted file mode 100644 index 02b915b..0000000 --- a/.idea/.idea.Dictionary.App/.idea/git_toolbox_prj.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/.idea.Dictionary.App/.idea/indexLayout.xml b/.idea/.idea.Dictionary.App/.idea/indexLayout.xml deleted file mode 100644 index 7b08163..0000000 --- a/.idea/.idea.Dictionary.App/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/.idea.Dictionary.App/.idea/sqldialects.xml b/.idea/.idea.Dictionary.App/.idea/sqldialects.xml deleted file mode 100644 index 852e673..0000000 --- a/.idea/.idea.Dictionary.App/.idea/sqldialects.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/.idea.Dictionary.App/.idea/vcs.xml b/.idea/.idea.Dictionary.App/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/.idea.Dictionary.App/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/.idea.dictionary-service/.idea/dataSources.local.xml b/.idea/.idea.dictionary-service/.idea/dataSources.local.xml deleted file mode 100644 index afed74e..0000000 --- a/.idea/.idea.dictionary-service/.idea/dataSources.local.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - #@ - ` - - - master_key - root - - - - - - - - \ No newline at end of file diff --git a/.idea/.idea.dictionary-service/.idea/dataSources.xml b/.idea/.idea.dictionary-service/.idea/dataSources.xml deleted file mode 100644 index 3542ba5..0000000 --- a/.idea/.idea.dictionary-service/.idea/dataSources.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - mariadb - true - org.mariadb.jdbc.Driver - jdbc:mariadb://localhost:3306/dictionary - $ProjectFileDir$ - - - \ No newline at end of file diff --git a/.idea/.idea.dictionary-service/.idea/dataSources/c52ef015-b6fc-4e6b-b8bc-3f8daa19a952/storage_v2/_src_/schema/information_schema.FNRwLQ.meta b/.idea/.idea.dictionary-service/.idea/dataSources/c52ef015-b6fc-4e6b-b8bc-3f8daa19a952/storage_v2/_src_/schema/information_schema.FNRwLQ.meta deleted file mode 100644 index 1ff3db2..0000000 --- a/.idea/.idea.dictionary-service/.idea/dataSources/c52ef015-b6fc-4e6b-b8bc-3f8daa19a952/storage_v2/_src_/schema/information_schema.FNRwLQ.meta +++ /dev/null @@ -1,2 +0,0 @@ -#n:information_schema -! [null, 0, null, null, -2147483648, -2147483648] diff --git a/.idea/.idea.dictionary-service/.idea/dataSources/c52ef015-b6fc-4e6b-b8bc-3f8daa19a952/storage_v2/_src_/schema/mysql.osA4Bg.meta b/.idea/.idea.dictionary-service/.idea/dataSources/c52ef015-b6fc-4e6b-b8bc-3f8daa19a952/storage_v2/_src_/schema/mysql.osA4Bg.meta deleted file mode 100644 index 86a53f1..0000000 --- a/.idea/.idea.dictionary-service/.idea/dataSources/c52ef015-b6fc-4e6b-b8bc-3f8daa19a952/storage_v2/_src_/schema/mysql.osA4Bg.meta +++ /dev/null @@ -1,2 +0,0 @@ -#n:mysql -! [null, 0, null, null, -2147483648, -2147483648] diff --git a/.idea/.idea.dictionary-service/.idea/dataSources/c52ef015-b6fc-4e6b-b8bc-3f8daa19a952/storage_v2/_src_/schema/performance_schema.kIw0nw.meta b/.idea/.idea.dictionary-service/.idea/dataSources/c52ef015-b6fc-4e6b-b8bc-3f8daa19a952/storage_v2/_src_/schema/performance_schema.kIw0nw.meta deleted file mode 100644 index 9394db1..0000000 --- a/.idea/.idea.dictionary-service/.idea/dataSources/c52ef015-b6fc-4e6b-b8bc-3f8daa19a952/storage_v2/_src_/schema/performance_schema.kIw0nw.meta +++ /dev/null @@ -1,2 +0,0 @@ -#n:performance_schema -! [null, 0, null, null, -2147483648, -2147483648] diff --git a/.idea/.idea.dictionary-service/.idea/sqldialects.xml b/.idea/.idea.dictionary-service/.idea/sqldialects.xml deleted file mode 100644 index 852e673..0000000 --- a/.idea/.idea.dictionary-service/.idea/sqldialects.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/.idea.dictionary-service/.idea/workspace.xml b/.idea/.idea.dictionary-service/.idea/workspace.xml deleted file mode 100644 index 8fc7893..0000000 --- a/.idea/.idea.dictionary-service/.idea/workspace.xml +++ /dev/null @@ -1,138 +0,0 @@ - - - - DATN.Web.Api/DATN.Web.Api.csproj - Dictionary.Api/Dictionary.Api.csproj - - - - - - - - - - - - - - - - - - - - - - FILE - - - - - - - - - - - - - - - - - - - - 1684588731098 - - - - - - - - - - - - - file://$PROJECT_DIR$/Dictionary.Service/Service/UserService.cs - 36 - - - - - - - - - - - \ No newline at end of file diff --git a/Dictionary.Api/Controllers/UserController.cs b/Dictionary.Api/Controllers/UserController.cs index 0b84be2..ed7cafb 100644 --- a/Dictionary.Api/Controllers/UserController.cs +++ b/Dictionary.Api/Controllers/UserController.cs @@ -86,7 +86,7 @@ public async Task Login([FromBody] LoginModel model) var res = await _userService.Login(model); if (res != null) { - var actionResult = new ServiceResult((int)ApiStatus.Success, Resources.getDataSuccess, "", res, null); + var actionResult = new ServiceResult((int)ApiStatus.Success, Resources.getDataSuccess, "", res, ""); return Ok(actionResult); } else @@ -98,9 +98,25 @@ public async Task Login([FromBody] LoginModel model) } catch (ValidateException exception) { - var actionResult = new ServiceResult((int)ApiStatus.Exception, exception.Message, "", 0, "400"); + var actionResult = new ServiceResult((int)ApiStatus.Exception, exception.Message, "", null, exception.resultCode.ToString()); + return Ok(actionResult); + } + catch (Exception exception) + { + var actionResult = new ServiceResult((int)ApiStatus.Exception, Resources.error, exception.Message, null, "500"); + Console.WriteLine(exception.StackTrace); return Ok(actionResult); } + } + + [HttpPost("account/forgot_password")] + public async Task ForgotPassword([FromBody] ForgotModel forgotModel) + { + try + { + var res = await _userService.ForgotPassword(forgotModel); + return Ok(res); + } catch (Exception exception) { var actionResult = new ServiceResult((int)ApiStatus.Exception, Resources.error, exception.Message, null, "500"); @@ -109,6 +125,7 @@ public async Task Login([FromBody] LoginModel model) } } + [HttpGet("token")] public async Task GetToken() { @@ -145,53 +162,74 @@ public async Task Signup([FromBody] SignupModel model) } catch (Exception exception) { - var actionResult = new ServiceResult((int)ApiStatus.Exception, Resources.error, exception.Message, null, "500"); + var actionResult = new ServiceResult(-1, Resources.error, exception.Message, null, "500"); return Ok(actionResult); } } - - [HttpPut("resetPassword")] - public async Task ResetPassword([FromBody] ResetPassword resetPassword) + + [HttpPut("user/update_password")] + + public async Task UpdatePassword([FromBody] ResetPassword resetPassword) { try { - var contextService = _contextService.Get(); - resetPassword.user_id = contextService.UserId; - await _userService.ResetPassword(resetPassword); - - var actionResult = new ServiceResult((int)ApiStatus.Success, "Cập nhật mật khẩu thành công!", "", null, null); - - return Ok(actionResult); + var res = await _userService.ResetPassword(resetPassword); + return Ok(res); } - catch (ValidateException exception) + catch (Exception exception) { - var actionResult = new ServiceResult((int)ApiStatus.Exception, exception.Message, "", 0, "400"); + var actionResult = new ServiceResult(-1, Resources.error, exception.Message, null, "500"); return Ok(actionResult); } + } + + [HttpPut("/user/reset_password")] + public async Task ResetPassword([FromBody] ResetPasswordByToken resetPasswordByToken) + { + try + { + var res = await _userService.ResetPasswordByVerifyToken(resetPasswordByToken); + return Ok(res); + } catch (Exception exception) { - var actionResult = new ServiceResult((int)ApiStatus.Exception, Resources.error, exception.Message, null, "500"); + var actionResult = new ServiceResult(-1, Resources.error, exception.Message, null, "500"); return Ok(actionResult); } } - - [HttpPut("update")] - public async Task updateUser([FromBody] UpdateUser userUpdate) + + [HttpPost("/account/send_activate_email")] + + public async Task SendActiveEmail([FromBody] SendActiveEmail sendActiveEmail) + { + { + try + { + var res = await _userService.SendActiveEmail(sendActiveEmail); + return Ok(res); + } + catch (Exception exception) + { + var actionResult = new ServiceResult(-1, Resources.error, exception.Message, null, "500"); + return Ok(actionResult); + } + } + } + + [HttpGet("/account/activate_account")] + public async Task ActiveAccount() { try { - var contextService = _contextService.Get(); - userUpdate.user_id = contextService.UserId; - var res = await _userService.UpdateUser(userUpdate); + var res = await _userService.ActiveAccount(); if (res != null) { - var actionResult = new ServiceResult((int)ApiStatus.Success, "Cập nhật thông tin tài khoản thành công!", "", null, null); - + var actionResult = new ServiceResult(1, "Cập nhật thông tin tài khoản thành công!", "", res, null); return Ok(actionResult); } else { - var actionResult = new ServiceResult((int)ApiStatus.Fail, "Cập nhật thất bại!", "", + var actionResult = new ServiceResult(2, "Cập nhật thất bại!", "", null, "204"); return Ok(actionResult); } @@ -203,21 +241,20 @@ public async Task updateUser([FromBody] UpdateUser userUpdate) } } - [HttpPut("updateStatus")] - public async Task UpdateStatus([FromBody] UpdateUser userUpdate) + [HttpPut("/user/update_user_info")] + public async Task UpdateUser([FromBody] UpdateUser userUpdate) { try { - var res = await _userService.UpdateStatus(userUpdate.is_block, userUpdate.user_id); + var res = await _userService.UpdateUser(userUpdate); if (res != null) { - var actionResult = new ServiceResult((int)ApiStatus.Success, "Cập nhật thông tin khách hàng thành công!", "", null, null); - + var actionResult = new ServiceResult(1, "Cập nhật thông tin tài khoản thành công!", "", res, null); return Ok(actionResult); } else { - var actionResult = new ServiceResult((int)ApiStatus.Fail, "Cập nhật thất bại!", "", + var actionResult = new ServiceResult(2, "Cập nhật thất bại!", "", null, "204"); return Ok(actionResult); } @@ -228,4 +265,20 @@ public async Task UpdateStatus([FromBody] UpdateUser userUpdate) return Ok(actionResult); } } + + [HttpGet("/user/logout")] + + public async Task Logout() + { + try + { + var res = new ServiceResult(1, "Logout User!", "", null, ""); + return Ok(res); + } + catch (Exception exception) + { + var actionResult = new ServiceResult((int)ApiStatus.Exception, Resources.error, exception.Message, null, "500"); + return Ok(actionResult); + } + } } \ No newline at end of file diff --git a/Dictionary.Api/appsettings.json b/Dictionary.Api/appsettings.json index ebf17e9..71ec737 100644 --- a/Dictionary.Api/appsettings.json +++ b/Dictionary.Api/appsettings.json @@ -1,6 +1,6 @@ { "ConnectionStrings": { - "DefaultConnection": "Host= 127.0.0.1; Port= 3306; Database= dictionary; User Id= root; Password = Hoangkm13@", + "DefaultConnection": "Host= 127.0.0.1; Port= 3306; Database= dictionary; User Id= root; Password =", "JwtTokenConfig": "{\"SecretKey\":\"DATN_WEB_2022_dat.dq173003\",\"ExpiredSeconds\":86400}" }, "Logging": { diff --git a/Dictionary.Repo/Repo/UserRepo.cs b/Dictionary.Repo/Repo/UserRepo.cs index c2190ea..cb1668b 100644 --- a/Dictionary.Repo/Repo/UserRepo.cs +++ b/Dictionary.Repo/Repo/UserRepo.cs @@ -41,23 +41,24 @@ public async Task GetUserInfo(Guid id) public async Task Login(LoginModel model) { var sql = string.Format(@"SELECT * FROM {0} - WHERE (email=@email) + WHERE (user_name=@user_name) LIMIT 1;", GetTableName(typeof(UserEntity))); var param = new Dictionary { - { "email", model.username } + { "user_name", model.username } }; var result = await Provider.QueryAsync(sql, param); var res = result?.FirstOrDefault(); if (res == null) - throw new ValidateException("Tài khoản không tồn tại, vui lòng kiểm tra lại", model, - int.Parse(ResultCode.WrongAccount)); + throw new ValidateException("Email hoặc mật khẩu không chính xác!", model, + 1000); - // var verified = BCrypt.Net.BCrypt.Verify(model.password, res.password); - // if (!verified) - // throw new ValidateException("Mật khẩu không chính xác, vui lòng kiểm tra lại", model, - // int.Parse(ResultCode.WrongPassword)); + var verified = (model.password == res.password); + + if (!verified) + throw new ValidateException("Email hoặc mật khẩu không chính xác!", model, + 1000); return result.FirstOrDefault(); } diff --git a/Dictionary.Service/DtoEdit/Authentication/ForgotModel.cs b/Dictionary.Service/DtoEdit/Authentication/ForgotModel.cs new file mode 100644 index 0000000..469cdf5 --- /dev/null +++ b/Dictionary.Service/DtoEdit/Authentication/ForgotModel.cs @@ -0,0 +1,6 @@ +namespace Dictionary.Service.DtoEdit.Authentication; + +public class ForgotModel +{ + public string email { get; set; } +} \ No newline at end of file diff --git a/Dictionary.Service/DtoEdit/Authentication/ResetPassword.cs b/Dictionary.Service/DtoEdit/Authentication/ResetPassword.cs index 3fe5ad1..2f046f2 100644 --- a/Dictionary.Service/DtoEdit/Authentication/ResetPassword.cs +++ b/Dictionary.Service/DtoEdit/Authentication/ResetPassword.cs @@ -4,15 +4,11 @@ namespace Dictionary.Service.DtoEdit.Authentication; public class ResetPassword { - /// - /// user_id - /// - public Guid user_id { get; set; } /// /// password hiện tại /// - public string password { get; set; } + public string old_password { get; set; } /// /// new_password diff --git a/Dictionary.Service/DtoEdit/Authentication/ResetPasswordByToken.cs b/Dictionary.Service/DtoEdit/Authentication/ResetPasswordByToken.cs new file mode 100644 index 0000000..a6f665a --- /dev/null +++ b/Dictionary.Service/DtoEdit/Authentication/ResetPasswordByToken.cs @@ -0,0 +1,8 @@ +namespace Dictionary.Service.DtoEdit.Authentication; + +public class ResetPasswordByToken +{ + public string verifyToken { get; set; } + + public string newPassword { get; set; } +} \ No newline at end of file diff --git a/Dictionary.Service/DtoEdit/Authentication/SendActiveEmail.cs b/Dictionary.Service/DtoEdit/Authentication/SendActiveEmail.cs new file mode 100644 index 0000000..d63b723 --- /dev/null +++ b/Dictionary.Service/DtoEdit/Authentication/SendActiveEmail.cs @@ -0,0 +1,8 @@ +namespace Dictionary.Service.DtoEdit.Authentication; + +public class SendActiveEmail +{ + public string username { get; set; } + + public string password { get; set; } +} \ No newline at end of file diff --git a/Dictionary.Service/DtoEdit/Authentication/SignupModel.cs b/Dictionary.Service/DtoEdit/Authentication/SignupModel.cs index 77e4a74..531d58c 100644 --- a/Dictionary.Service/DtoEdit/Authentication/SignupModel.cs +++ b/Dictionary.Service/DtoEdit/Authentication/SignupModel.cs @@ -1,74 +1,7 @@ namespace Dictionary.Service.DtoEdit.Authentication; public class SignupModel -{ - /// - /// Họ người dùng - /// - public string first_name { get; set; } - - /// - /// Tên người dùng - /// - public string last_name { get; set; } - - /// - /// Địa chỉ email của người dùng - /// - public string email { get; set; } - - /// - /// Mật khẩu đăng nhập - /// +{ + public string username { get; set; } public string password { get; set; } - - /// - /// Số điện thoại người dùng - /// - public string phone { get; set; } - - /// - /// Đường dẫn ảnh đại diện - /// - public string avatar { get; set; } - - /// - /// Tỉnh/ thành phố - /// - public string province { get; set; } - - /// - /// Mã tỉnh / thành phố - /// - public int province_code { get; set; } - - /// - /// quận/ huyện - /// - public string district { get; set; } - - /// - /// Mã quận huyện - /// - public int district_code { get; set; } - - /// - /// xã/ phường - /// - public string commune { get; set; } - - /// - /// Mã xã phường - /// - public int commune_code { get; set; } - - /// - /// Địa chỉ chi tiết - /// - public string address_detail { get; set; } - - /// - /// Giới tính - /// - public int? gender { get; set; } } \ No newline at end of file diff --git a/Dictionary.Service/DtoEdit/Authentication/UpdateUser.cs b/Dictionary.Service/DtoEdit/Authentication/UpdateUser.cs index c76e961..fcffe5a 100644 --- a/Dictionary.Service/DtoEdit/Authentication/UpdateUser.cs +++ b/Dictionary.Service/DtoEdit/Authentication/UpdateUser.cs @@ -9,35 +9,13 @@ public class UpdateUser /// public Guid user_id { get; set; } - /// - /// Họ người dùng - /// - public string first_name { get; set; } - - /// - /// Tên người dùng - /// - public string last_name { get; set; } - - /// - /// Số điện thoại người dùng - /// - public string phone { get; set; } - - /// - /// Giới tính - /// - public int? gender { get; set; } - - /// - /// Ngày sinh - /// - public DateTime? date_of_birth { get; set; } + public string displayName { get; set; } - /// - /// user_id - /// - public string email { get; set; } + public string fullName { get; set; } - public bool is_block { get; set; } + public string birthday { get; set; } + + public string position { get; set; } + + public string avatar { get; set; } } \ No newline at end of file diff --git a/Dictionary.Service/Interfaces/Service/IUserService.cs b/Dictionary.Service/Interfaces/Service/IUserService.cs index c3a53c4..a0f9c11 100644 --- a/Dictionary.Service/Interfaces/Service/IUserService.cs +++ b/Dictionary.Service/Interfaces/Service/IUserService.cs @@ -27,14 +27,14 @@ public interface IUserService : IBaseService /// Reset Password /// /// - Task ResetPassword(ResetPassword resetPassword); + Task ResetPassword(ResetPassword resetPassword); /// /// update user info /// /// /// - Task UpdateUser(UpdateUser updateUser); + Task> UpdateUser(UpdateUser updateUser); /// /// Lấy token @@ -45,4 +45,12 @@ public interface IUserService : IBaseService /// chập nhật trạng thái /// Task UpdateStatus(bool status, Guid userId); + + Task ForgotPassword(ForgotModel forgotModel); + + Task ActiveAccount(); + + Task ResetPasswordByVerifyToken(ResetPasswordByToken resetPasswordByToken); + + Task SendActiveEmail(SendActiveEmail sendActiveEmail); } \ No newline at end of file diff --git a/Dictionary.Service/Middlewares/AuthenContextHandleMiddleware.cs b/Dictionary.Service/Middlewares/AuthenContextHandleMiddleware.cs index 8fcb7fb..31d86ee 100644 --- a/Dictionary.Service/Middlewares/AuthenContextHandleMiddleware.cs +++ b/Dictionary.Service/Middlewares/AuthenContextHandleMiddleware.cs @@ -126,6 +126,12 @@ private bool NoRequestAuthentication(string path) "/api/Users/signup", //test "/api/Dictionaries", + "api/Users/account/forgot_password", + "api/Users/user/update_password", + "user/update_user_info", + "/user/logout", + "/user/reset_password", + "/account/send_activate_email" }; if (lstPath.Any(x => path.Contains(x))) return true; return false; diff --git a/Dictionary.Service/Model/UserEntity.cs b/Dictionary.Service/Model/UserEntity.cs index ed51e37..42a7c6e 100644 --- a/Dictionary.Service/Model/UserEntity.cs +++ b/Dictionary.Service/Model/UserEntity.cs @@ -35,4 +35,6 @@ public class UserEntity public DateTime created_at { get; set; } public DateTime modified_at { get; set; } + + public string verify_token { get; set; } } \ No newline at end of file diff --git a/Dictionary.Service/Service/UserService.cs b/Dictionary.Service/Service/UserService.cs index 62a9406..997bf4b 100644 --- a/Dictionary.Service/Service/UserService.cs +++ b/Dictionary.Service/Service/UserService.cs @@ -67,27 +67,48 @@ public async Task> Login(LoginModel model) /// /// Reset Password /// - public async Task ResetPassword(ResetPassword resetPassword) + public async Task ResetPassword(ResetPassword resetPassword) { - var field = "user_id"; - object value = resetPassword.user_id; - - var existedUser = await _userRepo.GetAsync(field, value); + Guid user_id = new Guid("b0da65f9-dc39-11ed-a1e6-a44cc8756a37"); + var existedUser = await _userRepo.GetAsync("user_id", user_id); var res = existedUser.FirstOrDefault(); - if (res == null) throw new ValidateException("User doesn't exist", "", 400); - var verified = BCrypt.Net.BCrypt.Verify(resetPassword.password, res.password); + if (res == null) + { + return new ServiceResult( + 2, + "Người dùng không tồn tại", + "", + null, + "400" + ); + } + var verified = resetPassword.old_password == res.password; if (!verified) - throw new ValidateException("Mật khẩu không chính xác, vui lòng kiểm tra lại", 0, - int.Parse(ResultCode.WrongPassword)); - var encodedData = BCrypt.Net.BCrypt.HashPassword(resetPassword.new_password); - res.password = encodedData; + { + return new ServiceResult( + 2, + "Mật khẩu cũ không chính xaác!", + "", + null, + "1000" + ); + } + + res.password = resetPassword.new_password; await _userRepo.UpdateAsync(res, "password"); + + return new ServiceResult( + 1, + "Cập nhật mật khẩu thành công!", + "", + null, + "" + ); } - - - public async Task UpdateUser(UpdateUser updateUser) + + public async Task> UpdateUser(UpdateUser updateUser) { var field = "user_id"; object value = updateUser.user_id; @@ -95,29 +116,39 @@ public async Task UpdateUser(UpdateUser updateUser) var existedUser = await _userRepo.GetAsync(field, value); var res = existedUser.FirstOrDefault(); - if (res == null) throw new ValidateException("User doesn't exist", null, 400); - res.email = updateUser.email; - res.birthday = updateUser.date_of_birth; + if (res == null) return null; + res.birthday = DateTime.Parse(updateUser.birthday); + res.avatar = updateUser.avatar; + res.full_name = updateUser.fullName; + res.position = updateUser.position; + res.display_name = updateUser.displayName; await _userRepo.UpdateAsync(res); - var data = await _userRepo.GetUserInfo(updateUser.user_id); - - return data; + return new Dictionary + { + {"displayName", res.display_name}, + {"avatar", res.avatar} + }; } public async Task Signup(SignupModel model) { var newUser = new UserEntity(); newUser.user_id = Guid.NewGuid(); - newUser.email = model.email; - newUser.password = BCrypt.Net.BCrypt.HashPassword(model.password); - // newUser.avatar = Common.SaveImage(_httpContextAccessor.HttpContext.Request.Host.Value, model.avatar); + newUser.email = model.username; + newUser.password = model.password; + // Check tồn tại Email var existUserEmail = (await _userRepo.GetAsync("email", newUser.email))?.FirstOrDefault(); - // if (existUserEmail != null) - // return new ServiceResult(int.Parse(ResultCode.ExistEmail), Resources.msgExistEmail, "", newUser); - // Check tồn tại Số điện thoại + if (existUserEmail != null) + return new ServiceResult( + 2, + Resources.msgExistEmail, + "", + null, + "1001"); + var user = await _userRepo.InsertAsync(newUser); var context = new ContextData(); @@ -132,8 +163,7 @@ public async Task Signup(SignupModel model) .GetConnectionString("JwtTokenConfig")); var data = await GetContextReturn(context, jwtTokenConfig); - // return new ServiceResult(200, Resources.signupSuccess, "", data); - return null; + return new ServiceResult(1, Resources.signupSuccess, "", data, ""); } public async Task> GetToken(Guid userId) @@ -165,11 +195,107 @@ public async Task UpdateStatus(bool status, Guid userId) return user; } - /// - /// Lấy thông tin trả về client - /// - /// - /// Thời gian hết hạn + public async Task ForgotPassword(ForgotModel forgotModel) + { + var user = await _userRepo.GetAsync("email", forgotModel.email); + + var foundUser = user.FirstOrDefault(); + + if (foundUser == null) + { + return new ServiceResult(2, "Không tồn tại email người dùng!" , "", null, "1002"); + } + + return new ServiceResult(1, "Send verify token successfully!", "", null, ""); + } + + public async Task ActiveAccount() + { + string verifyToken = "verify_token_example"; + Guid user_id = new Guid("b0da65f9-dc39-11ed-a1e6-a44cc8756a37"); + + var query_user = await _userRepo.GetAsync("user_id", user_id); + + var user = query_user.FirstOrDefault(); + + if (user == null) + { + return new ServiceResult(2, "User not exist!", "", null, "1001"); + } + + if (user.verify_token != verifyToken) + { + return new ServiceResult(2, "Token không hợp lệ!", "", null, "1003"); + } + + if (user.status == 1) + { + return new ServiceResult(2, "Người dùng đã kích hoạt tài khoản!", "", null, "9000"); + } + + user.status = 1; + user.verify_token = ""; + + await UpdateAsync(user); + + return new ServiceResult(1, "Kích hoạt tài khoản thành công!", "", null, ""); + } + + public async Task ResetPasswordByVerifyToken(ResetPasswordByToken resetPasswordByToken) + { + string verifyToken = resetPasswordByToken.verifyToken; + Guid user_id = new Guid("b0da65f9-dc39-11ed-a1e6-a44cc8756a37"); + + var query_user = await _userRepo.GetAsync("user_id", user_id); + + var user = query_user.FirstOrDefault(); + + if (user == null) + { + return new ServiceResult(2, "User not exist!", "", null, "1001"); + } + + if (user.verify_token != verifyToken) + { + return new ServiceResult(2, "Token không hợp lệ!", "", null, "1003"); + } + + user.password = resetPasswordByToken.newPassword; + user.verify_token = ""; + + await _userRepo.UpdateAsync(user); + + return new ServiceResult(1, "Cập nhật mật khẩu thành công!", "", null, ""); + } + + public async Task SendActiveEmail(SendActiveEmail sendActiveEmail) + { + var query_user = await _userRepo.GetAsync("email", sendActiveEmail.username); + + var user = query_user.FirstOrDefault(); + + if (user == null) + { + return new ServiceResult(2, "Email chưa được đăng ký!", "", null, "1003"); + } + + if (user.status == 1) + { + return new ServiceResult(2, "Tài khoản đã được kích hoạt!", "", null, "1003"); + } + + if (user.password != sendActiveEmail.password) + { + return new ServiceResult(2, "Tài khoản không tồn tại!", "", null, "1003"); + } + + user.verify_token = "verify_token"; + + await _userRepo.UpdateAsync(user); + + return new ServiceResult(1, "Gửi token kích hoạt tài khoản thành công!", "", null, ""); + } + private async Task> GetContextReturn(ContextData context, JwtTokenConfig jwtTokenConfig) {