Пример #1
0
        public void PreCreateApiHookLogic(string entityName, EntityRecord record, List <ErrorModel> errors)
        {
            if (!record.Properties.ContainsKey("id"))
            {
                throw new Exception("Hook exception: timelog id field not found in record");
            }

            Guid recordId           = (Guid)record["id"];
            var  isProjectTimeLog   = false;
            var  relatedTaskRecords = new EntityRecordList();

            //Get timelog
            if (record["l_scope"] != null && ((string)record["l_scope"]).Contains("projects"))
            {
                isProjectTimeLog = true;
            }

            if (isProjectTimeLog)
            {
                if (record["l_related_records"] != null && (string)record["l_related_records"] != "")
                {
                    try
                    {
                        var relatedRecordGuid = JsonConvert.DeserializeObject <List <Guid> >((string)record["l_related_records"]);
                        var taskEqlCommand    = "SELECT *,$project_nn_task.id, $user_nn_task_watchers.id FROM task WHERE ";
                        var filterStringList  = new List <string>();
                        var taskEqlParams     = new List <EqlParameter>();
                        var index             = 1;
                        foreach (var taskGuid in relatedRecordGuid)
                        {
                            var paramName = "taskId" + index;
                            filterStringList.Add($" id = @{paramName} ");
                            taskEqlParams.Add(new EqlParameter(paramName, taskGuid));
                            index++;
                        }
                        taskEqlCommand    += String.Join(" OR ", filterStringList);
                        relatedTaskRecords = new EqlCommand(taskEqlCommand, taskEqlParams).Execute();
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }

                if (!relatedTaskRecords.Any())
                {
                    throw new Exception("Hook exception: This timelog does not have an existing taskId");
                }

                var taskRecord  = relatedTaskRecords[0];                //Currently should be related only to 1 task in projects
                var patchRecord = new EntityRecord();
                patchRecord["id"] = (Guid)taskRecord["id"];
                var loggedTypeString = "billable";
                if ((bool)record["is_billable"])
                {
                    patchRecord["x_billable_minutes"] = (decimal)taskRecord["x_billable_minutes"] + (int)record["minutes"];
                }
                else
                {
                    patchRecord["x_nonbillable_minutes"] = (decimal)taskRecord["x_nonbillable_minutes"] + (int)record["minutes"];
                    loggedTypeString = "non-billable";
                }
                //Null timelog_started_on
                patchRecord["timelog_started_on"] = null;

                var updateResponse = new RecordManager(executeHooks: false).UpdateRecord("task", patchRecord);
                if (!updateResponse.Success)
                {
                    throw new Exception(updateResponse.Message);
                }



                //Add feed record - include all taskIds and related Project ids in the field
                Guid?projectId = null;
                if (((List <EntityRecord>)taskRecord["$project_nn_task"]).Any())
                {
                    var projectRecord = ((List <EntityRecord>)taskRecord["$project_nn_task"]).First();
                    if (projectRecord != null)
                    {
                        projectId = (Guid)projectRecord["id"];
                    }
                }

                var taskWatchersList = new List <string>();
                if (((List <EntityRecord>)taskRecord["$user_nn_task_watchers"]).Any())
                {
                    taskWatchersList = ((List <EntityRecord>)taskRecord["$user_nn_task_watchers"]).Select(x => ((Guid)x["id"]).ToString()).ToList();
                }

                //Add activity log
                var subject        = $"logged {((int)record["minutes"]).ToString("N0")} {loggedTypeString} minutes on <a href=\"/projects/tasks/tasks/r/{taskRecord["id"]}/details\">[{taskRecord["key"]}] {taskRecord["subject"]}</a>";
                var relatedRecords = new List <string>()
                {
                    taskRecord["id"].ToString(), record["id"].ToString()
                };
                if (projectId != null)
                {
                    relatedRecords.Add(projectId.ToString());
                }
                relatedRecords.AddRange(taskWatchersList);

                var scope = new List <string>()
                {
                    "projects"
                };
                var logSnippet = new Web.Services.RenderService().GetSnippetFromHtml((string)record["body"]);
                new FeedItemService().Create(id: Guid.NewGuid(), createdBy: SecurityContext.CurrentUser.Id, subject: subject,
                                             body: logSnippet, relatedRecords: relatedRecords, scope: scope, type: "timelog");
            }
        }
Пример #2
0
        public void PostCreateApiHookLogic(string entityName, EntityRecord record)
        {
            //Update key and search fields
            Guid   projectId      = Guid.Empty;
            Guid?  projectOwnerId = null;
            string taskSubject    = "";
            var    patchRecord    = new TaskService().SetCalculationFields((Guid)record["id"], subject: out taskSubject, projectId: out projectId, projectOwnerId: out projectOwnerId);
            var    updateResponse = new RecordManager(executeHooks: false).UpdateRecord("task", patchRecord);

            if (!updateResponse.Success)
            {
                throw new Exception(updateResponse.Message);
            }

            //Set the initial watchers list - project lead, creator, owner
            var watchers = new List <Guid>();

            {
                var fieldName = "owner_id";
                if (record.Properties.ContainsKey(fieldName) && record[fieldName] != null)
                {
                    var userId = (Guid)record[fieldName];
                    if (!watchers.Contains(userId))
                    {
                        watchers.Add(userId);
                    }
                }
            }
            {
                var fieldName = "created_by";
                if (record.Properties.ContainsKey(fieldName) && record[fieldName] != null)
                {
                    var userId = (Guid)record[fieldName];
                    if (!watchers.Contains(userId))
                    {
                        watchers.Add(userId);
                    }
                }
            }
            if (projectOwnerId != null)
            {
                if (!watchers.Contains(projectOwnerId.Value))
                {
                    watchers.Add(projectOwnerId.Value);
                }
            }

            //Create relations
            var watchRelation = new EntityRelationManager().Read("user_nn_task_watchers").Object;

            if (watchRelation == null)
            {
                throw new Exception("Watch relation not found");
            }

            foreach (var userId in watchers)
            {
                var createRelResponse = new RecordManager().CreateRelationManyToManyRecord(watchRelation.Id, userId, (Guid)record["id"]);
                if (!createRelResponse.Success)
                {
                    throw new Exception(createRelResponse.Message);
                }
            }


            //Add activity log
            var subject        = $"created <a href=\"/projects/tasks/tasks/r/{patchRecord["id"]}/details\">[{patchRecord["key"]}] {taskSubject}</a>";
            var relatedRecords = new List <string>()
            {
                patchRecord["id"].ToString(), projectId.ToString()
            };
            var scope = new List <string>()
            {
                "projects"
            };

            //Add watchers as scope
            foreach (var userId in watchers)
            {
                relatedRecords.Add(userId.ToString());
            }
            var taskSnippet = new Web.Services.RenderService().GetSnippetFromHtml((string)record["body"]);

            new FeedItemService().Create(id: Guid.NewGuid(), createdBy: SecurityContext.CurrentUser.Id, subject: subject,
                                         body: taskSnippet, relatedRecords: relatedRecords, scope: scope, type: "task");
        }
Пример #3
0
        public void PreCreateApiHookLogic(string entityName, EntityRecord record, List <ErrorModel> errors)
        {
            var isProjectComment   = false;
            var relatedTaskRecords = new EntityRecordList();

            //Get timelog
            if (record.Properties.ContainsKey("l_scope") && record["l_scope"] != null && ((string)record["l_scope"]).Contains("projects"))
            {
                isProjectComment = true;
            }

            if (isProjectComment)
            {
                //Get related tasks from related records field
                if (record.Properties.ContainsKey("l_related_records") && record["l_related_records"] != null && (string)record["l_related_records"] != "")
                {
                    try
                    {
                        var relatedRecordGuid = JsonConvert.DeserializeObject <List <Guid> >((string)record["l_related_records"]);
                        var taskEqlCommand    = "SELECT *,$project_nn_task.id, $user_nn_task_watchers.id FROM task WHERE ";
                        var filterStringList  = new List <string>();
                        var taskEqlParams     = new List <EqlParameter>();
                        var index             = 1;
                        foreach (var taskGuid in relatedRecordGuid)
                        {
                            var paramName = "taskId" + index;
                            filterStringList.Add($" id = @{paramName} ");
                            taskEqlParams.Add(new EqlParameter(paramName, taskGuid));
                            index++;
                        }
                        taskEqlCommand    += String.Join(" OR ", filterStringList);
                        relatedTaskRecords = new EqlCommand(taskEqlCommand, taskEqlParams).Execute();
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
                if (!relatedTaskRecords.Any())
                {
                    throw new Exception("Hook exception: This comment is a project comment but does not have an existing taskId related");
                }

                var taskRecord = relatedTaskRecords[0];                 //Currently should be related only to 1 task in projects

                //Get Project Id
                Guid?projectId = null;
                if (((List <EntityRecord>)taskRecord["$project_nn_task"]).Any())
                {
                    var projectRecord = ((List <EntityRecord>)taskRecord["$project_nn_task"]).First();
                    if (projectRecord != null)
                    {
                        projectId = (Guid)projectRecord["id"];
                    }
                }

                var taskWatchersList = new List <string>();
                if (((List <EntityRecord>)taskRecord["$user_nn_task_watchers"]).Any())
                {
                    taskWatchersList = ((List <EntityRecord>)taskRecord["$user_nn_task_watchers"]).Select(x => ((Guid)x["id"]).ToString()).ToList();
                }

                //Add activity log
                var subject        = $"commented on <a href=\"/projects/tasks/tasks/r/{taskRecord["id"]}/details\">[{taskRecord["key"]}] {taskRecord["subject"]}</a>";
                var relatedRecords = new List <string>()
                {
                    taskRecord["id"].ToString(), record["id"].ToString()
                };
                if (projectId != null)
                {
                    relatedRecords.Add(projectId.ToString());
                }
                relatedRecords.AddRange(taskWatchersList);

                var body  = new Web.Services.RenderService().GetSnippetFromHtml((string)record["body"]);
                var scope = new List <string>()
                {
                    "projects"
                };
                new FeedItemService().Create(id: Guid.NewGuid(), createdBy: SecurityContext.CurrentUser.Id, subject: subject,
                                             body: body, relatedRecords: relatedRecords, scope: scope, type: "comment");
            }
        }