public async Task <Result <Product, ProductsErrorCodes> > ChangeFrozenStatus(string productId, bool isFrozen,
                                                                                     byte[] valueTimestamp,
                                                                                     ProductFreezeInfo freezeInfo)
        {
            await using var context = _contextFactory.CreateDataContext();

            var entity = await context.Products.FirstOrDefaultAsync(p => p.ProductId == productId);

            if (entity == null)
            {
                return(new Result <Product, ProductsErrorCodes>(ProductsErrorCodes.DoesNotExist));
            }

            entity.IsFrozen   = isFrozen;
            entity.FreezeInfo = JsonConvert.SerializeObject(freezeInfo);

            await context.SaveChangesAsync();

            return(new Result <Product, ProductsErrorCodes>(ToModel(entity)));
        }
示例#2
0
        public async Task <Result <Product, ProductsErrorCodes> > ChangeFrozenStatus(string productId, bool isFrozen,
                                                                                     bool forceFreezeIfAlreadyFrozen,
                                                                                     ProductFreezeInfo freezeInfo, string userName, string correlationId)
        {
            var existing = await _repository.GetByIdAsync(productId);

            if (existing.IsFailed)
            {
                return(existing);
            }

            if (isFrozen == false)
            {
                freezeInfo = new ProductFreezeInfo();
            }

            // can only freeze already frozen products with force freeze
            if (isFrozen && existing.Value.IsFrozen && !forceFreezeIfAlreadyFrozen)
            {
                return(existing);
            }

            if (existing.Value.IsDiscontinued)
            {
                return(new Result <Product, ProductsErrorCodes>(ProductsErrorCodes.CannotFreezeDiscontinuedProduct));
            }

            var result =
                await _repository.ChangeFrozenStatus(productId, isFrozen, existing.Value.Timestamp, freezeInfo);

            if (result.IsSuccess)
            {
                await _auditService.TryAudit(correlationId, userName, productId, AuditDataType.Product,
                                             result.Value.ToJson(), existing.Value.ToJson());

                await _entityChangedSender.SendEntityEditedEvent <Product, ProductContract, ProductChangedEvent>(
                    existing.Value, result.Value, userName, correlationId);
            }

            return(result);
        }