public PostNotifyFinishedUploadService(
     string accessToken,
     VenueID venueId,
     UploadRequestID uploadRequestId,
     bool isPublish,
     Action <VenueUploadRequestCompletionResponse> onSuccess = null,
     Action <Exception> onError = null
     )
 {
     this.accessToken     = accessToken;
     this.venueId         = venueId;
     this.uploadRequestId = uploadRequestId;
     this.isPublish       = isPublish;
     this.onSuccess       = onSuccess;
     this.onError         = onError;
 }
        public UploadAssetService(
            string accessToken,
            string fileType,
            string filePath,
            UploadRequestID uploadRequestId,
            Action <AssetUploadPolicy> onSuccess = null,
            Action <Exception> onError           = null
            )
        {
            this.accessToken     = accessToken;
            this.filePath        = filePath;
            this.uploadRequestId = uploadRequestId;
            this.onSuccess       = onSuccess;
            this.onError         = onError;

            var fileInfo = new FileInfo(filePath);

            payload = new PostUploadAssetPolicyPayload
            {
                fileType = fileType,
                fileName = fileInfo.Name,
                fileSize = fileInfo.Length
            };
        }
        static void AssetUpload(
            string accessToken,
            string fileType,
            string filePath,
            UploadRequestID uploadRequestId)
        {
            var fileInfo = new FileInfo(filePath);
            var payload  = new PostUploadAssetPolicyPayload
            {
                fileType = fileType,
                fileName = fileInfo.Name,
                fileSize = fileInfo.Length
            };

            var url = $"{Constants.VenueApiBaseUrl}/v1/upload/venue/{uploadRequestId.Value}/policies";

            Debug.LogFormat("Calling RPC: {0}", url);

            var webRequest = ClusterApiUtil.CreateUnityWebRequest(accessToken, url, UnityWebRequest.kHttpVerbPOST);

            webRequest.downloadHandler = new DownloadHandlerBuffer();
            webRequest.uploadHandler   = new UploadHandlerRaw(Encoding.UTF8.GetBytes(JsonUtility.ToJson(payload)));
            webRequest.SendWebRequest();

            while (!webRequest.isDone)
            {
                Thread.Sleep(50);
            }

            if (webRequest.isNetworkError)
            {
                throw new Exception(webRequest.error);
            }

            var responseText = webRequest.downloadHandler.text;

            Debug.LogFormat("Calling RPC ResponseText: {0}", responseText);
            var policy = JsonConvert.DeserializeObject <AssetUploadPolicy>(responseText);

            var fileBytes = ReadFile(filePath);

            if (policy == null || fileBytes == null)
            {
                throw new Exception("unknown error");
            }

            var form = BuildForm(fileBytes, policy);
            var uploadFileWebRequest = UnityWebRequest.Post(policy.uploadUrl, form);

            uploadFileWebRequest.chunkedTransfer = false;

            uploadFileWebRequest.SendWebRequest();
            while (!uploadFileWebRequest.isDone)
            {
                Thread.Sleep(50);
            }

            if (uploadFileWebRequest.isNetworkError)
            {
                throw new Exception(uploadFileWebRequest.error);
            }

            if (uploadFileWebRequest.isHttpError)
            {
                throw new Exception(uploadFileWebRequest.downloadHandler.text);
            }

            Debug.Log($"Success Upload {policy.fileType}");
        }
        IEnumerator UploadVenue()
        {
            isProcessing = true;

            if (!uploadStatus[UploadState.PreProcess])
            {
                var postUploadRequestProcess = false;
                var uploadRequest            = new PostUploadRequestService(
                    accessToken,
                    venue.VenueId,
                    request =>
                {
                    Debug.Log($"make new upload request, Request ID : {request.UploadRequestId}");
                    uploadRequestId                      = request.UploadRequestId;
                    postUploadRequestProcess             = true;
                    uploadStatus[UploadState.PreProcess] = true;
                },
                    exception =>
                {
                    HandleError(exception);
                    postUploadRequestProcess = true;
                }
                    );
                uploadRequest.Run();

                while (!postUploadRequestProcess)
                {
                    yield return(null);
                }
            }

            if (!uploadStatus[UploadState.PreProcess])
            {
                yield break;
            }

            var uploadAssetServiceList = new List <UploadAssetService>();

            var winAssetUploadProcess     = uploadStatus[UploadState.Windows];
            var macAssetUploadProcess     = uploadStatus[UploadState.Mac];
            var androidAssetUploadProcess = uploadStatus[UploadState.Android];
            var iosAssetUploadProcess     = uploadStatus[UploadState.IOS];

//            var unityPackageUploadProcess = uploadStatus[UploadState.UnityPackage];

            if (!uploadStatus[UploadState.Windows])
            {
                var winAssetUploadService = new UploadAssetService(
                    accessToken,
                    "assetbundle/win",
                    EditorPrefsUtils.LastBuildWin,
                    uploadRequestId,
                    request =>
                {
                    Debug.Log($"success win asset upload, uploaded url : {request.url}");
                    winAssetUploadProcess             = true;
                    uploadStatus[UploadState.Windows] = true;
                },
                    exception =>
                {
                    HandleError(exception);
                    winAssetUploadProcess = true;
                }
                    );
                uploadAssetServiceList.Add(winAssetUploadService);
            }

            if (!uploadStatus[UploadState.Mac])
            {
                var macAssetUploadService = new UploadAssetService(
                    accessToken,
                    "assetbundle/mac",
                    EditorPrefsUtils.LastBuildMac,
                    uploadRequestId,
                    request =>
                {
                    Debug.Log($"success mac asset upload, uploaded url : {request.url}");
                    macAssetUploadProcess         = true;
                    uploadStatus[UploadState.Mac] = true;
                },
                    exception =>
                {
                    HandleError(exception);
                    macAssetUploadProcess = true;
                }
                    );
                uploadAssetServiceList.Add(macAssetUploadService);
            }

            if (!uploadStatus[UploadState.Android])
            {
                var androidAssetUploadService = new UploadAssetService(
                    accessToken,
                    "assetbundle/android",
                    EditorPrefsUtils.LastBuildAndroid,
                    uploadRequestId,
                    request =>
                {
                    Debug.Log($"success android asset upload, uploaded url : {request.url}");
                    androidAssetUploadProcess         = true;
                    uploadStatus[UploadState.Android] = true;
                },
                    exception =>
                {
                    HandleError(exception);
                    androidAssetUploadProcess = true;
                }
                    );
                uploadAssetServiceList.Add(androidAssetUploadService);
            }

            if (!uploadStatus[UploadState.IOS])
            {
                var iosAssetUploadService = new UploadAssetService(
                    accessToken,
                    "assetbundle/ios",
                    EditorPrefsUtils.LastBuildIOS,
                    uploadRequestId,
                    request =>
                {
                    Debug.Log($"success ios asset upload, uploaded url : {request.url}");
                    iosAssetUploadProcess         = true;
                    uploadStatus[UploadState.IOS] = true;
                },
                    exception =>
                {
                    HandleError(exception);
                    iosAssetUploadProcess = true;
                }
                    );
                uploadAssetServiceList.Add(iosAssetUploadService);
            }

            // if (!uploadStatus[UploadState.UnityPackage])
            // {
            //     var unityPackageUploadService = new UploadAssetService(
            //         accessToken,
            //         "unitypackage",
            //         EditorPrefsUtils.LastExportPackage,
            //         uploadRequestId,
            //         request =>
            //         {
            //             Debug.Log($"success unitypackage upload, uploaded url : {request.url}");
            //             unityPackageUploadProcess = true;
            //             uploadStatus[UploadState.UnityPackage] = true;
            //         },
            //         exception =>
            //         {
            //             HandleError(exception);
            //             unityPackageUploadProcess = true;
            //         }
            //     );
            //     uploadAssetServiceList.Add(unityPackageUploadService);
            // }

            uploadAssetServiceList.ForEach(x => x.Run());

            //while (!winAssetUploadProcess || !macAssetUploadProcess || !androidAssetUploadProcess || !unityPackageUploadProcess)
            while (!winAssetUploadProcess || !macAssetUploadProcess || !androidAssetUploadProcess || !iosAssetUploadProcess)
            {
                yield return(null);
            }

            if (!uploadStatus[UploadState.Windows] ||
                !uploadStatus[UploadState.Mac] ||
                !uploadStatus[UploadState.Android] ||
                !uploadStatus[UploadState.IOS])
            {
                yield break;
            }

            if (!uploadStatus[UploadState.PostProcess])
            {
                var postNotifyFinishProcess = false;
                var notifyFinishedRequest   = new PostNotifyFinishedUploadService(
                    accessToken,
                    venue.VenueId,
                    uploadRequestId,
                    false,
                    request =>
                {
                    Debug.Log($"notify finished upload request, Request ID : {request.UploadRequestId}");
                    uploadRequestId         = null;
                    postNotifyFinishProcess = true;
                    uploadStatus[UploadState.PostProcess] = true;
                    completionResponse = request;
                },
                    exception =>
                {
                    HandleError(exception);
                    postNotifyFinishProcess = true;
                }
                    );
                notifyFinishedRequest.Run();

                while (!postNotifyFinishProcess)
                {
                    yield return(null);
                }
            }

            if (!uploadStatus[UploadState.PostProcess])
            {
                yield break;
            }

            onSuccess?.Invoke(completionResponse);
            isProcessing = false;
        }