/// <summary> /// Creates a new Issue. /// </summary> /// <param name="publicProjectId">The public ID of the Project.</param> /// <param name="publicEpicId">The public ID of the Epic (if any).</param> /// <param name="issueType">The IssueType.</param> /// <param name="name">The name of the Issue.</param> /// <param name="description">A description of the Issue.</param> /// <param name="status">The status of the Issue.</param> /// <param name="estimate">The estimate for the Issue (if any).</param> /// <returns>An awaitable Task of type Issue.</returns> public async Task <Issue> CreateIssueAsync(Guid publicProjectId, Guid?publicEpicId, string issueType, string name, string description, string status, int?estimate) { //get Project Project project = await projectRepository.GetProjectAsync(publicProjectId); if (project == null) { throw new NotFoundException(); } //validate input List <ValidationError> validationErrors = new List <ValidationError>(); //get Epic Epic epic = null; if (publicEpicId != null) { epic = await epicRepository.GetEpicAsync((Guid)publicEpicId); if (epic == null) { validationErrors.Add(new ValidationError("epicId", "Must be a valid epic ID.")); } } //validate type if (!Enum.TryParse(issueType, out IssueType parsedIssueType)) { validationErrors.Add(new ValidationError("issueType", "Must be a valid issue type.")); } //validate name is set if (!name.ValidateIsSet()) { validationErrors.Add(new ValidationError("name", "Must be set.")); } //validate name max length 64 if (!name.ValidateMaxLength(64)) { validationErrors.Add(new ValidationError("name", "Must be shorter than 64 characters.")); } //validate description max length 512 if (!description.ValidateMaxLength(512)) { validationErrors.Add(new ValidationError("description", "Must be shorter than 512 characters.")); } //validate status if (!Enum.TryParse(status, out Status parsedStatus)) { validationErrors.Add(new ValidationError("status", "Must be a valid status.")); } //throw ValidationException if necessary if (validationErrors.Any()) { throw new ValidationException(validationErrors); } //create Issue Issue output = await issueRepository.CreateIssueAsync(project.ProjectId, epic?.EpicId, parsedIssueType, name, description, parsedStatus, estimate); return(output); }