internal JSONRPC_Output WorkflowRequestCreate(WorkflowRequest_DTO DTO, ADO Ado, string SamAccountName) { JSONRPC_Output response = new JSONRPC_Output(); //Validation of parameters and user have been successful. We may now proceed to read from the database var adoWorkflowRequest = new WorkflowRequest_ADO(); //check if this release already has a Current WorkflowRequest if (adoWorkflowRequest.IsCurrent(Ado, DTO.RlsCode)) { //Can't create a comment so we can't proceed Log.Instance.Debug("Release already has a live Workflow, can't create"); response.error = Label.Get("error.duplicate"); return(response); } //Get Release Release_ADO releaseAdo = new Release_ADO(Ado); Release_DTO releaseDTO = Release_ADO.GetReleaseDTO(releaseAdo.Read(DTO.RlsCode, SamAccountName)); if (releaseDTO == null) { Log.Instance.Debug("Release Code not found"); response.error = Label.Get("error.duplicate"); return(response); } Request_ADO adoRequest = new Request_ADO(); Request_DTO dtoRequest = new Request_DTO { RlsCode = DTO.RlsCode }; Release_ADO adoRelease = new Release_ADO(Ado); //We must validate the request, depending on the RequestCode and the current state of the Release switch (DTO.RqsCode) { case Constants.C_WORKFLOW_REQUEST_PUBLISH: if (!adoRelease.IsWip(dtoRequest.RlsCode)) { Log.Instance.Debug("The requested Release Code is not the WIP Release"); response.error = Label.Get("error.create"); return(response); } break; case Constants.C_WORKFLOW_REQUEST_PROPERTY: //Release must be CURRENT LIVE - RlsLiveFlag is live only between from and to dates if (!adoRelease.IsLiveNow(dtoRequest.RlsCode) && !adoRelease.IsLiveNext(dtoRequest.RlsCode)) { Log.Instance.Debug("Cannot create a Flag Request. The Release must be either current Live or Next Live"); response.error = Label.Get("error.create"); return(response); } break; case Constants.C_WORKFLOW_REQUEST_DELETE: //What about WIP? - not a workflow request but it is part of Release. It will have its own API. //Release must be LIVE NEXT, CURRENT LIVE or WIP if (!adoRelease.IsLiveNow(dtoRequest.RlsCode) && !adoRelease.IsLiveNext(dtoRequest.RlsCode) && !adoRelease.IsWip(dtoRequest.RlsCode)) { Log.Instance.Debug("Can't create a DELETE Request on a historical Release"); response.error = Label.Get("error.create"); return(response); } break; case Constants.C_WORKFLOW_REQUEST_ROLLBACK: //Release must be CURRENT LIVE OR NEXT LIVE and PREVIOUS must exist if ((!adoRelease.IsLiveNow(dtoRequest.RlsCode) && !adoRelease.IsLiveNext(dtoRequest.RlsCode)) || !adoRelease.HasPrevious(dtoRequest.RlsCode)) { Log.Instance.Debug("Can't create a ROLLBACK Request because (a) the Request is neither live nor pending-live or (b) there is no valid Release to roll back to."); response.error = Label.Get("error.create"); return(response); } break; default: Log.Instance.Debug("Invalid Request Code"); response.error = Label.Get("error.validation"); return(response); } var adoComment = new Comment_ADO(); int commentCode = adoComment.Create(Ado, DTO, SamAccountName); if (commentCode == 0) { //Can't create a comment so we can't proceed Log.Instance.Debug("Can't create a comment - WorkflowRequest create request refused"); response.error = Label.Get("error.create"); return(response); } DTO.CmmCode = commentCode; //Create the WorkflowRequest - and retrieve the newly created Id int newId = adoWorkflowRequest.Create(Ado, DTO, SamAccountName); if (newId == 0) { response.error = Label.Get("error.create"); return(response); } response.data = JSONRPC.success; List <WorkflowRequest_DTO> dtoWrqList = adoWorkflowRequest.Read(Ado, DTO.RlsCode, true); if (dtoWrqList.Count == 1) { Email_BSO_NotifyWorkflow notify = new Email_BSO_NotifyWorkflow(); try { notify.EmailRequest(dtoWrqList[0], releaseDTO, Ado); } catch { } } else { Log.Instance.Error("Email failed"); } return(response); }
internal JSONRPC_Output WorkflowResponseCreate(WorkflowResponse_DTO DTO, ADO Ado, string SamAccountName) { JSONRPC_Output response = new JSONRPC_Output(); //We need to get the Request for notification purposes WorkflowRequest_ADO adoWrq = new WorkflowRequest_ADO(); List <WorkflowRequest_DTO> dtoWrqList = adoWrq.Read(Ado, DTO.RlsCode, true); if (dtoWrqList.Count > 1) { //Multiple requests found for this release Log.Instance.Debug("More than one request found for this release "); response.error = Label.Get("error.create"); return(response); } if (dtoWrqList.Count == 0) { //No request found for this release Log.Instance.Debug("No request found for this release "); response.error = Label.Get("error.create"); return(response); } //Validation of parameters and user have been successful. We may now proceed to read from the database var adoWorkflowRequest = new WorkflowRequest_ADO(); if (!adoWorkflowRequest.IsCurrent(Ado, DTO.RlsCode)) { //No workflow found Log.Instance.Debug("No Live workflow found for this Release Code"); response.error = Label.Get("error.create"); return(response); } var adoWorkflowResponse = new WorkflowResponse_ADO(); //If this is a Moderator, we need to check if the user is in the same group as the release and has approve rights Account_BSO acBso = new Account_BSO(); if (acBso.IsModerator(Ado, SamAccountName)) { var approveRlsList = adoWorkflowResponse.GetApproverAccess(Ado, SamAccountName, true, DTO.RlsCode); if (approveRlsList.data.Count == 0) { Log.Instance.Debug("Insufficient access for a Moderator"); response.error = Label.Get("error.authentication"); return(response); } } //Check that there isn't already a WorkflowResponse for this Release if (adoWorkflowResponse.IsInUse(Ado, DTO)) { //Duplicate Workflow exists Log.Instance.Debug("Workflow Response exists already, can't create"); response.error = Label.Get("error.duplicate"); return(response); } var adoComment = new Comment_ADO(); int commentCode = adoComment.Create(Ado, DTO, SamAccountName); if (commentCode == 0) { //Can't create a comment so we can't proceed Log.Instance.Debug("Can't create comment - create WorkflowResponse refused"); response.error = Label.Get("error.create"); return(response); } DTO.CmmCode = commentCode; int createResponse = adoWorkflowResponse.Create(Ado, DTO, SamAccountName); if (createResponse == 0) { response.error = Label.Get("error.create"); return(response); } //If this is a Reject then we must reset the workflow to stop it being current if (DTO.RspCode.Equals(Resources.Constants.C_WORKFLOW_STATUS_REJECT)) { WorkflowRequest_DTO_Update dtoRequest = new WorkflowRequest_DTO_Update(DTO.RlsCode) { WrqCurrentFlag = false }; adoWorkflowRequest.Update(Ado, dtoRequest, SamAccountName); } response.data = JSONRPC.success; //Get Release Release_ADO releaseAdo = new Release_ADO(Ado); Release_DTO releaseDTO = Release_ADO.GetReleaseDTO(releaseAdo.Read(DTO.RlsCode, SamAccountName)); Security.ActiveDirectory_DTO responseUser = new Security.ActiveDirectory_DTO() { CcnUsername = SamAccountName }; Security.ActiveDirectory_ADO accAdo = new Security.ActiveDirectory_ADO(); Security.Account_DTO_Read accDto = new Security.Account_DTO_Read() { CcnUsername = responseUser.CcnUsername }; DTO.ResponseAccount = accAdo.GetUser(Ado, accDto); Email_BSO_NotifyWorkflow notify = new Email_BSO_NotifyWorkflow(); try { notify.EmailResponse(dtoWrqList[0], DTO, releaseDTO); } catch { } return(response); }