/// <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);
        }