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