public async Task <T> Add <T>(T toAdd) { var typeName = toAdd.GetType().Name; var collection = mongoDb.GetCollection <BsonDocument>(typeName); BsonDocument dbModel = new BsonDocument(); var filterBuilder = Builders <BsonDocument> .Filter; switch (typeName) { case "Rating": var rateTyped = DynamicTyping.ConvertValue <Rating>(toAdd); dbModel = new BsonDocument { { "RestaurantId", rateTyped.RestaurantId }, { "Value", rateTyped.Value } }; break; case "Restaurant": var resTyped = DynamicTyping.ConvertValue <Restaurant>(toAdd); dbModel = new BsonDocument { { "Name", resTyped.Name }, { "CuisineType", resTyped.CuisineType } }; var existingRestaurants = await mongoDb.GetCollection <BsonDocument>("Restaurant").FindAsync(filterBuilder.Eq("Name", resTyped.Name) & filterBuilder.Ne("Archived", "true")); if (existingRestaurants.Any()) { throw new ArgumentException("Sorry, that restaurant is already in the system"); } await collection.InsertOneAsync(dbModel); // return the id back out to the client in case they want to turn around and edit without reloading the data ((Restaurant)(object)toAdd).Id = dbModel.GetValue("_id").ToString(); return(toAdd); case "AppUser": var userTyped = DynamicTyping.ConvertValue <AppUser>(toAdd); dbModel = new BsonDocument { { "UserName", userTyped.UserName }, { "PassHash", userTyped.PassHash } }; var existingUsers = await mongoDb.GetCollection <BsonDocument>("AppUser").FindAsync(filterBuilder.Eq("UserName", userTyped.UserName)); if (existingUsers.Any()) { throw new ArgumentException("Sorry, that username is already in use"); } break; } await collection.InsertOneAsync(dbModel); return(toAdd); }
public async Task <T> Update <T>(T toUpdate) { switch (toUpdate.GetType().Name) { case "Restaurant": var typedUpdate = DynamicTyping.ConvertValue <Restaurant>(toUpdate); context.Restaurants.Attach(typedUpdate); context.Entry(typedUpdate).State = EntityState.Modified; break; default: throw new NotImplementedException(); } await context.SaveChangesAsync(); return(toUpdate); }
public async Task Remove <T>(T toRemove) { switch (toRemove.GetType().Name) { case "Restaurant": var typedUpdate = DynamicTyping.ConvertValue <Restaurant>(toRemove); var existing = await context.Restaurants.FindAsync(typedUpdate.Id); existing.Archived = true; context.Restaurants.Attach(existing); context.Entry(existing).State = EntityState.Modified; break; default: throw new NotImplementedException(); } await context.SaveChangesAsync(); }
public async Task <T> Update <T>(T toUpdate) { var typeName = toUpdate.GetType().Name; var collection = mongoDb.GetCollection <BsonDocument>(typeName); switch (typeName) { case "Restaurant": var resTyped = DynamicTyping.ConvertValue <Restaurant>(toUpdate); var filter = Builders <BsonDocument> .Filter.Eq("_id", ObjectId.Parse(resTyped.Id)); var update = Builders <BsonDocument> .Update.Set("Name", resTyped.Name).Set("CuisineType", resTyped.CuisineType); var result = await collection.UpdateOneAsync(filter, update); return(toUpdate); default: throw new NotImplementedException(); } }
public async Task <T> Add <T>(T toAdd) { switch (toAdd.GetType().Name) { case "Rating": var dbRat = DynamicTyping.ConvertValue <Rating>(toAdd); dbRat.Id = Guid.NewGuid().ToString(); context.Ratings.Add(dbRat); break; case "Restaurant": var dbRes = DynamicTyping.ConvertValue <Restaurant>(toAdd); dbRes.Id = Guid.NewGuid().ToString(); context.Restaurants.Add(dbRes); break; case "AppUser": context.Users.Add(DynamicTyping.ConvertValue <AppUser>(toAdd)); break; } await context.SaveChangesAsync(); return(toAdd); }