Пример #1
0
        public HttpResponseMessage Audit(ProofQueryDTO query)
        {
            if (ModelState.IsValid)
            {
                // Validate Query
                if (string.IsNullOrWhiteSpace(query.ApplicationName))
                {
                    return Request.CreateResponse(
                        HttpStatusCode.OK,
                        new
                        {
                            Success = false,
                            Error = "Must provide an Application Name to Audit"
                        },
                        Configuration.Formatters.JsonFormatter
                        );
                }
                else if (string.IsNullOrWhiteSpace(query.LogName))
                {
                    return Request.CreateResponse(
                        HttpStatusCode.OK,
                        new
                        {
                            Success = false,
                            Error = "Must provide a Log Name to Audit"
                        },
                        Configuration.Formatters.JsonFormatter
                        );
                }
                else if (query.TimeBlock.Ticks <= 0)
                {
                    query.TimeBlock = DateTime.Now;
                }

                Subscription subscriber = FindSubscription(query.ApplicationName, query.LogName);

                if (subscriber == null)
                {
                    return Request.CreateResponse(
                        HttpStatusCode.OK,
                        new
                        {
                            Success = false,
                            Error = "Subscriber does not exist"
                        },
                        Configuration.Formatters.JsonFormatter
                        );
                }
                else if (subscriber.Verified != true)
                {
                    return Request.CreateResponse(
                        HttpStatusCode.OK,
                        new
                        {
                            Success = false,
                            Error = "Subscriber is not verified"
                        },
                        Configuration.Formatters.JsonFormatter
                        );
                }

                TableRequestOptions reqOptions = new TableRequestOptions()
                {
                    MaximumExecutionTime = TimeSpan.FromSeconds(10),
                    RetryPolicy = new LinearRetry(TimeSpan.FromSeconds(3), 3)
                };

                List<Proof> proofs;
                try
                {
                    Snapshot snapshot = new Snapshot()
                    {
                        ApplicationName = query.ApplicationName,
                        LogName = query.LogName,
                        TimeBlock = query.TimeBlock
                    };

                    var tableQuery = new TableQuery<Proof>().Where(
                        TableQuery.CombineFilters(
                            TableQuery.CombineFilters(
                                TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, query.ApplicationName),
                                TableOperators.And,
                                TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThanOrEqual, snapshot.RowKey)
                                ),
                            TableOperators.And,
                            TableQuery.GenerateFilterCondition("LogName", QueryComparisons.Equal, query.LogName)
                            )
                        );

                    proofs = proofsArchiveTable.ExecuteQuery(tableQuery, reqOptions).ToList();
                    if (proofs.Count == 0)
                    {
                        return Request.CreateResponse(
                            HttpStatusCode.OK,
                            new
                            {
                                Success = false,
                                Error = string.Format("No proofs as of {0}", query.TimeBlock.ToString())
                            },
                            Configuration.Formatters.JsonFormatter
                            );
                    }

                    Proof proofToAudit = null;
                    long maxTicks = 0;
                    foreach (Proof proof in proofs)
                    {
                        long ticks = DateTime.Parse(proof.TimeBlock).Ticks;
                        if (ticks > maxTicks)
                        {
                            maxTicks = ticks;
                            proofToAudit = proof;
                        }
                    }

                    //
                    // TODO: Make API Call
                    //
                    if (proofToAudit.BitcoinBlockNumber == null
                        || proofToAudit.BitcoinTransactionHash == null)
                    {
                        if (PopulateBitcoinInformation(proofToAudit))
                        {
                            var replaceOperation = TableOperation.Replace(proofToAudit);
                            proofsArchiveTable.Execute(replaceOperation);
                        }
                    }

                    return Request.CreateResponse(
                        HttpStatusCode.OK,
                        new
                        {
                            Success = true,
                            Proof = new ProofDTO(proofToAudit)
                        },
                        Configuration.Formatters.JsonFormatter
                        );
                }
                catch (StorageException se)
                {
                    Trace.TraceError(se.Message);
                    throw new HttpResponseException(Request.CreateErrorResponse(
                        HttpStatusCode.ServiceUnavailable,
                        "Timeout error, try again."
                        ));
                }
            }

            List<string> errorList = ModelState.Values
                .SelectMany(m => m.Errors)
                .Select(e => e.ErrorMessage)
                .Where(s => !string.IsNullOrWhiteSpace(s))
                .ToList();
            return Request.CreateResponse(
                HttpStatusCode.OK,
                new
                {
                    Success = false,
                    Errors = errorList
                },
                Configuration.Formatters.JsonFormatter
                );
        }
Пример #2
0
        public HttpResponseMessage Query(ProofQueryDTO query)
        {
            if (ModelState.IsValid)
            {
                if (string.IsNullOrWhiteSpace(query.ApplicationName))
                {
                    return Request.CreateResponse(
                        HttpStatusCode.OK,
                        new
                        {
                            Success = false,
                            Error = "Must provide an Application Name to search for Proofs"
                        },
                        Configuration.Formatters.JsonFormatter
                        );
                }

                if (string.IsNullOrWhiteSpace(query.LogName))
                {
                    if (query.TimeBlock.Ticks > 0)
                    {
                        return Request.CreateResponse(
                            HttpStatusCode.OK,
                            new
                            {
                                Success = false,
                                Error = "Cannot query for Specific TimeBlock without Specific Log"
                            },
                            Configuration.Formatters.JsonFormatter
                            );
                    }

                    List<Subscription> subscriptions = FindSubscriptions(query.ApplicationName);

                    if (subscriptions.Count == 0)
                    {
                        return Request.CreateResponse(
                            HttpStatusCode.OK,
                            new
                            {
                                Success = false,
                                Error = string.Format("{0} has no Subscriptions", query.ApplicationName)
                            },
                            Configuration.Formatters.JsonFormatter
                            );
                    }

                    bool foundVerified = false;
                    foreach (Subscription subscription in subscriptions)
                    {
                        if (subscription.Verified == true)
                        {
                            foundVerified = true;
                            break;
                        }
                    }
                    if (!foundVerified)
                    {
                        return Request.CreateResponse(
                            HttpStatusCode.OK,
                            new
                            {
                                Success = false,
                                Error = string.Format("{0} has no Verified Subscriptions", query.ApplicationName)
                            },
                            Configuration.Formatters.JsonFormatter
                            );
                    }
                }
                else
                {
                    Subscription subscriber = FindSubscription(query.ApplicationName, query.LogName);

                    if (subscriber == null)
                    {
                        return Request.CreateResponse(
                            HttpStatusCode.OK,
                            new
                            {
                                Success = false,
                                Error = "Subscriber does not exist"
                            },
                            Configuration.Formatters.JsonFormatter
                            );
                    }
                    else if (subscriber.Verified != true)
                    {
                        return Request.CreateResponse(
                            HttpStatusCode.OK,
                            new
                            {
                                Success = false,
                                Error = "Subscriber is not verified"
                            },
                            Configuration.Formatters.JsonFormatter
                            );
                    }
                }

                TableRequestOptions reqOptions = new TableRequestOptions()
                {
                    MaximumExecutionTime = TimeSpan.FromSeconds(10),
                    RetryPolicy = new LinearRetry(TimeSpan.FromSeconds(3), 3)
                };

                List<Proof> proofs;
                try
                {
                    TableQuery<Proof> tableQuery;

                    if (string.IsNullOrWhiteSpace(query.LogName))
                    {
                        // Guaranteed from above that TB is null
                        tableQuery = new TableQuery<Proof>().Where(
                            TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, query.ApplicationName)
                            );
                    }
                    else
                    {
                        if (query.TimeBlock.Ticks <= 0)
                        {
                            Snapshot snapshot = new Snapshot()
                            {
                                ApplicationName = query.ApplicationName,
                                LogName = query.LogName,
                                TimeBlock = Utils.NextOperationTB
                            };
                            tableQuery = new TableQuery<Proof>().Where(
                                TableQuery.CombineFilters(
                                    TableQuery.CombineFilters(
                                        TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, query.ApplicationName),
                                        TableOperators.And,
                                        TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThanOrEqual, snapshot.RowKey)
                                        ),
                                    TableOperators.And,
                                    TableQuery.GenerateFilterCondition("LogName", QueryComparisons.Equal, query.LogName)
                                    )
                                );
                        }
                        else
                        {
                            Snapshot snapshot = new Snapshot()
                            {
                                ApplicationName = query.ApplicationName,
                                LogName = query.LogName,
                                TimeBlock = query.TimeBlock
                            };

                            string queryComparison;
                            if (query.QueryComparison.Equals("Equal", StringComparison.InvariantCultureIgnoreCase))
                            {
                                queryComparison = QueryComparisons.Equal;
                            }
                            else if (query.QueryComparison.Equals("LessThan", StringComparison.InvariantCultureIgnoreCase))
                            {
                                queryComparison = QueryComparisons.LessThan;
                            }
                            else if (query.QueryComparison.Equals("GreaterThan", StringComparison.InvariantCultureIgnoreCase))
                            {
                                queryComparison = QueryComparisons.GreaterThan;
                            }
                            else if (query.QueryComparison.Equals("LessThanOrEqual", StringComparison.InvariantCultureIgnoreCase))
                            {
                                queryComparison = QueryComparisons.LessThanOrEqual;
                            }
                            else if (query.QueryComparison.Equals("GreaterThanOrEqual", StringComparison.InvariantCultureIgnoreCase))
                            {
                                queryComparison = QueryComparisons.GreaterThanOrEqual;
                            }
                            else
                            {
                                queryComparison = QueryComparisons.LessThanOrEqual;
                            }

                            tableQuery = new TableQuery<Proof>().Where(
                                TableQuery.CombineFilters(
                                    TableQuery.CombineFilters(
                                        TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, query.ApplicationName),
                                        TableOperators.And,
                                        TableQuery.GenerateFilterCondition("RowKey", queryComparison, snapshot.RowKey)
                                        ),
                                    TableOperators.And,
                                    TableQuery.GenerateFilterCondition("LogName", QueryComparisons.Equal, query.LogName)
                                    )
                                );
                        }
                    }

                    proofs = proofsArchiveTable.ExecuteQuery(tableQuery, reqOptions).ToList();
                    return Request.CreateResponse(
                        HttpStatusCode.OK,
                        new
                        {
                            Success = true,
                            Proofs = proofs.Select(x => new ProofDTO(x))
                        },
                        Configuration.Formatters.JsonFormatter
                        );
                }
                catch (StorageException se)
                {
                    Trace.TraceError(se.Message);
                    throw new HttpResponseException(Request.CreateErrorResponse(
                        HttpStatusCode.ServiceUnavailable,
                        "Timeout error, try again."
                        ));
                }
            }

            List<string> errorList = ModelState.Values
                .SelectMany(m => m.Errors)
                .Select(e => e.ErrorMessage)
                .Where(s => !string.IsNullOrWhiteSpace(s))
                .ToList();
            return Request.CreateResponse(
                HttpStatusCode.OK,
                new
                {
                    Success = false,
                    Errors = errorList
                },
                Configuration.Formatters.JsonFormatter
                );
        }