Example #1
0
        /// <summary>
        /// Tries the posting.
        /// </summary>
        /// <param name="payloadRecord">The payload record.</param>
        /// <returns>RollbarResponse.</returns>
        private RollbarResponse TryPosting(PayloadRecord payloadRecord)
        {
            //Payload payload = JsonConvert.DeserializeObject<Payload>(payloadRecord.PayloadJson);
            //IRollbarConfig config = payload.Data.Notifier.Configuration;
            IRollbarConfig config        = JsonConvert.DeserializeObject <RollbarConfig>(payloadRecord.ConfigJson);
            RollbarClient  rollbarClient = new RollbarClient(config);

            try
            {
                RollbarResponse response =
                    rollbarClient.PostAsJson(config.EndPoint, config.AccessToken, payloadRecord.PayloadJson);
                return(response);
            }
            catch (System.Exception ex)
            {
                this.OnRollbarEvent(
                    new CommunicationErrorEventArgs(null, payloadRecord.PayloadJson, ex, 0)
                    );

                RollbarErrorUtility.Report(
                    null,
                    payloadRecord,
                    InternalRollbarError.PersistentPayloadRecordRepostError,
                    "While trying to report a stored payload...",
                    ex,
                    null
                    );

                return(null);
            }
        }
        /// <summary>
        /// Persists the specified payload queue.
        /// </summary>
        /// <param name="payloadQueue">The payload queue.</param>
        private void Persist(PayloadQueue payloadQueue)
        {
            var items = payloadQueue.GetItemsToPersist();

            if (items == null || items.Length == 0)
            {
                return;
            }

            string endPoint    = payloadQueue.Logger.Config.EndPoint;
            string accessToken = payloadQueue.AccessTokenQueuesMetadata.AccessToken;

            Destination destination = this._storeContext.Destinations.SingleOrDefault(d =>
                                                                                      d.Endpoint == endPoint &&
                                                                                      d.AccessToken == accessToken
                                                                                      );

            if (destination == null)
            {
                destination = new Destination()
                {
                    Endpoint = endPoint, AccessToken = accessToken,
                };
                this._storeContext.Destinations.Add(destination);
            }

            foreach (var item in items)
            {
                PayloadRecord payloadRecord = this.BuildPayloadRecord(item, payloadQueue);
                if (payloadRecord != null)
                {
                    destination.PayloadRecords.Add(payloadRecord);
                }
            }

            try
            {
                this._storeContext.SaveChanges();
            }
            catch (System.Exception ex)
            {
                RollbarErrorUtility.Report(
                    payloadQueue.Logger,
                    items.Select(i => i.GetPayload()),
                    InternalRollbarError.PersistentStoreContextError,
                    "While attempting to save persistent store context...",
                    ex,
                    null
                    );
            }

            foreach (var item in items)
            {
                item.Signal?.Release();
            }
        }
Example #3
0
        // 从payload中创建一条消息记录
        private PayloadRecord GenerateRecord(Payload payload, string eventType, string delivery)
        {
            PayloadRecord newRecord = new PayloadRecord();

            newRecord.DeliveryID = delivery;
            newRecord.Sender     = payload.Sender.Login;
            newRecord.Repository = payload.Repository.FullName;
            newRecord.EventType  = eventType;

            if (eventType == "issues" || eventType == "issue_comment")
            {
                newRecord.Action   = payload.Action;
                newRecord.EventUrl = payload.Issue.HtmlUrl;
                newRecord.Title    = payload.Issue.Title;
            }

            if (eventType == "pull_request")
            {
                newRecord.Action   = payload.Action;
                newRecord.EventUrl = payload.PullRequest.HtmlUrl;
                newRecord.Title    = payload.PullRequest.Title;
            }

            if (eventType == "push")
            {
                newRecord.CommitsText = payload.Commits.FirstOrDefault().Message;
                newRecord.Branch      = payload.Ref;
            }

            if (eventType == "create")
            {
                newRecord.Branch = payload.Ref;
            }

            return(newRecord);
        }
Example #4
0
        public void BasicTest()
        {
            using (StoreContext storeContext = new StoreContext())
            {
                Assert.AreEqual(0, storeContext.PayloadRecords.Count());
                Assert.AreEqual(0, storeContext.Destinations.Count());

                Destination destination = new Destination()
                {
                    AccessToken = "token1",
                    Endpoint    = "http://endpoint.com"
                };
                Assert.AreNotEqual(Guid.Empty, destination.ID);

                destination.PayloadRecords.Add(new PayloadRecord()
                {
                    PayloadJson = "payload1", Timestamp = DateTime.UtcNow,
                });

                storeContext.Add(destination);
                storeContext.SaveChanges();
            }

            using (StoreContext storeContext = new StoreContext())
            {
                Assert.AreEqual(1, storeContext.Destinations.Count());
                Assert.AreEqual(1, storeContext.PayloadRecords.Count());
            }

            using (StoreContext storeContext = new StoreContext())
            {
                Destination destination = storeContext.Destinations.FirstOrDefault(d => d.AccessToken == "token1");
                Assert.IsNotNull(destination);
                Assert.AreEqual("token1", destination.AccessToken);

                PayloadRecord payloadRecord = null;

                payloadRecord = new PayloadRecord()
                {
                    PayloadJson = "payload2", Timestamp = DateTime.UtcNow,
                };
                storeContext.Entry(payloadRecord).State = EntityState.Added;
                destination.PayloadRecords.Add(payloadRecord);
                payloadRecord = new PayloadRecord()
                {
                    PayloadJson = "payload3", Timestamp = DateTime.UtcNow, Destination = destination
                };
                destination.PayloadRecords.Add(payloadRecord);
                storeContext.Add(payloadRecord);
                payloadRecord = new PayloadRecord()
                {
                    PayloadJson = "payload4", Timestamp = DateTime.UtcNow, Destination = destination
                };
                destination.PayloadRecords.Add(payloadRecord);
                storeContext.PayloadRecords.Add(payloadRecord);

                destination = new Destination()
                {
                    AccessToken = "token2",
                    Endpoint    = "http://endpoint.com"
                };
                Assert.AreNotEqual(Guid.Empty, destination.ID);
                storeContext.Entry(destination).State = EntityState.Added;

                payloadRecord = new PayloadRecord()
                {
                    PayloadJson = "payload5", Timestamp = DateTime.UtcNow,
                };
                storeContext.Entry(payloadRecord).State = EntityState.Added;
                destination.PayloadRecords.Add(payloadRecord);

                payloadRecord = new PayloadRecord()
                {
                    PayloadJson = "payload6", Timestamp = DateTime.UtcNow, Destination = destination
                };
                storeContext.Entry(payloadRecord).State = EntityState.Added;
                storeContext.Add(payloadRecord);

                payloadRecord = new PayloadRecord()
                {
                    PayloadJson = "payload7", Timestamp = DateTime.UtcNow, Destination = destination
                };
                storeContext.Entry(payloadRecord).State = EntityState.Added;
                storeContext.PayloadRecords.Add(payloadRecord);

                storeContext.Add(destination);
                storeContext.SaveChanges();
            }

            using (StoreContext storeContext = new StoreContext())
            {
                Assert.AreEqual(2, storeContext.Destinations.Count());
                Assert.AreEqual(7, storeContext.PayloadRecords.Count());

                Assert.AreEqual(4,
                                storeContext.Destinations
                                .Where(d => d.AccessToken == "token1")
                                .Include(d => d.PayloadRecords)
                                .First()
                                .PayloadRecords
                                .Count
                                );
                Assert.AreEqual(3,
                                storeContext.Destinations
                                .Where(d => d.AccessToken == "token2")
                                .Include(d => d.PayloadRecords)
                                .First()
                                .PayloadRecords
                                .Count
                                );
            }
        }
Example #5
0
        // POST: api/GithubWatcher
        public IHttpActionResult Post()
        {
            /* We need the raw body to validate the request
             * by computing a HMAC hash from it based upon
             * the secret key. We then manually deserialise
             * it for validation and further manipulation.
             */

            // Body
            string body = Request.Content.ReadAsStringAsync().Result;

            string eventType, signature, delivery = "";

            // Head
            if (Request.Headers.TryGetValues("X-GitHub-Event", out var eventTypeHeader))
            {
                eventType = eventTypeHeader.FirstOrDefault();
            }
            else
            {
                return(BadRequest("Request中应附有事件类型信息!"));
            }

            if (Request.Headers.TryGetValues("X-Hub-Signature", out var signatureHeader))
            {
                signature = signatureHeader.FirstOrDefault();
            }

            if (Request.Headers.TryGetValues("X-GitHub-Delivery", out var deliveryHeader))
            {
                delivery = deliveryHeader.FirstOrDefault();
            }
            else
            {
                return(BadRequest("Request中应附有GUID!"));
            }

            //bool isValidRequest = this.requestValidator.IsValidRequest(signature, "312725802", body);

            //if (!isValidRequest) {
            //    return this.CreateUnauthorisedResult();
            //}

            if (!IsSupportEvent(eventType))
            {
                return(BadRequest("不支持的事件类型!"));
            }

            Payload       payload          = this.jsonSerialiser.Deserialise <Payload>(body); // 将body反序列化
            PayloadRecord newPayloadRecord = GenerateRecord(payload, eventType, delivery);    // 生成一条Payload Record

            using (var context = new GithubWatcherContext())
            {
                var payloadRecord = context.PayloadRecords.SingleOrDefault(s => s.DeliveryID == newPayloadRecord.DeliveryID);
                if (payloadRecord == null)      //确保表中不存在此项记录
                {
                    context.PayloadRecords.Add(newPayloadRecord);
                    context.SaveChanges();
                }
                else
                {
                    return(BadRequest("此记录已发送,不可重复发送!"));
                }

                string msg = GenerateMessage(payload, eventType);

                var user = context.RepositorySubscriptions.FirstOrDefault(s => s.RepositoryName == payload.Repository.FullName);

                if (user != null)
                {
                    if (user.Type == "私人绑定")
                    {
                        CQ.Api.SendPrivateMessage(Convert.ToInt64(user.QQ), msg);
                    }
                    else if (user.Type == "群组绑定")
                    {
                        CQ.Api.SendGroupMessage(Convert.ToInt64(user.GroupQQ), msg);
                    }
                }

                return(Ok(msg));
            }
        }