public Result Remove(string id)
        {
            _logger.LogInformation($"Removing Invite. InviteId {id}");

            BaseSpecification <InviteEntity> baseSpecification = new BaseSpecification <InviteEntity>();

            baseSpecification.AddFilter(x => x.Id == id);

            InviteEntity invite = _inviteRepository.SingleOrDefault(baseSpecification);

            if (invite == null)
            {
                _logger.LogError($"No Invite. InviteId {id}");
                return(Result.Fail("no_invite", "No Invite"));
            }

            bool removeResult = _inviteRepository.Remove(invite);

            if (!removeResult)
            {
                _logger.LogError($"Failed to remove invite. InviteId {id}");
                return(Result.Fail("failed_to_remove_invite", "Failed to remove invite"));
            }

            return(Result.Ok());
        }
Beispiel #2
0
        private async Task LinkInviteCode(Guid userId, Guid inviteCode, DatabaseContext context)
        {
            InviteEntity invite = await context.Invite.FindAsync(inviteCode);

            invite.UsedBy = userId;
            context.Update(invite);
        }
        private async Task <Result> AddInvite(InviteEntity inviteEntity)
        {
            bool addInvite = _inviteRepository.Add(inviteEntity);

            if (!addInvite)
            {
                _logger.LogError($"Failed to add invite");
                return(Result.Fail("failed_to_add_invite", "Failed to add invite"));
            }

            _logger.LogInformation($"Invite was added, sending email");

            string callbackUrl = QueryHelpers.AddQueryString($"{_identityManagementOptions.BasePath}{_identityManagementEndpoints.AcceptInvite}", "code", inviteEntity.Token);

            callbackUrl = HtmlEncoder.Default.Encode(callbackUrl);

            Result sendMailResult = await _mailService.SendInvite(inviteEntity.Email, callbackUrl);

            if (sendMailResult.Failure)
            {
                return(Result.Fail(sendMailResult.Errors));
            }

            return(Result.Ok());
        }
Beispiel #4
0
        /// <summary>
        /// Метод получает список ставок к заданию.
        /// </summary>
        /// <param name="taskId">Id задания, для которого нужно получить список ставок.</param>
        /// <param name="account">Логин пользователя.</param>
        /// <returns>Список ставок.</returns>
        public async Task <GetRespondResultOutput> GetRespondsAsync(long taskId, string account)
        {
            try
            {
                if (taskId == 0)
                {
                    throw new NullTaskIdException();
                }

                IEnumerable respondsList = await GetRespondsListAsync(taskId);

                GetRespondResultOutput result = new GetRespondResultOutput();

                // Находит Id исполнителя.
                string userId = await _userService.GetUserIdByLogin(account);

                // Приведет к типу коллекции GetRespondResultOutput.
                foreach (object respond in respondsList)
                {
                    string        jsonString   = JsonSerializer.Serialize(respond);
                    RespondOutput resultObject = JsonSerializer.Deserialize <RespondOutput>(jsonString);

                    // Если исполнитель оставлял ставку к данному заданию, то проставит флаг видимости кнопки "ИЗМЕНИТЬ СТАВКУ", иначе скроет ее.
                    if (resultObject.ExecutorId.Equals(userId))
                    {
                        resultObject.IsVisibleButton = true;
                    }

                    // Выберет приглашение.
                    InviteEntity invite = await _postgre.Invities
                                          .Where(c => c.TaskId == taskId && c.ExecutorId.Equals(resultObject.ExecutorId))
                                          .FirstOrDefaultAsync();

                    if (invite != null && !string.IsNullOrEmpty(invite.ExecutorId) && invite.TaskId > 0)
                    {
                        if (invite.IsAccept)
                        {
                            resultObject.IsSendInvite = true;
                        }

                        if (invite.IsCancel)
                        {
                            resultObject.IsCancelInvite = true;
                        }
                    }

                    result.Responds.Add(resultObject);
                }

                return(result);
            }

            catch (Exception ex)
            {
                Logger _logger = new Logger(_db, ex.GetType().FullName, ex.Message.ToString(), ex.StackTrace);
                await _logger.LogCritical();

                throw new Exception(ex.Message.ToString());
            }
        }
Beispiel #5
0
        private async Task <Result> Remove(InviteEntity invite)
        {
            bool removeResult = await _inviteDAO.Remove(invite);

            if (!removeResult)
            {
                _logger.LogError($"Failed to remove invite");
                return(Result.Fail(FAILED_TO_REMOVE_INVITE));
            }

            return(Result.Ok());
        }
Beispiel #6
0
        private async Task CheckIfInviteIsValid(DatabaseContext context, Guid inviteCode)
        {
            InviteEntity invite = await context.Invite.FindAsync(inviteCode);

            if (invite == null)
            {
                throw new Exception("The invite does not exist.");
            }

            if (invite.UsedBy != null)
            {
                throw new Exception("This Invite has allready been used.");
            }
        }
        public Task <Result> Invite(InviteRequest inviteRequest)
        {
            _logger.LogInformation($"Adding new invite");

            ValidationResult validationResult = _inviteRequestValidator.Validate(inviteRequest);

            if (!validationResult.IsValid)
            {
                _logger.LogWarning($"Invalid {nameof(InviteToGroupRequest)} model");
                return(Task.FromResult(Result.Fail(validationResult.Errors)));
            }

            Result canInviteResult = CanInvite(inviteRequest.Email);

            if (canInviteResult.Failure)
            {
                return(Task.FromResult(Result.Fail(canInviteResult.Errors)));
            }

            if (inviteRequest.RoleId != null)
            {
                Result globalRoleExists = GlobalRoleExists(inviteRequest.RoleId);
                if (globalRoleExists.Failure)
                {
                    return(Task.FromResult(Result.Fail(globalRoleExists.Errors)));
                }
            }

            if (inviteRequest.GroupId != null)
            {
                Result isGroupInviteValid = IsGroupInviteValid(inviteRequest.GroupId, inviteRequest.GroupRoleId);
                if (isGroupInviteValid.Failure)
                {
                    return(Task.FromResult(Result.Fail(isGroupInviteValid.Errors)));
                }
            }

            InviteEntity inviteEntity = new InviteEntity(
                email: inviteRequest.Email,
                token: StringUtils.GenerateToken(),
                status: Data.Enums.Entity.InviteStatuses.Pending,
                roleId: inviteRequest.RoleId,
                groupId: inviteRequest.GroupId,
                groupRoleId: inviteRequest.GroupRoleId,
                expiresAt: DateTimeOffset.UtcNow.Add(_identityManagementEndpoints.InviteValidForTimeSpan));

            return(AddInvite(inviteEntity));
        }
Beispiel #8
0
        public async Task <Result> Remove(string groupId, string inviteId)
        {
            IBaseSpecification <InviteEntity, InviteEntity> specification = SpecificationBuilder
                                                                            .Create <InviteEntity>()
                                                                            .Where(x => x.Id == inviteId)
                                                                            .Where(x => x.GroupId == groupId)
                                                                            .Build();

            InviteEntity invite = await _inviteDAO.SingleOrDefault(specification);

            if (invite == null)
            {
                _logger.LogError($"Invite not found. InviteId {inviteId}, GroupId {groupId}");
                return(Result.Fail(INVITE_NOT_FOUND));
            }

            return(await Remove(invite));
        }
Beispiel #9
0
        public Core.Models.Result.Result Remove(string id)
        {
            _logger.LogInformation($"Removing Invite. InviteId {id}");

            IBaseSpecification <InviteEntity, InviteEntity> specification = SpecificationBuilder
                                                                            .Create <InviteEntity>()
                                                                            .Where(x => x.Id == id)
                                                                            .Build();

            InviteEntity invite = _inviteDAO.SingleOrDefault(specification).Result;

            if (invite == null)
            {
                _logger.LogError($"No Invite. InviteId {id}");
                return(Result.Fail(INVITE_NOT_FOUND).ToOldResult());
            }

            return(Remove(invite).Result.ToOldResult());
        }
Beispiel #10
0
        public async Task <Result> AcceptInvite(AcceptInviteRequest acceptInvite)
        {
            ValidationResult acceptInviteValidationResult  = _acceptInviteValidator.Validate(acceptInvite);
            ValidationResult userAttributeValidationResult = _userAttributeRequestValidator.Validate(acceptInvite);

            if (!acceptInviteValidationResult.IsValid || !userAttributeValidationResult.IsValid)
            {
                _logger.LogWarning($"Invalid {nameof(AcceptInviteRequest)} model");

                List <Result.ResultError> errors = ResultUtils.ToResultError(acceptInviteValidationResult.Errors);
                errors.AddRange(ResultUtils.ToResultError(userAttributeValidationResult.Errors));

                return(Result.Fail(errors));
            }

            BaseSpecification <InviteEntity> getInviteSpecification = new BaseSpecification <InviteEntity>();

            getInviteSpecification.AddFilter(x => x.Token == acceptInvite.Code);
            getInviteSpecification.AddFilter(x => x.Status == Data.Enums.Entity.InviteStatuses.Pending);

            InviteEntity inviteEntity = _inviteRepository.SingleOrDefault(getInviteSpecification);

            if (inviteEntity == null)
            {
                _logger.LogError($"No Invite. Token {acceptInvite.Code}");
                return(Result.Fail("no_invite", "No Invite"));
            }

            if (inviteEntity.ExpiresAt < DateTimeOffset.UtcNow)
            {
                _logger.LogError($"Invite has expired");
                return(Result.Fail("no_invite", "No Invite"));
            }

            List <UserAttributeEntity> userAttributes = null;

            if (acceptInvite.Attributes != null)
            {
                userAttributes = acceptInvite.Attributes
                                 .Select(x => new UserAttributeEntity(
                                             key: x.Key,
                                             value: x.Value))
                                 .ToList();
            }

            string username;

            if (_identityUIEndpoints.UseEmailAsUsername)
            {
                username = inviteEntity.Email;
            }
            else
            {
                if (string.IsNullOrEmpty(acceptInvite.Username))
                {
                    _logger.LogError($"Username cannot be empty");
                    return(Result.Fail("username_cannot_be_empty", "username_cannot_be_empty"));
                }

                username = acceptInvite.Username;
            }

            AppUserEntity appUser = new AppUserEntity(
                userName: username,
                email: inviteEntity.Email,
                firstName: acceptInvite.FirstName,
                lastName: acceptInvite.LastName,
                emailConfirmed: true,
                enabled: true,
                phoneNumber: acceptInvite.PhoneNumber,
                attributes: userAttributes);

            IdentityResult identityResult = await _userManager.CreateAsync(appUser, acceptInvite.Password);

            if (!identityResult.Succeeded)
            {
                _logger.LogError($"Failed to create new user for invite. InviteId {inviteEntity.Id}");
                return(Result.Fail(ResultUtils.ToResultError(identityResult.Errors)));
            }

            inviteEntity.Update(Data.Enums.Entity.InviteStatuses.Accepted);
            bool updateInvite = _inviteRepository.Update(inviteEntity);

            if (!updateInvite)
            {
                _logger.LogWarning($"Failed to update invite status. InnivteId {inviteEntity.Id}, UserId {appUser.Id}");
            }

            if (inviteEntity.GroupId != null)
            {
                AddToGroup(appUser.Id, inviteEntity.GroupId, inviteEntity.GroupRoleId);
            }

            if (inviteEntity.RoleId != null)
            {
                await AddToGlobalRole(appUser, inviteEntity.RoleId);
            }

            return(Result.Ok());
        }
        public async Task <Result> AcceptInvite(AcceptInviteRequest acceptInvite)
        {
            ValidationResult validationResult = _acceptInviteValidator.Validate(acceptInvite);

            if (!validationResult.IsValid)
            {
                _logger.LogWarning($"Invalid {nameof(AcceptInviteRequest)} model");
                return(Result.Fail(validationResult.Errors));
            }

            BaseSpecification <InviteEntity> getInviteSpecification = new BaseSpecification <InviteEntity>();

            getInviteSpecification.AddFilter(x => x.Token == acceptInvite.Code);
            getInviteSpecification.AddFilter(x => x.Status == Data.Enums.Entity.InviteStatuses.Pending);

            InviteEntity inviteEntity = _inviteRepository.SingleOrDefault(getInviteSpecification);

            if (inviteEntity == null)
            {
                _logger.LogError($"No Invite. Token {acceptInvite.Code}");
                return(Result.Fail("no_invite", "No Invite"));
            }

            if (inviteEntity.ExpiresAt < DateTimeOffset.UtcNow)
            {
                _logger.LogError($"Invite has expired");
                return(Result.Fail("no_invite", "No Invite"));
            }

            AppUserEntity appUser = new AppUserEntity(
                userName: inviteEntity.Email,
                email: inviteEntity.Email,
                firstName: acceptInvite.FirstName,
                lastName: acceptInvite.LastName,
                emailConfirmed: true,
                enabled: true);

            IdentityResult identityResult = await _userManager.CreateAsync(appUser, acceptInvite.Password);

            if (!identityResult.Succeeded)
            {
                _logger.LogError($"Failed to create new user for invite. InviteId {inviteEntity.Id}");
                return(Result.Fail(ResultUtils.ToResultError(identityResult.Errors)));
            }

            inviteEntity.Update(Data.Enums.Entity.InviteStatuses.Accepted);
            bool updateInvite = _inviteRepository.Update(inviteEntity);

            if (!updateInvite)
            {
                _logger.LogWarning($"Failed to update invite status. InnivteId {inviteEntity.Id}, UserId {appUser.Id}");
            }

            if (inviteEntity.GroupId != null)
            {
                AddToGroup(appUser.Id, inviteEntity.GroupId, inviteEntity.GroupRoleId);
            }

            if (inviteEntity.RoleId != null)
            {
                await AddToGlobalRole(appUser, inviteEntity.RoleId);
            }

            return(Result.Ok());
        }
 public Task <Result> AfterAdded(InviteEntity invite)
 {
     return(Task.FromResult(Result.Ok()));
 }
        /// <summary>
        /// Метод проставит отказ на выполнение задания.
        /// </summary>
        /// <param name="taskId">Id задания.</param>
        /// <param name="account">Логин исполнителя.</param>
        /// <returns>Флаг результата.</returns>
        public async Task <bool> CancelTaskAsync(long taskId, string account)
        {
            try
            {
                TaskEntity task = await _postgre.Tasks.FirstOrDefaultAsync(t => t.TaskId == taskId);

                if (task == null)
                {
                    throw new NotFoundTaskIdException(taskId);
                }

                // Найдет Id исполнителя.
                string executorId = await _userService.GetUserIdByLogin(account);

                // Добавит в таблицу отказов приглашений.
                if (string.IsNullOrEmpty(executorId))
                {
                    throw new NotFoundExecutorIdException(account);
                }

                // Ищет такое приглашение.
                InviteEntity canceledInvite = await _postgre.Invities
                                              .Where(c => c.TaskId == taskId && c.ExecutorId.Equals(executorId))
                                              .FirstOrDefaultAsync();

                if (canceledInvite != null)
                {
                    _postgre.Remove(canceledInvite);
                    await _postgre.SaveChangesAsync();
                }

                // Изменит статус задания на "В аукционе".
                string code = await _postgre.TaskStatuses
                              .Where(c => c.StatusName.Equals(StatusTask.AUCTION))
                              .Select(res => res.StatusCode)
                              .FirstOrDefaultAsync();

                task.IsWorkAccept = false;
                task.StatusCode   = code;
                await _postgre.SaveChangesAsync();

                await _postgre.Invities.AddAsync(new InviteEntity
                {
                    TaskId     = task.TaskId,
                    ExecutorId = executorId,
                    IsAccept   = false,
                    IsCancel   = true
                });

                await _postgre.SaveChangesAsync();

                return(true);
            }

            catch (Exception ex)
            {
                Console.WriteLine(ex);
                Logger logger = new Logger(_db, ex.GetType().FullName, ex.Message, ex.StackTrace);
                await logger.LogCritical();

                throw;
            }
        }
Beispiel #14
0
        public async Task <Core.Models.Result.Result> AcceptInvite(AcceptInviteRequest acceptInvite)
        {
            ValidationResult acceptInviteValidationResult = _acceptInviteValidator.Validate(acceptInvite);

            if (!acceptInviteValidationResult.IsValid)
            {
                _logger.LogWarning($"Invalid {typeof(AcceptInviteRequest).Name} model");
            }

            IBaseSpecification <InviteEntity, InviteEntity> getInviteSpecification = SpecificationBuilder
                                                                                     .Create <InviteEntity>()
                                                                                     .Where(x => x.Token == acceptInvite.Code)
                                                                                     .Where(x => x.Status == Data.Enums.Entity.InviteStatuses.Pending)
                                                                                     .Build();

            InviteEntity inviteEntity = await _inviteDAO.SingleOrDefault(getInviteSpecification);

            if (inviteEntity == null)
            {
                _logger.LogError($"No Invite. Token {acceptInvite.Code}");
                return(Core.Models.Result.Result.Fail("no_invite", "No Invite"));
            }

            if (inviteEntity.ExpiresAt < DateTimeOffset.UtcNow)
            {
                _logger.LogError($"Invite has expired");
                return(Core.Models.Result.Result.Fail("no_invite", "No Invite"));
            }

            if (inviteEntity.GroupId != null)
            {
                Result groupValidResult = await _groupUserService.ValidateGroup(inviteEntity.GroupId);

                if (groupValidResult.Failure)
                {
                    return(Result.Fail(groupValidResult).ToOldResult());
                }

                Result groupRoleValidResult = await _groupUserService.RoleIsValid(inviteEntity.GroupRoleId);

                if (groupRoleValidResult.Failure)
                {
                    return(Result.Fail(groupRoleValidResult).ToOldResult());
                }
            }

            acceptInvite.Email = inviteEntity.Email;

            Result <AppUserEntity> addUserResult = await AddUser(acceptInvite, sendConfirmationMail : false, emailConfirmed : true);

            if (addUserResult.Failure)
            {
                return(addUserResult.ToOldResult());
            }

            AppUserEntity appUser = addUserResult.Value;

            inviteEntity.Update(Data.Enums.Entity.InviteStatuses.Accepted);
            bool updateInvite = await _inviteDAO.Update(inviteEntity);

            if (!updateInvite)
            {
                _logger.LogWarning($"Failed to update invite status. InnivteId {inviteEntity.Id}, UserId {appUser.Id}");
            }

            if (inviteEntity.GroupId != null)
            {
                Result addToGroupResult = await _groupUserService.AddUserToGroupWithoutValidation(appUser.Id, inviteEntity.GroupId, inviteEntity.GroupRoleId);
            }

            if (inviteEntity.RoleId != null)
            {
                Result addToGlobalRole = await AddToGlobalRole(appUser, inviteEntity.RoleId);
            }

            return(Core.Models.Result.Result.Ok());
        }
Beispiel #15
0
        public async Task <Result> AddInvite(string email, string roleId = null, string groupId = null, string groupRoleId = null)
        {
            Result inviteAlreadyExistsResult = await InviteAlreadyExits(email);

            if (inviteAlreadyExistsResult.Failure)
            {
                return(inviteAlreadyExistsResult);
            }

            //TODO: change method or response to make more sense
            Result userAlreadyExistsResult = await UserAlreadyExist(email);

            if (userAlreadyExistsResult.Failure)
            {
                return(userAlreadyExistsResult);
            }

            if (!string.IsNullOrEmpty(roleId))
            {
                Result roleValidResult = await GlobalRoleExists(roleId);

                if (roleValidResult.Failure)
                {
                    return(roleValidResult);
                }
            }

            if (!string.IsNullOrEmpty(groupId))
            {
                Result isGroupValid = await IsGroupInviteValid(groupId, groupRoleId);

                if (isGroupValid.Failure)
                {
                    return(isGroupValid);
                }
            }

            Result beforeAddResult = await _addInviteFilter.BeforeAdd(email, roleId, groupId, groupRoleId);

            if (beforeAddResult.Failure)
            {
                return(beforeAddResult);
            }

            InviteEntity invite = new InviteEntity(
                email: email,
                token: StringUtils.GenerateToken(),
                status: Data.Enums.Entity.InviteStatuses.Pending,
                roleId: roleId,
                groupId: groupId,
                groupRoleId: groupRoleId,
                expiresAt: DateTimeOffset.UtcNow.Add(_identityManagementEndpoints.InviteValidForTimeSpan));

            bool addInvite = await _inviteDAO.Add(invite);

            if (!addInvite)
            {
                _logger.LogError($"Failed to add invite");
                return(Result.Fail(FAILED_TO_ADD_INVITE));
            }

            Result afterAddedResult = await _addInviteFilter.AfterAdded(invite);

            if (afterAddedResult.Failure)
            {
                return(afterAddedResult);
            }

            _logger.LogInformation($"Invite was added, sending email");

            string callbackUrl = QueryHelpers.AddQueryString($"{_identityManagementOptions.BasePath}{_identityManagementEndpoints.AcceptInvite}", "code", invite.Token);

            callbackUrl = HtmlEncoder.Default.Encode(callbackUrl);

            Core.Models.Result.Result sendMailResult = await _mailService.SendInvite(invite.Email, callbackUrl);

            if (sendMailResult.Failure)
            {
                return(sendMailResult.ToNewResult());
            }

            return(Result.Ok());
        }