public IActionResult PutDeliveryFile(
            [RequestBodyType(typeof(DeliveryFileUpdateRequestDto), "配信ファイル更新リクエスト")]
            [HttpTrigger(AuthorizationLevel.Function, "put", Route = "deliveryfiles/{deliveryFileId}")]
            DeliveryFileUpdateRequestDto request,
            long deliveryFileId,
            ILogger log)
        {
            log.EnterJson($"{nameof(deliveryFileId)}: {deliveryFileId}, {typeof(DeliveryFileUpdateRequestDto)}: {{0}}", request);
            ActionResult response = null;

            try
            {
                DeliveryFileUpdateRequestDto requestByType = RequestConverter.Convert(request);    // リクエストオブジェクトがnullの場合にはnullが返る
                // リクエストパラメータチェック
                if (RequestValidator.IsBadRequestParameter(request, out string message))
                {
                    log.Error(nameof(Resources.CO_API_DFU_002), new object[] { message });
                    return(new BadRequestObjectResult(string.Empty));
                }

                var utilParam   = requestByType.ConvertDtoToUtility(deliveryFileId);
                var resultParam = _service.Update(utilParam);

                // Resultから返却ステータスを作成
                response = SqlResultConverter.ConvertToActionResult(
                    resultParam.ResultCode,
                    resultParam.Message,
                    resultParam.Entity.ConvertUtilityToResponseDto());
            }
            catch (Exception e)
            {
                log.Error(e, nameof(Resources.CO_API_DFU_001));
                response = new StatusCodeResult(StatusCodes.Status500InternalServerError);
            }
            finally
            {
                log.LeaveJson("Response: {0}", response);
            }

            return(response);
        }
Beispiel #2
0
 /// <summary>
 /// 配信ファイル更新リクエストDTOをUtilityモデルに変換する
 /// </summary>
 /// <param name="dto">Dtoクラスパラメータ</param>
 /// <param name="deliveryFileId">配信ファイルデータID</param>
 /// <returns>Utilityパラメータ</returns>
 public static DtDeliveryFile ConvertDtoToUtility(this DeliveryFileUpdateRequestDto dto, long deliveryFileId)
 {
     return(new DtDeliveryFile()
     {
         Sid = deliveryFileId,
         DeliveryFileTypeSid = dto.DeliveryFileType.DeliveryFileTypeSid.Value,
         //// FilePath = dto.FilePath,
         ////InstallTypeSid = dto.InstallType.InstallTypeId,
         DtDeliveryModel = dto.EquipmentModels == null ? null : dto.EquipmentModels.ToModelDtos().ToArray(),
         Version = dto.Version,
         InstallableVersion = dto.InstallableVersion,
         Description = dto.Description,
         InformationId = dto.InformationId,
         //// IsCanceled
         //// CreateDatetime
         //// UpdateDatetime
         RowVersion = WebApiHelper.ConvertLongToByteArray(dto.RowVersion.Value)
                      //// MtDeliveryFileType
                      //// DtDeliveryGroup
     });
 }
Beispiel #3
0
        /// <summary>
        /// Dtoをファイル種別ごとに適切なクラスに変換する。
        /// </summary>
        /// <param name="source">変換元</param>
        /// <returns>変換先。リクエストがnullの場合にはそのままnullを返す</returns>
        public static DeliveryFileUpdateRequestDto Convert(DeliveryFileUpdateRequestDto source)
        {
            if (source == null)
            {
                return(null);
            }

            switch (source.DeliveryFileType.DeliveryFileTypeCode)
            {
            case Const.DeliveryFileType.AlSoft:
                return(new DeliveryFileUpdateRequestTypeAlSoft(source));

            case Const.DeliveryFileType.HotFixConsole:
            case Const.DeliveryFileType.HotFixHobbit:
                return(new DeliveryFileUpdateRequestTypeHotFix(source));

            case Const.DeliveryFileType.Package:
            default:
                return(new DeliveryFileUpdateRequestTypePackage(source));
            }
        }
Beispiel #4
0
        public void CRUDOperationTest()
        {
            // TestInitialize
            DbTestHelper.DeleteAll();
            var dataOnDb = DbTestHelper.CreateMasterTables();

            dataOnDb = DbTestHelper.CreateDevices(dataOnDb);

            // Target Create
            var builder = new TestDiProviderBuilder();

            builder.ServiceCollection.AddTransient <DeliveryFilesController>();

            var createdDatetime = new DateTime(2030, 1, 1);

            builder.ServiceCollection.AddSingleton <ITimeProvider>(UnitTestHelper.CreateTimeProvider(createdDatetime));
            var provider   = builder.Build();
            var controller = provider.GetService <DeliveryFilesController>();

            ////////////
            // Create //
            ////////////
            var requestCreate = new DeliveryFileAddRequestDto()
            {
                DeliveryFileType =
                    new DeliveryFileTypeMasterDto()
                {
                    DeliveryFileTypeSid  = dataOnDb.Get <MtDeliveryFileType>()[0].Sid,
                    DeliveryFileTypeCode = dataOnDb.Get <MtDeliveryFileType>()[0].Code
                },
                FilePath        = "filepath",
                EquipmentModels = new List <ModelMasterDto>()
                {
                    new ModelMasterDto()
                    {
                        ModelSid  = dataOnDb.Get <MtEquipmentModel>()[0].Sid,
                        ModelCode = dataOnDb.Get <MtEquipmentModel>()[0].Code
                    },
                    new ModelMasterDto()
                    {
                        ModelSid  = dataOnDb.Get <MtEquipmentModel>()[1].Sid,
                        ModelCode = dataOnDb.Get <MtEquipmentModel>()[1].Code
                    },
                },
                InstallType =
                    new InstallTypeMasterDto()
                {
                    InstallTypeSid  = dataOnDb.Get <MtInstallType>()[0].Sid,
                    InstallTypeCode = dataOnDb.Get <MtInstallType>()[0].Code
                },
                Version            = "v3.0",
                InstallableVersion = "v1.0,v2.0",
                Description        = "description",
                InformationId      = "200"
            };

            long targetDeliveryFileSid;
            var  response =
                controller.PostDeliveryFile(requestCreate, UnitTestHelper.CreateLogger())
                as OkObjectResult;

            Assert.IsNotNull(response);
            var responseCreate = response.Value as DeliveryFileResponseDto;

            targetDeliveryFileSid = responseCreate.Sid;
            long latestRowVersion = responseCreate.RowVersion.Value;

            // リクエストとレスポンスの比較
            Assert.IsTrue(responseCreate.Sid > 0);
            Assert.AreEqual(requestCreate.DeliveryFileType.DeliveryFileTypeSid, responseCreate.DeliveryFileTypeSid);
            Assert.AreEqual(requestCreate.FilePath, responseCreate.FilePath);
            AssertResponse(requestCreate.EquipmentModels, responseCreate.EquipmentModels, responseCreate.CreateDatetime.Value);
            Assert.AreEqual(requestCreate.InstallType.InstallTypeSid, responseCreate.InstallTypeSid);

            Assert.AreEqual(requestCreate.Version, responseCreate.Version);
            Assert.AreEqual(requestCreate.InstallableVersion, responseCreate.InstallableVersion);
            Assert.AreEqual(requestCreate.Description, responseCreate.Description);
            Assert.AreEqual(requestCreate.InformationId, responseCreate.InformationId);

            Assert.IsFalse(responseCreate.IsCanceled.HasValue);
            Assert.IsNotNull(responseCreate.RowVersion);
            Assert.AreEqual(createdDatetime, responseCreate.CreateDatetime);
            Assert.AreEqual(createdDatetime, responseCreate.UpdateDatetime);

            // ==== Read
            // ReadはWebAPIがないのでリポジトリから直接確認。
            var repository  = provider.GetRequiredService <IDtDeliveryFileRepository>();
            var readCreated = repository.ReadDtDeliveryFile(targetDeliveryFileSid);

            latestRowVersion = AssertResponse(responseCreate, readCreated);

            // === Update
            // DateTimeProviderを再注入し、更新時に更新されることを確認する。
            var updatedDateTime = new DateTime(2050, 3, 1);

            builder.ServiceCollection.AddSingleton <ITimeProvider>(UnitTestHelper.CreateTimeProvider(updatedDateTime));
            provider   = builder.Build();
            controller = provider.GetService <DeliveryFilesController>();

            // 更新データ作成
            var requestUpdated = new DeliveryFileUpdateRequestDto()
            {
                DeliveryFileType =
                    new DeliveryFileTypeMasterDto()
                {
                    DeliveryFileTypeSid  = dataOnDb.Get <MtDeliveryFileType>()[1].Sid,
                    DeliveryFileTypeCode = dataOnDb.Get <MtDeliveryFileType>()[1].Code
                },
                EquipmentModels = new List <ModelMasterDto>()
                {
                    new ModelMasterDto()
                    {
                        ModelSid  = dataOnDb.Get <MtEquipmentModel>()[2].Sid,
                        ModelCode = dataOnDb.Get <MtEquipmentModel>()[2].Code
                    }
                },
                InstallType =
                    new InstallTypeMasterDto()
                {
                    InstallTypeSid  = dataOnDb.Get <MtInstallType>()[1].Sid,
                    InstallTypeCode = dataOnDb.Get <MtInstallType>()[1].Code
                },
                Version            = "v4.0",
                InstallableVersion = "v3.0,v2.0",
                Description        = "updated description",
                InformationId      = "300",
                RowVersion         = latestRowVersion
            };
            var responseUpdated =
                controller.PutDeliveryFile(requestUpdated, targetDeliveryFileSid, UnitTestHelper.CreateLogger())
                as OkObjectResult;

            Assert.IsNotNull(responseUpdated);
            var responseUpdatedDto = responseUpdated.Value as DeliveryFileResponseDto;

            Assert.AreEqual(targetDeliveryFileSid, responseUpdatedDto.Sid);
            Assert.AreEqual(requestUpdated.DeliveryFileType.DeliveryFileTypeSid, responseUpdatedDto.DeliveryFileTypeSid);

            AssertResponse(requestUpdated.EquipmentModels, responseUpdatedDto.EquipmentModels, responseUpdatedDto.UpdateDatetime.Value);

            Assert.AreEqual(requestUpdated.InstallType.InstallTypeSid, responseUpdatedDto.InstallTypeSid);
            Assert.AreEqual(requestUpdated.Version, responseUpdatedDto.Version);
            Assert.AreEqual(requestUpdated.InstallableVersion, responseUpdatedDto.InstallableVersion);
            Assert.AreEqual(requestUpdated.Description, responseUpdatedDto.Description);
            Assert.AreEqual(requestUpdated.InformationId, responseUpdatedDto.InformationId);

            Assert.IsFalse(responseUpdatedDto.IsCanceled.HasValue);
            Assert.IsNotNull(responseUpdatedDto.RowVersion);
            Assert.AreEqual(createdDatetime, responseUpdatedDto.CreateDatetime);
            Assert.AreEqual(updatedDateTime, responseUpdatedDto.UpdateDatetime);

            latestRowVersion = responseUpdatedDto.RowVersion.Value;

            // ==== Read
            var readUpdated = repository.ReadDtDeliveryFile(targetDeliveryFileSid);

            latestRowVersion = AssertResponse(responseUpdatedDto, readUpdated);

            // === Delete
            var deletedResponse = controller.DeleteDeliveryFile(
                null,
                targetDeliveryFileSid,
                latestRowVersion,
                UnitTestHelper.CreateLogger()) as OkObjectResult;

            Assert.IsNotNull(deletedResponse);
            var deleteResponse = deletedResponse.Value as DeliveryFileResponseDto;

            Assert.IsNotNull(deleteResponse);

            // HACK: Deleteの戻り値が一致するかどうかのテスト
            // 子テーブルの削除に失敗する。db側にon delete cascadeを追加する。

            // 取得して存在しないことを確認
            var readResult = repository.ReadDtDeliveryFile(deleteResponse.Sid);

            Assert.IsNull(readResult);
        }
Beispiel #5
0
        public void Update403ErrorIfStatusIsNotStarted()
        {
            // DbSetup
            DbTestHelper.DeleteAll();
            var dataOnDb = DbTestHelper.CreateMasterTables();

            dataOnDb = DbTestHelper.CreateDeliveries(dataOnDb);
            dataOnDb = DbTestHelper.CreateDevices(dataOnDb);

            // Target Create
            var builder = new TestDiProviderBuilder();

            builder.ServiceCollection.AddTransient <DeliveryGroupsController>();
            builder.ServiceCollection.AddTransient <DeliveryFilesController>();
            var provider = builder.Build();

            // Init
            // 配信グループデータを作成し、SIDを読み込む(作成・読み込み結果は別テストで判定するためここでは省略)
            var targetDeliveryFileSid = dataOnDb.GetDtDeliveryFileSid();
            var delGroupController    = provider.GetService <DeliveryGroupsController>();

            // 配信グループデータを複数作成する。
            // これがNotStartではないのが本テストのポイント。
            DeliveryGroupAddRequestDto statusStarted = CreateDeliveryGroupAddRequestDto(dataOnDb, targetDeliveryFileSid, "started");

            Assert.IsNotNull(delGroupController.PostDeliveryGroup(statusStarted, UnitTestHelper.CreateLogger()) as OkObjectResult);

            statusStarted = CreateDeliveryGroupAddRequestDto(dataOnDb, targetDeliveryFileSid, Const.DeliveryGroupStatus.NotStarted);
            Assert.IsNotNull(delGroupController.PostDeliveryGroup(statusStarted, UnitTestHelper.CreateLogger()) as OkObjectResult);

            statusStarted = CreateDeliveryGroupAddRequestDto(dataOnDb, targetDeliveryFileSid, Const.DeliveryGroupStatus.NotStarted);
            Assert.IsNotNull(delGroupController.PostDeliveryGroup(statusStarted, UnitTestHelper.CreateLogger()) as OkObjectResult);

            // 更新処理
            // 対象の配信ファイル情報はDbSetupで作成済み
            var createdDeliveryFile = dataOnDb.Get <DtDeliveryFile>().First();
            var rowVersionAtCreated = WebApiHelper.ConvertByteArrayToLong(createdDeliveryFile.RowVersion);

            var requestUpdated = new DeliveryFileUpdateRequestDto()
            {
                DeliveryFileType =
                    new DeliveryFileTypeMasterDto()
                {
                    DeliveryFileTypeSid  = dataOnDb.Get <MtDeliveryFileType>()[0].Sid,
                    DeliveryFileTypeCode = dataOnDb.Get <MtDeliveryFileType>()[0].Code
                },
                // 本テストの本筋ではないため、コメントアウトのまま。
                //EquipmentModel = "UpdatedHOGEHOGE500",
                //InstallType = "UpdatedType1",
                Version            = "v4.0",
                InstallableVersion = "v3.0,v2.0",
                Description        = "updated description",
                InformationId      = "300",
                RowVersion         = rowVersionAtCreated
            };

            var actual = provider
                         .GetService <DeliveryFilesController>()
                         .PutDeliveryFile(requestUpdated, targetDeliveryFileSid, UnitTestHelper.CreateLogger());

            // 403が返るかチェック
            Assert.IsInstanceOfType(actual, typeof(StatusCodeResult));
            var statucCodeResult = actual as StatusCodeResult;

            Assert.AreEqual(StatusCodes.Status403Forbidden, statucCodeResult.StatusCode);

            // 更新されていないことを確認
            var repository  = provider.GetRequiredService <IDtDeliveryFileRepository>();
            var readUpdated = repository.ReadDtDeliveryFile(targetDeliveryFileSid);

            Assert.IsNotNull(readUpdated);

            // RowVersionが更新されていなければ問題ないと判定する。
            var readResponseDto = readUpdated.ConvertUtilityToResponseDto();

            Assert.AreEqual(rowVersionAtCreated, readResponseDto.RowVersion.Value);
        }