public Result Edit(string groupId, long id, EditGroupAttributeRequest editGroupAttribute)
        {
            ValidationResult validationResult = _editGroupAttributeValidator.Validate(editGroupAttribute);

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

            Result <GroupAttributeEntity> groupAttributeResult = Get(groupId, id);

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

            GroupAttributeEntity groupAttribute = groupAttributeResult.Value;

            groupAttribute.Update(editGroupAttribute.Value);
            bool updateResult = _groupAttributeRepository.Update(groupAttribute);

            if (!updateResult)
            {
                _logger.LogError($"Failed to update GroupAttribute. GroupId {groupId}, Id {id}");
                return(Result.Fail("failed_to_update_group_attribute", "Failed to update GroupAttribute"));
            }

            return(Result.Ok());
        }
        public Result Add(string groupId, AddGroupAttributeRequest addGroupAttribute)
        {
            ValidationResult validationResult = _addGroupAttributeValidator.Validate(addGroupAttribute);

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

            BaseSpecification <GroupEntity> groupExistSpecification = new BaseSpecification <GroupEntity>();

            groupExistSpecification.AddFilter(x => x.Id == groupId);

            bool groupExist = _groupRepository.Exist(groupExistSpecification);

            if (!groupExist)
            {
                _logger.LogError($"No Group. GroupId {groupId}");
                return(Result.Fail("no_group", "No Group"));
            }

            BaseSpecification <GroupAttributeEntity> keyExistSpecification = new BaseSpecification <GroupAttributeEntity>();

            keyExistSpecification.AddFilter(x => x.GroupId == groupId);
            keyExistSpecification.AddFilter(x => x.Key.ToUpper() == addGroupAttribute.Key.ToUpper());

            bool keyExist = _groupAttributeRepository.Exist(keyExistSpecification);

            if (keyExist)
            {
                _logger.LogError($"GroupAttribute key already exist. GroupId {groupId}, key {addGroupAttribute.Key}");
                return(Result.Fail("group_attribute_key_already_exist", "GroupAttribute key already exist"));
            }

            GroupAttributeEntity groupAttributeEntity = new GroupAttributeEntity(
                key: addGroupAttribute.Key,
                value: addGroupAttribute.Value,
                groupId: groupId);

            bool addResult = _groupAttributeRepository.Add(groupAttributeEntity);

            if (!addResult)
            {
                _logger.LogError($"Failed to add GroupAttribute. GroupId {groupId}, Key {addGroupAttribute.Key}");
                return(Result.Fail("failed_to_add_group_attribute", "Failed to add group attribute"));
            }

            return(Result.Ok());
        }
        private Result <GroupAttributeEntity> Get(string groupId, long id)
        {
            BaseSpecification <GroupAttributeEntity> baseSpecification = new BaseSpecification <GroupAttributeEntity>();

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

            GroupAttributeEntity groupAttribute = _groupAttributeRepository.SingleOrDefault(baseSpecification);

            if (groupAttribute == null)
            {
                _logger.LogError($"No GroupAttribute. GroupId {groupId}, Id {id}");
                return(Result.Fail <GroupAttributeEntity>("no_group_attribute", "No GroupAttribute"));
            }

            return(Result.Ok(groupAttribute));
        }