예제 #1
0
        private void CheckDirectoryTimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
        {
            var assemblyChecksum = new FileInfo(CAHostConfig.CLOUD_API_ASSEMBLY_PATH + CAHostConfig.CLOUD_API_ASSEMBLY_NAME).CalculateMd5();

            if (_lastChecksum != assemblyChecksum)
            {
                Console.WriteLine("New assembly has been deployed!");
                CAAssemblyLoader.LoadFromFile(CAHostConfig.CLOUD_API_ASSEMBLY_PATH + CAHostConfig.CLOUD_API_ASSEMBLY_NAME);
                _lastChecksum = assemblyChecksum;

                _checkDirectoryTimer.Stop();
            }
        }
예제 #2
0
파일: Program.cs 프로젝트: gabz0r/cloudapi
        public static void Main(string[] args)
        {
            CloudApi.Initialize("http://localhost:9091/cloudapi/", "SERVER");

            Console.WriteLine("CloudApiHost (b/{0})", CAHostConfig.CLOUD_API_HOST_BUILD);
            Console.WriteLine("===========================");
            CAMongoManager.Instance.Connect();

            Console.WriteLine("New assembly has been deployed!");
            CAAssemblyLoader.LoadFromFile(CAHostConfig.CLOUD_API_ASSEMBLY_PATH + CAHostConfig.CLOUD_API_ASSEMBLY_NAME);

            CAHttpServer.Instance.Begin();
            Console.WriteLine("===========================");
            Console.ReadKey();
        }
예제 #3
0
        public static void ProcessBody(Dictionary <string, string> iBodyHead, Dictionary <string, string> iBodyBody, HttpListenerResponse iResponse)
        {
            var opcode = iBodyHead["OPCODE"];

            switch (opcode)
            {
            case "CLOUD_API_METHOD":
            {
                var typeName = iBodyHead["TYPE"];
                var method   = iBodyHead["METHOD"];

                Console.WriteLine("Calling method {0} on type {1}", method, typeName);

                CAAssemblyLoader.CallMethod(typeName, method, iBodyBody, iResponse);
                break;
            }

            case "CLOUD_API_DATA":
            {
                var collectionName = iBodyHead["COLLECTION"];
                var action         = iBodyHead["ACTION"];

                switch (action)
                {
                case "CREATE":
                {
                    var newDocument  = iBodyBody["CDOC"];
                    var bsonDocument = BsonSerializer.Deserialize <BsonDocument>(newDocument);

                    if (CAMongoManager.Instance.CollectionTriggers.ContainsKey(collectionName) &&
                        CAMongoManager.Instance.CollectionTriggers[collectionName].PreCreate != null)
                    {
                        bsonDocument = BsonSerializer.Deserialize <BsonDocument>(CAMongoManager.Instance.CollectionTriggers[collectionName].PreCreate(newDocument));
                    }

                    CAMongoManager.Instance.GetCollection <BsonDocument>(collectionName).InsertOne(bsonDocument);
                    Console.WriteLine("Creating document(s) in collection {0}: {1}", collectionName, bsonDocument.ToJson());

                    if (CAMongoManager.Instance.CollectionTriggers.ContainsKey(collectionName) &&
                        CAMongoManager.Instance.CollectionTriggers[collectionName].PostCreate != null)
                    {
                        CAMongoManager.Instance.CollectionTriggers[collectionName].PostCreate(bsonDocument.ToJson());
                    }

                    SendResponse($"{{ \"_id\" : {bsonDocument.GetValue("_id").ToJson()} }}", 200, iResponse);

                    break;
                }

                case "READ":
                {
                    var queryDocument = iBodyBody["RDOC"];

                    var bsonQuery = BsonSerializer.Deserialize <BsonDocument>(queryDocument);
                    var coll      = CAMongoManager.Instance.GetCollection <BsonDocument>(collectionName).Find(bsonQuery).ToEnumerable();

                    var arrayBuilder = new StringBuilder();
                    arrayBuilder.Append("[");

                    foreach (var bson in coll)
                    {
                        arrayBuilder.Append($"{bson.ToString()},");
                    }

                    if (arrayBuilder.Length > 1)
                    {
                        arrayBuilder.Remove(arrayBuilder.Length - 1, 1);         //Letztes Komma entfernen
                    }

                    arrayBuilder.Append("]");

                    var responseWriter = new StreamWriter(iResponse.OutputStream)
                    {
                        AutoFlush = true
                    };
                    responseWriter.Write(arrayBuilder.ToString());

                    iResponse.StatusCode = 200;
                    iResponse.Close();

                    Console.WriteLine("Querying document(s) from collection {0}: {1}", collectionName, bsonQuery.ToJson());

                    break;
                }

                case "UPDATE":
                {
                    //    Filter    ============Update============
                    // [{_id : 1}, {$set: {"name" : "Gabriel", "age" : 21}}]
                    // Parse mit FilterDefinition und UpdateDocument

                    var fullDocument = iBodyBody["UDOC"];
                    var children     = BsonSerializer.Deserialize <BsonArray>(fullDocument);

                    if (children.Count != 2)
                    {
                        return;
                    }

                    var filterDocument = children[0].ToString();
                    var updateDocument = children[1].ToString();

                    var filterBson = BsonSerializer.Deserialize <BsonDocument>(filterDocument);
                    var updateBson = BsonSerializer.Deserialize <BsonDocument>(updateDocument);

                    var oldDocForTrigger =
                        CAMongoManager.Instance.GetCollection <BsonDocument>(collectionName).Find(filterBson).ToEnumerable().ToArray()[0];

                    if (CAMongoManager.Instance.CollectionTriggers.ContainsKey(collectionName) &&
                        CAMongoManager.Instance.CollectionTriggers[collectionName].PreUpdate != null)
                    {
                        updateBson = BsonSerializer.Deserialize <BsonDocument>(CAMongoManager.Instance.CollectionTriggers[collectionName].PreUpdate(oldDocForTrigger.ToJson(), updateDocument));
                    }

                    CAMongoManager.Instance.GetCollection <BsonDocument>(collectionName).UpdateOne(filterBson, updateBson);
                    var newDocAfterUpdate = CAMongoManager.Instance.GetCollection <BsonDocument>(collectionName).Find(filterBson).FirstOrDefault();

                    Console.WriteLine("Updating document(s) in collection {0}: {1}{2}", collectionName, filterDocument, updateBson.ToJson());

                    if (CAMongoManager.Instance.CollectionTriggers.ContainsKey(collectionName) &&
                        CAMongoManager.Instance.CollectionTriggers[collectionName].PostUpdate != null)
                    {
                        CAMongoManager.Instance.CollectionTriggers[collectionName].PostUpdate(oldDocForTrigger.ToJson(), newDocAfterUpdate.ToJson());
                    }

                    iResponse.StatusCode = 200;
                    iResponse.Close();

                    break;
                }

                case "DELETE":
                {
                    var filterDoc  = iBodyBody["DDOC"];
                    var bsonFilter = BsonSerializer.Deserialize <BsonDocument>(filterDoc);

                    var oldDocs = CAMongoManager.Instance.GetCollection <BsonDocument>(collectionName).Find(bsonFilter).ToEnumerable().ToArray();

                    if (CAMongoManager.Instance.CollectionTriggers.ContainsKey(collectionName) &&
                        CAMongoManager.Instance.CollectionTriggers[collectionName].PreDelete != null)
                    {
                        foreach (var doc in oldDocs)
                        {
                            CAMongoManager.Instance.CollectionTriggers[collectionName].PreDelete(doc.ToJson());
                        }
                    }

                    CAMongoManager.Instance.GetCollection <BsonDocument>(collectionName).DeleteMany(bsonFilter);


                    Console.WriteLine("Removing document(s) from collection {0}: {1}", collectionName, bsonFilter.ToJson());

                    if (CAMongoManager.Instance.CollectionTriggers.ContainsKey(collectionName) &&
                        CAMongoManager.Instance.CollectionTriggers[collectionName].PostDelete != null)
                    {
                        foreach (var doc in oldDocs)
                        {
                            CAMongoManager.Instance.CollectionTriggers[collectionName].PostDelete(doc.ToJson());
                        }
                    }

                    iResponse.StatusCode = 200;
                    iResponse.Close();

                    break;
                }
                }

                break;
            }
            }
        }