public ActionResult SaveDocument(string projectCode, int projectId, int issueId, string documentId)
        {
            if (NoSettings())
            {
                return(Redirect("~/configure"));
            }

            UserWidgetData <LucidChartUser> userData = GeminiContext.UserWidgetStore.Get <LucidChartUser>(CurrentUser.Entity.Id, Constants.AppId, Constants.ControlId);

            if (userData == null || userData.IsNew)
            {
                return(Authenticate(string.Empty, string.Empty, string.Format("apps/lucidchart/editdocument/{0}/{1}/{2}", projectCode, projectId, issueId)));
            }

            string name = new LucidChartsConsumer(UserContext.Url, userData.Value).GetDocumentDescription(documentId).Name;

            byte[] img = new LucidChartsConsumer(UserContext.Url, userData.Value).GetDocumentImage(documentId, 0, 500, false);

            byte[] thumb = new LucidChartsConsumer(UserContext.Url, userData.Value).GetDocumentImage(documentId, 0, 128, true);

            IssueWidgetData <List <LucidChartData> > data = GeminiContext.IssueWidgetStore.Get <List <LucidChartData> >(issueId, Constants.AppId, Constants.ControlId);

            if (data == null || data.IsNew)
            {
                data = new IssueWidgetData <List <LucidChartData> >();

                data.IssueId = issueId;

                data.AppId = Constants.AppId;

                data.ControlId = Constants.ControlId;

                data.Value = new List <LucidChartData>();
            }

            LucidChartData doc = data.Value.Find(d => string.Compare(d.DocumentId, documentId, true) == 0);

            if (doc == null)
            {
                data.Value.Add(new LucidChartData()
                {
                    DocumentId = documentId, Image = img, ThumnailImage = thumb, DocumentName = name
                });
            }
            else
            {
                doc.DocumentName = name;

                doc.Image = img;

                doc.ThumnailImage = thumb;
            }

            GeminiContext.IssueWidgetStore.Save <List <LucidChartData> >(data.IssueId, data.AppId, data.ControlId, data.Value);

            string redirectURL = Countersoft.Gemini.Infrastructure.Helpers.NavigationHelper.GetIssuePageUrl(projectId, projectCode, issueId, UserContext.Card.Id, UserContext.Url);

            return(Redirect(redirectURL));
        }
        public ActionResult Image(string appid, string controlid, int issueid, string documentid)
        {
            IssueWidgetData <List <LucidChartData> > data = GeminiContext.IssueWidgetStore.Get <List <LucidChartData> >(issueid, appid, controlid);

            LucidChartData image = data.Value.Find(d => string.Compare(d.DocumentId, documentid, true) == 0);

            return(File(image == null ? new byte[0] : image.Image, "image/png"));
        }
예제 #3
0
        public ContentResult Save(int issueId)
        {
            IssueWidgetData <List <ChecklistData> > data = GeminiContext.IssueWidgetStore.Get <List <ChecklistData> >(issueId, AppGuid, AppControlGuid);

            int checkId = Request["checkId"].ToInt(0);

            bool checkedStatus = Request["checkedState"].ToBool();
            bool isNewItem     = false;

            if (data == null)
            {
                data = new IssueWidgetData <List <ChecklistData> >();
            }

            if (data.Value == null)
            {
                data.Value = new List <ChecklistData>();
            }

            ChecklistData item = data.Value.Find(i => i.CheckId == checkId);

            if (item == null)
            {
                item = new ChecklistData()
                {
                    CheckId = checkId
                };
                isNewItem = true;
            }

            if (item != null && item.CheckId == checkId)
            {
                item.Checked = checkedStatus;

                item.CheckedBy = CurrentUser.Fullname;

                item.CheckedDate = DateTime.UtcNow;

                if (!item.Checked)
                {
                    item.CheckedBy = string.Empty;
                }
            }

            if (isNewItem)
            {
                data.Value.Add(item);
            }

            GeminiContext.IssueWidgetStore.Save(issueId, AppGuid, AppControlGuid, data.Value);

            return(JsonSuccess(AppManager.Instance.ItemContentWidgetsOnShow(this, UserContext, GeminiContext, Cache, UserContext.Issue, AppGuid, AppControlGuid), ""));
        }
        public ActionResult DeleteDocument(string projectCode, int projectId, int issueId, string documentId)
        {
            if (NoSettings())
            {
                return(Redirect("~/configure"));
            }

            IssueWidgetData <List <LucidChartData> > data = GeminiContext.IssueWidgetStore.Get <List <LucidChartData> >(issueId, Constants.AppId, Constants.ControlId);

            if (data.Value.RemoveAll(c => string.Compare(c.DocumentId, documentId, true) == 0) > 0)
            {
                GeminiContext.IssueWidgetStore.Save <List <LucidChartData> >(issueId, Constants.AppId, Constants.ControlId, data.Value);
            }

            return(JsonSuccess());
        }
예제 #5
0
        private IssueWidgetData <List <ChecklistData> > GetData(IssueDto issue)
        {
            IssueWidgetData <List <ChecklistData> > result = new IssueWidgetData <List <ChecklistData> >()
            {
                Value = new List <ChecklistData>(), AppId = AppGuid, IssueId = issue.Id, ControlId = AppControlGuid
            };

            GlobalConfigurationWidgetData <ChecklistConfigDataModel> data = GeminiContext.GlobalConfigurationWidgetStore.Get <ChecklistConfigDataModel>(AppGuid);

            if (data == null || data.Value == null || data.Value.Data == null)
            {
                return(result);
            }

            var templateData = data.Value.Data.Find(t => t.TemplateId == issue.Project.TemplateId);

            if (templateData == null)
            {
                return(result);
            }

            IssueWidgetData <List <ChecklistData> > issueData = GeminiContext.IssueWidgetStore.Get <List <ChecklistData> >(issue.Id, AppGuid, AppControlGuid);

            foreach (var item in templateData.Items)
            {
                ChecklistData existingItem = issueData != null && issueData.Value != null && issueData.Value.Count > 0 ? issueData.Value.Find(s => s.CheckId == item.Id) : null;

                if (existingItem == null)
                {
                    result.Value.Add(new ChecklistData {
                        CheckId = item.Id, CheckTitle = item.Title
                    });
                }
                else
                {
                    existingItem.CheckedDate = existingItem.CheckedDate.ToLocal(UserContext.User.TimeZone);

                    existingItem.CheckTitle = item.Title;
                    result.Value.Add(existingItem);
                }
            }

            result.Value.Sort((x, y) => x.CheckTitle.HasValue() ? x.CheckTitle.CompareTo(y.CheckTitle) : -1);

            return(result);
        }
예제 #6
0
        public WidgetResult GetCommits(IssueDto args)
        {
            var commits = GeminiContext.CodeCommits.GetAll(args.Id);

            var data = new IssueWidgetData <List <SourceControlContainer> >();

            data.Value = new List <SourceControlContainer>();

            if (commits != null)
            {
                foreach (var commit in commits)
                {
                    var dataHolder = new SourceControlContainer();

                    dataHolder.commits = commit.Data.FromJson <SourceControlCommit>();

                    if (commit.Provider == SourceControlProvider.GitHub)
                    {
                        dataHolder.commits.ExtraData = dataHolder.commits.RepositoryUrl.ReplaceIgnoreCase("https://api.github.com", "https://github.com");
                    }

                    dataHolder.Provider = commit.Provider;

                    dataHolder.Fullname = commit.Fullname;

                    dataHolder.Created = commit.Created.ToLocal(UserContext.User.TimeZone);

                    dataHolder.Comment = commit.Comment;

                    dataHolder.CommitBlock = ParseCommentBlock(commit.Comment, args, dataHolder.commits.RevisionId);

                    data.Value.Add(dataHolder);
                }
            }

            data.IssueId = args.Id;

            WidgetResult result = new WidgetResult();

            result.Markup = new WidgetMarkup("views//index.cshtml", data);

            result.Success = true;

            return(result);
        }
예제 #7
0
        public override WidgetResult OnShow(ItemWidgetArguments args)
        {
            WidgetResult result = new WidgetResult();

            IssueWidgetData <string> data = args.GeminiContext.IssueWidgetStore.Get <string>(args.Item.Id, AppId, ControlId);

            if (data == null || data.Value == null)
            {
                data         = new IssueWidgetData <string>();
                data.Value   = "Default!";
                data.IssueId = args.Item.Id;

                args.GeminiContext.IssueWidgetStore.Save(args.Item.Id, AppId, ControlId, data.Value);
            }

            result.Markup  = new WidgetMarkup("views\\my-view.cshtml", data);
            result.Success = true;

            return(result);
        }
예제 #8
0
        public override WidgetResult Show(IssueDto issue = null)
        {
            WidgetResult result = new WidgetResult();

            IssueWidgetData <string> data = GeminiContext.IssueWidgetStore.Get <string>(issue.Id, AppGuid, AppControlGuid);

            if (data == null || data.Value == null)
            {
                data         = new IssueWidgetData <string>();
                data.Value   = "Default!";
                data.IssueId = issue.Id;

                GeminiContext.IssueWidgetStore.Save(issue.Id, AppGuid, AppControlGuid, data.Value);
            }

            result.Markup  = new WidgetMarkup("views\\my-view.cshtml", data);
            result.Success = true;

            return(result);
        }
예제 #9
0
        public override WidgetResult OnShow(ItemWidgetArguments args)
        {
            WidgetResult result = new WidgetResult();

            IssueWidgetData<string> data = args.GeminiContext.IssueWidgetStore.Get<string>(args.Item.Id, AppId, ControlId);

            if (data == null || data.Value == null)
            {
                data = new IssueWidgetData<string>();
                data.Value = "Default!";
                data.IssueId = args.Item.Id;

                args.GeminiContext.IssueWidgetStore.Save(args.Item.Id, AppId, ControlId, data.Value);
            }

            result.Markup = new WidgetMarkup("views\\my-view.cshtml", data);
            result.Success = true;

            return result;
        }
예제 #10
0
        public override WidgetResult Show(IssueDto issue = null)
        {
            WidgetResult result = new WidgetResult();

            IssueWidgetData<string> data = GeminiContext.IssueWidgetStore.Get<string>(issue.Id, AppGuid, AppControlGuid);

            if (data == null || data.Value == null)
            {
                data = new IssueWidgetData<string>();
                data.Value = "Default!";
                data.IssueId = issue.Id;

                GeminiContext.IssueWidgetStore.Save(issue.Id, AppGuid, AppControlGuid, data.Value);
            }

            result.Markup = new WidgetMarkup("views\\my-view.cshtml", data);
            result.Success = true;

            return result;
        }
        public override WidgetResult Show(IssueDto item)
        {
            WidgetResult result = new WidgetResult();

            bool hasData = false;

            IssueWidgetData <List <LucidChartData> > data = GeminiContext.IssueWidgetStore.Get <List <LucidChartData> >(item.Id, Constants.AppId, Constants.ControlId);

            if (data != null && data.Value.Count > 0)
            {
                hasData = true;
            }

            LucidChartModel model = new LucidChartModel {
                IssueId = item.Id.ToString(), AppId = Constants.AppId, ControlId = Constants.ControlId, ProjectId = item.Project.Id.ToString(), ProjectCode = item.Project.Code, HasData = hasData, LucidChartData = data, IsGeminiLicenseFree = GeminiApp.GeminiLicense.IsFree, IsGeminiTrial = GeminiApp.LicenseSummary.IsGeminiTrial(), Url = UserContext.Url.Substring(0, UserContext.Url.Length - 1)
            };

            result.Success = true;

            result.Markup = new WidgetMarkup("views\\LucidChart.cshtml", model);

            return(result);
        }
예제 #12
0
        public ActionResult Add(int issueId, string tfsId)
        {
            IssueWidgetData <List <string> > data = GeminiContext.IssueWidgetStore.Get <List <string> >(issueId, Constants.AppId, Constants.ControlId);

            if (data == null || data.Value == null)
            {
                data = new IssueWidgetData <List <string> >();

                data.AppId = Constants.AppId;

                data.ControlId = Constants.ControlId;

                data.IssueId = issueId;

                data.Value = new List <string>();
            }

            data.Value.AddRange(tfsId.TrimEnd(',').Split(','));

            GeminiContext.IssueWidgetStore.Save(data);

            return(JsonSuccess(AppManager.Instance.ItemContentWidgetsOnShow(this, UserContext, GeminiContext, Cache, UserContext.Issue, Constants.AppId, Constants.ControlId)));
        }
예제 #13
0
        public ActionResult Delete(int issueId, string tfsRow)
        {
            IssueWidgetData <List <string> > data = GeminiContext.IssueWidgetStore.Get <List <string> >(issueId, Constants.AppId, Constants.ControlId);

            issueId = data.IssueId;

            if (data == null || data.Value == null)
            {
                return(JsonError());
            }

            var index = data.Value.FindIndex(d => string.Compare(d, tfsRow, StringComparison.InvariantCultureIgnoreCase) == 0);

            if (index == -1)
            {
                return(JsonError());
            }

            data.Value.RemoveAt(index);

            GeminiContext.IssueWidgetStore.Save(data);

            return(JsonSuccess(AppManager.Instance.ItemContentWidgetsOnShow(this, UserContext, GeminiContext, Cache, UserContext.Issue, Constants.AppId, Constants.ControlId)));
        }
예제 #14
0
        public ActionResult GetComment(int issueId)
        {
            IssueWidgetData <List <Comment> > data = GeminiContext.IssueWidgetStore.Get <List <Comment> >(issueId, Constants.AppId, Constants.ControlId);

            var formLinenumber = Request.Form["linenr"] ?? String.Empty;

            var formFileName = Request.Form["filename"] ?? String.Empty;

            var formChangesetId = Request.Form["changesetid"] ?? String.Empty;

            var formFileId = Request.Form["fileid"] ?? String.Empty;

            var formProvider = Request.Form["provider"] ?? String.Empty;

            var formRepositoryUrl = Request.Form["repositoryurl"] ?? String.Empty;

            SourceControlProvider Provider;

            try
            {
                Provider = (SourceControlProvider)Enum.Parse(typeof(SourceControlProvider), formProvider, true);
            }
            catch (ArgumentException)
            {
                Provider = SourceControlProvider.GitHub; //TODO maybe change to zero for default ? Check with saar
            }

            var comment = new Comment();

            if (data != null)
            {
                comment = data.Value.Find((f => f.FileName == formFileName && f.Provider == Provider && f.LineNumber == formLinenumber && f.RepositoryUrl == formRepositoryUrl && f.ChangesetId == formChangesetId));
            }

            return(JsonSuccess(new { comment = comment }));
        }
예제 #15
0
        public override WidgetResult Show(IssueDto issueItem)
        {
            WidgetResult result = new WidgetResult();

            if (!_validLicense)
            {
                _validLicense = !GeminiApp.LicenseSummary.IsFree || GeminiApp.LicenseSummary.IsGeminiTrial();

                if (!_validLicense)
                {
                    result.Markup  = new WidgetMarkup(UnlicensedMessage);
                    result.Success = true;
                    return(result);
                }
            }

            List <string> tfsDetails = new List <string>();

            IssueWidgetData <List <string> > data = GeminiContext.IssueWidgetStore.Get <List <string> >(issueItem.Entity.Id, Constants.AppId, Constants.ControlId);

            if (data != null && data.Value != null && data.Value.Count > 0)
            {
                tfsDetails = data.Value;
            }

            Dictionary <string, WorkItem> details = new Dictionary <string, WorkItem>();

            Pair <int, string> authenticationModel = new Pair <int, string>(issueItem.Entity.Id, string.Concat("apps/tfspicker/authenticate/", issueItem.Entity.Id));

            if (tfsDetails.Count > 0)
            {
                if (AuthenticateUser(issueItem))
                {
                    //IsTfs2012();
                    foreach (var tfs in tfsDetails)
                    {
                        try
                        {
                            string url;

                            var item = GetItem(tfs, out url);

                            if (item != null)
                            {
                                if (url == null)
                                {
                                    url = string.Format("{0}/web/UI/Pages/WorkItems/WorkItemEdit.aspx?id={1}&pguid={2}", RepositoryUrl, item.Id, item.Project.Guid);
                                }

                                /*if (isTfs2012)
                                 * {
                                 * url = string.Format("{0}/DefaultCollection/Countersoft/_workitems#_a=edit&id={1}", RepositoryUrl, item.Id);
                                 * }
                                 * else
                                 * {
                                 *  url = string.Format("{0}/web/UI/Pages/WorkItems/WorkItemEdit.aspx?id={1}&pguid={2}", RepositoryUrl, item.Id, item.Project.Guid);
                                 * }*/
                                if (!details.ContainsKey(url))
                                {
                                    details.Add(url, item);
                                }
                            }

                            Dictionary <string, TfsPickerItem> tfsPickerModel = ConvertWorkItemsToTfsPickerItems(details);

                            result.Markup = new WidgetMarkup("views\\items.cshtml", tfsPickerModel);
                        }
                        catch (Exception ex)
                        {
                            result.Markup = new WidgetMarkup("views\\authenticationForm.cshtml", authenticationModel);

                            GeminiApp.LogException(new Exception(ex.Message)
                            {
                                Source = "TFS Picker"
                            }, false);
                        }
                    }
                }
                else
                {
                    result.Markup = new WidgetMarkup("views\\authenticationForm.cshtml", authenticationModel);
                }
            }
            else
            {
                try
                {
                    if (AuthenticateUser(issueItem))
                    {
                        string url;

                        var item = GetItem("", out url);

                        Dictionary <string, TfsPickerItem> tfsPickerModel = ConvertWorkItemsToTfsPickerItems(details);

                        result.Markup = new WidgetMarkup("views\\items.cshtml", tfsPickerModel);
                    }
                    else
                    {
                        result.Markup = new WidgetMarkup("views\\authenticationForm.cshtml", authenticationModel);
                    }
                }
                catch (Exception ex)
                {
                    result.Markup = new WidgetMarkup("views\\authenticationForm.cshtml", authenticationModel);

                    GeminiApp.LogException(new Exception(ex.Message)
                    {
                        Source = "TFS Picker"
                    }, false);
                }
            }

            result.Success = true;

            return(result);
        }
예제 #16
0
        public ActionResult AddComment(int issueId)
        {
            IssueWidgetData <List <Comment> > data = GeminiContext.IssueWidgetStore.Get <List <Comment> >(issueId, Constants.AppId, Constants.ControlId);

            var formComment = Request.Form["comment"] ?? String.Empty;

            var formLineNumber = Request.Form["linenr"] ?? String.Empty;

            var formChangesetId = Request.Form["changesetid"] ?? String.Empty;

            var formFileId = Request.Form["fileid"] ?? String.Empty;

            var formFileName = Request.Form["filename"] ?? String.Empty;

            var formProvider = Request.Form["provider"] ?? String.Empty;

            var formRepositoryUrl = Request.Form["repositoryurl"] ?? String.Empty;

            bool isDeleted = false;

            if (!formFileName.IsEmpty() && !formLineNumber.IsEmpty() && !formRepositoryUrl.IsEmpty())
            {
                Comment comment = new Comment();

                comment.ChangesetId = formChangesetId;

                comment.Date = DateTime.Now;

                comment.Fullname = UserContext.User.Fullname;

                comment.Message = formComment;

                comment.LineNumber = formLineNumber;

                comment.FileName = formFileName;

                comment.FileId = formFileId;

                comment.RepositoryUrl = formRepositoryUrl;

                SourceControlProvider Provider;

                try
                {
                    Provider = (SourceControlProvider)Enum.Parse(typeof(SourceControlProvider), formProvider, true);
                }
                catch (ArgumentException ex)
                {
                    Provider = SourceControlProvider.GitHub; //TODO maybe change to zero for default ? Check with saar
                }

                comment.Provider = Provider;

                // If it's the first comment, setup a new comment list
                if (data == null)
                {
                    data = new IssueWidgetData <List <Comment> >();

                    data.Value = new List <Comment>();

                    data.Value.Add(comment);

                    data.IssueId = issueId;

                    GeminiContext.IssueWidgetStore.Save(data.IssueId, Constants.AppId, Constants.ControlId, data.Value);
                }
                else
                {
                    var tmpComment = data.Value.Find(f => f.FileName == formFileName && f.Provider == Provider && f.LineNumber == formLineNumber && f.RepositoryUrl == formRepositoryUrl && f.ChangesetId == formChangesetId);
                    // IF current code line was already commented on, get comment and update message
                    if (tmpComment != null)
                    {
                        var index = data.Value.FindIndex(f => f.FileName == formFileName && f.Provider == Provider && f.LineNumber == formLineNumber && f.RepositoryUrl == formRepositoryUrl && f.ChangesetId == formChangesetId);

                        // If new message is empty, remove comment from DB
                        if (formComment.IsEmpty())
                        {
                            data.Value.RemoveAt(index);

                            data.IssueId = issueId;

                            isDeleted = true;
                        }
                        else
                        {
                            data.Value[index].Message = formComment;

                            data.IssueId = issueId;
                        }
                    }
                    else
                    {
                        // Add a new comment
                        data.Value.Add(comment);

                        data.IssueId = issueId;
                    }

                    GeminiContext.IssueWidgetStore.Save(data.IssueId, Constants.AppId, Constants.ControlId, data.Value);
                }

                return(JsonSuccess(new { isdeleted = isDeleted }));
            }
            else
            {
                return(JsonError());
            }
        }
예제 #17
0
        public ActionResult Authenticate(int issueId)
        {
            //Authentication
            string username = Request["username"] ?? string.Empty;

            string password = Request["password"] ?? string.Empty;

            string repositoryUrl = Request["repositoryurl"] ?? string.Empty;

            string message = string.Empty;

            bool success = true;

            string dataView = string.Empty;

            if (username.IsEmpty() || password.IsEmpty() || repositoryUrl.IsEmpty())
            {
                message = "Please make sure Username, Password and Url are not empty";
                success = false;
            }

            if (success)
            {
                UserWidgetDataDetails userData = new UserWidgetDataDetails();

                userData.Username = username.Trim();

                userData.Password = SecretsHelper.Encrypt(password.Trim(), SecretsHelper.EncryptionKey);

                userData.RepositoryUrl = repositoryUrl.Trim();

                SaveLoginDetails(CurrentUser, userData, GeminiContext);

                TFSPicker tfsPicker = new TFSPicker();

                try
                {
                    ItemWidgetArguments args = new ItemWidgetArguments(UserContext, GeminiContext, Cache, System.Web.HttpContext.Current.Request, CurrentIssue);

                    tfsPicker.AuthenticateUser(args);

                    UserWidgetDataDetails loginDetails = tfsPicker.getLoginDetails();

                    TFSPicker.ConnectByImplementingCredentialsProvider connect = new TFSPicker.ConnectByImplementingCredentialsProvider();

                    ICredentials iCred = new NetworkCredential(loginDetails.Username, loginDetails.Password);

                    connect.setLoginDetails(loginDetails.Username, loginDetails.Password, loginDetails.RepositoryUrl);

                    connect.GetCredentials(new Uri(loginDetails.RepositoryUrl), iCred);

                    TfsConfigurationServer configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(new Uri(loginDetails.RepositoryUrl));


                    configurationServer.Credentials = iCred;

                    if (TFSPicker.IsBasicAuth)
                    {
                        configurationServer.ClientCredentials = new TfsClientCredentials(new BasicAuthCredential(iCred));
                    }
                    else
                    {
                        configurationServer.ClientCredentials = new TfsClientCredentials(new WindowsCredential(iCred));
                    }

                    try
                    {
                        configurationServer.EnsureAuthenticated();
                    }
                    catch
                    {
                        System.Threading.Thread.Sleep(1000);
                        configurationServer             = TfsConfigurationServerFactory.GetConfigurationServer(new Uri(loginDetails.RepositoryUrl));
                        configurationServer.Credentials = iCred;

                        if (TFSPicker.IsBasicAuth)
                        {
                            configurationServer.ClientCredentials = new TfsClientCredentials(new BasicAuthCredential(iCred));
                        }
                        else
                        {
                            configurationServer.ClientCredentials = new TfsClientCredentials(new WindowsCredential(iCred));
                        }
                        configurationServer.EnsureAuthenticated();
                    }
                }
                catch (Exception ex)
                {
                    var logindetails = GeminiContext.UserWidgetStore.Get <UserWidgetDataDetails>(CurrentUser.Entity.Id, Constants.AppId, Constants.ControlId);

                    if (logindetails != null)
                    {
                        GeminiContext.UserWidgetStore.Delete(logindetails.Id);
                    }

                    success = false;

                    message = ex.Message;

                    GeminiApp.LogException(new Exception(ex.Message)
                    {
                        Source = "TFS Picker"
                    }, false);

                    return(JsonSuccess(new { success = success, message = message }));
                }

                tfsPicker.setLoginDetails(userData.Username, password.Trim(), userData.RepositoryUrl);

                WidgetResult result = new WidgetResult();

                List <string> tfsDetails = new List <string>();

                IssueWidgetData <List <string> > data = GeminiContext.IssueWidgetStore.Get <List <string> >(issueId, Constants.AppId, Constants.ControlId);

                if (data != null && data.Value != null && data.Value.Count > 0)
                {
                    tfsDetails = data.Value;
                }

                List <WorkItem> details = new List <WorkItem>();

                foreach (var tfs in tfsDetails)
                {
                    try
                    {
                        string url;

                        UserWidgetDataDetails loginDetails = tfsPicker.getLoginDetails();

                        if (Username.IsEmpty())
                        {
                            Username = loginDetails.Username;
                        }

                        if (Password.IsEmpty())
                        {
                            Password = loginDetails.Password;
                        }

                        if (RepositoryUrl.IsEmpty())
                        {
                            RepositoryUrl = loginDetails.RepositoryUrl;
                        }

                        var item = GetItem(tfs, out url);

                        if (item != null)
                        {
                            details.Add(item);
                        }
                    }
                    catch (Exception ex)
                    {
                        success = false;

                        message = ex.Message;

                        GeminiApp.LogException(new Exception(ex.Message)
                        {
                            Source = "TFS Picker"
                        }, false);
                    }
                }
            }

            return(JsonSuccess(new { success = success, message = message }));
        }
예제 #18
0
        public ActionResult GetFileDiff(int issueId)
        {
            string newFile = string.Empty;

            string oldFile = string.Empty;

            string fileName = Request["filename"] ?? string.Empty;

            string fullfilename = Request["fullfilename"] ?? string.Empty;

            string provider = Request["provider"] ?? string.Empty;

            string revisionid = Request["revisionid"] ?? string.Empty;

            string fileid = Request["fileid"] ?? string.Empty;

            string repositoryUrl = Request["repositoryurl"] ?? string.Empty;

            string workspace = Request["workspace"] ?? string.Empty;

            fileName = fileName.Trim();

            fullfilename = fullfilename.Trim();

            provider = provider.Trim();

            revisionid = revisionid.Trim();

            fileid = fileid.Trim();

            repositoryUrl = repositoryUrl.Trim();

            workspace = workspace.Trim();

            //Authentication details
            string authenticateForm = string.Empty;

            bool IsUserAuthorized = false;

            bool isFileIdMissing = false;

            string data = string.Empty;

            string errorMessage = string.Empty;

            if (!repositoryUrl.IsEmpty())
            {
                if (provider == SourceControlProvider.GitHub.ToString())
                {
                    GitHub github = new GitHub();

                    if (github.AuthenticateUser(CurrentUser, repositoryUrl, GeminiContext))
                    {
                        try
                        {
                            if (fileid.IsEmpty())
                            {
                                isFileIdMissing = true;
                                // Need to do this, because when github sends back the committed data there is no fileid(which we need to get the file content) for the files.
                                // This will go and get the fileids once for each commit where fileid's are empty
                                fileid = github.updateFileIds(GeminiContext, repositoryUrl, revisionid, fileName, issueId);
                            }

                            newFile = github.GetFileContent(GeminiContext, issueId, repositoryUrl, revisionid, fileName, fileid);

                            oldFile = github.GetFileContent(GeminiContext, issueId, repositoryUrl, revisionid, fileName, fileid, true);

                            IsUserAuthorized = true;
                        }
                        catch (UnauthorizedAccessException ex)
                        {
                            authenticateForm = github.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName);

                            errorMessage = "Invalid login details";
                        }
                    }
                    else
                    {
                        authenticateForm = github.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName);

                        errorMessage = "Invalid login details";
                    }
                }
                else if (provider == SourceControlProvider.TFS2012.ToString())
                {
                    TFS2012 tfs2012 = new TFS2012();

                    if (tfs2012.AuthenticateUser(CurrentUser, repositoryUrl, GeminiContext))
                    {
                        try
                        {
                            oldFile = tfs2012.GetFileContent(GeminiContext, issueId, fileName, fullfilename, workspace, revisionid, fileid, repositoryUrl, true);

                            newFile = tfs2012.GetFileContent(GeminiContext, issueId, fileName, fullfilename, workspace, revisionid, fileid, repositoryUrl);

                            IsUserAuthorized = true;
                        }
                        catch (UnauthorizedAccessException ex)
                        {
                            authenticateForm = tfs2012.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName);

                            errorMessage = "Invalid login details";
                        }
                        catch (TeamFoundationServerUnauthorizedException ex)
                        {
                            authenticateForm = tfs2012.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName);

                            errorMessage = ex.Message;
                        }
                    }
                    else
                    {
                        authenticateForm = tfs2012.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName);
                    }
                }
                else if (provider == SourceControlProvider.TFS2010.ToString())
                {
                    TFS2010 tfs2010 = new TFS2010();

                    if (tfs2010.AuthenticateUser(CurrentUser, repositoryUrl, GeminiContext))
                    {
                        try
                        {
                            oldFile = tfs2010.GetFileContent(GeminiContext, issueId, fileName, fullfilename, workspace, revisionid, fileid, repositoryUrl, true);

                            newFile = tfs2010.GetFileContent(GeminiContext, issueId, fileName, fullfilename, workspace, revisionid, fileid, repositoryUrl);

                            IsUserAuthorized = true;
                        }
                        catch (UnauthorizedAccessException ex)
                        {
                            authenticateForm = tfs2010.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName);

                            errorMessage = "Invalid login details";
                        }
                        catch (TeamFoundationServerUnauthorizedException ex)
                        {
                            authenticateForm = tfs2010.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName);

                            errorMessage = ex.Message;
                        }
                    }
                    else
                    {
                        authenticateForm = tfs2010.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName);
                    }
                }
                else if (provider == SourceControlProvider.SVN.ToString())
                {
                    SVN svn = new SVN();

                    if (svn.AuthenticateUser(CurrentUser, repositoryUrl, GeminiContext))
                    {
                        try
                        {
                            oldFile = svn.GetFileContent(GeminiContext, issueId, repositoryUrl, fileName, revisionid, true);

                            newFile = svn.GetFileContent(GeminiContext, issueId, repositoryUrl, fileName, revisionid);

                            IsUserAuthorized = true;
                        }
                        catch (UnauthorizedAccessException ex)
                        {
                            authenticateForm = svn.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName);

                            errorMessage = "Invalid login details";
                        }
                    }
                    else
                    {
                        authenticateForm = svn.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName);

                        errorMessage = "Invalid login details";
                    }
                }
                else if (provider == SourceControlProvider.Git.ToString())
                {
                    Git git = new Git();

                    if (git.AuthenticateUser(CurrentUser, repositoryUrl, GeminiContext))
                    {
                        try
                        {
                            oldFile = git.GetFileContent(GeminiContext, issueId, repositoryUrl, fileName, revisionid, true);

                            newFile = git.GetFileContent(GeminiContext, issueId, repositoryUrl, fileName, revisionid);

                            IsUserAuthorized = true;
                        }
                        catch (UnauthorizedAccessException ex)
                        {
                            authenticateForm = git.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName);

                            errorMessage = "Invalid login details";
                        }
                    }
                    else
                    {
                        authenticateForm = git.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName);

                        errorMessage = "Invalid login details";
                    }
                }
                else if (provider == SourceControlProvider.Bitbucket.ToString())
                {
                    Bitbucket bitbucket = new Bitbucket();

                    if (bitbucket.AuthenticateUser(CurrentUser, repositoryUrl, GeminiContext))
                    {
                        try
                        {
                            oldFile = bitbucket.GetFileContent(GeminiContext, issueId, repositoryUrl, fileName, revisionid, true);

                            newFile = bitbucket.GetFileContent(GeminiContext, issueId, repositoryUrl, fileName, revisionid);

                            IsUserAuthorized = true;
                        }
                        catch (UnauthorizedAccessException ex)
                        {
                            authenticateForm = bitbucket.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName);

                            errorMessage = "Invalid login details";
                        }
                    }
                    else
                    {
                        authenticateForm = bitbucket.CreateAuthenticationForm(UserContext.Url, repositoryUrl, fileName);

                        errorMessage = "Invalid login details";
                    }
                }
            }
            else
            {
                errorMessage = "ERROR: Repository Url is missing";
            }

            if (IsUserAuthorized)
            {
                // Handle BOM markers
                oldFile = oldFile.Replace("\x00EF\x00BB\x00BF", "");

                newFile = newFile.Replace("\x00EF\x00BB\x00BF", "");

                // Diff
                var tmpModel = diffBuilder.BuildDiffModel(oldFile ?? string.Empty, newFile ?? string.Empty);

                IssueWidgetData <List <Comment> > tmpData = GeminiContext.IssueWidgetStore.Get <List <Comment> >(issueId, Constants.AppId, Constants.ControlId);

                DiffplexComments model = new DiffplexComments();

                if (tmpData != null)
                {
                    SourceControlProvider enumProvider;

                    try
                    {
                        enumProvider = (SourceControlProvider)Enum.Parse(typeof(SourceControlProvider), provider, true);
                    }
                    catch (ArgumentException ex)
                    {
                        enumProvider = 0;

                        GeminiApp.LogException(new Exception(ex.Message)
                        {
                            Source = "Saucery"
                        }, false);
                    }

                    var comments = tmpData.Value.FindAll(f => f.FileName == fileName && f.RepositoryUrl == repositoryUrl && f.Provider == enumProvider && f.ChangesetId == revisionid);

                    if (comments != null)
                    {
                        model.data = tmpModel;

                        model.comments = comments;
                    }
                }
                else
                {
                    model.data = tmpModel;

                    model.comments = new List <Comment>();
                }

                data = RenderPartialViewToString(this, AppManager.Instance.GetAppUrl("F473D13E-19B7-45F3-98ED-6ED77B6BAB0A", "views/diff.cshtml"), model);
            }
            else
            {
                data = authenticateForm;
            }

            return(JsonSuccess(new { authenticationSuccess = IsUserAuthorized, fileid = fileid, data = data, isFileIdMissing = isFileIdMissing, errorMessage = errorMessage }));
        }
예제 #19
0
        public ActionResult Search(string id, string search)
        {
            try
            {
                ItemWidgetArguments args = new ItemWidgetArguments(UserContext, GeminiContext, Cache, System.Web.HttpContext.Current.Request, CurrentIssue);

                TFSPicker tfsPicker = new TFSPicker();

                tfsPicker.AuthenticateUser(args);

                UserWidgetDataDetails loginDetails = tfsPicker.getLoginDetails();

                TFSPicker.ConnectByImplementingCredentialsProvider connect = new TFSPicker.ConnectByImplementingCredentialsProvider();

                ICredentials iCred = new NetworkCredential(loginDetails.Username, loginDetails.Password);

                connect.setLoginDetails(loginDetails.Username, loginDetails.Password, loginDetails.RepositoryUrl);

                connect.GetCredentials(new Uri(loginDetails.RepositoryUrl), iCred);

                TfsConfigurationServer configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(new Uri(loginDetails.RepositoryUrl));

                configurationServer.Credentials = iCred;

                if (TFSPicker.IsBasicAuth)
                {
                    configurationServer.ClientCredentials = new TfsClientCredentials(new BasicAuthCredential(iCred));
                }
                else
                {
                    configurationServer.ClientCredentials = new TfsClientCredentials(new WindowsCredential(iCred));
                }

                try
                {
                    configurationServer.EnsureAuthenticated();
                }
                catch
                {
                    System.Threading.Thread.Sleep(1000);
                    configurationServer             = TfsConfigurationServerFactory.GetConfigurationServer(new Uri(loginDetails.RepositoryUrl));
                    configurationServer.Credentials = iCred;

                    if (TFSPicker.IsBasicAuth)
                    {
                        configurationServer.ClientCredentials = new TfsClientCredentials(new BasicAuthCredential(iCred));
                    }
                    else
                    {
                        configurationServer.ClientCredentials = new TfsClientCredentials(new WindowsCredential(iCred));
                    }
                    configurationServer.EnsureAuthenticated();
                }

                CatalogNode catalogNode = configurationServer.CatalogNode;

                ReadOnlyCollection <CatalogNode> tpcNodes = catalogNode.QueryChildren(new Guid[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None);

                string url = string.Empty;

                List <WorkItem2> queryResults = new List <WorkItem2>();

                TfsTeamProjectCollection tpc = null;

                string query = "Select [Id], [Work Item Type], [Title], [State] From WorkItems Where [Title] Contains '" + search + "' Order By [Id] Asc";

                if (search.Trim().Length == 0)
                {
                    query = "Select [Id], [Work Item Type], [Title], [Description] From WorkItems Order By [Id] Asc";
                }

                foreach (CatalogNode tpcNode in tpcNodes)
                {
                    tpc = configurationServer.GetTeamProjectCollection(new Guid(tpcNode.Resource.Properties["InstanceId"]));
                    //tpc = new TfsTeamProjectCollection(new Uri(string.Concat(loginDetails.RepositoryUrl, '/', tpcNode.Resource.DisplayName)), iCred);

                    if (TFSPicker.IsBasicAuth)
                    {
                        tpc.ClientCredentials = new TfsClientCredentials(new BasicAuthCredential(iCred));
                    }

                    WorkItemStore workItemStore = (WorkItemStore)tpc.GetService(typeof(WorkItemStore));

                    var result = workItemStore.Query(query);

                    if (result != null)
                    {
                        TswaClientHyperlinkService hyperlinkService = null;

                        try
                        {
                            hyperlinkService = ((TswaClientHyperlinkService)tpc.GetService(typeof(TswaClientHyperlinkService)));
                        }
                        catch
                        {
                        }

                        foreach (WorkItem res in result)
                        {
                            WorkItem2 item = new WorkItem2()
                            {
                                Item = res, BaseUrl = string.Concat(tpcNode.Resource.DisplayName, '/', res.AreaPath)
                            };

                            try
                            {
                                if (hyperlinkService != null)
                                {
                                    item.FullUrl = hyperlinkService.GetWorkItemEditorUrl(res.Id);
                                }
                            }
                            catch
                            {
                            }

                            queryResults.Add(item);
                        }
                    }
                }

                Dictionary <string, WorkItem> details = new Dictionary <string, WorkItem>();

                if (queryResults.Count > 0)
                {
                    IssueWidgetData <List <string> > data = GeminiContext.IssueWidgetStore.Get <List <string> >(id.ToInt(), Constants.AppId, Constants.ControlId);

                    if (data == null || data.Value == null)
                    {
                        data = new IssueWidgetData <List <string> >();

                        data.AppId = Constants.AppId;

                        data.ControlId = Constants.ControlId;

                        data.IssueId = id.ToInt();

                        data.Value = new List <string>();
                    }

                    foreach (WorkItem2 item in queryResults)
                    {
                        //check if we are not already there!
                        if (data.Value.Contains(item.Item.Id.ToString()))
                        {
                            continue;
                        }

                        /*if (isTfs2012)
                         * {*/
                        if (item.FullUrl != null && item.FullUrl.ToString().HasValue())
                        {
                            url = item.FullUrl.ToString();
                        }
                        else
                        {
                            url = string.Format("{0}/{1}/_workitems#_a=edit&id={2}", loginDetails.RepositoryUrl, item.BaseUrl, item.Item.Id);
                        }

                        details.Add(url, item.Item);
                    }
                }

                Dictionary <string, TfsPickerItem> tfsPickerModel = ConvertWorkItemsToTfsPickerItems(details);

                dataView = Content(BaseController.RenderPartialViewToString(this, AppManager.Instance.GetAppUrl("782D003D-D9F0-455F-AF09-74417D6DFD2B", "views/search.cshtml"), tfsPickerModel));
            }
            catch (Exception ex)
            {
                Pair <int, string> authenticationModel = new Pair <int, string>(CurrentIssue.Entity.Id, string.Concat(UserContext.Url, "/apps/tfspicker/authenticate/", CurrentIssue.Entity.Id));

                dataView = Content(BaseController.RenderPartialViewToString(this, AppManager.Instance.GetAppUrl("782D003D-D9F0-455F-AF09-74417D6DFD2B", "views/authenticationForm.cshtml"), authenticationModel));

                successView = false;

                messageView = ex.Message;

                GeminiApp.LogException(new Exception(ex.Message)
                {
                    Source = "TFS Picker"
                }, false);
            }

            return(JsonSuccess(new { success = successView, data = dataView, message = messageView }));
        }