From eed625c7222d01561ee4681596b67bf416b8f3f2 Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Sun, 16 Nov 2025 03:28:34 +0330 Subject: [PATCH] udpate --- docs/model.ndm2 | 169 +++++++++++++++++- .../Interfaces/IApplicationContractContext.cs | 2 + .../Common/Interfaces/ICurrentUserService.cs | 3 + .../AcceptContractCommandHandler.cs | 14 +- .../CreateContractOtpTokenCommand.cs | 7 - .../CreateContractOtpTokenCommandHandler.cs | 22 --- .../CreateContractOtpTokenCommandValidator.cs | 14 -- .../CreateNewOtpTokenCommandHandler.cs | 32 +++- .../FrontOffice.BFF.Domain.csproj | 2 +- .../Common/Services/CurrentUserService.cs | 3 + .../Services/UserService.cs | 1 - .../CreateContractOtpTokenRequestValidator.cs | 17 -- 12 files changed, 216 insertions(+), 70 deletions(-) delete mode 100644 src/FrontOffice.BFF.Application/UserCQ/Commands/CreateContractOtpToken/CreateContractOtpTokenCommand.cs delete mode 100644 src/FrontOffice.BFF.Application/UserCQ/Commands/CreateContractOtpToken/CreateContractOtpTokenCommandHandler.cs delete mode 100644 src/FrontOffice.BFF.Application/UserCQ/Commands/CreateContractOtpToken/CreateContractOtpTokenCommandValidator.cs delete mode 100644 src/Protobufs/FrontOffice.BFF.User.Protobuf/Validator/CreateContractOtpTokenRequestValidator.cs diff --git a/docs/model.ndm2 b/docs/model.ndm2 index 0bec124..8c6be85 100644 --- a/docs/model.ndm2 +++ b/docs/model.ndm2 @@ -13402,6 +13402,26 @@ "sourceCardinality": "NoneRelationship", "targetCardinality": "NoneRelationship", "oldName": "" + }, + { + "objectType": "ForeignKey_MSSQL", + "name": "fk_UserService_AcceptContractRequestResponse_1", + "fields": [ + "AcceptContract" + ], + "referencedSchema": "FrontOffice", + "referencedTable": "AcceptContractRequestResponse", + "referencedFields": [ + "Token" + ], + "onDelete": "", + "onUpdate": "", + "isNotForReplication": false, + "isEnabled": true, + "comment": "", + "sourceCardinality": "NoneRelationship", + "targetCardinality": "NoneRelationship", + "oldName": "" } ], "uniques": [], @@ -13685,7 +13705,7 @@ "indexes": [], "primaryKey": { "objectType": "PrimaryKey_MSSQL", - "name": "", + "name": "_copy_15", "fields": [], "fillFactor": 0, "oldName": "", @@ -13726,6 +13746,99 @@ "filestreamPartitionScheme": "", "dataCompressions": [] } + }, + { + "objectType": "Table_MSSQL", + "name": "AcceptContractRequestResponse", + "comment": "خروجی واکشی توکن", + "owner": "", + "isChangeTracking": false, + "isTrackColumnsUpdated": false, + "oldName": "", + "isSystemTable": false, + "createTime": "", + "modifyTime": "", + "objectID": 6042, + "numberOfRows": 0, + "identityCurrent": 0, + "dataLength": 0, + "indexLength": 0, + "fields": [ + { + "objectType": "TableField_MSSQL", + "name": "Token", + "type": "nvarchar", + "size": -2147483648, + "isNullable": "No", + "scale": -2147483648, + "comment": "توکن", + "computedExpression": "", + "defaultValue": "", + "defaultValueType": "Others", + "schema": "", + "userDefinedType": "", + "collate": "", + "isWithValues": false, + "isFilestream": false, + "isColumnSet": false, + "isPersisted": false, + "isSparse": false, + "isRowGUIDColumn": false, + "oldName": "Token", + "computedBaseType": "", + "isDefaultConstraint": false, + "defaultConstraint": "", + "isIdentity": true, + "isExistingField": false, + "identitySeed": -2147483648, + "identityIncrement": -2147483648, + "identityIsNotForReplication": false + } + ], + "indexes": [], + "primaryKey": { + "objectType": "PrimaryKey_MSSQL", + "name": "_copy_46_copy_1_copy_1", + "fields": [], + "fillFactor": 0, + "oldName": "", + "isClustered": false, + "isPadded": false, + "noRecomputeStatistics": false, + "ignoreDuplicatedKeyValues": false, + "allowRowLocks": false, + "allowPageLocks": false, + "storage": { + "objectType": "Storage_MSSQL", + "name": "", + "oldName": "", + "storageType": "Default", + "filegroup": "", + "textImageFilegroup": "", + "filestreamFilegroup": "", + "partitionScheme": "", + "partitionColumn": "", + "filestreamPartitionScheme": "", + "dataCompressions": [] + } + }, + "foreignKeys": [], + "uniques": [], + "checks": [], + "triggers": [], + "storage": { + "objectType": "Storage_MSSQL", + "name": "", + "oldName": "", + "storageType": "Default", + "filegroup": "", + "textImageFilegroup": "", + "filestreamFilegroup": "", + "partitionScheme": "", + "partitionColumn": "", + "filestreamPartitionScheme": "", + "dataCompressions": [] + } } ], "views": [] @@ -14707,6 +14820,22 @@ "b": 147, "a": 1 } + }, + { + "type": "table", + "schemaName": "FrontOffice", + "tableName": "AcceptContractRequestResponse", + "x": 604, + "y": 3227, + "width": 400, + "height": 106, + "isBold": false, + "titleColor": { + "r": 200, + "g": 255, + "b": 160, + "a": 1 + } } ], "layers": [], @@ -16944,6 +17073,44 @@ "isFontItalic": false, "isVisible": false } + }, + { + "name": "fk_UserService_AcceptContractRequestResponse_1", + "sourceTableName": "UserService", + "sourceSchemaName": "FrontOffice", + "lineWidth": 1, + "visible": true, + "vertices": [ + { + "x": 965, + "y": 3590 + }, + { + "x": 804, + "y": 3590 + }, + { + "x": 804, + "y": 3348 + } + ], + "label": { + "x": 628, + "y": 3550, + "width": 347, + "height": 32, + "fontName": "Sans", + "fontSize": 14, + "fontColor": { + "r": 51, + "g": 51, + "b": 51, + "a": 1 + }, + "isFontBold": false, + "isFontItalic": false, + "isVisible": false + } } ], "viewRelations": [] diff --git a/src/FrontOffice.BFF.Application/Common/Interfaces/IApplicationContractContext.cs b/src/FrontOffice.BFF.Application/Common/Interfaces/IApplicationContractContext.cs index af83bd7..226f181 100644 --- a/src/FrontOffice.BFF.Application/Common/Interfaces/IApplicationContractContext.cs +++ b/src/FrontOffice.BFF.Application/Common/Interfaces/IApplicationContractContext.cs @@ -2,6 +2,7 @@ using CMSMicroservice.Protobuf.Protos.OtpToken; using CMSMicroservice.Protobuf.Protos.Package; using CMSMicroservice.Protobuf.Protos.User; using CMSMicroservice.Protobuf.Protos.UserAddress; +using CMSMicroservice.Protobuf.Protos.UserContract; using CMSMicroservice.Protobuf.Protos.UserOrder; using PYMSMicroservice.Protobuf.Protos.Transaction; @@ -18,6 +19,7 @@ public interface IApplicationContractContext #region CMS PackageContract.PackageContractClient Package { get; } UserContract.UserContractClient User { get; } + UserContractContract.UserContractContractClient UserContract { get; } UserAddressContract.UserAddressContractClient UserAddress { get; } UserOrderContract.UserOrderContractClient UserOrder { get; } OtpTokenContract.OtpTokenContractClient OtpToken { get; } diff --git a/src/FrontOffice.BFF.Application/Common/Interfaces/ICurrentUserService.cs b/src/FrontOffice.BFF.Application/Common/Interfaces/ICurrentUserService.cs index af29fdd..7971ee2 100644 --- a/src/FrontOffice.BFF.Application/Common/Interfaces/ICurrentUserService.cs +++ b/src/FrontOffice.BFF.Application/Common/Interfaces/ICurrentUserService.cs @@ -3,4 +3,7 @@ namespace FrontOffice.BFF.Application.Common.Interfaces; public interface ICurrentUserService { string? UserId { get; } + string? FirstName { get; } + string? LastName { get; } + string? MobileNumber { get; } } diff --git a/src/FrontOffice.BFF.Application/UserCQ/Commands/AcceptContract/AcceptContractCommandHandler.cs b/src/FrontOffice.BFF.Application/UserCQ/Commands/AcceptContract/AcceptContractCommandHandler.cs index 266ee9b..1b9ebc6 100644 --- a/src/FrontOffice.BFF.Application/UserCQ/Commands/AcceptContract/AcceptContractCommandHandler.cs +++ b/src/FrontOffice.BFF.Application/UserCQ/Commands/AcceptContract/AcceptContractCommandHandler.cs @@ -1,16 +1,26 @@ +using CMSMicroservice.Protobuf.Protos.UserContract; + namespace FrontOffice.BFF.Application.UserCQ.Commands.AcceptContract; public class AcceptContractCommandHandler : IRequestHandler { private readonly IApplicationContractContext _context; + private readonly ICurrentUserService _currentUserService; - public AcceptContractCommandHandler(IApplicationContractContext context) + public AcceptContractCommandHandler(IApplicationContractContext context, ICurrentUserService currentUserService) { _context = context; + _currentUserService = currentUserService; } public async Task Handle(AcceptContractCommand request, CancellationToken cancellationToken) { - //TODO: Implement your business logic + await _context.UserContract.CreateNewUserContractAsync(new CreateNewUserContractRequest() + { + SignGuid = request.SignGuid, + UserId = long.Parse(_currentUserService.UserId ?? throw new InvalidOperationException()), + ContractId = 1, + SignedPdfFile = request.ContractHtml, + }, cancellationToken: cancellationToken); return new Unit(); } } diff --git a/src/FrontOffice.BFF.Application/UserCQ/Commands/CreateContractOtpToken/CreateContractOtpTokenCommand.cs b/src/FrontOffice.BFF.Application/UserCQ/Commands/CreateContractOtpToken/CreateContractOtpTokenCommand.cs deleted file mode 100644 index cd02dce..0000000 --- a/src/FrontOffice.BFF.Application/UserCQ/Commands/CreateContractOtpToken/CreateContractOtpTokenCommand.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace FrontOffice.BFF.Application.UserCQ.Commands.CreateContractOtpToken; -public record CreateContractOtpTokenCommand : IRequest -{ - //شناسه یکتای قرارداد - public string? CotractGuid { get; init; } - -} \ No newline at end of file diff --git a/src/FrontOffice.BFF.Application/UserCQ/Commands/CreateContractOtpToken/CreateContractOtpTokenCommandHandler.cs b/src/FrontOffice.BFF.Application/UserCQ/Commands/CreateContractOtpToken/CreateContractOtpTokenCommandHandler.cs deleted file mode 100644 index 582500d..0000000 --- a/src/FrontOffice.BFF.Application/UserCQ/Commands/CreateContractOtpToken/CreateContractOtpTokenCommandHandler.cs +++ /dev/null @@ -1,22 +0,0 @@ -using CMSMicroservice.Protobuf.Protos.OtpToken; - -namespace FrontOffice.BFF.Application.UserCQ.Commands.CreateContractOtpToken; -public class CreateContractOtpTokenCommandHandler : IRequestHandler -{ - private readonly IApplicationContractContext _context; - - public CreateContractOtpTokenCommandHandler(IApplicationContractContext context) - { - _context = context; - } - - public async Task Handle(CreateContractOtpTokenCommand request, CancellationToken cancellationToken) - { - var response = await _context.OtpToken.CreateNewOtpTokenAsync(request: new CreateNewOtpTokenRequest() - { - - }, cancellationToken: cancellationToken); - if (response.Success && !string.IsNullOrWhiteSpace(response.Code)) - await _kavenegarService.VerifyLookup(mobile: request.Mobile, response.Code); - } -} diff --git a/src/FrontOffice.BFF.Application/UserCQ/Commands/CreateContractOtpToken/CreateContractOtpTokenCommandValidator.cs b/src/FrontOffice.BFF.Application/UserCQ/Commands/CreateContractOtpToken/CreateContractOtpTokenCommandValidator.cs deleted file mode 100644 index 651cea0..0000000 --- a/src/FrontOffice.BFF.Application/UserCQ/Commands/CreateContractOtpToken/CreateContractOtpTokenCommandValidator.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace FrontOffice.BFF.Application.UserCQ.Commands.CreateContractOtpToken; -public class CreateContractOtpTokenCommandValidator : AbstractValidator -{ - public CreateContractOtpTokenCommandValidator() - { - } - public Func>> ValidateValue => async (model, propertyName) => - { - var result = await ValidateAsync(ValidationContext.CreateWithOptions((CreateContractOtpTokenCommand)model, x => x.IncludeProperties(propertyName))); - if (result.IsValid) - return Array.Empty(); - return result.Errors.Select(e => e.ErrorMessage); - }; -} diff --git a/src/FrontOffice.BFF.Application/UserCQ/Commands/CreateNewOtpToken/CreateNewOtpTokenCommandHandler.cs b/src/FrontOffice.BFF.Application/UserCQ/Commands/CreateNewOtpToken/CreateNewOtpTokenCommandHandler.cs index e5d7547..4b684d2 100644 --- a/src/FrontOffice.BFF.Application/UserCQ/Commands/CreateNewOtpToken/CreateNewOtpTokenCommandHandler.cs +++ b/src/FrontOffice.BFF.Application/UserCQ/Commands/CreateNewOtpToken/CreateNewOtpTokenCommandHandler.cs @@ -1,22 +1,44 @@ +using System.Text; using CMSMicroservice.Protobuf.Protos.OtpToken; namespace FrontOffice.BFF.Application.UserCQ.Commands.CreateNewOtpToken; + public class CreateNewOtpTokenCommandHandler : IRequestHandler { private readonly IApplicationContractContext _context; private readonly IKavenegarService _kavenegarService; + private readonly ICurrentUserService _currentUserService; - public CreateNewOtpTokenCommandHandler(IApplicationContractContext context, IKavenegarService kavenegarService) + public CreateNewOtpTokenCommandHandler(IApplicationContractContext context, IKavenegarService kavenegarService, ICurrentUserService currentUserService) { _context = context; _kavenegarService = kavenegarService; + _currentUserService = currentUserService; } - public async Task Handle(CreateNewOtpTokenCommand request, CancellationToken cancellationToken) + public async Task Handle(CreateNewOtpTokenCommand request, + CancellationToken cancellationToken) { - var response = await _context.OtpToken.CreateNewOtpTokenAsync(request: request.Adapt(), cancellationToken: cancellationToken); + var response = + await _context.OtpToken.CreateNewOtpTokenAsync(request: request.Adapt(), + cancellationToken: cancellationToken); + if (response.Success && !string.IsNullOrWhiteSpace(response.Code)) - await _kavenegarService.VerifyLookup(mobile: request.Mobile, response.Code); + { + if (!string.IsNullOrWhiteSpace(request.SignGuid)) + await _kavenegarService.Send(mobile: request.Mobile, new StringBuilder("سلام ") + .Append(_currentUserService.FirstName+" "+_currentUserService.LastName) + .Append(" عزیز") + .AppendLine("کد یک بار مصرف شما: ") + .Append(response.Code) + .AppendLine("شناسه امضاء: ") + .AppendLine(request.SignGuid) + .AppendLine("کارابازار") + .ToString()); + else + await _kavenegarService.VerifyLookup(mobile: request.Mobile, response.Code); + } + return response.Adapt(); } -} +} \ No newline at end of file diff --git a/src/FrontOffice.BFF.Domain/FrontOffice.BFF.Domain.csproj b/src/FrontOffice.BFF.Domain/FrontOffice.BFF.Domain.csproj index e230e35..9a6dc8f 100644 --- a/src/FrontOffice.BFF.Domain/FrontOffice.BFF.Domain.csproj +++ b/src/FrontOffice.BFF.Domain/FrontOffice.BFF.Domain.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/FrontOffice.BFF.WebApi/Common/Services/CurrentUserService.cs b/src/FrontOffice.BFF.WebApi/Common/Services/CurrentUserService.cs index 1a2de5f..5e63265 100644 --- a/src/FrontOffice.BFF.WebApi/Common/Services/CurrentUserService.cs +++ b/src/FrontOffice.BFF.WebApi/Common/Services/CurrentUserService.cs @@ -14,4 +14,7 @@ public class CurrentUserService : ICurrentUserService } public string? UserId => _httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier); + public string? FirstName => _httpContextAccessor.HttpContext?.User?.FindFirstValue("FirstName"); + public string? LastName => _httpContextAccessor.HttpContext?.User?.FindFirstValue("LastName"); + public string? MobileNumber => _httpContextAccessor.HttpContext?.User?.FindFirstValue("MobileNumber"); } diff --git a/src/FrontOffice.BFF.WebApi/Services/UserService.cs b/src/FrontOffice.BFF.WebApi/Services/UserService.cs index c324e88..0adc47f 100644 --- a/src/FrontOffice.BFF.WebApi/Services/UserService.cs +++ b/src/FrontOffice.BFF.WebApi/Services/UserService.cs @@ -1,5 +1,4 @@ using FrontOffice.BFF.Application.UserCQ.Commands.AcceptContract; -using FrontOffice.BFF.Application.UserCQ.Commands.CreateContractOtpToken; using FrontOffice.BFF.WebApi.Common.Services; using FrontOffice.BFF.Application.UserCQ.Commands.UpdateUser; using FrontOffice.BFF.Application.UserCQ.Commands.DeleteUser; diff --git a/src/Protobufs/FrontOffice.BFF.User.Protobuf/Validator/CreateContractOtpTokenRequestValidator.cs b/src/Protobufs/FrontOffice.BFF.User.Protobuf/Validator/CreateContractOtpTokenRequestValidator.cs deleted file mode 100644 index a96e901..0000000 --- a/src/Protobufs/FrontOffice.BFF.User.Protobuf/Validator/CreateContractOtpTokenRequestValidator.cs +++ /dev/null @@ -1,17 +0,0 @@ -using FluentValidation; -using FrontOffice.BFF.User.Protobuf.Protos.User; -namespace FrontOfficeMicroservice.Protobuf.Validator.User; - -public class CreateContractOtpTokenRequestValidator : AbstractValidator -{ - public CreateContractOtpTokenRequestValidator() - { - } - public Func>> ValidateValue => async (model, propertyName) => - { - var result = await ValidateAsync(ValidationContext.CreateWithOptions((CreateContractOtpTokenRequest)model, x => x.IncludeProperties(propertyName))); - if (result.IsValid) - return Array.Empty(); - return result.Errors.Select(e => e.ErrorMessage); - }; -}